On Wed, Jun 30, 2021 at 10:21 AM Ulf Hansson <ulf.hansson@xxxxxxxxxx> wrote: > > On Thu, 24 Jun 2021 at 18:31, Al Cooper <alcooperx@xxxxxxxxx> wrote: > > > > When an eMMC device is being run in HS400 mode, any access to the > > RPMB device will cause the error message "mmc1: Invalid UHS-I mode > > selected". This happens as a result of tuning being disabled before > > RPMB access and then re-enabled after the RPMB access is complete. > > When tuning is re-enabled, the system has to switch from HS400 > > to HS200 to do the tuning and then back to HS400. As part of > > sequence to switch from HS400 to HS200 the system is temporarily > > put into HS mode. When switching to HS mode, sdhci_get_preset_value() > > is called and does not have support for HS mode and prints the warning > > message and returns the preset for SDR12. The fix is to add support > > for MMC and SD HS modes to sdhci_get_preset_value(). > > > > This can be reproduced on any system running eMMC in HS400 mode > > (not HS400ES) by using the "mmc" utility to run the following > > command: "mmc rpmb read-counter /dev/mmcblk0rpmb". > > > > Signed-off-by: Al Cooper <alcooperx@xxxxxxxxx> > > I assume we want this for stable kernels, but it would be nice to add > a fixes tag as well. > > Do you know if there is a specific commit that this fixes? The function sdhci_get_preset_value(), which is missing the HS modes, was added in 52983382c74f5 for v3.9. Should I add a fixes tag for that commit? Thanks Al > > Kind regards > Uffe > > > --- > > drivers/mmc/host/sdhci.c | 4 ++++ > > drivers/mmc/host/sdhci.h | 1 + > > 2 files changed, 5 insertions(+) > > > > diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c > > index bf238ade1602..6b39126fbf06 100644 > > --- a/drivers/mmc/host/sdhci.c > > +++ b/drivers/mmc/host/sdhci.c > > @@ -1812,6 +1812,10 @@ static u16 sdhci_get_preset_value(struct sdhci_host *host) > > u16 preset = 0; > > > > switch (host->timing) { > > + case MMC_TIMING_MMC_HS: > > + case MMC_TIMING_SD_HS: > > + preset = sdhci_readw(host, SDHCI_PRESET_FOR_HIGH_SPEED); > > + break; > > case MMC_TIMING_UHS_SDR12: > > preset = sdhci_readw(host, SDHCI_PRESET_FOR_SDR12); > > break; > > diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h > > index 0770c036e2ff..960fed78529e 100644 > > --- a/drivers/mmc/host/sdhci.h > > +++ b/drivers/mmc/host/sdhci.h > > @@ -253,6 +253,7 @@ > > > > /* 60-FB reserved */ > > > > +#define SDHCI_PRESET_FOR_HIGH_SPEED 0x64 > > #define SDHCI_PRESET_FOR_SDR12 0x66 > > #define SDHCI_PRESET_FOR_SDR25 0x68 > > #define SDHCI_PRESET_FOR_SDR50 0x6A > > > > base-commit: 7426cedc7dad67bf3c71ea6cc29ab7822e1a453f > > -- > > 2.17.1 > >