mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 07:04:28 +00:00
bloblist: Add alignment to bloblist_new()
Allow the alignment to be specified when creating a bloblist. Signed-off-by: Simon Glass <sjg@chromium.org> Co-developed-by: Raymond Mao <raymond.mao@linaro.org> Signed-off-by: Raymond Mao <raymond.mao@linaro.org> Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
This commit is contained in:
parent
b86b2d940c
commit
7d790a80b6
3 changed files with 27 additions and 21 deletions
|
@ -351,7 +351,7 @@ static u32 bloblist_calc_chksum(struct bloblist_hdr *hdr)
|
|||
return chksum;
|
||||
}
|
||||
|
||||
int bloblist_new(ulong addr, uint size, uint flags)
|
||||
int bloblist_new(ulong addr, uint size, uint flags, uint align_log2)
|
||||
{
|
||||
struct bloblist_hdr *hdr;
|
||||
|
||||
|
@ -367,6 +367,7 @@ int bloblist_new(ulong addr, uint size, uint flags)
|
|||
hdr->magic = BLOBLIST_MAGIC;
|
||||
hdr->used_size = hdr->hdr_size;
|
||||
hdr->total_size = size;
|
||||
hdr->align_log2 = align_log2 ? align_log2 : BLOBLIST_BLOB_ALIGN_LOG2;
|
||||
hdr->chksum = 0;
|
||||
gd->bloblist = hdr;
|
||||
|
||||
|
@ -522,7 +523,7 @@ int bloblist_init(void)
|
|||
}
|
||||
log_debug("Creating new bloblist size %lx at %lx\n", size,
|
||||
addr);
|
||||
ret = bloblist_new(addr, size, 0);
|
||||
ret = bloblist_new(addr, size, 0, 0);
|
||||
} else {
|
||||
log_debug("Found existing bloblist size %lx at %lx\n", size,
|
||||
addr);
|
||||
|
|
|
@ -330,10 +330,11 @@ int bloblist_resize(uint tag, int new_size);
|
|||
* @addr: Address of bloblist
|
||||
* @size: Initial size for bloblist
|
||||
* @flags: Flags to use for bloblist
|
||||
* @align_log2: Log base 2 of maximum alignment provided by this bloblist
|
||||
* Return: 0 if OK, -EFAULT if addr is not aligned correctly, -ENOSPC is the
|
||||
* area is not large enough
|
||||
*/
|
||||
int bloblist_new(ulong addr, uint size, uint flags);
|
||||
int bloblist_new(ulong addr, uint size, uint flags, uint align_log2);
|
||||
|
||||
/**
|
||||
* bloblist_check() - Check if a bloblist exists
|
||||
|
|
|
@ -72,15 +72,15 @@ static int bloblist_test_init(struct unit_test_state *uts)
|
|||
hdr = clear_bloblist();
|
||||
ut_asserteq(-ENOENT, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
|
||||
ut_asserteq_ptr(NULL, bloblist_check_magic(TEST_ADDR));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0, 0));
|
||||
ut_asserteq_ptr(hdr, bloblist_check_magic(TEST_ADDR));
|
||||
hdr->version++;
|
||||
ut_asserteq(-EPROTONOSUPPORT, bloblist_check(TEST_ADDR,
|
||||
TEST_BLOBLIST_SIZE));
|
||||
|
||||
ut_asserteq(-ENOSPC, bloblist_new(TEST_ADDR, 0xc, 0));
|
||||
ut_asserteq(-EFAULT, bloblist_new(1, TEST_BLOBLIST_SIZE, 0));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
|
||||
ut_asserteq(-ENOSPC, bloblist_new(TEST_ADDR, 0xc, 0, 0));
|
||||
ut_asserteq(-EFAULT, bloblist_new(1, TEST_BLOBLIST_SIZE, 0, 0));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0, 0));
|
||||
|
||||
ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
|
||||
ut_assertok(bloblist_finish());
|
||||
|
@ -106,7 +106,7 @@ static int bloblist_test_blob(struct unit_test_state *uts)
|
|||
/* At the start there should be no records */
|
||||
hdr = clear_bloblist();
|
||||
ut_assertnull(bloblist_find(TEST_TAG, TEST_BLOBLIST_SIZE));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
|
||||
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());
|
||||
ut_asserteq(TEST_ADDR, bloblist_get_base());
|
||||
|
@ -145,7 +145,7 @@ static int bloblist_test_blob_ensure(struct unit_test_state *uts)
|
|||
|
||||
/* At the start there should be no records */
|
||||
clear_bloblist();
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0, 0));
|
||||
|
||||
/* Test with an empty bloblist */
|
||||
size = TEST_SIZE;
|
||||
|
@ -177,7 +177,7 @@ static int bloblist_test_bad_blob(struct unit_test_state *uts)
|
|||
void *data;
|
||||
|
||||
hdr = clear_bloblist();
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0, 0));
|
||||
data = hdr + 1;
|
||||
data += sizeof(struct bloblist_rec);
|
||||
ut_asserteq_addr(data, bloblist_ensure(TEST_TAG, TEST_SIZE));
|
||||
|
@ -193,7 +193,7 @@ static int bloblist_test_checksum(struct unit_test_state *uts)
|
|||
char *data, *data2;
|
||||
|
||||
hdr = clear_bloblist();
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0, 0));
|
||||
ut_assertok(bloblist_finish());
|
||||
ut_assertok(bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
|
||||
|
||||
|
@ -218,6 +218,10 @@ static int bloblist_test_checksum(struct unit_test_state *uts)
|
|||
ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
|
||||
hdr->chksum--;
|
||||
|
||||
hdr->align_log2++;
|
||||
ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
|
||||
hdr->align_log2--;
|
||||
|
||||
/* Make sure the checksum changes when we add blobs */
|
||||
data = bloblist_add(TEST_TAG, TEST_SIZE, 0);
|
||||
ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
|
||||
|
@ -263,7 +267,7 @@ static int bloblist_test_cmd_info(struct unit_test_state *uts)
|
|||
char *data, *data2;
|
||||
|
||||
hdr = clear_bloblist();
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0, 0));
|
||||
data = bloblist_ensure(TEST_TAG, TEST_SIZE);
|
||||
data2 = bloblist_ensure(TEST_TAG2, TEST_SIZE2);
|
||||
|
||||
|
@ -289,7 +293,7 @@ static int bloblist_test_cmd_list(struct unit_test_state *uts)
|
|||
char *data, *data2;
|
||||
|
||||
hdr = clear_bloblist();
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0, 0));
|
||||
data = bloblist_ensure(TEST_TAG, TEST_SIZE);
|
||||
data2 = bloblist_ensure(TEST_TAG2, TEST_SIZE2);
|
||||
|
||||
|
@ -319,7 +323,7 @@ static int bloblist_test_align(struct unit_test_state *uts)
|
|||
|
||||
/* At the start there should be no records */
|
||||
hdr = clear_bloblist();
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0, 0));
|
||||
ut_assertnull(bloblist_find(TEST_TAG, TEST_BLOBLIST_SIZE));
|
||||
|
||||
/* Check the default alignment */
|
||||
|
@ -356,7 +360,7 @@ static int bloblist_test_align(struct unit_test_state *uts)
|
|||
memset(hdr, ERASE_BYTE, TEST_BLOBLIST_SIZE);
|
||||
memset(hdr, '\0', sizeof(*hdr));
|
||||
ut_assertok(bloblist_new(TEST_ADDR + BLOBLIST_ALIGN, TEST_BLOBLIST_SIZE,
|
||||
0));
|
||||
0, 0));
|
||||
|
||||
data = bloblist_add(1, 5, BLOBLIST_ALIGN_LOG2 + 1);
|
||||
ut_assertnonnull(data);
|
||||
|
@ -377,7 +381,7 @@ static int bloblist_test_reloc(struct unit_test_state *uts)
|
|||
ulong new_addr;
|
||||
ulong new_size;
|
||||
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0, 0));
|
||||
old_ptr = map_sysmem(TEST_ADDR, TEST_BLOBLIST_SIZE);
|
||||
|
||||
/* Add one blob and then one that won't fit */
|
||||
|
@ -416,7 +420,7 @@ static int bloblist_test_grow(struct unit_test_state *uts)
|
|||
memset(hdr, ERASE_BYTE, TEST_BLOBLIST_SIZE);
|
||||
|
||||
/* Create two blobs */
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0, 0));
|
||||
blob1 = bloblist_add(TEST_TAG, small_size, 0);
|
||||
ut_assertnonnull(blob1);
|
||||
ut_assertok(check_zero(blob1, small_size));
|
||||
|
@ -468,7 +472,7 @@ static int bloblist_test_shrink(struct unit_test_state *uts)
|
|||
ptr = map_sysmem(TEST_ADDR, TEST_BLOBLIST_SIZE);
|
||||
|
||||
/* Create two blobs */
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0, 0));
|
||||
blob1 = bloblist_add(TEST_TAG, small_size, 0);
|
||||
ut_assertnonnull(blob1);
|
||||
strcpy(blob1, test1_str);
|
||||
|
@ -518,7 +522,7 @@ static int bloblist_test_resize_fail(struct unit_test_state *uts)
|
|||
ptr = map_sysmem(TEST_ADDR, TEST_BLOBLIST_SIZE);
|
||||
|
||||
/* Create two blobs */
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0, 0));
|
||||
blob1 = bloblist_add(TEST_TAG, small_size, 0);
|
||||
ut_assertnonnull(blob1);
|
||||
|
||||
|
@ -555,7 +559,7 @@ static int bloblist_test_resize_last(struct unit_test_state *uts)
|
|||
hdr = ptr;
|
||||
|
||||
/* Create two blobs */
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0, 0));
|
||||
blob1 = bloblist_add(TEST_TAG, small_size, 0);
|
||||
ut_assertnonnull(blob1);
|
||||
|
||||
|
@ -600,7 +604,7 @@ static int bloblist_test_blob_maxsize(struct unit_test_state *uts)
|
|||
|
||||
/* At the start there should be no records */
|
||||
clear_bloblist();
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0));
|
||||
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0, 0));
|
||||
|
||||
/* Add a blob that takes up all space */
|
||||
size = TEST_BLOBLIST_SIZE - sizeof(struct bloblist_hdr) -
|
||||
|
|
Loading…
Reference in a new issue