[PATCH 02/14] bloblist: Adjust API to align in powers of 2

Jose Marinho Jose.Marinho at arm.com
Wed Aug 2 12:24:18 CEST 2023



> -----Original Message-----
> From: Simon Glass <sjg at chromium.org>
> Sent: Tuesday, July 25, 2023 10:36 PM
> To: U-Boot Mailing List <u-boot at lists.denx.de>
> Cc: Ilias Apalodimas <ilias.apalodimas at linaro.org>; Tom Rini
> <trini at konsulko.com>; Julius Werner <jwerner at chromium.org>; Dan Handley
> <Dan.Handley at arm.com>; Jose Marinho <Jose.Marinho at arm.com>; Simon
> Glass <sjg at chromium.org>; Bin Meng <bmeng.cn at gmail.com>; Nikhil M Jain <n-
> jain1 at ti.com>
> Subject: [PATCH 02/14] bloblist: Adjust API to align in powers of 2
> 
> The updated bloblist structure stores the alignment as a power-of-two value in its
> structures. Adjust the API to use this, to avoid needing to calling ilog2().
> 
> Drop a stale comment while we are here.
> 
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
> 
>  arch/x86/lib/tables.c |  3 ++-
>  common/bloblist.c     | 24 +++++++++++-------------
>  include/bloblist.h    | 12 +++++++-----
>  test/bloblist.c       |  4 ++--
>  4 files changed, 22 insertions(+), 21 deletions(-)
> 
> diff --git a/arch/x86/lib/tables.c b/arch/x86/lib/tables.c index
> 67bc0a72aeb..8c437738075 100644
> --- a/arch/x86/lib/tables.c
> +++ b/arch/x86/lib/tables.c
> @@ -16,6 +16,7 @@
>  #include <asm/mpspec.h>
>  #include <asm/tables.h>
>  #include <asm/coreboot_tables.h>
> +#include <linux/log2.h>
> 
>  DECLARE_GLOBAL_DATA_PTR;
> 
> @@ -101,7 +102,7 @@ int write_tables(void)
>  			if (!gd->arch.table_end)
>  				gd->arch.table_end = rom_addr;
>  			rom_addr = (ulong)bloblist_add(table->tag, size,
> -						       table->align);
> +						       ilog2(table->align));
>  			if (!rom_addr)
>  				return log_msg_ret("bloblist", -ENOBUFS);
> 
> diff --git a/common/bloblist.c b/common/bloblist.c index
> ca3e6efa800..b9332c03ca7 100644
> --- a/common/bloblist.c
> +++ b/common/bloblist.c
> @@ -26,8 +26,6 @@
>   * start address of the data in each blob is aligned as required. Note that
>   * each blob's *data* is aligned to BLOBLIST_ALIGN regardless of the alignment
>   * of the bloblist itself or the blob header.
> - *
> - * So far, only BLOBLIST_ALIGN alignment is supported.
>   */
> 
>  DECLARE_GLOBAL_DATA_PTR;
> @@ -117,24 +115,24 @@ static struct bloblist_rec *bloblist_findrec(uint tag)
>  	return NULL;
>  }
> 
> -static int bloblist_addrec(uint tag, int size, int align,
> +static int bloblist_addrec(uint tag, int size, int align_log2,
>  			   struct bloblist_rec **recp)
>  {
>  	struct bloblist_hdr *hdr = gd->bloblist;
>  	struct bloblist_rec *rec;
>  	int data_start, new_alloced;
> 
> -	if (!align)
> -		align = BLOBLIST_ALIGN;
> +	if (!align_log2)
> +		align_log2 = BLOBLIST_ALIGN_LOG2;
> 
>  	/* Figure out where the new data will start */
>  	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, align) - map_to_sysmem(hdr);
> +	data_start = ALIGN(data_start, 1U << align_log2) - map_to_sysmem(hdr);

nit: Does it make sense to compute "1U << align_log2" once at the top of the function?


> 
>  	/* Calculate the new allocated total */
> -	new_alloced = data_start + ALIGN(size, align);
> +	new_alloced = data_start + ALIGN(size, 1U << align_log2);
> 
>  	if (new_alloced > hdr->size) {
>  		log_err("Failed to allocate %x bytes size=%x, need size=%x\n",
> @@ -158,7 +156,7 @@ static int bloblist_addrec(uint tag, int size, int align,  }
> 
>  static int bloblist_ensurerec(uint tag, struct bloblist_rec **recp, int size,
> -			      int align)
> +			      int align_log2)
>  {
>  	struct bloblist_rec *rec;
> 
> @@ -171,7 +169,7 @@ static int bloblist_ensurerec(uint tag, struct bloblist_rec
> **recp, int size,
>  	} else {
>  		int ret;
> 
> -		ret = bloblist_addrec(tag, size, align, &rec);
> +		ret = bloblist_addrec(tag, size, align_log2, &rec);
>  		if (ret)
>  			return ret;
>  	}
> @@ -193,22 +191,22 @@ void *bloblist_find(uint tag, int size)
>  	return (void *)rec + rec->hdr_size;
>  }
> 
> -void *bloblist_add(uint tag, int size, int align)
> +void *bloblist_add(uint tag, int size, int align_log2)
>  {
>  	struct bloblist_rec *rec;
> 
> -	if (bloblist_addrec(tag, size, align, &rec))
> +	if (bloblist_addrec(tag, size, align_log2, &rec))
>  		return NULL;
> 
>  	return (void *)rec + rec->hdr_size;
>  }
> 
> -int bloblist_ensure_size(uint tag, int size, int align, void **blobp)
> +int bloblist_ensure_size(uint tag, int size, int align_log2, void
> +**blobp)
>  {
>  	struct bloblist_rec *rec;
>  	int ret;
> 
> -	ret = bloblist_ensurerec(tag, &rec, size, align);
> +	ret = bloblist_ensurerec(tag, &rec, size, align_log2);
>  	if (ret)
>  		return ret;
>  	*blobp = (void *)rec + rec->hdr_size;
> diff --git a/include/bloblist.h b/include/bloblist.h index
> bad5fbbb889..e6ce98334d3 100644
> --- a/include/bloblist.h
> +++ b/include/bloblist.h
> @@ -76,7 +76,9 @@
>  enum {
>  	BLOBLIST_VERSION	= 0,
>  	BLOBLIST_MAGIC		= 0xb00757a3,
> -	BLOBLIST_ALIGN		= 16,
> +
> +	BLOBLIST_ALIGN_LOG2	= 4,
> +	BLOBLIST_ALIGN		= 1 << BLOBLIST_ALIGN_LOG2,
>  };
> 
>  /* Supported tags - add new ones to tag_name in bloblist.c */ @@ -238,11
> +240,11 @@ void *bloblist_find(uint tag, int size);
>   *
>   * @tag:	Tag to add (enum bloblist_tag_t)
>   * @size:	Size of the blob
> - * @align:	Alignment of the blob (in bytes), 0 for default
> + * @align_log2:	Alignment of the blob (in bytes log2), 0 for default
>   * Return: pointer to the newly added block, or NULL if there is not enough
>   * space for the blob
>   */
> -void *bloblist_add(uint tag, int size, int align);
> +void *bloblist_add(uint tag, int size, int align_log2);
> 
>  /**
>   * bloblist_ensure_size() - Find or add a blob @@ -252,11 +254,11 @@ void
> *bloblist_add(uint tag, int size, int align);
>   * @tag:	Tag to add (enum bloblist_tag_t)
>   * @size:	Size of the blob
>   * @blobp:	Returns a pointer to blob on success
> - * @align:	Alignment of the blob (in bytes), 0 for default
> + * @align_log2:	Alignment of the blob (in bytes log2), 0 for default
>   * Return: 0 if OK, -ENOSPC if it is missing and could not be added due to lack
>   * of space, or -ESPIPE it exists but has the wrong size
>   */
> -int bloblist_ensure_size(uint tag, int size, int align, void **blobp);
> +int bloblist_ensure_size(uint tag, int size, int align_log2, void
> +**blobp);
> 
>  /**
>   * bloblist_ensure() - Find or add a blob diff --git a/test/bloblist.c b/test/bloblist.c
> index df9a99d7bd2..3d988fe05ae 100644
> --- a/test/bloblist.c
> +++ b/test/bloblist.c
> @@ -336,7 +336,7 @@ static int bloblist_test_align(struct unit_test_state *uts)
> 
>  	/* Check larger alignment */
>  	for (i = 0; i < 3; i++) {
> -		int align = 32 << i;
> +		int align = 5 - i;
> 
>  		data = bloblist_add(3 + i, i * 4, align);
>  		ut_assertnonnull(data);
> @@ -351,7 +351,7 @@ static int bloblist_test_align(struct unit_test_state *uts)
>  	ut_assertok(bloblist_new(TEST_ADDR + BLOBLIST_ALIGN,
> TEST_BLOBLIST_SIZE,
>  				 0));
> 
> -	data = bloblist_add(1, 5, BLOBLIST_ALIGN * 2);
> +	data = bloblist_add(1, 5, BLOBLIST_ALIGN_LOG2 + 1);
>  	ut_assertnonnull(data);
>  	addr = map_to_sysmem(data);
>  	ut_asserteq(0, addr & (BLOBLIST_ALIGN * 2 - 1));
> --
> 2.41.0.487.g6d72f3e995-goog



More information about the U-Boot mailing list