bloblist: add api to get blob with size
authorRaymond Mao <raymond.mao@linaro.org>
Mon, 27 Jan 2025 14:49:34 +0000 (06:49 -0800)
committerIlias Apalodimas <ilias.apalodimas@linaro.org>
Tue, 28 Jan 2025 06:59:21 +0000 (08:59 +0200)
bloblist_find function only returns the pointer of blob data,
which is fine for those self-describing data like FDT.
But as a common scenario, an interface is needed to retrieve both
the pointer and the size of the blob data.

Add a few ut test cases for the new api.

Signed-off-by: Raymond Mao <raymond.mao@linaro.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
common/bloblist.c
include/bloblist.h
test/common/bloblist.c

index 110bb9d..ab48a3c 100644 (file)
@@ -222,14 +222,27 @@ static int bloblist_ensurerec(uint tag, struct bloblist_rec **recp, int size,
 }
 
 void *bloblist_find(uint tag, int size)
+{
+       void *blob = NULL;
+       int blob_size;
+
+       blob = bloblist_get_blob(tag, &blob_size);
+
+       if (size && size != blob_size)
+               return NULL;
+
+       return blob;
+}
+
+void *bloblist_get_blob(uint tag, int *sizep)
 {
        struct bloblist_rec *rec;
 
        rec = bloblist_findrec(tag);
        if (!rec)
                return NULL;
-       if (size && size != rec->size)
-               return NULL;
+
+       *sizep = rec->size;
 
        return (void *)rec + rec_hdr_size(rec);
 }
index f999391..52ba0dd 100644 (file)
@@ -250,6 +250,24 @@ static inline void *bloblist_check_magic(ulong addr)
        return ptr;
 }
 
+#if CONFIG_IS_ENABLED(BLOBLIST)
+/**
+ * bloblist_get_blob() - Find a blob and get the size of it
+ *
+ * Searches the bloblist and returns the blob with the matching tag
+ *
+ * @tag:       Tag to search for (enum bloblist_tag_t)
+ * @sizep:     Size of the blob found
+ * Return: pointer to bloblist if found, or NULL if not found
+ */
+void *bloblist_get_blob(uint tag, int *sizep);
+#else
+static inline void *bloblist_get_blob(uint tag, int *sizep)
+{
+       return NULL;
+}
+#endif
+
 /**
  * bloblist_find() - Find a blob
  *
index 9467abf..ab8f41c 100644 (file)
@@ -98,10 +98,12 @@ static int bloblist_test_blob(struct unit_test_state *uts)
        struct bloblist_hdr *hdr;
        struct bloblist_rec *rec, *rec2;
        char *data;
+       int size = 0;
 
        /* At the start there should be no records */
        hdr = clear_bloblist();
        ut_assertnull(bloblist_find(TEST_TAG, TEST_BLOBLIST_SIZE));
+       ut_assertnull(bloblist_get_blob(TEST_TAG, &size));
        ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0, 0));
        ut_asserteq(sizeof(struct bloblist_hdr), bloblist_get_size());
        ut_asserteq(TEST_BLOBLIST_SIZE, bloblist_get_total_size());
@@ -114,6 +116,8 @@ static int bloblist_test_blob(struct unit_test_state *uts)
        ut_asserteq_addr(rec + 1, data);
        data = bloblist_find(TEST_TAG, TEST_SIZE);
        ut_asserteq_addr(rec + 1, data);
+       ut_asserteq_addr(bloblist_get_blob(TEST_TAG, &size), data);
+       ut_asserteq(size, TEST_SIZE);
 
        /* Check the data is zeroed */
        ut_assertok(check_zero(data, TEST_SIZE));