/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_axp.c,v 1.3 2001/02/15 11:03:56 alanh Exp $ */ #include #include #include "os.h" #include "xf86.h" #include "xf86Priv.h" #include "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 #include #include /* 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); void (*_alpha_outb)(char, unsigned long) = _outb; void (*_alpha_outw)(short, unsigned long) = _outw; void (*_alpha_outl)(int, unsigned long) = _outl; unsigned int (*_alpha_inb)(unsigned long) = _inb; unsigned int (*_alpha_inw)(unsigned long) = _inw; 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 xf86MapDomainIO) */ _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); }