Port-mips archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: xf86-video-sis changes for mips
[ I'm not subscribed to tech-x11, so please keep either me or port-mips in Cc ]
Hello,
based on suggetion from macallan@, here's a new, less intrusive patch.
It uses the PCI_MAGIC_IO_RANGE other drivers are already using.
The challenge here is to find a value that will never show up in
PCI BARs, for any hardware supported by evbmips (a conflict here would be
a problem only when trying to map these ranges in userspace).
Using a 64bit value, we're safe for 32bit devices. I'm not sure if 64bit
devices can use values that high.
Attached is a kernel patch which defines a PCI_MAGIC_IO_RANGE for evbmips,
and use it for sisfb.
Then the xorg patch is much simpler: mips has to be handled the same way
as arm in ppc_video.c (I think it's a bug that mips was ommited here, because
the mips and arm inx/outx functions both use IOPortBase). Then we just
need to adjust the address in sisfb to use the correct address.
--
Manuel Bouyer <bouyer%antioche.eu.org@localhost>
NetBSD: 26 ans d'experience feront toujours la difference
--
Index: sys/dev/pci/sisfb.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/sisfb.c,v
retrieving revision 1.5
diff -u -p -u -r1.5 sisfb.c
--- sys/dev/pci/sisfb.c 26 Jan 2014 21:22:49 -0000 1.5
+++ sys/dev/pci/sisfb.c 28 Jan 2014 11:49:21 -0000
@@ -488,12 +488,15 @@ sisfb_mmap(void *v, void *vs, off_t offs
prot, BUS_SPACE_MAP_LINEAR);
return pa;
}
- if (offset >= (fb->iobase & ~PAGE_MASK) &&
- offset <= ((fb->iobase + fb->iosize + PAGE_SIZE - 1) & ~PAGE_MASK))
{
- pa = bus_space_mmap(fb->iot, fb->iobase, offset - fb->iobase,
- prot, BUS_SPACE_MAP_LINEAR);
+#ifdef PCI_MAGIC_IO_RANGE
+ /* allow mapping of IO space */
+ if ((offset >= PCI_MAGIC_IO_RANGE) &&
+ (offset < PCI_MAGIC_IO_RANGE + 0x10000)) {
+ pa = bus_space_mmap(fb->iot, offset - PCI_MAGIC_IO_RANGE,
+ 0, prot, BUS_SPACE_MAP_LINEAR);
return pa;
- }
+ }
+#endif /* PCI_MAGIC_IO_RANGE */
return -1;
}
Index: sys/arch/evbmips/include/param.h
===================================================================
RCS file: /cvsroot/src/sys/arch/evbmips/include/param.h,v
retrieving revision 1.9
diff -u -p -u -r1.9 param.h
--- sys/arch/evbmips/include/param.h 18 Mar 2011 16:30:01 -0000 1.9
+++ sys/arch/evbmips/include/param.h 28 Jan 2014 11:49:21 -0000
@@ -62,4 +62,6 @@ void delay(int n);
#endif /* !_LOCORE */
#endif /* _KERNEL */
+/* at this offset we mmap() the PCI IO range in display drivers */
+#define PCI_MAGIC_IO_RANGE 0x00ffffff00000000ULL
#endif /* !_EVBMIPS_PARAM_H_ */
Index: xf86-video-sis/dist/src/sis_driver.c
===================================================================
RCS file: /cvsroot/xsrc/external/mit/xf86-video-sis/dist/src/sis_driver.c,v
retrieving revision 1.1.1.4
diff -u -p -u -r1.1.1.4 sis_driver.c
--- xf86-video-sis/dist/src/sis_driver.c 17 Jul 2010 06:32:06 -0000
1.1.1.4
+++ xf86-video-sis/dist/src/sis_driver.c 28 Jan 2014 11:35:42 -0000
@@ -4421,7 +4421,14 @@ SISPreInit(ScrnInfoPtr pScrn, int flags)
* XXX Should check that the config file value matches one of the
* PCI base address values.
*/
+#if defined(__mips__) || defined(__arm32__)
+ /* inX/outX macros on these use IOPortBase as offset
+ * and this driver use these macros for memory space too.
+ * This is entirely skrewed. */
+ pSiS->IOAddress = pSiS->pEnt->device->IOBase - IOPortBase;
+#else
pSiS->IOAddress = pSiS->pEnt->device->IOBase;
+#endif
from = X_CONFIG;
} else {
pSiS->IOAddress = PCI_REGION_BASE(pSiS->PciInfo, 1, REGION_MEM) &
0xFFFFFFF0;
Index: xorg-server/dist/hw/xfree86/os-support/bsd/ppc_video.c
===================================================================
RCS file:
/cvsroot/xsrc/external/mit/xorg-server/dist/hw/xfree86/os-support/bsd/ppc_video.c,v
retrieving revision 1.5
diff -u -p -u -r1.5 ppc_video.c
--- xorg-server/dist/hw/xfree86/os-support/bsd/ppc_video.c 23 Nov 2010
06:38:09 -0000 1.5
+++ xorg-server/dist/hw/xfree86/os-support/bsd/ppc_video.c 28 Jan 2014
11:35:43 -0000
@@ -145,7 +145,7 @@ xf86EnableInterrupts()
}
/* XXX why the hell is this necessary?! */
-#ifdef __arm__
+#if defined(__arm__) || defined(__mips__)
unsigned int IOPortBase = (int)MAP_FAILED;
#endif
@@ -165,7 +165,7 @@ Bool xf86EnableIO()
return FALSE;
}
}
-#ifdef __arm__
+#if defined(__arm__) || defined(__mips__)
IOPortBase = (unsigned int)ioBase;
#endif
return TRUE;
@@ -181,7 +181,7 @@ void xf86DisableIO()
{
munmap(__UNVOLATILE(ioBase), 0x10000);
ioBase = MAP_FAILED;
-#ifdef __arm__
+#if defined(__arm__) || defined(__mips__)
IOPortBase = (unsigned int)MAP_FAILED;
#endif
}
Home |
Main Index |
Thread Index |
Old Index