mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-09 03:21:51 +00:00
bloblist: refactor xferlist and bloblist
Refactor the xferlist to remove the relocating when bloblist passed from the boot args. Refactor bloblist init to use incoming standard passage by default if a valid transfer list exists in the boot args. For bloblist relocation, use the actual total size if it has a smaller BLOBLIST_SIZE_RELOC. Signed-off-by: Raymond Mao <raymond.mao@linaro.org> Suggested-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
This commit is contained in:
parent
42aebf0f98
commit
6799f09069
4 changed files with 66 additions and 54 deletions
|
@ -492,8 +492,7 @@ int bloblist_reloc(void *to, uint to_size)
|
|||
/*
|
||||
* Weak default function for getting bloblist from boot args.
|
||||
*/
|
||||
int __weak xferlist_from_boot_arg(ulong __always_unused addr,
|
||||
ulong __always_unused size)
|
||||
int __weak xferlist_from_boot_arg(ulong __always_unused *addr)
|
||||
{
|
||||
return -ENOENT;
|
||||
}
|
||||
|
@ -501,37 +500,39 @@ int __weak xferlist_from_boot_arg(ulong __always_unused addr,
|
|||
int bloblist_init(void)
|
||||
{
|
||||
bool fixed = IS_ENABLED(CONFIG_BLOBLIST_FIXED);
|
||||
int ret = -ENOENT;
|
||||
int ret = 0;
|
||||
ulong addr = 0, size;
|
||||
/*
|
||||
* If U-Boot is not in the first phase, an existing bloblist must be
|
||||
* at a fixed address.
|
||||
*/
|
||||
bool from_addr = fixed && !xpl_is_first_phase();
|
||||
if (xpl_prev_phase() == PHASE_TPL && !IS_ENABLED(CONFIG_TPL_BLOBLIST))
|
||||
from_addr = false;
|
||||
if (fixed)
|
||||
addr = IF_ENABLED_INT(CONFIG_BLOBLIST_FIXED,
|
||||
CONFIG_BLOBLIST_ADDR);
|
||||
size = CONFIG_BLOBLIST_SIZE;
|
||||
|
||||
/* Check if a valid transfer list passed in */
|
||||
if (!xferlist_from_boot_arg(&addr)) {
|
||||
size = bloblist_get_total_size();
|
||||
} else {
|
||||
/*
|
||||
* If U-Boot is not in the first phase, an existing bloblist must
|
||||
* be at a fixed address.
|
||||
*/
|
||||
bool from_addr = fixed && !xpl_is_first_phase();
|
||||
|
||||
/*
|
||||
* If the current boot stage is the first phase of U-Boot, then an
|
||||
* architecture-specific routine should be used to handle the bloblist
|
||||
* passed from the previous boot loader
|
||||
*/
|
||||
if (xpl_is_first_phase() && !IS_ENABLED(CONFIG_BLOBLIST_ALLOC))
|
||||
ret = xferlist_from_boot_arg(addr, size);
|
||||
else if (from_addr)
|
||||
ret = bloblist_check(addr, size);
|
||||
ret = -ENOENT;
|
||||
|
||||
if (ret)
|
||||
log_warning("Bloblist at %lx not found (err=%d)\n",
|
||||
addr, ret);
|
||||
else
|
||||
/* Get the real size */
|
||||
size = gd->bloblist->total_size;
|
||||
if (xpl_prev_phase() == PHASE_TPL &&
|
||||
!IS_ENABLED(CONFIG_TPL_BLOBLIST))
|
||||
from_addr = false;
|
||||
if (fixed)
|
||||
addr = IF_ENABLED_INT(CONFIG_BLOBLIST_FIXED,
|
||||
CONFIG_BLOBLIST_ADDR);
|
||||
size = CONFIG_BLOBLIST_SIZE;
|
||||
|
||||
if (from_addr)
|
||||
ret = bloblist_check(addr, size);
|
||||
|
||||
if (ret)
|
||||
log_warning("Bloblist at %lx not found (err=%d)\n",
|
||||
addr, ret);
|
||||
else
|
||||
/* Get the real size */
|
||||
size = gd->bloblist->total_size;
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
/*
|
||||
|
@ -556,6 +557,7 @@ int bloblist_init(void)
|
|||
log_debug("Found existing bloblist size %lx at %lx\n", size,
|
||||
addr);
|
||||
}
|
||||
|
||||
if (ret)
|
||||
return log_msg_ret("ini", ret);
|
||||
gd->flags |= GD_FLG_BLOBLIST_READY;
|
||||
|
@ -576,10 +578,11 @@ int bloblist_maybe_init(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int bloblist_check_reg_conv(ulong rfdt, ulong rzero, ulong rsig)
|
||||
int bloblist_check_reg_conv(ulong rfdt, ulong rzero, ulong rsig, ulong xlist)
|
||||
{
|
||||
u64 version = BLOBLIST_REGCONV_VER;
|
||||
ulong sigval;
|
||||
int ret;
|
||||
|
||||
if ((IS_ENABLED(CONFIG_64BIT) && !IS_ENABLED(CONFIG_SPL_BUILD)) ||
|
||||
(IS_ENABLED(CONFIG_SPL_64BIT) && IS_ENABLED(CONFIG_SPL_BUILD))) {
|
||||
|
@ -590,8 +593,14 @@ int bloblist_check_reg_conv(ulong rfdt, ulong rzero, ulong rsig)
|
|||
((version & BLOBLIST_REGCONV_MASK) << BLOBLIST_REGCONV_SHIFT_32));
|
||||
}
|
||||
|
||||
if (rzero || rsig != sigval ||
|
||||
rfdt != (ulong)bloblist_find(BLOBLISTT_CONTROL_FDT, 0)) {
|
||||
if (rzero || rsig != sigval)
|
||||
return -EIO;
|
||||
|
||||
ret = bloblist_check(xlist, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (rfdt != (ulong)bloblist_find(BLOBLISTT_CONTROL_FDT, 0)) {
|
||||
gd->bloblist = NULL; /* Reset the gd bloblist pointer */
|
||||
return -EIO;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue