[edk2-devel] [edk2-platforms: PATCHv2 1/1] Platform/RPi3: Provide "ethernet[0]" aliases in device tree

Michael Brown mbrown at fensystems.co.uk
Wed Jul 24 14:31:14 UTC 2019


Older device trees tend to use the alias "ethernet".  Newer device
trees tend to use "ethernet0" since older versions of U-Boot would
skip aliases that do not include an index number.  See, for example,
Linux kernel commit 10b6c0c ("ARM: dts: bcm2835: add index to the
ethernet alias") and U-Boot commit f8e57c6 ("fdt_support: Fixup
'ethernet' aliases not ending in digits").

Ensure that both "ethernet" and "ethernet0" aliases are present within
the device tree, to provide compatibility with operating systems that
expect either alias, and with device trees that contain either (or
both) aliases.

Signed-off-by: Michael Brown <mbrown at fensystems.co.uk>
---
 .../RaspberryPi/RPi3/Drivers/FdtDxe/FdtDxe.c  | 64 +++++++++++++++++++
 1 file changed, 64 insertions(+)

diff --git a/Platform/RaspberryPi/RPi3/Drivers/FdtDxe/FdtDxe.c b/Platform/RaspberryPi/RPi3/Drivers/FdtDxe/FdtDxe.c
index 83446e3e45..57e4bee8da 100644
--- a/Platform/RaspberryPi/RPi3/Drivers/FdtDxe/FdtDxe.c
+++ b/Platform/RaspberryPi/RPi3/Drivers/FdtDxe/FdtDxe.c
@@ -23,6 +23,69 @@ STATIC VOID                             *mFdtImage;
 
 STATIC RASPBERRY_PI_FIRMWARE_PROTOCOL   *mFwProtocol;
 
+STATIC
+VOID
+FixEthernetAliases (
+  VOID
+)
+{
+  INTN          Aliases;
+  CONST CHAR8   *Ethernet;
+  CONST CHAR8   *Ethernet0;
+  CONST CHAR8   *Alias;
+  UINTN         CopySize;
+  CHAR8         *Copy;
+  INTN          Retval;
+
+  //
+  // Look up the 'ethernet[0]' aliases
+  //
+  Aliases = fdt_path_offset (mFdtImage, "/aliases");
+  if (Aliases < 0) {
+    DEBUG ((DEBUG_ERROR, "%a: failed to locate '/aliases'\n", __FUNCTION__));
+    return;
+  }
+  Ethernet = fdt_getprop (mFdtImage, Aliases, "ethernet", NULL);
+  Ethernet0 = fdt_getprop (mFdtImage, Aliases, "ethernet0", NULL);
+  Alias = Ethernet ? Ethernet : Ethernet0;
+  if (!Alias) {
+    DEBUG ((DEBUG_ERROR, "%a: failed to locate 'ethernet[0]' alias\n", __FUNCTION__));
+    return;
+  }
+
+  //
+  // Create copy for fdt_setprop
+  //
+  CopySize = AsciiStrSize (Alias);
+  Copy = AllocateCopyPool (CopySize, Alias);
+  if (!Copy) {
+    DEBUG ((DEBUG_ERROR, "%a: failed to copy '%a'\n", __FUNCTION__, Alias));
+    return;
+  }
+
+  //
+  // Create missing aliases
+  //
+  if (!Ethernet) {
+    Retval = fdt_setprop (mFdtImage, Aliases, "ethernet", Copy, CopySize);
+    if (Retval != 0) {
+      DEBUG ((DEBUG_ERROR, "%a: failed to create 'ethernet' alias (%d)\n",
+        __FUNCTION__, Retval));
+    }
+    DEBUG ((DEBUG_INFO, "%a: created 'ethernet' alias '%a'\n", __FUNCTION__, Copy));
+  }
+  if (!Ethernet0) {
+    Retval = fdt_setprop (mFdtImage, Aliases, "ethernet0", Copy, CopySize);
+    if (Retval != 0) {
+      DEBUG ((DEBUG_ERROR, "%a: failed to create 'ethernet0' alias (%d)\n",
+        __FUNCTION__, Retval));
+    }
+    DEBUG ((DEBUG_INFO, "%a: created 'ethernet0' alias '%a'\n", __FUNCTION__, Copy));
+  }
+
+  FreePool (Copy);
+}
+
 STATIC
 VOID
 UpdateMacAddress (
@@ -342,6 +405,7 @@ FdtDxeInitialize (
   SanitizePSCI ();
   CleanMemoryNodes ();
   CleanSimpleFramebuffer ();
+  FixEthernetAliases ();
   UpdateMacAddress ();
   if (Internal) {
     /*
-- 
2.21.0


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

View/Reply Online (#44319): https://edk2.groups.io/g/devel/message/44319
Mute This Topic: https://groups.io/mt/32585981/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