All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Santhosh Kumar K" <s-k6@ti.com>
Cc: devicetree@vger.kernel.org,
	"Miquel Raynal" <miquel.raynal@bootlin.com>,
	"Pratyush Yadav" <pratyush@kernel.org>,
	"Michael Walle" <mwalle@kernel.org>,
	"Takahiro Kuwano" <takahiro.kuwano@infineon.com>,
	conor+dt@kernel.org, robh@kernel.org,
	"Richard Weinberger" <richard@nod.at>,
	"Vignesh Raghavendra" <vigneshr@ti.com>
Subject: Re: [PATCH v9 08/18] spi: cadence-quadspi: add PHY tuning support
Date: Tue, 25 Aug 2026 17:40:59 +0000	[thread overview]
Message-ID: <20260825174059.7C8391F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260825171737.776052-9-s-k6@ti.com>

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [High] Manual PHY dummy cycle adjustments are overwritten and clobbered by subsequent read setups.
- [Medium] SDR PHY tuning fails for valid 1-tap wide windows due to an off-by-one error in the loop condition.
- [Medium] Incorrect parsing of 64-bit addresses for 'spi-phy-pattern-partition'.
--

commit 9701c78fc6d77976ffa5b3298e4d3809197ebe5d
Author: Santhosh Kumar K <s-k6@ti.com>

spi: cadence-quadspi: add PHY tuning support

This commit adds an execute_tuning callback for the Cadence QSPI controller
to perform delay-line calibration. It introduces 2D sweeps for DDR protocols
and 1D sweeps for SDR protocols by reading a known data pattern or writing
to the page cache before calibration.

