cbfs: Hook up to new CBFS implementation

This patch hooks coreboot up to the new commonlib/bsd CBFS
implementation. This is intended as the "minimum viable patch" that
makes the new implementation useable with the smallest amount of changes
-- that is why some of this may look a bit roundabout (returning the
whole metadata for a file but then just using that to fill out the rdevs
of the existing struct cbfsf). Future changes will migrate the higher
level CBFS APIs one-by-one to use the new implementation directly
(rather than translated into the results of the old one), at which point
this will become more efficient.

Change-Id: I4d112d1239475920de2d872dac179c245275038d
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/38422
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/src/commonlib/Makefile.inc b/src/commonlib/Makefile.inc
index 5bd6cf9..b2225cb 100644
--- a/src/commonlib/Makefile.inc
+++ b/src/commonlib/Makefile.inc
@@ -30,6 +30,13 @@
 smm-y += cbfs.c
 postcar-y += cbfs.c
 
+bootblock-y += bsd/cbfs_private.c
+verstage-y += bsd/cbfs_private.c
+romstage-y += bsd/cbfs_private.c
+postcar-y += bsd/cbfs_private.c
+ramstage-y += bsd/cbfs_private.c
+smm-y += bsd/cbfs_private.c
+
 decompressor-y += bsd/lz4_wrapper.c
 bootblock-y += bsd/lz4_wrapper.c
 verstage-y += bsd/lz4_wrapper.c
diff --git a/src/commonlib/cbfs.c b/src/commonlib/cbfs.c
index 115f99a..999c35e 100644
--- a/src/commonlib/cbfs.c
+++ b/src/commonlib/cbfs.c
@@ -7,21 +7,6 @@
 #include <string.h>
 #include <vb2_sha.h>
 
