[PATCH v2 1/2] bloblist: add api to get blob with size
Ilias Apalodimas
ilias.apalodimas at linaro.org
Wed Jan 8 08:12:44 CET 2025
On Tue, 7 Jan 2025 at 17:03, Raymond Mao <raymond.mao at linaro.org> wrote:
>
> 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 at linaro.org>
> ---
> Changes in v2
> - Rename function argument.
> - Add ut tests.
>
> common/bloblist.c | 17 +++++++++++++++--
> include/bloblist.h | 18 ++++++++++++++++++
> test/common/bloblist.c | 4 ++++
> 3 files changed, 37 insertions(+), 2 deletions(-)
>
> diff --git a/common/bloblist.c b/common/bloblist.c
> index 110bb9dc44..ab48a3cdb9 100644
> --- a/common/bloblist.c
> +++ b/common/bloblist.c
> @@ -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);
> }
> diff --git a/include/bloblist.h b/include/bloblist.h
> index f999391f74..52ba0ddcf8 100644
> --- a/include/bloblist.h
> +++ b/include/bloblist.h
> @@ -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
> *
> diff --git a/test/common/bloblist.c b/test/common/bloblist.c
> index 4bca62110a..324127596f 100644
> --- a/test/common/bloblist.c
> +++ b/test/common/bloblist.c
> @@ -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));
> --
> 2.25.1
>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
More information about the U-Boot
mailing list