[RFC 1/2] drivers: mmc: write protect active boot area after mmc init.

Paul Liu paul.liu at linaro.org
Thu Jan 27 02:23:53 CET 2022


Hi Jaehoon,

There are 2 boot partitions on eMMC. So the active one is write-protected.
Users can write the new firmware to another boot partition (inactive) which
is not write-protected.
And then switch it on.

In U-boot, execute "mmc wp" write-protect all of the boot partitions.
Maybe we can add an additional command that just write-protect only one
boot partition.

Yours,
Paul


On Thu, 27 Jan 2022 at 07:24, Jaehoon Chung <jh80.chung at samsung.com> wrote:

> 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