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:
parent
5938d654de
commit
99047f5d7f
3 changed files with 116 additions and 24 deletions
|
@ -738,15 +738,17 @@ config TPL_BLOBLIST
|
|||
|
||||
if BLOBLIST
|
||||
|
||||
config BLOBLIST_SIZE
|
||||
hex "Size of bloblist"
|
||||
depends on BLOBLIST
|
||||
default 0x400
|
||||
choice
|
||||
prompt "Bloblist location"
|
||||
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.
|
||||
Select the location of the bloblist, via various means.
|
||||
|
||||
config 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 U-Boot.
|
||||
|
||||
config BLOBLIST_ALLOC
|
||||
bool "Allocate bloblist"
|
||||
|
@ -755,18 +757,31 @@ config BLOBLIST_ALLOC
|
|||
specify a fixed address on systems where this is unknown or can
|
||||
change at runtime.
|
||||
|
||||
endchoice
|
||||
|
||||
config BLOBLIST_ADDR
|
||||
hex "Address of bloblist"
|
||||
default 0xc000 if SANDBOX
|
||||
depends on BLOBLIST_FIXED
|
||||
help
|
||||
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.
|
||||
|
||||
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
|
||||
hex "Size of bloblist after relocation"
|
||||
default BLOBLIST_SIZE
|
||||
default BLOBLIST_SIZE if BLOBLIST_FIXED || BLOBLIST_ALLOC
|
||||
default 0 if BLOBLIST_PASSAGE
|
||||
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
|
||||
|
@ -775,6 +790,64 @@ config BLOBLIST_SIZE_RELOC
|
|||
|
||||
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
|
||||
|
||||
source "common/spl/Kconfig"
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -147,6 +147,16 @@ struct bloblist_rec {
|
|||
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
|
||||
*
|
||||
|
|
Loading…
Reference in a new issue