On 08/07/14 03:22, Andrew Fish wrote: > > On Aug 6, 2014, at 6:04 PM, Chris Cuthbert <nd6...@hotmail.com > <mailto:nd6...@hotmail.com>> wrote: > >> Hi Laszlo, >> The ethernet device has a pci-pci bridge between itself and the root >> bridge. Hence the weird looking device path. >> > > The PCI nodes are Dev/Func as the bus #’s can change from boot to boot. > >> I poked around some more and saw that MNP DXE driver could not open >> SNP protocol on any of the handles passed to it and hence it does not >> bind. It seems odd that "dh" command sees the SNP but MNP does not. >> > > dh is a handle dump. So it shows all the handles. Not really the > relationship between the handles. devtree and drivers shows more about > that.
I didn't know about devtree. It's very useful, thanks! >> How does UEFI handle the dependency between drivers ? > > So EFI Driver Model drivers use the driver binding protocol. These > drivers just register the driver binding protocol in their entry point. > The platform connects drivers based on policy. The platform will use > gBS->ConnectController() > > This is under ConnectController() in the Boot Services chapter of UEFI > 2.4 spec: > > This functions uses five precedence rules when deciding the order that > drivers are tested against controllers. These five rules from highest > precedence to lowest precedence are as follows: > 1. Context Override : DriverImageHandle is an ordered list of handles > that support the EFI_DRIVER_BINDING_PROTOCOL. The highest priority image > handle is the first element of the list, and the lowest priority image > handle is the last element of the list. The list is terminated with a > NULL image handle. > 2. Platform Driver Override : If an > EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL instance is present in the system, > then the GetDriver() service of this protocol is used to retrieve an > ordered list of image handles for ControllerHandle. From this list, the > image handles found in rule (1) above are removed. The first image > handle returned from GetDriver() has the highest precedence, and the > last image handle returned from GetDriver() has the lowest precedence. > The ordered list is terminated when GetDriver() returns EFI_NOT_FOUND. > It is legal for no image handles to be returned by GetDriver(). There > can be at most a single instance in the system of the > EFI_PLATFORM_DRIVER_OVERRIDE_PROTOCOL. If there is more than one, then > the system behavior is not deterministic. > 3. Driver Family Override Search : The list of available driver image > handles can be found by using the boot service LocateHandle()with a > SearchType of ByProtocol for the GUID of the > EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL. From this list, the image handles > found in rules (1), and (2) above are removed. The remaining image > handles are sorted from highest to lowest based on the value returned > from the GetVersion() function of the > EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL associated with each image handle. > 4. Bus Specific Driver Override : If there is an instance of the > EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL attached to ControllerHandle, > then the GetDriver() service of this protocol is used to retrieve an > ordered list of image handle for ControllerHandle. From this list, the > image handles found in rules (1), (2), and (3) above are removed. The > first image handle returned from GetDriver() has the highest precedence, > and the last image handle returned from GetDriver() has the lowest > precedence. The ordered list is terminated when GetDriver() returns > EFI_NOT_FOUND. It is legal for no image handles to be returned by > GetDriver(). > 5. Driver Binding Search : The list of available driver image handles > can be found by using the boot service LocateHandle() with a SearchType > of ByProtocol for the GUID of the EFI_DRIVER_BINDING_PROTOCOL. From this > list, the image handles found in rules (1), (2), (3), and (4) above are > removed. The remaining image handles are sorted from highest to lowest > based on the Version field of the EFI_DRIVER_BINDING_PROTOCOL instance > associated with each image handle. > Services — Boot Services >  > >> What if MNP driver binding protocol runs first and does not find SNP >> because the SNP driver binding protocol has no run yet ? >> > > You can mess around with the disconnect/connect shell commands, as they > use 1) above and should let you debug what is going on. Thank you Andrew for explaining it, I secretly wished you'd chime in :) ( So yes, the one thing I could think of too was that Chris's BDS code was maybe not calling ConnectController(). Chris, in OVMF it looks like (soon calling into IntelFrameworkModulePkg): PlatformBdsPolicyBehavior() [OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c] BdsLibConnectAll() [IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConnect.c] BdsLibConnectAllDriversToAllControllers() BdsLibConnectAllEfi() gBS->ConnectController(..., recursive=true) CoreConnectController() [MdeModulePkg/Core/Dxe/Hand/DriverSupport.c] implements gBS->ConnectController(). There are important loops in the last three functions. In ARM BDS there's a similar function: BdsConnectAllDrivers() [ArmPkg/Library/BdsLib/BdsHelper.c]. As Andrew said, you should experiment with the connect shell command, especially the -r (recursive) option. ) Thanks, Laszlo ------------------------------------------------------------------------------ Infragistics Professional Build stunning WinForms apps today! Reboot your WinForms applications with our WinForms controls. Build a bridge from your legacy apps to the future. http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel