Browse Source

libfdt: Introduce new ARCH_FIXUP_FDT option

Add new Kconfig option to disable arch_fixup_fdt() calls for cases where
U-Boot shouldn't update memory setup in DTB file.
One example of usage of this option is to boot OS with different memory
setup than U-Boot use.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Acked-by: Simon Glass <sjg@chromium.org>
tags/2020-06-01
Michal Simek 4 years ago
committed by Simon Glass
parent
commit
e2f88dfd2d
5 changed files with 17 additions and 5 deletions
  1. +9
    -0
      Kconfig
  2. +2
    -0
      arch/arm/lib/bootm-fdt.c
  3. +2
    -0
      arch/arm/lib/bootm.c
  4. +2
    -0
      arch/mips/lib/bootm.c
  5. +2
    -5
      common/image-fdt.c

+ 9
- 0
Kconfig View File

@@ -342,6 +342,15 @@ 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
default y
help
Enable FDT memory map syncup before OS boot. This feature can be
used for booting OS with different memory setup where the part of
the memory location should be used for different purpose.

endmenu # Boot images

source "common/Kconfig"


+ 2
- 0
arch/arm/lib/bootm-fdt.c View File

@@ -25,6 +25,7 @@

DECLARE_GLOBAL_DATA_PTR;

#ifdef CONFIG_ARCH_FIXUP_FDT
int arch_fixup_fdt(void *blob)
{
bd_t *bd = gd->bd;
@@ -60,3 +61,4 @@ int arch_fixup_fdt(void *blob)

return 0;
}
#endif

+ 2
- 0
arch/arm/lib/bootm.c View File

@@ -367,8 +367,10 @@ 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


+ 2
- 0
arch/mips/lib/bootm.c View File

@@ -253,6 +253,7 @@ 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)
@@ -264,6 +265,7 @@ int arch_fixup_fdt(void *blob)
return 0;
#endif
}
#endif

static int boot_setup_fdt(bootm_headers_t *images)
{


+ 2
- 5
common/image-fdt.c View File

@@ -458,11 +458,6 @@ __weak int ft_verify_fdt(void *fdt)
return 1;
}

__weak int arch_fixup_fdt(void *blob)
{
return 0;
}

int image_setup_libfdt(bootm_headers_t *images, void *blob,
int of_size, struct lmb *lmb)
{
@@ -479,10 +474,12 @@ 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) {