bloblist: add api to get blob with size

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>
This commit is contained in:
Raymond Mao 2025-01-27 06:49:34 -08:00 committed by Ilias Apalodimas
parent b8eaa52612
commit bb894c5da5
3 changed files with 37 additions and 2 deletions

View 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);
}

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

View 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));