
Hi Simon,
On Wed, May 13, 2020 at 10:24 PM Simon Glass sjg@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@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