cbfs: Record the start address in cbfs_priv
authorSimon Glass <sjg@chromium.org>
Sun, 24 May 2020 23:38:20 +0000 (17:38 -0600)
committerBin Meng <bmeng.cn@gmail.com>
Wed, 27 May 2020 06:40:09 +0000 (14:40 +0800)
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>
fs/cbfs/cbfs.c

index 40198ae7e727d656770845b05b9f7782c2ab223a..dc9789fcb8607126b09b108db2281c816af52c4f 100644 (file)
 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;