[PATCH 16/34] cbfs: Support reading compression information

Simon Glass sjg at chromium.org
Mon Mar 15 06:00:16 CET 2021


CBFS now supports compressed filed. Add support for reading this
information so that the correct decompression can be applied. The
decompression itself is not implemented in CBFS.

Signed-off-by: Simon Glass <sjg at chromium.org>
---

 fs/cbfs/cbfs.c | 22 ++++++++++++++++++++++
 include/cbfs.h | 11 +++++++++++
 2 files changed, 33 insertions(+)

diff --git a/fs/cbfs/cbfs.c b/fs/cbfs/cbfs.c
index 9e534d15f28..443a148e3f1 100644
--- a/fs/cbfs/cbfs.c
+++ b/fs/cbfs/cbfs.c
@@ -91,6 +91,7 @@ static int fill_node(struct cbfs_cachenode *node, void *start,
 		     struct cbfs_fileheader *header)
 {
 	uint name_len;
+	uint offset;
 
 	/* Check the header is large enough */
 	if (header->offset < sizeof(struct cbfs_fileheader))
@@ -104,6 +105,27 @@ static int fill_node(struct cbfs_cachenode *node, void *start,
 	node->name = start + sizeof(struct cbfs_fileheader);
 	node->name_length = name_len;
 	node->attr_offset = header->attributes_offset;
+	node->comp_algo = CBFS_COMPRESS_NONE;
+	node->decomp_size = 0;
+
+	for (offset = node->attr_offset; offset < header->offset;) {
+		const struct cbfs_file_attribute *attr;
+		uint tag, len;
+
+		attr = start + offset;
+		tag = be32_to_cpu(attr->tag);
+		len = be32_to_cpu(attr->len);
+		if (tag == CBFS_FILE_ATTR_TAG_COMPRESSION) {
+			struct cbfs_file_attr_compression *comp;
+
+			comp = start + offset;
+			node->comp_algo = be32_to_cpu(comp->compression);
+			node->decomp_size =
+				be32_to_cpu(comp->decompressed_size);
+		}
+
+		offset += len;
+	}
 
 	return 0;
 }
diff --git a/include/cbfs.h b/include/cbfs.h
index 055edbaac2e..ae94f1dcdf5 100644
--- a/include/cbfs.h
+++ b/include/cbfs.h
@@ -75,6 +75,15 @@ struct cbfs_fileheader {
 	char filename[];
 } __packed;
 
+/**
+ * These are standard values for the known compression alogrithms that coreboot
+ * knows about for stages and payloads.  Of course, other CBFS users can use
+ * whatever values they want, as long as they understand them.
+ */
+#define CBFS_COMPRESS_NONE  0
+#define CBFS_COMPRESS_LZMA  1
+#define CBFS_COMPRESS_LZ4   2
+
 /*
  * Depending on how the header was initialized, it may be backed with 0x00 or
  * 0xff, so support both
@@ -119,6 +128,8 @@ struct cbfs_cachenode {
 	u32 data_length;
 	u32 name_length;
 	u32 attr_offset;
+	u32 comp_algo;
+	u32 decomp_size;
 };
 
 /**
-- 
2.31.0.rc2.261.g7f71774620-goog



More information about the U-Boot mailing list