From 90d92560f434a907c0364686a6891a3b14ec30dc Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Mon, 7 Jun 2010 21:36:31 +0000 Subject: [PATCH] [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. svn path=/trunk/; revision=47684 --- .../hal/halx86/generic/legacy/bus/bushndlr.c | 41 ++++++-- reactos/hal/halx86/generic/legacy/bussupp.c | 99 ++++++++++++------- reactos/hal/halx86/include/bus.h | 37 +++++-- 3 files changed, 124 insertions(+), 53 deletions(-) diff --git a/reactos/hal/halx86/generic/legacy/bus/bushndlr.c b/reactos/hal/halx86/generic/legacy/bus/bushndlr.c index 0e5774be6d2..2ab551c610e 100644 --- a/reactos/hal/halx86/generic/legacy/bus/bushndlr.c +++ b/reactos/hal/halx86/generic/legacy/bus/bushndlr.c @@ -201,6 +201,41 @@ HaliReferenceHandlerForConfigSpace(IN BUS_DATA_TYPE ConfigType, 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_ NTSTATUS NTAPI @@ -408,13 +443,7 @@ HalpInitBusHandler(VOID) #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 */ diff --git a/reactos/hal/halx86/generic/legacy/bussupp.c b/reactos/hal/halx86/generic/legacy/bussupp.c index a6978604a58..6faa60fb765 100644 --- a/reactos/hal/halx86/generic/legacy/bussupp.c +++ b/reactos/hal/halx86/generic/legacy/bussupp.c @@ -1152,50 +1152,75 @@ HalpAssignSlotResources(IN PUNICODE_STRING RegistryPath, 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; } diff --git a/reactos/hal/halx86/include/bus.h b/reactos/hal/halx86/include/bus.h index 5af43db051b..3f6e1d6d546 100644 --- a/reactos/hal/halx86/include/bus.h +++ b/reactos/hal/halx86/include/bus.h @@ -376,16 +376,6 @@ HalpTranslateBusAddress( 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 @@ HalpRegisterPciDebuggingDeviceInfo( /* 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, @@ -459,6 +469,12 @@ HalpInitBusHandler( VOID ); +PBUS_HANDLER +NTAPI +HalpContextToBusHandler( + IN ULONG_PTR ContextValue +); + PBUS_HANDLER FASTCALL HaliReferenceHandlerForConfigSpace( @@ -534,5 +550,6 @@ extern ULONG HalpBusType; extern BOOLEAN HalpPCIConfigInitialized; extern BUS_HANDLER HalpFakePciBusHandler; extern ULONG HalpMinPciBus, HalpMaxPciBus; +extern LIST_ENTRY HalpAllBusHandlers; /* EOF */ -- 2.17.1