drivers: mmc: write protect single boot area
authorYing-Chun Liu (PaulLiu) <paul.liu@linaro.org>
Mon, 25 Apr 2022 13:59:02 +0000 (21:59 +0800)
committerJaehoon Chung <jh80.chung@samsung.com>
Wed, 27 Jul 2022 06:19:09 +0000 (15:19 +0900)
Add features to write protect single boot area rather than all boot
areas.

Signed-off-by: Ying-Chun Liu (PaulLiu) <paul.liu@linaro.org>
Cc: Peng Fan <peng.fan@nxp.com>
Cc: Jaehoon Chung <jh80.chung@samsung.com>
drivers/mmc/mmc.c
include/mmc.h

index 12d29da..8efee99 100644 (file)
@@ -863,6 +863,33 @@ int mmc_boot_wp(struct mmc *mmc)
        return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_WP, 1);
 }
 
+int mmc_boot_wp_single_partition(struct mmc *mmc, int partition)
+{
+       u8 value;
+       int ret;
+
+       value = EXT_CSD_BOOT_WP_B_PWR_WP_EN;
+
+       if (partition == 0) {
+               value |= EXT_CSD_BOOT_WP_B_SEC_WP_SEL;
+               ret = mmc_switch(mmc,
+                                EXT_CSD_CMD_SET_NORMAL,
+                                EXT_CSD_BOOT_WP,
+                                value);
+       } else if (partition == 1) {
+               value |= EXT_CSD_BOOT_WP_B_SEC_WP_SEL;
+               value |= EXT_CSD_BOOT_WP_B_PWR_WP_SEC_SEL;
+               ret = mmc_switch(mmc,
+                                EXT_CSD_CMD_SET_NORMAL,
+                                EXT_CSD_BOOT_WP,
+                                value);
+       } else {
+               ret = mmc_boot_wp(mmc);
+       }
+
+       return ret;
+}
+
 #if !CONFIG_IS_ENABLED(MMC_TINY)
 static int mmc_set_card_speed(struct mmc *mmc, enum bus_mode mode,
                              bool hsdowngrade)
index 073b01f..f519d86 100644 (file)
@@ -308,6 +308,10 @@ static inline bool mmc_is_tuning_cmd(uint cmdidx)
 
 #define EXT_CSD_HS_CTRL_REL    (1 << 0)        /* host controlled WR_REL_SET */
 
+#define EXT_CSD_BOOT_WP_B_SEC_WP_SEL   (0x80)  /* enable partition selector */
+#define EXT_CSD_BOOT_WP_B_PWR_WP_SEC_SEL (0x02)        /* partition selector to protect */
+#define EXT_CSD_BOOT_WP_B_PWR_WP_EN    (0x01)  /* power-on write-protect */
+
 #define EXT_CSD_WR_DATA_REL_USR                (1 << 0)        /* user data area WR_REL */
 #define EXT_CSD_WR_DATA_REL_GP(x)      (1 << ((x)+1))  /* GP part (x+1) WR_REL */
 
@@ -991,6 +995,18 @@ int mmc_send_ext_csd(struct mmc *mmc, u8 *ext_csd);
  */
 int mmc_boot_wp(struct mmc *mmc);
 
+/**
+ * mmc_boot_wp_single_partition() - set write protection to a boot partition.
+ *
+ * This function sets a single boot partition to protect and leave the
+ * other partition writable.
+ *
+ * @param mmc the mmc device.
+ * @param partition 0 - first boot partition, 1 - second boot partition.
+ * @return 0 for success
+ */
+int mmc_boot_wp_single_partition(struct mmc *mmc, int partition);
+
 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;