cbfs: Allow access to CBFS without a header
authorSimon Glass <sjg@chromium.org>
Mon, 15 Mar 2021 05:00:12 +0000 (18:00 +1300)
committerSimon Glass <sjg@chromium.org>
Sat, 27 Mar 2021 00:59:37 +0000 (13:59 +1300)
In some cases CBFS does not start with a header but is just a collection
of files. It is possible to support this so long as the size of the CBFS
is provided.

Update the cbfs_init_mem() function to support this.

Signed-off-by: Simon Glass <sjg@chromium.org>
arch/x86/lib/fsp2/fsp_init.c
fs/cbfs/cbfs.c
include/cbfs.h

index 85cae54..5afdce1 100644 (file)
@@ -84,7 +84,8 @@ static int get_cbfs_fsp(enum fsp_type_t type, ulong map_base,
        struct cbfs_priv *cbfs;
        int ret;
 
-       ret = cbfs_init_mem(map_base + cbfs_base, &cbfs);
+       ret = cbfs_init_mem(map_base + cbfs_base, CBFS_SIZE_UNKNOWN, true,
+                           &cbfs);
        if (ret)
                return ret;
        if (!ret) {
index c9323a5..13a74e6 100644 (file)
@@ -276,18 +276,26 @@ int file_cbfs_init(ulong end_of_rom)
        return cbfs_init(&cbfs_s, end_of_rom);
 }
 
-int cbfs_init_mem(ulong base, struct cbfs_priv **privp)
+int cbfs_init_mem(ulong base, ulong size, bool require_hdr,
+                 struct cbfs_priv **privp)
 {
        struct cbfs_priv priv_s, *priv = &priv_s;
        int ret;
 
        /*
-        * Use a local variable to start with until we know that the CBFS is
-        * valid.
+        * Use a local variable to start with until we know that the * CBFS is
+        * valid. Note that size is detected from the header, if present,
+        * meaning the parameter is ignored.
         */
        ret = cbfs_load_header_ptr(priv, base);
-       if (ret)
-               return ret;
+       if (ret) {
+               if (require_hdr || size == CBFS_SIZE_UNKNOWN)
+                       return ret;
+               memset(priv, '\0', sizeof(struct cbfs_priv));
+               priv->header.rom_size = size;
+               priv->header.align = CBFS_ALIGN_SIZE;
+               priv->start = (void *)base;
+       }
 
        ret = file_cbfs_fill_cache(priv, priv->header.rom_size,
                                   priv->header.align);
index d98afea..05770e2 100644 (file)
@@ -42,6 +42,8 @@ enum cbfs_filetype {
 
 enum {
        CBFS_HEADER_MAGIC       = 0x4f524243,
+       CBFS_SIZE_UNKNOWN       = 0xffffffff,
+       CBFS_ALIGN_SIZE         = 0x40,
 };
 
 /**
@@ -186,11 +188,13 @@ const struct cbfs_cachenode *cbfs_find_file(struct cbfs_priv *cbfs,
  * cbfs_init_mem() - Set up a new CBFS
  *
  * @base: Base address of CBFS
+ * @size: Size of CBFS if known, else CBFS_SIZE_UNKNOWN
+ * @require_header: true to read a header at the start, false to not require one
  * @cbfsp: Returns a pointer to CBFS on success
  * @return 0 if OK, -ve on error
  */
-int cbfs_init_mem(ulong base, struct cbfs_priv **privp);
-
+int cbfs_init_mem(ulong base, ulong size, bool require_hdr,
+                 struct cbfs_priv **privp);
 
 /***************************************************************************/
 /* All of the functions below can be used without first initializing CBFS. */