summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Warren <swarren@nvidia.com>2016-09-12 11:51:13 -0600
committerJoe Hershberger <joe.hershberger@ni.com>2016-11-07 11:28:16 -0600
commit2b950f3aea8a3a222de661e99b8a4a029dbb9cca (patch)
tree830d380654baaca4525835ff092d5c6d21e8a20d
parent86919a23060ca0628242aa022a1268d26d29b4e1 (diff)
ARM: tegra: configure Ethernet address on Tegra186
On Tegra186, the bootloader which runs before U-Boot passes the Ethernet MAC address to U-Boot using device tree. Extract this value and write it to the environment, so that the Ethernet uclass picks it up and uses it for the built-in Ethernet device. Signed-off-by: Stephen Warren <swarren@nvidia.com> Reviewed-by: Simon Glass <sjg@chromium.org> Acked-by: Joe Hershberger <joe.hershberger@ni.com>
-rw-r--r--arch/arm/mach-tegra/tegra186/Makefile1
-rw-r--r--arch/arm/mach-tegra/tegra186/nvtboot_board.c54
2 files changed, 55 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/tegra186/Makefile b/arch/arm/mach-tegra/tegra186/Makefile
index 7f46a057bc..56f3378ece 100644
--- a/arch/arm/mach-tegra/tegra186/Makefile
+++ b/arch/arm/mach-tegra/tegra186/Makefile
@@ -4,5 +4,6 @@
obj-y += ../board186.o
obj-y += cache.o
+obj-y += nvtboot_board.o
obj-y += nvtboot_ll.o
obj-y += nvtboot_mem.o
diff --git a/arch/arm/mach-tegra/tegra186/nvtboot_board.c b/arch/arm/mach-tegra/tegra186/nvtboot_board.c
new file mode 100644
index 0000000000..1d78346f98
--- /dev/null
+++ b/arch/arm/mach-tegra/tegra186/nvtboot_board.c
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2016, NVIDIA CORPORATION.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+
+#include <common.h>
+#include <fdt_support.h>
+#include <fdtdec.h>
+#include <asm/arch/tegra.h>
+
+extern unsigned long nvtboot_boot_x0;
+
+/*
+ * Attempt to use /chosen/nvidia,ether-mac in the nvtboot DTB to U-Boot's
+ * ethaddr environment variable if possible.
+ */
+static int set_ethaddr_from_nvtboot(void)
+{
+ const void *nvtboot_blob = (void *)nvtboot_boot_x0;
+ int ret, node, len;
+ const u32 *prop;
+
+ /* Already a valid address in the environment? If so, keep it */
+ if (getenv("ethaddr"))
+ return 0;
+
+ node = fdt_path_offset(nvtboot_blob, "/chosen");
+ if (node < 0) {
+ printf("Can't find /chosen node in nvtboot DTB\n");
+ return node;
+ }
+ prop = fdt_getprop(nvtboot_blob, node, "nvidia,ether-mac", &len);
+ if (!prop) {
+ printf("Can't find nvidia,ether-mac property in nvtboot DTB\n");
+ return -ENOENT;
+ }
+
+ ret = setenv("ethaddr", (void *)prop);
+ if (ret) {
+ printf("Failed to set ethaddr from nvtboot DTB: %d\n", ret);
+ return ret;
+ }
+
+ return 0;
+}
+
+int tegra_soc_board_init_late(void)
+{
+ /* Ignore errors here; not all cases care about Ethernet addresses */
+ set_ethaddr_from_nvtboot();
+
+ return 0;
+}