Michael, I forgot to mention If the DXE phase does not produce all the protocols required to dispatch UEFI_DRIVERs you get a lot of DEBUG prints and an ASSERTs out of the DXE Core.
https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c#L480 // // Display Architectural protocols that were not loaded if this is DEBUG build // DEBUG_CODE_BEGIN (); CoreDisplayMissingArchProtocols (); DEBUG_CODE_END (); // // Display any drivers that were not dispatched because dependency expression // evaluated to false if this is a debug build // DEBUG_CODE_BEGIN (); CoreDisplayDiscoveredNotDispatched (); DEBUG_CODE_END (); // // Assert if the Architectural Protocols are not present. // Status = CoreAllEfiServicesAvailable (); if (EFI_ERROR(Status)) { // // Report Status code that some Architectural Protocols are not present. // REPORT_STATUS_CODE ( EFI_ERROR_CODE | EFI_ERROR_MAJOR, (EFI_SOFTWARE_DXE_CORE | EFI_SW_DXE_CORE_EC_NO_ARCH) ); } ASSERT_EFI_ERROR (Status); > On May 17, 2017, at 11:09 PM, Andrew Fish <[email protected]> wrote: > >> >> On May 17, 2017, at 10:42 PM, Michael Zimmermann <[email protected] >> <mailto:[email protected]>> wrote: >> >> Michael, that's a good point but it only works for drivers which bind >> to a device. If you're just installing a protocol e.g. for virtual >> devices or special services which you don't want to turn into >> libraries then this doesn't work. >> >> Haojian, that's what I was thinking, I just wasn't sure if the order >> is reliable. >> > > Micheal, > > From a PI/UEFI architectural perspective the contract is the depex are > honored. If multiple drivers are TRUE at the same time the order they execute > is not defined. Basically it is implementation choice and you should not > write code that depends on this. This is why the A priori file exists, it is > the only architectural way to force order of dispatch. Well DXE has BEFORE > and AFTER. > > When I wrote the original dispatcher I ended up adding new drivers to the > tail of the list vs. the head. Both would have been legal from a spec point > of view. So by observing the current behavior you are conflating my > implementation choice with the contract provided by specification. > > >> Andrew, your description sounds like its about DXE_DRIVERs and their >> Depex sections, does this apply to UEFI_DRIVERs too when they're >> auto-loaded from the fdf(since they don't support the Depex section)? >> > > No Depex section for UEFI_DRIVERS implies this Depex: > > [Depex] > gEfiSecurityArchProtocolGuid AND > gEfiCpuArchProtocolGuid AND > gEfiMetronomeArchProtocolGuid AND > gEfiTimerArchProtocolGuid AND > gEfiBdsArchProtocolGuid AND > gEfiWatchdogTimerArchProtocolGuid AND > gEfiRuntimeArchProtocolGuid AND > gEfiVariableArchProtocolGuid AND > gEfiVariableWriteArchProtocolGuid AND > gEfiCapsuleArchProtocolGuid AND > gEfiMonotonicCounterArchProtocolGuid AND > gEfiResetArchProtocolGuid AND > gEfiRealTimeClockArchProtocolGuid > > This is how we glued PI (DXE_DRIVERS) and UEFI (UEFI_DRIVER) together. EFI > predates the concept of DXE in PI. > > The primary job of DXE_DRIVERS is to configure all the hardware required to > provide all the EFI Boot and Runtime Services. The above protocols are what > the DXE Core requires to produce all the EFI Boot and Runtime services. > > Thanks, > > Andrew Fish > >> Thanks for all your answers, >> Michael >> >> On Thu, May 18, 2017 at 7:21 AM, Andrew Fish <[email protected]> wrote: >>> >>>> On May 17, 2017, at 10:00 PM, Kinney, Michael D >>>> <[email protected]> wrote: >>>> >>>> Michael, >>>> >>>> The UEFI Driver Model and the Driver Binding Protocol >>>> provide support for this case. The idea is that a driver >>>> is loaded and started, but when a UEFI Driver is started, >>>> it only registers a Driver Binding Protocol. Then in the >>>> BDS phase, the devices required to boot are started using >>>> the UEFI Boot Service ConnectController() and >>>> ConnectController() calls the Driver Binding Protocol(s). >>>> >>>> The dependencies between UEFI Drivers are in their Driver >>>> Binding Protocols which are not used until after all of >>>> the UEFI Drivers are loaded and started. >>>> >>> >>> Micheal, >>> >>> 1st off no dependency is really a dependency on all the architecture >>> protocols, which is a fancy way of saying all the EFI Boot and Runtime >>> Services are available. >>> >>> Lets say you have a driver that depends on DiskIo. The DiskIo driver >>> depends on BlockIo. Now what happens when a disk driver is connected and >>> produces a BlockIO is the DiskIo driver can know get connected. The DXE >>> Core knows a protocol was added to the handle so it will keep trying to >>> connect drivers to that handle as long as new protocols get added. So this >>> is how the DriverBinding Support() is used to resolve the sequence issues. >>> >>> Thanks, >>> >>> Andrew Fish >>> >>>> Mike >>>> >>>>> -----Original Message----- >>>>> From: edk2-devel [mailto:[email protected]] On Behalf Of >>>>> Michael >>>>> Zimmermann >>>>> Sent: Wednesday, May 17, 2017 9:43 PM >>>>> To: edk2-devel-01 <[email protected]>; Zeng, Star >>>>> <[email protected]>; Dong, >>>>> Eric <[email protected]> >>>>> Subject: [edk2] UEFI_DRIVER dependencies >>>>> >>>>> I know that UEFI_DRIVERs don't need or support Depex sections, but >>>>> what if an UEFI_DRIVER depends on a protocol provided by another >>>>> UEFI_DRIVER? >>>>> Since they get loaded automatically because I put them in my >>>>> platform's fdf, it raises the question of the loading order. >>>>> >>>>> Will they get loaded in the order they're defined? How often will the >>>>> core retry if one of the drivers returns EFI_NOT_READY? >>>>> >>>>> Thanks, >>>>> Michael >>>>> _______________________________________________ >>>>> edk2-devel mailing list >>>>> [email protected] >>>>> https://lists.01.org/mailman/listinfo/edk2-devel >>>> _______________________________________________ >>>> edk2-devel mailing list >>>> [email protected] >>>> https://lists.01.org/mailman/listinfo/edk2-devel >>> >> _______________________________________________ >> edk2-devel mailing list >> [email protected] <mailto:[email protected]> >> https://lists.01.org/mailman/listinfo/edk2-devel >> <https://lists.01.org/mailman/listinfo/edk2-devel> > > _______________________________________________ > edk2-devel mailing list > [email protected] <mailto:[email protected]> > https://lists.01.org/mailman/listinfo/edk2-devel > <https://lists.01.org/mailman/listinfo/edk2-devel> _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

