diff options
author | Thierry Reding <treding@nvidia.com> | 2021-09-03 15:16:24 +0200 |
---|---|---|
committer | Tom Warren <twarren@nvidia.com> | 2021-10-13 14:18:30 -0700 |
commit | 77409c7f83622a71060bf78142149d39540ba405 (patch) | |
tree | a938476a6e8ca81c75c133582fa19f1279de3a66 /board/nvidia | |
parent | f814ff5e0b10a0b6a1b303a849e68f302f0d8627 (diff) | |
download | u-boot-77409c7f83622a71060bf78142149d39540ba405.tar.gz |
ARM: tegra: Refactor DT update helpers
Rather than duplicate the Ethernet MAC address and carveout updating
code for each board, move it to a common location and make it more
reusable.
Signed-off-by: Thierry Reding <treding@nvidia.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Tom Warren <twarren@nvidia.com>
Diffstat (limited to 'board/nvidia')
-rw-r--r-- | board/nvidia/p2371-2180/p2371-2180.c | 123 | ||||
-rw-r--r-- | board/nvidia/p2771-0000/p2771-0000.c | 126 | ||||
-rw-r--r-- | board/nvidia/p3450-0000/p3450-0000.c | 127 |
3 files changed, 21 insertions, 355 deletions
diff --git a/board/nvidia/p2371-2180/p2371-2180.c b/board/nvidia/p2371-2180/p2371-2180.c index cd5dc2de629..816c7bec6ae 100644 --- a/board/nvidia/p2371-2180/p2371-2180.c +++ b/board/nvidia/p2371-2180/p2371-2180.c @@ -15,7 +15,7 @@ #include <linux/libfdt.h> #include <asm/arch/gpio.h> #include <asm/arch/pinmux.h> -#include <asm/arch-tegra/cboot.h> +#include <asm/arch-tegra/board.h> #include "../p2571/max77620_init.h" void pin_mux_mmc(void) @@ -84,125 +84,16 @@ int tegra_pcie_board_init(void) } #endif /* PCI */ -static void ft_mac_address_setup(void *fdt) -{ - const void *cboot_fdt = (const void *)cboot_boot_x0; - uint8_t mac[ETH_ALEN], local_mac[ETH_ALEN]; - const char *path; - int offset, err; - - err = cboot_get_ethaddr(cboot_fdt, local_mac); - if (err < 0) - memset(local_mac, 0, ETH_ALEN); - - path = fdt_get_alias(fdt, "ethernet"); - if (!path) - return; - - debug("ethernet alias found: %s\n", path); - - offset = fdt_path_offset(fdt, path); - if (offset < 0) { - printf("ethernet alias points to absent node %s\n", path); - return; - } - - if (is_valid_ethaddr(local_mac)) { - err = fdt_setprop(fdt, offset, "local-mac-address", local_mac, - ETH_ALEN); - if (!err) - debug("Local MAC address set: %pM\n", local_mac); - } - - if (eth_env_get_enetaddr("ethaddr", mac)) { - if (memcmp(local_mac, mac, ETH_ALEN) != 0) { - err = fdt_setprop(fdt, offset, "mac-address", mac, - ETH_ALEN); - if (!err) - debug("MAC address set: %pM\n", mac); - } - } -} - -static int ft_copy_carveout(void *dst, const void *src, const char *node) -{ - unsigned int index = 0; - int err; - - while (true) { - const char **compatibles = NULL; - unsigned int num_compatibles; - struct fdt_memory carveout; - unsigned long flags; - char *copy = NULL; - const char *name; - - err = fdtdec_get_carveout(src, node, "memory-region", index, - &carveout, &name, &compatibles, - &num_compatibles, &flags); - if (err < 0) { - if (err != -FDT_ERR_NOTFOUND) - printf("failed to get carveout for %s: %d\n", - node, err); - - return err; - } - - if (name) { - const char *ptr = strchr(name, '@'); - - if (ptr) { - copy = strndup(name, ptr - name); - name = copy; - } - } else { - name = "carveout"; - } - - err = fdtdec_set_carveout(dst, node, "memory-region", index, - &carveout, name, compatibles, - num_compatibles, flags); - if (err < 0) { - printf("failed to set carveout for %s: %d\n", node, - err); - return err; - } - - if (copy) - free(copy); - - index++; - } - - return 0; -} - -static void ft_carveout_setup(void *fdt) -{ - const void *cboot_fdt = (const void *)cboot_boot_x0; - static const char * const nodes[] = { - "/host1x@50000000/dc@54200000", - "/host1x@50000000/dc@54240000", - "/external-memory-controller@7001b000", - }; - unsigned int i; - int err; - - for (i = 0; i < ARRAY_SIZE(nodes); i++) { - err = ft_copy_carveout(fdt, cboot_fdt, nodes[i]); - if (err < 0) { - if (err != -FDT_ERR_NOTFOUND) - printf("failed to copy carveout for %s: %d\n", - nodes[i], err); - continue; - } - } -} +static const char * const nodes[] = { + "/host1x@50000000/dc@54200000", + "/host1x@50000000/dc@54240000", + "/external-memory-controller@7001b000", +}; int ft_board_setup(void *fdt, struct bd_info *bd) { ft_mac_address_setup(fdt); - ft_carveout_setup(fdt); + ft_carveout_setup(fdt, nodes, ARRAY_SIZE(nodes)); return 0; } diff --git a/board/nvidia/p2771-0000/p2771-0000.c b/board/nvidia/p2771-0000/p2771-0000.c index 46c36a22db5..5ff89c45423 100644 --- a/board/nvidia/p2771-0000/p2771-0000.c +++ b/board/nvidia/p2771-0000/p2771-0000.c @@ -11,7 +11,7 @@ #include <net.h> #include <stdlib.h> #include <linux/libfdt.h> -#include <asm/arch-tegra/cboot.h> +#include <asm/arch-tegra/board.h> #include "../p2571/max77620_init.h" void pin_mux_mmc(void) @@ -60,128 +60,16 @@ int tegra_pcie_board_init(void) } #endif -static void ft_mac_address_setup(void *fdt) -{ - const void *cboot_fdt = (const void *)cboot_boot_x0; - uint8_t mac[ETH_ALEN], local_mac[ETH_ALEN]; - const char *path; - int offset, err; - - err = cboot_get_ethaddr(cboot_fdt, local_mac); - if (err < 0) - memset(local_mac, 0, ETH_ALEN); - - path = fdt_get_alias(fdt, "ethernet"); - if (!path) - return; - - debug("ethernet alias found: %s\n", path); - - offset = fdt_path_offset(fdt, path); - if (offset < 0) { - printf("ethernet alias points to absent node %s\n", path); - return; - } - - if (is_valid_ethaddr(local_mac)) { - err = fdt_setprop(fdt, offset, "local-mac-address", local_mac, - ETH_ALEN); - if (!err) - debug("Local MAC address set: %pM\n", local_mac); - } - - if (eth_env_get_enetaddr("ethaddr", mac)) { - if (memcmp(local_mac, mac, ETH_ALEN) != 0) { - err = fdt_setprop(fdt, offset, "mac-address", mac, - ETH_ALEN); - if (!err) - debug("MAC address set: %pM\n", mac); - } - } -} - -static int ft_copy_carveout(void *dst, const void *src, const char *node) -{ - unsigned int index = 0; - int err; - - while (true) { - const char **compatibles = NULL; - unsigned int num_compatibles; - struct fdt_memory carveout; - unsigned long flags; - char *copy = NULL; - const char *name; - - err = fdtdec_get_carveout(src, node, "memory-region", index, - &carveout, &name, &compatibles, - &num_compatibles, &flags); - if (err < 0) { - if (err != -FDT_ERR_NOTFOUND) - printf("failed to get carveout for %s: %d\n", - node, err); - - return err; - } - - if (name) { - const char *ptr = strchr(name, '@'); - - if (ptr) { - copy = strndup(name, ptr - name); - name = copy; - } - } else { - name = "carveout"; - } - - err = fdtdec_set_carveout(dst, node, "memory-region", index, - &carveout, name, compatibles, - num_compatibles, flags); - if (err < 0) { - printf("failed to set carveout for %s: %d\n", node, - err); - return err; - } - - if (copy) - free(copy); - - index++; - } - - return 0; -} - -static void ft_carveout_setup(void *fdt) -{ - const void *cboot_fdt = (const void *)cboot_boot_x0; - static const char * const nodes[] = { - "/host1x@13e00000/display-hub@15200000/display@15200000", - "/host1x@13e00000/display-hub@15200000/display@15210000", - "/host1x@13e00000/display-hub@15200000/display@15220000", - }; - unsigned int i; - int err; - - for (i = 0; i < ARRAY_SIZE(nodes); i++) { - printf("copying carveout for %s...\n", nodes[i]); - - err = ft_copy_carveout(fdt, cboot_fdt, nodes[i]); - if (err < 0) { - if (err != -FDT_ERR_NOTFOUND) - printf("failed to copy carveout for %s: %d\n", - nodes[i], err); - - continue; - } - } -} +static const char * const nodes[] = { + "/host1x@13e00000/display-hub@15200000/display@15200000", + "/host1x@13e00000/display-hub@15200000/display@15210000", + "/host1x@13e00000/display-hub@15200000/display@15220000", +}; int ft_board_setup(void *fdt, struct bd_info *bd) { ft_mac_address_setup(fdt); - ft_carveout_setup(fdt); + ft_carveout_setup(fdt, nodes, ARRAY_SIZE(nodes)); return 0; } diff --git a/board/nvidia/p3450-0000/p3450-0000.c b/board/nvidia/p3450-0000/p3450-0000.c index ba575282658..fb1a224daa7 100644 --- a/board/nvidia/p3450-0000/p3450-0000.c +++ b/board/nvidia/p3450-0000/p3450-0000.c @@ -11,10 +11,9 @@ #include <linux/bitops.h> #include <linux/libfdt.h> #include <pca953x.h> -#include <stdlib.h> -#include <asm/arch-tegra/cboot.h> #include <asm/arch/gpio.h> #include <asm/arch/pinmux.h> +#include <asm/arch-tegra/board.h> #include "../p2571/max77620_init.h" void pin_mux_mmc(void) @@ -83,128 +82,16 @@ int tegra_pcie_board_init(void) } #endif /* PCI */ -static void ft_mac_address_setup(void *fdt) -{ - const void *cboot_fdt = (const void *)cboot_boot_x0; - uint8_t mac[ETH_ALEN], local_mac[ETH_ALEN]; - const char *path; - int offset, err; - - err = cboot_get_ethaddr(cboot_fdt, local_mac); - if (err < 0) - memset(local_mac, 0, ETH_ALEN); - - path = fdt_get_alias(fdt, "ethernet"); - if (!path) - return; - - debug("ethernet alias found: %s\n", path); - - offset = fdt_path_offset(fdt, path); - if (offset < 0) { - printf("ethernet alias points to absent node %s\n", path); - return; - } - - if (is_valid_ethaddr(local_mac)) { - err = fdt_setprop(fdt, offset, "local-mac-address", local_mac, - ETH_ALEN); - if (!err) - debug("Local MAC address set: %pM\n", local_mac); - } - - if (eth_env_get_enetaddr("ethaddr", mac)) { - if (memcmp(local_mac, mac, ETH_ALEN) != 0) { - err = fdt_setprop(fdt, offset, "mac-address", mac, - ETH_ALEN); - if (!err) - debug("MAC address set: %pM\n", mac); - } - } -} - -static int ft_copy_carveout(void *dst, const void *src, const char *node) -{ - unsigned int index = 0; - int err; - - while (true) { - const char **compatibles = NULL; - unsigned int num_compatibles; - struct fdt_memory carveout; - unsigned long flags; - char *copy = NULL; - const char *name; - - err = fdtdec_get_carveout(src, node, "memory-region", index, - &carveout, &name, &compatibles, - &num_compatibles, &flags); - if (err < 0) { - if (err != -FDT_ERR_NOTFOUND) - printf("failed to get carveout for %s: %d\n", - node, err); - - return err; - } - - if (name) { - const char *ptr = strchr(name, '@'); - - if (ptr) { - copy = strndup(name, ptr - name); - name = copy; - } - } else { - name = "carveout"; - } - - err = fdtdec_set_carveout(dst, node, "memory-region", index, - &carveout, name, compatibles, - num_compatibles, flags); - if (err < 0) { - printf("failed to set carveout for %s: %d\n", node, - err); - return err; - } - - if (copy) - free(copy); - - index++; - } - - return 0; -} - -static void ft_carveout_setup(void *fdt) -{ - const void *cboot_fdt = (const void *)cboot_boot_x0; - static const char * const nodes[] = { - "/host1x@50000000/dc@54200000", - "/host1x@50000000/dc@54240000", - "/external-memory-controller@7001b000", - }; - unsigned int i; - int err; - - for (i = 0; i < ARRAY_SIZE(nodes); i++) { - printf("copying carveout for %s...\n", nodes[i]); - - err = ft_copy_carveout(fdt, cboot_fdt, nodes[i]); - if (err < 0) { - if (err != -FDT_ERR_NOTFOUND) - printf("failed to copy carveout for %s: %d\n", - nodes[i], err); - - continue; - } - } -} +static const char * const nodes[] = { + "/host1x@50000000/dc@54200000", + "/host1x@50000000/dc@54240000", + "/external-memory-controller@7001b000", +}; int ft_board_setup(void *fdt, struct bd_info *bd) { ft_mac_address_setup(fdt); - ft_carveout_setup(fdt); + ft_carveout_setup(fdt, nodes, ARRAY_SIZE(nodes)); return 0; } |