Author: sir_richard
Date: Mon Jun 7 23:36:31 2010
New Revision: 47684
URL: http://svn.reactos.org/svn/reactos?rev=47684&view=rev
Log:
[HAL]: Use Bus Handler support for HalFindBusAddressTranslation. Implement HalpContextToBusHandler to support this. Seems to work fine with bootvid (only user).
All the HAL's bus functions now use Bus Handlers on Legacy systems. There are still big issues with PCI cards.
eVb: PCI-x should work now.
More PCI-related HAL patches may follow later.
Modified:
trunk/reactos/hal/halx86/generic/legacy/bus/bushndlr.c
trunk/reactos/hal/halx86/generic/legacy/bussupp.c
trunk/reactos/hal/halx86/include/bus.h
Modified: trunk/reactos/hal/halx86/generic/legacy/bus/bushndlr.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/legacy/…
==============================================================================
--- trunk/reactos/hal/halx86/generic/legacy/bus/bushndlr.c [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/generic/legacy/bus/bushndlr.c [iso-8859-1] Mon Jun 7 23:36:31 2010
@@ -199,6 +199,41 @@
{
/* Lookup the configuration in the configuration table and add a reference */
return HalpLookupHandler(HalpConfigTable, ConfigType, BusNumber, TRUE);
+}
+
+PBUS_HANDLER
+NTAPI
+HalpContextToBusHandler(IN ULONG_PTR ContextValue)
+{
+ PLIST_ENTRY NextEntry;
+ PHAL_BUS_HANDLER BusHandler, ThisHandler;
+
+ /* Start lookup */
+ NextEntry = HalpAllBusHandlers.Flink;
+ ThisHandler = CONTAINING_RECORD(NextEntry, HAL_BUS_HANDLER, AllHandlers);
+ if (ContextValue)
+ {
+ /* If the list is empty, quit */
+ if (IsListEmpty(&HalpAllBusHandlers)) return NULL;
+
+ /* Otherwise, scan the list */
+ BusHandler = CONTAINING_RECORD(ContextValue, HAL_BUS_HANDLER, Handler);
+ do
+ {
+ /* Check if we've reached the right one */
+ ThisHandler = CONTAINING_RECORD(NextEntry, HAL_BUS_HANDLER, AllHandlers);
+ if (ThisHandler == BusHandler) break;
+
+ /* Try the next one */
+ NextEntry = NextEntry->Flink;
+ } while (NextEntry != &HalpAllBusHandlers);
+ }
+
+ /* If we looped back to the end, we didn't find anything */
+ if (NextEntry == &HalpAllBusHandlers) return NULL;
+
+ /* Otherwise return the handler */
+ return &ThisHandler->Handler;
}
#ifndef _MINIHAL_
@@ -408,13 +443,7 @@
#endif
HalPciAssignSlotResources = HalpAssignSlotResources;
HalPciTranslateBusAddress = HaliTranslateBusAddress; /* PCI Driver can override */
- /* FIXME: Fix later */
-#if 0
if (!HalFindBusAddressTranslation) HalFindBusAddressTranslation = HaliFindBusAddressTranslation;
-#else
- /* These should be written by the PCI driver later, but we give defaults */
- HalFindBusAddressTranslation = HalpFindBusAddressTranslation;
-#endif
}
/* EOF */
Modified: trunk/reactos/hal/halx86/generic/legacy/bussupp.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/legacy/…
==============================================================================
--- trunk/reactos/hal/halx86/generic/legacy/bussupp.c [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/generic/legacy/bussupp.c [iso-8859-1] Mon Jun 7 23:36:31 2010
@@ -1152,50 +1152,75 @@
BOOLEAN
NTAPI
-HalpTranslateBusAddress(IN INTERFACE_TYPE InterfaceType,
- IN ULONG BusNumber,
- IN PHYSICAL_ADDRESS BusAddress,
- IN OUT PULONG AddressSpace,
- OUT PPHYSICAL_ADDRESS TranslatedAddress)
-{
- /* Translation is easy */
- TranslatedAddress->QuadPart = BusAddress.QuadPart;
- return TRUE;
-}
-
-ULONG
-NTAPI
-HalpGetSystemInterruptVector_Acpi(IN ULONG BusNumber,
- IN ULONG BusInterruptLevel,
- IN ULONG BusInterruptVector,
- OUT PKIRQL Irql,
- OUT PKAFFINITY Affinity)
-{
- ULONG Vector = IRQ2VECTOR(BusInterruptLevel);
- *Irql = (KIRQL)VECTOR2IRQL(Vector);
- *Affinity = 0xFFFFFFFF;
- return Vector;
-}
-
-BOOLEAN
-NTAPI
-HalpFindBusAddressTranslation(IN PHYSICAL_ADDRESS BusAddress,
+HaliFindBusAddressTranslation(IN PHYSICAL_ADDRESS BusAddress,
IN OUT PULONG AddressSpace,
OUT PPHYSICAL_ADDRESS TranslatedAddress,
IN OUT PULONG_PTR Context,
IN BOOLEAN NextBus)
{
+ PHAL_BUS_HANDLER BusHandler;
+ PBUS_HANDLER Handler;
+ PLIST_ENTRY NextEntry;
+ ULONG ContextValue;
+
/* Make sure we have a context */
if (!Context) return FALSE;
-
- /* If we have data in the context, then this shouldn't be a new lookup */
- if ((*Context) && (NextBus == TRUE)) return FALSE;
-
- /* Return bus data */
- TranslatedAddress->QuadPart = BusAddress.QuadPart;
-
- /* Set context value and return success */
- *Context = 1;
+ ASSERT((*Context) || (NextBus == TRUE));
+
+ /* Read the context */
+ ContextValue = *Context;
+
+ /* Find the bus handler */
+ Handler = HalpContextToBusHandler(ContextValue);
+ if (!Handler) return FALSE;
+
+ /* Check if this is an ongoing lookup */
+ if (NextBus)
+ {
+ /* Get the HAL bus handler */
+ BusHandler = CONTAINING_RECORD(Handler, HAL_BUS_HANDLER, Handler);
+ NextEntry = &BusHandler->AllHandlers;
+
+ /* Get the next one if we were already with one */
+ if (ContextValue) NextEntry = NextEntry->Flink;
+
+ /* Start scanning */
+ while (TRUE)
+ {
+ /* Check if this is the last one */
+ if (NextEntry == &HalpAllBusHandlers)
+ {
+ /* Quit */
+ *Context = 1;
+ return FALSE;
+ }
+
+ /* Call this translator */
+ BusHandler = CONTAINING_RECORD(NextEntry, HAL_BUS_HANDLER, AllHandlers);
+ if (HalTranslateBusAddress(BusHandler->Handler.InterfaceType,
+ BusHandler->Handler.BusNumber,
+ BusAddress,
+ AddressSpace,
+ TranslatedAddress)) break;
+
+ /* Try the next one */
+ NextEntry = NextEntry->Flink;
+ }
+
+ /* If we made it, we're done */
+ *Context = (ULONG_PTR)Handler;
+ return TRUE;
+ }
+
+ /* Try the first one through */
+ if (!HalTranslateBusAddress(Handler->InterfaceType,
+ Handler->BusNumber,
+ BusAddress,
+ AddressSpace,
+ TranslatedAddress)) return FALSE;
+
+ /* Remember for next time */
+ *Context = (ULONG_PTR)Handler;
return TRUE;
}
Modified: trunk/reactos/hal/halx86/include/bus.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/include/bus.h?r…
==============================================================================
--- trunk/reactos/hal/halx86/include/bus.h [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/include/bus.h [iso-8859-1] Mon Jun 7 23:36:31 2010
@@ -376,16 +376,6 @@
OUT PPHYSICAL_ADDRESS TranslatedAddress
);
-BOOLEAN
-NTAPI
-HaliTranslateBusAddress(
- IN INTERFACE_TYPE InterfaceType,
- IN ULONG BusNumber,
- IN PHYSICAL_ADDRESS BusAddress,
- IN OUT PULONG AddressSpace,
- OUT PPHYSICAL_ADDRESS TranslatedAddress
-);
-
NTSTATUS
NTAPI
HalpAssignSlotResources(
@@ -417,6 +407,26 @@
/* LEGACY */
+BOOLEAN
+NTAPI
+HaliTranslateBusAddress(
+ IN INTERFACE_TYPE InterfaceType,
+ IN ULONG BusNumber,
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress
+);
+
+BOOLEAN
+NTAPI
+HaliFindBusAddressTranslation(
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress,
+ IN OUT PULONG_PTR Context,
+ IN BOOLEAN NextBus
+);
+
NTSTATUS
NTAPI
HalpAdjustPCIResourceList(IN PBUS_HANDLER BusHandler,
@@ -460,6 +470,12 @@
);
PBUS_HANDLER
+NTAPI
+HalpContextToBusHandler(
+ IN ULONG_PTR ContextValue
+);
+
+PBUS_HANDLER
FASTCALL
HaliReferenceHandlerForConfigSpace(
IN BUS_DATA_TYPE ConfigType,
@@ -534,5 +550,6 @@
extern BOOLEAN HalpPCIConfigInitialized;
extern BUS_HANDLER HalpFakePciBusHandler;
extern ULONG HalpMinPciBus, HalpMaxPciBus;
+extern LIST_ENTRY HalpAllBusHandlers;
/* EOF */