xref: /rk3399_rockchip-uboot/arch/arm/mach-tegra/tegra186/nvtboot_board.c (revision 00caae6d47645e68d6e5277aceb69592b49381a6)
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