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

@ -738,15 +738,17 @@ config TPL_BLOBLIST
if BLOBLIST if BLOBLIST
config BLOBLIST_SIZE choice
hex "Size of bloblist" prompt "Bloblist location"
depends on BLOBLIST
default 0x400
help help
Sets the size of the bloblist in bytes. This must include all Select the location of the bloblist, via various means.
overhead (alignment, bloblist header, record header). The bloblist
is set up in the first part of U-Boot to run (TPL, SPL or U-Boot config BLOBLIST_FIXED
proper), and this sane bloblist is used for subsequent phases. bool "Place bloblist at a fixed address in memory"
help
Select this to used a fixed memory address for the bloblist. If the
bloblist exists at this address from a previous phase, it used as is.
If not it is created at this address in U-Boot.
config BLOBLIST_ALLOC config BLOBLIST_ALLOC
bool "Allocate bloblist" bool "Allocate bloblist"
@ -755,18 +757,31 @@ config BLOBLIST_ALLOC
specify a fixed address on systems where this is unknown or can specify a fixed address on systems where this is unknown or can
change at runtime. change at runtime.
endchoice
config BLOBLIST_ADDR config BLOBLIST_ADDR
hex "Address of bloblist" hex "Address of bloblist"
default 0xc000 if SANDBOX default 0xc000 if SANDBOX
depends on BLOBLIST_FIXED
help help
Sets the address of the bloblist, set up by the first part of U-Boot Sets the address of the bloblist, set up by the first part of U-Boot
which runs. Subsequent U-Boot phases typically use the same address. which runs. Subsequent U-Boot phases typically use the same address.
This is not used if BLOBLIST_ALLOC is selected. This is not used if BLOBLIST_ALLOC is selected.
config BLOBLIST_SIZE
hex "Size of bloblist"
default 0x400
help
Sets the size of the bloblist in bytes. This must include all
overhead (alignment, bloblist header, record header). The bloblist
is set up in the first part of U-Boot to run (TPL, SPL or U-Boot
proper), and this sane bloblist is used for subsequent phases.
config BLOBLIST_SIZE_RELOC config BLOBLIST_SIZE_RELOC
hex "Size of bloblist after relocation" hex "Size of bloblist after relocation"
default BLOBLIST_SIZE default BLOBLIST_SIZE if BLOBLIST_FIXED || BLOBLIST_ALLOC
default 0 if BLOBLIST_PASSAGE
help help
Sets the size of the bloblist in bytes after relocation. Since U-Boot 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 has a lot more memory available then, it is possible to use a larger
@ -775,6 +790,64 @@ config BLOBLIST_SIZE_RELOC
endif # BLOBLIST endif # BLOBLIST
if SPL_BLOBLIST
choice
prompt "Bloblist location in SPL"
help
Select the location of the bloblist, via various means. Typically
you should use the same value for SPL as for U-Boot, since they need
to look in the same place. But if BLOBLIST_ALLOC is used, then a
fresh bloblist will be created each time, since there is no shared
address (between phases) for the bloblist.
config SPL_BLOBLIST_FIXED
bool "Place bloblist at a fixed address in memory"
help
Select this to used a fixed memory address for the bloblist. If the
bloblist exists at this address from a previous phase, it used as is.
If not it is created at this address in SPL.
config SPL_BLOBLIST_ALLOC
bool "Allocate bloblist"
help
Allocate the bloblist using malloc(). This avoids the need to
specify a fixed address on systems where this is unknown or can
change at runtime.
endchoice
endif # SPL_BLOBLIST
if TPL_BLOBLIST
choice
prompt "Bloblist location in TPL"
help
Select the location of the bloblist, via various means. Typically
you should use the same value for SPL as for U-Boot, since they need
to look in the same place. But if BLOBLIST_ALLOC is used, then a
fresh bloblist will be created each time, since there is no shared
address (between phases) for the bloblist.
config TPL_BLOBLIST_FIXED
bool "Place bloblist at a fixed address in memory"
help
Select this to used a fixed memory address for the bloblist. If the
bloblist exists at this address from a previous phase, it used as is.
If not it is created at this address in TPL.
config TPL_BLOBLIST_ALLOC
bool "Allocate bloblist"
help
Allocate the bloblist using malloc(). This avoids the need to
specify a fixed address on systems where this is unknown or can
change at runtime.
endchoice
endif # TPL_BLOBLIST
endmenu endmenu
source "common/spl/Kconfig" source "common/spl/Kconfig"

View file

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

View file

@ -147,6 +147,16 @@ struct bloblist_rec {
u32 spare; u32 spare;
}; };
/* access CONFIG_BLOBLIST_ADDR, dealing with it possibly not being defined */
static inline ulong bloblist_addr(void)
{
#ifdef CONFIG_BLOBLIST_FIXED
return CONFIG_BLOBLIST_ADDR;
#else
return 0;
#endif
}
/** /**
* bloblist_check_magic() - return a bloblist if the magic matches * bloblist_check_magic() - return a bloblist if the magic matches
* *