Devicetree
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Santhosh Kumar K" <s-k6@ti.com>
Cc: "Richard Weinberger" <richard@nod.at>,
	"Pratyush Yadav" <pratyush@kernel.org>,
	"Miquel Raynal" <miquel.raynal@bootlin.com>,
	"Michael Walle" <mwalle@kernel.org>,
	"Takahiro Kuwano" <takahiro.kuwano@infineon.com>,
	devicetree@vger.kernel.org,
	"Vignesh Raghavendra" <vigneshr@ti.com>,
	robh@kernel.org, conor+dt@kernel.org
Subject: Re: [PATCH v9 11/18] spi: cadence-quadspi: enable PHY for direct reads
Date: Tue, 25 Aug 2026 17:32:32 +0000	[thread overview]
Message-ID: <20260825173232.DF62F1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260825171737.776052-12-s-k6@ti.com>

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] Bypassing PHY for unaligned or short direct reads at high frequency causes silent data corruption.
- [High] Modifying QSPI configuration registers before the controller is idle causes hardware race conditions.
--

commit 478fb069d36d7f959d00975130c0e1c3988aa09c
Author: Santhosh Kumar K <s-k6@ti.com>

spi: cadence-quadspi: enable PHY for direct reads

This commit adds support for toggling PHY mode around DMA transfers in the
Cadence QSPI driver. It introduces cqspi_tune_phy() to manage the PHY DLL
settings and configuration, and falls back to non-PHY reads for unaligned or
small transfers.

> diff --git a/drivers/spi/spi-cadence-quadspi.c b/drivers/spi/spi-cadence-quadspi.c
> index 58bca15dbd6ec..d38a0253e4bda 100644
> --- a/drivers/spi/spi-cadence-quadspi.c
> +++ b/drivers/spi/spi-cadence-quadspi.c
> @@ -1075,6 +1075,109 @@ static int cqspi_tune_phy(struct cqspi_flash_pdata *f_pdata, bool enable)

[ ... ]

> +	/* Disable path: execute unconditionally regardless of idle state. */
> +	cqspi_readdata_capture(cqspi, !cqspi->rclk_en, false,
> +			       f_pdata->read_delay);
> +
> +	reg = readl(reg_base + CQSPI_REG_CONFIG);
> +	reg &= ~(CQSPI_REG_CONFIG_PHY_EN |
> +		 CQSPI_REG_CONFIG_PHY_PIPELINE);
> +	writel(reg, reg_base + CQSPI_REG_CONFIG);

[Severity: High]
Does modifying active configuration registers before waiting for the controller
to become idle cause a hardware race condition?

When a successful direct read completes its DMA transfer, cqspi_tune_phy() is
called to disable the PHY. Because the QSPI prefetches data in direct mode,
the SPI bus may still be actively receiving data when the DMA finishes,
potentially violating IP requirements if the controller is not idle.

[ ... ]

> @@ -1630,6 +1741,7 @@ static int cqspi_direct_read_execute(struct cqspi_flash_pdata *f_pdata,
>  	loff_t from = op->addr.val;
>  	size_t len = op->data.nbytes;
>  	u_char *buf = op->data.buf.in;
> +	int ret;
>  
>  	if (!cqspi->rx_chan || !virt_addr_valid(buf) ||
>  	    len < CQSPI_PHY_MIN_DIRECT_READ_LEN) {
>  		cqspi_memcpy_fromio(op, buf, cqspi->ahb_base + from, len);
>  		return 0;
>  	}

[Severity: High]
Can bypassing the PHY for short direct reads at high frequencies cause silent
data corruption?

If a subsystem issues a short read that falls back to cqspi_memcpy_fromio(),
the read will execute at the high post_config_max_speed_hz (e.g., 200MHz DTR)
but without DQS or PHY DLL timing, capturing garbage data.

> -	return cqspi_direct_read_dma(f_pdata, buf, from, len);
> +
> +	if (!cqspi_use_tuned_phy(f_pdata, op, post_config_max_speed_hz))
> +		return cqspi_direct_read_dma(f_pdata, buf, from, len);
> +
> +	if (!IS_ALIGNED(from, 16) || !IS_ALIGNED(from + len, 16))
> +		return cqspi_direct_read_dma(f_pdata, buf, from, len);

[Severity: High]
Does this unaligned fallback also risk silent data corruption for the same
reason? 

Similar to short reads, falling back to cqspi_direct_read_dma() without the
PHY enabled means the controller executes the read at high speed without the
tuned PHY data-capture timing.

> +	ret = cqspi_tune_phy(f_pdata, true);
> +	if (ret)
> +		return ret;
> +	ret = cqspi_direct_read_dma(f_pdata, buf, from, len);
> +	ret = cqspi_tune_phy(f_pdata, false) ?: ret;

The race condition mentioned earlier triggers here. The DMA transfer completes
and immediately calls cqspi_tune_phy(..., false) without waiting for idle.

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

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

Thread overview: 30+ 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 ` [PATCH v9 01/18] spi: dt-bindings: add spi-max-post-config-frequency-hz property 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 ` [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: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: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 ` [PATCH v9 06/18] spi: cadence-quadspi: move cqspi_readdata_capture earlier 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: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:40   ` sashiko-bot
2026-08-26 21:43   ` Mark Brown
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 ` [PATCH v9 10/18] spi: cadence-quadspi: refactor direct read path for PHY support 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:32   ` sashiko-bot [this message]
2026-08-25 17:17 ` [PATCH v9 12/18] spi: cadence-quadspi: enable PHY for indirect writes 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 ` [PATCH v9 14/18] spi: cadence-quadspi: reprogram PHY DLL on runtime resume 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 ` [PATCH v9 16/18] mtd: spinand: negotiate optimal controller operating point before dirmap creation Santhosh Kumar K
2026-08-25 17:43   ` sashiko-bot
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 ` [PATCH v9 18/18] mtd: spi-nor: run controller optimization before dirmap creation 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=20260825173232.DF62F1F000E9@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox