cmd: cache: Fix non-cached memory cachability
[oweals/u-boot.git] / cmd / mmc.c
index 8bc3648193cf33a26d0376867cad5dfc3028bd22..6142ec8e2058abda9f5eb425e83fd3eb246e2416 100644 (file)
--- a/cmd/mmc.c
+++ b/cmd/mmc.c
@@ -26,7 +26,7 @@ static void print_mmcinfo(struct mmc *mmc)
 
        printf("Bus Speed: %d\n", mmc->clock);
 #if CONFIG_IS_ENABLED(MMC_VERBOSE)
-       printf("Mode : %s\n", mmc_mode_name(mmc->selected_mode));
+       printf("Mode: %s\n", mmc_mode_name(mmc->selected_mode));
        mmc_dump_capabilities("card capabilities", mmc->card_caps);
        mmc_dump_capabilities("host capabilities", mmc->host_caps);
 #endif
@@ -54,6 +54,8 @@ static void print_mmcinfo(struct mmc *mmc)
        if (!IS_SD(mmc) && mmc->version >= MMC_VERSION_4_41) {
                bool has_enh = (mmc->part_support & ENHNCD_SUPPORT) != 0;
                bool usr_enh = has_enh && (mmc->part_attr & EXT_CSD_ENH_USR);
+               u8 wp, ext_csd[MMC_MAX_BLOCK_LEN];
+               int ret;
 
 #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
                puts("HC WP Group Size: ");
@@ -90,6 +92,28 @@ static void print_mmcinfo(struct mmc *mmc)
                                        putc('\n');
                        }
                }
+               ret = mmc_send_ext_csd(mmc, ext_csd);
+               if (ret)
+                       return;
+               wp = ext_csd[EXT_CSD_BOOT_WP_STATUS];
+               for (i = 0; i < 2; ++i) {
+                       printf("Boot area %d is ", i);
+                       switch (wp & 3) {
+                       case 0:
+                               printf("not write protected\n");
+                               break;
+                       case 1:
+                               printf("power on protected\n");
+                               break;
+                       case 2:
+                               printf("permanently protected\n");
+                               break;
+                       default:
+                               printf("in reserved protection state\n");
+                               break;
+                       }
+                       wp >>= 2;
+               }
        }
 }
 static struct mmc *init_mmc_device(int dev, bool force_init)
@@ -264,7 +288,7 @@ static int do_mmcrpmb(cmd_tbl_t *cmdtp, int flag,
                return CMD_RET_FAILURE;
 
        if (!(mmc->version & MMC_VERSION_MMC)) {
-               printf("It is not a EMMC device\n");
+               printf("It is not an eMMC device\n");
                return CMD_RET_FAILURE;
        }
        if (mmc->version < MMC_VERSION_4_41) {
@@ -718,7 +742,7 @@ static int do_mmc_boot_resize(cmd_tbl_t *cmdtp, int flag,
                return CMD_RET_FAILURE;
 
        if (IS_SD(mmc)) {
-               printf("It is not a EMMC device\n");
+               printf("It is not an eMMC device\n");
                return CMD_RET_FAILURE;
        }
 
@@ -872,9 +896,30 @@ static int do_mmc_bkops_enable(cmd_tbl_t *cmdtp, int flag,
 }
 #endif
 
+static int do_mmc_boot_wp(cmd_tbl_t *cmdtp, int flag,
+                         int argc, char * const argv[])
+{
+       int err;
+       struct mmc *mmc;
+
+       mmc = init_mmc_device(curr_device, false);
+       if (!mmc)
+               return CMD_RET_FAILURE;
+       if (IS_SD(mmc)) {
+               printf("It is not an eMMC device\n");
+               return CMD_RET_FAILURE;
+       }
+       err = mmc_boot_wp(mmc);
+       if (err)
+               return CMD_RET_FAILURE;
+       printf("boot areas protected\n");
+       return CMD_RET_SUCCESS;
+}
+
 static cmd_tbl_t cmd_mmc[] = {
        U_BOOT_CMD_MKENT(info, 1, 0, do_mmcinfo, "", ""),
        U_BOOT_CMD_MKENT(read, 4, 1, do_mmc_read, "", ""),
+       U_BOOT_CMD_MKENT(wp, 1, 0, do_mmc_boot_wp, "", ""),
 #if CONFIG_IS_ENABLED(MMC_WRITE)
        U_BOOT_CMD_MKENT(write, 4, 0, do_mmc_write, "", ""),
        U_BOOT_CMD_MKENT(erase, 3, 0, do_mmc_erase, "", ""),
@@ -944,6 +989,7 @@ U_BOOT_CMD(
        "mmc part - lists available partition on current mmc device\n"
        "mmc dev [dev] [part] - show or set current mmc device [partition]\n"
        "mmc list - lists available devices\n"
+       "mmc wp - power on write protect booot partitions\n"
 #if CONFIG_IS_ENABLED(MMC_HW_PARTITIONING)
        "mmc hwpartition [args...] - does hardware partitioning\n"
        "  arguments (sizes in 512-byte blocks):\n"