17dd7cddfSDavid du Colombier enum { 27dd7cddfSDavid du Colombier BusCBUS = 0, /* Corollary CBUS */ 37dd7cddfSDavid du Colombier BusCBUSII, /* Corollary CBUS II */ 47dd7cddfSDavid du Colombier BusEISA, /* Extended ISA */ 57dd7cddfSDavid du Colombier BusFUTURE, /* IEEE Futurebus */ 67dd7cddfSDavid du Colombier BusINTERN, /* Internal bus */ 77dd7cddfSDavid du Colombier BusISA, /* Industry Standard Architecture */ 87dd7cddfSDavid du Colombier BusMBI, /* Multibus I */ 97dd7cddfSDavid du Colombier BusMBII, /* Multibus II */ 107dd7cddfSDavid du Colombier BusMCA, /* Micro Channel Architecture */ 117dd7cddfSDavid du Colombier BusMPI, /* MPI */ 127dd7cddfSDavid du Colombier BusMPSA, /* MPSA */ 137dd7cddfSDavid du Colombier BusNUBUS, /* Apple Macintosh NuBus */ 147dd7cddfSDavid du Colombier BusPCI, /* Peripheral Component Interconnect */ 157dd7cddfSDavid du Colombier BusPCMCIA, /* PC Memory Card International Association */ 167dd7cddfSDavid du Colombier BusTC, /* DEC TurboChannel */ 177dd7cddfSDavid du Colombier BusVL, /* VESA Local bus */ 187dd7cddfSDavid du Colombier BusVME, /* VMEbus */ 197dd7cddfSDavid du Colombier BusXPRESS, /* Express System Bus */ 207dd7cddfSDavid du Colombier }; 217dd7cddfSDavid du Colombier 227dd7cddfSDavid du Colombier #define MKBUS(t,b,d,f) (((t)<<24)|(((b)&0xFF)<<16)|(((d)&0x1F)<<11)|(((f)&0x07)<<8)) 237dd7cddfSDavid du Colombier #define BUSFNO(tbdf) (((tbdf)>>8)&0x07) 247dd7cddfSDavid du Colombier #define BUSDNO(tbdf) (((tbdf)>>11)&0x1F) 257dd7cddfSDavid du Colombier #define BUSBNO(tbdf) (((tbdf)>>16)&0xFF) 267dd7cddfSDavid du Colombier #define BUSTYPE(tbdf) ((tbdf)>>24) 277dd7cddfSDavid du Colombier #define BUSBDF(tbdf) ((tbdf)&0x00FFFF00) 287dd7cddfSDavid du Colombier #define BUSUNKNOWN (-1) 297dd7cddfSDavid du Colombier 307dd7cddfSDavid du Colombier /* 317dd7cddfSDavid du Colombier * PCI support code. 327dd7cddfSDavid du Colombier */ 337dd7cddfSDavid du Colombier enum { /* type 0 and type 1 pre-defined header */ 347dd7cddfSDavid du Colombier PciVID = 0x00, /* vendor ID */ 357dd7cddfSDavid du Colombier PciDID = 0x02, /* device ID */ 367dd7cddfSDavid du Colombier PciPCR = 0x04, /* command */ 377dd7cddfSDavid du Colombier PciPSR = 0x06, /* status */ 387dd7cddfSDavid du Colombier PciRID = 0x08, /* revision ID */ 397dd7cddfSDavid du Colombier PciCCRp = 0x09, /* programming interface class code */ 407dd7cddfSDavid du Colombier PciCCRu = 0x0A, /* sub-class code */ 417dd7cddfSDavid du Colombier PciCCRb = 0x0B, /* base class code */ 427dd7cddfSDavid du Colombier PciCLS = 0x0C, /* cache line size */ 437dd7cddfSDavid du Colombier PciLTR = 0x0D, /* latency timer */ 447dd7cddfSDavid du Colombier PciHDT = 0x0E, /* header type */ 457dd7cddfSDavid du Colombier PciBST = 0x0F, /* BIST */ 467dd7cddfSDavid du Colombier 477dd7cddfSDavid du Colombier PciBAR0 = 0x10, /* base address */ 487dd7cddfSDavid du Colombier PciBAR1 = 0x14, 497dd7cddfSDavid du Colombier 507dd7cddfSDavid du Colombier PciINTL = 0x3C, /* interrupt line */ 517dd7cddfSDavid du Colombier PciINTP = 0x3D, /* interrupt pin */ 527dd7cddfSDavid du Colombier }; 537dd7cddfSDavid du Colombier 547dd7cddfSDavid du Colombier enum { /* type 0 pre-defined header */ 557dd7cddfSDavid du Colombier PciBAR2 = 0x18, 567dd7cddfSDavid du Colombier PciBAR3 = 0x1C, 577dd7cddfSDavid du Colombier PciBAR4 = 0x20, 587dd7cddfSDavid du Colombier PciBAR5 = 0x24, 597dd7cddfSDavid du Colombier PciCIS = 0x28, /* cardbus CIS pointer */ 607dd7cddfSDavid du Colombier PciSVID = 0x2C, /* subsystem vendor ID */ 617dd7cddfSDavid du Colombier PciSID = 0x2E, /* cardbus CIS pointer */ 627dd7cddfSDavid du Colombier PciEBAR0 = 0x30, /* expansion ROM base address */ 637dd7cddfSDavid du Colombier PciMGNT = 0x3E, /* burst period length */ 647dd7cddfSDavid du Colombier PciMLT = 0x3F, /* maximum latency between bursts */ 657dd7cddfSDavid du Colombier }; 667dd7cddfSDavid du Colombier 677dd7cddfSDavid du Colombier enum { /* type 1 pre-defined header */ 687dd7cddfSDavid du Colombier PciPBN = 0x18, /* primary bus number */ 697dd7cddfSDavid du Colombier PciSBN = 0x19, /* secondary bus number */ 707dd7cddfSDavid du Colombier PciUBN = 0x1A, /* subordinate bus number */ 717dd7cddfSDavid du Colombier PciSLTR = 0x1B, /* secondary latency timer */ 727dd7cddfSDavid du Colombier PciIBR = 0x1C, /* I/O base */ 737dd7cddfSDavid du Colombier PciILR = 0x1D, /* I/O limit */ 747dd7cddfSDavid du Colombier PciSPSR = 0x1E, /* secondary status */ 757dd7cddfSDavid du Colombier PciMBR = 0x20, /* memory base */ 767dd7cddfSDavid du Colombier PciMLR = 0x22, /* memory limit */ 777dd7cddfSDavid du Colombier PciPMBR = 0x24, /* prefetchable memory base */ 787dd7cddfSDavid du Colombier PciPMLR = 0x26, /* prefetchable memory limit */ 797dd7cddfSDavid du Colombier PciPUBR = 0x28, /* prefetchable base upper 32 bits */ 807dd7cddfSDavid du Colombier PciPULR = 0x2C, /* prefetchable limit upper 32 bits */ 817dd7cddfSDavid du Colombier PciIUBR = 0x30, /* I/O base upper 16 bits */ 827dd7cddfSDavid du Colombier PciIULR = 0x32, /* I/O limit upper 16 bits */ 837dd7cddfSDavid du Colombier PciEBAR1 = 0x28, /* expansion ROM base address */ 847dd7cddfSDavid du Colombier PciBCR = 0x3E, /* bridge control register */ 857dd7cddfSDavid du Colombier }; 867dd7cddfSDavid du Colombier 877dd7cddfSDavid du Colombier typedef struct Pcidev Pcidev; 887dd7cddfSDavid du Colombier typedef struct Pcidev { 897dd7cddfSDavid du Colombier int tbdf; /* type+bus+device+function */ 907dd7cddfSDavid du Colombier ushort vid; /* vendor ID */ 917dd7cddfSDavid du Colombier ushort did; /* device ID */ 92*9a747e4fSDavid du Colombier uchar rid; /* revision ID */ 937dd7cddfSDavid du Colombier 947dd7cddfSDavid du Colombier struct { 957dd7cddfSDavid du Colombier ulong bar; /* base address */ 967dd7cddfSDavid du Colombier int size; 977dd7cddfSDavid du Colombier } mem[6]; 987dd7cddfSDavid du Colombier 997dd7cddfSDavid du Colombier uchar intl; /* interrupt line */ 1007dd7cddfSDavid du Colombier ushort ccru; 1017dd7cddfSDavid du Colombier 1027dd7cddfSDavid du Colombier 1037dd7cddfSDavid du Colombier Pcidev* list; 1047dd7cddfSDavid du Colombier Pcidev* bridge; /* down a bus */ 1057dd7cddfSDavid du Colombier Pcidev* link; /* next device on this bno */ 1067dd7cddfSDavid du Colombier }; 107