00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
#ifndef _PCI_
00018 
#define _PCI_
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 typedef struct _PCI_SLOT_NUMBER {
00046     
union {
00047         
struct {
00048             ULONG   
DeviceNumber:5;
00049             ULONG   
FunctionNumber:3;
00050             ULONG   
Reserved:24;
00051         } bits;
00052         ULONG   
AsULONG;
00053     } u;
00054 } 
PCI_SLOT_NUMBER, *
PPCI_SLOT_NUMBER;
00055 
00056 
00057 #define PCI_TYPE0_ADDRESSES             6
00058 #define PCI_TYPE1_ADDRESSES             2
00059 #define PCI_TYPE2_ADDRESSES             5
00060 
00061 typedef struct _PCI_COMMON_CONFIG {
00062     USHORT  VendorID;                   
00063     USHORT  DeviceID;                   
00064     USHORT  Command;                    
00065     USHORT  Status;
00066     UCHAR   
RevisionID;                 
00067     UCHAR   
ProgIf;                     
00068     UCHAR   
SubClass;                   
00069     UCHAR   
BaseClass;                  
00070     UCHAR   
CacheLineSize;              
00071     UCHAR   
LatencyTimer;               
00072     UCHAR   
HeaderType;                 
00073     UCHAR   
BIST;                       
00074 
00075     
union {
00076         
struct _PCI_HEADER_TYPE_0 {
00077             ULONG   BaseAddresses[
PCI_TYPE0_ADDRESSES];
00078             ULONG   CIS;
00079             USHORT  SubVendorID;
00080             USHORT  SubSystemID;
00081             ULONG   ROMBaseAddress;
00082             UCHAR   CapabilitiesPtr;
00083             UCHAR   
Reserved1[3];
00084             ULONG   
Reserved2;
00085             UCHAR   InterruptLine;      
00086             UCHAR   InterruptPin;       
00087             UCHAR   MinimumGrant;       
00088             UCHAR   MaximumLatency;     
00089         } type0;
00090 
00091 
00092 
00093         
00094         
00095         
00096 
00097         
struct _PCI_HEADER_TYPE_1 {
00098             ULONG   BaseAddresses[
PCI_TYPE1_ADDRESSES];
00099             UCHAR   PrimaryBus;
00100             UCHAR   SecondaryBus;
00101             UCHAR   SubordinateBus;
00102             UCHAR   SecondaryLatency;
00103             UCHAR   IOBase;
00104             UCHAR   IOLimit;
00105             
USHORT  SecondaryStatus;
00106             USHORT  MemoryBase;
00107             USHORT  MemoryLimit;
00108             USHORT  PrefetchBase;
00109             USHORT  PrefetchLimit;
00110             ULONG   PrefetchBaseUpper32;
00111             ULONG   PrefetchLimitUpper32;
00112             USHORT  IOBaseUpper16;
00113             USHORT  IOLimitUpper16;
00114             UCHAR   CapabilitiesPtr;
00115             UCHAR   
Reserved1[3];
00116             ULONG   ROMBaseAddress;
00117             UCHAR   InterruptLine;
00118             UCHAR   InterruptPin;
00119             
USHORT  BridgeControl;
00120         } type1;
00121 
00122         
00123         
00124         
00125 
00126         
struct _PCI_HEADER_TYPE_2 {
00127             ULONG   SocketRegistersBaseAddress;
00128             UCHAR   CapabilitiesPtr;
00129             UCHAR   Reserved;
00130             USHORT  SecondaryStatus;
00131             UCHAR   PrimaryBus;
00132             UCHAR   SecondaryBus;
00133             UCHAR   SubordinateBus;
00134             UCHAR   SecondaryLatency;
00135             
struct  {
00136                 ULONG   Base;
00137                 ULONG   Limit;
00138             }       Range[
PCI_TYPE2_ADDRESSES-1];
00139             UCHAR   InterruptLine;
00140             UCHAR   InterruptPin;
00141             USHORT  BridgeControl;
00142         } type2;
00143 
00144 
00145 
00146     } 
u;
00147 
00148     UCHAR   
DeviceSpecific[192];
00149 
00150 } 
PCI_COMMON_CONFIG, *
PPCI_COMMON_CONFIG;
00151 
00152 
00153 #define PCI_COMMON_HDR_LENGTH (FIELD_OFFSET (PCI_COMMON_CONFIG, DeviceSpecific))
00154 
00155 #define PCI_MAX_DEVICES                     32
00156 #define PCI_MAX_FUNCTION                    8
00157 #define PCI_MAX_BRIDGE_NUMBER               0xFF
00158 
00159 #define PCI_INVALID_VENDORID                0xFFFF
00160 
00161 
00162 
00163 
00164 
00165 #define PCI_MULTIFUNCTION                   0x80
00166 #define PCI_DEVICE_TYPE                     0x00
00167 #define PCI_BRIDGE_TYPE                     0x01
00168 #define PCI_CARDBUS_BRIDGE_TYPE             0x02
00169 
00170 #define PCI_CONFIGURATION_TYPE(PciData) \
00171 
    (((PPCI_COMMON_CONFIG)(PciData))->HeaderType & ~PCI_MULTIFUNCTION)
