Merge remote-tracking branch 'ajax/ioperm'

This commit is contained in:
Keith Packard 2012-09-20 17:26:48 +02:00
commit d01921ec18
6 changed files with 67 additions and 93 deletions

View File

@ -55,6 +55,7 @@
extern _X_EXPORT int xf86DoConfigure;
extern _X_EXPORT int xf86DoShowOptions;
extern _X_EXPORT Bool xf86DoConfigurePass1;
extern _X_EXPORT Bool xorgHWAccess;
extern _X_EXPORT DevPrivateKeyRec xf86ScreenKeyRec;

View File

@ -117,27 +117,12 @@ xf86BusConfig(void)
screenLayoutPtr layout;
int i, j;
/* Enable full I/O access */
if (xorgHWAccess)
xorgHWAccess = xf86EnableIO();
/*
* Now call each of the Probe functions. Each successful probe will
* result in an extra entry added to the xf86Screens[] list for each
* instance of the hardware found.
*/
for (i = 0; i < xf86NumDrivers; i++) {
xorgHWFlags flags;
if (!xorgHWAccess) {
if (!xf86DriverList[i]->driverFunc
|| !xf86DriverList[i]->driverFunc(NULL,
GET_REQUIRED_HW_INTERFACES,
&flags)
|| NEED_IO_ENABLED(flags))
continue;
}
xf86CallDriverProbe(xf86DriverList[i], FALSE);
}

View File

