cmd: mmc: check whether bootbus's arguments is valid or not
authorJaehoon Chung <jh80.chung@samsung.com>
Fri, 26 Feb 2021 09:38:20 +0000 (18:38 +0900)
committerPeng Fan <peng.fan@nxp.com>
Tue, 6 Apr 2021 10:08:26 +0000 (18:08 +0800)
According to Specification, each bit have valid value.
But it doesn't check whether arguments is valid or not.
It has potential bug with arguments passed by wrong value.

Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
cmd/mmc.c

index c1c00d0..a10f137 100644 (file)
--- a/cmd/mmc.c
+++ b/cmd/mmc.c
@@ -735,8 +735,45 @@ static int do_mmc_bootbus(struct cmd_tbl *cmdtp, int flag,
                return CMD_RET_FAILURE;
        }
 
+       /*
+        * BOOT_BUS_CONDITIONS[177]
+        * BOOT_MODE[4:3]
+        * 0x0 : Use SDR + Backward compatible timing in boot operation
+        * 0x1 : Use SDR + High Speed Timing in boot operation mode
+        * 0x2 : Use DDR in boot operation
+        * RESET_BOOT_BUS_CONDITIONS
+        * 0x0 : Reset bus width to x1, SDR, Backward compatible
+        * 0x1 : Retain BOOT_BUS_WIDTH and BOOT_MODE
+        * BOOT_BUS_WIDTH
+        * 0x0 : x1(sdr) or x4 (ddr) buswidth
+        * 0x1 : x4(sdr/ddr) buswith
+        * 0x2 : x8(sdr/ddr) buswith
+        *
+        */
+       if (width >= 0x3) {
+               printf("boot_bus_width %d is invalid\n", width);
+               return CMD_RET_FAILURE;
+       }
+
+       if (reset >= 0x2) {
+               printf("reset_boot_bus_width %d is invalid\n", reset);
+               return CMD_RET_FAILURE;
+       }
+
+       if (mode >= 0x3) {
+               printf("reset_boot_bus_width %d is invalid\n", mode);
+               return CMD_RET_FAILURE;
+       }
+
        /* acknowledge to be sent during boot operation */
-       return mmc_set_boot_bus_width(mmc, width, reset, mode);
+       if (mmc_set_boot_bus_width(mmc, width, reset, mode)) {
+               puts("BOOT_BUS_WIDTH is failed to change.\n");
+               return CMD_RET_FAILURE;
+       }
+
+       printf("Set to BOOT_BUS_WIDTH = 0x%x, RESET = 0x%x, BOOT_MODE = 0x%x\n",
+                       width, reset, mode);
+       return CMD_RET_SUCCESS;
 }
 
 static int do_mmc_boot_resize(struct cmd_tbl *cmdtp, int flag,