summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2020-05-24 17:38:20 -0600
committerBin Meng <bmeng.cn@gmail.com>2020-05-27 14:40:09 +0800
commitc685f8bcfcf097b1f46ea742a65765b7696a9a48 (patch)
tree10e25c472dfd5d1eb9d1b977e2100d7a39bee585 /fs
parente82ab51bafecef063a081851d592fe82b680d50f (diff)
cbfs: Record the start address in cbfs_priv
The start address of the CBFS is used when scanning for files. It makes sense to put this in our cbfs_priv struct and calculate it when we read the header. Update the code accordingly. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/cbfs/cbfs.c44
1 files changed, 31 insertions, 13 deletions
diff --git a/fs/cbfs/cbfs.c b/fs/cbfs/cbfs.c
index 40198ae7e7..dc9789fcb8 100644
--- a/fs/cbfs/cbfs.c
+++ b/fs/cbfs/cbfs.c
@@ -14,8 +14,18 @@
static const u32 good_magic = 0x4f524243;
static const u8 good_file_magic[] = "LARCHIVE";
+/**
+ * struct cbfs_priv - Private data for this driver
+ *
+ * @initialised: true if this CBFS has been inited
+ * @start: Start position of CBFS in memory, typically memory-mapped SPI flash
+ * @header: Header read from the CBFS, byte-swapped so U-Boot can access it
+ * @file_cache: List of file headers read from CBFS
+ * @result: Success/error result
+ */
struct cbfs_priv {
bool initialized;
+ void *start;
struct cbfs_header header;
struct cbfs_cachenode *file_cache;
enum cbfs_result result;
@@ -132,12 +142,12 @@ static int file_cbfs_next_file(struct cbfs_priv *priv, void *start, int size,
}
/* Look through a CBFS instance and copy file metadata into regular memory. */
-static int file_cbfs_fill_cache(struct cbfs_priv *priv, void *start, u32 size,
- u32 align)
+static int file_cbfs_fill_cache(struct cbfs_priv *priv, int size, int align)
{
struct cbfs_cachenode *cache_node;
struct cbfs_cachenode *new_node;
struct cbfs_cachenode **cache_tail = &priv->file_cache;
+ void *start;
/* Clear out old information. */
cache_node = priv->file_cache;
@@ -148,6 +158,7 @@ static int file_cbfs_fill_cache(struct cbfs_priv *priv, void *start, u32 size,
}
priv->file_cache = NULL;
+ start = priv->start;
while (size >= align) {
int used;
int ret;
@@ -213,8 +224,14 @@ static int load_header(struct cbfs_priv *priv, ulong addr)
static int file_cbfs_load_header(struct cbfs_priv *priv, ulong end_of_rom)
{
int offset = *(u32 *)(end_of_rom - 3);
+ int ret;
+
+ ret = load_header(priv, end_of_rom + offset + 1);
+ if (ret)
+ return ret;
+ priv->start = (void *)(end_of_rom + 1 - priv->header.rom_size);
- return load_header(priv, end_of_rom + offset + 1);
+ return 0;
}
/**
@@ -226,20 +243,22 @@ static int file_cbfs_load_header(struct cbfs_priv *priv, ulong end_of_rom)
*/
static int cbfs_load_header_ptr(struct cbfs_priv *priv, ulong base)
{
- return load_header(priv, base + MASTER_HDR_OFFSET);
+ int ret;
+
+ ret = load_header(priv, base + MASTER_HDR_OFFSET);
+ if (ret)
+ return ret;
+ priv->start = (void *)base;
+
+ return 0;
}
static void cbfs_init(struct cbfs_priv *priv, ulong end_of_rom)
{
- void *start_of_rom;
-
if (file_cbfs_load_header(priv, end_of_rom))
return;
- start_of_rom = (void *)(end_of_rom + 1 - priv->header.rom_size);
-
- file_cbfs_fill_cache(priv, start_of_rom, priv->header.rom_size,
- priv->header.align);
+ file_cbfs_fill_cache(priv, priv->header.rom_size, priv->header.align);
if (priv->result == CBFS_SUCCESS)
priv->initialized = true;
}
@@ -262,8 +281,7 @@ int cbfs_init_mem(ulong base, ulong size, struct cbfs_priv **privp)
if (ret)
return ret;
- file_cbfs_fill_cache(priv, (void *)base, priv->header.rom_size,
- priv->header.align);
+ file_cbfs_fill_cache(priv, priv->header.rom_size, priv->header.align);
if (priv->result != CBFS_SUCCESS)
return -EINVAL;
@@ -358,7 +376,7 @@ const struct cbfs_cachenode *file_cbfs_find_uncached(ulong end_of_rom,
if (file_cbfs_load_header(priv, end_of_rom))
return NULL;
- start = (void *)(end_of_rom + 1 - priv->header.rom_size);
+ start = priv->start;
size = priv->header.rom_size;
align = priv->header.align;