@ -545,41 +545,16 @@ DoConfigure(void)
free(vlist);
for (i = 0; i < xf86NumDrivers; i++) {
xorgHWFlags flags;
if (!xf86DriverList[i]->driverFunc
|| !xf86DriverList[i]->driverFunc(NULL,
GET_REQUIRED_HW_INTERFACES,
&flags)
|| NEED_IO_ENABLED(flags)) {
xorgHWAccess = TRUE;
break;
}
}
/* Enable full I/O access */
if (xorgHWAccess) {
if (!xf86EnableIO())
/* oops, we have failed */
xorgHWAccess = FALSE;
}
xorgHWAccess = xf86EnableIO();
/* Create XF86Config file structure */
xf86config = calloc(1, sizeof(XF86ConfigRec));
/* Call all of the probe functions, reporting the results. */
for (CurrentDriver = 0; CurrentDriver < xf86NumDrivers; CurrentDriver++) {
xorgHWFlags flags;
Bool found_screen;
DriverRec *const drv = xf86DriverList[CurrentDriver];
if (!xorgHWAccess) {
if (!drv->driverFunc
|| !drv->driverFunc(NULL, GET_REQUIRED_HW_INTERFACES, &flags)
|| NEED_IO_ENABLED(flags))
continue;
}
found_screen = xf86CallDriverProbe(drv, TRUE);
if (found_screen && drv->Identify) {
(*drv->Identify) (0);

View File

@ -402,6 +402,7 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
Bool pix24Fail = FALSE;
Bool autoconfig = FALSE;
Bool sigio_blocked = FALSE;
Bool want_hw_access = FALSE;
GDevPtr configured_device;
xf86Initialising = TRUE;
@ -530,23 +531,21 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
*/
for (i = 0; i < xf86NumDrivers; i++) {
xorgHWFlags flags = HW_IO;
if (xf86DriverList[i]->Identify != NULL)
xf86DriverList[i]->Identify(0);
if (!xorgHWAccess || !xorgHWOpenConsole) {
xorgHWFlags flags;
if (xf86DriverList[i]->driverFunc)
xf86DriverList[i]->driverFunc(NULL,
GET_REQUIRED_HW_INTERFACES,
&flags);
if (!xf86DriverList[i]->driverFunc
|| !xf86DriverList[i]->driverFunc(NULL,
GET_REQUIRED_HW_INTERFACES,
&flags))
flags = HW_IO;
if (NEED_IO_ENABLED(flags))
want_hw_access = TRUE;
if (NEED_IO_ENABLED(flags))
xorgHWAccess = TRUE;
if (!(flags & HW_SKIP_CONSOLE))
xorgHWOpenConsole = TRUE;
}
if (!(flags & HW_SKIP_CONSOLE))
xorgHWOpenConsole = TRUE;
}
if (xorgHWOpenConsole)
@ -554,6 +553,10 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
else
xf86Info.dontVTSwitch = TRUE;
/* Enable full I/O access */
if (want_hw_access)
xorgHWAccess = xf86EnableIO();
if (xf86BusConfig() == FALSE)
return;

View File

@ -91,7 +91,6 @@ extern _X_EXPORT int xf86NumScreens;
extern _X_EXPORT const char *xf86VisualNames[];
extern _X_EXPORT int xf86Verbose; /* verbosity level */
extern _X_EXPORT int xf86LogVerbose; /* log file verbosity level */
extern _X_EXPORT Bool xorgHWAccess;
extern _X_EXPORT RootWinPropPtr *xf86RegisteredPropertiesTable;

View File

@ -479,45 +479,39 @@ volatile unsigned char *ioBase = NULL;
#define __NR_pciconfig_iobase 200
#endif
#endif
Bool
xf86EnableIO(void)
static Bool
hwEnableIO(void)
{
#if defined(__powerpc__)
int fd;
unsigned int ioBase_phys;
#endif
if (ExtendedEnabled)
return TRUE;
#if defined(__powerpc__)
ioBase_phys = syscall(__NR_pciconfig_iobase, 2, 0, 0);
unsigned int ioBase_phys = syscall(__NR_pciconfig_iobase, 2, 0, 0);
fd = open("/dev/mem", O_RDWR);
if (ioBase == NULL) {
ioBase = (volatile unsigned char *) mmap(0, 0x20000,
PROT_READ | PROT_WRITE,
MAP_SHARED, fd, ioBase_phys);
/* Should this be fatal or just a warning? */
#if 0
if (ioBase == MAP_FAILED) {
xf86Msg(X_WARNING,
"xf86EnableIOPorts: Failed to map iobase (%s)\n",
strerror(errno));
return FALSE;
}
#endif
}
close(fd);
#elif !defined(__mc68000__) && !defined(__sparc__) && !defined(__mips__) && !defined(__sh__) && !defined(__hppa__) && !defined(__s390__) && !defined(__arm__) && !defined(__m32r__) && !defined(__nds32__)
return ioBase != MAP_FAILED;
}
static void
hwDisableIO(void)
{
munmap(ioBase, 0x20000);
ioBase = NULL;
}
#elif defined(__i386__) || defined(__x86_64__) || defined(__ia64__) || \
defined(__alpha__)
static Bool
hwEnableIO(void)
{
if (ioperm(0, 1024, 1) || iopl(3)) {
if (errno == ENODEV)
ErrorF("xf86EnableIOPorts: no I/O ports found\n");
else
FatalError("xf86EnableIOPorts: failed to set IOPL"
" for I/O (%s)\n", strerror(errno));
ErrorF("xf86EnableIOPorts: failed to set IOPL for I/O (%s)\n",
strerror(errno));
return FALSE;
}
#if !defined(__alpha__)
@ -526,27 +520,44 @@ xf86EnableIO(void)
ioperm(0x40, 4, 0); /* trap access to the timer chip */
ioperm(0x60, 4, 0); /* trap access to the keyboard controller */
#endif
#endif
ExtendedEnabled = TRUE;
return TRUE;
}
static void
hwDisableIO(void)
{
iopl(0);
ioperm(0, 1024, 0);
}
#else /* non-IO architectures */
#define hwEnableIO() TRUE
#define hwDisableIO() do {} while (0)
#endif
Bool
xf86EnableIO(void)
{
if (ExtendedEnabled)
return TRUE;
ExtendedEnabled = hwEnableIO();
return ExtendedEnabled;
}
void
xf86DisableIO(void)
{
if (!ExtendedEnabled)
return;
#if defined(__powerpc__)
munmap(ioBase, 0x20000);
ioBase = NULL;
#elif !defined(__mc68000__) && !defined(__sparc__) && !defined(__mips__) && !defined(__sh__) && !defined(__hppa__) && !defined(__arm__) && !defined(__s390__) && !defined(__m32r__) && !defined(__nds32__)
iopl(0);
ioperm(0, 1024, 0);
#endif
ExtendedEnabled = FALSE;
return;
hwDisableIO();
ExtendedEnabled = FALSE;
}
#if defined (__alpha__)