Does it work for you if using the protocol notification?

Thanks,
Star
From: Michael Zimmermann [mailto:[email protected]]
Sent: Thursday, May 18, 2017 2:25 PM
To: Andrew Fish <[email protected]>
Cc: Kinney, Michael D <[email protected]>; edk2-devel-01 
<[email protected]>; Dong, Eric <[email protected]>; Zeng, Star 
<[email protected]>
Subject: Re: [edk2] UEFI_DRIVER dependencies

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.

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


//


// 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]] 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
_______________________________________________
edk2-devel mailing list
[email protected]<mailto:[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

_______________________________________________
edk2-devel mailing list
[email protected]<mailto:[email protected]>
https://lists.01.org/mailman/listinfo/edk2-devel


_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to