From d84a3e4947a7c05f60bce50f16d4fb76f976a1cc Mon Sep 17 00:00:00 2001 From: Hridya Valsaraju Date: Thu, 5 Apr 2018 16:45:03 -0700 Subject: Replace reserved field with version in DTBO header The version filed(currently 0) will be incremented when the dt_table_header struct is updated. Bug: 77706975 Test: ./mkdtboimg_testdata.sh Test: ./mkdtimg_testdata.sh Change-Id: I5c08720132d024437cce40c68cc2c6e937a064fd Merged-In: I5c08720132d024437cce40c68cc2c6e937a064fd (cherry picked from commit 2626d8b9e4d8e8c6cc67ceb1dc4e05a47779785c) --- utils/README.md | 3 ++- utils/src/dt_table.c | 1 + utils/src/dt_table.h | 5 ++++- utils/src/mkdtboimg.py | 28 +++++++++++++--------------- utils/src/mkdtimg_core.c | 5 +++++ utils/src/mkdtimg_create.c | 3 ++- utils/src/mkdtimg_dump.c | 2 +- utils/tests/data/mkdtboimg.cfg | 1 + utils/tests/data/mkdtimg.cfg | 1 + utils/tests/mkdtboimg_testdata.sh | 4 ++-- utils/tests/mkdtimg_testdata.sh | 2 +- 11 files changed, 33 insertions(+), 22 deletions(-) diff --git a/utils/README.md b/utils/README.md index fd2cf97..6fa3409 100644 --- a/utils/README.md +++ b/utils/README.md @@ -195,7 +195,8 @@ dt_table_header: dt_entry_count = 3 dt_entries_offset = 32 page_size = 2048 - reserved[0] = 00000000 + version = 0 + dt_table_entry[0]: dt_size = 380 dt_offset = 128 diff --git a/utils/src/dt_table.c b/utils/src/dt_table.c index 6eda182..19d443a 100644 --- a/utils/src/dt_table.c +++ b/utils/src/dt_table.c @@ -33,4 +33,5 @@ void dt_table_header_init(struct dt_table_header *header) { header->dt_entry_size = cpu_to_fdt32(entry_size); header->dt_entries_offset = cpu_to_fdt32(header_size); header->page_size = cpu_to_fdt32(DT_TABLE_DEFAULT_PAGE_SIZE); + header->version = cpu_to_fdt32(DT_TABLE_DEFAULT_VERSION); } diff --git a/utils/src/dt_table.h b/utils/src/dt_table.h index e7cd9d5..831b80f 100644 --- a/utils/src/dt_table.h +++ b/utils/src/dt_table.h @@ -25,6 +25,7 @@ #define DT_TABLE_MAGIC 0xd7b7ab1e #define DT_TABLE_DEFAULT_PAGE_SIZE 2048 +#define DT_TABLE_DEFAULT_VERSION 0 struct dt_table_header { uint32_t magic; /* DT_TABLE_MAGIC */ @@ -40,7 +41,9 @@ struct dt_table_header { no padding is appended */ uint32_t page_size; /* flash page size we assume */ - uint32_t reserved[1]; /* must be zero */ + uint32_t version; /* DTBO image version, the current version is 0. + The version will be incremented when the dt_table_header + struct is updated. */ }; struct dt_table_entry { diff --git a/utils/src/mkdtboimg.py b/utils/src/mkdtboimg.py index 5f7e40f..c2dbb08 100755 --- a/utils/src/mkdtboimg.py +++ b/utils/src/mkdtboimg.py @@ -186,7 +186,7 @@ class Dtbo(object): self.total_size, self.header_size, self.dt_entry_size, self.dt_entry_count, self.dt_entries_offset, self.page_size, - self.reserved) + self.version) def _update_dt_entry_header(self, dt_entry, metadata_offset): """Converts each DT entry header entry into binary data for DTBO file. @@ -231,7 +231,7 @@ class Dtbo(object): """ (self.magic, self.total_size, self.header_size, self.dt_entry_size, self.dt_entry_count, self.dt_entries_offset, - self.page_size, self.reserved) = struct.unpack_from('>8I', buf, 0) + self.page_size, self.version) = struct.unpack_from('>8I', buf, 0) # verify the header if self.magic != self._DTBO_MAGIC: @@ -246,10 +246,6 @@ class Dtbo(object): raise ValueError('Invalid DT entry header size (%d) in DTBO file' % (self.dt_entry_size)) - if self.reserved: - raise ValueError('Invalid reserved field (%d) in DTBO header' % - (self.reserved)) - def _read_dt_entries_from_metadata(self): """Reads individual DT entry headers from metadata buffer. @@ -321,7 +317,7 @@ class Dtbo(object): return entry return None - def __init__(self, file_handle, page_size=None): + def __init__(self, file_handle, page_size=None, version=0): """Constructor for Dtbo Object Args: @@ -345,7 +341,7 @@ class Dtbo(object): self.dt_entry_count = 0 self.dt_entries_offset = self._DT_TABLE_HEADER_SIZE self.page_size = page_size - self.reserved = 0 + self.version = version self.__metadata_size = self._DT_TABLE_HEADER_SIZE else: self._read_dtbo_image() @@ -354,7 +350,7 @@ class Dtbo(object): sb = [] sb.append('dt_table_header:') _keys = ('magic', 'total_size', 'header_size', 'dt_entry_size', - 'dt_entry_count', 'dt_entries_offset', 'page_size') + 'dt_entry_count', 'dt_entries_offset', 'page_size', 'version') for key in _keys: if key == 'magic': sb.append('{key:>20} = {value:08x}'.format(key=key, @@ -362,8 +358,6 @@ class Dtbo(object): else: sb.append('{key:>20} = {value:d}'.format(key=key, value=self.__dict__[key])) - sb.append('{key:>20} = {value:08d}'.format(key='reserved[0]', - value=self.reserved)) count = 0 for dt_entry in self.__dt_entries: sb.append('dt_table_entry[{0:d}]:'.format(count)) @@ -591,6 +585,7 @@ def parse_config_file(fin, dt_keys, global_keys): # set all global defaults global_args = dict((k, '0') for k in dt_keys) global_args['page_size'] = 2048 + global_args['version'] = 0 dt_args = [] found_dt_entry = False @@ -639,6 +634,8 @@ def parse_create_args(arg_list): parser = argparse.ArgumentParser(prog='create', add_help=False) parser.add_argument('--page_size', type=int, dest='page_size', action='store', default=2048) + parser.add_argument('--version', type=int, dest='version', + action='store', default=0) parser.add_argument('--id', type=str, dest='global_id', action='store', default='0') parser.add_argument('--rev', type=str, dest='global_rev', @@ -705,7 +702,7 @@ def create_dtbo_image(fout, argv): if not remainder: raise ValueError('List of dtimages to add to DTBO not provided') dt_entries = parse_dt_entries(global_args, remainder) - dtbo = Dtbo(fout, global_args.page_size) + dtbo = Dtbo(fout, global_args.page_size, global_args.version) dtbo.add_dt_entries(dt_entries) dtbo.commit() fout.close() @@ -743,7 +740,7 @@ def create_dtbo_image_from_config(fout, argv): raise ValueError('Configuration file must be provided') _DT_KEYS = ('id', 'rev', 'custom0', 'custom1', 'custom2', 'custom3') - _GLOBAL_KEYS = ('page_size') + _GLOBAL_KEYS = ('page_size', 'version') global_args, dt_args = parse_config_file(args.conf_file, _DT_KEYS, _GLOBAL_KEYS) @@ -762,7 +759,7 @@ def create_dtbo_image_from_config(fout, argv): dt_entries.append(DtEntry(**params)) # Create and write DTBO file - dtbo = Dtbo(fout, global_args['page_size']) + dtbo = Dtbo(fout, global_args['page_size'], global_args['version']) dtbo.add_dt_entries(dt_entries) dtbo.commit() fout.close() @@ -804,7 +801,8 @@ def print_create_usage(progname): sb = [] sb.append(' ' + progname + ' create (...) ( (...) ...)\n') sb.append(' global_options:') - sb.append(' --page_size Output file name. Default: 2048') + sb.append(' --page_size Page size. Default: 2048') + sb.append(' --version DTBO version. Default: 0') sb.append(' --id The default value to set property id in dt_table_entry. Default: 0') sb.append(' --rev ') sb.append(' --custom0=') diff --git a/utils/src/mkdtimg_core.c b/utils/src/mkdtimg_core.c index 4c2059f..849ca4c 100644 --- a/utils/src/mkdtimg_core.c +++ b/utils/src/mkdtimg_core.c @@ -38,6 +38,7 @@ struct dt_options { struct dt_global_options { struct dt_options default_options; uint32_t page_size; + uint32_t version; }; struct dt_image_writer_fdt_info { @@ -68,6 +69,7 @@ static void init_dt_options(struct dt_options *options) { static void init_dt_global_options(struct dt_global_options *options) { init_dt_options(&options->default_options); options->page_size = DT_TABLE_DEFAULT_PAGE_SIZE; + options->version = DT_TABLE_DEFAULT_VERSION; } static void copy_dt_options(struct dt_options *target, struct dt_options *options) { @@ -178,6 +180,7 @@ static int output_img_header(FILE *img_fp, header.dt_entry_count = cpu_to_fdt32(entry_count); header.total_size = cpu_to_fdt32(total_size); header.page_size = cpu_to_fdt32(options->page_size); + header.version = cpu_to_fdt32(options->version); fseek(img_fp, 0, SEEK_SET); fwrite(&header, sizeof(header), 1, img_fp); @@ -296,6 +299,8 @@ int set_global_options(struct dt_image_writer *writer, if (strcmp(option, "page_size") == 0) { global_options->page_size = strtoul(value, NULL, 0); + } else if (strcmp(option, "version") == 0) { + global_options->version = strtoul(value, NULL, 0); } else { return set_dt_options(&global_options->default_options, option, value); } diff --git a/utils/src/mkdtimg_create.c b/utils/src/mkdtimg_create.c index bce2a08..74fd687 100644 --- a/utils/src/mkdtimg_create.c +++ b/utils/src/mkdtimg_create.c @@ -96,7 +96,8 @@ void handle_usage_create(FILE *out_fp, const char *prog_name) { fprintf(out_fp, " %s create (...) ( (...) ...)\n\n", prog_name); fprintf(out_fp, " global_options:\n" - " --page_size Output file name. Default: 2048\n" + " --page_size Output page size. Default: 2048\n" + " --version DTBO version. Default: 0\n" " --id= The default value to set property id in dt_table_entry. Default: 0\n" " --rev=\n" " --custom0=\n" diff --git a/utils/src/mkdtimg_dump.c b/utils/src/mkdtimg_dump.c index b04a816..382cefb 100644 --- a/utils/src/mkdtimg_dump.c +++ b/utils/src/mkdtimg_dump.c @@ -114,7 +114,7 @@ static void output_table_header(FILE *out_fp, const struct dt_table_header *head output_prop_int(out_fp, "dt_entry_count", header->dt_entry_count); output_prop_int(out_fp, "dt_entries_offset", header->dt_entries_offset); output_prop_int(out_fp, "page_size", header->page_size); - output_prop_hex(out_fp, "reserved[0]", header->reserved[0]); + output_prop_int(out_fp, "version", header->version); } static void output_table_entry(FILE *out_fp, int index, const struct dt_table_entry *entry) { diff --git a/utils/tests/data/mkdtboimg.cfg b/utils/tests/data/mkdtboimg.cfg index a5e8c2d..603292c 100644 --- a/utils/tests/data/mkdtboimg.cfg +++ b/utils/tests/data/mkdtboimg.cfg @@ -3,6 +3,7 @@ id=0x100 # Read the value form the path in dtb rev=0x100 # Read the value form the path in dtb custom0=0xabc # default value + version=1 board1v1.dts.dtb diff --git a/utils/tests/data/mkdtimg.cfg b/utils/tests/data/mkdtimg.cfg index 3cf2a81..e7a464e 100644 --- a/utils/tests/data/mkdtimg.cfg +++ b/utils/tests/data/mkdtimg.cfg @@ -3,6 +3,7 @@ id=/:board_id # Read the value form the path in dtb rev=/:board_rev # Read the value form the path in dtb custom0=0xabc # default value + version=1 board1v1.dts.dtb diff --git a/utils/tests/mkdtboimg_testdata.sh b/utils/tests/mkdtboimg_testdata.sh index 50cafe2..1574343 100755 --- a/utils/tests/mkdtboimg_testdata.sh +++ b/utils/tests/mkdtboimg_testdata.sh @@ -52,14 +52,14 @@ for dts in ${DTS_LIST}; do done echo "Creating dtbo image with mkdtbimg" -mkdtimg create ${MKDTIMG_OUT}/create.img --page_size=4096 --id=0x100 \ +mkdtimg create ${MKDTIMG_OUT}/create.img --page_size=4096 --id=0x100 --version=1\ --rev=0x100 --custom0=0xabc "${OUTDIR}/board1v1.dts.dtb" "${OUTDIR}/board1v1_1.dts.dtb" \ --id=0xddccbbaa --rev=0x01000100 "${OUTDIR}/board2v1.dts.dtb" --id=0x200 \ --rev=0x201 "${OUTDIR}/board1v1.dts.dtb" --custom0=0xdef > /dev/null echo "Creating dtbo image with mkdtboimg" ../src/mkdtboimg.py create ${MKDTBOIMG_OUTCREATE}/create.img --page_size=4096 \ - --id=0x100 --rev=0x100 --custom0=0xabc "${OUTDIR}/board1v1.dts.dtb" \ + --id=0x100 --rev=0x100 --custom0=0xabc --version=1 "${OUTDIR}/board1v1.dts.dtb" \ "${OUTDIR}/board1v1_1.dts.dtb" --id=0xddccbbaa --rev=0x01000100 \ "${OUTDIR}/board2v1.dts.dtb" --id=0x200 --rev=0x201 \ "${OUTDIR}/board1v1.dts.dtb" --custom0=0xdef > /dev/null diff --git a/utils/tests/mkdtimg_testdata.sh b/utils/tests/mkdtimg_testdata.sh index d5b7f2f..7243e9f 100755 --- a/utils/tests/mkdtimg_testdata.sh +++ b/utils/tests/mkdtimg_testdata.sh @@ -50,7 +50,7 @@ done IMG="${OUTDIR}/create.img" mkdtimg create "$IMG" \ - --page_size=4096 --id=/:board_id --rev=/:board_rev --custom0=0xabc \ + --page_size=4096 --id=/:board_id --rev=/:board_rev --custom0=0xabc --version=1 \ "${OUTDIR}/board1v1.dts.dtb" \ "${OUTDIR}/board1v1_1.dts.dtb" --id=/:another_board_id \ "${OUTDIR}/board2v1.dts.dtb" --rev=0x201 \ -- cgit v1.2.3