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->TranslateBusAddress =
174 (pTranslateBusAddress)HalpTranslateIsaBusAddress;
177 /* add MicroChannel bus handler */
178 BusHandler = HalpAllocateBusHandler(MicroChannel,
181 if (BusHandler == NULL)
184 BusHandler->GetBusData = (pGetSetBusData)HalpGetMicroChannelData;
188 PBUS_HANDLER FASTCALL
189 HaliHandlerForBus(INTERFACE_TYPE InterfaceType,
192 PBUS_HANDLER BusHandler;
193 PLIST_ENTRY CurrentEntry;
196 KeAcquireSpinLock(&HalpBusHandlerSpinLock,
199 CurrentEntry = HalpBusHandlerList.Flink;
200 while (CurrentEntry != &HalpBusHandlerList)
202 BusHandler = (PBUS_HANDLER)CurrentEntry;
203 if (BusHandler->InterfaceType == InterfaceType &&
204 BusHandler->BusNumber == BusNumber)
206 KeReleaseSpinLock(&HalpBusHandlerSpinLock,
210 CurrentEntry = CurrentEntry->Flink;
212 KeReleaseSpinLock(&HalpBusHandlerSpinLock,
219 PBUS_HANDLER FASTCALL
220 HaliHandlerForConfigSpace(BUS_DATA_TYPE BusDataType,
223 PBUS_HANDLER BusHandler;
224 PLIST_ENTRY CurrentEntry;
227 KeAcquireSpinLock(&HalpBusHandlerSpinLock,
230 CurrentEntry = HalpBusHandlerList.Flink;
231 while (CurrentEntry != &HalpBusHandlerList)
233 BusHandler = (PBUS_HANDLER)CurrentEntry;
234 if (BusHandler->BusDataType == BusDataType &&
235 BusHandler->BusNumber == BusNumber)
237 KeReleaseSpinLock(&HalpBusHandlerSpinLock,
241 CurrentEntry = CurrentEntry->Flink;
243 KeReleaseSpinLock(&HalpBusHandlerSpinLock,
250 PBUS_HANDLER FASTCALL
251 HaliReferenceHandlerForBus(INTERFACE_TYPE InterfaceType,
254 PBUS_HANDLER BusHandler;
255 PLIST_ENTRY CurrentEntry;
258 KeAcquireSpinLock(&HalpBusHandlerSpinLock,
261 CurrentEntry = HalpBusHandlerList.Flink;
262 while (CurrentEntry != &HalpBusHandlerList)
264 BusHandler = (PBUS_HANDLER)CurrentEntry;
265 if (BusHandler->InterfaceType == InterfaceType &&
266 BusHandler->BusNumber == BusNumber)
268 BusHandler->RefCount++;
269 KeReleaseSpinLock(&HalpBusHandlerSpinLock,
273 CurrentEntry = CurrentEntry->Flink;
275 KeReleaseSpinLock(&HalpBusHandlerSpinLock,
282 PBUS_HANDLER FASTCALL
283 HaliReferenceHandlerForConfigSpace(BUS_DATA_TYPE BusDataType,
286 PBUS_HANDLER BusHandler;
287 PLIST_ENTRY CurrentEntry;
290 KeAcquireSpinLock(&HalpBusHandlerSpinLock,
293 CurrentEntry = HalpBusHandlerList.Flink;
294 while (CurrentEntry != &HalpBusHandlerList)
296 BusHandler = (PBUS_HANDLER)CurrentEntry;
297 if (BusHandler->BusDataType == BusDataType &&
298 BusHandler->BusNumber == BusNumber)
300 BusHandler->RefCount++;
301 KeReleaseSpinLock(&HalpBusHandlerSpinLock,
305 CurrentEntry = CurrentEntry->Flink;
307 KeReleaseSpinLock(&HalpBusHandlerSpinLock,
315 HaliDereferenceBusHandler(PBUS_HANDLER BusHandler)
319 KeAcquireSpinLock(&HalpBusHandlerSpinLock,
321 BusHandler->RefCount--;
322 KeReleaseSpinLock(&HalpBusHandlerSpinLock,
328 HalAdjustResourceList(PCM_RESOURCE_LIST Resources)
330 PBUS_HANDLER BusHandler;
333 BusHandler = HaliReferenceHandlerForBus(Resources->List[0].InterfaceType,
334 Resources->List[0].BusNumber);
335 if (BusHandler == NULL)
336 return STATUS_SUCCESS;
338 Status = BusHandler->AdjustResourceList(BusHandler,
339 Resources->List[0].BusNumber,
341 HaliDereferenceBusHandler (BusHandler);
348 HalAssignSlotResources(PUNICODE_STRING RegistryPath,
349 PUNICODE_STRING DriverClassName,
350 PDRIVER_OBJECT DriverObject,
351 PDEVICE_OBJECT DeviceObject,
352 INTERFACE_TYPE BusType,
355 PCM_RESOURCE_LIST *AllocatedResources)
357 PBUS_HANDLER BusHandler;
360 BusHandler = HaliReferenceHandlerForBus(BusType,
362 if (BusHandler == NULL)
363 return STATUS_NOT_FOUND;
365 Status = BusHandler->AssignSlotResources(BusHandler,
374 HaliDereferenceBusHandler(BusHandler);
381 HalGetBusData(BUS_DATA_TYPE BusDataType,
387 return (HalGetBusDataByOffset(BusDataType,
397 HalGetBusDataByOffset(BUS_DATA_TYPE BusDataType,
404 PBUS_HANDLER BusHandler;
407 BusHandler = HaliReferenceHandlerForConfigSpace(BusDataType,
409 if (BusHandler == NULL)
412 Result = BusHandler->GetBusData(BusHandler,
419 HaliDereferenceBusHandler (BusHandler);
426 HalGetInterruptVector(INTERFACE_TYPE InterfaceType,
428 ULONG BusInterruptLevel,
429 ULONG BusInterruptVector,
433 PBUS_HANDLER BusHandler;
436 BusHandler = HaliReferenceHandlerForBus(InterfaceType,
438 if (BusHandler == NULL)
441 Result = BusHandler->GetInterruptVector(BusHandler,
448 HaliDereferenceBusHandler(BusHandler);
455 HalSetBusData(BUS_DATA_TYPE BusDataType,
461 return (HalSetBusDataByOffset(BusDataType,
471 HalSetBusDataByOffset(BUS_DATA_TYPE BusDataType,
478 PBUS_HANDLER BusHandler;
481 BusHandler = HaliReferenceHandlerForConfigSpace(BusDataType,
483 if (BusHandler == NULL)
486 Result = BusHandler->SetBusData(BusHandler,
493 HaliDereferenceBusHandler(BusHandler);
500 HalTranslateBusAddress(INTERFACE_TYPE InterfaceType,
502 PHYSICAL_ADDRESS BusAddress,
504 PPHYSICAL_ADDRESS TranslatedAddress)
506 PBUS_HANDLER BusHandler;
509 BusHandler = HaliReferenceHandlerForBus(InterfaceType,
511 if (BusHandler == NULL)
514 Result = BusHandler->TranslateBusAddress(BusHandler,
520 HaliDereferenceBusHandler(BusHandler);