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