cmd: mmc: provide boot area protection command
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Mon, 30 Mar 2020 05:24:19 +0000 (07:24 +0200)
committerPeng Fan <peng.fan@nxp.com>
Wed, 22 Apr 2020 12:41:55 +0000 (20:41 +0800)
Provide command 'mmc wp' to power on write protect boot areas on eMMC
devices.

The B_PWR_WP_EN bit in the extended CSD register BOOT_WP is set. The boot
area are write protected until the next power cycle occurs.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
cmd/mmc.c
drivers/mmc/mmc.c
include/mmc.h

index 6d71208a2072e8beb65f9beb30e65973212a67e8..6142ec8e2058abda9f5eb425e83fd3eb246e2416 100644 (file)
--- a/cmd/mmc.c
+++ b/cmd/mmc.c
@@ -896,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, "", ""),
@@ -968,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"
index bfcdaa665dc954bf1b2f36d990ad6a30b4e81afd..fc3123c3c3d65eb8c7b6fca43879b7670af7cf61 100644 (file)
@@ -810,6 +810,11 @@ int mmc_switch(struct mmc *mmc, u8 set, u8 index, u8 value)
        return __mmc_switch(mmc, set, index, value, true);
 }
 
+int mmc_boot_wp(struct mmc *mmc)
+{
+       return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_WP, 1);
+}
+
 #if !CONFIG_IS_ENABLED(MMC_TINY)
 static int mmc_set_card_speed(struct mmc *mmc, enum bus_mode mode,
                              bool hsdowngrade)
index 85fc3497a14a42db47d5fd39b36dc974d55f17bd..e92e9205600e3916a47655bdb337b222d82f9066 100644 (file)
@@ -907,6 +907,15 @@ struct blk_desc *mmc_get_blk_desc(struct mmc *mmc);
  */
 int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd);
 
+/**
+ * mmc_boot_wp() - power on write protect boot partitions
+ *
+ * The boot partitions are write protected until the next power cycle.
+ *
+ * Return:     0 for success
+ */
+int mmc_boot_wp(struct mmc *mmc);
+
 static inline enum dma_data_direction mmc_get_dma_dir(struct mmc_data *data)
 {
        return data->flags & MMC_DATA_WRITE ? DMA_TO_DEVICE : DMA_FROM_DEVICE;