- file_cbfs_fill_cache(start_of_rom, cbfs_header.rom_size,
- cbfs_header.align);
- if (file_cbfs_result == CBFS_SUCCESS)
- initialized = 1;
+ file_cbfs_fill_cache(priv, start_of_rom, priv->header.rom_size,
+ priv->header.align);
+ if (priv->result == CBFS_SUCCESS)
+ priv->initialized = 1;
+}
+
+void file_cbfs_init(uintptr_t end_of_rom)
+{
+ cbfs_init(&cbfs_s, end_of_rom);
+}
+
+int cbfs_init_mem(ulong base, ulong size, 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. Assume that a master header appears at the start, at offset
+ * 0x38.
+ */
+ ret = cbfs_load_header_ptr(priv, base + 0x38, &priv->header);
+ if (ret)
+ return ret;
+
+ file_cbfs_fill_cache(priv, (u8 *)base, priv->header.rom_size,
+ priv->header.align);
+ if (priv->result != CBFS_SUCCESS)
+ return -EINVAL;
+
+ priv->initialized = 1;
+ priv = malloc(sizeof(priv_s));
+ if (!priv)
+ return -ENOMEM;
+ memcpy(priv, &priv_s, sizeof(priv_s));
+ *privp = priv;
+
+ return 0;