1*a81c3ea0SDavid du Colombier enum { 2*a81c3ea0SDavid du Colombier Mhz = 1000*1000, 3*a81c3ea0SDavid du Colombier }; 4*a81c3ea0SDavid du Colombier 5*a81c3ea0SDavid du Colombier /* 6*a81c3ea0SDavid du Colombier * duarts, frequency and registers 7*a81c3ea0SDavid du Colombier */ 8*a81c3ea0SDavid du Colombier #define DUARTFREQ 1843200 9*a81c3ea0SDavid du Colombier 10*a81c3ea0SDavid du Colombier /* 11*a81c3ea0SDavid du Colombier * interrupt levels on CPU boards. 12*a81c3ea0SDavid du Colombier */ 13*a81c3ea0SDavid du Colombier enum 14*a81c3ea0SDavid du Colombier { 15*a81c3ea0SDavid du Colombier ILmin = 2, 16*a81c3ea0SDavid du Colombier ILpci = 2, 17*a81c3ea0SDavid du Colombier ILunused3 = 3, 18*a81c3ea0SDavid du Colombier ILduart0 = 4, 19*a81c3ea0SDavid du Colombier IL8259 = 5, 20*a81c3ea0SDavid du Colombier ILperf = 6, 21*a81c3ea0SDavid du Colombier ILclock = 7, 22*a81c3ea0SDavid du Colombier ILmax = 7, 23*a81c3ea0SDavid du Colombier 24*a81c3ea0SDavid du Colombier ILshift = 8, 25*a81c3ea0SDavid du Colombier }; 26*a81c3ea0SDavid du Colombier 27*a81c3ea0SDavid du Colombier /* 28*a81c3ea0SDavid du Colombier * PCI configuration regesters and interrupt bits 29*a81c3ea0SDavid du Colombier */ 30*a81c3ea0SDavid du Colombier #define Reset (ulong*)(PCICFG+0x104) 31*a81c3ea0SDavid du Colombier #define Rstcpucold (1<<2) /* cpu cold reset */ 32*a81c3ea0SDavid du Colombier 33*a81c3ea0SDavid du Colombier #define Pcimapcfg (ulong*)(PCICFG+0x118) 34*a81c3ea0SDavid du Colombier #define Pciintrsts (ulong*)(PCICFG+0x13c) 35*a81c3ea0SDavid du Colombier #define Pciintren (ulong*)(PCICFG+0x138) 36*a81c3ea0SDavid du Colombier #define Pciintrenset (ulong*)(PCICFG+0x130) 37*a81c3ea0SDavid du Colombier #define Pciintrenclr (ulong*)(PCICFG+0x134) 38*a81c3ea0SDavid du Colombier 39*a81c3ea0SDavid du Colombier #define Pciintrbase 25 40*a81c3ea0SDavid du Colombier 41*a81c3ea0SDavid du Colombier /* 42*a81c3ea0SDavid du Colombier * i8259 interrupts 43*a81c3ea0SDavid du Colombier */ 44*a81c3ea0SDavid du Colombier enum { 45*a81c3ea0SDavid du Colombier IrqCLOCK = 0, 46*a81c3ea0SDavid du Colombier IrqKBD = 1, 47*a81c3ea0SDavid du Colombier IrqUART1 = 3, 48*a81c3ea0SDavid du Colombier IrqUART0 = 4, 49*a81c3ea0SDavid du Colombier IrqPCMCIA = 5, 50*a81c3ea0SDavid du Colombier IrqFLOPPY = 6, 51*a81c3ea0SDavid du Colombier IrqLPT = 7, 52*a81c3ea0SDavid du Colombier IrqIRQ7 = 7, 53*a81c3ea0SDavid du Colombier IrqAUX = 12, /* PS/2 port */ 54*a81c3ea0SDavid du Colombier IrqIRQ13 = 13, /* coprocessor on 386 */ 55*a81c3ea0SDavid du Colombier IrqATA0 = 14, 56*a81c3ea0SDavid du Colombier IrqATA1 = 15, 57*a81c3ea0SDavid du Colombier MaxIrqPIC = 15, 58*a81c3ea0SDavid du Colombier 59*a81c3ea0SDavid du Colombier VectorPIC = 0, 60*a81c3ea0SDavid du Colombier MaxVectorPIC = VectorPIC+MaxIrqPIC, 61*a81c3ea0SDavid du Colombier }; 62*a81c3ea0SDavid du Colombier 63*a81c3ea0SDavid du Colombier 64*a81c3ea0SDavid du Colombier /* 65*a81c3ea0SDavid du Colombier * mostly PCI from here on 66*a81c3ea0SDavid du Colombier */ 67*a81c3ea0SDavid du Colombier 68*a81c3ea0SDavid du Colombier typedef struct Pcisiz Pcisiz; 69*a81c3ea0SDavid du Colombier typedef struct Pcidev Pcidev; 70*a81c3ea0SDavid du Colombier typedef struct Vctl Vctl; 71*a81c3ea0SDavid du Colombier 72*a81c3ea0SDavid du Colombier struct Vctl { 73*a81c3ea0SDavid du Colombier Vctl* next; /* handlers on this vector */ 74*a81c3ea0SDavid du Colombier 75*a81c3ea0SDavid du Colombier char name[KNAMELEN]; /* of driver */ 76*a81c3ea0SDavid du Colombier int isintr; /* interrupt or fault/trap */ 77*a81c3ea0SDavid du Colombier int irq; 78*a81c3ea0SDavid du Colombier int tbdf; 79*a81c3ea0SDavid du Colombier int (*isr)(int); /* get isr bit for this irq */ 80*a81c3ea0SDavid du Colombier int (*eoi)(int); /* eoi */ 81*a81c3ea0SDavid du Colombier 82*a81c3ea0SDavid du Colombier void (*f)(Ureg*, void*); /* handler to call */ 83*a81c3ea0SDavid du Colombier void* a; /* argument to call it with */ 84*a81c3ea0SDavid du Colombier }; 85*a81c3ea0SDavid du Colombier 86*a81c3ea0SDavid du Colombier enum { 87*a81c3ea0SDavid du Colombier BusCBUS = 0, /* Corollary CBUS */ 88*a81c3ea0SDavid du Colombier BusCBUSII, /* Corollary CBUS II */ 89*a81c3ea0SDavid du Colombier BusEISA, /* Extended ISA */ 90*a81c3ea0SDavid du Colombier BusFUTURE, /* IEEE Futurebus */ 91*a81c3ea0SDavid du Colombier BusINTERN, /* Internal bus */ 92*a81c3ea0SDavid du Colombier BusISA, /* Industry Standard Architecture */ 93*a81c3ea0SDavid du Colombier BusMBI, /* Multibus I */ 94*a81c3ea0SDavid du Colombier BusMBII, /* Multibus II */ 95*a81c3ea0SDavid du Colombier BusMCA, /* Micro Channel Architecture */ 96*a81c3ea0SDavid du Colombier BusMPI, /* MPI */ 97*a81c3ea0SDavid du Colombier BusMPSA, /* MPSA */ 98*a81c3ea0SDavid du Colombier BusNUBUS, /* Apple Macintosh NuBus */ 99*a81c3ea0SDavid du Colombier BusPCI, /* Peripheral Component Interconnect */ 100*a81c3ea0SDavid du Colombier BusPCMCIA, /* PC Memory Card International Association */ 101*a81c3ea0SDavid du Colombier BusTC, /* DEC TurboChannel */ 102*a81c3ea0SDavid du Colombier BusVL, /* VESA Local bus */ 103*a81c3ea0SDavid du Colombier BusVME, /* VMEbus */ 104*a81c3ea0SDavid du Colombier BusXPRESS, /* Express System Bus */ 105*a81c3ea0SDavid du Colombier }; 106*a81c3ea0SDavid du Colombier 107*a81c3ea0SDavid du Colombier #define MKBUS(t,b,d,f) (((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8)) 108*a81c3ea0SDavid du Colombier #define BUSFNO(tbdf) (((tbdf)>>8)&0x07) 109*a81c3ea0SDavid du Colombier #define BUSDNO(tbdf) (((tbdf)>>11)&0x1F) 110*a81c3ea0SDavid du Colombier #define BUSBNO(tbdf) (((tbdf)>>16)&0xFF) 111*a81c3ea0SDavid du Colombier #define BUSTYPE(tbdf) ((tbdf)>>24) 112*a81c3ea0SDavid du Colombier #define BUSBDF(tbdf) ((tbdf)&0x00FFFF00) 113*a81c3ea0SDavid du Colombier #define BUSUNKNOWN (-1) 114*a81c3ea0SDavid du Colombier 115*a81c3ea0SDavid du Colombier enum { 116*a81c3ea0SDavid du Colombier MaxEISA = 16, 117*a81c3ea0SDavid du Colombier CfgEISA = 0xC80, 118*a81c3ea0SDavid du Colombier }; 119*a81c3ea0SDavid du Colombier 120*a81c3ea0SDavid du Colombier /* 121*a81c3ea0SDavid du Colombier * PCI support code. 122*a81c3ea0SDavid du Colombier */ 123*a81c3ea0SDavid du Colombier enum { /* type 0 & type 1 pre-defined header */ 124*a81c3ea0SDavid du Colombier PciVID = 0x00, /* vendor ID */ 125*a81c3ea0SDavid du Colombier PciDID = 0x02, /* device ID */ 126*a81c3ea0SDavid du Colombier PciPCR = 0x04, /* command */ 127*a81c3ea0SDavid du Colombier PciPSR = 0x06, /* status */ 128*a81c3ea0SDavid du Colombier PciRID = 0x08, /* revision ID */ 129*a81c3ea0SDavid du Colombier PciCCRp = 0x09, /* programming interface class code */ 130*a81c3ea0SDavid du Colombier PciCCRu = 0x0A, /* sub-class code */ 131*a81c3ea0SDavid du Colombier PciCCRb = 0x0B, /* base class code */ 132*a81c3ea0SDavid du Colombier PciCLS = 0x0C, /* cache line size */ 133*a81c3ea0SDavid du Colombier PciLTR = 0x0D, /* latency timer */ 134*a81c3ea0SDavid du Colombier PciHDT = 0x0E, /* header type */ 135*a81c3ea0SDavid du Colombier PciBST = 0x0F, /* BIST */ 136*a81c3ea0SDavid du Colombier 137*a81c3ea0SDavid du Colombier PciBAR0 = 0x10, /* base address */ 138*a81c3ea0SDavid du Colombier PciBAR1 = 0x14, 139*a81c3ea0SDavid du Colombier 140*a81c3ea0SDavid du Colombier PciINTL = 0x3C, /* interrupt line */ 141*a81c3ea0SDavid du Colombier PciINTP = 0x3D, /* interrupt pin */ 142*a81c3ea0SDavid du Colombier }; 143*a81c3ea0SDavid du Colombier 144*a81c3ea0SDavid du Colombier /* ccrb (base class code) values; controller types */ 145*a81c3ea0SDavid du Colombier enum { 146*a81c3ea0SDavid du Colombier Pcibcpci1 = 0, /* pci 1.0; no class codes defined */ 147*a81c3ea0SDavid du Colombier Pcibcstore = 1, /* mass storage */ 148*a81c3ea0SDavid du Colombier Pcibcnet = 2, /* network */ 149*a81c3ea0SDavid du Colombier Pcibcdisp = 3, /* display */ 150*a81c3ea0SDavid du Colombier Pcibcmmedia = 4, /* multimedia */ 151*a81c3ea0SDavid du Colombier Pcibcmem = 5, /* memory */ 152*a81c3ea0SDavid du Colombier Pcibcbridge = 6, /* bridge */ 153*a81c3ea0SDavid du Colombier Pcibccomm = 7, /* simple comms (e.g., serial) */ 154*a81c3ea0SDavid du Colombier Pcibcbasesys = 8, /* base system */ 155*a81c3ea0SDavid du Colombier Pcibcinput = 9, /* input */ 156*a81c3ea0SDavid du Colombier Pcibcdock = 0xa, /* docking stations */ 157*a81c3ea0SDavid du Colombier Pcibcproc = 0xb, /* processors */ 158*a81c3ea0SDavid du Colombier Pcibcserial = 0xc, /* serial bus (e.g., USB) */ 159*a81c3ea0SDavid du Colombier Pcibcwireless = 0xd, /* wireless */ 160*a81c3ea0SDavid du Colombier Pcibcintell = 0xe, /* intelligent i/o */ 161*a81c3ea0SDavid du Colombier Pcibcsatcom = 0xf, /* satellite comms */ 162*a81c3ea0SDavid du Colombier Pcibccrypto = 0x10, /* encryption/decryption */ 163*a81c3ea0SDavid du Colombier Pcibcdacq = 0x11, /* data acquisition & signal proc. */ 164*a81c3ea0SDavid du Colombier }; 165*a81c3ea0SDavid du Colombier 166*a81c3ea0SDavid du Colombier /* ccru (sub-class code) values; common cases only */ 167*a81c3ea0SDavid du Colombier enum { 168*a81c3ea0SDavid du Colombier /* mass storage */ 169*a81c3ea0SDavid du Colombier Pciscscsi = 0, /* SCSI */ 170*a81c3ea0SDavid du Colombier Pciscide = 1, /* IDE (ATA) */ 171*a81c3ea0SDavid du Colombier Pciscsata = 6, /* SATA */ 172*a81c3ea0SDavid du Colombier 173*a81c3ea0SDavid du Colombier /* network */ 174*a81c3ea0SDavid du Colombier Pciscether = 0, /* Ethernet */ 175*a81c3ea0SDavid du Colombier 176*a81c3ea0SDavid du Colombier /* display */ 177*a81c3ea0SDavid du Colombier Pciscvga = 0, /* VGA */ 178*a81c3ea0SDavid du Colombier Pciscxga = 1, /* XGA */ 179*a81c3ea0SDavid du Colombier Pcisc3d = 2, /* 3D */ 180*a81c3ea0SDavid du Colombier 181*a81c3ea0SDavid du Colombier /* bridges */ 182*a81c3ea0SDavid du Colombier Pcischostpci = 0, /* host/pci */ 183*a81c3ea0SDavid du Colombier Pciscpcicpci = 1, /* pci/pci */ 184*a81c3ea0SDavid du Colombier 185*a81c3ea0SDavid du Colombier /* simple comms */ 186*a81c3ea0SDavid du Colombier Pciscserial = 0, /* 16450, etc. */ 187*a81c3ea0SDavid du Colombier Pciscmultiser = 1, /* multiport serial */ 188*a81c3ea0SDavid du Colombier 189*a81c3ea0SDavid du Colombier /* serial bus */ 190*a81c3ea0SDavid du Colombier Pciscusb = 3, /* USB */ 191*a81c3ea0SDavid du Colombier }; 192*a81c3ea0SDavid du Colombier 193*a81c3ea0SDavid du Colombier enum { /* type 0 pre-defined header */ 194*a81c3ea0SDavid du Colombier PciCIS = 0x28, /* cardbus CIS pointer */ 195*a81c3ea0SDavid du Colombier PciSVID = 0x2C, /* subsystem vendor ID */ 196*a81c3ea0SDavid du Colombier PciSID = 0x2E, /* cardbus CIS pointer */ 197*a81c3ea0SDavid du Colombier PciEBAR0 = 0x30, /* expansion ROM base address */ 198*a81c3ea0SDavid du Colombier PciMGNT = 0x3E, /* burst period length */ 199*a81c3ea0SDavid du Colombier PciMLT = 0x3F, /* maximum latency between bursts */ 200*a81c3ea0SDavid du Colombier }; 201*a81c3ea0SDavid du Colombier 202*a81c3ea0SDavid du Colombier enum { /* type 1 pre-defined header */ 203*a81c3ea0SDavid du Colombier PciPBN = 0x18, /* primary bus number */ 204*a81c3ea0SDavid du Colombier PciSBN = 0x19, /* secondary bus number */ 205*a81c3ea0SDavid du Colombier PciUBN = 0x1A, /* subordinate bus number */ 206*a81c3ea0SDavid du Colombier PciSLTR = 0x1B, /* secondary latency timer */ 207*a81c3ea0SDavid du Colombier PciIBR = 0x1C, /* I/O base */ 208*a81c3ea0SDavid du Colombier PciILR = 0x1D, /* I/O limit */ 209*a81c3ea0SDavid du Colombier PciSPSR = 0x1E, /* secondary status */ 210*a81c3ea0SDavid du Colombier PciMBR = 0x20, /* memory base */ 211*a81c3ea0SDavid du Colombier PciMLR = 0x22, /* memory limit */ 212*a81c3ea0SDavid du Colombier PciPMBR = 0x24, /* prefetchable memory base */ 213*a81c3ea0SDavid du Colombier PciPMLR = 0x26, /* prefetchable memory limit */ 214*a81c3ea0SDavid du Colombier PciPUBR = 0x28, /* prefetchable base upper 32 bits */ 215*a81c3ea0SDavid du Colombier PciPULR = 0x2C, /* prefetchable limit upper 32 bits */ 216*a81c3ea0SDavid du Colombier PciIUBR = 0x30, /* I/O base upper 16 bits */ 217*a81c3ea0SDavid du Colombier PciIULR = 0x32, /* I/O limit upper 16 bits */ 218*a81c3ea0SDavid du Colombier PciEBAR1 = 0x28, /* expansion ROM base address */ 219*a81c3ea0SDavid du Colombier PciBCR = 0x3E, /* bridge control register */ 220*a81c3ea0SDavid du Colombier }; 221*a81c3ea0SDavid du Colombier 222*a81c3ea0SDavid du Colombier enum { /* type 2 pre-defined header */ 223*a81c3ea0SDavid du Colombier PciCBExCA = 0x10, 224*a81c3ea0SDavid du Colombier PciCBSPSR = 0x16, 225*a81c3ea0SDavid du Colombier PciCBPBN = 0x18, /* primary bus number */ 226*a81c3ea0SDavid du Colombier PciCBSBN = 0x19, /* secondary bus number */ 227*a81c3ea0SDavid du Colombier PciCBUBN = 0x1A, /* subordinate bus number */ 228*a81c3ea0SDavid du Colombier PciCBSLTR = 0x1B, /* secondary latency timer */ 229*a81c3ea0SDavid du Colombier PciCBMBR0 = 0x1C, 230*a81c3ea0SDavid du Colombier PciCBMLR0 = 0x20, 231*a81c3ea0SDavid du Colombier PciCBMBR1 = 0x24, 232*a81c3ea0SDavid du Colombier PciCBMLR1 = 0x28, 233*a81c3ea0SDavid du Colombier PciCBIBR0 = 0x2C, /* I/O base */ 234*a81c3ea0SDavid du Colombier PciCBILR0 = 0x30, /* I/O limit */ 235*a81c3ea0SDavid du Colombier PciCBIBR1 = 0x34, /* I/O base */ 236*a81c3ea0SDavid du Colombier PciCBILR1 = 0x38, /* I/O limit */ 237*a81c3ea0SDavid du Colombier PciCBSVID = 0x40, /* subsystem vendor ID */ 238*a81c3ea0SDavid du Colombier PciCBSID = 0x42, /* subsystem ID */ 239*a81c3ea0SDavid du Colombier PciCBLMBAR = 0x44, /* legacy mode base address */ 240*a81c3ea0SDavid du Colombier }; 241*a81c3ea0SDavid du Colombier 242*a81c3ea0SDavid du Colombier struct Pcisiz 243*a81c3ea0SDavid du Colombier { 244*a81c3ea0SDavid du Colombier Pcidev* dev; 245*a81c3ea0SDavid du Colombier int siz; 246*a81c3ea0SDavid du Colombier int bar; 247*a81c3ea0SDavid du Colombier }; 248*a81c3ea0SDavid du Colombier 249*a81c3ea0SDavid du Colombier struct Pcidev 250*a81c3ea0SDavid du Colombier { 251*a81c3ea0SDavid du Colombier int tbdf; /* type+bus+device+function */ 252*a81c3ea0SDavid du Colombier ushort vid; /* vendor ID */ 253*a81c3ea0SDavid du Colombier ushort did; /* device ID */ 254*a81c3ea0SDavid du Colombier 255*a81c3ea0SDavid du Colombier ushort pcr; 256*a81c3ea0SDavid du Colombier 257*a81c3ea0SDavid du Colombier uchar rid; 258*a81c3ea0SDavid du Colombier uchar ccrp; 259*a81c3ea0SDavid du Colombier uchar ccru; 260*a81c3ea0SDavid du Colombier uchar ccrb; 261*a81c3ea0SDavid du Colombier uchar cls; 262*a81c3ea0SDavid du Colombier uchar ltr; 263*a81c3ea0SDavid du Colombier 264*a81c3ea0SDavid du Colombier struct { 265*a81c3ea0SDavid du Colombier ulong bar; /* base address */ 266*a81c3ea0SDavid du Colombier int size; 267*a81c3ea0SDavid du Colombier } mem[6]; 268*a81c3ea0SDavid du Colombier 269*a81c3ea0SDavid du Colombier struct { 270*a81c3ea0SDavid du Colombier ulong bar; 271*a81c3ea0SDavid du Colombier int size; 272*a81c3ea0SDavid du Colombier } rom; 273*a81c3ea0SDavid du Colombier uchar intl; /* interrupt line */ 274*a81c3ea0SDavid du Colombier uchar intp; /* interrupt pin */ 275*a81c3ea0SDavid du Colombier 276*a81c3ea0SDavid du Colombier Pcidev* list; 277*a81c3ea0SDavid du Colombier Pcidev* link; /* next device on this bno */ 278*a81c3ea0SDavid du Colombier 279*a81c3ea0SDavid du Colombier Pcidev* bridge; /* down a bus */ 280*a81c3ea0SDavid du Colombier struct { 281*a81c3ea0SDavid du Colombier ulong bar; 282*a81c3ea0SDavid du Colombier int size; 283*a81c3ea0SDavid du Colombier } ioa, mema; 284*a81c3ea0SDavid du Colombier 285*a81c3ea0SDavid du Colombier int pmrb; /* power management register block */ 286*a81c3ea0SDavid du Colombier }; 287*a81c3ea0SDavid du Colombier 288*a81c3ea0SDavid du Colombier enum { 289*a81c3ea0SDavid du Colombier /* vendor ids */ 290*a81c3ea0SDavid du Colombier Vatiamd = 0x1002, 291*a81c3ea0SDavid du Colombier Vintel = 0x8086, 292*a81c3ea0SDavid du Colombier Vjmicron= 0x197b, 293*a81c3ea0SDavid du Colombier Vmarvell= 0x1b4b, 294*a81c3ea0SDavid du Colombier Vmyricom= 0x14c1, 295*a81c3ea0SDavid du Colombier Vrtl = 0x10ec, 296*a81c3ea0SDavid du Colombier Vsm = 0x126f, 297*a81c3ea0SDavid du Colombier }; 298*a81c3ea0SDavid du Colombier 299*a81c3ea0SDavid du Colombier #define PCIWINDOW 0x80000000 300*a81c3ea0SDavid du Colombier #define PCIWADDR(va) (PADDR(va)+PCIWINDOW) 301*a81c3ea0SDavid du Colombier #define ISAWINDOW 0 302*a81c3ea0SDavid du Colombier #define ISAWADDR(va) (PADDR(va)+ISAWINDOW) 303*a81c3ea0SDavid du Colombier 304*a81c3ea0SDavid du Colombier #define PCIMEMADDR(pa) ((pa)|PCIMEM) 305*a81c3ea0SDavid du Colombier 306*a81c3ea0SDavid du Colombier /* SMBus transactions */ 307*a81c3ea0SDavid du Colombier enum 308*a81c3ea0SDavid du Colombier { 309*a81c3ea0SDavid du Colombier SMBquick, /* sends address only */ 310*a81c3ea0SDavid du Colombier 311*a81c3ea0SDavid du Colombier /* write */ 312*a81c3ea0SDavid du Colombier SMBsend, /* sends address and cmd */ 313*a81c3ea0SDavid du Colombier SMBbytewrite, /* sends address and cmd and 1 byte */ 314*a81c3ea0SDavid du Colombier SMBwordwrite, /* sends address and cmd and 2 bytes */ 315*a81c3ea0SDavid du Colombier 316*a81c3ea0SDavid du Colombier /* read */ 317*a81c3ea0SDavid du Colombier SMBrecv, /* sends address, recvs 1 byte */ 318*a81c3ea0SDavid du Colombier SMBbyteread, /* sends address and cmd, recv's byte */ 319*a81c3ea0SDavid du Colombier SMBwordread, /* sends address and cmd, recv's 2 bytes */ 320*a81c3ea0SDavid du Colombier }; 321*a81c3ea0SDavid du Colombier 322*a81c3ea0SDavid du Colombier typedef struct SMBus SMBus; 323*a81c3ea0SDavid du Colombier struct SMBus { 324*a81c3ea0SDavid du Colombier QLock; /* mutex */ 325*a81c3ea0SDavid du Colombier Rendez r; /* rendezvous point for completion interrupts */ 326*a81c3ea0SDavid du Colombier void *arg; /* implementation dependent */ 327*a81c3ea0SDavid du Colombier ulong base; /* port or memory base of smbus */ 328*a81c3ea0SDavid du Colombier int busy; 329*a81c3ea0SDavid du Colombier void (*transact)(SMBus*, int, int, int, uchar*); 330*a81c3ea0SDavid du Colombier }; 331*a81c3ea0SDavid du Colombier 332*a81c3ea0SDavid du Colombier #pragma varargck type "T" int 333*a81c3ea0SDavid du Colombier #pragma varargck type "T" uint 334