p2371-2180: Pass Ethernet MAC to the kernel
authorThierry Reding <treding@nvidia.com>
Mon, 15 Apr 2019 09:32:33 +0000 (11:32 +0200)
committerTom Warren <twarren@nvidia.com>
Wed, 5 Jun 2019 16:16:35 +0000 (09:16 -0700)
Pass the ethernet MAC address to the kernel upon boot. This passes both
the local-mac-address property (as passed to U-Boot from cboot) and the
currently set MAC address via the mac-address property. The latter will
only be set if it is different from the address that was already passed
via the local-mac-address property.

Signed-off-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Tom Warren <twarren@nvidia.com>
board/nvidia/p2371-2180/p2371-2180.c
configs/p2371-2180_defconfig

index 212037da5ac03ccd32e51b9380080213220605db..a444d692d7ea797470e1a6dc9a48d8dc8a208251 100644 (file)
@@ -5,9 +5,12 @@
  */
 
 #include <common.h>
+#include <environment.h>
 #include <i2c.h>
+#include <linux/libfdt.h>
 #include <asm/arch/gpio.h>
 #include <asm/arch/pinmux.h>
+#include <asm/arch-tegra/cboot.h>
 #include "../p2571/max77620_init.h"
 #include "pinmux-config-p2371-2180.h"
 
@@ -94,3 +97,50 @@ int tegra_pcie_board_init(void)
        return 0;
 }
 #endif /* PCI */
+
+static void ft_mac_address_setup(void *fdt)
+{
+       const void *cboot_fdt = (const void *)cboot_boot_x0;
+       uint8_t mac[ETH_ALEN], local_mac[ETH_ALEN];
+       const char *path;
+       int offset, err;
+
+       err = cboot_get_ethaddr(cboot_fdt, local_mac);
+       if (err < 0)
+               memset(local_mac, 0, ETH_ALEN);
+
+       path = fdt_get_alias(fdt, "ethernet");
+       if (!path)
+               return;
+
+       debug("ethernet alias found: %s\n", path);
+
+       offset = fdt_path_offset(fdt, path);
+       if (offset < 0) {
+               printf("ethernet alias points to absent node %s\n", path);
+               return;
+       }
+
+       if (is_valid_ethaddr(local_mac)) {
+               err = fdt_setprop(fdt, offset, "local-mac-address", local_mac,
+                                 ETH_ALEN);
+               if (!err)
+                       debug("Local MAC address set: %pM\n", local_mac);
+       }
+
+       if (eth_env_get_enetaddr("ethaddr", mac)) {
+               if (memcmp(local_mac, mac, ETH_ALEN) != 0) {
+                       err = fdt_setprop(fdt, offset, "mac-address", mac,
+                                         ETH_ALEN);
+                       if (!err)
+                               debug("MAC address set: %pM\n", mac);
+               }
+       }
+}
+
+int ft_board_setup(void *fdt, bd_t *bd)
+{
+       ft_mac_address_setup(fdt);
+
+       return 0;
+}
index 2fa2fbb5edaac73c2cdb8bee17be910c49fcfcf8..2a21ff1dd08c11df01c724899d33abddfa0ce0de 100644 (file)
@@ -5,6 +5,7 @@ CONFIG_NR_DRAM_BANKS=2
 CONFIG_TEGRA210=y
 CONFIG_TARGET_P2371_2180=y
 CONFIG_OF_SYSTEM_SETUP=y
+CONFIG_OF_BOARD_SETUP=y
 CONFIG_CONSOLE_MUX=y
 CONFIG_SYS_STDIO_DEREGISTER=y
 CONFIG_SYS_PROMPT="Tegra210 (P2371-2180) # "