From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web12.229.1590788430435663790 for ; Fri, 29 May 2020 14:40:30 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: ard.biesheuvel@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 467151045; Fri, 29 May 2020 14:40:29 -0700 (PDT) Received: from localhost.localdomain (unknown [10.37.8.220]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 3ADDA3F6C4; Fri, 29 May 2020 14:40:28 -0700 (PDT) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: leif@nuviainc.com, alan@softiron.com, Ard Biesheuvel Subject: [PATCH edk2-platforms] Platform/OverdriveBoard: work around network ConnectAll() dependency Date: Fri, 29 May 2020 23:40:19 +0200 Message-Id: <20200529214019.6063-1-ard.biesheuvel@arm.com> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable The AMD Seattle based platforms have been kept up to date in recent years, even though the hardware is obsolete and was never available that widely in the first place. However, one aspect that has sadly been left behind is the support for the builtin network controllers. These are only wired up and enabled on the Overdrive board to begin with, and the driver was only made available as two separate binary blobs implementing the SNP protocol for each controller separately, without taking the UEFI driver model into account. Even worse, the PHY initialization code that needs to run at boot in order for the OS to be able to use the device never executes unless the upper networking layers start the SNP protocol, which doesn't happen on a fast boot (one that does not use ConnectAll()) unless the boot target is a network device path. We cannot fix the driver, but fortunately, there is another way out: protocols that are installed on a handle during the execution of the entrypoint of a driver will be connected by the DXE core, and so we can ensure that the old behavior is retained regardless of whether ConnectAll() is ever invoked, by reordering the load sequence so that the upper layer drivers have all been registered by the time the entrypoints of the SNP drivers are called. This relies on FV contents to be dispatched in the order they appear in the .FDF file. The AMD SNP driver as well as the upper layer drivers in NetworkPkg are UEFI_DRIVER modules, which means their DEPEXes are implicitly defined as the full set of architectural PI protocols. This means that all these modules become available for dispatch at the same time, and their dispatch order is fully defined by the order of appearance in the FV. Unfortunately, this is an implementation detail rather than something that is supported by the PI spec, but this is unlikely to ever change since other platforms undoubtedly exist that depend on this behavior as well. Signed-off-by: Ard Biesheuvel --- This is a preparatory patch to ensure that this platform does not break when core EDK2 drops the EfiBootManagerConnectAll() from the ArmPkg version of PlatformBootManagerLib. Platform/AMD/OverdriveBoard/OverdriveBoard.fdf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Platform/AMD/OverdriveBoard/OverdriveBoard.fdf b/Platform/AMD/= OverdriveBoard/OverdriveBoard.fdf index 851ae65b5be9..15b5b1bc317f 100644 --- a/Platform/AMD/OverdriveBoard/OverdriveBoard.fdf +++ b/Platform/AMD/OverdriveBoard/OverdriveBoard.fdf @@ -178,18 +178,18 @@ [FV.FvMain] INF MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf=0D INF MdeModulePkg/Bus/Usb/UsbKbDxe/UsbKbDxe.inf=0D =0D - #=0D - # SNP support=0D - #=0D - INF Silicon/AMD/Styx/AmdModulePkg/SnpDxe/SnpDxePort0.inf=0D - INF Silicon/AMD/Styx/AmdModulePkg/SnpDxe/SnpDxePort1.inf=0D -=0D #=0D # Networking stack=0D #=0D !include NetworkPkg/Network.fdf.inc=0D INF MdeModulePkg/Universal/Disk/RamDiskDxe/RamDiskDxe.inf=0D =0D + #=0D + # SNP support=0D + #=0D + INF Silicon/AMD/Styx/AmdModulePkg/SnpDxe/SnpDxePort0.inf=0D + INF Silicon/AMD/Styx/AmdModulePkg/SnpDxe/SnpDxePort1.inf=0D +=0D #=0D # Core Info=0D #=0D --=20 2.26.2