xserver-multidpi/hw/xfree86/os-support/linux/lnx_axp.c
Ian Romanick 8b6b40b727 Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into pci-rework
Conflicts:

	hw/xfree86/common/xf86.h
	hw/xfree86/common/xf86Init.c
	hw/xfree86/common/xf86pciBus.c
	hw/xfree86/int10/generic.c
	hw/xfree86/int10/helper_exec.c
	hw/xfree86/loader/xf86sym.c
	hw/xfree86/os-support/bus/Pci.c
	hw/xfree86/os-support/bus/Pci.h
	hw/xfree86/os-support/bus/linuxPci.c
	hw/xfree86/os-support/linux/int10/linux.c
2007-08-23 18:19:17 -07:00

200 lines
4.9 KiB
C

#ifdef HAVE_XORG_CONFIG_H
#include <xorg-config.h>
#endif
#include <stdio.h>
#include <X11/X.h>
#include "os.h"
#include "xf86.h"
#include "xf86Priv.h"
#include "shared/xf86Axp.h"
axpDevice lnxGetAXP(void);
typedef struct
{ char* sysName;
char* sysVari;
char* cpu;
axpDevice sys; }
AXP;
static AXP axpList[] = {
{ "Tsunami", NULL, NULL, TSUNAMI },
{ "Eiger", NULL, NULL, TSUNAMI },
{"Noname", NULL, NULL, LCA },
{ "AlphaBook1", NULL, NULL, LCA },
{"EB66", NULL, NULL, LCA},
{"EB64+",NULL,NULL, APECS},
{"Noritake",NULL,"EV5",CIA},
{"Noritake",NULL,"EV56",CIA},
{"Noritake",NULL,NULL,APECS},
{"XL",NULL,NULL,APECS},
{"Avanti",NULL,NULL,APECS},
{"Mikasa",NULL,"EV5",CIA},
{"Mikasa",NULL,"EV56",CIA},
{"Mikasa",NULL,NULL,APECS},
{"EB164","EB164",NULL,CIA},
{"EB164","PC164", NULL,CIA},
{"EB164","LX164",NULL, PYXIS},
{"EB164","SX164",NULL, PYXIS},
{"EB164","RX164",NULL, POLARIS},
{"Alcor",NULL,NULL,CIA},
{"Takara",NULL,NULL,CIA},
{"Sable",NULL, "EV5",T2_GAMMA},
{"Sable",NULL,"EV56",T2_GAMMA},
{"Sable",NULL,NULL,T2},
{"Rawhide",NULL,NULL,MCPCIA},
{"Jensen",NULL,NULL,JENSEN},
{"Miata",NULL,NULL,PYXIS_CIA},
{"Ruffian",NULL,NULL,PYXIS_CIA},
{"Nautilus",NULL,NULL,IRONGATE},
{NULL,NULL,NULL,NONE}
};
axpDevice
lnxGetAXP(void)
{
FILE *file;
int count = 0;
char res[256];
char cpu[255];
char systype[255];
char sysvari[255];
if (!(file = fopen("/proc/cpuinfo","r")))
return SYS_NONE;
do {
if (!fgets(res,0xff,file)) return SYS_NONE;
switch (count) {
case 1:
sscanf(res, "cpu model : %s",cpu);
#ifdef DEBUG
ErrorF("CPU %s\n",cpu);
#endif
break;
case 5:
sscanf(res, "system type : %s",systype);
#ifdef DEBUG
ErrorF("system type : %s\n",systype);
#endif
break;
case 6:
sscanf(res, "system variation : %s",sysvari);
#ifdef DEBUG
ErrorF("system variation: %s\n",sysvari);
#endif
break;
}
count++;
} while (count < 8);
fclose(file);
count = 0;
do {
if (!axpList[count].sysName || !strcmp(axpList[count].sysName,systype)) {
if (axpList[count].sysVari && strcmp(axpList[count].sysVari,sysvari)) {
count++;
continue;
};
if (axpList[count].cpu && strcmp(axpList[count].cpu,cpu)) {
count++;
continue;
}
return axpList[count].sys;
}
count++;
} while (1);
}
/*
* pciconfig_iobase wrappers and dynamic i/o selection
*/
#include "lnx.h"
#include <unistd.h>
#include <errno.h>
/* glibc versions (single hose only) */
extern void _outb(char val, unsigned long port);
extern void _outw(short val, unsigned long port);
extern void _outl(int val, unsigned long port);
extern unsigned int _inb(unsigned long port);
extern unsigned int _inw(unsigned long port);
extern unsigned int _inl(unsigned long port);
extern void _dense_outb(char, unsigned long);
extern void _dense_outw(short, unsigned long);
extern void _dense_outl(int, unsigned long);
extern unsigned int _dense_inb(unsigned long);
extern unsigned int _dense_inw(unsigned long);
extern unsigned int _dense_inl(unsigned long);
_X_EXPORT void (*_alpha_outb)(char, unsigned long) = _outb;
_X_EXPORT void (*_alpha_outw)(short, unsigned long) = _outw;
_X_EXPORT void (*_alpha_outl)(int, unsigned long) = _outl;
_X_EXPORT unsigned int (*_alpha_inb)(unsigned long) = _inb;
_X_EXPORT unsigned int (*_alpha_inw)(unsigned long) = _inw;
_X_EXPORT unsigned int (*_alpha_inl)(unsigned long) = _inl;
static long _alpha_iobase_query(unsigned, int, int, int);
long (*_iobase)(unsigned, int, int, int) = _alpha_iobase_query;
static long
_alpha_iobase(unsigned flags, int hose, int bus, int devfn)
{
#ifdef __NR_pciconfig_iobase
if (bus < 0) {
bus = hose;
flags |= IOBASE_FROM_HOSE;
}
return syscall(__NR_pciconfig_iobase, flags, bus, devfn);
#else
return -ENOSYS
#endif
}
static long
_alpha_iobase_legacy(unsigned flags, int hose, int bus, int devfn)
{
if (hose > 0) return -ENODEV;
if (flags & IOBASE_DENSE_MEM) return _bus_base();
if (flags & IOBASE_SPARSE_MEM) return _bus_base_sparse();
return 0;
}
static long
_alpha_iobase_query(unsigned flags, int hose, int bus, int devfn)
{
/*
* Only use iobase if the syscall is supported *and* it's
* a dense io system
*/
if (_alpha_iobase(IOBASE_DENSE_IO, 0, 0, 0) > 0) {
/*
* The syscall worked and it's a dense io system - take over the
* io subsystem
*/
_iobase = _alpha_iobase;
#ifndef INCLUDE_XF86_NO_DOMAIN
/*
* Only take over the inx/outx functions if this is a dense I/O
* system *and* addressing domains are being used. The dense I/O
* routines expect I/O to be mapped (as done in xf86MapLegacyIO)
*/
_alpha_outb = _dense_outb;
_alpha_outw = _dense_outw;
_alpha_outl = _dense_outl;
_alpha_inb = _dense_inb;
_alpha_inw = _dense_inw;
_alpha_inl = _dense_inl;
#endif /* !INCLUDE_XF86_NO_DOMAIN */
} else _iobase = _alpha_iobase_legacy;
return _iobase(flags, hose, bus, devfn);
}