From: Simon Glass <s...@chromium.org>

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 <s...@chromium.org>
Co-developed-by: Raymond Mao <raymond....@linaro.org>
Signed-off-by: Raymond Mao <raymond....@linaro.org>
Reviewed-by: Simon Glass <s...@chromium.org>
---
Changes in v2
- Update the bloblist alignment to align to FW handoff spec v0.9.

 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 5b5070f7ca..d43e77d373 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;
 
@@ -104,7 +105,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 5606487f5b..1e78a3d4b3 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;
@@ -128,24 +126,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);
 
        /* 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",
@@ -169,7 +167,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;
 
@@ -182,7 +180,7 @@ static int bloblist_ensurerec(uint tag, struct bloblist_rec 
**recp, int size,
        } else {
                int ret;
 
-               ret = bloblist_addrec(tag, size, align, &rec);
+               ret = bloblist_addrec(tag, size, align_log2, &rec);
                if (ret)
                        return ret;
        }
@@ -204,22 +202,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 92dbfda21b..5ad1337d1f 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     = 3,
+       BLOBLIST_ALIGN          = 1 << BLOBLIST_ALIGN_LOG2,
 };
 
 /* Supported tags - add new ones to tag_name in bloblist.c */
@@ -254,11 +256,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
@@ -268,11 +270,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 efa1e32afd..8b435e27ca 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.25.1

Reply via email to