-#if !defined(LOG)
-#define LOG(x...) printk(BIOS_INFO, "CBFS: " x)
-#endif
-#if defined(CONFIG)
-
-#if CONFIG(DEBUG_CBFS)
-#define DEBUG(x...) printk(BIOS_SPEW, "CBFS: " x)
-#else
-#define DEBUG(x...)
-#endif
-
-#elif !defined(DEBUG)
-#define DEBUG(x...)
-#endif
-
 static size_t cbfs_next_offset(const struct region_device *cbfs,
 				const struct cbfsf *f)
 {
diff --git a/src/commonlib/include/commonlib/cbfs.h b/src/commonlib/include/commonlib/cbfs.h
index 90aa0b2..6565c1d 100644
--- a/src/commonlib/include/commonlib/cbfs.h
+++ b/src/commonlib/include/commonlib/cbfs.h
@@ -3,7 +3,7 @@
 #ifndef _COMMONLIB_CBFS_H_
 #define _COMMONLIB_CBFS_H_
 
-#include <commonlib/bsd/cbfs_serialized.h>
+#include <commonlib/bsd/cbfs_private.h>
 #include <commonlib/region.h>
 #include <vb2_api.h>
 
@@ -11,6 +11,7 @@
 struct cbfsf {
 	struct region_device metadata;
 	struct region_device data;
+	union cbfs_mdata mdata;
 };
 
 /* Locate file by name and optional type. Returns 0 on success else < 0 on
diff --git a/src/include/cbfs_glue.h b/src/include/cbfs_glue.h
new file mode 100644
index 0000000..ebfbc2e
--- /dev/null
+++ b/src/include/cbfs_glue.h
@@ -0,0 +1,30 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef _CBFS_GLUE_H_
+#define _CBFS_GLUE_H_
+
+#include <commonlib/region.h>
+#include <console/console.h>
+
+#define CBFS_ENABLE_HASHING 0
+
+#define ERROR(...) printk(BIOS_ERR, "CBFS ERROR: " __VA_ARGS__)
+#define LOG(...) printk(BIOS_ERR, "CBFS: " __VA_ARGS__)
+#define DEBUG(...) do { \
+	if (CONFIG(DEBUG_CBFS)) \
+		printk(BIOS_SPEW, "CBFS DEBUG: " __VA_ARGS__); \
+} while (0)
+
+typedef const struct region_device *cbfs_dev_t;
+
+static inline ssize_t cbfs_dev_read(cbfs_dev_t dev, void *buffer, size_t offset, size_t size)
+{
+	return rdev_readat(dev, buffer, offset, size);
+}
+
+static inline size_t cbfs_dev_size(cbfs_dev_t dev)
+{
+	return region_device_sz(dev);
+}
+
+#endif	/* _CBFS_GLUE_H_ */
diff --git a/src/lib/cbfs.c b/src/lib/cbfs.c
index 35193d0..447d91f 100644
--- a/src/lib/cbfs.c
+++ b/src/lib/cbfs.c
@@ -3,6 +3,7 @@
 #include <assert.h>
 #include <boot_device.h>
 #include <cbfs.h>
+#include <commonlib/bsd/cbfs_private.h>
 #include <commonlib/bsd/compression.h>
 #include <commonlib/endian.h>
 #include <console/console.h>
@@ -15,14 +16,6 @@
 #include <symbols.h>
 #include <timestamp.h>
 
-#define ERROR(x...) printk(BIOS_ERR, "CBFS: " x)
-#define LOG(x...) printk(BIOS_INFO, "CBFS: " x)
-#if CONFIG(DEBUG_CBFS)
-#define DEBUG(x...) printk(BIOS_SPEW, "CBFS: " x)
-#else
-#define DEBUG(x...)
-#endif
-
 int cbfs_boot_locate(struct cbfsf *fh, const char *name, uint32_t *type)
 {
 	struct region_device rdev;
@@ -30,31 +23,35 @@
 	if (cbfs_boot_region_device(&rdev))
 		return -1;
 
-	int ret = cbfs_locate(fh, &rdev, name, type);
+	size_t data_offset;
+	cb_err_t err = cbfs_lookup(&rdev, name, &fh->mdata, &data_offset, NULL);
 
-	if (CONFIG(VBOOT_ENABLE_CBFS_FALLBACK) && ret) {
-
-		/*
-		 * When VBOOT_ENABLE_CBFS_FALLBACK is enabled and a file is not available in the
-		 * active RW region, the RO (COREBOOT) region will be used to locate the file.
-		 *
-		 * This functionality makes it possible to avoid duplicate files in the RO
-		 * and RW partitions while maintaining updateability.
-		 *
-		 * Files can be added to the RO_REGION_ONLY config option to use this feature.
-		 */
-		printk(BIOS_DEBUG, "Fall back to RO region for %s\n", name);
+	if (CONFIG(VBOOT_ENABLE_CBFS_FALLBACK) && err == CB_CBFS_NOT_FOUND) {
+		printk(BIOS_INFO, "CBFS: Fall back to RO region for %s\n",
+		       name);
 		if (fmap_locate_area_as_rdev("COREBOOT", &rdev))
-			ERROR("RO region not found\n");
-		else
-			ret = cbfs_locate(fh, &rdev, name, type);
+			return -1;
+		err = cbfs_lookup(&rdev, name, &fh->mdata, &data_offset, NULL);
+	}
+	if (err)
+		return -1;
+
+	size_t msize = be32toh(fh->mdata.h.offset);
+	if (rdev_chain(&fh->metadata, &addrspace_32bit.rdev,
+		       (uintptr_t)&fh->mdata, msize) ||
+	    rdev_chain(&fh->data, &rdev, data_offset, be32toh(fh->mdata.h.len)))
+		return -1;
+	if (type) {
+		if (!*type)
+			*type = be32toh(fh->mdata.h.type);
+		else if (*type != be32toh(fh->mdata.h.type))
+			return -1;
 	}
 
-	if (!ret)
-		if (tspi_measure_cbfs_hook(fh, name))
-			return -1;
+	if (tspi_measure_cbfs_hook(fh, name))
+		return -1;
 
-	return ret;
+	return 0;
 }
 
 void *cbfs_boot_map_with_leak(const char *name, uint32_t type, size_t *size)