6 #define PASTE2(x,y) x ## y
7 #define POINTER_TO_(x) PASTE2(P,x)
8 #define READ_FROM(x) PASTE2(READ_PORT_, x)
9 #define WRITE_TO(x) PASTE2(WRITE_PORT_, x)
12 // Declares a PCI Register Read/Write Routine
14 #define TYPE_DEFINE(x, y) \
18 IN PPCIPBUSDATA BusData, \
23 #define TYPE1_DEFINE(x) TYPE_DEFINE(x, PPCI_TYPE1_CFG_BITS);
24 #define TYPE2_DEFINE(x) TYPE_DEFINE(x, PPCI_TYPE2_ADDRESS_BITS);
27 // Defines a PCI Register Read/Write Type 1 Routine Prologue and Epilogue
29 #define TYPE1_START(x, y) \
30 TYPE_DEFINE(x, PPCI_TYPE1_CFG_BITS) \
32 ULONG i = Offset % sizeof(ULONG); \
33 PciCfg->u.bits.RegisterNumber = Offset / sizeof(ULONG); \
34 WRITE_PORT_ULONG(BusData->Config.Type1.Address, PciCfg->u.AsULONG);
35 #define TYPE1_END(y) \
37 #define TYPE2_END TYPE1_END
40 // PCI Register Read Type 1 Routine
42 #define TYPE1_READ(x, y) \
44 *((POINTER_TO_(y))Buffer) = \
45 READ_FROM(y)((POINTER_TO_(y))(BusData->Config.Type1.Data + i)); \
49 // PCI Register Write Type 1 Routine
51 #define TYPE1_WRITE(x, y) \
53 WRITE_TO(y)((POINTER_TO_(y))(BusData->Config.Type1.Data + i), \
54 *((POINTER_TO_(y))Buffer)); \
58 // Defines a PCI Register Read/Write Type 2 Routine Prologue and Epilogue
60 #define TYPE2_START(x, y) \
61 TYPE_DEFINE(x, PPCI_TYPE2_ADDRESS_BITS) \
63 PciCfg->u.bits.RegisterNumber = (USHORT)Offset;
66 // PCI Register Read Type 2 Routine
68 #define TYPE2_READ(x, y) \
70 *((POINTER_TO_(y))Buffer) = \
71 READ_FROM(y)((POINTER_TO_(y))(ULONG)PciCfg->u.AsUSHORT); \
75 // PCI Register Write Type 2 Routine
77 #define TYPE2_WRITE(x, y) \
79 WRITE_TO(y)((POINTER_TO_(y))(ULONG)PciCfg->u.AsUSHORT, \
80 *((POINTER_TO_(y))Buffer)); \
83 typedef struct _PCIPBUSDATA
85 PCIBUSDATA CommonData
;
101 } PCIPBUSDATA
, *PPCIPBUSDATA
;
104 (NTAPI
*FncConfigIO
)(
105 IN PPCIPBUSDATA BusData
,
113 IN PBUS_HANDLER BusHandler
,
114 IN PCI_SLOT_NUMBER Slot
,
120 (NTAPI
*FncReleaseSync
)(
121 IN PBUS_HANDLER BusHandler
,
125 typedef struct _PCI_CONFIG_HANDLER
128 FncReleaseSync ReleaseSynchronzation
;
129 FncConfigIO ConfigRead
[3];
130 FncConfigIO ConfigWrite
[3];
131 } PCI_CONFIG_HANDLER
, *PPCI_CONFIG_HANDLER
;
133 typedef struct _PCI_REGISTRY_INFO_INTERNAL
138 UCHAR HardwareMechanism
;
140 PCI_CARD_DESCRIPTOR CardList
[ANYSIZE_ARRAY
];
141 } PCI_REGISTRY_INFO_INTERNAL
, *PPCI_REGISTRY_INFO_INTERNAL
;
143 /* FUNCTIONS *****************************************************************/
147 HalpPCISynchronizeType1(
148 IN PBUS_HANDLER BusHandler
,
149 IN PCI_SLOT_NUMBER Slot
,
151 IN PPCI_TYPE1_CFG_BITS PciCfg
156 HalpPCIReleaseSynchronzationType1(
157 IN PBUS_HANDLER BusHandler
,
163 HalpPCISynchronizeType2(
164 IN PBUS_HANDLER BusHandler
,
165 IN PCI_SLOT_NUMBER Slot
,
167 IN PPCI_TYPE2_ADDRESS_BITS PciCfg
172 HalpPCIReleaseSynchronzationType2(
173 IN PBUS_HANDLER BusHandler
,
177 TYPE1_DEFINE(HalpPCIReadUcharType1
);
178 TYPE1_DEFINE(HalpPCIReadUshortType1
);
179 TYPE1_DEFINE(HalpPCIReadUlongType1
);
180 TYPE2_DEFINE(HalpPCIReadUcharType2
);
181 TYPE2_DEFINE(HalpPCIReadUshortType2
);
182 TYPE2_DEFINE(HalpPCIReadUlongType2
);
183 TYPE1_DEFINE(HalpPCIWriteUcharType1
);
184 TYPE1_DEFINE(HalpPCIWriteUshortType1
);
185 TYPE1_DEFINE(HalpPCIWriteUlongType1
);
186 TYPE2_DEFINE(HalpPCIWriteUcharType2
);
187 TYPE2_DEFINE(HalpPCIWriteUshortType2
);
188 TYPE2_DEFINE(HalpPCIWriteUlongType2
);
193 IN PBUS_HANDLER BusHandler
,
194 IN PCI_SLOT_NUMBER Slot
200 IN PBUS_HANDLER BusHandler
,
201 IN PCI_SLOT_NUMBER Slot
,
210 IN PBUS_HANDLER BusHandler
,
211 IN PCI_SLOT_NUMBER Slot
,
219 HalpGetSystemInterruptVector(
221 ULONG BusInterruptLevel
,
222 ULONG BusInterruptVector
,
248 IN PBUS_HANDLER BusHandler
,
249 IN PBUS_HANDLER RootBusHandler
,
250 IN PCI_SLOT_NUMBER SlotNumber
,
259 IN PBUS_HANDLER BusHandler
,
260 IN PBUS_HANDLER RootBusHandler
,
261 IN PCI_SLOT_NUMBER SlotNumber
,
269 HalpAssignPCISlotResources(
270 IN PBUS_HANDLER BusHandler
,
271 IN PBUS_HANDLER RootHandler
,
272 IN PUNICODE_STRING RegistryPath
,
273 IN PUNICODE_STRING DriverClassName OPTIONAL
,
274 IN PDRIVER_OBJECT DriverObject
,
275 IN PDEVICE_OBJECT DeviceObject OPTIONAL
,
277 IN OUT PCM_RESOURCE_LIST
*pAllocatedResources
282 HalpInitializePciBus(
286 extern ULONG HalpBusType
;
287 extern BOOLEAN HalpPCIConfigInitialized
;
288 extern BUS_HANDLER HalpFakePciBusHandler
;
289 extern ULONG HalpMinPciBus
, HalpMaxPciBus
;