> On May 17, 2017, at 11:25 PM, Michael Zimmermann <[email protected]> > wrote: > > Andrew, doesn't that only address the case where an UEFI_DRIVER has > dependencies on certain dxe drivers?(which, as you said will always be > available). > It's still unclear to me how an UEFI_DRIVER can depend on another UEFI_DRIVER > this way without relying on the fdf-order or using the device binding > mechanism. > > My usecase is that I want to install a protocol from within a uefi driver > which then can be used by other uefi drivers. It's a pure protocol and thus > doesn't use the binding mechanism to bind to a device. >
Micheal, To get a little pedantic a UEFI driver could run on a system that did not support PI and thus no dispatcher. The early Itanium systems worked this way for example. So if you are really a UEFI driver then you have to gBS->RegisterProtocolNotify() to deal with sequence of protocols that don't follow the EFI Driver Model. If you want to have a DEPEX then you are really a DXE_DRIVER (UEFI + PI). I guess you could take a UEFI_DRIVER rename it a DXE_DRIVER and add my example Depex and it would work the same way as a UEFI_DRIVER. You could then add your extra Depex. Thanks, Andrew Fish > Thanks, > Michael > > On Thu, May 18, 2017 at 8:16 AM, Andrew Fish <[email protected] > <mailto:[email protected]>> wrote: > 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 > > <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] >> <mailto:[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] >>> <mailto:[email protected]>> wrote: >>>> >>>>> On May 17, 2017, at 10:00 PM, Kinney, Michael D >>>>> <[email protected] <mailto:[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] >>>>>> <mailto:[email protected]>] On Behalf Of Michael >>>>>> Zimmermann >>>>>> Sent: Wednesday, May 17, 2017 9:43 PM >>>>>> To: edk2-devel-01 <[email protected] >>>>>> <mailto:[email protected]>>; Zeng, Star <[email protected] >>>>>> <mailto:[email protected]>>; Dong, >>>>>> Eric <[email protected] <mailto:[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] <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] <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

