summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs/cbfs/cbfs.c22
-rw-r--r--include/cbfs.h11
2 files changed, 33 insertions, 0 deletions
diff --git a/fs/cbfs/cbfs.c b/fs/cbfs/cbfs.c
index 9e534d15f2..443a148e3f 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 055edbaac2..ae94f1dcdf 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;
};
/**