[U-Boot] [PATCH] tools: xilinx: Fix zynq/zynqmp image recognition

Michal Simek michal.simek at xilinx.com
Wed Mar 14 10:14:17 UTC 2018


There is an issue to recognize zynq or zynqmp image because header
checking is just the same. That's why zynqmp images are recognized as
zynq one.
Check unused fields which are initialized to zero in zynq format
(__reserved1 0x38 and __reserved2 0x44) which are initialized for
zynqmp. This should ensure that images are properly recognized by:
./tools/mkimage -l spl/boot.bin

Also show image type as ZynqMP instead of Zynq which is confusing
and parse a53 64bit cpu select option in image_attributes field to make
sure that this is ZynqMP image.

Reported-by: Alexander Graf <agraf at suse.de>
Signed-off-by: Michal Simek <michal.simek at xilinx.com>
---

 tools/zynqimage.c   | 6 ++++++
 tools/zynqmpimage.c | 8 ++++++--
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/tools/zynqimage.c b/tools/zynqimage.c
index 021d2d3fc91f..aa003a7543b6 100644
--- a/tools/zynqimage.c
+++ b/tools/zynqimage.c
@@ -147,6 +147,12 @@ static int zynqimage_verify_header(unsigned char *ptr, int image_size,
 	if (image_size < sizeof(struct zynq_header))
 		return -1;
 
+	if (zynqhdr->__reserved1 != 0)
+		return -1;
+
+	if (zynqhdr->__reserved2 != 0)
+		return -1;
+
 	if (zynqhdr->width_detection != HEADER_WIDTHDETECTION)
 		return -1;
 	if (zynqhdr->image_identifier != HEADER_IMAGEIDENTIFIER)
diff --git a/tools/zynqmpimage.c b/tools/zynqmpimage.c
index f48ac6dbe505..9cef78dc7cf6 100644
--- a/tools/zynqmpimage.c
+++ b/tools/zynqmpimage.c
@@ -63,6 +63,7 @@
 #define HEADER_REGINIT_NULL (cpu_to_le32(0xffffffff))
 #define HEADER_WIDTHDETECTION (cpu_to_le32(0xaa995566))
 #define HEADER_IMAGEIDENTIFIER (cpu_to_le32(0x584c4e58))
+#define HEADER_CPU_SELECT_A53_64BIT	(0x2 << 10)
 
 enum {
 	ENCRYPTION_EFUSE = 0xa5c3c5a3,
@@ -132,7 +133,7 @@ static void zynqmpimage_default_header(struct zynqmp_header *ptr)
 		return;
 
 	ptr->width_detection = HEADER_WIDTHDETECTION;
-	ptr->image_attributes = 0x800;
+	ptr->image_attributes = HEADER_CPU_SELECT_A53_64BIT;
 	ptr->image_identifier = HEADER_IMAGEIDENTIFIER;
 	ptr->encryption = cpu_to_le32(ENCRYPTION_NONE);
 
@@ -162,6 +163,9 @@ static int zynqmpimage_verify_header(unsigned char *ptr, int image_size,
 	if (image_size < sizeof(struct zynqmp_header))
 		return -1;
 
+	if (zynqhdr->image_attributes != HEADER_CPU_SELECT_A53_64BIT)
+		return -1;
+
 	if (zynqhdr->width_detection != HEADER_WIDTHDETECTION)
 		return -1;
 	if (zynqhdr->image_identifier != HEADER_IMAGEIDENTIFIER)
@@ -178,7 +182,7 @@ static void zynqmpimage_print_header(const void *ptr)
 	struct zynqmp_header *zynqhdr = (struct zynqmp_header *)ptr;
 	int i;
 
-	printf("Image Type   : Xilinx Zynq Boot Image support\n");
+	printf("Image Type   : Xilinx ZynqMP Boot Image support\n");
 	printf("Image Offset : 0x%08x\n", le32_to_cpu(zynqhdr->image_offset));
 	printf("Image Size   : %lu bytes (%lu bytes packed)\n",
 	       (unsigned long)le32_to_cpu(zynqhdr->image_size),
-- 
1.9.1



More information about the U-Boot mailing list