]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
Merge patch series "scsi: ufs: Add TX Equalization support for UFS 5.0"
authorMartin K. Petersen <martin.petersen@oracle.com>
Fri, 27 Mar 2026 21:21:28 +0000 (17:21 -0400)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 27 Mar 2026 21:21:28 +0000 (17:21 -0400)
Can Guo <can.guo@oss.qualcomm.com> says:

Hi,

The UFS v5.0 and UFSHCI v5.0 standards have published, introducing support
for HS-G6 (46.6 Gbps per lane) through the new UniPro V3.0 interconnect
layer and M-PHY V6.0 physical layer specifications. To achieve reliable
operation at these higher speeds, UniPro V3.0 introduces TX Equalization
and Pre-Coding mechanisms that are essential for signal integrity.

This patch series implements TX Equalization support in the UFS core
driver as specified in UFSHCI v5.0, along with the necessary vendor
operations and a reference implementation for Qualcomm UFS host
controllers.

Background
==========

TX Equalization is a signal conditioning technique that compensates for
channel impairments at high data rates (HS-G4 through HS-G6). It works
by adjusting two key parameters:

- PreShoot: Pre-emphasis applied before the main signal transition
- DeEmphasis: De-emphasis applied after the main signal transition

UniPro V3.0 defines TX Equalization Training (EQTR) procedure to
automatically discover optimal TX Equalization settings. The EQTR
procedure:

1. Starts from the most reliable link state (HS-G1)
2. Iterates through all possible PreShoot and DeEmphasis combinations
3. Evaluates signal quality using Figure of Merit (FOM) measurements
4. Selects the best settings for both host and device TX lanes

For HS-G6, Pre-Coding is also introduced to further improve signal
quality. Pre-Coding must be enabled on both transmitter and receiver
when the RX_FOM indicates it is required.

Implementation Overview
=======================

The implementation follows the UFSHCI v5.0 specification and consists of:

Core Infrastructure (Patches 1-6):
- New vops callback negotiate_pwr_mode() to allow vendors to negotiate
  power mode parameters before applying TX Equalization settings
- Support for HS-G6 gear enumeration
- Complete TX EQTR procedure implementation in ufs-txeq.c
- Debugfs interface for TX Equalization parameter inspection and manual
  retraining
- Module parameters for adaptive TX Equalization control

Qualcomm Implementation (Patches 7-11):
- PHY-specific configurations for TX EQTR procedure
- Vendor-specific FOM measurement support
- TX Equalization settings application
- Enable TX Equalization for HW version 0x7 and onwards

The implementation is designed to be vendor-agnostic, with platform-
specific details handled through the vops callbacks. Other vendors can
add support by implementing the three new vops:

- tx_eqtr_notify(): Called before/after TX EQTR for vendor setup
- apply_tx_eqtr_settings(): Apply vendor-specific PHY configurations
- get_rx_fom(): Retrieve vendor-specific FOM measurements if needed

Module Parameters
=================

The implementation provides several module parameters for flexibility:

- use_adaptive_txeq: Enable/disable adaptive TX Equalization (default: false)
- adaptive_txeq_gear: Minimum gear for adaptive TX EQ (default: HS-G6)
- use_txeq_presets: Use only the 8 standaird presets (default: false)
- txeq_presets_selected[]: Select specific presets for EQTR

Testing
=======

This patch series has been tested on Qualcomm platforms with UFS 5.0
devices, validating:

- Successful TX EQTR completion for HS-G6
- Proper FOM evaluation and optimal settings selection
- Pre-Coding enablement for HS-G6
- Power mode changes with TX Equalization settings applied
- Report of TX Equalization settings via debugfs entries
- Report of TX EQTR histories via debug entries (see next section)
- Re-training TX Equalization via debugfs entry

Example of TX EQTR history
==========================

Device TX EQTR record summary -
Target Power Mode: HS-G6, Rate-B
Most recent record index: 2
Most recent record timestamp: 219573378 us

TX Lane 0 FOM - PreShoot\DeEmphasis
\       0        1        2        3        4        5        6        7
0      50       70       65        -        -        -        -        x
1       x        x        x        x        x        x        x        x
2     100       90       70        -        -        -        -        x
3       x        x        x        x        x        x        x        x
4      95       90        -        -        -        -        -        x
5       -        -        -        -        -        -        -        x
6       x        x        x        x        x        x        x        x
7       x        x        x        x        x        x        x        x

TX Lane 1 FOM - PreShoot\DeEmphasis
\       0        1        2        3        4        5        6        7
0      50       70       60        -        -        -        -        x
1       x        x        x        x        x        x        x        x
2     100       80       65        -        -        -        -        x
3       x        x        x        x        x        x        x        x
4      95       85        -        -        -        -        -        x
5       -        -        -        -        -        -        -        x
6       x        x        x        x        x        x        x        x
7       x        x        x        x        x        x        x        x

Patch Structure
===============

