blob: 1d78346f984300f1596ae54b3e752c235ebba4c1 [file] [log] [blame]
Stephen Warren2b950f32016-09-12 11:51:13 -06001/*
2 * Copyright (c) 2016, NVIDIA CORPORATION.
3 *
4 * SPDX-License-Identifier: GPL-2.0+
5 */
6
7#include <common.h>
8#include <fdt_support.h>
9#include <fdtdec.h>
10#include <asm/arch/tegra.h>
11
12extern unsigned long nvtboot_boot_x0;
13
14/*
15 * Attempt to use /chosen/nvidia,ether-mac in the nvtboot DTB to U-Boot's
16 * ethaddr environment variable if possible.
17 */
18static int set_ethaddr_from_nvtboot(void)
19{
20 const void *nvtboot_blob = (void *)nvtboot_boot_x0;
21 int ret, node, len;
22 const u32 *prop;
23
24 /* Already a valid address in the environment? If so, keep it */
25 if (getenv("ethaddr"))
26 return 0;
27
28 node = fdt_path_offset(nvtboot_blob, "/chosen");
29 if (node < 0) {
30 printf("Can't find /chosen node in nvtboot DTB\n");
31 return node;
32 }
33 prop = fdt_getprop(nvtboot_blob, node, "nvidia,ether-mac", &len);
34 if (!prop) {
35 printf("Can't find nvidia,ether-mac property in nvtboot DTB\n");
36 return -ENOENT;
37 }
38
39 ret = setenv("ethaddr", (void *)prop);
40 if (ret) {
41 printf("Failed to set ethaddr from nvtboot DTB: %d\n", ret);
42 return ret;
43 }
44
45 return 0;
46}
47
48int tegra_soc_board_init_late(void)
49{
50 /* Ignore errors here; not all cases care about Ethernet addresses */
51 set_ethaddr_from_nvtboot();
52
53 return 0;
54}