Re: [PATCH v5 07/11] bloblist: Handle alignment with a void entry

2024-01-01 Thread Simon Glass
From: Simon Glass 

Rather than setting the alignment using the header size, add an entirely
new entry to cover the gap left by the alignment.

Signed-off-by: Simon Glass 
Co-developed-by: Raymond Mao 
Signed-off-by: Raymond Mao 
Reviewed-by: Simon Glass 
Reviewed-by: Ilias Apalodimas 
---
Changes in v5
- Optimize how to calculate the new allocated size.

 common/bloblist.c | 23 +++
 1 file changed, 19 insertions(+), 4 deletions(-)

Applied to u-boot-dm/next, thanks!


[PATCH v5 07/11] bloblist: Handle alignment with a void entry

2023-12-29 Thread Raymond Mao
From: Simon Glass 

Rather than setting the alignment using the header size, add an entirely
new entry to cover the gap left by the alignment.

Signed-off-by: Simon Glass 
Co-developed-by: Raymond Mao 
Signed-off-by: Raymond Mao 
Reviewed-by: Simon Glass 
Reviewed-by: Ilias Apalodimas 
---
Changes in v5
- Optimize how to calculate the new allocated size.

 common/bloblist.c | 23 +++
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/common/bloblist.c b/common/bloblist.c
index 5b88c6c6a8..da688fe149 100644
--- a/common/bloblist.c
+++ b/common/bloblist.c
@@ -142,7 +142,7 @@ static int bloblist_addrec(uint tag, int size, int 
align_log2,
 {
struct bloblist_hdr *hdr = gd->bloblist;
struct bloblist_rec *rec;
-   int data_start, new_alloced;
+   int data_start, aligned_start, new_alloced;
 
if (!align_log2)
align_log2 = BLOBLIST_ALIGN_LOG2;
@@ -151,10 +151,25 @@ static int bloblist_addrec(uint tag, int size, int 
align_log2,
data_start = map_to_sysmem(hdr) + hdr->alloced + sizeof(*rec);
 
/* Align the address and then calculate the offset from ->alloced */
-   data_start = ALIGN(data_start, 1U << align_log2) - map_to_sysmem(hdr);
+   aligned_start = ALIGN(data_start, 1U << align_log2) - data_start;
+
+   /* If we need to create a dummy record, create it */
+   if (aligned_start) {
+   int void_size = aligned_start - sizeof(*rec);
+   struct bloblist_rec *vrec;
+   int ret;
+
+   ret = bloblist_addrec(BLOBLISTT_VOID, void_size, 0, );
+   if (ret)
+   return log_msg_ret("void", ret);
+
+   /* start the record after that */
+   data_start = map_to_sysmem(hdr) + hdr->alloced + sizeof(*vrec);
+   }
 
/* Calculate the new allocated total */
-   new_alloced = data_start + ALIGN(size, 1U << align_log2);
+   new_alloced = hdr->used_size + sizeof(*rec) +
+ ALIGN(size, 1U << align_log2);
 
if (new_alloced > hdr->size) {
log_err("Failed to allocate %x bytes size=%x, need size=%x\n",
@@ -164,7 +179,7 @@ static int bloblist_addrec(uint tag, int size, int 
align_log2,
rec = (void *)hdr + hdr->alloced;
 
rec->tag = tag;
-   rec->hdr_size = data_start - hdr->alloced;
+   rec->hdr_size = sizeof(struct bloblist_rec);
rec->size = size;
rec->spare = 0;
 
-- 
2.25.1