Patches 1-3: Preparatory changes for power mode negotiation and HS-G6
Patch 4: Core TX Equalization and EQTR implementation
Patches 5-7: Debugfs support for TX Equalization
Patches 8-12: Qualcomm vendor implementation

Next
====

One more series has been developed to enhance TX Equalization support,
which will be submitted for review after this series is accepted:

- Provide board specific (static) TX Equalization settings from DTS
- Parse static TX Equalization settings from DTS if provided
- Apply static TX Equalization settings if use_adaptive_txeq is disabled
- Add support for UFS v5.0 attributes qTxEQGnSettings & wTxEQGnSettingsExt
- Enable persistent storage and retrieval of optimal TX Equalization settings

Link: https://patch.msgid.link/20260325152154.1604082-1-can.guo@oss.qualcomm.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1  2 
drivers/ufs/core/ufshcd-priv.h
drivers/ufs/core/ufshcd.c
drivers/ufs/host/ufs-mediatek.c
drivers/ufs/host/ufshcd-pci.c
include/ufs/ufshcd.h

index 6d3d14e883b8b22df685f155fb7703d59d2ebb6c,d296f00c099ddb253813d5d05fa40ea31c9e086b..0a72148cb053e30b333d9122afbb46d975b363ef
@@@ -76,10 -76,11 +76,13 @@@ void ufshcd_mcq_compl_all_cqes_lock(str
  bool ufshcd_cmd_inflight(struct scsi_cmnd *cmd);
  int ufshcd_mcq_sq_cleanup(struct ufs_hba *hba, int task_tag);
  int ufshcd_mcq_abort(struct scsi_cmnd *cmd);
 +u32 ufshcd_mcq_read_mcqiacr(struct ufs_hba *hba, int i);
 +void ufshcd_mcq_write_mcqiacr(struct ufs_hba *hba, u32 val, int i);
  int ufshcd_try_to_abort_task(struct ufs_hba *hba, int tag);
  void ufshcd_release_scsi_cmd(struct ufs_hba *hba, struct scsi_cmnd *cmd);
+ int ufshcd_pause_command_processing(struct ufs_hba *hba, u64 timeout_us);
+ void ufshcd_resume_command_processing(struct ufs_hba *hba);
+ int ufshcd_scale_clks(struct ufs_hba *hba, unsigned long freq, bool scale_up);
  
  /**
   * enum ufs_descr_fmt - UFS string descriptor format
Simple merge
Simple merge
Simple merge
index cb6f1537a3f36668e1360abcb39369d44d7ea749,be15b62473039e1a31643032360de915c64ef8b7..cfbc75d8df8364b6fd823a76e812174bd51f2a96
@@@ -949,12 -1057,16 +1063,21 @@@ enum ufshcd_mcq_opr 
   * @critical_health_count: count of critical health exceptions
   * @dev_lvl_exception_count: count of device level exceptions since last reset
   * @dev_lvl_exception_id: vendor specific information about the device level exception event.
 + * @dme_qos_notification: Bitfield of pending DME Quality of Service (QoS)
 + *    events. Bits[3:1] reflect the corresponding bits of UIC DME Error Code
 + *    field within the Host Controller's UECDME register. Bit[0] is a flag
 + *    indicating that the DME QoS Monitor has been reset by the host.
 + * @dme_qos_sysfs_handle: handle for 'dme_qos_notification' sysfs entry
   * @rpmbs: list of OP-TEE RPMB devices (one per RPMB region)
+  * @host_preshoot_cap: a bitfield to indicate supported PreShoot dBs of host's TX lanes, cache of
+  *    host M-PHY TX_HS_PreShoot_Setting_Capability Attribute (ID 0x15)
+  * @host_deemphasis_cap: a bitfield to indicate supported DeEmphasis dBs of host's TX lanes, cache
+  *    of host M-PHY TX_HS_DeEmphasis_Setting_Capability Attribute (ID 0x12)
+  * @device_preshoot_cap: a bitfield to indicate supported PreShoot dBs of device's TX lanes, cache
+  *    of device M-PHY TX_HS_PreShoot_Setting_Capability Attribute (ID 0x15)
+  * @device_deemphasis_cap: a bitfield to indicate supported DeEmphasis dBs of device's TX lanes,
+  *    cache of device M-PHY TX_HS_DeEmphasis_Setting_Capability Attribute (ID 0x12)
+  * @tx_eq_params: TX Equalization settings
   */
  struct ufs_hba {
        void __iomem *mmio_base;
        int critical_health_count;
        atomic_t dev_lvl_exception_count;
        u64 dev_lvl_exception_id;
 +
 +      atomic_t dme_qos_notification;
 +      struct kernfs_node *dme_qos_sysfs_handle;
 +
        u32 vcc_off_delay_us;
        struct list_head rpmbs;
+       u8 host_preshoot_cap;
+       u8 host_deemphasis_cap;
+       u8 device_preshoot_cap;
+       u8 device_deemphasis_cap;
+       struct ufshcd_tx_eq_params tx_eq_params[UFS_HS_GEAR_MAX];
  };
  
  /**