[U-Boot] [PATCH] cmd/fdt: add possibilty to have 'extrasize' on fdt resize

Simon Glass sjg at chromium.org
Mon Sep 19 02:57:09 CEST 2016


Hi Hannes,

On 5 September 2016 at 02:00, Hannes Schmelzer
<hannes.schmelzer at br-automation.com> wrote:
> Sometimes devicetree nodes and or properties are added out of the u-boot
> console, maybe through some script or manual interaction.
>
> The devicetree as loaded or embedded is quite small, so the devicetree
> has to be resized to take up those new nodes/properties.
>
> In original the devicetree was only extended by effective
> 4 * add_mem_rsv.
>
> With this commit we can add an argument to the "fdt resize" command,
> which takes the extrasize to be added.
>
> Signed-off-by: Hannes Schmelzer <hannes.schmelzer at br-automation.com>
>
> ---
>
>  board/compulab/cm_fx6/cm_fx6.c | 2 +-
>  cmd/fdt.c                      | 9 +++++++--
>  common/fdt_support.c           | 3 ++-
>  common/image-fdt.c             | 2 +-
>  include/fdt_support.h          | 2 +-
>  5 files changed, 12 insertions(+), 6 deletions(-)

Reviewed-by: Simon Glass <sjg at chromium.org>

>
> diff --git a/board/compulab/cm_fx6/cm_fx6.c b/board/compulab/cm_fx6/cm_fx6.c
> index 566c19b..fbd6226 100644
> --- a/board/compulab/cm_fx6/cm_fx6.c
> +++ b/board/compulab/cm_fx6/cm_fx6.c
> @@ -602,7 +602,7 @@ int ft_board_setup(void *blob, bd_t *bd)
>         char baseboard_name[16];
>         int err;
>
> -       fdt_shrink_to_minimum(blob); /* Make room for new properties */
> +       fdt_shrink_to_minimum(blob, 0); /* Make room for new properties */
>
>         /* MAC addr */
>         if (eth_getenv_enetaddr("ethaddr", enetaddr)) {
> diff --git a/cmd/fdt.c b/cmd/fdt.c
> index 58af772..b503357 100644
> --- a/cmd/fdt.c
> +++ b/cmd/fdt.c
> @@ -662,7 +662,12 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>  #endif
>         /* resize the fdt */
>         else if (strncmp(argv[1], "re", 2) == 0) {
> -               fdt_shrink_to_minimum(working_fdt);
> +               uint extrasize;
> +               if (argc > 2)
> +                       extrasize = simple_strtoul(argv[2], NULL, 16);
> +               else
> +                       extrasize = 0;
> +               fdt_shrink_to_minimum(working_fdt, extrasize);
>         }
>         else {
>                 /* Unrecognized command */
> @@ -1056,7 +1061,7 @@ static char fdt_help_text[] =
>         "fdt systemsetup                     - Do system-specific set up\n"
>  #endif
>         "fdt move   <fdt> <newaddr> <length> - Copy the fdt to <addr> and make it active\n"
> -       "fdt resize                          - Resize fdt to size + padding to 4k addr\n"
> +       "fdt resize [<extrasize>]            - Resize fdt to size + padding to 4k addr + some optional <extrasize> if needed\n"
>         "fdt print  <path> [<prop>]          - Recursive print starting at <path>\n"
>         "fdt list   <path> [<prop>]          - Print one level starting at <path>\n"
>         "fdt get value <var> <path> <prop>   - Get <property> and store in <var>\n"
> diff --git a/common/fdt_support.c b/common/fdt_support.c
> index 2020586..0609470 100644
> --- a/common/fdt_support.c
> +++ b/common/fdt_support.c
> @@ -523,7 +523,7 @@ void fdt_fixup_ethernet(void *fdt)
>  }
>
>  /* Resize the fdt to its actual size + a bit of padding */
> -int fdt_shrink_to_minimum(void *blob)
> +int fdt_shrink_to_minimum(void *blob, uint extrasize)
>  {
>         int i;
>         uint64_t addr, size;
> @@ -551,6 +551,7 @@ int fdt_shrink_to_minimum(void *blob)
>         actualsize = fdt_off_dt_strings(blob) +
>                 fdt_size_dt_strings(blob) + 5 * sizeof(struct fdt_reserve_entry);
>
> +       actualsize += extrasize;
>         /* Make it so the fdt ends on a page boundary */
>         actualsize = ALIGN(actualsize + ((uintptr_t)blob & 0xfff), 0x1000);
>         actualsize = actualsize - ((uintptr_t)blob & 0xfff);
> diff --git a/common/image-fdt.c b/common/image-fdt.c
> index d6ee225..2ef1253 100644
> --- a/common/image-fdt.c
> +++ b/common/image-fdt.c
> @@ -503,7 +503,7 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
>                 lmb_free(lmb, (phys_addr_t)(u32)(uintptr_t)blob,
>                          (phys_size_t)fdt_totalsize(blob));
>
> -       ret = fdt_shrink_to_minimum(blob);
> +       ret = fdt_shrink_to_minimum(blob, 0);
>         if (ret < 0)
>                 goto err;
>         of_size = ret;
> diff --git a/include/fdt_support.h b/include/fdt_support.h
> index e9f3497..2957fbc 100644
> --- a/include/fdt_support.h
> +++ b/include/fdt_support.h
> @@ -167,7 +167,7 @@ void ft_pci_setup(void *blob, bd_t *bd);
>  int ft_system_setup(void *blob, bd_t *bd);
>
>  void set_working_fdt_addr(ulong addr);
> -int fdt_shrink_to_minimum(void *blob);
> +int fdt_shrink_to_minimum(void *blob, uint extrasize);

Can you please add a function comment for this?

>  int fdt_increase_size(void *fdt, int add_len);
>
>  int fdt_fixup_nor_flash_size(void *blob);
> --
> 1.9.1
>

Regards,
Simon


More information about the U-Boot mailing list