summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2021-03-15 18:00:09 +1300
committerSimon Glass <sjg@chromium.org>2021-03-27 13:59:37 +1300
commit72ca4859784227138a42d924678222d68fc20484 (patch)
treeef64aad0cfd58227c2a1962c7813ec51afd8ae02
parent326aae258925b689b04dbd782a7e5e76e4eaf864 (diff)
downloadu-boot-72ca4859784227138a42d924678222d68fc20484.tar.gz
u-boot-72ca4859784227138a42d924678222d68fc20484.tar.bz2
u-boot-72ca4859784227138a42d924678222d68fc20484.zip
cbfs: Add support for attributes
CBFS now supports attributes for things that cannot fit in the header as originally conceived. Add the structures for these. Also rename attributes_offset to something shorter, to ease code readability. Signed-off-by: Simon Glass <sjg@chromium.org>
-rw-r--r--fs/cbfs/cbfs.c2
-rw-r--r--include/cbfs.h39
2 files changed, 39 insertions, 2 deletions
diff --git a/fs/cbfs/cbfs.c b/fs/cbfs/cbfs.c
index 9007aa7d15..abc43ad33f 100644
--- a/fs/cbfs/cbfs.c
+++ b/fs/cbfs/cbfs.c
@@ -129,7 +129,7 @@ static int file_cbfs_next_file(struct cbfs_priv *priv, void *start, int size,
new_node->name = (char *)file_header +
sizeof(struct cbfs_fileheader);
new_node->name_length = name_len;
- new_node->attributes_offset = header.attributes_offset;
+ new_node->attr_offset = header.attributes_offset;
step = header.len;
if (step % align)
diff --git a/include/cbfs.h b/include/cbfs.h
index 5f296d6a37..d98afea648 100644
--- a/include/cbfs.h
+++ b/include/cbfs.h
@@ -68,6 +68,43 @@ struct cbfs_fileheader {
/* offset to struct cbfs_file_attribute or 0 */
u32 attributes_offset;
u32 offset;
+ char filename[];
+} __packed;
+
+/*
+ * Depending on how the header was initialized, it may be backed with 0x00 or
+ * 0xff, so support both
+ */
+#define CBFS_FILE_ATTR_TAG_UNUSED 0
+#define CBFS_FILE_ATTR_TAG_UNUSED2 0xffffffff
+#define CBFS_FILE_ATTR_TAG_COMPRESSION 0x42435a4c
+#define CBFS_FILE_ATTR_TAG_HASH 0x68736148
+
+/*
+ * The common fields of extended cbfs file attributes. Attributes are expected
+ * to start with tag/len, then append their specific fields
+ */
+struct cbfs_file_attribute {
+ u32 tag;
+ /* len covers the whole structure, incl. tag and len */
+ u32 len;
+ u8 data[0];
+} __packed;
+
+struct cbfs_file_attr_compression {
+ u32 tag;
+ u32 len;
+ /* whole file compression format. 0 if no compression. */
+ u32 compression;
+ u32 decompressed_size;
+} __packed;
+
+struct cbfs_file_attr_hash {
+ u32 tag;
+ u32 len;
+ u32 hash_type;
+ /* hash_data is len - sizeof(struct) bytes */
+ u8 hash_data[];
} __packed;
struct cbfs_cachenode {
@@ -77,7 +114,7 @@ struct cbfs_cachenode {
u32 type;
u32 data_length;
u32 name_length;
- u32 attributes_offset;
+ u32 attr_offset;
};
/**