* Re: [PATCH v8 2/2] scsi: ufs: core: Add support for static TX Equalization settings @ 2026-06-15 21:09 kernel test robot 0 siblings, 0 replies; 2+ messages in thread From: kernel test robot @ 2026-06-15 21:09 UTC (permalink / raw) To: oe-kbuild; +Cc: lkp :::::: :::::: Manual check reason: "dtcheck: binding changes may go via different trees" :::::: BCC: lkp@intel.com CC: oe-kbuild-all@lists.linux.dev In-Reply-To: <20260615085027.2102882-3-can.guo@oss.qualcomm.com> References: <20260615085027.2102882-3-can.guo@oss.qualcomm.com> TO: Can Guo <can.guo@oss.qualcomm.com> TO: krzk@kernel.org TO: bvanassche@acm.org TO: beanhuo@micron.com TO: peter.wang@mediatek.com TO: martin.petersen@oracle.com TO: mani@kernel.org CC: linux-scsi@vger.kernel.org CC: Can Guo <can.guo@oss.qualcomm.com> CC: Alim Akhtar <alim.akhtar@samsung.com> CC: Avri Altman <avri.altman@wdc.com> CC: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com> CC: Nitin Rawat <quic_nitirawa@quicinc.com> CC: Ram Kumar Dwivedi <quic_rdwivedi@quicinc.com> CC: linux-kernel@vger.kernel.org Hi Can, kernel test robot noticed the following build warnings: [auto build test WARNING on mkp-scsi/for-next] [also build test WARNING on jejb-scsi/for-next krzk-dt/for-next linus/master v7.1 next-20260615] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Can-Guo/dt-bindings-ufs-Document-static-TX-Equalization-settings-properties/20260615-170015 base: https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next patch link: https://lore.kernel.org/r/20260615085027.2102882-3-can.guo%40oss.qualcomm.com patch subject: [PATCH v8 2/2] scsi: ufs: core: Add support for static TX Equalization settings :::::: branch date: 12 hours ago :::::: commit date: 12 hours ago config: microblaze-randconfig-2051-20260615 (https://download.01.org/0day-ci/archive/20260615/202606152309.d4ZWI89u-lkp@intel.com/config) compiler: microblaze-linux-gcc (GCC) 8.5.0 dtschema: 2026.5.dev10+g5d839523d reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260615/202606152309.d4ZWI89u-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/r/202606152309.d4ZWI89u-lkp@intel.com/ dtcheck warnings: (new ones prefixed by >>) Documentation/devicetree/bindings/mmc/hisilicon,hi3798cv200-dw-mshc.yaml: properties:hisilicon,sap-dll-reg:items:0: 'anyOf' conditional failed, one must be fixed: 'items' is a required property 'minItems' is a required property 'maxItems' is a required property from schema $id: http://devicetree.org/meta-schemas/items.yaml Documentation/devicetree/bindings/mmc/hisilicon,hi3798cv200-dw-mshc.yaml: properties:hisilicon,sap-dll-reg:items:1: 'anyOf' conditional failed, one must be fixed: 'items' is a required property 'minItems' is a required property 'maxItems' is a required property from schema $id: http://devicetree.org/meta-schemas/items.yaml >> Documentation/devicetree/bindings/ufs/ufs-common.yaml: patternProperties:^txeq-preshoot-g[1-6]$:items: 'anyOf' conditional failed, one must be fixed: 'items' is a required property 'minItems' is a required property 'maxItems' is a required property from schema $id: http://devicetree.org/meta-schemas/items.yaml >> Documentation/devicetree/bindings/ufs/ufs-common.yaml: patternProperties:^txeq-deemphasis-g[1-6]$:items: 'anyOf' conditional failed, one must be fixed: 'items' is a required property 'minItems' is a required property 'maxItems' is a required property from schema $id: http://devicetree.org/meta-schemas/items.yaml >> Documentation/devicetree/bindings/ufs/ufs-common.yaml: properties:tx-precode-enable-g6:items: 'anyOf' conditional failed, one must be fixed: 'items' is a required property 'minItems' is a required property 'maxItems' is a required property from schema $id: http://devicetree.org/meta-schemas/items.yaml Documentation/devicetree/bindings/spi/st,stm32mp25-ospi.yaml: properties:st,syscfg-dlyb:items:0: 'anyOf' conditional failed, one must be fixed: 'items' is a required property 'minItems' is a required property 'maxItems' is a required property from schema $id: http://devicetree.org/meta-schemas/items.yaml Documentation/devicetree/bindings/spi/st,stm32mp25-ospi.yaml: properties:st,syscfg-dlyb:items:1: 'anyOf' conditional failed, one must be fixed: -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 2+ messages in thread
* [PATCH v8 0/2] scsi: ufs: Add support for static TX Equalization settings
@ 2026-06-15 8:50 Can Guo
2026-06-15 8:50 ` [PATCH v8 2/2] scsi: ufs: core: " Can Guo
0 siblings, 1 reply; 2+ messages in thread
From: Can Guo @ 2026-06-15 8:50 UTC (permalink / raw)
To: krzk, bvanassche, beanhuo, peter.wang, martin.petersen, mani
Cc: linux-scsi, Can Guo
Hi,
This series adds support for board-specific static TX Equalization settings
provided through Device Tree.
This series is based on the earlier TX Equalization enablement work and
persistent storage/retrieval of optimal TX Equalization settings work:
https://lore.kernel.org/all/20260325152154.1604082-1-can.guo@oss.qualcomm.com
https://lore.kernel.org/all/20260424151420.111675-1-can.guo@oss.qualcomm.com
Background
==========
UFS v5.0/UFSHCI v5.0 adds HS-G6 support (46.6 Gbps/lane) via UniPro v3.0
and M-PHY v6.0. These specs define TX Equalization for all High-Speed
Gears (not only HS-G6) to compensate channel loss and improve signal
integrity at high speed.
For HS-G6, M-PHY uses PAM4 1b1b line coding. Pre-Coding may also be
required depending on channel characteristics.
This series adds vendor-neutral DT properties:
- patternProperties: txeq-preshoot-g[1-6], txeq-deemphasis-g[1-6]
- fixed property: tx-precode-enable-g6
All properties use per-lane Host/Device tuples and accept 2 or 4 values
for x1/x2 lane configurations:
- txeq-preshoot-g[1-6]: values 0..7
- txeq-deemphasis-g[1-6]: values 0..7
- tx-precode-enable-g6: values 0/1
These properties carry board-level SI characterization data used as static
TX Equalization settings for each High-Speed Gear.
Example DTS snippet
===================
The following x2-lane example shows the expected DT encoding:
ufs@1d84000 {
lanes-per-direction = <2>;
txeq-preshoot-g6 = <1 2>, <3 4>;
txeq-deemphasis-g6 = <0 1>, <2 3>;
tx-precode-enable-g6 = <1 0>, <0 1>;
};
Relationship with Adaptive TX Equalization
==========================================
Adaptive TX Equalization remains the primary path when enabled.
Static TX Equalization settings from DT are board-specific baseline values,
but when adaptive TX Equalization is used, static settings are not final:
- If valid settings are retrieved from qTxEQGnSettings/wTxEQGnSettingsExt,
those retrieved settings override static DT settings.
- If retrieval is not available/valid, TX EQTR runs and trained settings
override static DT settings.
So static DT settings are a fallback and are intended for cases where
adaptive TX Equalization is not enabled/used.
No behavior changes for platforms that do not provide these properties.
What this series adds
=====================
1. dt-bindings:
- Document txeq-preshoot-g[1-6], txeq-deemphasis-g[1-6], and
tx-precode-enable-g6 in ufs-common.yaml.
- Define tuple encoding for host/device values per lane.
- Add per-property value validation ranges in schema.
2. UFS core/platform integration:
- Parse and validate per-gear DT TX EQ settings during platform init.
- Store parsed values into per-gear TX EQ params and track DT origin using
the from_dt flag.
- Integrate static-state handling in TX EQ flow so DT-provided entries are
fed through the adaptive TX Equalization path and then converted to
normal runtime params.
v7 -> v8:
- Replace split HS-G6 precode lane-list properties
(tx-precode-g6-host-lanes/tx-precode-g6-device-lanes) with a single
tx-precode-enable-g6 tuple property in the binding.
- Update parser in patch 2 to read tx-precode-enable-g6 as Host/Device
tuples and validate full lane coverage and 0/1 values.
- Rename is_static to from_dt for clearer semantics in TX EQ params.
- Update commit messages for clarity and consistency.
v6 -> v7:
- Add DTS properties example in the cover letter.
- Replace tx-precode-enable-g6 tuple encoding with split lane-list
properties:
tx-precode-g6-host-lanes and tx-precode-g6-device-lanes.
- Update parser in patch 2 to read optional u32 lane-index arrays and
treat unlisted lanes as precode disabled.
- Refactor patch 2 TX EQ property parsing to share a single helper for
txeq-preshoot-gN/txeq-deemphasis-gN array read and validation.
- Dropped Reviewed-by/Acked-by due to code changes.
v5 -> v6:
- Use num_elems instead of count in the per-property validation loops for
clarity (patch 2).
- Change else if (lpd > UFS_MAX_LANES) to a plain if after the !lpd early
return, per kernel style (patch 2).
v4 -> v5:
- Extract the body of the per-gear for-loop in
ufshcd_parse_static_tx_eq_settings() into a new helper
ufshcd_parse_tx_eq_settings_for_gear() to reduce indentation depth
(patch 2).
- Mark lpd and num_elems as const u32; rename sz to num_elems for clarity;
use %u format specifier to match (patch 2).
- Replace size_t with u32 for the element-count variable (patch 2).
- Emit dev_warn() when lanes_per_direction exceeds UFS_MAX_LANES
(patch 2).
v3 -> v4:
- Add Acked-by from Manivannan Sadhasivam to patch 1.
- Remove spurious dev_err() on the lpd guard in patch 2 (lpd == 0 is
normal on platforms without lanes-per-direction in DT, not an error).
- Improve comment above the is_static condition in patch 2 to read
"valid but static, i.e., populated from DT" for clarity.
v2 -> v3:
- Split the DT TX EQ binding into semantically separate properties:
txeq-preshoot-g*, txeq-deemphasis-g*, tx-precode-g6-*-lanes.
- Place precode properties in properties (fixed keys) instead of
patternProperties to satisfy dt-schema meta-schema rules.
- Restrict precode property to HS-G6 and document per-property ranges.
- Update the core parser to consume split properties.
- Drop unrelated arch/arm64/configs/defconfig changes from patch 2.
v1 -> v2:
- Improve the commit message of patch 1.
Can Guo (2):
dt-bindings: ufs: Document static TX Equalization settings properties
scsi: ufs: core: Add support for static TX Equalization settings
.../devicetree/bindings/ufs/ufs-common.yaml | 55 ++++++
drivers/ufs/core/ufs-txeq.c | 15 +-
drivers/ufs/host/ufshcd-pltfrm.c | 156 ++++++++++++++++++
include/ufs/ufshcd.h | 2 +
4 files changed, 227 insertions(+), 1 deletion(-)
--
2.34.1
^ permalink raw reply [flat|nested] 2+ messages in thread* [PATCH v8 2/2] scsi: ufs: core: Add support for static TX Equalization settings 2026-06-15 8:50 [PATCH v8 0/2] scsi: ufs: " Can Guo @ 2026-06-15 8:50 ` Can Guo 0 siblings, 0 replies; 2+ messages in thread From: Can Guo @ 2026-06-15 8:50 UTC (permalink / raw) To: krzk, bvanassche, beanhuo, peter.wang, martin.petersen, mani Cc: linux-scsi, Can Guo, Alim Akhtar, Avri Altman, James E.J. Bottomley, Nitin Rawat, Ram Kumar Dwivedi, open list Parse board-specific static TX Equalization settings from Device Tree for each HS gear and store them in hba->tx_eq_params. Parse txeq-preshoot-g[1-6] and txeq-deemphasis-g[1-6] as per-lane tuples: <Host_Lane0 Device_Lane0>, [<Host_Lane1 Device_Lane1>]. For HS-G6, parse optional tx-precode-enable-g6 using the same per-lane Host/Device tuple format. If provided, it must contain values for all active lanes, and each value must be 0 or 1. Introduce from_dt in struct ufshcd_tx_eq_params to track whether TX EQ values came from static Device Tree data. When adaptive TX Equalization is used, these static settings are not final: - If valid settings are retrieved from qTxEQGnSettings/wTxEQGnSettingsExt, those retrieved settings override static Device Tree settings. - If retrieval is not available/valid, TX EQTR runs and trained settings override static Device Tree settings. So static Device Tree settings are a fallback for cases where adaptive TX Equalization is not enabled or not used. Adaptive TX Equalization remains the primary path when enabled. No behavior changes for platforms that do not provide these properties. Signed-off-by: Can Guo <can.guo@oss.qualcomm.com> --- drivers/ufs/core/ufs-txeq.c | 15 ++- drivers/ufs/host/ufshcd-pltfrm.c | 156 +++++++++++++++++++++++++++++++ include/ufs/ufshcd.h | 2 + 3 files changed, 172 insertions(+), 1 deletion(-) diff --git a/drivers/ufs/core/ufs-txeq.c b/drivers/ufs/core/ufs-txeq.c index 4b264adfdf49..63616f8c2f74 100644 --- a/drivers/ufs/core/ufs-txeq.c +++ b/drivers/ufs/core/ufs-txeq.c @@ -1297,7 +1297,13 @@ int ufshcd_config_tx_eq_settings(struct ufs_hba *hba, } params = &hba->tx_eq_params[gear - 1]; - if (!params->is_valid || force_tx_eqtr) { + /* + * TX EQTR must run for the following cases: + * 1. TX EQ settings are invalid. + * 2. TX EQ settings are from Device Tree. + * 3. TX EQTR procedure is forced. + */ + if (!params->is_valid || params->from_dt || force_tx_eqtr) { int ret; ret = ufshcd_tx_eqtr(hba, params, pwr_mode); @@ -1310,6 +1316,8 @@ int ufshcd_config_tx_eq_settings(struct ufs_hba *hba, /* Mark TX Equalization settings as valid */ params->is_valid = true; params->is_trained = true; + /* TX EQTR succeeds, clear from_dt flag */ + params->from_dt = false; params->is_applied = false; } @@ -1495,6 +1503,11 @@ static void ufshcd_extract_tx_eq_settings_attrs(struct ufs_hba *hba, u8 gear) } params->is_valid = true; + /* + * Optimal TX EQ settings are retrieved from UFS device attributes, + * clear from_dt flag to avoid TX EQTR procedure. + */ + params->from_dt = false; } void ufshcd_retrieve_tx_eq_settings(struct ufs_hba *hba) diff --git a/drivers/ufs/host/ufshcd-pltfrm.c b/drivers/ufs/host/ufshcd-pltfrm.c index c2dafb583cf5..5cf934bf10d0 100644 --- a/drivers/ufs/host/ufshcd-pltfrm.c +++ b/drivers/ufs/host/ufshcd-pltfrm.c @@ -210,6 +210,160 @@ static void ufshcd_init_lanes_per_dir(struct ufs_hba *hba) } } +static int ufshcd_parse_tx_precode_enable(struct ufs_hba *hba, + bool host_precode_en[UFS_MAX_LANES], + bool device_precode_en[UFS_MAX_LANES]) +{ + const char *prop_name = "tx-precode-enable-g6"; + u32 num_elems = 2 * hba->lanes_per_direction; + const u32 lpd = hba->lanes_per_direction; + u32 precode[UFS_MAX_LANES * 2]; + struct device *dev = hba->dev; + struct property *prop; + int count, err, i; + + prop = of_find_property(dev->of_node, prop_name, NULL); + if (!prop) + return 0; + + count = of_property_count_u32_elems(dev->of_node, prop_name); + if (count < 0) + return count; + + if (count != num_elems) { + dev_err(dev, "Property %s has invalid count (%d), expecting %u\n", + prop_name, count, num_elems); + return -EINVAL; + } + + err = of_property_read_u32_array(dev->of_node, prop_name, precode, num_elems); + if (err) { + dev_err(dev, "Failed to read %s property, %d\n", prop_name, err); + return err; + } + + for (i = 0; i < num_elems; i++) { + if (precode[i] > 1) { + dev_err(dev, "Invalid TX precode value (%u) in %s property\n", + precode[i], prop_name); + return -EINVAL; + } + } + + for (i = 0; i < lpd; i++) { + host_precode_en[i] = precode[i * 2]; + device_precode_en[i] = precode[i * 2 + 1]; + } + + return 0; +} + +static int ufshcd_parse_tx_eq_value_array(struct ufs_hba *hba, + const char *prop_name, + const u32 max_value, + u32 values[UFS_MAX_LANES * 2]) +{ + u32 num_elems = 2 * hba->lanes_per_direction; + struct device *dev = hba->dev; + int count, err, i; + + count = of_property_count_u32_elems(dev->of_node, prop_name); + if (count < 0) + return count; + + if (count != num_elems) { + dev_err(dev, "Property %s has invalid count (%d), expecting %u\n", + prop_name, count, num_elems); + return -EINVAL; + } + + err = of_property_read_u32_array(dev->of_node, prop_name, values, num_elems); + if (err) { + dev_err(dev, "Failed to read %s property, %d\n", prop_name, err); + return err; + } + + for (i = 0; i < num_elems; i++) { + if (values[i] >= max_value) { + dev_err(dev, "Invalid TX EQ value (%u) in %s property\n", + values[i], prop_name); + return -EINVAL; + } + } + + return 0; +} + +/** + * ufshcd_parse_tx_eq_settings_for_gear - Parse static TX EQ DT settings for one gear + * @hba: per adapter instance + * @gear: target HS gear + * + * Reads the txeq-preshoot-gN, txeq-deemphasis-gN, and (for G6) + * tx-precode-enable-g6 device-tree properties. + * If all present values are valid, stores them as static TX Equalization + * settings for the given gear. + */ +static void ufshcd_parse_tx_eq_settings_for_gear(struct ufs_hba *hba, int gear) +{ + bool device_precode_en[UFS_MAX_LANES] = { false }; + bool host_precode_en[UFS_MAX_LANES] = { false }; + const u32 lpd = hba->lanes_per_direction; + struct ufshcd_tx_eq_params *params; + u32 deemphasis[UFS_MAX_LANES * 2]; + u32 preshoot[UFS_MAX_LANES * 2]; + char prop_name[MAX_PROP_SIZE]; + int err, lane; + + snprintf(prop_name, MAX_PROP_SIZE, "txeq-preshoot-g%d", gear); + err = ufshcd_parse_tx_eq_value_array(hba, prop_name, TX_HS_NUM_PRESHOOT, preshoot); + if (err) + return; + + snprintf(prop_name, MAX_PROP_SIZE, "txeq-deemphasis-g%d", gear); + err = ufshcd_parse_tx_eq_value_array(hba, prop_name, TX_HS_NUM_DEEMPHASIS, deemphasis); + if (err) + return; + + if (gear == UFS_HS_G6) { + err = ufshcd_parse_tx_precode_enable(hba, host_precode_en, device_precode_en); + if (err) + return; + } + + params = &hba->tx_eq_params[gear - 1]; + for (lane = 0; lane < lpd; lane++) { + params->host[lane].preshoot = preshoot[lane * 2]; + params->host[lane].deemphasis = deemphasis[lane * 2]; + params->host[lane].precode_en = host_precode_en[lane]; + + params->device[lane].preshoot = preshoot[lane * 2 + 1]; + params->device[lane].deemphasis = deemphasis[lane * 2 + 1]; + params->device[lane].precode_en = device_precode_en[lane]; + } + + params->is_valid = true; + params->from_dt = true; +} + +static void ufshcd_parse_static_tx_eq_settings(struct ufs_hba *hba) +{ + const u32 lpd = hba->lanes_per_direction; + int gear; + + if (!lpd) + return; + + if (lpd > UFS_MAX_LANES) { + dev_warn(hba->dev, "lanes_per_direction (%u) exceeds UFS_MAX_LANES (%u)\n", + lpd, UFS_MAX_LANES); + return; + } + + for (gear = UFS_HS_G1; gear <= UFS_HS_GEAR_MAX; gear++) + ufshcd_parse_tx_eq_settings_for_gear(hba, gear); +} + /** * ufshcd_parse_clock_min_max_freq - Parse MIN and MAX clocks freq * @hba: per adapter instance @@ -528,6 +682,8 @@ int ufshcd_pltfrm_init(struct platform_device *pdev, ufshcd_init_lanes_per_dir(hba); + ufshcd_parse_static_tx_eq_settings(hba); + err = ufshcd_parse_operating_points(hba); if (err) { dev_err(dev, "%s: OPP parse failed %d\n", __func__, err); diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h index f48d6416e299..0f87b081b2ff 100644 --- a/include/ufs/ufshcd.h +++ b/include/ufs/ufshcd.h @@ -359,6 +359,7 @@ struct ufshcd_tx_eqtr_record { * @is_valid: True if parameter contains valid TX Equalization settings * @is_applied: True if settings have been applied to UniPro of both sides * @is_trained: True if parameters obtained from TX EQTR procedure + * @from_dt: True if settings are from Device Tree */ struct ufshcd_tx_eq_params { struct ufshcd_tx_eq_settings host[UFS_MAX_LANES]; @@ -367,6 +368,7 @@ struct ufshcd_tx_eq_params { bool is_valid; bool is_applied; bool is_trained; + bool from_dt; }; /** -- 2.34.1 ^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-06-15 21:09 UTC | newest] Thread overview: 2+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-06-15 21:09 [PATCH v8 2/2] scsi: ufs: core: Add support for static TX Equalization settings kernel test robot -- strict thread matches above, loose matches on Subject: below -- 2026-06-15 8:50 [PATCH v8 0/2] scsi: ufs: " Can Guo 2026-06-15 8:50 ` [PATCH v8 2/2] scsi: ufs: core: " Can Guo
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.