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>
19 #include <internal/pool.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;
43 static NTSTATUS STDCALL
44 HalpNoAssignSlotResources(PBUS_HANDLER BusHandler,
46 PUNICODE_STRING RegistryPath,
47 PUNICODE_STRING DriverClassName,
48 PDRIVER_OBJECT DriverObject,
49 PDEVICE_OBJECT DeviceObject,
51 PCM_RESOURCE_LIST *AllocatedResources)
53 return STATUS_NOT_SUPPORTED;
57 HalpNoBusData(PBUS_HANDLER BusHandler,
68 HalpNoGetInterruptVector(PBUS_HANDLER BusHandler,
70 ULONG BusInterruptLevel,
71 ULONG BusInterruptVector,
79 HalpNoTranslateBusAddress(PBUS_HANDLER BusHandler,
81 PHYSICAL_ADDRESS BusAddress,
83 PPHYSICAL_ADDRESS TranslatedAddress)
90 HalpAllocateBusHandler(INTERFACE_TYPE InterfaceType,
91 BUS_DATA_TYPE BusDataType,
94 PBUS_HANDLER BusHandler = NULL;
96 DPRINT("HalpAllocateBusHandler()\n");
98 BusHandler = ExAllocatePoolWithTag(NonPagedPool,
101 if (BusHandler == NULL)
104 RtlZeroMemory(BusHandler,
105 sizeof(BUS_HANDLER));
107 InsertTailList(&HalpBusHandlerList,
110 BusHandler->InterfaceType = InterfaceType;
111 BusHandler->BusDataType = BusDataType;
112 BusHandler->BusNumber = BusNumber;
114 /* initialize default bus handler functions */
115 BusHandler->GetBusData = HalpNoBusData;
116 BusHandler->SetBusData = HalpNoBusData;
117 BusHandler->AdjustResourceList = HalpNoAdjustResourceList;
118 BusHandler->AssignSlotResources = HalpNoAssignSlotResources;
119 BusHandler->GetInterruptVector = HalpNoGetInterruptVector;
120 BusHandler->TranslateBusAddress = HalpNoTranslateBusAddress;
124 DPRINT("HalpAllocateBusHandler() done\n");
131 HalpInitBusHandlers(VOID)
133 PBUS_HANDLER BusHandler;
135 /* general preparations */
136 KeInitializeSpinLock(&HalpBusHandlerSpinLock);
137 InitializeListHead(&HalpBusHandlerList);
139 /* initialize hal dispatch tables */
143 HalDispatchTable->HalQueryBusSlots = HaliQueryBusSlots;
146 /* add system bus handler */
147 BusHandler = HalpAllocateBusHandler(Internal,
148 ConfigurationSpaceUndefined,
150 if (BusHandler == NULL)
152 BusHandler->GetInterruptVector =
153 (pGetInterruptVector)HalpGetSystemInterruptVector;
154 BusHandler->TranslateBusAddress =
155 (pTranslateBusAddress)HalpTranslateSystemBusAddress;
157 /* add cmos bus handler */
158 BusHandler = HalpAllocateBusHandler(InterfaceTypeUndefined,
161 if (BusHandler == NULL)
163 BusHandler->GetBusData = (pGetSetBusData)HalpGetCmosData;
164 BusHandler->SetBusData = (pGetSetBusData)HalpSetCmosData;
166 /* add isa bus handler */
167 BusHandler = HalpAllocateBusHandler(Isa,
168 ConfigurationSpaceUndefined,
170 if (BusHandler == NULL)
173 BusHandler->GetInterruptVector =
174 (pGetInterruptVector)HalpGetIsaInterruptVector;
175 BusHandler->TranslateBusAddress =
176 (pTranslateBusAddress)HalpTranslateIsaBusAddress;
179 /* add MicroChannel bus handler */
180 BusHandler = HalpAllocateBusHandler(MicroChannel,
183 if (BusHandler == NULL)
186 BusHandler->GetBusData = (pGetSetBusData)HalpGetMicroChannelData;
190 PBUS_HANDLER FASTCALL
191 HaliHandlerForBus(INTERFACE_TYPE InterfaceType,
194 PBUS_HANDLER BusHandler;
195 PLIST_ENTRY CurrentEntry;
198 KeAcquireSpinLock(&HalpBusHandlerSpinLock,
201 CurrentEntry = HalpBusHandlerList.Flink;
202 while (CurrentEntry != &HalpBusHandlerList)
204 BusHandler = (PBUS_HANDLER)CurrentEntry;
205 if (BusHandler->InterfaceType == InterfaceType &&
206 BusHandler->BusNumber == BusNumber)
208 KeReleaseSpinLock(&HalpBusHandlerSpinLock,
212 CurrentEntry = CurrentEntry->Flink;
214 KeReleaseSpinLock(&HalpBusHandlerSpinLock,
221 PBUS_HANDLER FASTCALL
222 HaliHandlerForConfigSpace(BUS_DATA_TYPE BusDataType,
225 PBUS_HANDLER BusHandler;
226 PLIST_ENTRY CurrentEntry;
229 KeAcquireSpinLock(&HalpBusHandlerSpinLock,
232 CurrentEntry = HalpBusHandlerList.Flink;
233 while (CurrentEntry != &HalpBusHandlerList)
235 BusHandler = (PBUS_HANDLER)CurrentEntry;
236 if (BusHandler->BusDataType == BusDataType &&
237 BusHandler->BusNumber == BusNumber)
239 KeReleaseSpinLock(&HalpBusHandlerSpinLock,
243 CurrentEntry = CurrentEntry->Flink;
245 KeReleaseSpinLock(&HalpBusHandlerSpinLock,
252 PBUS_HANDLER FASTCALL
253 HaliReferenceHandlerForBus(INTERFACE_TYPE InterfaceType,
256 PBUS_HANDLER BusHandler;
257 PLIST_ENTRY CurrentEntry;
260 KeAcquireSpinLock(&HalpBusHandlerSpinLock,
263 CurrentEntry = HalpBusHandlerList.Flink;
264 while (CurrentEntry != &HalpBusHandlerList)
266 BusHandler = (PBUS_HANDLER)CurrentEntry;
267 if (BusHandler->InterfaceType == InterfaceType &&
268 BusHandler->BusNumber == BusNumber)
270 BusHandler->RefCount++;
271 KeReleaseSpinLock(&HalpBusHandlerSpinLock,
275 CurrentEntry = CurrentEntry->Flink;
277 KeReleaseSpinLock(&HalpBusHandlerSpinLock,
284 PBUS_HANDLER FASTCALL
285 HaliReferenceHandlerForConfigSpace(BUS_DATA_TYPE BusDataType,
288 PBUS_HANDLER BusHandler;
289 PLIST_ENTRY CurrentEntry;
292 KeAcquireSpinLock(&HalpBusHandlerSpinLock,
295 CurrentEntry = HalpBusHandlerList.Flink;
296 while (CurrentEntry != &HalpBusHandlerList)
298 BusHandler = (PBUS_HANDLER)CurrentEntry;
299 if (BusHandler->BusDataType == BusDataType &&
300 BusHandler->BusNumber == BusNumber)
302 BusHandler->RefCount++;
303 KeReleaseSpinLock(&HalpBusHandlerSpinLock,
307 CurrentEntry = CurrentEntry->Flink;
309 KeReleaseSpinLock(&HalpBusHandlerSpinLock,
317 HaliDereferenceBusHandler(PBUS_HANDLER BusHandler)
321 KeAcquireSpinLock(&HalpBusHandlerSpinLock,
323 BusHandler->RefCount--;
324 KeReleaseSpinLock(&HalpBusHandlerSpinLock,
330 HalAdjustResourceList(PCM_RESOURCE_LIST Resources)
332 PBUS_HANDLER BusHandler;
335 BusHandler = HaliReferenceHandlerForBus(Resources->List[0].InterfaceType,
336 Resources->List[0].BusNumber);
337 if (BusHandler == NULL)
338 return STATUS_SUCCESS;
340 Status = BusHandler->AdjustResourceList(BusHandler,
341 Resources->List[0].BusNumber,
343 HaliDereferenceBusHandler (BusHandler);
350 HalAssignSlotResources(PUNICODE_STRING RegistryPath,
351 PUNICODE_STRING DriverClassName,
352 PDRIVER_OBJECT DriverObject,
353 PDEVICE_OBJECT DeviceObject,
354 INTERFACE_TYPE BusType,
357 PCM_RESOURCE_LIST *AllocatedResources)
359 PBUS_HANDLER BusHandler;
362 BusHandler = HaliReferenceHandlerForBus(BusType,
364 if (BusHandler == NULL)
365 return STATUS_NOT_FOUND;
367 Status = BusHandler->AssignSlotResources(BusHandler,
376 HaliDereferenceBusHandler(BusHandler);
383 HalGetBusData(BUS_DATA_TYPE BusDataType,
389 return (HalGetBusDataByOffset(BusDataType,
399 HalGetBusDataByOffset(BUS_DATA_TYPE BusDataType,
406 PBUS_HANDLER BusHandler;
409 BusHandler = HaliReferenceHandlerForConfigSpace(BusDataType,
411 if (BusHandler == NULL)
414 Result = BusHandler->GetBusData(BusHandler,
421 HaliDereferenceBusHandler (BusHandler);
428 HalGetInterruptVector(INTERFACE_TYPE InterfaceType,
430 ULONG BusInterruptLevel,
431 ULONG BusInterruptVector,
435 PBUS_HANDLER BusHandler;
438 BusHandler = HaliReferenceHandlerForBus(InterfaceType,
440 if (BusHandler == NULL)
443 Result = BusHandler->GetInterruptVector(BusHandler,
450 HaliDereferenceBusHandler(BusHandler);
457 HalSetBusData(BUS_DATA_TYPE BusDataType,
463 return (HalSetBusDataByOffset(BusDataType,
473 HalSetBusDataByOffset(BUS_DATA_TYPE BusDataType,
480 PBUS_HANDLER BusHandler;
483 BusHandler = HaliReferenceHandlerForConfigSpace(BusDataType,
485 if (BusHandler == NULL)
488 Result = BusHandler->SetBusData(BusHandler,
495 HaliDereferenceBusHandler(BusHandler);
502 HalTranslateBusAddress(INTERFACE_TYPE InterfaceType,
504 PHYSICAL_ADDRESS BusAddress,
506 PPHYSICAL_ADDRESS TranslatedAddress)
508 PBUS_HANDLER BusHandler;
511 BusHandler = HaliReferenceHandlerForBus(InterfaceType,
513 if (BusHandler == NULL)
516 Result = BusHandler->TranslateBusAddress(BusHandler,
522 HaliDereferenceBusHandler(BusHandler);