[PATCH 6/6] board: phytec: common: k3: Apply SoM-specific overlays to OS device tree
Neha Malcom Francis
n-francis at ti.com
Mon Nov 4 05:48:30 CET 2024
On 30/10/24 22:18, Wadim Egorov wrote:
> Our SoMs are available in multiple configurations, managed via device
> tree overlays. To determine the specific variant in use, we read the
> EEPROM and apply the appropriate overlays during boot to the device tree
> used by the OS.
>
> Signed-off-by: Wadim Egorov <w.egorov at phytec.de>
> ---
> board/phytec/common/k3/board.c | 73 ++++++++++++++++++++++++++++++++++
> 1 file changed, 73 insertions(+)
>
> diff --git a/board/phytec/common/k3/board.c b/board/phytec/common/k3/board.c
> index 3d7e090ccaa..346b2b6491a 100644
> --- a/board/phytec/common/k3/board.c
> +++ b/board/phytec/common/k3/board.c
> @@ -6,7 +6,9 @@
>
> #include <env_internal.h>
> #include <fdt_support.h>
> +#include <dm/ofnode.h>
> #include <spl.h>
> +#include <malloc.h>
> #include <asm/arch/hardware.h>
>
> #include "../am6_som_detection.h"
> @@ -97,8 +99,79 @@ int board_late_init(void)
> #endif
>
> #if IS_ENABLED(CONFIG_OF_LIBFDT) && IS_ENABLED(CONFIG_OF_BOARD_SETUP)
> +static int fdt_apply_overlay_from_fit(const char *overlay_path, void *fdt)
> +{
> + u64 loadaddr;
> + ofnode node;
> + int ret;
> +
> + node = ofnode_path(overlay_path);
> + if (!ofnode_valid(node))
> + return -FDT_ERR_NOTFOUND;
> +
> + ret = ofnode_read_u64(node, "load", &loadaddr);
> + if (ret)
> + return ret;
> +
> + return fdt_overlay_apply_verbose(fdt, (void *)loadaddr);
> +}
> +
> +static void fdt_apply_som_overlays(void *blob)
> +{
> + void *fdt_copy;
> + u32 fdt_size;
> + struct phytec_eeprom_data data;
> + int err;
> +
> + fdt_size = fdt_totalsize(blob);
> + fdt_copy = malloc(fdt_size);
> + if (!fdt_copy)
> + goto fixup_error;
> +
> + memcpy(fdt_copy, blob, fdt_size);
> +
> + err = phytec_eeprom_data_setup(&data, 0, EEPROM_ADDR);
> + if (err)
> + goto fixup_error;
> +
> + if (phytec_get_am6_rtc(&data) == 0) {
> + err = fdt_apply_overlay_from_fit("/fit-images/som-no-rtc", fdt_copy);
> + if (err)
> + goto fixup_error;
> + }
> +
> + if (phytec_get_am6_spi(&data) == PHYTEC_EEPROM_VALUE_X) {
> + err = fdt_apply_overlay_from_fit("/fit-images/som-no-spi", fdt_copy);
> + if (err)
> + goto fixup_error;
> + }
> +
> + if (phytec_get_am6_eth(&data) == 0) {
> + err = fdt_apply_overlay_from_fit("/fit-images/som-no-eth", fdt_copy);
> + if (err)
> + goto fixup_error;
> + }
> +
> + if (phytec_am6_is_qspi(&data)) {
> + err = fdt_apply_overlay_from_fit("/fit-images/som-qspi-nor", fdt_copy);
> + if (err)
> + goto fixup_error;
> + }
> +
> + memcpy(blob, fdt_copy, fdt_size);
> +
> +cleanup:
> + free(fdt_copy);
> + return;
> +
> +fixup_error:
> + pr_err("Failed to apply SoM overlays\n");
> + goto cleanup;
> +}
> +
> int ft_board_setup(void *blob, struct bd_info *bd)
> {
> + fdt_apply_som_overlays(blob);
> fdt_copy_fixed_partitions(blob);
>
> return 0;
Acked-by: Neha Malcom Francis <n-francis at ti.com>
--
Thanking You
Neha Malcom Francis
More information about the U-Boot
mailing list