[edk2-devel] [PATCH edk2-platforms v3 6/8] Platform/RaspberryPi4: Register GENET platform device protocol

Ard Biesheuvel ard.biesheuvel at arm.com
Tue May 12 16:41:23 UTC 2020


Register an event at EndOfDxe to instantiate the EFI device path protocol
with the GENET MAC address on a new handle, and install the
BcmGenetPlatformDeviceProtocol on that handle. This protocol is used to
pass platform information (GENET MAC address and register base address)
to the GENET driver, which will consume this in its implementation of the
UEFI driver model Supported/Start/Stop methods.

Co-authored-by: Samer El-Haj-Mahmoud <samer.el-haj-mahmoud at arm.com>
Co-authored-by: Ard Biesheuvel <ard.biesheuvel at arm.com>
Co-authored-by: Andrei Warkentin <awarkentin at vmware.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel at arm.com>
---
 Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf |  8 +-
 Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c   | 91 +++++++++++++++++++-
 2 files changed, 95 insertions(+), 4 deletions(-)

diff --git a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf
index 44b5cc2294d0..f20f3bcc1243 100644
--- a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf
+++ b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf
@@ -23,7 +23,6 @@ [Defines]
 #
 #  VALID_ARCHITECTURES           = AARCH64
 #
-
 [Sources]
   ConfigDxe.c
   ConfigDxeFormSetGuid.h
@@ -57,10 +56,12 @@ [LibraryClasses]
 
 [Guids]
   gConfigDxeFormSetGuid
+  gEfiEndOfDxeEventGroupGuid
 
 [Protocols]
-  gRaspberryPiFirmwareProtocolGuid      ## CONSUMES
-  gRaspberryPiConfigAppliedProtocolGuid ## PRODUCES
+  gBcmGenetPlatformDeviceProtocolGuid             ## PRODUCES
+  gRaspberryPiFirmwareProtocolGuid                ## CONSUMES
+  gRaspberryPiConfigAppliedProtocolGuid           ## PRODUCES
 
 [FixedPcd]
   gRaspberryPiTokenSpaceGuid.PcdCpuLowSpeedMHz
@@ -69,6 +70,7 @@ [FixedPcd]
 
 [Pcd]
   gBcm27xxTokenSpaceGuid.PcdBcm27xxRegistersAddress
+  gBcm27xxTokenSpaceGuid.PcdBcmGenetRegistersAddress
   gBcm283xTokenSpaceGuid.PcdBcm283xRegistersAddress
   gRaspberryPiTokenSpaceGuid.PcdCpuClock
   gRaspberryPiTokenSpaceGuid.PcdCustomCpuClock
diff --git a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c
index df82902e8958..ac1004fe1836 100644
--- a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c
+++ b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c
@@ -22,6 +22,7 @@
 #include <Library/NetLib.h>
 #include <Library/UefiBootServicesTableLib.h>
 #include <Library/UefiRuntimeServicesTableLib.h>
+#include <Protocol/BcmGenetPlatformDevice.h>
 #include <Protocol/RpiFirmware.h>
 #include <ConfigVars.h>
 #include "ConfigDxeFormSetGuid.h"
@@ -35,6 +36,8 @@ STATIC RASPBERRY_PI_FIRMWARE_PROTOCOL *mFwProtocol;
 STATIC UINT32 mModelFamily = 0;
 STATIC UINT32 mModelInstalledMB = 0;
 