> diff --git a/drivers/spi/spi-cadence-quadspi.c b/drivers/spi/spi-cadence-quadspi.c
> index 046fa5d69b0f7..f7cda1bc71393 100644
> --- a/drivers/spi/spi-cadence-quadspi.c
> +++ b/drivers/spi/spi-cadence-quadspi.c
[ ... ]
> @@ -1559,10 +1718,1594 @@ static bool cqspi_supports_mem_op(struct spi_mem *mem,
> +static void cqspi_phy_pre_config(struct cqspi_st *cqspi,
> +				 struct cqspi_flash_pdata *f_pdata,
> +				 const bool bypass)
> +{
[ ... ]
> +	reg = readl(reg_base + CQSPI_REG_RD_INSTR);
> +	dummy = FIELD_GET(CQSPI_REG_RD_INSTR_DUMMY_MASK
> +				  << CQSPI_REG_RD_INSTR_DUMMY_LSB,
> +			  reg);
> +	cqspi->phy_saved_dummy = dummy;
> +	if (dummy)
> +		dummy--;
> +	reg &= ~(CQSPI_REG_RD_INSTR_DUMMY_MASK << CQSPI_REG_RD_INSTR_DUMMY_LSB);
> +	reg |= FIELD_PREP(CQSPI_REG_RD_INSTR_DUMMY_MASK
> +				  << CQSPI_REG_RD_INSTR_DUMMY_LSB,
> +			  dummy);
> +	writel(reg, reg_base + CQSPI_REG_RD_INSTR);

[Severity: High]
Does this modification to CQSPI_REG_RD_INSTR get clobbered during tuning?

During the tuning process, cqspi_phy_check_pattern() executes a read via the
SPI core. This eventually calls cqspi_read_setup(), which recalculates the
dummy cycles from the spi_mem_op and unconditionally overwrites
CQSPI_REG_RD_INSTR:

cqspi_read_setup() {
    ...
    dummy_clk = cqspi_calc_dummy(op);
    if (dummy_clk)
        reg |= (dummy_clk & CQSPI_REG_RD_INSTR_DUMMY_MASK)
               << CQSPI_REG_RD_INSTR_DUMMY_LSB;
    writel(reg, reg_base + CQSPI_REG_RD_INSTR);
    ...
}

Will this overwrite destroy the PHY pipeline adjustment made here before the
tuning read even executes, causing the tuning reads to fail?

> +
> +	cqspi_phy_set_dll_master(cqspi);
> +}
[ ... ]
> +static int cqspi_find_rx_high_sdr(struct cqspi_flash_pdata *f_pdata,
> +				  struct spi_mem *mem, struct phy_setting *phy,
> +				  u8 lowerbound)
> +{
> +	struct device *dev = &f_pdata->cqspi->pdev->dev;
> +	int ret;
> +
> +	phy->rx = CQSPI_PHY_MAX_DELAY;
> +	do {
> +		ret = cqspi_phy_apply_setting(f_pdata, phy);
> +		if (!ret) {
> +			ret = cqspi_phy_check_pattern(f_pdata, mem);
> +			if (!ret)
> +				return 0;
> +		}
> +		phy->rx--;
> +	} while (phy->rx > lowerbound);

[Severity: Medium]
Does this loop condition prematurely fail for 1-tap wide windows?

If the valid SDR window is exactly 1-tap wide, the upper boundary will be
equal to lowerbound. Because the loop condition is strictly greater-than
(phy->rx > lowerbound), it will exit immediately when reaching lowerbound
without returning success for that tap. Should this be >= lowerbound so
narrow windows are properly detected?

> +
> +	dev_dbg(dev, "Unable to find RX high\n");
> +	return -ENOENT;
> +}
[ ... ]
> @@ -1588,9 +3331,12 @@ static int cqspi_of_get_flash_pdata(struct platform_device *pdev,
>  		return -ENXIO;
>  	}
>  
> -	if (of_property_read_u32(np, "spi-max-frequency", &f_pdata->clk_rate)) {
> -		dev_err(&pdev->dev, "couldn't determine spi-max-frequency\n");
> -		return -ENXIO;
> +	part_np = of_parse_phandle(np, "spi-phy-pattern-partition", 0);
> +	if (part_np) {
> +		f_pdata->phy_pattern_partition_valid =
> +			!of_property_read_u32_index(part_np, "reg", 0,
> +						    &f_pdata->phy_pattern_partition_offset);

[Severity: Medium]
Will this truncate 64-bit partition offsets?

If the SPI device specifies #address-cells = <2>, the reg property contains
a 64-bit address. Reading it with of_property_read_u32_index() fetches only
the upper 32 bits (which is 0 for offsets under 4GB). This could lead to the
pattern being read from the wrong flash offset instead of the dedicated
partition.

> +		of_node_put(part_np);
>  	}

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260825171737.776052-1-s-k6@ti.com?part=8

  reply	other threads:[~2026-08-25 17:41 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-25 17:17 [PATCH v9 00/18] spi: cadence-quadspi: add PHY tuning support Santhosh Kumar K
2026-08-25 17:17 ` Santhosh Kumar K
2026-08-25 17:17 ` [PATCH v9 01/18] spi: dt-bindings: add spi-max-post-config-frequency-hz property Santhosh Kumar K
2026-08-25 17:17   ` Santhosh Kumar K
2026-08-25 17:17 ` [PATCH v9 02/18] spi: dt-bindings: add spi-phy-pattern-partition property Santhosh Kumar K
2026-08-25 17:17   ` Santhosh Kumar K
2026-08-25 17:17 ` [PATCH v9 03/18] spi: parse spi-max-post-config-frequency-hz into post_config_max_speed_hz Santhosh Kumar K
2026-08-25 17:17   ` Santhosh Kumar K
2026-08-25 17:30   ` sashiko-bot
2026-08-25 17:17 ` [PATCH v9 04/18] spi: spi-mem: teach spi_mem_adjust_op_freq() about post-config ops Santhosh Kumar K
2026-08-25 17:17   ` Santhosh Kumar K
2026-08-25 17:30   ` sashiko-bot
2026-08-25 17:17 ` [PATCH v9 05/18] spi: spi-mem: add execute_tuning callback and spi_mem_execute_tuning() Santhosh Kumar K
2026-08-25 17:17   ` Santhosh Kumar K
2026-08-25 17:17 ` [PATCH v9 06/18] spi: cadence-quadspi: move cqspi_readdata_capture earlier Santhosh Kumar K
2026-08-25 17:17   ` Santhosh Kumar K
2026-08-25 17:17 ` [PATCH v9 07/18] spi: cadence-quadspi: add DQS support to read data capture Santhosh Kumar K
2026-08-25 17:17   ` Santhosh Kumar K
2026-08-25 17:29   ` sashiko-bot
2026-08-25 17:17 ` [PATCH v9 08/18] spi: cadence-quadspi: add PHY tuning support Santhosh Kumar K
2026-08-25 17:17   ` Santhosh Kumar K
2026-08-25 17:40   ` sashiko-bot [this message]
2026-08-26 21:43   ` Mark Brown
2026-08-26 21:43     ` Mark Brown
2026-09-02  9:45     ` Santhosh Kumar K
2026-09-02  9:45       ` Santhosh Kumar K
2026-09-03  8:16       ` Miquel Raynal
2026-09-03  8:16         ` Miquel Raynal
2026-09-08 13:05         ` Santhosh Kumar K
2026-09-08 13:05           ` Santhosh Kumar K
2026-09-08 15:53           ` Miquel Raynal
2026-08-25 17:17 ` [PATCH v9 09/18] spi: cadence-quadspi: skip DDR PHY tuning for 2-byte-address ops (i2383) Santhosh Kumar K
2026-08-25 17:17   ` Santhosh Kumar K
2026-08-25 17:17 ` [PATCH v9 10/18] spi: cadence-quadspi: refactor direct read path for PHY support Santhosh Kumar K
2026-08-25 17:17   ` Santhosh Kumar K
2026-08-25 17:31   ` sashiko-bot
2026-08-25 17:17 ` [PATCH v9 11/18] spi: cadence-quadspi: enable PHY for direct reads Santhosh Kumar K
2026-08-25 17:17   ` Santhosh Kumar K
2026-08-25 17:32   ` sashiko-bot
2026-08-25 17:17 ` [PATCH v9 12/18] spi: cadence-quadspi: enable PHY for indirect writes Santhosh Kumar K
2026-08-25 17:17   ` Santhosh Kumar K
2026-08-25 17:32   ` sashiko-bot
2026-08-25 17:17 ` [PATCH v9 13/18] spi: cadence-quadspi: reprogram CS timing on every chip-select switch Santhosh Kumar K
2026-08-25 17:17   ` Santhosh Kumar K
2026-08-25 17:17 ` [PATCH v9 14/18] spi: cadence-quadspi: reprogram PHY DLL on runtime resume Santhosh Kumar K
2026-08-25 17:17   ` Santhosh Kumar K
2026-08-25 17:36   ` sashiko-bot
2026-08-25 17:17 ` [PATCH v9 15/18] mtd: spinand: extract variant ranking logic into spinand_op_find_best_variant() Santhosh Kumar K
2026-08-25 17:17   ` Santhosh Kumar K
2026-08-25 17:17 ` [PATCH v9 16/18] mtd: spinand: negotiate optimal controller operating point before dirmap creation Santhosh Kumar K
2026-08-25 17:17   ` Santhosh Kumar K
2026-08-25 17:43   ` sashiko-bot
2026-09-04 16:23   ` Miquel Raynal
2026-09-04 16:23     ` Miquel Raynal
2026-09-04 16:25     ` Miquel Raynal
2026-09-04 16:25       ` Miquel Raynal
2026-09-08 13:14     ` Santhosh Kumar K
2026-09-08 13:14       ` Santhosh Kumar K
2026-09-08 15:54       ` Miquel Raynal
2026-09-08 15:54         ` Miquel Raynal
2026-08-25 17:17 ` [PATCH v9 17/18] mtd: spi-nor: extract read op template construction into helper Santhosh Kumar K
2026-08-25 17:17   ` Santhosh Kumar K
2026-08-25 17:17 ` [PATCH v9 18/18] mtd: spi-nor: run controller optimization before dirmap creation Santhosh Kumar K
2026-08-25 17:17   ` Santhosh Kumar K
2026-08-25 17:45   ` sashiko-bot

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=20260825174059.7C8391F000E9@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=miquel.raynal@bootlin.com \
    --cc=mwalle@kernel.org \
    --cc=pratyush@kernel.org \
    --cc=richard@nod.at \
    --cc=robh@kernel.org \
    --cc=s-k6@ti.com \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=takahiro.kuwano@infineon.com \
    --cc=vigneshr@ti.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 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.