mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-19 03:15:00 +00:00
lmb: reserve common areas during board init
The LMB module provides API's for allocating and reserving chunks of memory which is then typically used for things like loading images for booting. Reserve the portion of memory that is occupied by the U-Boot image itself, and other parts of memory that might have been marked as reserved in the board's DTB. When executing in SPL, reserve the sections that get relocated to the ram memory, the stack and the global data structure and also the bss. Mark these regions of memory with the LMB_NOOVERWRITE flag to indicate that these regions cannot be re-requested or overwritten. Signed-off-by: Sughosh Ganu <sughosh.ganu@linaro.org> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
8a9fc30f16
commit
f4fb154f0a
1 changed files with 34 additions and 2 deletions
36
lib/lmb.c
36
lib/lmb.c
|
@ -13,6 +13,7 @@
|
|||
#include <lmb.h>
|
||||
#include <log.h>
|
||||
#include <malloc.h>
|
||||
#include <spl.h>
|
||||
|
||||
#include <asm/global_data.h>
|
||||
#include <asm/sections.h>
|
||||
|
@ -172,10 +173,11 @@ void arch_lmb_reserve_generic(ulong sp, ulong end, ulong align)
|
|||
if (bank_end > end)
|
||||
bank_end = end - 1;
|
||||
|
||||
lmb_reserve(sp, bank_end - sp + 1);
|
||||
lmb_reserve_flags(sp, bank_end - sp + 1, LMB_NOOVERWRITE);
|
||||
|
||||
if (gd->flags & GD_FLG_SKIP_RELOC)
|
||||
lmb_reserve((phys_addr_t)(uintptr_t)_start, gd->mon_len);
|
||||
lmb_reserve_flags((phys_addr_t)(uintptr_t)_start,
|
||||
gd->mon_len, LMB_NOOVERWRITE);
|
||||
|
||||
break;
|
||||
}
|
||||
|
@ -246,6 +248,30 @@ void lmb_init_and_reserve_range(phys_addr_t base, phys_size_t size,
|
|||
lmb_reserve_common(fdt_blob);
|
||||
}
|
||||
|
||||
static __maybe_unused void lmb_reserve_common_spl(void)
|
||||
{
|
||||
phys_addr_t rsv_start;
|
||||
phys_size_t rsv_size;
|
||||
|
||||
/*
|
||||
* Assume a SPL stack of 16KB. This must be
|
||||
* more than enough for the SPL stage.
|
||||
*/
|
||||
if (IS_ENABLED(CONFIG_SPL_STACK_R_ADDR)) {
|
||||
rsv_start = gd->start_addr_sp - 16384;
|
||||
rsv_size = 16384;
|
||||
lmb_reserve_flags(rsv_start, rsv_size, LMB_NOOVERWRITE);
|
||||
}
|
||||
|
||||
if (IS_ENABLED(CONFIG_SPL_SEPARATE_BSS)) {
|
||||
/* Reserve the bss region */
|
||||
rsv_start = (phys_addr_t)(uintptr_t)__bss_start;
|
||||
rsv_size = (phys_addr_t)(uintptr_t)__bss_end -
|
||||
(phys_addr_t)(uintptr_t)__bss_start;
|
||||
lmb_reserve_flags(rsv_start, rsv_size, LMB_NOOVERWRITE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* lmb_add_memory() - Add memory range for LMB allocations
|
||||
*
|
||||
|
@ -735,6 +761,12 @@ int lmb_init(void)
|
|||
|
||||
lmb_add_memory();
|
||||
|
||||
/* Reserve the U-Boot image region once U-Boot has relocated */
|
||||
if (spl_phase() == PHASE_SPL)
|
||||
lmb_reserve_common_spl();
|
||||
else if (spl_phase() == PHASE_BOARD_R)
|
||||
lmb_reserve_common((void *)gd->fdt_blob);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue