From a72e1692b8b35d61587d75cf1800eef934203cd2 Mon Sep 17 00:00:00 2001 From: Chris Blake Date: Wed, 16 Nov 2016 08:35:54 -0600 Subject: [PATCH] firmware-utils: Add support for the Cisco Meraki MX60/MX60W This patch adds header support for the Cisco Meraki MX60/MX60W, which are a part of the apm821xx target. Some structure changes were needed due to the fact this device uses U-Boot (unlike other devices in mkmerakifw.c) which uses a different header structure to define the load offsets for the image. A thanks to Christian for helping implement this properly. Cc: Christian Lamparter Signed-off-by: Chris Blake --- tools/firmware-utils/src/mkmerakifw.c | 69 ++++++++++++++++++++++----- 1 file changed, 58 insertions(+), 11 deletions(-) diff --git a/tools/firmware-utils/src/mkmerakifw.c b/tools/firmware-utils/src/mkmerakifw.c index 61b81c6b5f..6394cba523 100644 --- a/tools/firmware-utils/src/mkmerakifw.c +++ b/tools/firmware-utils/src/mkmerakifw.c @@ -32,13 +32,27 @@ #define HDR_OFF_IMAGELEN 8 #define HDR_OFF_CHECKSUM 12 #define HDR_OFF_MAGIC2 32 -#define HDR_OFF_FILLER 36 +#define HDR_OFF_MAGIC3 36 #define HDR_OFF_STATICHASH 40 +#define HDR_OFF_KERNEL_OFFSET 40 +#define HDR_OFF_RAMDISK_OFFSET 44 +#define HDR_OFF_FDT_OFFSET 48 +#define HDR_OFF_UNKNOWN_OFFSET 52 struct board_info { - uint32_t magic; + uint32_t magic1; + uint32_t magic2; + uint32_t magic3; uint32_t imagelen; - unsigned char statichash[20]; + union { + unsigned char statichash[20]; + struct { + uint32_t kernel_offset; + uint32_t ramdisk_offset; + uint32_t fdt_offset; + uint32_t unknown_offset; + } mx60; + }; char *id; char *description; }; @@ -55,7 +69,8 @@ static const struct board_info boards[] = { { .id = "mr18", .description = "Meraki MR18 Access Point", - .magic = 0x8e73ed8a, + .magic1 = 0x8e73ed8a, + .magic2 = 0x8e73ed8a, .imagelen = 0x00800000, .statichash = {0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55, @@ -64,14 +79,34 @@ static const struct board_info boards[] = { }, { .id = "mr24", .description = "Meraki MR24 Access Point", - .magic = 0x8e73ed8a, + .magic1 = 0x8e73ed8a, + .magic2 = 0x8e73ed8a, .imagelen = 0x00800000, .statichash = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, }, { - + .id = "mx60", + .description = "Meraki MX60/MX60W Security Appliance", + .magic1 = 0x8e73ed8a, + .magic2 = 0xa1f0beef, /* Enables use of load addr in statichash */ + .magic3 = 0x00060001, /* This goes along with magic2 */ + .imagelen = 0x3fd00000, + /* The static hash below does the following: + * 1st Row: Kernel Offset + * 2nd Row: Ramdisk Offset + * 3rd Row: FDT Offset + * 4th Row: ? Unused/Unknown ? + * 5th Row: ? Unused/Unknown ? + */ + .mx60 = { + .kernel_offset = 0x10000, + .ramdisk_offset = 0x3FFC00, + .fdt_offset = 0x0400, + .unknown_offset = 0x0400, + }, + }, { /* terminating entry */ } }; @@ -237,10 +272,10 @@ int main(int argc, char *argv[]) kernel = buf + HDR_LENGTH; fread(kernel, klen, 1, in); - /* Write magic values and filler */ - writel(buf, HDR_OFF_MAGIC1, board->magic); - writel(buf, HDR_OFF_MAGIC2, board->magic); - writel(buf, HDR_OFF_FILLER, 0); + /* Write magic values */ + writel(buf, HDR_OFF_MAGIC1, board->magic1); + writel(buf, HDR_OFF_MAGIC2, board->magic2); + writel(buf, HDR_OFF_MAGIC3, board->magic3); /* Write header and image length */ writel(buf, HDR_OFF_HDRLEN, HDR_LENGTH); @@ -248,7 +283,19 @@ int main(int argc, char *argv[]) /* Write checksum and static hash */ sha1_csum(kernel, klen, buf + HDR_OFF_CHECKSUM); - memcpy(buf + HDR_OFF_STATICHASH, board->statichash, 20); + + switch (board->magic2) { + case 0xa1f0beef: + writel(buf, HDR_OFF_KERNEL_OFFSET, board->mx60.kernel_offset); + writel(buf, HDR_OFF_RAMDISK_OFFSET, board->mx60.ramdisk_offset); + writel(buf, HDR_OFF_FDT_OFFSET, board->mx60.fdt_offset), + writel(buf, HDR_OFF_UNKNOWN_OFFSET, board->mx60.unknown_offset); + break; + + case 0x8e73ed8a: + memcpy(buf + HDR_OFF_STATICHASH, board->statichash, 20); + break; + } /* Save finished image */ out = fopen(ofname, "w"); -- 2.30.2