From: Bean Huo <beanhuo@iokpp.de>
To: Can Guo <can.guo@oss.qualcomm.com>,
avri.altman@wdc.com, bvanassche@acm.org, beanhuo@micron.com,
peter.wang@mediatek.com, martin.petersen@oracle.com,
mani@kernel.org
Cc: linux-scsi@vger.kernel.org, Alim Akhtar <alim.akhtar@samsung.com>,
"James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>,
"Bao D. Nguyen" <quic_nguyenb@quicinc.com>,
Adrian Hunter <adrian.hunter@intel.com>,
open list <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH v4 04/12] scsi: ufs: core: Add support for TX Equalization
Date: Sun, 22 Mar 2026 10:48:38 +0100 [thread overview]
Message-ID: <69a998190901b3ec63899fd89de087db9f99382a.camel@iokpp.de> (raw)
In-Reply-To: <20260321031021.1722459-5-can.guo@oss.qualcomm.com>
> Can,
>
>
> + * to ensure both host and device use adequate TX adapt length.
> + *
> + * Returns 0 on success, negative error code otherwise
> + */
> +static int ufshcd_setup_tx_eqtr_adapt_length(struct ufs_hba *hba,
> + struct ufshcd_tx_eq_params
> *params,
> + u32 gear)
> +{
> + u32 adapt_eqtr;
> + int ret;
> +
> + if (gear == UFS_HS_G4 || gear == UFS_HS_G5) {
> + u64 t_adapt, t_adapt_local, t_adapt_peer;
> + u32 adapt_cap_local, adapt_cap_peer, adapt_length;
> +
> + ret = ufshcd_dme_get(hba,
> UIC_ARG_MIB_SEL(rx_adapt_initial_cap[gear - 1],
> + UIC_ARG_MPHY_RX_GEN_SEL_INDEX(0)),
> + &adapt_cap_local);
> + if (ret)
> + return ret;
> +
> + if (adapt_cap_local > ADAPT_LENGTH_MAX) {
> + dev_err(hba->dev, "local RX_HS_G%u_ADAPT_INITIAL_CAP
> (0x%x) exceeds MAX\n",
> + gear, adapt_cap_local);
> + return -EINVAL;
> + }
> +
> + ret = ufshcd_dme_get(hba,
> UIC_ARG_MIB(pa_peer_rx_adapt_initial[gear - 1]),
> + &adapt_cap_peer);
> + if (ret)
> + return ret;
> +
> + if (adapt_cap_peer > ADAPT_LENGTH_MAX) {
> + dev_err(hba->dev, "local RX_HS_G%u_ADAPT_INITIAL_CAP
here should pear: local --> peer
> (0x%x) exceeds MAX\n",
> + gear, adapt_cap_peer);
> + return -EINVAL;
> + }
> +
> + t_adapt_local = adapt_cap_to_t_adapt(adapt_cap_local);
> + t_adapt_peer = adapt_cap_to_t_adapt(adapt_cap_peer);
> + t_adapt = max(t_adapt_local, t_adapt_peer);
> +
> + dev_dbg(hba->dev, "local RX_HS_G%u_ADAPT_INITIAL_CAP =
> 0x%x\n",
> + gear, adapt_cap_local);
> + dev_dbg(hba->dev, "peer RX_HS_G%u_ADAPT_INITIAL_CAP = 0x%x\n",
> + gear, adapt_cap_peer);
> + dev_dbg(hba->dev, "t_adapt_local = %llu UI, t_adapt_peer =
> %llu UI\n",
> + t_adapt_local, t_adapt_peer);
> + dev_dbg(hba->dev, "TAdapt %llu UI selected for TX EQTR\n",
> + t_adapt);
>
...
> +
> +/**
> + * ufshcd_config_tx_eq_settings - Configure TX Equalization settings
> + * @hba: per adapter instance
> + * @pwr_mode: target power mode containing gear and rate information
> + *
> + * This function finds and sets the TX Equalization settings for the given
> + * target power mode.
> + *
> + * Returns 0 on success, error code otherwise
> + */
> +int ufshcd_config_tx_eq_settings(struct ufs_hba *hba,
> + struct ufs_pa_layer_attr *pwr_mode)
> +{
> + struct ufshcd_tx_eq_params *params;
> + u32 gear, rate;
> +
> + if (!ufshcd_is_tx_eq_supported(hba) || !use_adaptive_txeq)
> + return 0;
> +
> + if (!hba->max_pwr_info.is_valid) {
> + dev_err(hba->dev, "Max power info is invalid\n");
> + return -EINVAL;
> + }
> +
> + if (!pwr_mode) {
> + dev_err(hba->dev, "Target power mode is NULL\n");
> + return -EINVAL;
> + }
> +
> + gear = pwr_mode->gear_tx;
> + rate = pwr_mode->hs_rate;
> + params = &hba->tx_eq_params[gear - 1];
> +
> + if (gear < UFS_HS_G1 || gear > UFS_HS_GEAR_MAX) {
> + dev_err(hba->dev, "Invalid HS-Gear (%u) for TX
> Equalization\n",
> + gear);
> + return -EINVAL;
> + } else if (gear < adaptive_txeq_gear) {
> + return 0;
> + }
> +
> + if (rate != PA_HS_MODE_A && rate != PA_HS_MODE_B) {
> + dev_err(hba->dev, "Invalid HS-Rate (%u) for TX
> Equalization\n",
> + rate);
> + return -EINVAL;
> + }
> +
> + /* TX EQTR is supported for HS-G4 and higher Gears */
> + if (gear < UFS_HS_G4)
> + goto apply_tx_eq_settings;
> +
> + if (!params->is_valid) {
> + int ret;
> +
> + ret = ufshcd_tx_eqtr(hba, params, pwr_mode);
> + if (ret) {
> + dev_err(hba->dev, "Failed to train TX Equalization for
> HS-G%u, Rate-%s: %d\n",
> + gear, ufs_hs_rate_to_str(rate), ret);
> + return ret;
> + }
> +
> + /* Mark TX Equalization settings as valid */
> + params->is_valid = true;
> + params->is_applied = false;
after eqtr completes here, the trained settings are only kept in memory. UFS 5.0
introduced qTxEQGnSettings and wTxEQGnSettingsExt as persistent device
attributes for storing optimal TX EQ results across power cycles. should we
write back to these attributes after training, and read them on next boot to
skip EQTR if valid settings already exist? That would save the training overhead
on every boot?
Kind regards,
Bean
next prev parent reply other threads:[~2026-03-22 9:49 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-21 3:10 [PATCH v4 00/12] scsi: ufs: Add TX Equalization support for UFS 5.0 Can Guo
2026-03-21 3:10 ` [PATCH v4 01/12] scsi: ufs: core: Introduce a new ufshcd vops negotiate_pwr_mode() Can Guo
2026-03-23 9:10 ` Bean Huo
2026-03-21 3:10 ` [PATCH v4 02/12] scsi: ufs: core: Pass force_pmc to ufshcd_config_pwr_mode() as a parameter Can Guo
2026-03-23 9:11 ` Bean Huo
2026-03-21 3:10 ` [PATCH v4 03/12] scsi: ufs: core: Add UFS_HS_G6 and UFS_HS_GEAR_MAX to enum ufs_hs_gear_tag Can Guo
2026-03-23 9:11 ` Bean Huo
2026-03-21 3:10 ` [PATCH v4 04/12] scsi: ufs: core: Add support for TX Equalization Can Guo
2026-03-22 9:48 ` Bean Huo [this message]
2026-03-22 14:26 ` Bean Huo
2026-03-23 6:05 ` Can Guo
2026-03-23 9:15 ` Bean Huo
2026-03-24 7:46 ` Peter Wang (王信友)
2026-03-24 10:09 ` Can Guo
2026-03-24 11:54 ` Peter Wang (王信友)
2026-03-24 12:32 ` Can Guo
2026-03-21 3:10 ` [PATCH v4 05/12] scsi: ufs: core: Add debugfs entries for TX Equalization params Can Guo
2026-03-23 9:16 ` Bean Huo
2026-03-21 3:10 ` [PATCH v4 06/12] scsi: ufs: core: Add helpers to pause and resume command processing Can Guo
2026-03-23 9:17 ` Bean Huo
2026-03-21 3:10 ` [PATCH v4 07/12] scsi: ufs: core: Add support to retrain TX Equalization via debugfs Can Guo
2026-03-22 13:36 ` Bean Huo
2026-03-23 6:13 ` Can Guo
2026-03-23 9:21 ` Bean Huo
2026-03-21 3:10 ` [PATCH v4 08/12] scsi: ufs: ufs-qcom: Fixup PAM-4 TX L0_L1_L2_L3 adaptation pattern length Can Guo
2026-03-23 9:22 ` Bean Huo
2026-03-21 3:10 ` [PATCH v4 09/12] scsi: ufs: ufs-qcom: Implement vops tx_eqtr_notify() Can Guo
2026-03-23 9:23 ` Bean Huo
2026-03-21 3:10 ` [PATCH v4 10/12] scsi: ufs: ufs-qcom: Implement vops get_rx_fom() Can Guo
2026-03-23 9:24 ` Bean Huo
2026-03-21 3:10 ` [PATCH v4 11/12] scsi: ufs: ufs-qcom: Implement vops apply_tx_eqtr_settings() Can Guo
2026-03-23 9:24 ` Bean Huo
2026-03-21 3:10 ` [PATCH v4 12/12] scsi: ufs: ufs-qcom: Enable TX Equalization Can Guo
2026-03-23 9:25 ` Bean Huo
2026-03-23 16:50 ` [PATCH v4 00/12] scsi: ufs: Add TX Equalization support for UFS 5.0 Bart Van Assche
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=69a998190901b3ec63899fd89de087db9f99382a.camel@iokpp.de \
--to=beanhuo@iokpp.de \
--cc=James.Bottomley@HansenPartnership.com \
--cc=adrian.hunter@intel.com \
--cc=alim.akhtar@samsung.com \
--cc=avri.altman@wdc.com \
--cc=beanhuo@micron.com \
--cc=bvanassche@acm.org \
--cc=can.guo@oss.qualcomm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=mani@kernel.org \
--cc=martin.petersen@oracle.com \
--cc=peter.wang@mediatek.com \
--cc=quic_nguyenb@quicinc.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox