12b950f3aSStephen Warren /*
22b950f3aSStephen Warren * Copyright (c) 2016, NVIDIA CORPORATION.
32b950f3aSStephen Warren *
42b950f3aSStephen Warren * SPDX-License-Identifier: GPL-2.0+
52b950f3aSStephen Warren */
62b950f3aSStephen Warren
72b950f3aSStephen Warren #include <common.h>
82b950f3aSStephen Warren #include <fdt_support.h>
92b950f3aSStephen Warren #include <fdtdec.h>
102b950f3aSStephen Warren #include <asm/arch/tegra.h>
112b950f3aSStephen Warren
122b950f3aSStephen Warren extern unsigned long nvtboot_boot_x0;
132b950f3aSStephen Warren
set_fdt_addr(void)14a182e69dSStephen Warren static int set_fdt_addr(void)
15a182e69dSStephen Warren {
16a182e69dSStephen Warren int ret;
17a182e69dSStephen Warren
18018f5303SSimon Glass ret = env_set_hex("fdt_addr", nvtboot_boot_x0);
19a182e69dSStephen Warren if (ret) {
20a182e69dSStephen Warren printf("Failed to set fdt_addr to point at DTB: %d\n", ret);
21a182e69dSStephen Warren return ret;
22a182e69dSStephen Warren }
23a182e69dSStephen Warren
24a182e69dSStephen Warren return 0;
25a182e69dSStephen Warren }
26a182e69dSStephen Warren
272b950f3aSStephen Warren /*
282b950f3aSStephen Warren * Attempt to use /chosen/nvidia,ether-mac in the nvtboot DTB to U-Boot's
292b950f3aSStephen Warren * ethaddr environment variable if possible.
302b950f3aSStephen Warren */
set_ethaddr_from_nvtboot(void)312b950f3aSStephen Warren static int set_ethaddr_from_nvtboot(void)
322b950f3aSStephen Warren {
332b950f3aSStephen Warren const void *nvtboot_blob = (void *)nvtboot_boot_x0;
342b950f3aSStephen Warren int ret, node, len;
352b950f3aSStephen Warren const u32 *prop;
362b950f3aSStephen Warren
372b950f3aSStephen Warren /* Already a valid address in the environment? If so, keep it */
38*00caae6dSSimon Glass if (env_get("ethaddr"))
392b950f3aSStephen Warren return 0;
402b950f3aSStephen Warren
412b950f3aSStephen Warren node = fdt_path_offset(nvtboot_blob, "/chosen");
422b950f3aSStephen Warren if (node < 0) {
432b950f3aSStephen Warren printf("Can't find /chosen node in nvtboot DTB\n");
442b950f3aSStephen Warren return node;
452b950f3aSStephen Warren }
462b950f3aSStephen Warren prop = fdt_getprop(nvtboot_blob, node, "nvidia,ether-mac", &len);
472b950f3aSStephen Warren if (!prop) {
482b950f3aSStephen Warren printf("Can't find nvidia,ether-mac property in nvtboot DTB\n");
492b950f3aSStephen Warren return -ENOENT;
502b950f3aSStephen Warren }
512b950f3aSStephen Warren
52382bee57SSimon Glass ret = env_set("ethaddr", (void *)prop);
532b950f3aSStephen Warren if (ret) {
542b950f3aSStephen Warren printf("Failed to set ethaddr from nvtboot DTB: %d\n", ret);
552b950f3aSStephen Warren return ret;
562b950f3aSStephen Warren }
572b950f3aSStephen Warren
582b950f3aSStephen Warren return 0;
592b950f3aSStephen Warren }
602b950f3aSStephen Warren
tegra_soc_board_init_late(void)612b950f3aSStephen Warren int tegra_soc_board_init_late(void)
622b950f3aSStephen Warren {
63a182e69dSStephen Warren /*
64a182e69dSStephen Warren * Ignore errors here; the value may not be used depending on
65a182e69dSStephen Warren * extlinux.conf or boot script content.
66a182e69dSStephen Warren */
67a182e69dSStephen Warren set_fdt_addr();
682b950f3aSStephen Warren /* Ignore errors here; not all cases care about Ethernet addresses */
692b950f3aSStephen Warren set_ethaddr_from_nvtboot();
702b950f3aSStephen Warren
712b950f3aSStephen Warren return 0;
722b950f3aSStephen Warren }
73