[U-Boot] [PATCH 4/5] cmd: mvebu: bubt: Add support for legacy Marvell SoCs

kostap at marvell.com kostap at marvell.com
Wed Aug 29 13:34:55 UTC 2018


From: Konstantin Porotchkin <kostap at marvell.com>

Add support for image load and basic verification in bubt
for legacy Marvell SoCs (A38x, A39x, ...)

Signed-off-by: Konstantin Porotchkin <kostap at marvell.com>
Cc: Igal Liberman <igall at marvell.com>
Cc: Stefan Roese <sr at denx.de>
---
 cmd/mvebu/bubt.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 72 insertions(+), 3 deletions(-)

diff --git a/cmd/mvebu/bubt.c b/cmd/mvebu/bubt.c
index b4d371f..e10d079 100644
--- a/cmd/mvebu/bubt.c
+++ b/cmd/mvebu/bubt.c
@@ -83,6 +83,33 @@ struct mvebu_image_info {
 	u32	encrypt_start_offset;
 	u32	encrypt_size;
 };
+
+#else /* Older Armada SoCs - A38x, A39x, ... */
+
+#define	LEGACY_HDR_VERSION	1
+
+struct legacy_image_header {
+/*	type	name			byte order */
+	u8	block_id;		/*   0   */
+	u8	flags;			/*   1   */
+	u16	nand_pge_size;		/*  2-3  */
+	u32	block_size;		/*  4-7  */
+	u8	version;		/*   8   */
+	u8	hdr_size_msb;		/*   9   */
+	u16	hdr_size_lsb;		/* 10-11 */
+	u32	source_addr;		/* 12-15 */
+	u32	destination_addr;	/* 16-19 */
+	u32	execution_addr;		/* 20-23 */
+	u8	options;		/*  24   */
+	u8	nand_block_size;	/*  25   */
+	u8	nand_technology;	/*  26   */
+	u8	rsvd4;			/*  27   */
+	u16	rsvd2;			/* 28-29 */
+	u8	ext;			/*  30   */
+	u8	checksum;		/*  31   */
+
+};
+
 #endif /* CONFIG_ARMADA_XXX */
 
 struct bubt_dev {
@@ -618,11 +645,53 @@ static int check_image_header(void)
 	return 0;
 }
 
-#else /* Not ARMADA? */
+#else /* Legacy SoCs */
+u8 do_checksum8(u8 *start, u32 len)
+{
+	u8 sum = 0;
+	u8 *startp = start;
+
+	do {
+		sum += *startp;
+		startp++;
+	} while (--len);
+
+	return sum;
+}
+
 static int check_image_header(void)
 {
-	printf("bubt cmd does not support this SoC device or family!\n");
-	return -ENOEXEC;
+	struct legacy_image_header *hdr =
+			(struct legacy_image_header *)get_load_addr();
+	u32 header_len = hdr->hdr_size_lsb + (hdr->hdr_size_msb << 16);
+	u8 checksum;
+	u8 checksum_ref = hdr->checksum;
+
+	/*
+	 * For now compare checksum, and header version. Later we can
+	 * verify more stuff on the header like interface type, etc
+	 */
+	if (hdr->version != LEGACY_HDR_VERSION) {
+		printf("ERROR: Bad HDR Version 0x%x != 0x%x\n",
+		       hdr->version, LEGACY_HDR_VERSION);
+		return -ENOEXEC;
+	}
+
+	/* The checksum value is discarded from checksum calculation */
+	hdr->checksum = 0;
+
+	checksum = do_checksum8((u8 *)hdr, header_len);
+	if (checksum != checksum_ref) {
+		printf("Error: Bad Image checksum. 0x%x != 0x%x\n",
+		       checksum, checksum_ref);
+		return -ENOEXEC;
+	}
+
+	/* Restore the checksum before writing */
+	hdr->checksum = checksum_ref;
+	printf("Image checksum...OK!\n");
+
+	return 0;
 }
 #endif
 
-- 
2.7.4



More information about the U-Boot mailing list