]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
tools: mkimage: Extend mkimage to also include pmufw
authorMichal Simek <michal.simek@xilinx.com>
Fri, 21 Oct 2016 10:58:17 +0000 (12:58 +0200)
committerMichal Simek <michal.simek@xilinx.com>
Wed, 14 Dec 2016 08:15:51 +0000 (09:15 +0100)
This is generated command line when PMUFW_INIT_FILE is setup.

./tools/mkimage -T zynqmpimage -R ./"" -n
./"board/xilinx/zynqmp/pmufw.bin" -d spl/u-boot-spl.bin spl/boot.bin

pmufw has to be in binary format and mkimage is using dynamic
header size generation without using calloc function based on pmufw
size. Boot.bin header is filled with pmufw size and pmufw is copied to
header data section. When header is generated mkimage append
u-boot-spl.bin.

This patch also add pmufw to the u-boot tree with enabling it for zcu100
and zcu102.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
arch/arm/cpu/armv8/zynqmp/Kconfig
board/xilinx/zynqmp/pmufw.bin [new file with mode: 0755]
configs/xilinx_zynqmp_zcu102_defconfig
scripts/Makefile.spl
tools/zynqmpimage.c

index e847cba3f0b26a108e59809a763763c699f6613b..34df59db9f0f3ee01da39062411c415b9d2a9bdc 100644 (file)
@@ -19,11 +19,19 @@ config SYS_CONFIG_NAME
 
 config BOOT_INIT_FILE
        string "boot.bin init register filename"
+       depends on SPL
        default ""
        help
          Add register writes to boot.bin format (max 256 pairs).
          Expect a table of register-value pairs, e.g. "0x12345678 0x4321"
 
+config PMUFW_INIT_FILE
+       string "PMU firwmare"
+       depends on SPL
+       default ""
+       help
+         Include PMUFW to boot.bin.
+
 config ZYNQMP_QSPI
        bool "Configure ZynqMP QSPI"
        select DM_SPI
diff --git a/board/xilinx/zynqmp/pmufw.bin b/board/xilinx/zynqmp/pmufw.bin
new file mode 100755 (executable)
index 0000000..8151a5a
Binary files /dev/null and b/board/xilinx/zynqmp/pmufw.bin differ
index 627f6364f0671e4b0da17ac94be47cb79b984b8f..4616406bdcadc96d3af5d7e43dc000b3226a6fd4 100644 (file)
@@ -6,6 +6,7 @@ CONFIG_SPL_SYS_MALLOC_SIMPLE=y
 CONFIG_SPL_DM=y
 CONFIG_DM_SPI_FLASH=y
 CONFIG_DM_GPIO=y
+CONFIG_PMUFW_INIT_FILE="board/xilinx/zynqmp/pmufw.bin"
 CONFIG_ZYNQMP_QSPI=y
 CONFIG_ZYNQMP_USB=y
 CONFIG_SYS_TEXT_BASE=0x8000000
index 5005c4642633e31c5436b2a2b91e0631fd525522..7ceb4909c5638d45dc07f2594b588cc129928d39 100644 (file)
@@ -138,7 +138,8 @@ ifdef CONFIG_ARCH_ZYNQ
 MKIMAGEFLAGS_boot.bin = -T zynqimage -R $(srctree)/$(CONFIG_BOOT_INIT_FILE)
 endif
 ifdef CONFIG_ARCH_ZYNQMP
-MKIMAGEFLAGS_boot.bin = -T zynqmpimage -R $(srctree)/$(CONFIG_BOOT_INIT_FILE)
+MKIMAGEFLAGS_boot.bin = -T zynqmpimage -R $(srctree)/$(CONFIG_BOOT_INIT_FILE) \
+       -n $(srctree)/$(CONFIG_PMUFW_INIT_FILE)
 endif
 
 spl/boot.bin: $(obj)/u-boot-spl.bin FORCE
index 60d8ed23b4a1ca1eda75a261e391578e931e958e..8260e5dd1526db08f74f1d2dac66a0bf77cb40b5 100644 (file)
@@ -99,6 +99,8 @@ struct zynqmp_header {
 };
 
 static struct zynqmp_header zynqmpimage_header;
