3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/hal/x86/bus.c
6 * PURPOSE: Bus functions
7 * PROGRAMMER: David Welch (welch@mcmail.com)
13 * - Add bus handler functions for all busses
16 /* INCLUDES *****************************************************************/
22 /* GLOBALS *******************************************************************/
24 #define TAG_BUS TAG('B', 'U', 'S', 'H')
26 KSPIN_LOCK HalpBusHandlerSpinLock
= {0,};
27 LIST_ENTRY HalpBusHandlerList
;
30 /* FUNCTIONS *****************************************************************/
32 static NTSTATUS STDCALL
33 HalpNoAdjustResourceList(PBUS_HANDLER BusHandler
,
35 PCM_RESOURCE_LIST Resources
)
37 return STATUS_UNSUCCESSFUL
;
41 static NTSTATUS STDCALL
42 HalpNoAssignSlotResources(PBUS_HANDLER BusHandler
,
44 PUNICODE_STRING RegistryPath
,
45 PUNICODE_STRING DriverClassName
,
46 PDRIVER_OBJECT DriverObject
,
47 PDEVICE_OBJECT DeviceObject
,
49 PCM_RESOURCE_LIST
*AllocatedResources
)
51 return STATUS_NOT_SUPPORTED
;
56 HalpNoBusData(PBUS_HANDLER BusHandler
,
68 HalpNoGetInterruptVector(PBUS_HANDLER BusHandler
,
70 ULONG BusInterruptLevel
,
71 ULONG BusInterruptVector
,
80 HalpNoTranslateBusAddress(PBUS_HANDLER BusHandler
,
82 PHYSICAL_ADDRESS BusAddress
,
84 PPHYSICAL_ADDRESS TranslatedAddress
)
91 HalpAllocateBusHandler(INTERFACE_TYPE InterfaceType
,
92 BUS_DATA_TYPE BusDataType
,
95 PBUS_HANDLER BusHandler
= NULL
;
97 DPRINT("HalpAllocateBusHandler()\n");
99 BusHandler
= ExAllocatePoolWithTag(NonPagedPool
,
102 if (BusHandler
== NULL
)
105 RtlZeroMemory(BusHandler
,
106 sizeof(BUS_HANDLER
));
108 InsertTailList(&HalpBusHandlerList
,
111 BusHandler
->InterfaceType
= InterfaceType
;
112 BusHandler
->BusDataType
= BusDataType
;
113 BusHandler
->BusNumber
= BusNumber
;
115 /* initialize default bus handler functions */
116 BusHandler
->GetBusData
= HalpNoBusData
;
117 BusHandler
->SetBusData
= HalpNoBusData
;
118 BusHandler
->AdjustResourceList
= HalpNoAdjustResourceList
;
119 BusHandler
->AssignSlotResources
= HalpNoAssignSlotResources
;
120 BusHandler
->GetInterruptVector
= HalpNoGetInterruptVector
;
121 BusHandler
->TranslateBusAddress
= HalpNoTranslateBusAddress
;
125 DPRINT("HalpAllocateBusHandler() done\n");
132 HalpInitBusHandlers(VOID
)
134 PBUS_HANDLER BusHandler
;
136 /* General preparations */
137 KeInitializeSpinLock(&HalpBusHandlerSpinLock
);
138 InitializeListHead(&HalpBusHandlerList
);
140 /* Initialize hal dispatch tables */
141 HalQuerySystemInformation
= HalpQuerySystemInformation
;
144 HalSetSystemInformation
= HalpSetSystemInformation
;
146 HalQueryBusSlots
= HalpQueryBusSlots
;
149 /* Add system bus handler */
150 BusHandler
= HalpAllocateBusHandler(Internal
,
151 ConfigurationSpaceUndefined
,
153 if (BusHandler
== NULL
)
155 BusHandler
->GetInterruptVector
=
156 (pGetInterruptVector
)HalpGetSystemInterruptVector
;
157 BusHandler
->TranslateBusAddress
=
158 (pTranslateBusAddress
)HalpTranslateSystemBusAddress
;
160 /* Add cmos bus handler */
161 BusHandler
= HalpAllocateBusHandler(InterfaceTypeUndefined
,
164 if (BusHandler
== NULL
)
166 BusHandler
->GetBusData
= (pGetSetBusData
)HalpGetCmosData
;
167 BusHandler
->SetBusData
= (pGetSetBusData
)HalpSetCmosData
;
169 /* Add isa bus handler */
170 BusHandler
= HalpAllocateBusHandler(Isa
,
171 ConfigurationSpaceUndefined
,
173 if (BusHandler
== NULL
)
176 BusHandler
->GetInterruptVector
=
177 (pGetInterruptVector
)HalpGetIsaInterruptVector
;
178 BusHandler
->TranslateBusAddress
=
179 (pTranslateBusAddress
)HalpTranslateIsaBusAddress
;
181 /* Add MicroChannel bus handler */
182 BusHandler
= HalpAllocateBusHandler(MicroChannel
,
185 if (BusHandler
== NULL
)
188 BusHandler
->GetBusData
= (pGetSetBusData
)HalpGetMicroChannelData
;
192 PBUS_HANDLER FASTCALL
193 HaliHandlerForBus(INTERFACE_TYPE InterfaceType
,
196 PBUS_HANDLER BusHandler
;
197 PLIST_ENTRY CurrentEntry
;
200 KeAcquireSpinLock(&HalpBusHandlerSpinLock
,
203 CurrentEntry
= HalpBusHandlerList
.Flink
;
204 while (CurrentEntry
!= &HalpBusHandlerList
)
206 BusHandler
= (PBUS_HANDLER
)CurrentEntry
;
207 if (BusHandler
->InterfaceType
== InterfaceType
&&
208 BusHandler
->BusNumber
== BusNumber
)
210 KeReleaseSpinLock(&HalpBusHandlerSpinLock
,
214 CurrentEntry
= CurrentEntry
->Flink
;
216 KeReleaseSpinLock(&HalpBusHandlerSpinLock
,
223 PBUS_HANDLER FASTCALL
224 HaliHandlerForConfigSpace(BUS_DATA_TYPE BusDataType
,
227 PBUS_HANDLER BusHandler
;
228 PLIST_ENTRY CurrentEntry
;
231 KeAcquireSpinLock(&HalpBusHandlerSpinLock
,
234 CurrentEntry
= HalpBusHandlerList
.Flink
;
235 while (CurrentEntry
!= &HalpBusHandlerList
)
237 BusHandler
= (PBUS_HANDLER
)CurrentEntry
;
238 if (BusHandler
->BusDataType
== BusDataType
&&
239 BusHandler
->BusNumber
== BusNumber
)
241 KeReleaseSpinLock(&HalpBusHandlerSpinLock
,
245 CurrentEntry
= CurrentEntry
->Flink
;
247 KeReleaseSpinLock(&HalpBusHandlerSpinLock
,
254 PBUS_HANDLER FASTCALL
255 HaliReferenceHandlerForBus(INTERFACE_TYPE InterfaceType
,
258 PBUS_HANDLER BusHandler
;
259 PLIST_ENTRY CurrentEntry
;
262 KeAcquireSpinLock(&HalpBusHandlerSpinLock
,
265 CurrentEntry
= HalpBusHandlerList
.Flink
;
266 while (CurrentEntry
!= &HalpBusHandlerList
)
268 BusHandler
= (PBUS_HANDLER
)CurrentEntry
;
269 if (BusHandler
->InterfaceType
== InterfaceType
&&
270 BusHandler
->BusNumber
== BusNumber
)
272 BusHandler
->RefCount
++;
273 KeReleaseSpinLock(&HalpBusHandlerSpinLock
,
277 CurrentEntry
= CurrentEntry
->Flink
;
279 KeReleaseSpinLock(&HalpBusHandlerSpinLock
,
286 PBUS_HANDLER FASTCALL
287 HaliReferenceHandlerForConfigSpace(BUS_DATA_TYPE BusDataType
,
290 PBUS_HANDLER BusHandler
;
291 PLIST_ENTRY CurrentEntry
;
294 KeAcquireSpinLock(&HalpBusHandlerSpinLock
,
297 CurrentEntry
= HalpBusHandlerList
.Flink
;
298 while (CurrentEntry
!= &HalpBusHandlerList
)
300 BusHandler
= (PBUS_HANDLER
)CurrentEntry
;
301 if (BusHandler
->BusDataType
== BusDataType
&&
302 BusHandler
->BusNumber
== BusNumber
)
304 BusHandler
->RefCount
++;
305 KeReleaseSpinLock(&HalpBusHandlerSpinLock
,
309 CurrentEntry
= CurrentEntry
->Flink
;
311 KeReleaseSpinLock(&HalpBusHandlerSpinLock
,
319 HaliDereferenceBusHandler(PBUS_HANDLER BusHandler
)
323 KeAcquireSpinLock(&HalpBusHandlerSpinLock
,
325 BusHandler
->RefCount
--;
326 KeReleaseSpinLock(&HalpBusHandlerSpinLock
,
332 HalAdjustResourceList(PCM_RESOURCE_LIST Resources
)
334 PBUS_HANDLER BusHandler
;
337 BusHandler
= HaliReferenceHandlerForBus(Resources
->List
[0].InterfaceType
,
338 Resources
->List
[0].BusNumber
);
339 if (BusHandler
== NULL
)
340 return STATUS_SUCCESS
;
342 Status
= BusHandler
->AdjustResourceList(BusHandler
,
343 Resources
->List
[0].BusNumber
,
345 HaliDereferenceBusHandler (BusHandler
);
352 HalAssignSlotResources(PUNICODE_STRING RegistryPath
,
353 PUNICODE_STRING DriverClassName
,
354 PDRIVER_OBJECT DriverObject
,
355 PDEVICE_OBJECT DeviceObject
,
356 INTERFACE_TYPE BusType
,
359 PCM_RESOURCE_LIST
*AllocatedResources
)
361 PBUS_HANDLER BusHandler
;
364 BusHandler
= HaliReferenceHandlerForBus(BusType
,
366 if (BusHandler
== NULL
)
367 return STATUS_NOT_FOUND
;
369 Status
= BusHandler
->AssignSlotResources(BusHandler
,
378 HaliDereferenceBusHandler(BusHandler
);
385 HalGetBusData(BUS_DATA_TYPE BusDataType
,
391 return (HalGetBusDataByOffset(BusDataType
,
401 HalGetBusDataByOffset(BUS_DATA_TYPE BusDataType
,
408 PBUS_HANDLER BusHandler
;
411 BusHandler
= HaliReferenceHandlerForConfigSpace(BusDataType
,
413 if (BusHandler
== NULL
)
416 Result
= BusHandler
->GetBusData(BusHandler
,
423 HaliDereferenceBusHandler (BusHandler
);
430 HalGetInterruptVector(INTERFACE_TYPE InterfaceType
,
432 ULONG BusInterruptLevel
,
433 ULONG BusInterruptVector
,
437 PBUS_HANDLER BusHandler
;
440 BusHandler
= HaliReferenceHandlerForBus(InterfaceType
,
442 if (BusHandler
== NULL
)
445 Result
= BusHandler
->GetInterruptVector(BusHandler
,
452 HaliDereferenceBusHandler(BusHandler
);
459 HalSetBusData(BUS_DATA_TYPE BusDataType
,
465 return (HalSetBusDataByOffset(BusDataType
,
475 HalSetBusDataByOffset(BUS_DATA_TYPE BusDataType
,
482 PBUS_HANDLER BusHandler
;
485 BusHandler
= HaliReferenceHandlerForConfigSpace(BusDataType
,
487 if (BusHandler
== NULL
)
490 Result
= BusHandler
->SetBusData(BusHandler
,
497 HaliDereferenceBusHandler(BusHandler
);
504 HalTranslateBusAddress(INTERFACE_TYPE InterfaceType
,
506 PHYSICAL_ADDRESS BusAddress
,
508 PPHYSICAL_ADDRESS TranslatedAddress
)
510 PBUS_HANDLER BusHandler
;
513 BusHandler
= HaliReferenceHandlerForBus(InterfaceType
,
515 if (BusHandler
== NULL
)
518 Result
= (BOOLEAN
)BusHandler
->TranslateBusAddress(BusHandler
,
524 HaliDereferenceBusHandler(BusHandler
);