Re: [PATCH v8 3/5] mmc: sdhci-msm: Set ICE clk to TURBO at sdhci ICE init

From: Adrian Hunter

Date: Tue May 05 2026 - 06:26:44 EST


On 05/05/2026 13:00, Adrian Hunter wrote:
> On 09/04/2026 14:44, Abhinaba Rakshit wrote:
>> MMC controller lacks a clock scaling mechanism, unlike the UFS
>> controller. By default, the MMC controller is set to TURBO mode
>> during probe, but the ICE clock remains at XO frequency,
>> leading to read/write performance degradation on eMMC.
>>
>> To address this, set the ICE clock to TURBO during sdhci_msm_ice_init
>> to align it with the controller clock. This ensures consistent
>> performance and avoids mismatches between the controller
>> and ICE clock frequencies.
>>
>> For platforms where ICE is represented as a separate device,
>> use the OPP framework to vote for TURBO mode, maintaining
>> proper voltage and power domain constraints.
>>
>> Reviewed-by: Konrad Dybcio <konrad.dybcio@xxxxxxxxxxxxxxxx>
>> Signed-off-by: Abhinaba Rakshit <abhinaba.rakshit@xxxxxxxxxxxxxxxx>
>
> Reviewed-by: Adrian Hunter <adrian.hunter@xxxxxxxxx>

Or rather:

Acked-by: Adrian Hunter <adrian.hunter@xxxxxxxxx>

>
>> ---
>> drivers/mmc/host/sdhci-msm.c | 24 ++++++++++++++++++++++++
>> 1 file changed, 24 insertions(+)
>>
>> diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
>> index da356627d9de6a11ed5779bf057fa8eb23c38bc0..32e3f37fe425f66c00290a373e06e8ab6257824e 100644
>> --- a/drivers/mmc/host/sdhci-msm.c
>> +++ b/drivers/mmc/host/sdhci-msm.c
>> @@ -1901,6 +1901,8 @@ static void sdhci_msm_set_clock(struct sdhci_host *host, unsigned int clock)
>> #ifdef CONFIG_MMC_CRYPTO
>>
>> static const struct blk_crypto_ll_ops sdhci_msm_crypto_ops; /* forward decl */
>> +static int sdhci_msm_ice_scale_clk(struct sdhci_msm_host *msm_host, unsigned long target_freq,
>> + bool round_ceil); /* forward decl */
>>
>> static int sdhci_msm_ice_init(struct sdhci_msm_host *msm_host,
>> struct cqhci_host *cq_host)
>> @@ -1964,6 +1966,11 @@ static int sdhci_msm_ice_init(struct sdhci_msm_host *msm_host,
>> }
>>
>> mmc->caps2 |= MMC_CAP2_CRYPTO;
>> +
>> + err = sdhci_msm_ice_scale_clk(msm_host, INT_MAX, false);
>> + if (err && err != -EOPNOTSUPP)
>> + dev_warn(dev, "Unable to boost ICE clock to TURBO\n");
>> +
>> return 0;
>> }
>>
>> @@ -1989,6 +1996,16 @@ static int sdhci_msm_ice_suspend(struct sdhci_msm_host *msm_host)
>> return 0;
>> }
>>
>> +static int sdhci_msm_ice_scale_clk(struct sdhci_msm_host *msm_host,
>> + unsigned long target_freq,
>> + bool round_ceil)
>> +{
>> + if (msm_host->mmc->caps2 & MMC_CAP2_CRYPTO)
>> + return qcom_ice_scale_clk(msm_host->ice, target_freq, round_ceil);
>> +
>> + return 0;
>> +}
>> +
>> static inline struct sdhci_msm_host *
>> sdhci_msm_host_from_crypto_profile(struct blk_crypto_profile *profile)
>> {
>> @@ -2114,6 +2131,13 @@ sdhci_msm_ice_suspend(struct sdhci_msm_host *msm_host)
>> {
>> return 0;
>> }
>> +
>> +static inline int
>> +sdhci_msm_ice_scale_clk(struct sdhci_msm_host *msm_host, unsigned long target_freq,
>> + bool round_ceil)
>> +{
>> + return 0;
>> +}
>> #endif /* !CONFIG_MMC_CRYPTO */
>>
>> /*****************************************************************************\
>>
>