@@ -107,6 +107,24 @@ struct a38x_main_hdr_v1 {
u8 ext; /* 0x1E */
u8 checksum; /* 0x1F */
};
+
+struct a38x_boot_mode {
+ unsigned int id;
+ const char *name;
+};
+
+/* The blockid header field values used to indicate boot device of image */
+struct a38x_boot_mode a38x_boot_modes[] = {
+ { 0x4D, "i2c" },
+ { 0x5A, "spi" },
+ { 0x69, "uart" },
+ { 0x78, "sata" },
+ { 0x8B, "nand" },
+ { 0x9C, "pex" },
+ { 0xAE, "mmc" },
+ {},
+};
+
#endif
struct bubt_dev {
@@ -644,6 +662,23 @@ static int check_image_header(void)
return 0;
}
#elif defined(CONFIG_ARMADA_38X)
+static int a38x_check_boot_mode(const struct bubt_dev *dst)
+{
+ int mode;
+ const struct a38x_main_hdr_v1 *hdr =
+ (struct a38x_main_hdr_v1 *)get_load_addr();
+
+ for (mode = 0; mode < ARRAY_SIZE(a38x_boot_modes); mode++) {
+ if (strcmp(a38x_boot_modes[mode].name, dst->name) == 0)
+ break;
+ }
+
+ if (a38x_boot_modes[mode].id == hdr->blockid)
+ return 0;
+
+ return -ENOEXEC;
+}
+
static size_t a38x_header_size(const struct a38x_main_hdr_v1 *h)
{
if (h->version == 1)
@@ -697,7 +732,7 @@ static int check_image_header(void)
}
#endif
-static int bubt_verify(size_t image_size)
+static int bubt_verify(const struct bubt_dev *dst)
{
int err;
@@ -708,6 +743,14 @@ static int bubt_verify(size_t image_size)
return err;
}
+ if (IS_ENABLED(CONFIG_ARMADA_38X)) {
+ err = a38x_check_boot_mode(dst);
+ if (err) {
+ puts("Error: image not built for destination device!\n");
+ return err;
+ }
+ }
+
return 0;
}
@@ -829,7 +872,7 @@ int do_bubt_cmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
if (!image_size)
return -EIO;
- err = bubt_verify(image_size);
+ err = bubt_verify(dst);
if (err)
return err;