linux: Refactor xf86{En,Dis}ableIO

Pull platform methods into their own sections for legibility, and
rewrite the ifdefs to be more concise.

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Simon Farnsworth <simon.farnsworth@onelan.co.uk>
Signed-off-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
Adam Jackson 2012-06-26 13:12:45 -04:00
parent f0bad69edd
commit 048674a6ae

View File

@ -479,39 +479,36 @@ volatile unsigned char *ioBase = NULL;
#define __NR_pciconfig_iobase 200 #define __NR_pciconfig_iobase 200
#endif #endif
#endif static Bool
hwEnableIO(void)
Bool
xf86EnableIO(void)
{ {
#if defined(__powerpc__)
int fd; int fd;
unsigned int ioBase_phys; unsigned int ioBase_phys = syscall(__NR_pciconfig_iobase, 2, 0, 0);
#endif
if (ExtendedEnabled)
return TRUE;
#if defined(__powerpc__)
ioBase_phys = syscall(__NR_pciconfig_iobase, 2, 0, 0);
fd = open("/dev/mem", O_RDWR); fd = open("/dev/mem", O_RDWR);
if (ioBase == NULL) { if (ioBase == NULL) {
ioBase = (volatile unsigned char *) mmap(0, 0x20000, ioBase = (volatile unsigned char *) mmap(0, 0x20000,
PROT_READ | PROT_WRITE, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, ioBase_phys); 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); 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 (ioperm(0, 1024, 1) || iopl(3)) {
if (errno == ENODEV) if (errno == ENODEV)
ErrorF("xf86EnableIOPorts: no I/O ports found\n"); ErrorF("xf86EnableIOPorts: no I/O ports found\n");
@ -526,27 +523,44 @@ xf86EnableIO(void)
ioperm(0x40, 4, 0); /* trap access to the timer chip */ ioperm(0x40, 4, 0); /* trap access to the timer chip */
ioperm(0x60, 4, 0); /* trap access to the keyboard controller */ ioperm(0x60, 4, 0); /* trap access to the keyboard controller */
#endif #endif
#endif
ExtendedEnabled = TRUE;
return 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 void
xf86DisableIO(void) xf86DisableIO(void)
{ {
if (!ExtendedEnabled) if (!ExtendedEnabled)
return; 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__) #if defined (__alpha__)