[U-Boot] [PATCH] libfdt: replace ARCH_FIXUP_FDT with ARCH_FIXUP_FDT_MEMORY

Simon Glass sjg at chromium.org
Tue Oct 4 17:37:53 CEST 2016


Hi Masahiro,

On 4 October 2016 at 06:03, Masahiro Yamada
<yamada.masahiro at socionext.com> wrote:
> Commit e2f88dfd2d96 ("libfdt: Introduce new ARCH_FIXUP_FDT option")
> allows us to skip memory setup of DTB, but a problem for ARM is that
> spin_table_update_dt() and psci_update_dt() are skipped as well if
> CONFIG_ARCH_FIXUP_FDT is disabled.
>
> This commit allows us to skip only fdt_fixup_memory_banks() instead
> of the whole of arch_fixup_fdt().  It will be useful when we want to
> use a memory node from a kernel DTB as is, but need some fixups for
> Spin-Table/PSCI.
>
> Signed-off-by: Masahiro Yamada <yamada.masahiro at socionext.com>
> ---
>
>  Kconfig                  | 5 ++---
>  arch/arm/lib/bootm-fdt.c | 2 --
>  arch/arm/lib/bootm.c     | 2 --
>  arch/mips/lib/bootm.c    | 2 --
>  common/fdt_support.c     | 2 ++
>  common/image-fdt.c       | 7 +++++--
>  include/fdt_support.h    | 8 ++++++++
>  7 files changed, 17 insertions(+), 11 deletions(-)
>
> diff --git a/Kconfig b/Kconfig
> index 1263d0b..b7cb142 100644
> --- a/Kconfig
> +++ b/Kconfig
> @@ -324,9 +324,8 @@ config SYS_CLK_FREQ
>         help
>           TODO: Move CONFIG_SYS_CLK_FREQ for all the architecture
>
> -config ARCH_FIXUP_FDT
> -       bool "Enable arch_fixup_fdt() call"
> -       depends on ARM || MIPS
> +config ARCH_FIXUP_FDT_MEMORY
> +       bool "Enable arch_fixup_memory_banks() call"
>         default y
>         help
>           Enable FDT memory map syncup before OS boot. This feature can be
> diff --git a/arch/arm/lib/bootm-fdt.c b/arch/arm/lib/bootm-fdt.c
> index a517550..4481f9e 100644
> --- a/arch/arm/lib/bootm-fdt.c
> +++ b/arch/arm/lib/bootm-fdt.c
> @@ -25,7 +25,6 @@
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> -#ifdef CONFIG_ARCH_FIXUP_FDT
>  int arch_fixup_fdt(void *blob)
>  {
>         bd_t *bd = gd->bd;
> @@ -61,4 +60,3 @@ int arch_fixup_fdt(void *blob)
>
>         return 0;
>  }
> -#endif
> diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c
> index 53c3141..0e890ce 100644
> --- a/arch/arm/lib/bootm.c
> +++ b/arch/arm/lib/bootm.c
> @@ -372,10 +372,8 @@ void boot_prep_vxworks(bootm_headers_t *images)
>         if (images->ft_addr) {
>                 off = fdt_path_offset(images->ft_addr, "/memory");
>                 if (off < 0) {
> -#ifdef CONFIG_ARCH_FIXUP_FDT
>                         if (arch_fixup_fdt(images->ft_addr))
>                                 puts("## WARNING: fixup memory failed!\n");
> -#endif
>                 }
>         }
>  #endif
> diff --git a/arch/mips/lib/bootm.c b/arch/mips/lib/bootm.c
> index 0c6a4ab..aa0475a 100644
> --- a/arch/mips/lib/bootm.c
> +++ b/arch/mips/lib/bootm.c
> @@ -253,7 +253,6 @@ static int boot_reloc_fdt(bootm_headers_t *images)
>  #endif
>  }
>
> -#ifdef CONFIG_ARCH_FIXUP_FDT
>  int arch_fixup_fdt(void *blob)
>  {
>  #if CONFIG_IS_ENABLED(MIPS_BOOT_FDT) && CONFIG_IS_ENABLED(OF_LIBFDT)
> @@ -265,7 +264,6 @@ int arch_fixup_fdt(void *blob)
>         return 0;
>  #endif
>  }
> -#endif
>
>  static int boot_setup_fdt(bootm_headers_t *images)
>  {
> diff --git a/common/fdt_support.c b/common/fdt_support.c
> index 2020586..c87031f 100644
> --- a/common/fdt_support.c
> +++ b/common/fdt_support.c
> @@ -381,6 +381,7 @@ void do_fixup_by_compat_u32(void *fdt, const char *compat,
>         do_fixup_by_compat(fdt, compat, prop, &tmp, 4, create);
>  }
>
> +#ifdef CONFIG_ARCH_FIXUP_FDT_MEMORY
>  /*
>   * fdt_pack_reg - pack address and size array into the "reg"-suitable stream
>   */
> @@ -459,6 +460,7 @@ int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks)
>         }
>         return 0;
>  }
> +#endif
>
>  int fdt_fixup_memory(void *blob, u64 start, u64 size)
>  {
> diff --git a/common/image-fdt.c b/common/image-fdt.c
> index 3d23608..91970d4 100644
> --- a/common/image-fdt.c
> +++ b/common/image-fdt.c
> @@ -458,6 +458,11 @@ __weak int ft_verify_fdt(void *fdt)
>         return 1;
>  }
>
> +__weak int arch_fixup_fdt(void *blob)
> +{
> +       return 0;
> +}

Do we have to have a weak function? I was hoping we could avoid these
since they make it hard to figure out at build time what code is
executed.

> +
>  int image_setup_libfdt(bootm_headers_t *images, void *blob,
>                        int of_size, struct lmb *lmb)
>  {
> @@ -474,12 +479,10 @@ int image_setup_libfdt(bootm_headers_t *images, void *blob,
>                 printf("ERROR: /chosen node create failed\n");
>                 goto err;
>         }
> -#ifdef CONFIG_ARCH_FIXUP_FDT
>         if (arch_fixup_fdt(blob) < 0) {
>                 printf("ERROR: arch-specific fdt fixup failed\n");
>                 goto err;
>         }
> -#endif
>         if (IMAGE_OF_BOARD_SETUP) {
>                 fdt_ret = ft_board_setup(blob, gd->bd);
>                 if (fdt_ret) {
> diff --git a/include/fdt_support.h b/include/fdt_support.h
> index 8f40231..7110061 100644
> --- a/include/fdt_support.h
> +++ b/include/fdt_support.h
> @@ -93,7 +93,15 @@ int fdt_fixup_memory(void *blob, u64 start, u64 size);
>   *                     property will be left untouched.
>   * @return 0 if ok, or -1 or -FDT_ERR_... on error
>   */
> +#ifdef CONFIG_ARCH_FIXUP_FDT_MEMORY
>  int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks);
> +#else
> +static inline int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[],
> +                                        int banks)
> +{
> +       return 0;
> +}
> +#endif
>
>  void fdt_fixup_ethernet(void *fdt);
>  int fdt_find_and_setprop(void *fdt, const char *node, const char *prop,
> --
> 1.9.1
>

Regards,
Simon


More information about the U-Boot mailing list