From 2b950f3aea8a3a222de661e99b8a4a029dbb9cca Mon Sep 17 00:00:00 2001 From: Stephen Warren Date: Mon, 12 Sep 2016 11:51:13 -0600 Subject: [PATCH] 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 Reviewed-by: Simon Glass Acked-by: Joe Hershberger --- arch/arm/mach-tegra/tegra186/Makefile | 1 + arch/arm/mach-tegra/tegra186/nvtboot_board.c | 54 ++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 arch/arm/mach-tegra/tegra186/nvtboot_board.c 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 +#include +#include +#include + +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; +} -- 2.39.5