]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
bloblist: Support allocating the bloblist
authorSimon Glass <sjg@chromium.org>
Thu, 4 Nov 2021 03:09:20 +0000 (21:09 -0600)
committerSimon Glass <sjg@chromium.org>
Sun, 5 Dec 2021 16:21:44 +0000 (09:21 -0700)
Typically the bloblist is positioned at a fixed address in memory until
relocation. This is convenient when it is set up in SPL or before
relocation.

But for EFI we want to set it up only when U-Boot proper is running. Add
a way to allocate it using malloc() and update the documentation to cover
this aspect of bloblist.

Note there are no tests of this feature at present, nor any direct testing
of bloblist_init().

This can be added, e.g. by making this option controllable at runtime.

Signed-off-by: Simon Glass <sjg@chromium.org>
common/Kconfig
common/bloblist.c
common/board_f.c
doc/develop/bloblist.rst

index 176fda9449ea4f7205b2988872cae96f1d4048df..50ac4331f5cad671824492d6248a965f9a437432 100644 (file)
@@ -727,6 +727,8 @@ config TPL_BLOBLIST
          This enables a bloblist in TPL. The bloblist is set up in TPL and
          passed to SPL and U-Boot proper.
 
+if BLOBLIST
+
 config BLOBLIST_SIZE
        hex "Size of bloblist"
        depends on BLOBLIST
@@ -737,17 +739,24 @@ config BLOBLIST_SIZE
          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 stages.
 
+config 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.
+
 config BLOBLIST_ADDR
        hex "Address of bloblist"
-       depends on BLOBLIST
        default 0xc000 if SANDBOX
        help
          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.
 
+         This is not used if BLOBLIST_ALLOC is selected.
+
 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
@@ -755,6 +764,8 @@ config BLOBLIST_SIZE_RELOC
          size than the one set up by SPL. This bloblist is set up during the
          relocation process.
 
+endif # BLOBLIST
+
 endmenu
 
 source "common/spl/Kconfig"
index 1290fff850413e603747ac9e84141b014864f28e..01b04103d9164eb95ad3a1aae421e42e6f6396a5 100644 (file)
@@ -7,6 +7,7 @@
 #include <common.h>
 #include <bloblist.h>
 #include <log.h>
+#include <malloc.h>
 #include <mapmem.h>
 #include <spl.h>
 #include <asm/global_data.h>
@@ -416,10 +417,21 @@ int bloblist_init(void)
                ret = bloblist_check(CONFIG_BLOBLIST_ADDR,
                                     CONFIG_BLOBLIST_SIZE);
        if (ret) {
+               ulong addr;
+
                log(LOGC_BLOBLIST, expected ? LOGL_WARNING : LOGL_DEBUG,
                    "Existing bloblist not found: creating new bloblist\n");
-               ret = bloblist_new(CONFIG_BLOBLIST_ADDR, CONFIG_BLOBLIST_SIZE,
-                                  0);
+               if (IS_ENABLED(CONFIG_BLOBLIST_ALLOC)) {
+                       void *ptr = memalign(BLOBLIST_ALIGN,
+                                            CONFIG_BLOBLIST_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);
        } else {
                log(LOGC_BLOBLIST, LOGL_DEBUG, "Found existing bloblist\n");
        }
index f7ea7c7a1e4507867aaff72510403fed4b6742e3..dd69c3b6b779449db3c91225b267f46cbace6c74 100644 (file)
@@ -655,8 +655,14 @@ static int reloc_bootstage(void)
 static int reloc_bloblist(void)
 {
 #ifdef CONFIG_BLOBLIST
-       if (gd->flags & GD_FLG_SKIP_RELOC)
+       /*
+        * Relocate only if we are supposed to send it
+        */
+       if ((gd->flags & GD_FLG_SKIP_RELOC) &&
+           CONFIG_BLOBLIST_SIZE == CONFIG_BLOBLIST_SIZE_RELOC) {
+               debug("Not relocating bloblist\n");
                return 0;
+       }
        if (gd->new_bloblist) {
                int size = CONFIG_BLOBLIST_SIZE;
 
index 317ebc4919dd3776bda9c5e6ea5033e4ea451b8f..47274cf8e26cc90e98d1c1bde6c4863b17a66292 100644 (file)
@@ -59,6 +59,22 @@ Bloblist provides a fairly simple API which allows blobs to be created and
 found. All access is via the blob's tag. Blob records are zeroed when added.
 
 
+Placing the bloblist
+--------------------
+
+The bloblist is typically positioned at a fixed address by TPL, or SPL. This
+is controlled by `CONFIG_BLOBLIST_ADDR`. But in some cases it is preferable to
+allocate the bloblist in the malloc() space. Use the `CONFIG_BLOBLIST_ALLOC`
+option to enable this.
+
+The bloblist is automatically relocated as part of U-Boot relocation. Sometimes
+it is useful to expand the bloblist in U-Boot proper, since it may want to add
+information for use by Linux. Note that this does not mean that Linux needs to
+know anything about the bloblist format, just that it is convenient to use
+bloblist to place things contiguously in memory. Set
+`CONFIG_BLOBLIST_SIZE_RELOC` to define the expanded size, if needed.
+
+
 Finishing the bloblist
 ----------------------