[PATCH] boot: add support for fdt_fixup command in environment
Simon Glass
sjg at chromium.org
Wed Dec 13 20:51:39 CET 2023
On Mon, 11 Dec 2023 at 04:04, Matthias Schiffer
<matthias.schiffer at ew.tq-group.com> wrote:
>
> The "fdt" command is convenient for making small changes to the OS FDT,
> especially during development. This is easy when the kernel and FDT are
> loaded separately, but can be cumbersome for FIT images, requiring to
> unpack the image, manually apply overlays, etc.
>
> Add an option to execute a command "fdt_fixup" from the environment at
> the beginning of image_setup_libfdt() (after overlays are applied, and
> before the other fixups).
>
> Signed-off-by: Matthias Schiffer <matthias.schiffer at ew.tq-group.com>
> ---
> boot/Kconfig | 9 +++++++++
> boot/image-fdt.c | 19 +++++++++++++++++--
> 2 files changed, 26 insertions(+), 2 deletions(-)
Reviewed-by: Simon Glass <sjg at chromium.org>
How about a test?
>
> diff --git a/boot/Kconfig b/boot/Kconfig
> index ef71883a502..7eea935f490 100644
> --- a/boot/Kconfig
> +++ b/boot/Kconfig
> @@ -1502,6 +1502,15 @@ if OF_LIBFDT
>
> menu "Devicetree fixup"
>
> +config OF_ENV_SETUP
> + bool "Run a command from environment to set up device tree before boot"
> + depends on CMD_FDT
> + help
> + This causes U-Boot to run a command from the environment variable
> + fdt_fixup before booting into the operating system, which can use the
> + fdt command to modify the device tree. The device tree is then passed
> + to the OS.
> +
> config OF_BOARD_SETUP
> bool "Set up board-specific details in device tree before boot"
> help
> diff --git a/boot/image-fdt.c b/boot/image-fdt.c
> index f10200f6474..78b5c639381 100644
> --- a/boot/image-fdt.c
> +++ b/boot/image-fdt.c
> @@ -9,6 +9,7 @@
> */
>
> #include <common.h>
> +#include <command.h>
> #include <fdt_support.h>
> #include <fdtdec.h>
> #include <env.h>
> @@ -608,8 +609,22 @@ int image_setup_libfdt(struct bootm_headers *images, void *blob,
> {
> ulong *initrd_start = &images->initrd_start;
> ulong *initrd_end = &images->initrd_end;
> - int ret = -EPERM;
> - int fdt_ret;
> + int ret, fdt_ret;
> +
> + if (IS_ENABLED(CONFIG_OF_ENV_SETUP)) {
> + const char *fdt_fixup;
> +
> + fdt_fixup = env_get("fdt_fixup");
> + if (fdt_fixup) {
> + set_working_fdt_addr(map_to_sysmem(blob));
Is that not already done?
> + ret = run_command_list(fdt_fixup, -1, 0);
> + if (ret)
> + printf("WARNING: fdt_fixup command returned %d\n",
> + ret);
> + }
Would it make sense to put this code near the end of the function,
after other fixups have been done?
> + }
> +
> + ret = -EPERM;
>
> if (fdt_root(blob) < 0) {
> printf("ERROR: root node setup failed\n");
> --
> TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
> Amtsgericht München, HRB 105018
> Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
> https://www.tq-group.com/
>
Regards,
Simon
More information about the U-Boot
mailing list