Add padding at the end of the last entry
authorRoberto Vargas <roberto.vargas@arm.com>
Tue, 19 Dec 2017 11:56:57 +0000 (11:56 +0000)
committerDavid Cunado <david.cunado@arm.com>
Wed, 3 Jan 2018 20:51:43 +0000 (20:51 +0000)
This patch adds padding bytes at the end of the last image in the
fip to be able to transfer by DMA the last image.

Change-Id: I8c6f07dee389cb3d1dc919936d9d52841d7e5723
Signed-off-by: Roberto Vargas <roberto.vargas@arm.com>
Signed-off-by: Dimitris Papastamos <dimitris.papastamos@arm.com>
Signed-off-by: David Cunado <david.cunado@arm.com>
tools/fiptool/fiptool.c

index 1dcb7e8e616ffad2d8f09646c6e212bf2b63cca0..33c451e4e37e653f62f82396be319178c52a0695 100644 (file)
@@ -492,7 +492,7 @@ static int pack_images(const char *filename, uint64_t toc_flags, unsigned long a
        fip_toc_header_t *toc_header;
        fip_toc_entry_t *toc_entry;
        char *buf;
-       uint64_t entry_offset, buf_size, payload_size = 0;
+       uint64_t entry_offset, buf_size, payload_size = 0, pad_size;
        size_t nr_images = 0;
 
        for (desc = image_desc_head; desc != NULL; desc = desc->next)
@@ -526,9 +526,13 @@ static int pack_images(const char *filename, uint64_t toc_flags, unsigned long a
                entry_offset += image->toc_e.size;
        }
 
-       /* Append a null uuid entry to mark the end of ToC entries. */
+       /*
+        * Append a null uuid entry to mark the end of ToC entries.
+        * NOTE the offset address for the last toc_entry must match the fip
+        * size.
+        */
        memset(toc_entry, 0, sizeof(*toc_entry));
-       toc_entry->offset_address = entry_offset;
+       toc_entry->offset_address = (entry_offset + align - 1) & ~(align - 1);
 
        /* Generate the FIP file. */
        fp = fopen(filename, "wb");
@@ -555,6 +559,13 @@ static int pack_images(const char *filename, uint64_t toc_flags, unsigned long a
                xfwrite(image->buffer, image->toc_e.size, fp, filename);
        }
 
+       if (fseek(fp, entry_offset, SEEK_SET))
+               log_errx("Failed to set file position");
+
+       pad_size = toc_entry->offset_address - entry_offset;
+       while (pad_size--)
+               fputc(0x0, fp);
+
        fclose(fp);
        return 0;
 }