[RFC 1/2] drivers: mmc: write protect active boot area after mmc init.
Jaehoon Chung
jh80.chung at samsung.com
Thu Jan 27 00:25:34 CET 2022
Hi,
On 1/25/22 22:55, Ying-Chun Liu wrote:
> From: "Ying-Chun Liu (PaulLiu)" <paul.liu at linaro.org>
>
> This commit implements write protection for active boot partition for
> eMMC. The active boot partition is write protected, and it is still
> able to write to the inactive boot partition.
It seems that you want to enable Write-protect about boot partition without additional command, right?
After initialized eMMC, how to update image into boot partition?
Best Regards,
Jaehoon Chung
>
> Signed-off-by: Ying-Chun Liu (PaulLiu) <paul.liu at linaro.org>
> Cc: Peng Fan <peng.fan at nxp.com>
> Cc: Jaehoon Chung <jh80.chung at samsung.com>
> ---
> drivers/mmc/Kconfig | 10 ++++++++
> drivers/mmc/mmc.c | 58 +++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 68 insertions(+)
>
> diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig
> index e0927ce1c9..c4bae743e6 100644
> --- a/drivers/mmc/Kconfig
> +++ b/drivers/mmc/Kconfig
> @@ -100,6 +100,16 @@ config MMC_HW_PARTITIONING
> This adds a command and an API to do hardware partitioning on eMMC
> devices.
>
> +config MMC_WRITE_PROTECT_ACTIVE_BOOT
> + bool "Write protection for active boot partition (eMMC)"
> + depends on MMC_HW_PARTITIONING
> + default n
> + help
> + Write protection for active boot partition when mmc initialized.
> + This option protects the active boot partition so that it cannot
> + be written. But it is still able to write to the inactive boot
> + partition.
> +
> config SUPPORT_EMMC_RPMB
> bool "Support eMMC replay protected memory block (RPMB)"
> imply CMD_MMC_RPMB
> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
> index 4d9871d69f..8620918749 100644
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -860,6 +860,60 @@ int mmc_boot_wp(struct mmc *mmc)
> return mmc_switch(mmc, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_WP, 1);
> }
>
> +/**
> + * 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.
> + */
> +int mmc_boot_wp_single_partition(struct mmc *mmc, int partition)
> +{
> + u8 value;
> + int ret;
> +
> + value = 1;
> +
> + if (partition == 0) {
> + value |= 0x80;
> + ret = mmc_switch(mmc,
> + EXT_CSD_CMD_SET_NORMAL,
> + EXT_CSD_BOOT_WP,
> + value);
> + } else if (partition == 1) {
> + value |= 0x80;
> + value |= 0x02;
> + ret = mmc_switch(mmc,
> + EXT_CSD_CMD_SET_NORMAL,
> + EXT_CSD_BOOT_WP,
> + value);
> + } else {
> + ret = mmc_boot_wp(mmc);
> + }
> +
> + return ret;
> +}
> +
> +/**
> + * mmc_boot_wp_active_partition() - set write protection to active boot
> + * partition.
> + *
> + * @param mmc the mmc device.
> + */
> +static int mmc_boot_wp_active_partition(struct mmc *mmc)
> +{
> + u8 part;
> +
> + if (mmc->part_config == MMCPART_NOAVAILABLE)
> + return -EOPNOTSUPP;
> +
> + part = EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config);
> +
> + return mmc_boot_wp_single_partition(mmc, part - 1);
> +}
> +
> #if !CONFIG_IS_ENABLED(MMC_TINY)
> static int mmc_set_card_speed(struct mmc *mmc, enum bus_mode mode,
> bool hsdowngrade)
> @@ -2925,6 +2979,10 @@ static int mmc_complete_init(struct mmc *mmc)
> mmc->has_init = 0;
> else
> mmc->has_init = 1;
> +
> + if (!err && CONFIG_IS_ENABLED(MMC_WRITE_PROTECT_ACTIVE_BOOT))
> + mmc_boot_wp_active_partition(mmc);
> +
> return err;
> }
>
More information about the U-Boot
mailing list