arm: mvebu: Check that kwbimage blockid matches boot mode
authorPali Rohár <pali@kernel.org>
Fri, 14 Jan 2022 13:31:39 +0000 (14:31 +0100)
committerStefan Roese <sr@denx.de>
Thu, 20 Jan 2022 10:35:29 +0000 (11:35 +0100)
Each boot mode has its own kwbimage specified by blockid. So check that
kwbimage is valid by blockid.

Signed-off-by: Pali Rohár <pali@kernel.org>
Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Stefan Roese <sr@denx.de>
arch/arm/mach-mvebu/spl.c

index fe22951..62e4fe1 100644 (file)
@@ -117,22 +117,39 @@ int spl_parse_board_header(struct spl_image_info *spl_image,
         * (including SPL content) which is not included in U-Boot image_header.
         */
        if (mhdr->version != 1 ||
-           ((mhdr->headersz_msb << 16) | mhdr->headersz_lsb) < sizeof(*mhdr) ||
-           (
+           ((mhdr->headersz_msb << 16) | mhdr->headersz_lsb) < sizeof(*mhdr)) {
+               printf("ERROR: Invalid kwbimage v1\n");
+               return -EINVAL;
+       }
+
 #ifdef CONFIG_SPL_SPI_FLASH_SUPPORT
-            mhdr->blockid != IBR_HDR_SPI_ID &&
+       if (bootdev->boot_device == BOOT_DEVICE_SPI &&
+           mhdr->blockid != IBR_HDR_SPI_ID) {
+               printf("ERROR: Wrong blockid (0x%x) in SPI kwbimage\n",
+                      mhdr->blockid);
+               return -EINVAL;
+       }
 #endif
+
 #ifdef CONFIG_SPL_SATA
-            mhdr->blockid != IBR_HDR_SATA_ID &&
+       if (bootdev->boot_device == BOOT_DEVICE_SATA &&
+           mhdr->blockid != IBR_HDR_SATA_ID) {
+               printf("ERROR: Wrong blockid (0x%x) in SATA kwbimage\n",
+                      mhdr->blockid);
+               return -EINVAL;
+       }
 #endif
+
 #ifdef CONFIG_SPL_MMC
-            mhdr->blockid != IBR_HDR_SDIO_ID &&
-#endif
-            1
-           )) {
-               printf("ERROR: Not valid SPI/NAND/SATA/SDIO kwbimage v1\n");
+       if ((bootdev->boot_device == BOOT_DEVICE_MMC1 ||
+            bootdev->boot_device == BOOT_DEVICE_MMC2 ||
+            bootdev->boot_device == BOOT_DEVICE_MMC2_2) &&
+           mhdr->blockid != IBR_HDR_SDIO_ID) {
+               printf("ERROR: Wrong blockid (0x%x) in SDIO kwbimage\n",
+                      mhdr->blockid);
                return -EINVAL;
        }
+#endif
 
        spl_image->offset = mhdr->srcaddr;