Patrick Rudolph has uploaded this change for review. ( https://review.coreboot.org/25860
Change subject: util/cbfstool: Support FIT payloads ......................................................................
util/cbfstool: Support FIT payloads
Add support for autodecting FIT (uImage) payloads and add them as new CBFS_TYPE 'fit'. The payload is included as is, with no special header. Support for parsing FIT payloads in coreboot is added in a follow on commit. Make cbfsf_file_type public to detect the payload type.
Tested on Cavium SoC.
Change-Id: Ic5fc30cd5419eb76c4eb50cca3449caea60270de Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com --- M payloads/libpayload/include/cbfs_core.h M src/commonlib/include/commonlib/cbfs_serialized.h M util/cbfstool/cbfs-mkpayload.c M util/cbfstool/cbfs.h M util/cbfstool/cbfstool.c M util/cbfstool/common.h M util/nvramtool/cbfs.h 7 files changed, 47 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/60/25860/1
diff --git a/payloads/libpayload/include/cbfs_core.h b/payloads/libpayload/include/cbfs_core.h index 1f155df..4864989 100644 --- a/payloads/libpayload/include/cbfs_core.h +++ b/payloads/libpayload/include/cbfs_core.h @@ -68,6 +68,7 @@
#define CBFS_TYPE_STAGE 0x10 #define CBFS_TYPE_PAYLOAD 0x20 +#define CBFS_TYPE_FIT 0x21 #define CBFS_TYPE_OPTIONROM 0x30 #define CBFS_TYPE_BOOTSPLASH 0x40 #define CBFS_TYPE_RAW 0x50 diff --git a/src/commonlib/include/commonlib/cbfs_serialized.h b/src/commonlib/include/commonlib/cbfs_serialized.h index 9273b35..1a090ff 100644 --- a/src/commonlib/include/commonlib/cbfs_serialized.h +++ b/src/commonlib/include/commonlib/cbfs_serialized.h @@ -68,6 +68,7 @@ #define CBFS_TYPE_DELETED2 0xffffffff #define CBFS_TYPE_STAGE 0x10 #define CBFS_TYPE_PAYLOAD 0x20 +#define CBFS_TYPE_FIT 0x21 #define CBFS_TYPE_OPTIONROM 0x30 #define CBFS_TYPE_BOOTSPLASH 0x40 #define CBFS_TYPE_RAW 0x50 diff --git a/util/cbfstool/cbfs-mkpayload.c b/util/cbfstool/cbfs-mkpayload.c index fd2c4ca..02d321d1 100644 --- a/util/cbfstool/cbfs-mkpayload.c +++ b/util/cbfstool/cbfs-mkpayload.c @@ -24,6 +24,7 @@ #include "cbfs.h" #include "fv.h" #include "coff.h" +#include "fdt.h"
/* serialize the seg array into the buffer. * The buffer is assumed to be large enough. @@ -416,3 +417,35 @@ return 0;
} + +int parse_fit_to_payload(const struct buffer *input, struct buffer *output, + enum comp_algo algo) +{ + comp_func_ptr compress; + int len = 0; + struct fdt_header *fdt_h; + + compress = compression_function(algo); + if (!compress) + return -1; + + DEBUG("start: parse_fit_to_payload\n"); + + fdt_h = (struct fdt_header *)input->data; + if (be32toh(fdt_h->magic) != FDT_HEADER_MAGIC) { + INFO("Not a FIT payload.\n"); + return -1; + } + + if (buffer_create(output, input->size, input->name) != 0) + return -1; + + if (!compress(input->data, input->size, output->data, &len) && + (unsigned int)len < input->size) + return -1; + + DEBUG("done\n"); + + output->size = len; + return 0; +} diff --git a/util/cbfstool/cbfs.h b/util/cbfstool/cbfs.h index 2964304..8cfd13e 100644 --- a/util/cbfstool/cbfs.h +++ b/util/cbfstool/cbfs.h @@ -172,6 +172,7 @@ #define CBFS_COMPONENT_CBFSHEADER 0x02 #define CBFS_COMPONENT_STAGE 0x10 #define CBFS_COMPONENT_PAYLOAD 0x20 +#define CBFS_COMPONENT_FIT 0x21 #define CBFS_COMPONENT_OPTIONROM 0x30 #define CBFS_COMPONENT_BOOTSPLASH 0x40 #define CBFS_COMPONENT_RAW 0x50 @@ -205,6 +206,7 @@ {CBFS_COMPONENT_CBFSHEADER, "cbfs header"}, {CBFS_COMPONENT_STAGE, "stage"}, {CBFS_COMPONENT_PAYLOAD, "payload"}, + {CBFS_COMPONENT_FIT, "fit"}, {CBFS_COMPONENT_OPTIONROM, "optionrom"}, {CBFS_COMPONENT_BOOTSPLASH, "bootsplash"}, {CBFS_COMPONENT_RAW, "raw"}, diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c index 7156e00..e0a565d 100644 --- a/util/cbfstool/cbfstool.c +++ b/util/cbfstool/cbfstool.c @@ -631,6 +631,13 @@ /* per default, try and see if payload is an ELF binary */ ret = parse_elf_to_payload(buffer, &output, param.compression);
+ /* If it's not an ELF, see if it's a FIT */ + if (ret != 0) { + ret = parse_fit_to_payload(buffer, &output, param.compression); + if (ret == 0) + header->type = htonl(CBFS_COMPONENT_FIT); + } + /* If it's not an ELF, see if it's a UEFI FV */ if (ret != 0) ret = parse_fv_to_payload(buffer, &output, param.compression); diff --git a/util/cbfstool/common.h b/util/cbfstool/common.h index 8bae63e..baefc1c 100644 --- a/util/cbfstool/common.h +++ b/util/cbfstool/common.h @@ -188,6 +188,8 @@ enum comp_algo algo); int parse_fv_to_payload(const struct buffer *input, struct buffer *output, enum comp_algo algo); +int parse_fit_to_payload(const struct buffer *input, struct buffer *output, + enum comp_algo algo); int parse_bzImage_to_payload(const struct buffer *input, struct buffer *output, const char *initrd, char *cmdline, enum comp_algo algo); diff --git a/util/nvramtool/cbfs.h b/util/nvramtool/cbfs.h index 3a5bddb..60d95ed 100644 --- a/util/nvramtool/cbfs.h +++ b/util/nvramtool/cbfs.h @@ -68,6 +68,7 @@
#define CBFS_TYPE_STAGE 0x10 #define CBFS_TYPE_PAYLOAD 0x20 +#define CBFS_TYPE_FIT 0x21 #define CBFS_TYPE_OPTIONROM 0x30 #define CBFS_TYPE_BOOTSPLASH 0x40 #define CBFS_TYPE_RAW 0x50