summaryrefslogtreecommitdiff
path: root/fs/cbfs
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2020-05-24 17:38:18 -0600
committerBin Meng <bmeng.cn@gmail.com>2020-05-27 14:40:09 +0800
commit9dc2355e515d2026b40da3beab5b9ebaef854c4c (patch)
tree33924b0203609a57a36d05056df4d12d57404bc7 /fs/cbfs
parenta2c528fe8a2187abf444627f964b5b727bf5fd2b (diff)
cbfs: Unify the two header loaders
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> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Diffstat (limited to 'fs/cbfs')
-rw-r--r--fs/cbfs/cbfs.c59
1 files changed, 37 insertions, 22 deletions
diff --git a/fs/cbfs/cbfs.c b/fs/cbfs/cbfs.c
index f3fcdab1a7..a42c3a51d5 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
+ * @end_of_rom: Address of the last byte of the ROM (typically 0xffffffff)
+ * @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
+ * @base: Address of the first byte of the ROM (e.g. 0xff000000)
+ * @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->initialized = 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;