[PATCH 07/13] cbfs: Unify the two header loaders

Bin Meng bmeng.cn at gmail.com
Thu May 21 04:27:00 CEST 2020


Hi Simon,

On Wed, May 13, 2020 at 10:24 PM Simon Glass <sjg at chromium.org> wrote:
>
> These two functions have mostly the same code. Pull this out into a common
> function.
>
> Also make this function zero the private data so that callers don't have
> to do it. Finally, update cbfs_load_header_ptr() to take the base of the
> ROM as its parameter, which makes more sense than passing the address of
> the header within the ROM.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
>  fs/cbfs/cbfs.c | 59 +++++++++++++++++++++++++++++++-------------------
>  1 file changed, 37 insertions(+), 22 deletions(-)
>
> diff --git a/fs/cbfs/cbfs.c b/fs/cbfs/cbfs.c
> index 05de58cf19..b4e6b959d1 100644
> --- a/fs/cbfs/cbfs.c
> +++ b/fs/cbfs/cbfs.c
> @@ -177,47 +177,63 @@ static int file_cbfs_fill_cache(struct cbfs_priv *priv, u8 *start, u32 size,
>         return 0;
>  }
>
> -/* Get the CBFS header out of the ROM and do endian conversion. */
> -static int file_cbfs_load_header(struct cbfs_priv *priv, ulong end_of_rom)
> +/**
> + * load_header() - Load the CBFS header
> + *
> + * Get the CBFS header out of the ROM and do endian conversion.
> + *
> + * @priv: Private data, which is inited by this function
> + * @addr: Address of CBFS header in memory-mapped SPI flash
> + * @return 0 if OK, -ENXIO if the header is bad
> + */
> +static int load_header(struct cbfs_priv *priv, ulong addr)
>  {
>         struct cbfs_header *header = &priv->header;
>         struct cbfs_header *header_in_rom;
> -       int32_t offset = *(u32 *)(end_of_rom - 3);
>
> -       header_in_rom = (struct cbfs_header *)(end_of_rom + offset + 1);
> +       memset(priv, '\0', sizeof(*priv));
> +       header_in_rom = (struct cbfs_header *)addr;
>         swap_header(header, header_in_rom);
>
>         if (header->magic != good_magic || header->offset >
>                         header->rom_size - header->boot_block_size) {
>                 priv->result = CBFS_BAD_HEADER;
> -               return 1;
> +               return -ENXIO;
>         }
> +
>         return 0;
>  }
>
> -static int cbfs_load_header_ptr(struct cbfs_priv *priv, ulong base)
> +/**
> + * file_cbfs_load_header() - Get the CBFS header out of the ROM, given the end
> + *
> + * @priv: Private data, which is inited by this function
> + * @addr: Address of the last byte of the ROM (typically 0xffffffff)

This should be end_of_rom

> + * @return 0 if OK, -ENXIO if the header is bad
> + */
> +static int file_cbfs_load_header(struct cbfs_priv *priv, ulong end_of_rom)
>  {
> -       struct cbfs_header *header = &priv->header;
> -       struct cbfs_header *header_in_rom;
> -
> -       header_in_rom = (struct cbfs_header *)base;
> -       swap_header(header, header_in_rom);
> +       int offset = *(u32 *)(end_of_rom - 3);
>
> -       if (header->magic != good_magic || header->offset >
> -                       header->rom_size - header->boot_block_size) {
> -               priv->result = CBFS_BAD_HEADER;
> -               return -EFAULT;
> -       }
> +       return load_header(priv, end_of_rom + offset + 1);
> +}
>
> -       return 0;
> +/**
> + * cbfs_load_header_ptr() - Get the CBFS header out of the ROM, given the base
> + *
> + * @priv: Private data, which is inited by this function
> + * @addr: Address of the first byte of the ROM (e.g. 0xff000000)

This should be base

> + * @return 0 if OK, -ENXIO if the header is bad
> + */
> +static int cbfs_load_header_ptr(struct cbfs_priv *priv, ulong base)
> +{
> +       return load_header(priv, base + MASTER_HDR_OFFSET);
>  }
>
>  static void cbfs_init(struct cbfs_priv *priv, ulong end_of_rom)
>  {
>         u8 *start_of_rom;
>
> -       priv->initialised = false;
> -
>         if (file_cbfs_load_header(priv, end_of_rom))
>                 return;
>
> @@ -241,10 +257,9 @@ int cbfs_init_mem(ulong base, ulong size, struct cbfs_priv **privp)
>
>         /*
>          * Use a local variable to start with until we know that the CBFS is
> -        * valid. Assume that a master header appears at the start, at offset
> -        * 0x38.
> +        * valid.
>          */
> -       ret = cbfs_load_header_ptr(priv, base + MASTER_HDR_OFFSET);
> +       ret = cbfs_load_header_ptr(priv, base);
>         if (ret)
>                 return ret;
>

Regards,
Bin


More information about the U-Boot mailing list