All of lore.kernel.org
 help / color / mirror / Atom feed
From: Simon Glass <sjg@chromium.org>
To: U-Boot Mailing List <u-boot@lists.denx.de>
Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>,
	Christian Melki <christian.melki@t2data.com>,
	Bin Meng <bmeng.cn@gmail.com>,
	Heinrich Schuchardt <xypron.glpk@gmx.de>,
	Tom Rini <trini@konsulko.com>, Simon Glass <sjg@chromium.org>
Subject: [PATCH v5 06/28] bloblist: Support allocating the bloblist
Date: Sat,  4 Dec 2021 08:56:35 -0700	[thread overview]
Message-ID: <20211204155657.2913911-3-sjg@chromium.org> (raw)
In-Reply-To: <20211204155657.2913911-1-sjg@chromium.org>

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>
---

(no changes since v1)

 common/Kconfig           | 15 +++++++++++++--
 common/bloblist.c        | 16 ++++++++++++++--
 common/board_f.c         |  8 +++++++-
 doc/develop/bloblist.rst | 16 ++++++++++++++++
 4 files changed, 50 insertions(+), 5 deletions(-)

diff --git a/common/Kconfig b/common/Kconfig
index 176fda9449e..50ac4331f5c 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -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"
diff --git a/common/bloblist.c b/common/bloblist.c
index 1290fff8504..01b04103d91 100644
--- a/common/bloblist.c
+++ b/common/bloblist.c
@@ -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");
 	}
diff --git a/common/board_f.c b/common/board_f.c
index f7ea7c7a1e4..dd69c3b6b77 100644
--- a/common/board_f.c
+++ b/common/board_f.c
@@ -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;
 
diff --git a/doc/develop/bloblist.rst b/doc/develop/bloblist.rst
index 317ebc4919d..47274cf8e26 100644
--- a/doc/develop/bloblist.rst
+++ b/doc/develop/bloblist.rst
@@ -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
 ----------------------
 
-- 
2.34.1.400.ga245620fadb-goog


  parent reply	other threads:[~2021-12-04 15:58 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-04 15:56 [PATCH v5 00/28] efi: Improvements to U-Boot running on top of UEFI Simon Glass
2021-12-04 15:56 ` [PATCH v5 01/28] efi: Rename UCLASS_EFI and IF_TYPE_EFI Simon Glass
2021-12-09 18:38   ` Heinrich Schuchardt
2021-12-04 15:56 ` [PATCH v5 02/28] efi: Add EFI uclass for media Simon Glass
2021-12-09 18:54   ` Heinrich Schuchardt
2021-12-04 15:56 ` [PATCH v5 03/28] efi: Add a media/block driver for EFI block devices Simon Glass
2021-12-09 19:04   ` Heinrich Schuchardt
2021-12-04 15:56 ` [PATCH v5 04/28] efi: Locate all block devices in the app Simon Glass
2021-12-04 18:43   ` Heinrich Schuchardt
2021-12-09 19:23     ` Heinrich Schuchardt
2021-12-17 16:37       ` Simon Glass
2021-12-04 15:56 ` [PATCH v5 05/28] efi: serial: Support arrow keys Simon Glass
2021-12-09 19:39   ` Heinrich Schuchardt
2021-12-17 16:37     ` Simon Glass
2021-12-17 17:09       ` Heinrich Schuchardt
2021-12-17 17:42         ` Simon Glass
2021-12-04 15:56 ` Simon Glass [this message]
2021-12-04 15:56 ` [PATCH v5 07/28] x86: Allow booting a kernel from the EFI app Simon Glass
2021-12-04 15:56 ` [PATCH v5 08/28] x86: Don't process the kernel command line unless enabled Simon Glass
2021-12-04 15:56 ` [PATCH v5 09/28] x86: efi: Add room for the binman definition in the dtb Simon Glass
2021-12-04 15:56 ` [PATCH v5 10/28] efi: Drop device_path from struct efi_priv Simon Glass
2021-12-04 15:56 ` [PATCH v5 11/28] efi: Add comments to " Simon Glass
2021-12-04 15:56 ` [PATCH v5 12/28] efi: Fix ll_boot_init() operation with the app Simon Glass
2021-12-04 15:56 ` [PATCH v5 13/28] efi: Add a few comments to the stub Simon Glass
2021-12-04 19:10   ` Heinrich Schuchardt
2021-12-04 15:56 ` [PATCH v5 14/28] efi: Share struct efi_priv between the app and stub code Simon Glass
2021-12-04 15:56 ` [PATCH v5 15/28] efi: Move exit_boot_services into a function Simon Glass
2021-12-04 19:13   ` Heinrich Schuchardt
2021-12-17 16:37     ` Simon Glass
2021-12-04 15:56 ` [PATCH v5 16/28] efi: Check for failure when initing the app Simon Glass
2021-12-09 20:17   ` Heinrich Schuchardt
2021-12-04 15:56 ` [PATCH v5 17/28] efi: Mention that efi_info_get() is only used in the stub Simon Glass
2021-12-09 20:20   ` Heinrich Schuchardt
2021-12-04 15:56 ` [PATCH v5 18/28] efi: Show when allocated pages are used Simon Glass
2021-12-09 19:55   ` Heinrich Schuchardt
2021-12-17 16:37     ` Simon Glass
2021-12-04 15:56 ` [PATCH v5 19/28] efi: Allow easy selection of serial-only operation Simon Glass
2021-12-04 15:56 ` [PATCH v5 20/28] x86: efi: Update efi_get_next_mem_desc() to avoid needing a map Simon Glass
2021-12-04 15:56 ` [PATCH v5 21/28] efi: Support the efi command in the app Simon Glass
2021-12-09 20:27   ` Heinrich Schuchardt
2021-12-17 16:37     ` Simon Glass
2021-12-20  2:38       ` AKASHI Takahiro
2021-12-29 13:36         ` Simon Glass
2021-12-04 15:56 ` [PATCH v5 22/28] x86: efi: Show the system-table revision Simon Glass
2021-12-09 20:29   ` Heinrich Schuchardt
2021-12-17 16:37     ` Simon Glass
2021-12-04 15:56 ` [PATCH v5 23/28] x86: efi: Don't set up global_data again with EFI Simon Glass
2021-12-04 15:56 ` [PATCH v5 24/28] x86: efi: Tweak the code used for the 64-bit EFI app Simon Glass
2021-12-04 15:56 ` [PATCH v5 25/28] x86: efi: Round out the link script for 64-bit EFI Simon Glass
2021-12-04 15:56 ` [PATCH v5 26/28] x86: efi: Don't use the 64-bit link script for the EFI app Simon Glass
2021-12-05 14:03   ` Christian Melki
2021-12-04 15:56 ` [PATCH v5 27/28] x86: efi: Set the correct link flags for the 64-bit " Simon Glass
2021-12-05 14:03   ` Christian Melki
2021-12-04 15:56 ` [PATCH v5 28/28] efi: Build the 64-bit app properly Simon Glass

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211204155657.2913911-3-sjg@chromium.org \
    --to=sjg@chromium.org \
    --cc=bmeng.cn@gmail.com \
    --cc=christian.melki@t2data.com \
    --cc=ilias.apalodimas@linaro.org \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    --cc=xypron.glpk@gmx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.