+STATIC EFI_MAC_ADDRESS  mMacAddress;
+
 /*
  * The GUID inside Platform/RaspberryPi/RPi3/AcpiTables/AcpiTables.inf and
  * Platform/RaspberryPi/RPi4/AcpiTables/AcpiTables.inf _must_ match below.
@@ -48,6 +51,18 @@ typedef struct {
   EFI_DEVICE_PATH_PROTOCOL End;
 } HII_VENDOR_DEVICE_PATH;
 
+#pragma pack (1)
+typedef struct {
+  MAC_ADDR_DEVICE_PATH            MacAddrDP;
+  EFI_DEVICE_PATH_PROTOCOL        End;
+} GENET_DEVICE_PATH;
+
+typedef struct {
+  GENET_DEVICE_PATH                   DevicePath;
+  BCM_GENET_PLATFORM_DEVICE_PROTOCOL  PlatformDevice;
+} GENET_DEVICE;
+#pragma pack ()
+
 STATIC HII_VENDOR_DEVICE_PATH mVendorDevicePath = {
   {
     {
@@ -70,6 +85,65 @@ STATIC HII_VENDOR_DEVICE_PATH mVendorDevicePath = {
   }
 };
 
+STATIC GENET_DEVICE mGenetDevice = {
+  {
+    {
+      {
+        MESSAGING_DEVICE_PATH,
+        MSG_MAC_ADDR_DP,
+        {
+          (UINT8)(sizeof (MAC_ADDR_DEVICE_PATH)),
+          (UINT8)((sizeof (MAC_ADDR_DEVICE_PATH)) >> 8)
+        }
+      },
+      {{ 0 }},
+      NET_IFTYPE_ETHERNET
+    },
+    {
+      END_DEVICE_PATH_TYPE,
+      END_ENTIRE_DEVICE_PATH_SUBTYPE,
+      {
+        sizeof (EFI_DEVICE_PATH_PROTOCOL),
+        0
+      }
+    }
+  },
+  {
+    GENET_BASE_ADDRESS,
+    {{ 0 }}
+  }
+};
+
+
+STATIC
+VOID
+EFIAPI
+RegisterDevices (
+  EFI_EVENT           Event,
+  VOID                *Context
+  )
+{
+  EFI_HANDLE  Handle;
+  EFI_STATUS  Status;
+
+  if (mModelFamily == 4) {
+    DEBUG ((DEBUG_INFO, "GENET: MAC address %02X:%02X:%02X:%02X:%02X:%02X\n",
+            mMacAddress.Addr[0], mMacAddress.Addr[1], mMacAddress.Addr[2],
+            mMacAddress.Addr[3], mMacAddress.Addr[4], mMacAddress.Addr[5]));
+
+    CopyMem (&mGenetDevice.DevicePath.MacAddrDP.MacAddress, mMacAddress.Addr,
+      NET_ETHER_ADDR_LEN);
+    CopyMem (&mGenetDevice.PlatformDevice.MacAddress, mMacAddress.Addr,
+      NET_ETHER_ADDR_LEN);
+
+    Handle = NULL;
+    Status = gBS->InstallMultipleProtocolInterfaces (&Handle,
+                    &gEfiDevicePathProtocolGuid,          &mGenetDevice.DevicePath,
+                    &gBcmGenetPlatformDeviceProtocolGuid, &mGenetDevice.PlatformDevice,
+                    NULL);
+    ASSERT_EFI_ERROR (Status);
+  }
+}
 
 STATIC EFI_STATUS
 InstallHiiPages (
@@ -243,6 +317,16 @@ SetupVariables (
     PcdSet32 (PcdDisplayEnableSShot, PcdGet32 (PcdDisplayEnableSShot));
   }
 
+  if (mModelFamily == 4) {
+    //
+    // Get the MAC address from the firmware.
+    //
+    Status = mFwProtocol->GetMacAddress (mMacAddress.Addr);
+    if (EFI_ERROR (Status)) {
+      DEBUG ((DEBUG_WARN, "%a: failed to retrieve MAC address\n", __FUNCTION__));
+    }
+  }
+
   return EFI_SUCCESS;
 }
 
@@ -449,7 +533,8 @@ ConfigInitialize (
   IN EFI_SYSTEM_TABLE *SystemTable
   )
 {
-  EFI_STATUS Status;
+  EFI_STATUS                      Status;
+  EFI_EVENT                       EndOfDxeEvent;
 
   Status = gBS->LocateProtocol (&gRaspberryPiFirmwareProtocolGuid,
                   NULL, (VOID**)&mFwProtocol);
@@ -495,5 +580,9 @@ ConfigInitialize (
      ASSERT_EFI_ERROR (Status);
   }
 
+  Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_NOTIFY, RegisterDevices,
+                  NULL, &gEfiEndOfDxeEventGroupGuid, &EndOfDxeEvent);
+  ASSERT_EFI_ERROR (Status);
+
   return EFI_SUCCESS;
 }
-- 
2.17.1


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#59303): https://edk2.groups.io/g/devel/message/59303
Mute This Topic: https://groups.io/mt/74162669/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-




More information about the edk2-devel-archive mailing list