17dd7cddfSDavid du Colombier #define X86STEPPING(x) ((x) & 0x0F) 2c39c2eb3SDavid du Colombier /* incorporates extended-model and -family bits */ 330f69380SDavid du Colombier #define X86MODEL(x) ((((x)>>4) & 0x0F) | (((x)>>16) & 0x0F)<<4) 4c39c2eb3SDavid du Colombier #define X86FAMILY(x) ((((x)>>8) & 0x0F) | (((x)>>20) & 0xFF)<<4) 53e12c5d1SDavid du Colombier 67dd7cddfSDavid du Colombier enum { 77dd7cddfSDavid du Colombier VectorNMI = 2, /* non-maskable interrupt */ 87dd7cddfSDavid du Colombier VectorBPT = 3, /* breakpoint */ 97dd7cddfSDavid du Colombier VectorUD = 6, /* invalid opcode exception */ 107dd7cddfSDavid du Colombier VectorCNA = 7, /* coprocessor not available */ 11e288d156SDavid du Colombier Vector2F = 8, /* double fault */ 127dd7cddfSDavid du Colombier VectorCSO = 9, /* coprocessor segment overrun */ 137dd7cddfSDavid du Colombier VectorPF = 14, /* page fault */ 14a3b78ba5SDavid du Colombier Vector15 = 15, /* reserved */ 157dd7cddfSDavid du Colombier VectorCERR = 16, /* coprocessor error */ 163e12c5d1SDavid du Colombier 177dd7cddfSDavid du Colombier VectorPIC = 32, /* external i8259 interrupts */ 187dd7cddfSDavid du Colombier IrqCLOCK = 0, 197dd7cddfSDavid du Colombier IrqKBD = 1, 207dd7cddfSDavid du Colombier IrqUART1 = 3, 217dd7cddfSDavid du Colombier IrqUART0 = 4, 227dd7cddfSDavid du Colombier IrqPCMCIA = 5, 237dd7cddfSDavid du Colombier IrqFLOPPY = 6, 247dd7cddfSDavid du Colombier IrqLPT = 7, 257dd7cddfSDavid du Colombier IrqIRQ7 = 7, 267dd7cddfSDavid du Colombier IrqAUX = 12, /* PS/2 port */ 277dd7cddfSDavid du Colombier IrqIRQ13 = 13, /* coprocessor on 386 */ 287dd7cddfSDavid du Colombier IrqATA0 = 14, 297dd7cddfSDavid du Colombier IrqATA1 = 15, 307dd7cddfSDavid du Colombier MaxIrqPIC = 15, 317dd7cddfSDavid du Colombier 327dd7cddfSDavid du Colombier VectorLAPIC = VectorPIC+16, /* local APIC interrupts */ 337dd7cddfSDavid du Colombier IrqLINT0 = 16, /* LINT[01] must be offsets 0 and 1 */ 347dd7cddfSDavid du Colombier IrqLINT1 = 17, 357dd7cddfSDavid du Colombier IrqTIMER = 18, 367dd7cddfSDavid du Colombier IrqERROR = 19, 377dd7cddfSDavid du Colombier IrqPCINT = 20, 387dd7cddfSDavid du Colombier IrqSPURIOUS = 31, /* must have bits [3-0] == 0x0F */ 397dd7cddfSDavid du Colombier MaxIrqLAPIC = 31, 407dd7cddfSDavid du Colombier 417dd7cddfSDavid du Colombier VectorSYSCALL = 64, 427dd7cddfSDavid du Colombier 437dd7cddfSDavid du Colombier VectorAPIC = 65, /* external APIC interrupts */ 447dd7cddfSDavid du Colombier MaxVectorAPIC = 255, 457dd7cddfSDavid du Colombier }; 467dd7cddfSDavid du Colombier 477dd7cddfSDavid du Colombier typedef struct Vctl { 487dd7cddfSDavid du Colombier Vctl* next; /* handlers on this vector */ 497dd7cddfSDavid du Colombier 509a747e4fSDavid du Colombier char name[KNAMELEN]; /* of driver */ 517dd7cddfSDavid du Colombier int isintr; /* interrupt or fault/trap */ 527dd7cddfSDavid du Colombier int irq; 537dd7cddfSDavid du Colombier int tbdf; 547dd7cddfSDavid du Colombier int (*isr)(int); /* get isr bit for this irq */ 557dd7cddfSDavid du Colombier int (*eoi)(int); /* eoi */ 567dd7cddfSDavid du Colombier 577dd7cddfSDavid du Colombier void (*f)(Ureg*, void*); /* handler to call */ 587dd7cddfSDavid du Colombier void* a; /* argument to call it with */ 597dd7cddfSDavid du Colombier } Vctl; 607dd7cddfSDavid du Colombier 617dd7cddfSDavid du Colombier enum { 627dd7cddfSDavid du Colombier BusCBUS = 0, /* Corollary CBUS */ 637dd7cddfSDavid du Colombier BusCBUSII, /* Corollary CBUS II */ 647dd7cddfSDavid du Colombier BusEISA, /* Extended ISA */ 657dd7cddfSDavid du Colombier BusFUTURE, /* IEEE Futurebus */ 667dd7cddfSDavid du Colombier BusINTERN, /* Internal bus */ 677dd7cddfSDavid du Colombier BusISA, /* Industry Standard Architecture */ 687dd7cddfSDavid du Colombier BusMBI, /* Multibus I */ 697dd7cddfSDavid du Colombier BusMBII, /* Multibus II */ 707dd7cddfSDavid du Colombier BusMCA, /* Micro Channel Architecture */ 717dd7cddfSDavid du Colombier BusMPI, /* MPI */ 727dd7cddfSDavid du Colombier BusMPSA, /* MPSA */ 737dd7cddfSDavid du Colombier BusNUBUS, /* Apple Macintosh NuBus */ 747dd7cddfSDavid du Colombier BusPCI, /* Peripheral Component Interconnect */ 757dd7cddfSDavid du Colombier BusPCMCIA, /* PC Memory Card International Association */ 767dd7cddfSDavid du Colombier BusTC, /* DEC TurboChannel */ 777dd7cddfSDavid du Colombier BusVL, /* VESA Local bus */ 787dd7cddfSDavid du Colombier BusVME, /* VMEbus */ 797dd7cddfSDavid du Colombier BusXPRESS, /* Express System Bus */ 807dd7cddfSDavid du Colombier }; 817dd7cddfSDavid du Colombier 827dd7cddfSDavid du Colombier #define MKBUS(t,b,d,f) (((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8)) 837dd7cddfSDavid du Colombier #define BUSFNO(tbdf) (((tbdf)>>8)&0x07) 847dd7cddfSDavid du Colombier #define BUSDNO(tbdf) (((tbdf)>>11)&0x1F) 857dd7cddfSDavid du Colombier #define BUSBNO(tbdf) (((tbdf)>>16)&0xFF) 867dd7cddfSDavid du Colombier #define BUSTYPE(tbdf) ((tbdf)>>24) 877dd7cddfSDavid du Colombier #define BUSBDF(tbdf) ((tbdf)&0x00FFFF00) 887dd7cddfSDavid du Colombier #define BUSUNKNOWN (-1) 897dd7cddfSDavid du Colombier 907dd7cddfSDavid du Colombier enum { 917dd7cddfSDavid du Colombier MaxEISA = 16, 927dd7cddfSDavid du Colombier CfgEISA = 0xC80, 933e12c5d1SDavid du Colombier }; 94219b2ee8SDavid du Colombier 95219b2ee8SDavid du Colombier /* 967dd7cddfSDavid du Colombier * PCI support code. 97219b2ee8SDavid du Colombier */ 98ade43d10SDavid du Colombier enum { /* type 0 & type 1 pre-defined header */ 997dd7cddfSDavid du Colombier PciVID = 0x00, /* vendor ID */ 1007dd7cddfSDavid du Colombier PciDID = 0x02, /* device ID */ 1017dd7cddfSDavid du Colombier PciPCR = 0x04, /* command */ 1027dd7cddfSDavid du Colombier PciPSR = 0x06, /* status */ 1037dd7cddfSDavid du Colombier PciRID = 0x08, /* revision ID */ 1047dd7cddfSDavid du Colombier PciCCRp = 0x09, /* programming interface class code */ 1057dd7cddfSDavid du Colombier PciCCRu = 0x0A, /* sub-class code */ 1067dd7cddfSDavid du Colombier PciCCRb = 0x0B, /* base class code */ 1077dd7cddfSDavid du Colombier PciCLS = 0x0C, /* cache line size */ 1087dd7cddfSDavid du Colombier PciLTR = 0x0D, /* latency timer */ 1097dd7cddfSDavid du Colombier PciHDT = 0x0E, /* header type */ 1107dd7cddfSDavid du Colombier PciBST = 0x0F, /* BIST */ 111219b2ee8SDavid du Colombier 1127dd7cddfSDavid du Colombier PciBAR0 = 0x10, /* base address */ 1137dd7cddfSDavid du Colombier PciBAR1 = 0x14, 114219b2ee8SDavid du Colombier 1157dd7cddfSDavid du Colombier PciINTL = 0x3C, /* interrupt line */ 1167dd7cddfSDavid du Colombier PciINTP = 0x3D, /* interrupt pin */ 117219b2ee8SDavid du Colombier }; 118219b2ee8SDavid du Colombier 119ade43d10SDavid du Colombier /* ccrb (base class code) values; controller types */ 120ade43d10SDavid du Colombier enum { 121ade43d10SDavid du Colombier Pcibcpci1 = 0, /* pci 1.0; no class codes defined */ 122ade43d10SDavid du Colombier Pcibcstore = 1, /* mass storage */ 123ade43d10SDavid du Colombier Pcibcnet = 2, /* network */ 124ade43d10SDavid du Colombier Pcibcdisp = 3, /* display */ 125ade43d10SDavid du Colombier Pcibcmmedia = 4, /* multimedia */ 126ade43d10SDavid du Colombier Pcibcmem = 5, /* memory */ 127ade43d10SDavid du Colombier Pcibcbridge = 6, /* bridge */ 128ade43d10SDavid du Colombier Pcibccomm = 7, /* simple comms (e.g., serial) */ 129ade43d10SDavid du Colombier Pcibcbasesys = 8, /* base system */ 130ade43d10SDavid du Colombier Pcibcinput = 9, /* input */ 131ade43d10SDavid du Colombier Pcibcdock = 0xa, /* docking stations */ 132ade43d10SDavid du Colombier Pcibcproc = 0xb, /* processors */ 133ade43d10SDavid du Colombier Pcibcserial = 0xc, /* serial bus (e.g., USB) */ 134ade43d10SDavid du Colombier Pcibcwireless = 0xd, /* wireless */ 135ade43d10SDavid du Colombier Pcibcintell = 0xe, /* intelligent i/o */ 136ade43d10SDavid du Colombier Pcibcsatcom = 0xf, /* satellite comms */ 137ade43d10SDavid du Colombier Pcibccrypto = 0x10, /* encryption/decryption */ 138ade43d10SDavid du Colombier Pcibcdacq = 0x11, /* data acquisition & signal proc. */ 139ade43d10SDavid du Colombier }; 140ade43d10SDavid du Colombier 141ade43d10SDavid du Colombier /* ccru (sub-class code) values; common cases only */ 142ade43d10SDavid du Colombier enum { 143ade43d10SDavid du Colombier /* mass storage */ 144ade43d10SDavid du Colombier Pciscscsi = 0, /* SCSI */ 145ade43d10SDavid du Colombier Pciscide = 1, /* IDE (ATA) */ 146*75cb58dbSDavid du Colombier Pciscsata = 6, /* SATA */ 147ade43d10SDavid du Colombier 148ade43d10SDavid du Colombier /* network */ 149ade43d10SDavid du Colombier Pciscether = 0, /* Ethernet */ 150ade43d10SDavid du Colombier 151ade43d10SDavid du Colombier /* display */ 152ade43d10SDavid du Colombier Pciscvga = 0, /* VGA */ 153ade43d10SDavid du Colombier Pciscxga = 1, /* XGA */ 154ade43d10SDavid du Colombier Pcisc3d = 2, /* 3D */ 155ade43d10SDavid du Colombier 156ade43d10SDavid du Colombier /* bridges */ 157ade43d10SDavid du Colombier Pcischostpci = 0, /* host/pci */ 158ade43d10SDavid du Colombier Pciscpcicpci = 1, /* pci/pci */ 159ade43d10SDavid du Colombier 160ade43d10SDavid du Colombier /* simple comms */ 161ade43d10SDavid du Colombier Pciscserial = 0, /* 16450, etc. */ 162ade43d10SDavid du Colombier Pciscmultiser = 1, /* multiport serial */ 163ade43d10SDavid du Colombier 164ade43d10SDavid du Colombier /* serial bus */ 165ade43d10SDavid du Colombier Pciscusb = 3, /* USB */ 166ade43d10SDavid du Colombier }; 167ade43d10SDavid du Colombier 1687dd7cddfSDavid du Colombier enum { /* type 0 pre-defined header */ 1697dd7cddfSDavid du Colombier PciCIS = 0x28, /* cardbus CIS pointer */ 1707dd7cddfSDavid du Colombier PciSVID = 0x2C, /* subsystem vendor ID */ 1717dd7cddfSDavid du Colombier PciSID = 0x2E, /* cardbus CIS pointer */ 1727dd7cddfSDavid du Colombier PciEBAR0 = 0x30, /* expansion ROM base address */ 1737dd7cddfSDavid du Colombier PciMGNT = 0x3E, /* burst period length */ 1747dd7cddfSDavid du Colombier PciMLT = 0x3F, /* maximum latency between bursts */ 1757dd7cddfSDavid du Colombier }; 1767dd7cddfSDavid du Colombier 1777dd7cddfSDavid du Colombier enum { /* type 1 pre-defined header */ 1787dd7cddfSDavid du Colombier PciPBN = 0x18, /* primary bus number */ 1797dd7cddfSDavid du Colombier PciSBN = 0x19, /* secondary bus number */ 1807dd7cddfSDavid du Colombier PciUBN = 0x1A, /* subordinate bus number */ 1817dd7cddfSDavid du Colombier PciSLTR = 0x1B, /* secondary latency timer */ 1827dd7cddfSDavid du Colombier PciIBR = 0x1C, /* I/O base */ 1837dd7cddfSDavid du Colombier PciILR = 0x1D, /* I/O limit */ 1847dd7cddfSDavid du Colombier PciSPSR = 0x1E, /* secondary status */ 1857dd7cddfSDavid du Colombier PciMBR = 0x20, /* memory base */ 1867dd7cddfSDavid du Colombier PciMLR = 0x22, /* memory limit */ 1877dd7cddfSDavid du Colombier PciPMBR = 0x24, /* prefetchable memory base */ 1887dd7cddfSDavid du Colombier PciPMLR = 0x26, /* prefetchable memory limit */ 1897dd7cddfSDavid du Colombier PciPUBR = 0x28, /* prefetchable base upper 32 bits */ 1907dd7cddfSDavid du Colombier PciPULR = 0x2C, /* prefetchable limit upper 32 bits */ 1917dd7cddfSDavid du Colombier PciIUBR = 0x30, /* I/O base upper 16 bits */ 1927dd7cddfSDavid du Colombier PciIULR = 0x32, /* I/O limit upper 16 bits */ 1937dd7cddfSDavid du Colombier PciEBAR1 = 0x28, /* expansion ROM base address */ 1947dd7cddfSDavid du Colombier PciBCR = 0x3E, /* bridge control register */ 1957dd7cddfSDavid du Colombier }; 1967dd7cddfSDavid du Colombier 1977dd7cddfSDavid du Colombier enum { /* type 2 pre-defined header */ 1987dd7cddfSDavid du Colombier PciCBExCA = 0x10, 1997dd7cddfSDavid du Colombier PciCBSPSR = 0x16, 2007dd7cddfSDavid du Colombier PciCBPBN = 0x18, /* primary bus number */ 2017dd7cddfSDavid du Colombier PciCBSBN = 0x19, /* secondary bus number */ 2027dd7cddfSDavid du Colombier PciCBUBN = 0x1A, /* subordinate bus number */ 2037dd7cddfSDavid du Colombier PciCBSLTR = 0x1B, /* secondary latency timer */ 2047dd7cddfSDavid du Colombier PciCBMBR0 = 0x1C, 2057dd7cddfSDavid du Colombier PciCBMLR0 = 0x20, 2067dd7cddfSDavid du Colombier PciCBMBR1 = 0x24, 2077dd7cddfSDavid du Colombier PciCBMLR1 = 0x28, 2087dd7cddfSDavid du Colombier PciCBIBR0 = 0x2C, /* I/O base */ 2097dd7cddfSDavid du Colombier PciCBILR0 = 0x30, /* I/O limit */ 2107dd7cddfSDavid du Colombier PciCBIBR1 = 0x34, /* I/O base */ 2117dd7cddfSDavid du Colombier PciCBILR1 = 0x38, /* I/O limit */ 2127dd7cddfSDavid du Colombier PciCBSVID = 0x40, /* subsystem vendor ID */ 2137dd7cddfSDavid du Colombier PciCBSID = 0x42, /* subsystem ID */ 2147dd7cddfSDavid du Colombier PciCBLMBAR = 0x44, /* legacy mode base address */ 2157dd7cddfSDavid du Colombier }; 2167dd7cddfSDavid du Colombier 2177dd7cddfSDavid du Colombier typedef struct Pcisiz Pcisiz; 2187dd7cddfSDavid du Colombier struct Pcisiz 2197dd7cddfSDavid du Colombier { 2207dd7cddfSDavid du Colombier Pcidev* dev; 2217dd7cddfSDavid du Colombier int siz; 2227dd7cddfSDavid du Colombier int bar; 2237dd7cddfSDavid du Colombier }; 2247dd7cddfSDavid du Colombier 2257dd7cddfSDavid du Colombier typedef struct Pcidev Pcidev; 2267dd7cddfSDavid du Colombier struct Pcidev 2277dd7cddfSDavid du Colombier { 2287dd7cddfSDavid du Colombier int tbdf; /* type+bus+device+function */ 2297dd7cddfSDavid du Colombier ushort vid; /* vendor ID */ 2307dd7cddfSDavid du Colombier ushort did; /* device ID */ 2317dd7cddfSDavid du Colombier 232e569ccb5SDavid du Colombier ushort pcr; 233e569ccb5SDavid du Colombier 2347dd7cddfSDavid du Colombier uchar rid; 2357dd7cddfSDavid du Colombier uchar ccrp; 2367dd7cddfSDavid du Colombier uchar ccru; 2377dd7cddfSDavid du Colombier uchar ccrb; 238e569ccb5SDavid du Colombier uchar cls; 239e569ccb5SDavid du Colombier uchar ltr; 2407dd7cddfSDavid du Colombier 2417dd7cddfSDavid du Colombier struct { 2427dd7cddfSDavid du Colombier ulong bar; /* base address */ 2437dd7cddfSDavid du Colombier int size; 2447dd7cddfSDavid du Colombier } mem[6]; 2457dd7cddfSDavid du Colombier 2469a747e4fSDavid du Colombier struct { 2479a747e4fSDavid du Colombier ulong bar; 2489a747e4fSDavid du Colombier int size; 2499a747e4fSDavid du Colombier } rom; 2507dd7cddfSDavid du Colombier uchar intl; /* interrupt line */ 2517dd7cddfSDavid du Colombier 2527dd7cddfSDavid du Colombier Pcidev* list; 2537dd7cddfSDavid du Colombier Pcidev* link; /* next device on this bno */ 2547dd7cddfSDavid du Colombier 2557dd7cddfSDavid du Colombier Pcidev* bridge; /* down a bus */ 2567dd7cddfSDavid du Colombier struct { 2577dd7cddfSDavid du Colombier ulong bar; 2587dd7cddfSDavid du Colombier int size; 2597dd7cddfSDavid du Colombier } ioa, mema; 260e569ccb5SDavid du Colombier 261e569ccb5SDavid du Colombier int pmrb; /* power management register block */ 2627dd7cddfSDavid du Colombier }; 2637dd7cddfSDavid du Colombier 264d5789509SDavid du Colombier enum { 265d5789509SDavid du Colombier /* vendor ids */ 266*75cb58dbSDavid du Colombier Vatiamd = 0x1002, 267d5789509SDavid du Colombier Vintel = 0x8086, 268*75cb58dbSDavid du Colombier Vjmicron= 0x197b, 269*75cb58dbSDavid du Colombier Vmarvell= 0x1b4b, 270d5789509SDavid du Colombier Vmyricom= 0x14c1, 271d5789509SDavid du Colombier }; 272d5789509SDavid du Colombier 2737dd7cddfSDavid du Colombier #define PCIWINDOW 0 2747dd7cddfSDavid du Colombier #define PCIWADDR(va) (PADDR(va)+PCIWINDOW) 2757dd7cddfSDavid du Colombier #define ISAWINDOW 0 2767dd7cddfSDavid du Colombier #define ISAWADDR(va) (PADDR(va)+ISAWINDOW) 2777dd7cddfSDavid du Colombier 2787dd7cddfSDavid du Colombier /* SMBus transactions */ 2797dd7cddfSDavid du Colombier enum 2807dd7cddfSDavid du Colombier { 2817dd7cddfSDavid du Colombier SMBquick, /* sends address only */ 2827dd7cddfSDavid du Colombier 2837dd7cddfSDavid du Colombier /* write */ 2847dd7cddfSDavid du Colombier SMBsend, /* sends address and cmd */ 2857dd7cddfSDavid du Colombier SMBbytewrite, /* sends address and cmd and 1 byte */ 2867dd7cddfSDavid du Colombier SMBwordwrite, /* sends address and cmd and 2 bytes */ 2877dd7cddfSDavid du Colombier 2887dd7cddfSDavid du Colombier /* read */ 2897dd7cddfSDavid du Colombier SMBrecv, /* sends address, recvs 1 byte */ 2907dd7cddfSDavid du Colombier SMBbyteread, /* sends address and cmd, recv's byte */ 2917dd7cddfSDavid du Colombier SMBwordread, /* sends address and cmd, recv's 2 bytes */ 2927dd7cddfSDavid du Colombier }; 2937dd7cddfSDavid du Colombier 2947dd7cddfSDavid du Colombier typedef struct SMBus SMBus; 2957dd7cddfSDavid du Colombier struct SMBus { 2967dd7cddfSDavid du Colombier QLock; /* mutex */ 2977dd7cddfSDavid du Colombier Rendez r; /* rendezvous point for completion interrupts */ 2987dd7cddfSDavid du Colombier void *arg; /* implementation dependent */ 2997dd7cddfSDavid du Colombier ulong base; /* port or memory base of smbus */ 3007dd7cddfSDavid du Colombier int busy; 3017dd7cddfSDavid du Colombier void (*transact)(SMBus*, int, int, int, uchar*); 3027dd7cddfSDavid du Colombier }; 30380ee5cbfSDavid du Colombier 30480ee5cbfSDavid du Colombier /* 30580ee5cbfSDavid du Colombier * PCMCIA support code. 30680ee5cbfSDavid du Colombier */ 30780ee5cbfSDavid du Colombier 30880ee5cbfSDavid du Colombier typedef struct PCMslot PCMslot; 30980ee5cbfSDavid du Colombier typedef struct PCMconftab PCMconftab; 31080ee5cbfSDavid du Colombier 31180ee5cbfSDavid du Colombier /* 31280ee5cbfSDavid du Colombier * Map between ISA memory space and PCMCIA card memory space. 31380ee5cbfSDavid du Colombier */ 31480ee5cbfSDavid du Colombier struct PCMmap { 31580ee5cbfSDavid du Colombier ulong ca; /* card address */ 31680ee5cbfSDavid du Colombier ulong cea; /* card end address */ 31780ee5cbfSDavid du Colombier ulong isa; /* ISA address */ 31880ee5cbfSDavid du Colombier int len; /* length of the ISA area */ 31980ee5cbfSDavid du Colombier int attr; /* attribute memory */ 32080ee5cbfSDavid du Colombier int ref; 32180ee5cbfSDavid du Colombier }; 32280ee5cbfSDavid du Colombier 32380ee5cbfSDavid du Colombier /* configuration table entry */ 32480ee5cbfSDavid du Colombier struct PCMconftab 32580ee5cbfSDavid du Colombier { 32680ee5cbfSDavid du Colombier int index; 32780ee5cbfSDavid du Colombier ushort irqs; /* legal irqs */ 32880ee5cbfSDavid du Colombier uchar irqtype; 32980ee5cbfSDavid du Colombier uchar bit16; /* true for 16 bit access */ 33080ee5cbfSDavid du Colombier struct { 33180ee5cbfSDavid du Colombier ulong start; 33280ee5cbfSDavid du Colombier ulong len; 33380ee5cbfSDavid du Colombier } io[16]; 33480ee5cbfSDavid du Colombier int nio; 33580ee5cbfSDavid du Colombier uchar vpp1; 33680ee5cbfSDavid du Colombier uchar vpp2; 33780ee5cbfSDavid du Colombier uchar memwait; 33880ee5cbfSDavid du Colombier ulong maxwait; 33980ee5cbfSDavid du Colombier ulong readywait; 34080ee5cbfSDavid du Colombier ulong otherwait; 34180ee5cbfSDavid du Colombier }; 34280ee5cbfSDavid du Colombier 34380ee5cbfSDavid du Colombier /* a card slot */ 34480ee5cbfSDavid du Colombier struct PCMslot 34580ee5cbfSDavid du Colombier { 34680ee5cbfSDavid du Colombier Lock; 34780ee5cbfSDavid du Colombier int ref; 34880ee5cbfSDavid du Colombier 34980ee5cbfSDavid du Colombier void *cp; /* controller for this slot */ 35080ee5cbfSDavid du Colombier long memlen; /* memory length */ 35180ee5cbfSDavid du Colombier uchar base; /* index register base */ 35280ee5cbfSDavid du Colombier uchar slotno; /* slot number */ 35380ee5cbfSDavid du Colombier 35480ee5cbfSDavid du Colombier /* status */ 35580ee5cbfSDavid du Colombier uchar special; /* in use for a special device */ 35680ee5cbfSDavid du Colombier uchar already; /* already inited */ 35780ee5cbfSDavid du Colombier uchar occupied; 35880ee5cbfSDavid du Colombier uchar battery; 35980ee5cbfSDavid du Colombier uchar wrprot; 36080ee5cbfSDavid du Colombier uchar powered; 36180ee5cbfSDavid du Colombier uchar configed; 36280ee5cbfSDavid du Colombier uchar enabled; 36380ee5cbfSDavid du Colombier uchar busy; 36480ee5cbfSDavid du Colombier 36580ee5cbfSDavid du Colombier /* cis info */ 36680ee5cbfSDavid du Colombier ulong msec; /* time of last slotinfo call */ 36780ee5cbfSDavid du Colombier char verstr[512]; /* version string */ 36815174232SDavid du Colombier int ncfg; /* number of configurations */ 36915174232SDavid du Colombier struct { 37015174232SDavid du Colombier ushort cpresent; /* config registers present */ 37180ee5cbfSDavid du Colombier ulong caddr; /* relative address of config registers */ 37215174232SDavid du Colombier } cfg[8]; 37380ee5cbfSDavid du Colombier int nctab; /* number of config table entries */ 37480ee5cbfSDavid du Colombier PCMconftab ctab[8]; 37580ee5cbfSDavid du Colombier PCMconftab *def; /* default conftab */ 37680ee5cbfSDavid du Colombier 37780ee5cbfSDavid du Colombier /* memory maps */ 37880ee5cbfSDavid du Colombier Lock mlock; /* lock down the maps */ 37980ee5cbfSDavid du Colombier int time; 38080ee5cbfSDavid du Colombier PCMmap mmap[4]; /* maps, last is always for the kernel */ 38180ee5cbfSDavid du Colombier }; 38225fc6993SDavid du Colombier 38325fc6993SDavid du Colombier #pragma varargck type "T" int 38425fc6993SDavid du Colombier #pragma varargck type "T" uint 385