* [PATCH V2 1/4] ufs: dt-bindings: Document gear and rate limit properties
2025-08-21 10:16 [PATCH V2 0/4] Add DT-based gear and rate limiting support Ram Kumar Dwivedi
@ 2025-08-21 10:16 ` Ram Kumar Dwivedi
2025-08-24 9:29 ` Krzysztof Kozlowski
2025-08-21 10:16 ` [PATCH V2 2/4] ufs: ufs-qcom: Remove redundant re-assignment to hs_rate Ram Kumar Dwivedi
` (2 subsequent siblings)
3 siblings, 1 reply; 7+ messages in thread
From: Ram Kumar Dwivedi @ 2025-08-21 10:16 UTC (permalink / raw)
To: mani, alim.akhtar, avri.altman, bvanassche, robh, krzk+dt,
conor+dt, andersson, konradybcio, agross, James.Bottomley,
martin.petersen
Cc: linux-arm-msm, linux-scsi, devicetree, linux-kernel
Add optional "limit-hs-gear" and "limit-rate" properties to the
UFS controller common binding. These properties allow limiting
the maximum HS gear and rate.
This is useful in cases where the customer board may have signal
integrity, clock configuration or layout issues that prevent reliable
operation at higher gears. Such limitations are especially critical in
those platforms, where stability is prioritized over peak performance.
Signed-off-by: Ram Kumar Dwivedi <quic_rdwivedi@quicinc.com>
---
.../devicetree/bindings/ufs/ufs-common.yaml | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/Documentation/devicetree/bindings/ufs/ufs-common.yaml b/Documentation/devicetree/bindings/ufs/ufs-common.yaml
index 31fe7f30ff5b..baa978389ec7 100644
--- a/Documentation/devicetree/bindings/ufs/ufs-common.yaml
+++ b/Documentation/devicetree/bindings/ufs/ufs-common.yaml
@@ -89,6 +89,22 @@ properties:
msi-parent: true
+ limit-hs-gear:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ minimum: 1
+ maximum: 5
+ description:
+ Restricts the maximum HS gear used in both TX and RX directions,
+ typically for hardware or power constraints in automotive use cases.
+
+ limit-rate:
+ $ref: /schemas/types.yaml#/definitions/uint32
+ enum: [1, 2]
+ description:
+ Restricts the UFS controller to Rate A (1) or Rate B (2) for both
+ TX and RX directions, often required in automotive environments due
+ to hardware limitations.
+
dependencies:
freq-table-hz: [ clocks ]
operating-points-v2: [ clocks, clock-names ]
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH V2 1/4] ufs: dt-bindings: Document gear and rate limit properties
2025-08-21 10:16 ` [PATCH V2 1/4] ufs: dt-bindings: Document gear and rate limit properties Ram Kumar Dwivedi
@ 2025-08-24 9:29 ` Krzysztof Kozlowski
2025-08-26 14:53 ` Ram Kumar Dwivedi
0 siblings, 1 reply; 7+ messages in thread
From: Krzysztof Kozlowski @ 2025-08-24 9:29 UTC (permalink / raw)
To: Ram Kumar Dwivedi
Cc: mani, alim.akhtar, avri.altman, bvanassche, robh, krzk+dt,
conor+dt, andersson, konradybcio, agross, James.Bottomley,
martin.petersen, linux-arm-msm, linux-scsi, devicetree,
linux-kernel
On Thu, Aug 21, 2025 at 03:46:06PM +0530, Ram Kumar Dwivedi wrote:
> + limit-hs-gear:
> + $ref: /schemas/types.yaml#/definitions/uint32
> + minimum: 1
> + maximum: 5
default:
> + description:
> + Restricts the maximum HS gear used in both TX and RX directions,
> + typically for hardware or power constraints in automotive use cases.
> +
> + limit-rate:
> + $ref: /schemas/types.yaml#/definitions/uint32
> + enum: [1, 2]
default:
> + description:
> + Restricts the UFS controller to Rate A (1) or Rate B (2) for both
Is 1 and 2 known in UFS spec? Feels like you wanted here string for 'a'
and 'b'.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH V2 1/4] ufs: dt-bindings: Document gear and rate limit properties
2025-08-24 9:29 ` Krzysztof Kozlowski
@ 2025-08-26 14:53 ` Ram Kumar Dwivedi
0 siblings, 0 replies; 7+ messages in thread
From: Ram Kumar Dwivedi @ 2025-08-26 14:53 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: mani, alim.akhtar, avri.altman, bvanassche, robh, krzk+dt,
conor+dt, andersson, konradybcio, agross, James.Bottomley,
martin.petersen, linux-arm-msm, linux-scsi, devicetree,
linux-kernel
On 24-Aug-25 2:59 PM, Krzysztof Kozlowski wrote:
> On Thu, Aug 21, 2025 at 03:46:06PM +0530, Ram Kumar Dwivedi wrote:
>> + limit-hs-gear:
>> + $ref: /schemas/types.yaml#/definitions/uint32
>> + minimum: 1
>> + maximum: 5
>
> default:
Hi Krzysztof,
I will add it in next patchset
Thanks,
Ram.
>
>> + description:
>> + Restricts the maximum HS gear used in both TX and RX directions,
>> + typically for hardware or power constraints in automotive use cases.
>> +
>> + limit-rate:
>> + $ref: /schemas/types.yaml#/definitions/uint32
>> + enum: [1, 2]
>
> default:
I will add it in next patchset
Thanks,
Ram.>
>> + description:
>> + Restricts the UFS controller to Rate A (1) or Rate B (2) for both
>
> Is 1 and 2 known in UFS spec? Feels like you wanted here string for 'a'
> and 'b'.
Yes, 1 and 2 is mentioned in MIPI Unipro(UFS Interconnect layer) spec.
Thanks,
Ram.
>
> Best regards,
> Krzysztof
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH V2 2/4] ufs: ufs-qcom: Remove redundant re-assignment to hs_rate
2025-08-21 10:16 [PATCH V2 0/4] Add DT-based gear and rate limiting support Ram Kumar Dwivedi
2025-08-21 10:16 ` [PATCH V2 1/4] ufs: dt-bindings: Document gear and rate limit properties Ram Kumar Dwivedi
@ 2025-08-21 10:16 ` Ram Kumar Dwivedi
2025-08-21 10:16 ` [PATCH V2 3/4] ufs: pltfrm: Allow limiting HS gear and rate via DT Ram Kumar Dwivedi
2025-08-21 10:16 ` [PATCH V2 4/4] ufs: ufs-qcom: Add support for limiting HS gear and rate Ram Kumar Dwivedi
3 siblings, 0 replies; 7+ messages in thread
From: Ram Kumar Dwivedi @ 2025-08-21 10:16 UTC (permalink / raw)
To: mani, alim.akhtar, avri.altman, bvanassche, robh, krzk+dt,
conor+dt, andersson, konradybcio, agross, James.Bottomley,
martin.petersen
Cc: linux-arm-msm, linux-scsi, devicetree, linux-kernel
Remove the redundant else block that assigns PA_HS_MODE_B to hs_rate,
as it is already assigned in ufshcd_init_host_params(). This avoids
unnecessary reassignment and prevents overwriting hs_rate when it is
explicitly set to a different value.
Signed-off-by: Ram Kumar Dwivedi <quic_rdwivedi@quicinc.com>
---
drivers/ufs/host/ufs-qcom.c | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
index 9574fdc2bb0f..1a93351fb70e 100644
--- a/drivers/ufs/host/ufs-qcom.c
+++ b/drivers/ufs/host/ufs-qcom.c
@@ -494,12 +494,8 @@ static int ufs_qcom_power_up_sequence(struct ufs_hba *hba)
* If the HS-G5 PHY gear is used, update host_params->hs_rate to Rate-A,
* so that the subsequent power mode change shall stick to Rate-A.
*/
- if (host->hw_ver.major == 0x5) {
- if (host->phy_gear == UFS_HS_G5)
- host_params->hs_rate = PA_HS_MODE_A;
- else
- host_params->hs_rate = PA_HS_MODE_B;
- }
+ if (host->hw_ver.major == 0x5 && host->phy_gear == UFS_HS_G5)
+ host_params->hs_rate = PA_HS_MODE_A;
mode = host_params->hs_rate == PA_HS_MODE_B ? PHY_MODE_UFS_HS_B : PHY_MODE_UFS_HS_A;
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH V2 3/4] ufs: pltfrm: Allow limiting HS gear and rate via DT
2025-08-21 10:16 [PATCH V2 0/4] Add DT-based gear and rate limiting support Ram Kumar Dwivedi
2025-08-21 10:16 ` [PATCH V2 1/4] ufs: dt-bindings: Document gear and rate limit properties Ram Kumar Dwivedi
2025-08-21 10:16 ` [PATCH V2 2/4] ufs: ufs-qcom: Remove redundant re-assignment to hs_rate Ram Kumar Dwivedi
@ 2025-08-21 10:16 ` Ram Kumar Dwivedi
2025-08-21 10:16 ` [PATCH V2 4/4] ufs: ufs-qcom: Add support for limiting HS gear and rate Ram Kumar Dwivedi
3 siblings, 0 replies; 7+ messages in thread
From: Ram Kumar Dwivedi @ 2025-08-21 10:16 UTC (permalink / raw)
To: mani, alim.akhtar, avri.altman, bvanassche, robh, krzk+dt,
conor+dt, andersson, konradybcio, agross, James.Bottomley,
martin.petersen
Cc: linux-arm-msm, linux-scsi, devicetree, linux-kernel
Add support for parsing 'limit-hs-gear' and 'limit-rate' device tree
properties to restrict high-speed gear and rate during initialization.
This is useful in cases where the customer board may have signal
integrity, clock configuration or layout issues that prevent reliable
operation at higher gears. Such limitations are especially critical in
those platforms, where stability is prioritized over peak performance.
Signed-off-by: Ram Kumar Dwivedi <quic_rdwivedi@quicinc.com>
---
drivers/ufs/host/ufshcd-pltfrm.c | 29 +++++++++++++++++++++++++++++
drivers/ufs/host/ufshcd-pltfrm.h | 1 +
2 files changed, 30 insertions(+)
diff --git a/drivers/ufs/host/ufshcd-pltfrm.c b/drivers/ufs/host/ufshcd-pltfrm.c
index ffe5d1d2b215..d9be6c86f044 100644
--- a/drivers/ufs/host/ufshcd-pltfrm.c
+++ b/drivers/ufs/host/ufshcd-pltfrm.c
@@ -430,6 +430,35 @@ int ufshcd_negotiate_pwr_params(const struct ufs_host_params *host_params,
}
EXPORT_SYMBOL_GPL(ufshcd_negotiate_pwr_params);
+/**
+ * ufshcd_parse_limits - Parse DT-based gear and rate limits for UFS
+ * @hba: Pointer to UFS host bus adapter instance
+ * @host_params: Pointer to UFS host parameters structure to be updated
+ *
+ * This function reads optional device tree properties to apply
+ * platform-specific constraints.
+ *
+ * "limit-hs-gear": Specifies the max HS gear.
+ * "limit-rate": Specifies the max High-Speed rate.
+ */
+void ufshcd_parse_limits(struct ufs_hba *hba, struct ufs_host_params *host_params)
+{
+ struct device_node *np = hba->dev->of_node;
+ u32 hs_gear, hs_rate;
+
+ if (!np)
+ return;
+
+ if (!of_property_read_u32(np, "limit-hs-gear", &hs_gear)) {
+ host_params->hs_tx_gear = hs_gear;
+ host_params->hs_rx_gear = hs_gear;
+ }
+
+ if (!of_property_read_u32(np, "limit-rate", &hs_rate))
+ host_params->hs_rate = hs_rate;
+}
+EXPORT_SYMBOL_GPL(ufshcd_parse_limits);
+
void ufshcd_init_host_params(struct ufs_host_params *host_params)
{
*host_params = (struct ufs_host_params){
diff --git a/drivers/ufs/host/ufshcd-pltfrm.h b/drivers/ufs/host/ufshcd-pltfrm.h
index 3017f8e8f93c..1617f2541273 100644
--- a/drivers/ufs/host/ufshcd-pltfrm.h
+++ b/drivers/ufs/host/ufshcd-pltfrm.h
@@ -29,6 +29,7 @@ int ufshcd_negotiate_pwr_params(const struct ufs_host_params *host_params,
const struct ufs_pa_layer_attr *dev_max,
struct ufs_pa_layer_attr *agreed_pwr);
void ufshcd_init_host_params(struct ufs_host_params *host_params);
+void ufshcd_parse_limits(struct ufs_hba *hba, struct ufs_host_params *host_params);
int ufshcd_pltfrm_init(struct platform_device *pdev,
const struct ufs_hba_variant_ops *vops);
void ufshcd_pltfrm_remove(struct platform_device *pdev);
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH V2 4/4] ufs: ufs-qcom: Add support for limiting HS gear and rate
2025-08-21 10:16 [PATCH V2 0/4] Add DT-based gear and rate limiting support Ram Kumar Dwivedi
` (2 preceding siblings ...)
2025-08-21 10:16 ` [PATCH V2 3/4] ufs: pltfrm: Allow limiting HS gear and rate via DT Ram Kumar Dwivedi
@ 2025-08-21 10:16 ` Ram Kumar Dwivedi
3 siblings, 0 replies; 7+ messages in thread
From: Ram Kumar Dwivedi @ 2025-08-21 10:16 UTC (permalink / raw)
To: mani, alim.akhtar, avri.altman, bvanassche, robh, krzk+dt,
conor+dt, andersson, konradybcio, agross, James.Bottomley,
martin.petersen
Cc: linux-arm-msm, linux-scsi, devicetree, linux-kernel
Add support to limit Tx/Rx gear and rate during UFS initialization
based on DT property.
Also update the phy_gear to ensure PHY calibrations align with
the required gear and rate.
Signed-off-by: Ram Kumar Dwivedi <quic_rdwivedi@quicinc.com>
---
drivers/ufs/host/ufs-qcom.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/drivers/ufs/host/ufs-qcom.c b/drivers/ufs/host/ufs-qcom.c
index 1a93351fb70e..53c64d5fb95d 100644
--- a/drivers/ufs/host/ufs-qcom.c
+++ b/drivers/ufs/host/ufs-qcom.c
@@ -1092,6 +1092,18 @@ static void ufs_qcom_set_phy_gear(struct ufs_qcom_host *host)
}
}
+static void ufs_qcom_parse_limits(struct ufs_hba *hba)
+{
+ struct ufs_qcom_host *host = ufshcd_get_variant(hba);
+ struct ufs_host_params *host_params = &host->host_params;
+ u32 hs_gear_old = host_params->hs_tx_gear;
+
+ ufshcd_parse_limits(hba, host_params);
+ if (host_params->hs_tx_gear != hs_gear_old) {
+ host->phy_gear = host_params->hs_tx_gear;
+ }
+}
+
static void ufs_qcom_set_host_params(struct ufs_hba *hba)
{
struct ufs_qcom_host *host = ufshcd_get_variant(hba);
@@ -1333,6 +1345,7 @@ static int ufs_qcom_init(struct ufs_hba *hba)
ufs_qcom_advertise_quirks(hba);
ufs_qcom_set_host_params(hba);
ufs_qcom_set_phy_gear(host);
+ ufs_qcom_parse_limits(hba);
err = ufs_qcom_ice_init(host);
if (err)
--
2.50.1
^ permalink raw reply related [flat|nested] 7+ messages in thread