* [PATCH v3 0/3] Bug fixes for UFS multi-frequency scaling on Qcom platform
@ 2025-05-09 7:50 Ziqi Chen
2025-05-09 7:50 ` [PATCH v3 1/3] scsi: ufs: qcom: Check gear against max gear in vop freq_to_gear() Ziqi Chen
` (4 more replies)
0 siblings, 5 replies; 9+ messages in thread
From: Ziqi Chen @ 2025-05-09 7:50 UTC (permalink / raw)
To: quic_cang, bvanassche, mani, beanhuo, avri.altman, junwoo80.lee,
martin.petersen, quic_ziqichen, quic_nguyenb, quic_nitirawa,
quic_rampraka, neil.armstrong, luca.weiss, konrad.dybcio,
peter.wang
Cc: linux-arm-msm, linux-scsi
This series fixes a few corner cases introduced by multi-frequency scaling feature
on some old Qcom platforms design.
1. On some platforms, the frequency tables for unipro clock and the core clock are different,
which has led to errors when handling the unipro clock.
2. On some platforms, the maximum gear supported by the host may exceed the maximum gear
supported by connected UFS device. Therefore, this should be taken into account when
find mapped gear for frequency.
This series has been tested on below platforms -
sm8550 mtp + UFS3.1
SM8650 MTP + UFS3.1
QCS6490 BR3GEN2 + UFS2.2
For change "scsi: ufs: qcom: Check gear against max gear in vop freq_to_gear()"
Reported-by: Neil Armstrong <neil.armstrong@linaro.org>
Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on RB3GEN2
For change "scsi: ufs: qcom: Map devfreq OPP freq to UniPro Core Clock freq"
"scsi: ufs: qcom: Call ufs_qcom_cfg_timers() in clock scaling path"
Reported-by: Luca Weiss <luca.weiss@fairphone.com>
Closes: https://lore.kernel.org/linux-arm-msm/D9FZ9U3AEXW4.1I12FX3YQ3JPW@fairphone.com/
Tested-by: Luca Weiss <luca.weiss@fairphone.com> # sm7225-fairphone-fp4
v1 - > v2:
Change "scsi: ufs: qcom: Check gear against max gear in vop freq_to_gear()":
1. Instead of return 'gear', return '0' directly if didn't find mapped gear
2. Derectly return min_t(gear,max_gear) instead assign to 'gear' then return it.
v2 - > v3:
Change "scsi: ufs: qcom: Check gear against max gear in vop freq_to_gear()":
Replace hard code '0' with enum 'UFS_HS_DONT_CHANGE'.
Change "scsi: ufs: qcom: Map devfreq OPP freq to UniPro Core Clock freq"
1. Skip calling ufs_qcom_opp_freq_to_clk_freq() if freq is ULONG_MAX to avoid useless error prints.
2. Correct indentation size to follow Linux kernel coding style.
Change 'scsi: ufs: qcom: Call ufs_qcom_cfg_timers() in clock scaling path':
Skip calling ufs_qcom_opp_freq_to_clk_freq() if freq is ULONG_MAX to avoid useless prints.
Can Guo (2):
scsi: ufs: qcom: Map devfreq OPP freq to UniPro Core Clock freq
scsi: ufs: qcom: Call ufs_qcom_cfg_timers() in clock scaling path
Ziqi Chen (1):
scsi: ufs: qcom: Check gear against max gear in vop freq_to_gear()
drivers/ufs/host/ufs-qcom.c | 136 +++++++++++++++++++++++++++---------
1 file changed, 103 insertions(+), 33 deletions(-)
--
2.34.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v3 1/3] scsi: ufs: qcom: Check gear against max gear in vop freq_to_gear()
2025-05-09 7:50 [PATCH v3 0/3] Bug fixes for UFS multi-frequency scaling on Qcom platform Ziqi Chen
@ 2025-05-09 7:50 ` Ziqi Chen
2025-05-09 7:50 ` [PATCH v3 2/3] scsi: ufs: qcom: Map devfreq OPP freq to UniPro Core Clock freq Ziqi Chen
` (3 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Ziqi Chen @ 2025-05-09 7:50 UTC (permalink / raw)
To: quic_cang, bvanassche, mani, beanhuo, avri.altman, junwoo80.lee,
martin.petersen, quic_ziqichen, quic_nguyenb, quic_nitirawa,
quic_rampraka, neil.armstrong, luca.weiss, konrad.dybcio,
peter.wang
Cc: linux-arm-msm, linux-scsi, Manivannan Sadhasivam,
James E.J. Bottomley, open list
The vop freq_to_gear() may return a gear greater than the negotiated max
gear, return the negotiated max gear if the mapped gear is greater than it.
Fixes: c02fe9e222d1 ("scsi: ufs: qcom: Implement the freq_to_gear_speed() vop")
Signed-off-by: Ziqi Chen <quic_ziqichen@quicinc.com>
Tested-by: Neil Armstrong <neil.armstrong@linaro.org>
Reviewed-by: Bean Huo <beanhuo@micron.com>
---
v1 -> v2:
1. Instead of return 'gear', return '0' directly if didn't find mapped
gear
2. Derectly return min_t(gear,max_gear) instead assign to 'gear' then
return it.
v2 -> v3:
Replace hard code '0' with enum 'UFS_HS_DONT_CHANGE'.
---
drivers/ufs/host/ufs-qcom.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
index 790da25cbaf3..654d970b6dec 100644
--- a/drivers/ufs/host/ufs-qcom.c
+++ b/drivers/ufs/host/ufs-qcom.c
@@ -2083,7 +2083,7 @@ static int ufs_qcom_config_esi(struct ufs_hba *hba)
static u32 ufs_qcom_freq_to_gear_speed(struct ufs_hba *hba, unsigned long freq)
{
- u32 gear = 0;
+ u32 gear = UFS_HS_DONT_CHANGE;
switch (freq) {
case 403000000:
@@ -2105,10 +2105,10 @@ static u32 ufs_qcom_freq_to_gear_speed(struct ufs_hba *hba, unsigned long freq)
break;
default:
dev_err(hba->dev, "%s: Unsupported clock freq : %lu\n", __func__, freq);
- break;
+ return UFS_HS_DONT_CHANGE;
}
- return gear;
+ return min_t(u32, gear, hba->max_pwr_info.info.gear_rx);
}
/*
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v3 2/3] scsi: ufs: qcom: Map devfreq OPP freq to UniPro Core Clock freq
2025-05-09 7:50 [PATCH v3 0/3] Bug fixes for UFS multi-frequency scaling on Qcom platform Ziqi Chen
2025-05-09 7:50 ` [PATCH v3 1/3] scsi: ufs: qcom: Check gear against max gear in vop freq_to_gear() Ziqi Chen
@ 2025-05-09 7:50 ` Ziqi Chen
2025-05-12 8:57 ` Bean Huo
2025-05-09 7:50 ` [PATCH v3 3/3] scsi: ufs: qcom: Call ufs_qcom_cfg_timers() in clock scaling path Ziqi Chen
` (2 subsequent siblings)
4 siblings, 1 reply; 9+ messages in thread
From: Ziqi Chen @ 2025-05-09 7:50 UTC (permalink / raw)
To: quic_cang, bvanassche, mani, beanhuo, avri.altman, junwoo80.lee,
martin.petersen, quic_ziqichen, quic_nguyenb, quic_nitirawa,
quic_rampraka, neil.armstrong, luca.weiss, konrad.dybcio,
peter.wang
Cc: linux-arm-msm, linux-scsi, Manivannan Sadhasivam,
James E.J. Bottomley, open list
From: Can Guo <quic_cang@quicinc.com>
On some platforms, the devfreq OPP freq may be different than the unipro
core clock freq. Implement ufs_qcom_opp_freq_to_clk_freq() and use it to
find the unipro core clk freq.
Fixes: c02fe9e222d1 ("scsi: ufs: qcom: Implement the freq_to_gear_speed() vop")
Signed-off-by: Can Guo <quic_cang@quicinc.com>
Co-developed-by: Ziqi Chen <quic_ziqichen@quicinc.com>
Signed-off-by: Ziqi Chen <quic_ziqichen@quicinc.com>
Tested-by: Luca Weiss <luca.weiss@fairphone.com>
---
V2 -> V3:
1. Skip calling ufs_qcom_opp_freq_to_clk_freq() if freq is ULONG_MAX to avoid
usless error prints.
2. Correct indentation size to follow Linux kernel coding style.
---
drivers/ufs/host/ufs-qcom.c | 81 ++++++++++++++++++++++++++++++++-----
1 file changed, 71 insertions(+), 10 deletions(-)
diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
index 654d970b6dec..6c054727c3bc 100644
--- a/drivers/ufs/host/ufs-qcom.c
+++ b/drivers/ufs/host/ufs-qcom.c
@@ -122,7 +122,9 @@ static const struct {
};
static void ufs_qcom_get_default_testbus_cfg(struct ufs_qcom_host *host);
-static int ufs_qcom_set_core_clk_ctrl(struct ufs_hba *hba, unsigned long freq);
+static unsigned long ufs_qcom_opp_freq_to_clk_freq(struct ufs_hba *hba,
+ unsigned long freq, char *name);
+static int ufs_qcom_set_core_clk_ctrl(struct ufs_hba *hba, bool is_scale_up, unsigned long freq);
static struct ufs_qcom_host *rcdev_to_ufs_host(struct reset_controller_dev *rcd)
{
@@ -656,7 +658,7 @@ static int ufs_qcom_link_startup_notify(struct ufs_hba *hba,
return -EINVAL;
}
- err = ufs_qcom_set_core_clk_ctrl(hba, ULONG_MAX);
+ err = ufs_qcom_set_core_clk_ctrl(hba, true, ULONG_MAX);
if (err)
dev_err(hba->dev, "cfg core clk ctrl failed\n");
/*
@@ -1414,29 +1416,46 @@ static int ufs_qcom_set_clk_40ns_cycles(struct ufs_hba *hba,
return ufshcd_dme_set(hba, UIC_ARG_MIB(PA_VS_CORE_CLK_40NS_CYCLES), reg);
}
-static int ufs_qcom_set_core_clk_ctrl(struct ufs_hba *hba, unsigned long freq)
+static int ufs_qcom_set_core_clk_ctrl(struct ufs_hba *hba, bool is_scale_up, unsigned long freq)
{
struct ufs_qcom_host *host = ufshcd_get_variant(hba);
struct list_head *head = &hba->clk_list_head;
struct ufs_clk_info *clki;
u32 cycles_in_1us = 0;
u32 core_clk_ctrl_reg;
+ unsigned long clk_freq;
int err;
+ if (hba->use_pm_opp && freq != ULONG_MAX) {
+ clk_freq = ufs_qcom_opp_freq_to_clk_freq(hba, freq, "core_clk_unipro");
+ if (clk_freq) {
+ cycles_in_1us = ceil(clk_freq, HZ_PER_MHZ);
+ goto set_core_clk_ctrl;
+ }
+ }
+
list_for_each_entry(clki, head, list) {
if (!IS_ERR_OR_NULL(clki->clk) &&
!strcmp(clki->name, "core_clk_unipro")) {
- if (!clki->max_freq)
+ if (!clki->max_freq) {
cycles_in_1us = 150; /* default for backwards compatibility */
- else if (freq == ULONG_MAX)
+ break;
+ }
+
+ if (freq == ULONG_MAX) {
cycles_in_1us = ceil(clki->max_freq, HZ_PER_MHZ);
- else
- cycles_in_1us = ceil(freq, HZ_PER_MHZ);
+ break;
+ }
+ if (is_scale_up)
+ cycles_in_1us = ceil(clki->max_freq, HZ_PER_MHZ);
+ else
+ cycles_in_1us = ceil(clk_get_rate(clki->clk), HZ_PER_MHZ);
break;
}
}
+set_core_clk_ctrl:
err = ufshcd_dme_get(hba,
UIC_ARG_MIB(DME_VS_CORE_CLK_CTRL),
&core_clk_ctrl_reg);
@@ -1479,7 +1498,7 @@ static int ufs_qcom_clk_scale_up_pre_change(struct ufs_hba *hba, unsigned long f
return ret;
}
/* set unipro core clock attributes and clear clock divider */
- return ufs_qcom_set_core_clk_ctrl(hba, freq);
+ return ufs_qcom_set_core_clk_ctrl(hba, true, freq);
}
static int ufs_qcom_clk_scale_up_post_change(struct ufs_hba *hba)
@@ -1511,7 +1530,7 @@ static int ufs_qcom_clk_scale_down_pre_change(struct ufs_hba *hba)
static int ufs_qcom_clk_scale_down_post_change(struct ufs_hba *hba, unsigned long freq)
{
/* set unipro core clock attributes and clear clock divider */
- return ufs_qcom_set_core_clk_ctrl(hba, freq);
+ return ufs_qcom_set_core_clk_ctrl(hba, false, freq);
}
static int ufs_qcom_clk_scale_notify(struct ufs_hba *hba, bool scale_up,
@@ -2081,11 +2100,53 @@ static int ufs_qcom_config_esi(struct ufs_hba *hba)
return ret;
}
+static unsigned long ufs_qcom_opp_freq_to_clk_freq(struct ufs_hba *hba,
+ unsigned long freq, char *name)
+{
+ struct ufs_clk_info *clki;
+ struct dev_pm_opp *opp;
+ unsigned long clk_freq;
+ int idx = 0;
+ bool found = false;
+
+ opp = dev_pm_opp_find_freq_exact_indexed(hba->dev, freq, 0, true);
+ if (IS_ERR(opp)) {
+ dev_err(hba->dev, "Failed to find OPP for exact frequency %lu\n", freq);
+ return 0;
+ }
+
+ list_for_each_entry(clki, &hba->clk_list_head, list) {
+ if (!strcmp(clki->name, name)) {
+ found = true;
+ break;
+ }
+
+ idx++;
+ }
+
+ if (!found) {
+ dev_err(hba->dev, "Failed to find clock '%s' in clk list\n", name);
+ dev_pm_opp_put(opp);
+ return 0;
+ }
+
+ clk_freq = dev_pm_opp_get_freq_indexed(opp, idx);
+
+ dev_pm_opp_put(opp);
+
+ return clk_freq;
+}
+
static u32 ufs_qcom_freq_to_gear_speed(struct ufs_hba *hba, unsigned long freq)
{
u32 gear = UFS_HS_DONT_CHANGE;
+ unsigned long unipro_freq;
+
+ if (!hba->use_pm_opp)
+ return gear;
- switch (freq) {
+ unipro_freq = ufs_qcom_opp_freq_to_clk_freq(hba, freq, "core_clk_unipro");
+ switch (unipro_freq) {
case 403000000:
gear = UFS_HS_G5;
break;
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v3 3/3] scsi: ufs: qcom: Call ufs_qcom_cfg_timers() in clock scaling path
2025-05-09 7:50 [PATCH v3 0/3] Bug fixes for UFS multi-frequency scaling on Qcom platform Ziqi Chen
2025-05-09 7:50 ` [PATCH v3 1/3] scsi: ufs: qcom: Check gear against max gear in vop freq_to_gear() Ziqi Chen
2025-05-09 7:50 ` [PATCH v3 2/3] scsi: ufs: qcom: Map devfreq OPP freq to UniPro Core Clock freq Ziqi Chen
@ 2025-05-09 7:50 ` Ziqi Chen
2025-05-12 8:58 ` Bean Huo
2025-05-15 13:19 ` [PATCH v3 0/3] Bug fixes for UFS multi-frequency scaling on Qcom platform Loic Minier
2025-05-21 1:58 ` Martin K. Petersen
4 siblings, 1 reply; 9+ messages in thread
From: Ziqi Chen @ 2025-05-09 7:50 UTC (permalink / raw)
To: quic_cang, bvanassche, mani, beanhuo, avri.altman, junwoo80.lee,
martin.petersen, quic_ziqichen, quic_nguyenb, quic_nitirawa,
quic_rampraka, neil.armstrong, luca.weiss, konrad.dybcio,
peter.wang
Cc: linux-arm-msm, linux-scsi, Manivannan Sadhasivam,
James E.J. Bottomley, open list
From: Can Guo <quic_cang@quicinc.com>
ufs_qcom_cfg_timers() is clock freq dependent like ufs_qcom_set_core_clk_
ctrl(), hence move ufs_qcom_cfg_timers() call to clock scaling path. In
addition, do not assume the devfreq OPP freq is always the 'core_clock'
freq although 'core_clock' is the first clock phandle in device tree, use
ufs_qcom_opp_freq_to_clk_freq() to find the core clk freq.
Signed-off-by: Can Guo <quic_cang@quicinc.com>
Co-developed-by: Ziqi Chen <quic_ziqichen@quicinc.com>
Signed-off-by: Ziqi Chen <quic_ziqichen@quicinc.com>
Tested-by: Luca Weiss <luca.weiss@fairphone.com>
---
V2 -> V3:
Skip calling ufs_qcom_opp_freq_to_clk_freq() if freq is ULONG_MAX to avoid
usless error prints.
---
drivers/ufs/host/ufs-qcom.c | 49 ++++++++++++++++++++++---------------
1 file changed, 29 insertions(+), 20 deletions(-)
diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
index 6c054727c3bc..d23ff912fda4 100644
--- a/drivers/ufs/host/ufs-qcom.c
+++ b/drivers/ufs/host/ufs-qcom.c
@@ -599,13 +599,14 @@ static int ufs_qcom_hce_enable_notify(struct ufs_hba *hba,
*
* @hba: host controller instance
* @is_pre_scale_up: flag to check if pre scale up condition.
+ * @freq: target opp freq
* Return: zero for success and non-zero in case of a failure.
*/
-static int ufs_qcom_cfg_timers(struct ufs_hba *hba, bool is_pre_scale_up)
+static int ufs_qcom_cfg_timers(struct ufs_hba *hba, bool is_pre_scale_up, unsigned long freq)
{
struct ufs_qcom_host *host = ufshcd_get_variant(hba);
struct ufs_clk_info *clki;
- unsigned long core_clk_rate = 0;
+ unsigned long clk_freq = 0;
u32 core_clk_cycles_per_us;
/*
@@ -617,22 +618,34 @@ static int ufs_qcom_cfg_timers(struct ufs_hba *hba, bool is_pre_scale_up)
if (host->hw_ver.major < 4 && !ufshcd_is_intr_aggr_allowed(hba))
return 0;
+ if (hba->use_pm_opp && freq != ULONG_MAX) {
+ clk_freq = ufs_qcom_opp_freq_to_clk_freq(hba, freq, "core_clk");
+ if (clk_freq)
+ goto cfg_timers;
+ }
+
list_for_each_entry(clki, &hba->clk_list_head, list) {
if (!strcmp(clki->name, "core_clk")) {
+ if (freq == ULONG_MAX) {
+ clk_freq = clki->max_freq;
+ break;
+ }
+
if (is_pre_scale_up)
- core_clk_rate = clki->max_freq;
+ clk_freq = clki->max_freq;
else
- core_clk_rate = clk_get_rate(clki->clk);
+ clk_freq = clk_get_rate(clki->clk);
break;
}
}
+cfg_timers:
/* If frequency is smaller than 1MHz, set to 1MHz */
- if (core_clk_rate < DEFAULT_CLK_RATE_HZ)
- core_clk_rate = DEFAULT_CLK_RATE_HZ;
+ if (clk_freq < DEFAULT_CLK_RATE_HZ)
+ clk_freq = DEFAULT_CLK_RATE_HZ;
- core_clk_cycles_per_us = core_clk_rate / USEC_PER_SEC;
+ core_clk_cycles_per_us = clk_freq / USEC_PER_SEC;
if (ufshcd_readl(hba, REG_UFS_SYS1CLK_1US) != core_clk_cycles_per_us) {
ufshcd_writel(hba, core_clk_cycles_per_us, REG_UFS_SYS1CLK_1US);
/*
@@ -652,7 +665,7 @@ static int ufs_qcom_link_startup_notify(struct ufs_hba *hba,
switch (status) {
case PRE_CHANGE:
- if (ufs_qcom_cfg_timers(hba, false)) {
+ if (ufs_qcom_cfg_timers(hba, false, ULONG_MAX)) {
dev_err(hba->dev, "%s: ufs_qcom_cfg_timers() failed\n",
__func__);
return -EINVAL;
@@ -930,17 +943,6 @@ static int ufs_qcom_pwr_change_notify(struct ufs_hba *hba,
break;
case POST_CHANGE:
- if (ufs_qcom_cfg_timers(hba, false)) {
- dev_err(hba->dev, "%s: ufs_qcom_cfg_timers() failed\n",
- __func__);
- /*
- * we return error code at the end of the routine,
- * but continue to configure UFS_PHY_TX_LANE_ENABLE
- * and bus voting as usual
- */
- ret = -EINVAL;
- }
-
/* cache the power mode parameters to use internally */
memcpy(&host->dev_req_params,
dev_req_params, sizeof(*dev_req_params));
@@ -1492,7 +1494,7 @@ static int ufs_qcom_clk_scale_up_pre_change(struct ufs_hba *hba, unsigned long f
{
int ret;
- ret = ufs_qcom_cfg_timers(hba, true);
+ ret = ufs_qcom_cfg_timers(hba, true, freq);
if (ret) {
dev_err(hba->dev, "%s ufs cfg timer failed\n", __func__);
return ret;
@@ -1529,6 +1531,13 @@ static int ufs_qcom_clk_scale_down_pre_change(struct ufs_hba *hba)
static int ufs_qcom_clk_scale_down_post_change(struct ufs_hba *hba, unsigned long freq)
{
+ int ret;
+
+ ret = ufs_qcom_cfg_timers(hba, false, freq);
+ if (ret) {
+ dev_err(hba->dev, "%s: ufs_qcom_cfg_timers() failed\n", __func__);
+ return ret;
+ }
/* set unipro core clock attributes and clear clock divider */
return ufs_qcom_set_core_clk_ctrl(hba, false, freq);
}
--
2.34.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v3 2/3] scsi: ufs: qcom: Map devfreq OPP freq to UniPro Core Clock freq
2025-05-09 7:50 ` [PATCH v3 2/3] scsi: ufs: qcom: Map devfreq OPP freq to UniPro Core Clock freq Ziqi Chen
@ 2025-05-12 8:57 ` Bean Huo
0 siblings, 0 replies; 9+ messages in thread
From: Bean Huo @ 2025-05-12 8:57 UTC (permalink / raw)
To: Ziqi Chen, quic_cang, bvanassche, mani, beanhuo, avri.altman,
junwoo80.lee, martin.petersen, quic_nguyenb, quic_nitirawa,
quic_rampraka, neil.armstrong, luca.weiss, konrad.dybcio,
peter.wang
Cc: linux-arm-msm, linux-scsi, Manivannan Sadhasivam,
James E.J. Bottomley, open list
On Fri, 2025-05-09 at 15:50 +0800, Ziqi Chen wrote:
> From: Can Guo <quic_cang@quicinc.com>
>
> On some platforms, the devfreq OPP freq may be different than the unipro
> core clock freq. Implement ufs_qcom_opp_freq_to_clk_freq() and use it to
> find the unipro core clk freq.
>
> Fixes: c02fe9e222d1 ("scsi: ufs: qcom: Implement the freq_to_gear_speed() vop")
> Signed-off-by: Can Guo <quic_cang@quicinc.com>
> Co-developed-by: Ziqi Chen <quic_ziqichen@quicinc.com>
> Signed-off-by: Ziqi Chen <quic_ziqichen@quicinc.com>
> Tested-by: Luca Weiss <luca.weiss@fairphone.com>
Looks good to me:
Reviewed-by: Bean Huo <beanhuo@micron.com>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 3/3] scsi: ufs: qcom: Call ufs_qcom_cfg_timers() in clock scaling path
2025-05-09 7:50 ` [PATCH v3 3/3] scsi: ufs: qcom: Call ufs_qcom_cfg_timers() in clock scaling path Ziqi Chen
@ 2025-05-12 8:58 ` Bean Huo
0 siblings, 0 replies; 9+ messages in thread
From: Bean Huo @ 2025-05-12 8:58 UTC (permalink / raw)
To: Ziqi Chen, quic_cang, bvanassche, mani, beanhuo, avri.altman,
junwoo80.lee, martin.petersen, quic_nguyenb, quic_nitirawa,
quic_rampraka, neil.armstrong, luca.weiss, konrad.dybcio,
peter.wang
Cc: linux-arm-msm, linux-scsi, Manivannan Sadhasivam,
James E.J. Bottomley, open list
On Fri, 2025-05-09 at 15:50 +0800, Ziqi Chen wrote:
> From: Can Guo <quic_cang@quicinc.com>
>
> ufs_qcom_cfg_timers() is clock freq dependent like ufs_qcom_set_core_clk_
> ctrl(), hence move ufs_qcom_cfg_timers() call to clock scaling path. In
> addition, do not assume the devfreq OPP freq is always the 'core_clock'
> freq although 'core_clock' is the first clock phandle in device tree, use
> ufs_qcom_opp_freq_to_clk_freq() to find the core clk freq.
>
> Signed-off-by: Can Guo <quic_cang@quicinc.com>
> Co-developed-by: Ziqi Chen <quic_ziqichen@quicinc.com>
> Signed-off-by: Ziqi Chen <quic_ziqichen@quicinc.com>
> Tested-by: Luca Weiss <luca.weiss@fairphone.com>
Reviewed-by: Bean Huo <beanhuo@micron.com>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 0/3] Bug fixes for UFS multi-frequency scaling on Qcom platform
2025-05-09 7:50 [PATCH v3 0/3] Bug fixes for UFS multi-frequency scaling on Qcom platform Ziqi Chen
` (2 preceding siblings ...)
2025-05-09 7:50 ` [PATCH v3 3/3] scsi: ufs: qcom: Call ufs_qcom_cfg_timers() in clock scaling path Ziqi Chen
@ 2025-05-15 13:19 ` Loic Minier
2025-05-21 1:58 ` Martin K. Petersen
4 siblings, 0 replies; 9+ messages in thread
From: Loic Minier @ 2025-05-15 13:19 UTC (permalink / raw)
To: Ziqi Chen
Cc: quic_cang, bvanassche, mani, beanhuo, avri.altman, junwoo80.lee,
martin.petersen, quic_nguyenb, quic_nitirawa, quic_rampraka,
neil.armstrong, luca.weiss, konrad.dybcio, peter.wang,
linux-arm-msm, linux-scsi
Hi,
For all 3 patches of this v3:
Tested-By: Loïc Minier <loic.minier@oss.qualcomm.com>
On QCS6490 (RB3 Gen2) on top of 6.15-rc6 with defconfig.
Thanks!
- Loïc
On Fri, May 9, 2025 at 9:55 AM Ziqi Chen <quic_ziqichen@quicinc.com> wrote:
>
> This series fixes a few corner cases introduced by multi-frequency scaling feature
> on some old Qcom platforms design.
>
> 1. On some platforms, the frequency tables for unipro clock and the core clock are different,
> which has led to errors when handling the unipro clock.
>
> 2. On some platforms, the maximum gear supported by the host may exceed the maximum gear
> supported by connected UFS device. Therefore, this should be taken into account when
> find mapped gear for frequency.
>
> This series has been tested on below platforms -
> sm8550 mtp + UFS3.1
> SM8650 MTP + UFS3.1
> QCS6490 BR3GEN2 + UFS2.2
>
> For change "scsi: ufs: qcom: Check gear against max gear in vop freq_to_gear()"
> Reported-by: Neil Armstrong <neil.armstrong@linaro.org>
> Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on RB3GEN2
>
> For change "scsi: ufs: qcom: Map devfreq OPP freq to UniPro Core Clock freq"
> "scsi: ufs: qcom: Call ufs_qcom_cfg_timers() in clock scaling path"
>
> Reported-by: Luca Weiss <luca.weiss@fairphone.com>
> Closes: https://lore.kernel.org/linux-arm-msm/D9FZ9U3AEXW4.1I12FX3YQ3JPW@fairphone.com/
> Tested-by: Luca Weiss <luca.weiss@fairphone.com> # sm7225-fairphone-fp4
>
>
> v1 - > v2:
> Change "scsi: ufs: qcom: Check gear against max gear in vop freq_to_gear()":
> 1. Instead of return 'gear', return '0' directly if didn't find mapped gear
> 2. Derectly return min_t(gear,max_gear) instead assign to 'gear' then return it.
>
> v2 - > v3:
> Change "scsi: ufs: qcom: Check gear against max gear in vop freq_to_gear()":
> Replace hard code '0' with enum 'UFS_HS_DONT_CHANGE'.
>
> Change "scsi: ufs: qcom: Map devfreq OPP freq to UniPro Core Clock freq"
> 1. Skip calling ufs_qcom_opp_freq_to_clk_freq() if freq is ULONG_MAX to avoid useless error prints.
> 2. Correct indentation size to follow Linux kernel coding style.
>
> Change 'scsi: ufs: qcom: Call ufs_qcom_cfg_timers() in clock scaling path':
> Skip calling ufs_qcom_opp_freq_to_clk_freq() if freq is ULONG_MAX to avoid useless prints.
>
>
> Can Guo (2):
> scsi: ufs: qcom: Map devfreq OPP freq to UniPro Core Clock freq
> scsi: ufs: qcom: Call ufs_qcom_cfg_timers() in clock scaling path
>
> Ziqi Chen (1):
> scsi: ufs: qcom: Check gear against max gear in vop freq_to_gear()
>
> drivers/ufs/host/ufs-qcom.c | 136 +++++++++++++++++++++++++++---------
> 1 file changed, 103 insertions(+), 33 deletions(-)
>
> --
> 2.34.1
>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 0/3] Bug fixes for UFS multi-frequency scaling on Qcom platform
2025-05-09 7:50 [PATCH v3 0/3] Bug fixes for UFS multi-frequency scaling on Qcom platform Ziqi Chen
` (3 preceding siblings ...)
2025-05-15 13:19 ` [PATCH v3 0/3] Bug fixes for UFS multi-frequency scaling on Qcom platform Loic Minier
@ 2025-05-21 1:58 ` Martin K. Petersen
2025-05-21 8:23 ` Ziqi Chen
4 siblings, 1 reply; 9+ messages in thread
From: Martin K. Petersen @ 2025-05-21 1:58 UTC (permalink / raw)
To: Ziqi Chen
Cc: quic_cang, bvanassche, mani, beanhuo, avri.altman, junwoo80.lee,
martin.petersen, quic_nguyenb, quic_nitirawa, quic_rampraka,
neil.armstrong, luca.weiss, konrad.dybcio, peter.wang,
linux-arm-msm, linux-scsi
Ziqi,
> This series fixes a few corner cases introduced by multi-frequency
> scaling feature on some old Qcom platforms design.
Which kernel is this series against? It does not apply to
6.16/scsi-queue.
> For change "scsi: ufs: qcom: Check gear against max gear in vop freq_to_gear()"
> Reported-by: Neil Armstrong <neil.armstrong@linaro.org>
> Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on RB3GEN2
These tags should be applied to the relevant patch.
> For change "scsi: ufs: qcom: Map devfreq OPP freq to UniPro Core Clock freq"
> "scsi: ufs: qcom: Call ufs_qcom_cfg_timers() in clock scaling path"
>
> Reported-by: Luca Weiss <luca.weiss@fairphone.com>
> Closes: https://lore.kernel.org/linux-arm-msm/D9FZ9U3AEXW4.1I12FX3YQ3JPW@fairphone.com/
> Tested-by: Luca Weiss <luca.weiss@fairphone.com> # sm7225-fairphone-fp4
Same here.
Thanks!
--
Martin K. Petersen
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 0/3] Bug fixes for UFS multi-frequency scaling on Qcom platform
2025-05-21 1:58 ` Martin K. Petersen
@ 2025-05-21 8:23 ` Ziqi Chen
0 siblings, 0 replies; 9+ messages in thread
From: Ziqi Chen @ 2025-05-21 8:23 UTC (permalink / raw)
To: Martin K. Petersen
Cc: quic_cang, bvanassche, mani, beanhuo, avri.altman, junwoo80.lee,
quic_nguyenb, quic_nitirawa, quic_rampraka, neil.armstrong,
luca.weiss, konrad.dybcio, peter.wang, linux-arm-msm, linux-scsi
Hi Martin,
Thanks , this series need to be applied since 6.15/scsi-queue as the
series UFS multi-frequency scaling was applied to 6.15/scsi-queue.
I will updated a new version to rebase it to 6.15/scsi-queue.
On 5/21/2025 9:58 AM, Martin K. Petersen wrote:
>
> Ziqi,
>
>> This series fixes a few corner cases introduced by multi-frequency
>> scaling feature on some old Qcom platforms design.
>
> Which kernel is this series against? It does not apply to
> 6.16/scsi-queue.
>
>> For change "scsi: ufs: qcom: Check gear against max gear in vop freq_to_gear()"
>> Reported-by: Neil Armstrong <neil.armstrong@linaro.org>
>> Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on RB3GEN2
>
> These tags should be applied to the relevant patch.
>
>> For change "scsi: ufs: qcom: Map devfreq OPP freq to UniPro Core Clock freq"
>> "scsi: ufs: qcom: Call ufs_qcom_cfg_timers() in clock scaling path"
>>
>> Reported-by: Luca Weiss <luca.weiss@fairphone.com>
>> Closes: https://lore.kernel.org/linux-arm-msm/D9FZ9U3AEXW4.1I12FX3YQ3JPW@fairphone.com/
>> Tested-by: Luca Weiss <luca.weiss@fairphone.com> # sm7225-fairphone-fp4
>
> Same here.
>
> Thanks!
>
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2025-05-21 8:24 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-09 7:50 [PATCH v3 0/3] Bug fixes for UFS multi-frequency scaling on Qcom platform Ziqi Chen
2025-05-09 7:50 ` [PATCH v3 1/3] scsi: ufs: qcom: Check gear against max gear in vop freq_to_gear() Ziqi Chen
2025-05-09 7:50 ` [PATCH v3 2/3] scsi: ufs: qcom: Map devfreq OPP freq to UniPro Core Clock freq Ziqi Chen
2025-05-12 8:57 ` Bean Huo
2025-05-09 7:50 ` [PATCH v3 3/3] scsi: ufs: qcom: Call ufs_qcom_cfg_timers() in clock scaling path Ziqi Chen
2025-05-12 8:58 ` Bean Huo
2025-05-15 13:19 ` [PATCH v3 0/3] Bug fixes for UFS multi-frequency scaling on Qcom platform Loic Minier
2025-05-21 1:58 ` Martin K. Petersen
2025-05-21 8:23 ` Ziqi Chen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox