
-----Original Message----- From: Simon Glass sjg@chromium.org Sent: Tuesday, July 25, 2023 10:36 PM To: U-Boot Mailing List u-boot@lists.denx.de Cc: Ilias Apalodimas ilias.apalodimas@linaro.org; Tom Rini trini@konsulko.com; Julius Werner jwerner@chromium.org; Dan Handley Dan.Handley@arm.com; Jose Marinho Jose.Marinho@arm.com; Simon Glass sjg@chromium.org; Bin Meng bmeng.cn@gmail.com; Nikhil M Jain <n- jain1@ti.com> Subject: [PATCH 02/14] bloblist: Adjust API to align in powers of 2
The updated bloblist structure stores the alignment as a power-of-two value in its structures. Adjust the API to use this, to avoid needing to calling ilog2().
Drop a stale comment while we are here.
Signed-off-by: Simon Glass sjg@chromium.org
arch/x86/lib/tables.c | 3 ++- common/bloblist.c | 24 +++++++++++------------- include/bloblist.h | 12 +++++++----- test/bloblist.c | 4 ++-- 4 files changed, 22 insertions(+), 21 deletions(-)
diff --git a/arch/x86/lib/tables.c b/arch/x86/lib/tables.c index 67bc0a72aeb..8c437738075 100644 --- a/arch/x86/lib/tables.c +++ b/arch/x86/lib/tables.c @@ -16,6 +16,7 @@ #include <asm/mpspec.h> #include <asm/tables.h> #include <asm/coreboot_tables.h> +#include <linux/log2.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -101,7 +102,7 @@ int write_tables(void) if (!gd->arch.table_end) gd->arch.table_end = rom_addr; rom_addr = (ulong)bloblist_add(table->tag, size,
table->align);
ilog2(table->align)); if (!rom_addr) return log_msg_ret("bloblist", -ENOBUFS);
diff --git a/common/bloblist.c b/common/bloblist.c index ca3e6efa800..b9332c03ca7 100644 --- a/common/bloblist.c +++ b/common/bloblist.c @@ -26,8 +26,6 @@
- start address of the data in each blob is aligned as required. Note that
- each blob's *data* is aligned to BLOBLIST_ALIGN regardless of the alignment
- of the bloblist itself or the blob header.
*/
- So far, only BLOBLIST_ALIGN alignment is supported.
DECLARE_GLOBAL_DATA_PTR; @@ -117,24 +115,24 @@ static struct bloblist_rec *bloblist_findrec(uint tag) return NULL; }
-static int bloblist_addrec(uint tag, int size, int align, +static int bloblist_addrec(uint tag, int size, int align_log2, struct bloblist_rec **recp) { struct bloblist_hdr *hdr = gd->bloblist; struct bloblist_rec *rec; int data_start, new_alloced;
- if (!align)
align = BLOBLIST_ALIGN;
if (!align_log2)
align_log2 = BLOBLIST_ALIGN_LOG2;
/* Figure out where the new data will start */ data_start = map_to_sysmem(hdr) + hdr->alloced + sizeof(*rec);
/* Align the address and then calculate the offset from ->alloced */
- data_start = ALIGN(data_start, align) - map_to_sysmem(hdr);
- data_start = ALIGN(data_start, 1U << align_log2) - map_to_sysmem(hdr);
nit: Does it make sense to compute "1U << align_log2" once at the top of the function?
/* Calculate the new allocated total */
- new_alloced = data_start + ALIGN(size, align);
new_alloced = data_start + ALIGN(size, 1U << align_log2);
if (new_alloced > hdr->size) { log_err("Failed to allocate %x bytes size=%x, need size=%x\n",
@@ -158,7 +156,7 @@ static int bloblist_addrec(uint tag, int size, int align, }
static int bloblist_ensurerec(uint tag, struct bloblist_rec **recp, int size,
int align)
int align_log2)
{ struct bloblist_rec *rec;
@@ -171,7 +169,7 @@ static int bloblist_ensurerec(uint tag, struct bloblist_rec **recp, int size, } else { int ret;
ret = bloblist_addrec(tag, size, align, &rec);
if (ret) return ret; }ret = bloblist_addrec(tag, size, align_log2, &rec);
@@ -193,22 +191,22 @@ void *bloblist_find(uint tag, int size) return (void *)rec + rec->hdr_size; }
-void *bloblist_add(uint tag, int size, int align) +void *bloblist_add(uint tag, int size, int align_log2) { struct bloblist_rec *rec;
- if (bloblist_addrec(tag, size, align, &rec))
if (bloblist_addrec(tag, size, align_log2, &rec)) return NULL;
return (void *)rec + rec->hdr_size;
}
-int bloblist_ensure_size(uint tag, int size, int align, void **blobp) +int bloblist_ensure_size(uint tag, int size, int align_log2, void +**blobp) { struct bloblist_rec *rec; int ret;
- ret = bloblist_ensurerec(tag, &rec, size, align);
- ret = bloblist_ensurerec(tag, &rec, size, align_log2); if (ret) return ret; *blobp = (void *)rec + rec->hdr_size;
diff --git a/include/bloblist.h b/include/bloblist.h index bad5fbbb889..e6ce98334d3 100644 --- a/include/bloblist.h +++ b/include/bloblist.h @@ -76,7 +76,9 @@ enum { BLOBLIST_VERSION = 0, BLOBLIST_MAGIC = 0xb00757a3,
- BLOBLIST_ALIGN = 16,
- BLOBLIST_ALIGN_LOG2 = 4,
- BLOBLIST_ALIGN = 1 << BLOBLIST_ALIGN_LOG2,
};
/* Supported tags - add new ones to tag_name in bloblist.c */ @@ -238,11 +240,11 @@ void *bloblist_find(uint tag, int size);
- @tag: Tag to add (enum bloblist_tag_t)
- @size: Size of the blob
- @align: Alignment of the blob (in bytes), 0 for default
*/
- @align_log2: Alignment of the blob (in bytes log2), 0 for default
- Return: pointer to the newly added block, or NULL if there is not enough
- space for the blob
-void *bloblist_add(uint tag, int size, int align); +void *bloblist_add(uint tag, int size, int align_log2);
/**
- bloblist_ensure_size() - Find or add a blob @@ -252,11 +254,11 @@ void
*bloblist_add(uint tag, int size, int align);
- @tag: Tag to add (enum bloblist_tag_t)
- @size: Size of the blob
- @blobp: Returns a pointer to blob on success
- @align: Alignment of the blob (in bytes), 0 for default
*/
- @align_log2: Alignment of the blob (in bytes log2), 0 for default
- Return: 0 if OK, -ENOSPC if it is missing and could not be added due to lack
- of space, or -ESPIPE it exists but has the wrong size
-int bloblist_ensure_size(uint tag, int size, int align, void **blobp); +int bloblist_ensure_size(uint tag, int size, int align_log2, void +**blobp);
/**
- bloblist_ensure() - Find or add a blob diff --git a/test/bloblist.c b/test/bloblist.c
index df9a99d7bd2..3d988fe05ae 100644 --- a/test/bloblist.c +++ b/test/bloblist.c @@ -336,7 +336,7 @@ static int bloblist_test_align(struct unit_test_state *uts)
/* Check larger alignment */ for (i = 0; i < 3; i++) {
int align = 32 << i;
int align = 5 - i;
data = bloblist_add(3 + i, i * 4, align); ut_assertnonnull(data);
@@ -351,7 +351,7 @@ static int bloblist_test_align(struct unit_test_state *uts) ut_assertok(bloblist_new(TEST_ADDR + BLOBLIST_ALIGN, TEST_BLOBLIST_SIZE, 0));
- data = bloblist_add(1, 5, BLOBLIST_ALIGN * 2);
- data = bloblist_add(1, 5, BLOBLIST_ALIGN_LOG2 + 1); ut_assertnonnull(data); addr = map_to_sysmem(data); ut_asserteq(0, addr & (BLOBLIST_ALIGN * 2 - 1));
-- 2.41.0.487.g6d72f3e995-goog