mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-11 07:24:46 +00:00
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:
parent
b8eaa52612
commit
bb894c5da5
3 changed files with 37 additions and 2 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
*
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Add table
Reference in a new issue