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);