summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoão Paulo Gonçalves <[email protected]>2025-06-23 14:39:54 -0300
committerTom Rini <[email protected]>2025-07-09 08:40:03 -0600
commit2b7c6b6f3ca34970be61c5189d263f94f0c94917 (patch)
treeaaa76cd8eee3a6fdd0881e618505ecc72b8ab895
parentdbf7fd557a73ded3141db3c2cf5c572989378825 (diff)
boot: Make ft_board_setup_ex() generic
In some use cases, board-specific device tree changes must not be overwritten by system fixups. Although U-Boot provides ft_board_setup_ex() for this purpose, it is currently only used on TI Keystone. Make ft_board_setup_ex() to be a generic option, allowing its use by other architectures/boards. To maintain backward compatibility, enable it by default on TI Keystone. Signed-off-by: João Paulo Gonçalves <[email protected]>
-rw-r--r--arch/arm/Kconfig1
-rw-r--r--boot/Kconfig10
-rw-r--r--boot/image-fdt.c27
-rw-r--r--cmd/fdt.c6
-rw-r--r--include/fdt_support.h15
5 files changed, 37 insertions, 22 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 9a22c7f6cea..da67f20675a 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -810,6 +810,7 @@ config ARCH_KEYSTONE
imply CMD_SAVES
imply DM_I2C
imply FIT
+ imply OF_BOARD_SETUP_EXTENDED
imply SOC_TI
imply TI_KEYSTONE_SERDES
diff --git a/boot/Kconfig b/boot/Kconfig
index 1f5ecb60c77..b0548358e8b 100644
--- a/boot/Kconfig
+++ b/boot/Kconfig
@@ -1839,6 +1839,16 @@ config OF_BOARD_SETUP
board-specific information in the device tree for use by the OS.
The device tree is then passed to the OS.
+config OF_BOARD_SETUP_EXTENDED
+ bool "Set up latest board-specific details in device tree before boot"
+ imply OF_BOARD_SETUP
+ help
+ This causes U-Boot to call ft_board_setup_ex() before booting into
+ the Operating System. Similar function as ft_board_setup(). However,
+ its modifications are not overwritten by other system changes and are
+ applied to the device tree as the very last step before boot.
+ The device tree is then passed to the OS.
+
config OF_SYSTEM_SETUP
bool "Set up system-specific details in device tree before boot"
help
diff --git a/boot/image-fdt.c b/boot/image-fdt.c
index 8f718ad29f6..1c5d9426b86 100644
--- a/boot/image-fdt.c
+++ b/boot/image-fdt.c
@@ -571,6 +571,7 @@ int image_setup_libfdt(struct bootm_headers *images, void *blob, bool lmb)
{
ulong *initrd_start = &images->initrd_start;
ulong *initrd_end = &images->initrd_end;
+ bool skip_board_fixup = false;
int ret, fdt_ret, of_size;
if (IS_ENABLED(CONFIG_OF_ENV_SETUP)) {
@@ -621,18 +622,18 @@ int image_setup_libfdt(struct bootm_headers *images, void *blob, bool lmb)
fdt_fixup_pstore(blob);
#endif
if (IS_ENABLED(CONFIG_OF_BOARD_SETUP)) {
- const char *skip_board_fixup;
+ skip_board_fixup = (env_get_ulong("skip_board_fixup", 10, 0) == 1);
- skip_board_fixup = env_get("skip_board_fixup");
- if (skip_board_fixup && ((int)simple_strtol(skip_board_fixup, NULL, 10) == 1)) {
- printf("skip board fdt fixup\n");
- } else {
- fdt_ret = ft_board_setup(blob, gd->bd);
- if (fdt_ret) {
- printf("ERROR: board-specific fdt fixup failed: %s\n",
- fdt_strerror(fdt_ret));
- goto err;
- }
+ if (skip_board_fixup)
+ printf("skip all board fdt fixup\n");
+ }
+
+ if (IS_ENABLED(CONFIG_OF_BOARD_SETUP) && !skip_board_fixup) {
+ fdt_ret = ft_board_setup(blob, gd->bd);
+ if (fdt_ret) {
+ printf("ERROR: board-specific fdt fixup failed: %s\n",
+ fdt_strerror(fdt_ret));
+ goto err;
}
}
if (IS_ENABLED(CONFIG_OF_SYSTEM_SETUP)) {
@@ -685,10 +686,8 @@ int image_setup_libfdt(struct bootm_headers *images, void *blob, bool lmb)
if (CONFIG_IS_ENABLED(LMB) && lmb)
lmb_reserve(map_to_sysmem(blob), of_size, LMB_NONE);
-#if defined(CONFIG_ARCH_KEYSTONE)
- if (IS_ENABLED(CONFIG_OF_BOARD_SETUP))
+ if (IS_ENABLED(CONFIG_OF_BOARD_SETUP_EXTENDED) && !skip_board_fixup)
ft_board_setup_ex(blob, gd->bd);
-#endif
return 0;
err:
diff --git a/cmd/fdt.c b/cmd/fdt.c
index d16b141ce32..a67c30b21d5 100644
--- a/cmd/fdt.c
+++ b/cmd/fdt.c
@@ -691,9 +691,9 @@ static int do_fdt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
fdt_strerror(err));
return CMD_RET_FAILURE;
}
-#ifdef CONFIG_ARCH_KEYSTONE
- ft_board_setup_ex(working_fdt, gd->bd);
-#endif
+
+ if (IS_ENABLED(CONFIG_OF_BOARD_SETUP_EXTENDED))
+ ft_board_setup_ex(working_fdt, gd->bd);
}
#endif
/* Create a chosen node */
diff --git a/include/fdt_support.h b/include/fdt_support.h
index 049190cf3d7..47b8b63d13d 100644
--- a/include/fdt_support.h
+++ b/include/fdt_support.h
@@ -240,11 +240,16 @@ int board_rng_seed(struct abuf *buf);
*/
const char *board_fdt_chosen_bootargs(const struct fdt_property *fdt_ba);
-/*
- * The keystone2 SOC requires all 32 bit aliased addresses to be converted
- * to their 36 physical format. This has to happen after all fdt nodes
- * are added or modified by the image_setup_libfdt(). The ft_board_setup_ex()
- * called at the end of the image_setup_libfdt() is to do that convertion.
+/**
+ * ft_board_setup_ex() - Latest board-specific FDT changes
+ *
+ * @blob: FDT blob to update
+ * @bd: Pointer to board data
+ *
+ * Execute board-specific device tree modifications that must be the latest FDT
+ * changes and cannot be overwritten by other system fixups.
+ *
+ * This function is called if CONFIG_OF_BOARD_SETUP_EXTENDED is defined.
*/
void ft_board_setup_ex(void *blob, struct bd_info *bd);