Skip to content
Snippets Groups Projects
Commit 10172962 authored by Simon Glass's avatar Simon Glass Committed by Michal Simek
Browse files

dm: spl: Support device tree when BSS is in a different section


At present in SPL we place the device tree immediately after BSS. This
avoids needing to copy it out of the way before BSS can be used. However on
some boards BSS is not placed with the image - e.g. it can be in RAM if
available.

Add an option to tell U-Boot that the device tree should be placed at the
end of the image binary (_image_binary_end) instead of at the end of BSS.

Note: A common reason to place BSS in RAM is to support the FAT filesystem.
We should update the code so that it does not use so much BSS.

Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
Signed-off-by: default avatarMichal Simek <michal.simek@xilinx.com>
parent 021b4d11
No related branches found
No related tags found
No related merge requests found
...@@ -152,6 +152,16 @@ config SPL_STACK_R_MALLOC_SIMPLE_LEN ...@@ -152,6 +152,16 @@ config SPL_STACK_R_MALLOC_SIMPLE_LEN
to give board_init_r() a larger heap then the initial heap in to give board_init_r() a larger heap then the initial heap in
SRAM which is limited to SYS_MALLOC_F_LEN bytes. SRAM which is limited to SYS_MALLOC_F_LEN bytes.
config SPL_SEPARATE_BSS
depends on SPL
bool "BSS section is in a different memory region from text"
help
Some platforms need a large BSS region in SPL and can provide this
because RAM is already set up. In this case BSS can be moved to RAM.
This option should then be enabled so that the correct device tree
location is used. Normally we put the device tree at the end of BSS
but with this option enabled, it goes at _image_binary_end.
config TPL config TPL
bool bool
depends on SPL && SUPPORT_TPL depends on SPL && SUPPORT_TPL
......
...@@ -71,6 +71,7 @@ extern char __bss_start[]; ...@@ -71,6 +71,7 @@ extern char __bss_start[];
extern char __bss_end[]; extern char __bss_end[];
extern char __image_copy_start[]; extern char __image_copy_start[];
extern char __image_copy_end[]; extern char __image_copy_end[];
extern char _image_binary_end[];
extern char __rel_dyn_start[]; extern char __rel_dyn_start[];
extern char __rel_dyn_end[]; extern char __rel_dyn_end[];
......
...@@ -1222,8 +1222,11 @@ int fdtdec_setup(void) ...@@ -1222,8 +1222,11 @@ int fdtdec_setup(void)
gd->fdt_blob = __dtb_dt_begin; gd->fdt_blob = __dtb_dt_begin;
# elif defined CONFIG_OF_SEPARATE # elif defined CONFIG_OF_SEPARATE
# ifdef CONFIG_SPL_BUILD # ifdef CONFIG_SPL_BUILD
/* FDT is at end of BSS */ /* FDT is at end of BSS unless it is in a different memory region */
gd->fdt_blob = (ulong *)&__bss_end; if (IS_ENABLED(CONFIG_SPL_SEPARATE_BSS))
gd->fdt_blob = (ulong *)&_image_binary_end;
else
gd->fdt_blob = (ulong *)&__bss_end;
# else # else
/* FDT is at end of image */ /* FDT is at end of image */
gd->fdt_blob = (ulong *)&_end; gd->fdt_blob = (ulong *)&_end;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment