1 /* $Id: bus.c,v 1.6 2003/02/26 14:14:03 ekohl Exp $
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 *****************************************************************/
18 #include <ddk/ntddk.h>
23 #include <internal/debug.h>
25 /* GLOBALS *******************************************************************/
27 #define TAG_BUS TAG('B', 'U', 'S', 'H')
29 KSPIN_LOCK HalpBusHandlerSpinLock
= {0,};
30 LIST_ENTRY HalpBusHandlerList
;
33 /* FUNCTIONS *****************************************************************/
35 static NTSTATUS STDCALL
36 HalpNoAdjustResourceList(PBUS_HANDLER BusHandler
,
38 PCM_RESOURCE_LIST Resources
)
40 return STATUS_UNSUCCESSFUL
;
44 static NTSTATUS STDCALL
45 HalpNoAssignSlotResources(PBUS_HANDLER BusHandler
,
47 PUNICODE_STRING RegistryPath
,
48 PUNICODE_STRING DriverClassName
,
49 PDRIVER_OBJECT DriverObject
,
50 PDEVICE_OBJECT DeviceObject
,
52 PCM_RESOURCE_LIST
*AllocatedResources
)
54 return STATUS_NOT_SUPPORTED
;
59 HalpNoBusData(PBUS_HANDLER BusHandler
,
71 HalpNoGetInterruptVector(PBUS_HANDLER BusHandler
,
73 ULONG BusInterruptLevel
,
74 ULONG BusInterruptVector
,
83 HalpNoTranslateBusAddress(PBUS_HANDLER BusHandler
,
85 PHYSICAL_ADDRESS BusAddress
,
87 PPHYSICAL_ADDRESS TranslatedAddress
)
94 HalpAllocateBusHandler(INTERFACE_TYPE InterfaceType
,
95 BUS_DATA_TYPE BusDataType
,
98 PBUS_HANDLER BusHandler
= NULL
;
100 DPRINT("HalpAllocateBusHandler()\n");
102 BusHandler
= ExAllocatePoolWithTag(NonPagedPool
,
105 if (BusHandler
== NULL
)
108 RtlZeroMemory(BusHandler
,
109 sizeof(BUS_HANDLER
));
111 InsertTailList(&HalpBusHandlerList
,
114 BusHandler
->InterfaceType
= InterfaceType
;
115 BusHandler
->BusDataType
= BusDataType
;
116 BusHandler
->BusNumber
= BusNumber
;
118 /* initialize default bus handler functions */
119 BusHandler
->GetBusData
= HalpNoBusData
;
120 BusHandler
->SetBusData
= HalpNoBusData
;
121 BusHandler
->AdjustResourceList
= HalpNoAdjustResourceList
;
122 BusHandler
->AssignSlotResources
= HalpNoAssignSlotResources
;
123 BusHandler
->GetInterruptVector
= HalpNoGetInterruptVector
;
124 BusHandler
->TranslateBusAddress
= HalpNoTranslateBusAddress
;
128 DPRINT("HalpAllocateBusHandler() done\n");
135 HalpInitBusHandlers(VOID
)
137 PBUS_HANDLER BusHandler
;
139 /* General preparations */
140 KeInitializeSpinLock(&HalpBusHandlerSpinLock
);
141 InitializeListHead(&HalpBusHandlerList
);
143 /* Initialize hal dispatch tables */
144 HalQuerySystemInformation
= HalpQuerySystemInformation
;
147 HalSetSystemInformation
= HalpSetSystemInformation
;
149 HalQueryBusSlots
= HalpQueryBusSlots
;
152 /* Add system bus handler */
153 BusHandler
= HalpAllocateBusHandler(Internal
,
154 ConfigurationSpaceUndefined
,
156 if (BusHandler
== NULL
)
158 BusHandler
->GetInterruptVector
=
159 (pGetInterruptVector
)HalpGetSystemInterruptVector
;
160 BusHandler
->TranslateBusAddress
=
161 (pTranslateBusAddress
)HalpTranslateSystemBusAddress
;
163 /* Add cmos bus handler */
164 BusHandler
= HalpAllocateBusHandler(InterfaceTypeUndefined
,
167 if (BusHandler
== NULL
)
169 BusHandler
->GetBusData
= (pGetSetBusData
)HalpGetCmosData
;
170 BusHandler
->SetBusData
= (pGetSetBusData
)HalpSetCmosData
;
172 /* Add isa bus handler */
173 BusHandler
= HalpAllocateBusHandler(Isa
,
174 ConfigurationSpaceUndefined
,
176 if (BusHandler
== NULL
)
179 BusHandler
->GetInterruptVector
=
180 (pGetInterruptVector
)HalpGetIsaInterruptVector
;
181 BusHandler
->TranslateBusAddress
=
182 (pTranslateBusAddress
)HalpTranslateIsaBusAddress
;
184 /* Add MicroChannel bus handler */
185 BusHandler
= HalpAllocateBusHandler(MicroChannel
,
188 if (BusHandler
== NULL
)
191 BusHandler
->GetBusData
= (pGetSetBusData
)HalpGetMicroChannelData
;
195 PBUS_HANDLER FASTCALL
196 HaliHandlerForBus(INTERFACE_TYPE InterfaceType
,
199 PBUS_HANDLER BusHandler
;
200 PLIST_ENTRY CurrentEntry
;
203 KeAcquireSpinLock(&HalpBusHandlerSpinLock
,
206 CurrentEntry
= HalpBusHandlerList
.Flink
;
207 while (CurrentEntry
!= &HalpBusHandlerList
)
209 BusHandler
= (PBUS_HANDLER
)CurrentEntry
;
210 if (BusHandler
->InterfaceType
== InterfaceType
&&
211 BusHandler
->BusNumber
== BusNumber
)
213 KeReleaseSpinLock(&HalpBusHandlerSpinLock
,
217 CurrentEntry
= CurrentEntry
->Flink
;
219 KeReleaseSpinLock(&HalpBusHandlerSpinLock
,
226 PBUS_HANDLER FASTCALL
227 HaliHandlerForConfigSpace(BUS_DATA_TYPE BusDataType
,
230 PBUS_HANDLER BusHandler
;
231 PLIST_ENTRY CurrentEntry
;
234 KeAcquireSpinLock(&HalpBusHandlerSpinLock
,
237 CurrentEntry
= HalpBusHandlerList
.Flink
;
238 while (CurrentEntry
!= &HalpBusHandlerList
)
240 BusHandler
= (PBUS_HANDLER
)CurrentEntry
;
241 if (BusHandler
->BusDataType
== BusDataType
&&
242 BusHandler
->BusNumber
== BusNumber
)
244 KeReleaseSpinLock(&HalpBusHandlerSpinLock
,
248 CurrentEntry
= CurrentEntry
->Flink
;
250 KeReleaseSpinLock(&HalpBusHandlerSpinLock
,
257 PBUS_HANDLER FASTCALL
258 HaliReferenceHandlerForBus(INTERFACE_TYPE InterfaceType
,
261 PBUS_HANDLER BusHandler
;
262 PLIST_ENTRY CurrentEntry
;
265 KeAcquireSpinLock(&HalpBusHandlerSpinLock
,
268 CurrentEntry
= HalpBusHandlerList
.Flink
;
269 while (CurrentEntry
!= &HalpBusHandlerList
)
271 BusHandler
= (PBUS_HANDLER
)CurrentEntry
;
272 if (BusHandler
->InterfaceType
== InterfaceType
&&
273 BusHandler
->BusNumber
== BusNumber
)
275 BusHandler
->RefCount
++;
276 KeReleaseSpinLock(&HalpBusHandlerSpinLock
,
280 CurrentEntry
= CurrentEntry
->Flink
;
282 KeReleaseSpinLock(&HalpBusHandlerSpinLock
,
289 PBUS_HANDLER FASTCALL
290 HaliReferenceHandlerForConfigSpace(BUS_DATA_TYPE BusDataType
,
293 PBUS_HANDLER BusHandler
;
294 PLIST_ENTRY CurrentEntry
;
297 KeAcquireSpinLock(&HalpBusHandlerSpinLock
,
300 CurrentEntry
= HalpBusHandlerList
.Flink
;
301 while (CurrentEntry
!= &HalpBusHandlerList
)
303 BusHandler
= (PBUS_HANDLER
)CurrentEntry
;
304 if (BusHandler
->BusDataType
== BusDataType
&&
305 BusHandler
->BusNumber
== BusNumber
)
307 BusHandler
->RefCount
++;
308 KeReleaseSpinLock(&HalpBusHandlerSpinLock
,
312 CurrentEntry
= CurrentEntry
->Flink
;
314 KeReleaseSpinLock(&HalpBusHandlerSpinLock
,
322 HaliDereferenceBusHandler(PBUS_HANDLER BusHandler
)
326 KeAcquireSpinLock(&HalpBusHandlerSpinLock
,
328 BusHandler
->RefCount
--;
329 KeReleaseSpinLock(&HalpBusHandlerSpinLock
,
335 HalAdjustResourceList(PCM_RESOURCE_LIST Resources
)
337 PBUS_HANDLER BusHandler
;
340 BusHandler
= HaliReferenceHandlerForBus(Resources
->List
[0].InterfaceType
,
341 Resources
->List
[0].BusNumber
);
342 if (BusHandler
== NULL
)
343 return STATUS_SUCCESS
;
345 Status
= BusHandler
->AdjustResourceList(BusHandler
,
346 Resources
->List
[0].BusNumber
,
348 HaliDereferenceBusHandler (BusHandler
);
355 HalAssignSlotResources(PUNICODE_STRING RegistryPath
,
356 PUNICODE_STRING DriverClassName
,
357 PDRIVER_OBJECT DriverObject
,
358 PDEVICE_OBJECT DeviceObject
,
359 INTERFACE_TYPE BusType
,
362 PCM_RESOURCE_LIST
*AllocatedResources
)
364 PBUS_HANDLER BusHandler
;
367 BusHandler
= HaliReferenceHandlerForBus(BusType
,
369 if (BusHandler
== NULL
)
370 return STATUS_NOT_FOUND
;
372 Status
= BusHandler
->AssignSlotResources(BusHandler
,
381 HaliDereferenceBusHandler(BusHandler
);
388 HalGetBusData(BUS_DATA_TYPE BusDataType
,
394 return (HalGetBusDataByOffset(BusDataType
,
404 HalGetBusDataByOffset(BUS_DATA_TYPE BusDataType
,
411 PBUS_HANDLER BusHandler
;
414 BusHandler
= HaliReferenceHandlerForConfigSpace(BusDataType
,
416 if (BusHandler
== NULL
)
419 Result
= BusHandler
->GetBusData(BusHandler
,
426 HaliDereferenceBusHandler (BusHandler
);
433 HalGetInterruptVector(INTERFACE_TYPE InterfaceType
,
435 ULONG BusInterruptLevel
,
436 ULONG BusInterruptVector
,
440 PBUS_HANDLER BusHandler
;
443 BusHandler
= HaliReferenceHandlerForBus(InterfaceType
,
445 if (BusHandler
== NULL
)
448 Result
= BusHandler
->GetInterruptVector(BusHandler
,
455 HaliDereferenceBusHandler(BusHandler
);
462 HalSetBusData(BUS_DATA_TYPE BusDataType
,
468 return (HalSetBusDataByOffset(BusDataType
,
478 HalSetBusDataByOffset(BUS_DATA_TYPE BusDataType
,
485 PBUS_HANDLER BusHandler
;
488 BusHandler
= HaliReferenceHandlerForConfigSpace(BusDataType
,
490 if (BusHandler
== NULL
)
493 Result
= BusHandler
->SetBusData(BusHandler
,
500 HaliDereferenceBusHandler(BusHandler
);
507 HalTranslateBusAddress(INTERFACE_TYPE InterfaceType
,
509 PHYSICAL_ADDRESS BusAddress
,
511 PPHYSICAL_ADDRESS TranslatedAddress
)
513 PBUS_HANDLER BusHandler
;
516 BusHandler
= HaliReferenceHandlerForBus(InterfaceType
,
518 if (BusHandler
== NULL
)
521 Result
= BusHandler
->TranslateBusAddress(BusHandler
,
527 HaliDereferenceBusHandler(BusHandler
);