bloblist: Support relocating to a larger space
Typically in TPL/SPL the bloblist is quite small. But U-Boot proper may want to add a lot more to it, such as ACPI tables. Add a way to expand the bloblist by relocating it in U-Boot proper, along with the other relocation activities. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
@@ -697,6 +697,16 @@ config BLOBLIST_ADDR
|
||||
Sets the address of the bloblist, set up by the first part of U-Boot
|
||||
which runs. Subsequent U-Boot stages typically use the same address.
|
||||
|
||||
config BLOBLIST_SIZE_RELOC
|
||||
hex "Size of bloblist after relocation"
|
||||
depends on BLOBLIST
|
||||
default BLOBLIST_SIZE
|
||||
help
|
||||
Sets the size of the bloblist in bytes after relocation. Since U-Boot
|
||||
has a lot more memory available then, it is possible to use a larger
|
||||
size than the one set up by SPL. This bloblist is set up during the
|
||||
relocation process.
|
||||
|
||||
endmenu
|
||||
|
||||
source "common/spl/Kconfig"
|
||||
|
||||
@@ -317,6 +317,15 @@ void bloblist_show_list(void)
|
||||
}
|
||||
}
|
||||
|
||||
void bloblist_reloc(void *to, uint to_size, void *from, uint from_size)
|
||||
{
|
||||
struct bloblist_hdr *hdr;
|
||||
|
||||
memcpy(to, from, from_size);
|
||||
hdr = to;
|
||||
hdr->size = to_size;
|
||||
}
|
||||
|
||||
int bloblist_init(void)
|
||||
{
|
||||
bool expected;
|
||||
@@ -327,6 +336,8 @@ int bloblist_init(void)
|
||||
* that runs
|
||||
*/
|
||||
expected = !u_boot_first_phase();
|
||||
if (spl_prev_phase() == PHASE_TPL && !IS_ENABLED(CONFIG_TPL_BLOBLIST))
|
||||
expected = false;
|
||||
if (expected)
|
||||
ret = bloblist_check(CONFIG_BLOBLIST_ADDR,
|
||||
CONFIG_BLOBLIST_SIZE);
|
||||
|
||||
@@ -568,9 +568,10 @@ static int reserve_bloblist(void)
|
||||
{
|
||||
#ifdef CONFIG_BLOBLIST
|
||||
/* Align to a 4KB boundary for easier reading of addresses */
|
||||
gd->start_addr_sp = ALIGN_DOWN(gd->start_addr_sp - CONFIG_BLOBLIST_SIZE,
|
||||
0x1000);
|
||||
gd->new_bloblist = map_sysmem(gd->start_addr_sp, CONFIG_BLOBLIST_SIZE);
|
||||
gd->start_addr_sp = ALIGN_DOWN(gd->start_addr_sp -
|
||||
CONFIG_BLOBLIST_SIZE_RELOC, 0x1000);
|
||||
gd->new_bloblist = map_sysmem(gd->start_addr_sp,
|
||||
CONFIG_BLOBLIST_SIZE_RELOC);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
@@ -658,7 +659,8 @@ static int reloc_bloblist(void)
|
||||
|
||||
debug("Copying bloblist from %p to %p, size %x\n",
|
||||
gd->bloblist, gd->new_bloblist, size);
|
||||
memcpy(gd->new_bloblist, gd->bloblist, size);
|
||||
bloblist_reloc(gd->new_bloblist, CONFIG_BLOBLIST_SIZE_RELOC,
|
||||
gd->bloblist, size);
|
||||
gd->bloblist = gd->new_bloblist;
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user