00172 
00173 #define PCI_MULTIFUNCTION_DEVICE(PciData) \
00174 
    ((((PPCI_COMMON_CONFIG)(PciData))->HeaderType & PCI_MULTIFUNCTION) != 0)
00175 
00176 
00177 
00178 
00179 
00180 #define PCI_ENABLE_IO_SPACE                 0x0001
00181 #define PCI_ENABLE_MEMORY_SPACE             0x0002
00182 #define PCI_ENABLE_BUS_MASTER               0x0004
00183 #define PCI_ENABLE_SPECIAL_CYCLES           0x0008
00184 #define PCI_ENABLE_WRITE_AND_INVALIDATE     0x0010
00185 #define PCI_ENABLE_VGA_COMPATIBLE_PALETTE   0x0020
00186 #define PCI_ENABLE_PARITY                   0x0040  // (ro+)
00187 #define PCI_ENABLE_WAIT_CYCLE               0x0080  // (ro+)
00188 #define PCI_ENABLE_SERR                     0x0100  // (ro+)
00189 #define PCI_ENABLE_FAST_BACK_TO_BACK        0x0200  // (ro)
00190 
00191 
00192 
00193 
00194 
00195 #define PCI_STATUS_CAPABILITIES_LIST        0x0010  // (ro)
00196 #define PCI_STATUS_66MHZ_CAPABLE            0x0020  // (ro)
00197 #define PCI_STATUS_UDF_SUPPORTED            0x0040  // (ro)
00198 #define PCI_STATUS_FAST_BACK_TO_BACK        0x0080  // (ro)
00199 #define PCI_STATUS_DATA_PARITY_DETECTED     0x0100
00200 #define PCI_STATUS_DEVSEL                   0x0600  // 2 bits wide
00201 #define PCI_STATUS_SIGNALED_TARGET_ABORT    0x0800
00202 #define PCI_STATUS_RECEIVED_TARGET_ABORT    0x1000
00203 #define PCI_STATUS_RECEIVED_MASTER_ABORT    0x2000
00204 #define PCI_STATUS_SIGNALED_SYSTEM_ERROR    0x4000
00205 #define PCI_STATUS_DETECTED_PARITY_ERROR    0x8000
00206 
00207 
00208 
00209 
00210 
00211 
00212 #define PCI_WHICHSPACE_CONFIG               0x0
00213 #define PCI_WHICHSPACE_ROM                  0x52696350
00214 
00215 
00216 
00217 
00218 
00219 
00220 #define PCI_CAPABILITY_ID_POWER_MANAGEMENT  0x01
00221 #define PCI_CAPABILITY_ID_AGP               0x02
00222 #define PCI_CAPABILITY_ID_MSI               0x05
00223 
00224 
00225 
00226 
00227 
00228 
00229 
00230 
00231 
00232 
00233 
00234 typedef struct _PCI_CAPABILITIES_HEADER {
00235     UCHAR   
CapabilityID;
00236     UCHAR   
Next;
00237 } 
PCI_CAPABILITIES_HEADER, *
PPCI_CAPABILITIES_HEADER;
00238 
00239 
00240 
00241 
00242 
00243 typedef struct _PCI_PMC {
00244     UCHAR       
Version:3;
00245     UCHAR       
PMEClock:1;
00246     UCHAR       
Rsvd1:1;
00247     UCHAR       
DeviceSpecificInitialization:1;
00248     UCHAR       
Rsvd2:2;
00249     struct _PM_SUPPORT {
00250         UCHAR   
Rsvd2:1;
00251         UCHAR   
D1:1;
00252         UCHAR   
D2:1;
00253         UCHAR   
PMED0:1;
00254         UCHAR   
PMED1:1;
00255         UCHAR   
PMED2:1;
00256         UCHAR   
PMED3Hot:1;
00257         UCHAR   
PMED3Cold:1;
00258     } 
Support;
00259 } 
PCI_PMC, *
PPCI_PMC;
00260 
00261 typedef struct _PCI_PMCSR {
00262     USHORT      PowerState:2;
00263     USHORT      Rsvd1:6;
00264     USHORT      PMEEnable:1;
00265     USHORT      DataSelect:4;
00266     USHORT      DataScale:2;
00267     USHORT      PMEStatus:1;
00268 } 
PCI_PMCSR, *
PPCI_PMCSR;
00269 
00270 
00271 typedef struct _PCI_PMCSR_BSE {
00272     UCHAR       
Rsvd1:6;
00273     UCHAR       
D3HotSupportsStopClock:1;       
00274     UCHAR       
BusPowerClockControlEnabled:1;  
00275 } 
PCI_PMCSR_BSE, *
PPCI_PMCSR_BSE;
00276 
00277 
00278 typedef struct _PCI_PM_CAPABILITY {
00279 
00280     PCI_CAPABILITIES_HEADER Header;
00281 
00282     
00283     
00284     
00285 
00286     
union {
00287         PCI_PMC         Capabilities;
00288         
USHORT          AsUSHORT;
00289     } PMC;
00290 
00291     
00292     
00293     
00294 
00295     
union {
00296         PCI_PMCSR       ControlStatus;
00297         USHORT          AsUSHORT;
00298     } PMCSR;
00299 
00300     
00301     
00302     
00303 
00304     
union {
00305         PCI_PMCSR_BSE   BridgeSupport;
00306         UCHAR           
AsUCHAR;
00307     } PMCSR_BSE;
00308 
00309     
00310     
00311     
00312     
00313 
00314     UCHAR   
Data;
00315 
00316 } 
PCI_PM_CAPABILITY, *
PPCI_PM_CAPABILITY;
00317 
00318 
00319 
00320 
00321 
00322 typedef struct _PCI_AGP_CAPABILITY {
00323 
00324     PCI_CAPABILITIES_HEADER Header;
00325 
00326     USHORT  Minor:4;
00327     USHORT  Major:4;
00328     USHORT  Rsvd1:8;
00329 
00330     struct  _PCI_AGP_STATUS {
00331         ULONG   
Rate:3;
00332         ULONG   
Rsvd1:1;
00333         ULONG   
FastWrite:1;
00334         ULONG   
FourGB:1;
00335         ULONG   
Rsvd2:3;
00336         ULONG   
SideBandAddressing:1;                   
00337         ULONG   
Rsvd3:14;
00338         ULONG   
RequestQueueDepthMaximum:8;             
00339     } 
AGPStatus;
00340 
00341     struct  _PCI_AGP_COMMAND {
00342         ULONG   
Rate:3;
00343         ULONG   
Rsvd1:1;
00344         ULONG   
FastWriteEnable:1;
00345         ULONG   
FourGBEnable:1;
00346         ULONG   
Rsvd2:2;
00347         ULONG   
AGPEnable:1;
00348         ULONG   
SBAEnable:1;
00349         ULONG   
Rsvd3:14;
00350         ULONG   
RequestQueueDepth:8;
00351     } 
AGPCommand;
00352 
00353 } 
PCI_AGP_CAPABILITY, *
PPCI_AGP_CAPABILITY;
00354 
00355 #define PCI_AGP_RATE_1X     0x1
00356 #define PCI_AGP_RATE_2X     0x2
00357 #define PCI_AGP_RATE_4X     0x4
00358 
00359 
00360 
00361 
00362 
00363 typedef struct _PCI_MSI_CAPABILITY {
00364 
00365       PCI_CAPABILITIES_HEADER Header;
00366 
00367       struct _PCI_MSI_MESSAGE_CONTROL {
00368          USHORT  MSIEnable:1;
00369          USHORT  MultipleMessageCapable:3;
00370          USHORT  MultipleMessageEnable:3;
00371          USHORT  CapableOf64Bits:1;
00372          USHORT  Reserved:8;
00373       } 
MessageControl;
00374 
00375       
union {
00376             
struct _PCI_MSI_MESSAGE_ADDRESS {
00377                ULONG_PTR Reserved:2;              
00378                ULONG_PTR Address:30;
00379             } Register;
00380             ULONG_PTR 
Raw;
00381       } MessageAddress;
00382 
00383       
00384       
00385       
00386       
00387       
00388       
00389 
00390       
union {
00391 
00392          
00393 
00394          
struct _PCI_MSI_64BIT_DATA {
00395             ULONG MessageUpperAddress;
00396             
USHORT MessageData;
00397          } Bit64;
00398 
00399          
00400 
00401          
struct _PCI_MSI_32BIT_DATA {
00402             USHORT MessageData;
00403             ULONG Unused;
00404          } Bit32;
00405       } 
Data;
00406 
00407 } 
PCI_MSI_CAPABILITY, *
PPCI_PCI_CAPABILITY;
00408 
00409 
00410 
00411 
00412 
00413 
00414 #define PCI_CLASS_PRE_20                    0x00
00415 #define PCI_CLASS_MASS_STORAGE_CTLR         0x01
00416 #define PCI_CLASS_NETWORK_CTLR              0x02
00417 #define PCI_CLASS_DISPLAY_CTLR              0x03
00418 #define PCI_CLASS_MULTIMEDIA_DEV            0x04
00419 #define PCI_CLASS_MEMORY_CTLR               0x05
00420 #define PCI_CLASS_BRIDGE_DEV                0x06
00421 #define PCI_CLASS_SIMPLE_COMMS_CTLR         0x07
00422 #define PCI_CLASS_BASE_SYSTEM_DEV           0x08
00423 #define PCI_CLASS_INPUT_DEV                 0x09
00424 #define PCI_CLASS_DOCKING_STATION           0x0a
00425 #define PCI_CLASS_PROCESSOR                 0x0b
00426 #define PCI_CLASS_SERIAL_BUS_CTLR           0x0c
00427 
00428 
00429 
00430 #define PCI_CLASS_NOT_DEFINED               0xff
00431 
00432 
00433 
00434 
00435 
00436 
00437 
00438 #define PCI_SUBCLASS_PRE_20_NON_VGA         0x00
00439 #define PCI_SUBCLASS_PRE_20_VGA             0x01
00440 
00441 
00442 
00443 #define PCI_SUBCLASS_MSC_SCSI_BUS_CTLR      0x00
00444 #define PCI_SUBCLASS_MSC_IDE_CTLR           0x01
00445 #define PCI_SUBCLASS_MSC_FLOPPY_CTLR        0x02
00446 #define PCI_SUBCLASS_MSC_IPI_CTLR           0x03
00447 #define PCI_SUBCLASS_MSC_RAID_CTLR          0x04
00448 #define PCI_SUBCLASS_MSC_OTHER              0x80
00449 
00450 
00451 
00452 #define PCI_SUBCLASS_NET_ETHERNET_CTLR      0x00
00453 #define PCI_SUBCLASS_NET_TOKEN_RING_CTLR    0x01
00454 #define PCI_SUBCLASS_NET_FDDI_CTLR          0x02
00455 #define PCI_SUBCLASS_NET_ATM_CTLR           0x03
00456 #define PCI_SUBCLASS_NET_OTHER              0x80
00457 
00458 
00459 
00460 
00461 
00462 #define PCI_SUBCLASS_VID_VGA_CTLR           0x00
00463 #define PCI_SUBCLASS_VID_XGA_CTLR           0x01
00464 #define PCI_SUBCLASS_VID_OTHER              0x80
00465 
00466 
00467 
00468 #define PCI_SUBCLASS_MM_VIDEO_DEV           0x00
00469 #define PCI_SUBCLASS_MM_AUDIO_DEV           0x01
00470 #define PCI_SUBCLASS_MM_OTHER               0x80
00471 
00472 
00473 
00474 #define PCI_SUBCLASS_MEM_RAM                0x00
00475 #define PCI_SUBCLASS_MEM_FLASH              0x01
00476 #define PCI_SUBCLASS_MEM_OTHER              0x80
00477 
00478 
00479 
00480 #define PCI_SUBCLASS_BR_HOST                0x00
00481 #define PCI_SUBCLASS_BR_ISA                 0x01
00482 #define PCI_SUBCLASS_BR_EISA                0x02
00483 #define PCI_SUBCLASS_BR_MCA                 0x03
00484 #define PCI_SUBCLASS_BR_PCI_TO_PCI          0x04
00485 #define PCI_SUBCLASS_BR_PCMCIA              0x05
00486 #define PCI_SUBCLASS_BR_NUBUS               0x06
00487 #define PCI_SUBCLASS_BR_CARDBUS             0x07
00488 #define PCI_SUBCLASS_BR_OTHER               0x80
00489 
00490 
00491 
00492 
00493 
00494 #define PCI_SUBCLASS_COM_SERIAL             0x00
00495 #define PCI_SUBCLASS_COM_PARALLEL           0x01
00496 #define PCI_SUBCLASS_COM_OTHER              0x80
00497 
00498 
00499 
00500 
00501 
00502 #define PCI_SUBCLASS_SYS_INTERRUPT_CTLR     0x00
00503 #define PCI_SUBCLASS_SYS_DMA_CTLR           0x01
00504 #define PCI_SUBCLASS_SYS_SYSTEM_TIMER       0x02
00505 #define PCI_SUBCLASS_SYS_REAL_TIME_CLOCK    0x03
00506 #define PCI_SUBCLASS_SYS_OTHER              0x80
00507 
00508 
00509 
00510 #define PCI_SUBCLASS_INP_KEYBOARD           0x00
00511 #define PCI_SUBCLASS_INP_DIGITIZER          0x01
00512 #define PCI_SUBCLASS_INP_MOUSE              0x02
00513 #define PCI_SUBCLASS_INP_OTHER              0x80
00514 
00515 
00516 
00517 #define PCI_SUBCLASS_DOC_GENERIC            0x00
00518 #define PCI_SUBCLASS_DOC_OTHER              0x80
00519 
00520 
00521 
00522 #define PCI_SUBCLASS_PROC_386               0x00
00523 #define PCI_SUBCLASS_PROC_486               0x01
00524 #define PCI_SUBCLASS_PROC_PENTIUM           0x02
00525 #define PCI_SUBCLASS_PROC_ALPHA             0x10
00526 #define PCI_SUBCLASS_PROC_POWERPC           0x20
00527 #define PCI_SUBCLASS_PROC_COPROCESSOR       0x40
00528 
00529 
00530 
00531 #define PCI_SUBCLASS_SB_IEEE1394            0x00
00532 #define PCI_SUBCLASS_SB_ACCESS              0x01
00533 #define PCI_SUBCLASS_SB_SSA                 0x02
00534 #define PCI_SUBCLASS_SB_USB                 0x03
00535 #define PCI_SUBCLASS_SB_FIBRE_CHANNEL       0x04
00536 
00537 
00538 
00539 
00540 
00541 
00542 
00543 
00544 #define PCI_ADDRESS_IO_SPACE                0x00000001  // (ro)
00545 #define PCI_ADDRESS_MEMORY_TYPE_MASK        0x00000006  // (ro)
00546 #define PCI_ADDRESS_MEMORY_PREFETCHABLE     0x00000008  // (ro)
00547 
00548 #define PCI_ADDRESS_IO_ADDRESS_MASK         0xfffffffc
00549 #define PCI_ADDRESS_MEMORY_ADDRESS_MASK     0xfffffff0
00550 #define PCI_ADDRESS_ROM_ADDRESS_MASK        0xfffff800
00551 
00552 #define PCI_TYPE_32BIT      0
00553 #define PCI_TYPE_20BIT      2
00554 #define PCI_TYPE_64BIT      4
00555 
00556 
00557 
00558 
00559 
00560 #define PCI_ROMADDRESS_ENABLED              0x00000001
00561 
00562 
00563 
00564 
00565 
00566 
00567 
00568 
00569 
00570 
00571 
00572 
00573 
00574 
00575 
00576 
00577 
00578 
00579 
00580 
00581 
00582 
00583 
00584 
00585 
00586 
00587 
00588 
00589 
00590 
00591 typedef struct _PCI_REGISTRY_INFO {
00592     UCHAR       
MajorRevision;
00593     UCHAR       
MinorRevision;
00594     UCHAR       
NoBuses;
00595     UCHAR       
HardwareMechanism;
00596 } 
PCI_REGISTRY_INFO, *
PPCI_REGISTRY_INFO;
00597 
00598 
00599 
00600 
00601 
00602 
00603 
00604 #define PciBridgeIO2Base(a,b)   \
00605 
        ( ((a >> 4) << 12) + (((a & 0xf) == 1) ? (b << 16) : 0) )
00606 
00607 #define PciBridgeIO2Limit(a,b)  (PciBridgeIO2Base(a,b) | 0xfff)
00608 
00609 #define PciBridgeMemory2Base(a)  (ULONG) ((a & 0xfff0) << 16)
00610 #define PciBridgeMemory2Limit(a) (PciBridgeMemory2Base(a) | 0xfffff)
00611 
00612 
00613 
00614 
00615 
00616 #define PCI_ENABLE_BRIDGE_PARITY_ERROR        0x0001
00617 #define PCI_ENABLE_BRIDGE_SERR                0x0002
00618 #define PCI_ENABLE_BRIDGE_ISA                 0x0004
00619 #define PCI_ENABLE_BRIDGE_VGA                 0x0008
00620 #define PCI_ENABLE_BRIDGE_MASTER_ABORT_SERR   0x0020
00621 #define PCI_ASSERT_BRIDGE_RESET               0x0040
00622 
00623 
00624 
00625 
00626 
00627 #define PCI_ENABLE_BRIDGE_FAST_BACK_TO_BACK   0x0080
00628 
00629 
00630 
00631 
00632 
00633 #define PCI_ENABLE_CARDBUS_IRQ_ROUTING        0x0080
00634 #define PCI_ENABLE_CARDBUS_MEM0_PREFETCH      0x0100
00635 #define PCI_ENABLE_CARDBUS_MEM1_PREFETCH      0x0200
00636 #define PCI_ENABLE_CARDBUS_WRITE_POSTING      0x0400
00637 
00638 
00639 
00640 
00641 
00642 #define PCI_TYPE1_ADDR_PORT     ((PULONG) 0xCF8)
00643 #define PCI_TYPE1_DATA_PORT     0xCFC
00644 
00645 typedef struct _PCI_TYPE1_CFG_BITS {
00646     
union {
00647         
struct {
00648             ULONG   
Reserved1:2;
00649             ULONG   
RegisterNumber:6;
00650             ULONG   
FunctionNumber:3;
00651             ULONG   
DeviceNumber:5;
00652             ULONG   
BusNumber:8;
00653             ULONG   
Reserved2:7;
00654             ULONG   
Enable:1;
00655         } bits;
00656 
00657         ULONG   
AsULONG;
00658     } u;
00659 } 
PCI_TYPE1_CFG_BITS, *
PPCI_TYPE1_CFG_BITS;
00660 
00661 
00662 
00663 
00664 
00665 
00666 #define PCI_TYPE2_CSE_PORT              ((PUCHAR) 0xCF8)
00667 #define PCI_TYPE2_FORWARD_PORT          ((PUCHAR) 0xCFA)
00668 #define PCI_TYPE2_ADDRESS_BASE          0xC
00669 
00670 
00671 typedef struct _PCI_TYPE2_CSE_BITS {
00672     
union {
00673         
struct {
00674             UCHAR   
Enable:1;
00675             UCHAR   
FunctionNumber:3;
00676             UCHAR   
Key:4;
00677         } bits;
00678         UCHAR   
AsUCHAR;
00679     } u;
00680 } 
PCI_TYPE2_CSE_BITS, 
PPCI_TYPE2_CSE_BITS;
00681 
00682 
00683 typedef struct _PCI_TYPE2_ADDRESS_BITS {
00684     
union {
00685         
struct {
00686             USHORT  RegisterNumber:8;
00687             USHORT  Agent:4;
00688             USHORT  AddressBase:4;
00689         } bits;
00690         USHORT  AsUSHORT;
00691     } u;
00692 } 
PCI_TYPE2_ADDRESS_BITS, *
PPCI_TYPE2_ADDRESS_BITS;
00693 
00694 
00695 
00696 
00697 
00698 
00699 typedef struct _PCI_TYPE0_CFG_CYCLE_BITS {
00700     
union {
00701         
struct {
00702             ULONG   
Reserved1:2;
00703             ULONG   
RegisterNumber:6;
00704             ULONG   
FunctionNumber:3;
00705             ULONG   
Reserved2:21;
00706         } bits;
00707         ULONG   
AsULONG;
00708     } u;
00709 } 
PCI_TYPE0_CFG_CYCLE_BITS, *
PPCI_TYPE0_CFG_CYCLE_BITS;
00710 
00711 typedef struct _PCI_TYPE1_CFG_CYCLE_BITS {
00712     
union {
00713         
struct {
00714             ULONG   
Reserved1:2;
00715             ULONG   
RegisterNumber:6;
00716             ULONG   
FunctionNumber:3;
00717             ULONG   
DeviceNumber:5;
00718             ULONG   
BusNumber:8;
00719             ULONG   
Reserved2:8;
00720         } bits;
00721         ULONG   
AsULONG;
00722     } u;
00723 } 
PCI_TYPE1_CFG_CYCLE_BITS, *
PPCI_TYPE1_CFG_CYCLE_BITS;
00724 
00725 
00726 
00727 
00728 
00729 
00730 
00731 
00732 
00733 
typedef VOID
00734 (*PciPin2Line) (
00735     IN 
struct _BUS_HANDLER  *BusHandler,
00736     IN 
struct _BUS_HANDLER  *RootHandler,
00737     IN 
PCI_SLOT_NUMBER      SlotNumber,
00738     IN 
PPCI_COMMON_CONFIG   PciData
00739     );
00740 
00741 
typedef VOID
00742 (*PciLine2Pin) (
00743     IN 
struct _BUS_HANDLER  *BusHandler,
00744     IN 
struct _BUS_HANDLER  *RootHandler,
00745     IN 
PCI_SLOT_NUMBER      SlotNumber,
00746     IN 
PPCI_COMMON_CONFIG   PciNewData,
00747     IN 
PPCI_COMMON_CONFIG   PciOldData
00748     );
00749 
00750 
typedef VOID
00751 (*PciReadWriteConfig) (
00752     IN 
struct _BUS_HANDLER *BusHandler,
00753     IN 
PCI_SLOT_NUMBER Slot,
00754     IN PVOID 
Buffer,
00755     IN ULONG 
Offset,
00756     IN ULONG Length
00757     );
00758 
00759 #define PCI_DATA_TAG            ' ICP'
00760 #define PCI_DATA_VERSION        1
00761 
00762 typedef struct _PCIBUSDATA {
00763     ULONG                   
Tag;
00764     ULONG                   
Version;
00765     PciReadWriteConfig      ReadConfig;
00766     PciReadWriteConfig      WriteConfig;
00767     PciPin2Line             Pin2Line;
00768     PciLine2Pin             Line2Pin;
00769     PCI_SLOT_NUMBER         ParentSlot;
00770     PVOID                   
Reserved[4];
00771 } 
PCIBUSDATA, *
PPCIBUSDATA;
00772 
00773 typedef ULONG (*
PCI_READ_WRITE_CONFIG)(
00774     IN PVOID Context,
00775     IN UCHAR BusOffset,
00776     IN ULONG Slot,
00777     IN PVOID 
Buffer,
00778     IN ULONG 
Offset,
00779     IN ULONG Length
00780     );
00781 
00782 typedef VOID (*
PCI_PIN_TO_LINE)(
00783     IN PVOID Context,
00784     IN 
PPCI_COMMON_CONFIG PciData
00785     );
00786 
00787 typedef VOID (*
PCI_LINE_TO_PIN)(
00788     IN PVOID Context,
00789     IN 
PPCI_COMMON_CONFIG PciNewData,
00790     IN 
PPCI_COMMON_CONFIG PciOldData
00791     );
00792 
00793 typedef struct _PCI_BUS_INTERFACE_STANDARD {
00794     
00795     
00796     
00797     USHORT Size;
00798     USHORT Version;
00799     PVOID Context;
00800     PINTERFACE_REFERENCE 
InterfaceReference;
00801     PINTERFACE_DEREFERENCE 
InterfaceDereference;
00802     
00803     
00804     
00805     PCI_READ_WRITE_CONFIG ReadConfig;
00806     PCI_READ_WRITE_CONFIG WriteConfig;
00807     PCI_PIN_TO_LINE PinToLine;
00808     PCI_LINE_TO_PIN LineToPin;
00809 } 
PCI_BUS_INTERFACE_STANDARD, *
PPCI_BUS_INTERFACE_STANDARD;
00810 
00811 #define PCI_BUS_INTERFACE_STANDARD_VERSION 1
00812 
00813 #define PCI_DEVICE_PRESENT_INTERFACE_VERSION 1
00814 
00815 
typedef
00816 BOOLEAN
00817 (*PPCI_IS_DEVICE_PRESENT) (
00818     IN 
USHORT VendorID,
00819     IN 
USHORT DeviceID,
00820     IN UCHAR RevisionID,
00821     IN 
USHORT SubVendorID,
00822     IN 
USHORT SubSystemID,
00823     IN ULONG Flags
00824 );
00825 
00826 #define PCI_USE_SUBSYSTEM_IDS   0x00000001
00827 #define PCI_USE_REVISION        0x00000002
00828 
00829 
00830 typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
00831     
00832     
00833     
00834     USHORT Size;
00835     USHORT Version;
00836     PVOID Context;
00837     PINTERFACE_REFERENCE 
InterfaceReference;
00838     PINTERFACE_DEREFERENCE 
InterfaceDereference;
00839     
00840     
00841     
00842     PPCI_IS_DEVICE_PRESENT IsDevicePresent;
00843 } 
PCI_DEVICE_PRESENT_INTERFACE, *
PPCI_DEVICE_PRESENT_INTERFACE;
00844 
00845 
00846 
00847 
#endif