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 */