+static void *dynamic_header;
+static FILE *fpmu;
 
 static uint32_t zynqmpimage_checksum(struct zynqmp_header *ptr)
 {
@@ -181,6 +183,13 @@ static void zynqmpimage_print_header(const void *ptr)
        printf("Image Size   : %lu bytes (%lu bytes packed)\n",
               (unsigned long)le32_to_cpu(zynqhdr->image_size),
               (unsigned long)le32_to_cpu(zynqhdr->image_stored_size));
+
+       if (zynqhdr->pfw_image_length)
+               printf("PMUFW Size   : %lu bytes (%lu bytes packed)\n",
+                      (unsigned long)le32_to_cpu(zynqhdr->pfw_image_length),
+                      (unsigned long)le32_to_cpu(
+                               zynqhdr->total_pfw_image_length));
+
        printf("Image Load   : 0x%08x\n", le32_to_cpu(zynqhdr->image_load));
        printf("Checksum     : 0x%08x\n", le32_to_cpu(zynqhdr->checksum));
 
@@ -203,6 +212,8 @@ static void zynqmpimage_print_header(const void *ptr)
                       le32_to_cpu(zynqhdr->register_init[i].address),
                       le32_to_cpu(zynqhdr->register_init[i].data));
        }
+
+       free(dynamic_header);
 }
 
 static int zynqmpimage_check_params(struct image_tool_params *params)
@@ -234,6 +245,44 @@ static int zynqmpimage_check_image_types(uint8_t type)
        return EXIT_FAILURE;
 }
 
+static int fsize(FILE *fp)
+{
+       int size;
+       int origin = ftell(fp);
+
+       fseek(fp, 0L, SEEK_END);
+       size = ftell(fp);
+
+       /* going back */
+       fseek(fp, origin, SEEK_SET);
+
+       return size;
+}
+
+static void zynqmpimage_pmufw(struct zynqmp_header *zynqhdr,
+                             const char *filename)
+{
+       uint32_t size;
+
+       /* Setup PMU fw size */
+       zynqhdr->pfw_image_length = fsize(fpmu);
+       zynqhdr->total_pfw_image_length = zynqhdr->pfw_image_length;
+
+       zynqhdr->image_size -= zynqhdr->pfw_image_length;
+       zynqhdr->image_stored_size -= zynqhdr->total_pfw_image_length;
+
+       /* Read the whole PMUFW to the header */
+       size = fread(&zynqhdr->__reserved4[66], 1,
+                    zynqhdr->pfw_image_length, fpmu);
+       if (size != zynqhdr->pfw_image_length) {
+               fprintf(stderr, "Cannot read PMUFW file: %s\n", filename);
+               fclose(fpmu);
+               exit(1);
+       }
+
+       fclose(fpmu);
+}
+
 static void zynqmpimage_parse_initparams(struct zynqmp_header *zynqhdr,
        const char *filename)
 {
@@ -284,6 +333,10 @@ static void zynqmpimage_set_header(void *ptr, struct stat *sbuf, int ifd,
        if (params->eflag)
                zynqhdr->image_load = cpu_to_le32((uint32_t)params->ep);
 
+       /* PMUFW */
+       if (fpmu)
+               zynqmpimage_pmufw(zynqhdr, params->imagename);
+
        /* User can pass in text file with init list */
        if (strlen(params->imagename2))
                zynqmpimage_parse_initparams(zynqhdr, params->imagename2);
@@ -291,6 +344,51 @@ static void zynqmpimage_set_header(void *ptr, struct stat *sbuf, int ifd,
        zynqhdr->checksum = zynqmpimage_checksum(zynqhdr);
 }
 
+
+static int zynqmpimage_vrec_header(struct image_tool_params *params,
+                               struct image_type_params *tparams)
+{
+       struct stat path_stat;
+       char *filename = params->imagename;
+       int err;
+
+       /* Handle static case without PMUFW */
+       tparams->header_size = sizeof(struct zynqmp_header);
+       tparams->hdr = (void *)&zynqmpimage_header;
+
+       /* PMUFW name is passed via params->imagename */
+       if (strlen(filename) == 0)
+               return EXIT_SUCCESS;
+
+       fpmu = fopen(filename, "r");
+       if (!fpmu) {
+               fprintf(stderr, "Cannot open PMUFW file: %s\n", filename);
+               return EXIT_FAILURE;
+       }
+
+       err = fstat(fileno(fpmu), &path_stat);
+       if (err) {
+               fclose(fpmu);
+               fpmu = NULL;
+               return EXIT_FAILURE;
+       }
+
+       if (!S_ISREG(path_stat.st_mode)) {
+               fclose(fpmu);
+               fpmu = NULL;
+               return EXIT_FAILURE;
+       }
+
+       /* Increase header size by PMUFW file size */
+       tparams->header_size += fsize(fpmu);
+
+       /* Allocate buffer with space for PMUFW */
+       dynamic_header = calloc(1, tparams->header_size);
+       tparams->hdr = dynamic_header;
+
+       return EXIT_SUCCESS;
+}
+
 U_BOOT_IMAGE_TYPE(
        zynqmpimage,
        "Xilinx ZynqMP Boot Image support",
@@ -303,5 +401,5 @@ U_BOOT_IMAGE_TYPE(
        NULL,
        zynqmpimage_check_image_types,
        NULL,
-       NULL
+       zynqmpimage_vrec_header
 );