bloblist: Refactor Kconfig to support alloc or fixed

At present we do support allocating the bloblist but the Kconfig is a bit
strange, since we still have to specify an address in that case. Partly
this is because it is a pain to have CONFIG options that disappears when
its dependency is enabled. It means that we must have #ifdefs in the code,
either in the C code or header file.

Make use of IF_ENABLED_INT() and its friend to solve that problem, so we
can separate out the location of bloblist into a choice. Put the address
and size into variables so we can log the result.

Add the options for SPL as well, so we can use CONFIG_IS_ENABLED().

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2022-01-12 19:26:22 -07:00
parent 5938d654de
commit 99047f5d7f
3 changed files with 116 additions and 24 deletions

View file

@ -4,6 +4,7 @@
* Written by Simon Glass <sjg@chromium.org>
*/
#define LOG_DEBUG
#define LOG_CATEGORY LOGC_BLOBLIST
#include <common.h>
@ -360,6 +361,8 @@ int bloblist_finish(void)
struct bloblist_hdr *hdr = gd->bloblist;
hdr->chksum = bloblist_calc_chksum(hdr);
log_debug("Finished bloblist size %lx at %lx\n", (ulong)hdr->size,
(ulong)map_to_sysmem(hdr));
return 0;
}
@ -415,8 +418,9 @@ void bloblist_reloc(void *to, uint to_size, void *from, uint from_size)
int bloblist_init(void)
{
bool expected;
int ret = -ENOENT;
ulong addr, size;
bool expected;
/**
* Wed expect to find an existing bloblist in the first phase of U-Boot
@ -425,27 +429,32 @@ int bloblist_init(void)
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);
addr = bloblist_addr();
size = CONFIG_BLOBLIST_SIZE;
if (expected) {
ret = bloblist_check(addr, size);
if (ret) {
log_warning("Expected bloblist at %lx not found (err=%d)\n",
addr, ret);
} else {
/* Get the real size, if it is not what we expected */
size = gd->bloblist->size;
}
}
if (ret) {
ulong addr;
log(LOGC_BLOBLIST, expected ? LOGL_WARNING : LOGL_DEBUG,
"Existing bloblist not found: creating new bloblist\n");
if (IS_ENABLED(CONFIG_BLOBLIST_ALLOC)) {
void *ptr = memalign(BLOBLIST_ALIGN,
CONFIG_BLOBLIST_SIZE);
if (CONFIG_IS_ENABLED(BLOBLIST_ALLOC)) {
void *ptr = memalign(BLOBLIST_ALIGN, size);
if (!ptr)
return log_msg_ret("alloc", -ENOMEM);
addr = map_to_sysmem(ptr);
} else {
addr = CONFIG_BLOBLIST_ADDR;
}
ret = bloblist_new(addr, CONFIG_BLOBLIST_SIZE, 0);
log_debug("Creating new bloblist size %lx at %lx\n", size,
addr);
ret = bloblist_new(addr, size, 0);
} else {
log_debug("Found existing bloblist\n");
log_debug("Found existing bloblist size %lx at %lx\n", size,
addr);
}
return ret;