[PATCH] xfree86: Add Loongson MIPS support
Jeremy Huddleston
jeremyhu at apple.com
Fri Oct 14 12:41:30 PDT 2011
IOPortBase is exported. While I agree that compiler.h and most of the bus support in xf86 should die in a fire, you really shouldn't change the symbol name for no good reason.
1) I would prefer to see a fix for siliconmotion driver to have it "do the right thing" by not calling into this broken API.
2) You should use void * instead of char * for generic pointers.
On Oct 14, 2011, at 5:10 AM, Matt Kraai wrote:
> Change IOPortBase to ioBase and set it properly on MIPS systems.
>
> Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=41038
> Signed-off-by: Matt Kraai <kraai at ftbfs.org>
> ---
> hw/xfree86/common/compiler.h | 14 +++++++-------
> hw/xfree86/os-support/bsd/arm_video.c | 20 ++++++++++----------
> hw/xfree86/os-support/linux/lnx_video.c | 9 +++++++--
> 3 files changed, 24 insertions(+), 19 deletions(-)
>
> diff --git a/hw/xfree86/common/compiler.h b/hw/xfree86/common/compiler.h
> index 9e00d75..61af0c4 100644
> --- a/hw/xfree86/common/compiler.h
> +++ b/hw/xfree86/common/compiler.h
> @@ -714,42 +714,42 @@ xf86WriteMmio32LeNB(__volatile__ void *base, const unsigned long offset,
> # define PORT_SIZE short
> # endif
>
> -_X_EXPORT unsigned int IOPortBase; /* Memory mapped I/O port area */
> +_X_EXPORT unsigned char *ioBase;
>
> static __inline__ void
> outb(unsigned PORT_SIZE port, unsigned char val)
> {
> - *(volatile unsigned char*)(((unsigned PORT_SIZE)(port))+IOPortBase) = val;
> + *(volatile unsigned char*)(((unsigned PORT_SIZE)(port))+ioBase) = val;
> }
>
> static __inline__ void
> outw(unsigned PORT_SIZE port, unsigned short val)
> {
> - *(volatile unsigned short*)(((unsigned PORT_SIZE)(port))+IOPortBase) = val;
> + *(volatile unsigned short*)(((unsigned PORT_SIZE)(port))+ioBase) = val;
> }
>
> static __inline__ void
> outl(unsigned PORT_SIZE port, unsigned int val)
> {
> - *(volatile unsigned int*)(((unsigned PORT_SIZE)(port))+IOPortBase) = val;
> + *(volatile unsigned int*)(((unsigned PORT_SIZE)(port))+ioBase) = val;
> }
>
> static __inline__ unsigned int
> inb(unsigned PORT_SIZE port)
> {
> - return *(volatile unsigned char*)(((unsigned PORT_SIZE)(port))+IOPortBase);
> + return *(volatile unsigned char*)(((unsigned PORT_SIZE)(port))+ioBase);
> }
>
> static __inline__ unsigned int
> inw(unsigned PORT_SIZE port)
> {
> - return *(volatile unsigned short*)(((unsigned PORT_SIZE)(port))+IOPortBase);
> + return *(volatile unsigned short*)(((unsigned PORT_SIZE)(port))+ioBase);
> }
>
> static __inline__ unsigned int
> inl(unsigned PORT_SIZE port)
> {
> - return *(volatile unsigned int*)(((unsigned PORT_SIZE)(port))+IOPortBase);
> + return *(volatile unsigned int*)(((unsigned PORT_SIZE)(port))+ioBase);
> }
>
>
> diff --git a/hw/xfree86/os-support/bsd/arm_video.c b/hw/xfree86/os-support/bsd/arm_video.c
> index eb631a7..2bc6d3b 100644
> --- a/hw/xfree86/os-support/bsd/arm_video.c
> +++ b/hw/xfree86/os-support/bsd/arm_video.c
> @@ -495,7 +495,7 @@ xf86EnableIO()
> MAP_FLAGS, fd, (off_t)0x0000);
>
> if (base != (pointer)-1) {
> - IOPortBase = base;
> + ioBase = base;
> }
> else {
> xf86Msg(X_WARNING,"EnableIO: failed to mmap %s (%s)\n",
> @@ -562,7 +562,7 @@ int ScreenNum;
> MAP_FLAGS, fd, (off_t)0x0000);
>
> if (base != (pointer)-1) {
> - IOPortBase = base;
> + ioBase = base;
> }
> else {
> xf86Msg(X_ERROR,
> @@ -577,20 +577,20 @@ int ScreenNum;
> #endif
>
> #ifdef __arm32__
> - IOPortBase = (unsigned int)-1;
> + ioBase = (unsigned char *)-1;
>
> if((memInfoP = checkMapInfo(TRUE, MMIO_REGION)) != NULL)
> {
> /*
> * xf86MapInfoMap maps an offset from the start of video IO
> - * space (e.g. 0x3B0), but IOPortBase is expected to map to
> + * space (e.g. 0x3B0), but ioBase is expected to map to
> * physical address 0x000, so subtract the start of video I/O
> * space from the result. This is safe for now becase we
> * actually mmap the start of the page, then the start of video
> * I/O space is added as an internal offset.
> */
> - IOPortBase = (unsigned int)xf86MapInfoMap(memInfoP,
> - (caddr_t)0x0, 0L)
> + ioBase = (unsigned char *)xf86MapInfoMap(memInfoP,
> + (caddr_t)0x0, 0L)
> - memInfoP->memInfo.u.map_info_mmap.internal_offset;
> ExtendedEnabled = TRUE;
> return TRUE;
> @@ -604,10 +604,10 @@ int ScreenNum;
> MAP_FLAGS, devMemFd, (off_t)DEV_MEM_IOBASE);
>
> if (base != (pointer)-1)
> - IOPortBase = (unsigned int)base;
> + ioBase = base;
> }
>
> - if (IOPortBase == (unsigned int)-1)
> + if (ioBase == (unsigned char *)-1)
> {
> xf86Msg(X_WARNING,"xf86EnableIOPorts: failed to open mem device or map IO base. \n\
> Make sure you have the Aperture Driver installed, or a kernel built with the INSECURE option\n");
> @@ -652,8 +652,8 @@ int ScreenNum;
> if (ScreenEnabled[i])
> return;
>
> - munmap((caddr_t)IOPortBase, 0x400);
> - IOPortBase = (unsigned int)-1;
> + munmap((caddr_t)ioBase, 0x400);
> + ioBase = (unsigned char *)-1;
> ExtendedEnabled = FALSE;
> #endif
>
> diff --git a/hw/xfree86/os-support/linux/lnx_video.c b/hw/xfree86/os-support/linux/lnx_video.c
> index 3d45511..48a3f76 100644
> --- a/hw/xfree86/os-support/linux/lnx_video.c
> +++ b/hw/xfree86/os-support/linux/lnx_video.c
> @@ -493,7 +493,7 @@ volatile unsigned char *ioBase = NULL;
> Bool
> xf86EnableIO(void)
> {
> -#if defined(__powerpc__)
> +#if defined(__mips__) || defined(__powerpc__)
> int fd;
> unsigned int ioBase_phys;
> #endif
> @@ -501,8 +501,13 @@ xf86EnableIO(void)
> if (ExtendedEnabled)
> return TRUE;
>
> -#if defined(__powerpc__)
> +#if defined(__mips__) || defined(__powerpc__)
> +
> +# if defined(__mips__)
> + ioBase_phys = 0x1fd00000;
> +# elif defined(__powerpc__)
> ioBase_phys = syscall(__NR_pciconfig_iobase, 2, 0, 0);
> +# endif
>
> fd = open("/dev/mem", O_RDWR);
> if (ioBase == NULL) {
> --
> 1.7.7
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
More information about the xorg-devel
mailing list