* [PATCH v7 1/2] mmc: Allow host driver to control the re-programming of crypto keys
2026-08-11 15:17 [PATCH v7 0/2] mmc: Avoid reprogram all keys to Inline Crypto Engine for MMC runtime suspend resume Neeraj Soni
@ 2026-08-11 15:17 ` Neeraj Soni
2026-08-11 15:17 ` [PATCH v7 2/2] mmc: sdhci-msm: Use pm ops instead of macro to restore " Neeraj Soni
1 sibling, 0 replies; 4+ messages in thread
From: Neeraj Soni @ 2026-08-11 15:17 UTC (permalink / raw)
To: ebiggers, ulf.hansson, adrian.hunter
Cc: quic_dmukhopa, quic_rampraka, quic_nitirawa, quic_sachgupt,
quic_bhaskarv, quic_gaurkash, quic_sartgarg, ram.gupta, linux-mmc,
linux-kernel, linux-arm-msm, neeraj.soni
The register context for the crypto profile belongs to the
sdhci/cqhci host and not the mmc card, hence re-programming should be
managed by the host driver itself.
Add the flag MMC_CAP2_CRYPTO_NO_REPROG as part of host->caps2 to control
reprogramming keys to crypto engine for SoCs which do not require this
feature.
Signed-off-by: Seshu Madhavi Puppala <quic_spuppala@quicinc.com>
Co-developed-by: Ram Prakash Gupta <quic_rampraka@quicinc.com>
Signed-off-by: Ram Prakash Gupta <quic_rampraka@quicinc.com>
Co-developed-by: Sarthak Garg <quic_sartgarg@quicinc.com>
Signed-off-by: Sarthak Garg <quic_sartgarg@quicinc.com>
Signed-off-by: Debraj Mukhopadhyay <quic_dmukhopa@quicinc.com>
Reviewed-by: Eric Biggers <ebiggers@kernel.org>
Signed-off-by: Neeraj Soni <neeraj.soni@oss.qualcomm.com>
---
drivers/mmc/core/crypto.c | 2 +-
include/linux/mmc/host.h | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/mmc/core/crypto.c b/drivers/mmc/core/crypto.c
index fec4fbf16a5b..a5a90bfc634e 100644
--- a/drivers/mmc/core/crypto.c
+++ b/drivers/mmc/core/crypto.c
@@ -15,7 +15,7 @@
void mmc_crypto_set_initial_state(struct mmc_host *host)
{
/* Reset might clear all keys, so reprogram all the keys. */
- if (host->caps2 & MMC_CAP2_CRYPTO)
+ if ((host->caps2 & MMC_CAP2_CRYPTO) && !(host->caps2 & MMC_CAP2_CRYPTO_NO_REPROG))
blk_crypto_reprogram_all_keys(&host->crypto_profile);
}
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index ba84f02c2a10..3c3c45fdf39b 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -463,6 +463,7 @@ struct mmc_host {
#define MMC_CAP2_CRYPTO 0
#endif
#define MMC_CAP2_ALT_GPT_TEGRA (1 << 28) /* Host with eMMC that has GPT entry at a non-standard location */
+#define MMC_CAP2_CRYPTO_NO_REPROG (1 << 29) /* Host handles inline crypto key reprogramming */
bool uhs2_sd_tran; /* UHS-II flag for SD_TRAN state */
bool uhs2_app_cmd; /* UHS-II flag for APP command */
--
2.34.1
^ permalink raw reply related [flat|nested] 4+ messages in thread* [PATCH v7 2/2] mmc: sdhci-msm: Use pm ops instead of macro to restore crypto keys
2026-08-11 15:17 [PATCH v7 0/2] mmc: Avoid reprogram all keys to Inline Crypto Engine for MMC runtime suspend resume Neeraj Soni
2026-08-11 15:17 ` [PATCH v7 1/2] mmc: Allow host driver to control the re-programming of crypto keys Neeraj Soni
@ 2026-08-11 15:17 ` Neeraj Soni
2026-08-11 19:08 ` Eric Biggers
1 sibling, 1 reply; 4+ messages in thread
From: Neeraj Soni @ 2026-08-11 15:17 UTC (permalink / raw)
To: ebiggers, ulf.hansson, adrian.hunter
Cc: quic_dmukhopa, quic_rampraka, quic_nitirawa, quic_sachgupt,
quic_bhaskarv, quic_gaurkash, quic_sartgarg, ram.gupta, linux-mmc,
linux-kernel, linux-arm-msm, neeraj.soni
From: Ram Prakash Gupta <ram.gupta@oss.qualcomm.com>
Inline Crypto Engine (ICE) keys are lost after hibernation entry and this
needs to be restored when hibernation exits. ICE keys are re-programmed
during sdhci_msm_ice_init() but it may not cover cases where the
hibernation image is already restored.
Unwrap the pm ops and use directly in driver to add the call to restore
Inline Crypto Engine (ICE) keys. This ensures that ICE is brought into
same state as before hibernation.
Also set MMC_CAP2_CRYPTO_NO_REPROG to indicate that re-programming of ICE
keys is not needed during MMC runtime suspend/resume.
Signed-off-by: Ram Prakash Gupta <ram.gupta@oss.qualcomm.com>
Signed-off-by: Seshu Madhavi Puppala <quic_spuppala@quicinc.com>
Co-developed-by: Ram Prakash Gupta <quic_rampraka@quicinc.com>
Signed-off-by: Ram Prakash Gupta <quic_rampraka@quicinc.com>
Co-developed-by: Sarthak Garg <quic_sartgarg@quicinc.com>
Signed-off-by: Sarthak Garg <quic_sartgarg@quicinc.com>
Signed-off-by: Debraj Mukhopadhyay <quic_dmukhopa@quicinc.com>
Signed-off-by: Neeraj Soni <neeraj.soni@oss.qualcomm.com>
---
drivers/mmc/host/sdhci-msm.c | 32 +++++++++++++++++++++++++++++++-
1 file changed, 31 insertions(+), 1 deletion(-)
diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
index 4aff965f0e2e..460994164d2d 100644
--- a/drivers/mmc/host/sdhci-msm.c
+++ b/drivers/mmc/host/sdhci-msm.c
@@ -1959,6 +1959,7 @@ static int sdhci_msm_ice_init(struct sdhci_msm_host *msm_host,
}
mmc->caps2 |= MMC_CAP2_CRYPTO;
+ mmc->caps2 |= MMC_CAP2_CRYPTO_NO_REPROG;
return 0;
}
@@ -2055,6 +2056,12 @@ static int sdhci_msm_ice_prepare_key(struct blk_crypto_profile *profile,
return qcom_ice_prepare_key(msm_host->ice, lt_key, lt_key_size, eph_key);
}
+static void sdhci_msm_ice_restore(struct sdhci_host *host)
+{
+ if (host->mmc->caps2 & MMC_CAP2_CRYPTO)
+ blk_crypto_reprogram_all_keys(&host->mmc->crypto_profile);
+}
+
static void sdhci_msm_non_cqe_ice_init(struct sdhci_host *host)
{
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
@@ -2149,6 +2156,10 @@ sdhci_msm_ice_suspend(struct sdhci_msm_host *msm_host)
{
return 0;
}
+
+static inline void sdhci_msm_ice_restore(struct sdhci_host *host)
+{
+}
#endif /* !CONFIG_MMC_CRYPTO */
/*****************************************************************************\
@@ -2983,9 +2994,28 @@ static int sdhci_msm_runtime_resume(struct device *dev)
return ret;
}
+static int sdhci_msm_restore(struct device *dev)
+{
+ struct sdhci_host *host = dev_get_drvdata(dev);
+ int ret;
+
+ ret = pm_runtime_force_resume(dev);
+ if (ret)
+ return ret;
+
+ sdhci_msm_ice_restore(host);
+
+ return ret;
+}
+
static const struct dev_pm_ops sdhci_msm_pm_ops = {
- SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume)
RUNTIME_PM_OPS(sdhci_msm_runtime_suspend, sdhci_msm_runtime_resume, NULL)
+ .suspend = pm_sleep_ptr(pm_runtime_force_suspend),
+ .resume = pm_sleep_ptr(pm_runtime_force_resume),
+ .freeze = pm_sleep_ptr(pm_runtime_force_suspend),
+ .restore = pm_sleep_ptr(sdhci_msm_restore),
+ .thaw = pm_sleep_ptr(pm_runtime_force_resume),
+ .poweroff = pm_sleep_ptr(pm_runtime_force_suspend),
};
static struct platform_driver sdhci_msm_driver = {
--
2.34.1
^ permalink raw reply related [flat|nested] 4+ messages in thread