Snap for 4728508 from d84a3e4947a7c05f60bce50f16d4fb76f976a1cc to pi-release

Change-Id: Ib07a063d4bbba07b2e860e1580cbacc350fe1a02
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_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 @@
   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 @@
                                  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 @@
                          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 @@
         """
         (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 @@
             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 @@
                 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 @@
             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 @@
         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 @@
             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 @@
     # 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 @@
     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 @@
     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 @@
         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 @@
         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 @@
     sb = []
     sb.append('  ' + progname + ' create <image_file> (<global_option>...) (<dtb_file> (<entry_option>...) ...)\n')
     sb.append('    global_options:')
-    sb.append('      --page_size <number>     Output file name. Default: 2048')
+    sb.append('      --page_size <number>     Page size. Default: 2048')
+    sb.append('      --version <number>       DTBO version. Default: 0')
     sb.append('      --id <number>       The default value to set property id in dt_table_entry. Default: 0')
     sb.append('      --rev <number>')
     sb.append('      --custom0=<number>')
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_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_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 @@
   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 @@
 
   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 @@
   fprintf(out_fp, "  %s create <image_file> (<global_option>...) (<dtb_file> (<entry_option>...) ...)\n\n", prog_name);
   fprintf(out_fp,
     "    global_options:\n"
-    "      --page_size <number>     Output file name. Default: 2048\n"
+    "      --page_size <number>     Output page size. Default: 2048\n"
+    "      --version <version>      DTBO version. Default: 0\n"
     "      --id=<number|path>       The default value to set property id in dt_table_entry. Default: 0\n"
     "      --rev=<number|path>\n"
     "      --custom0=<number|path>\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 @@
   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 @@
 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 @@
 
 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 \