All of lore.kernel.org
 help / color / mirror / Atom feed
From: Santhosh Kumar K <s-k6@ti.com>
To: Mark Brown <broonie@kernel.org>
Cc: <robh@kernel.org>, <krzk+dt@kernel.org>, <conor+dt@kernel.org>,
	<miquel.raynal@bootlin.com>, <richard@nod.at>, <vigneshr@ti.com>,
	<pratyush@kernel.org>, <mwalle@kernel.org>,
	<takahiro.kuwano@infineon.com>, <linux-spi@vger.kernel.org>,
	<devicetree@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<linux-mtd@lists.infradead.org>, <praneeth@ti.com>,
	<sebin.francis@ti.com>, <u-kumar1@ti.com>, <a-dutta@ti.com>,
	<s-k6@ti.com>
Subject: Re: [PATCH v9 08/18] spi: cadence-quadspi: add PHY tuning support
Date: Wed, 2 Sep 2026 15:15:24 +0530	[thread overview]
Message-ID: <ebf61988-9fe6-495b-b1e2-eaeba9f6b98f@ti.com> (raw)
In-Reply-To: <8aac0c42-fad5-4146-a2a3-b60bdab71a20@sirena.org.uk>

Hello Mark,

On 27/08/26 03:13, Mark Brown wrote:
> On Tue, Aug 25, 2026 at 10:47:27PM +0530, Santhosh Kumar K wrote:
>> The Cadence QSPI controller supports a delay-line PHY for high-speed
>> operation. Without calibration the PHY is unused and read capture relies
>> on a fixed delay, limiting throughput at frequencies above the base
>> operating speed.
> 
>> Add an execute_tuning callback that performs delay-line calibration using
>> a known data pattern written to a dedicated flash region. The pattern is
>> either read from a NOR partition identified by the DT property
>> spi-phy-pattern-partition, or written to the NAND page cache before
>> each calibration read.
> 
>>   struct cqspi_flash_pdata {
> 
>> +	bool			use_dqs;
>> +	bool			use_tuned_phy;
> 
> The AM65x has a fun erratum i2189 which mentions that it requires
> disabling DQS for writes:
> 
>     https://www.ti.com.cn/lit/er/sprz452i/sprz452i.pdf
> 
> which suggests we might need separate controls for read and write
> operation.

Thanks for pointing this out.

The DQS bit in CQSPI_REG_READCAPTURE is used for read data capture and
it's not consulted during writes.

However, the actual i2189 issue was that cqspi_tune_phy()
unconditionally set both PHY_EN and PHY_PIPELINE on both read and write 
path - non-compliant with the erratum. So, I'll split the tune_phy()
into two separate paths for read and write.

Will respin the series with this fix and some sashiko-bot fixes.

> 
>> +static int cqspi_write_pattern_to_cache(struct cqspi_flash_pdata *f_pdata,
>> +					struct spi_mem *mem,
>> +					const struct spi_mem_op *write_op)
>> +{
>> +	struct spi_controller *ctlr = mem->spi->controller;
>> +	struct device *dev = &f_pdata->cqspi->pdev->dev;
>> +	struct spi_mem_op op = *write_op;
>> +	int ret;
>> +
>> +	op.max_freq = mem->spi->max_speed_hz;
>> +	op.data.nbytes = sizeof(phy_tuning_pattern);
>> +	op.data.buf.out = phy_tuning_pattern;
>> +
>> +	ret = ctlr->mem_ops->exec_op(mem, &op);
>> +	if (ret) {
>> +		dev_err(dev, "Failed to write PHY pattern to cache: %d\n", ret);
>> +		return ret;
>> +	}
>> +	dev_dbg(dev, "PHY pattern (%zu bytes) written to cache\n",
>> +		sizeof(phy_tuning_pattern));
>> +
>> +	return 0;
>> +}
> 
> spinand_write_page() has a multi-operation sequence, I've not checked if
> any fancy flashes with DQS support actually need that.  _read_page()
> looks more straightforward.

cqspi_write_pattern_to_cache() does a PROGRAM_LOAD only (no
PROGRAM_EXECUTE), and tuning reads the pattern back from cache - no cell
wear. True for all SPI NANDs we've tested; a DQS capable device needing
EXECUTE before readback would need separate handling, but haven't seen one.

Thanks,
Santhosh.


______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/

WARNING: multiple messages have this Message-ID (diff)
From: Santhosh Kumar K <s-k6@ti.com>
To: Mark Brown <broonie@kernel.org>
Cc: <robh@kernel.org>, <krzk+dt@kernel.org>, <conor+dt@kernel.org>,
	<miquel.raynal@bootlin.com>, <richard@nod.at>, <vigneshr@ti.com>,
	<pratyush@kernel.org>, <mwalle@kernel.org>,
	<takahiro.kuwano@infineon.com>, <linux-spi@vger.kernel.org>,
	<devicetree@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<linux-mtd@lists.infradead.org>, <praneeth@ti.com>,
	<sebin.francis@ti.com>, <u-kumar1@ti.com>, <a-dutta@ti.com>,
	<s-k6@ti.com>
Subject: Re: [PATCH v9 08/18] spi: cadence-quadspi: add PHY tuning support
Date: Wed, 2 Sep 2026 15:15:24 +0530	[thread overview]
Message-ID: <ebf61988-9fe6-495b-b1e2-eaeba9f6b98f@ti.com> (raw)
In-Reply-To: <8aac0c42-fad5-4146-a2a3-b60bdab71a20@sirena.org.uk>

Hello Mark,

On 27/08/26 03:13, Mark Brown wrote:
> On Tue, Aug 25, 2026 at 10:47:27PM +0530, Santhosh Kumar K wrote:
>> The Cadence QSPI controller supports a delay-line PHY for high-speed
>> operation. Without calibration the PHY is unused and read capture relies
>> on a fixed delay, limiting throughput at frequencies above the base
>> operating speed.
> 
>> Add an execute_tuning callback that performs delay-line calibration using
>> a known data pattern written to a dedicated flash region. The pattern is
>> either read from a NOR partition identified by the DT property
>> spi-phy-pattern-partition, or written to the NAND page cache before
>> each calibration read.
> 
>>   struct cqspi_flash_pdata {
> 
>> +	bool			use_dqs;
>> +	bool			use_tuned_phy;
> 
> The AM65x has a fun erratum i2189 which mentions that it requires
> disabling DQS for writes:
> 
>     https://www.ti.com.cn/lit/er/sprz452i/sprz452i.pdf
> 
> which suggests we might need separate controls for read and write
> operation.

Thanks for pointing this out.

The DQS bit in CQSPI_REG_READCAPTURE is used for read data capture and
it's not consulted during writes.

However, the actual i2189 issue was that cqspi_tune_phy()
unconditionally set both PHY_EN and PHY_PIPELINE on both read and write 
path - non-compliant with the erratum. So, I'll split the tune_phy()
into two separate paths for read and write.

Will respin the series with this fix and some sashiko-bot fixes.

> 
>> +static int cqspi_write_pattern_to_cache(struct cqspi_flash_pdata *f_pdata,
>> +					struct spi_mem *mem,
>> +					const struct spi_mem_op *write_op)
>> +{
>> +	struct spi_controller *ctlr = mem->spi->controller;
>> +	struct device *dev = &f_pdata->cqspi->pdev->dev;
>> +	struct spi_mem_op op = *write_op;
>> +	int ret;
>> +
>> +	op.max_freq = mem->spi->max_speed_hz;
>> +	op.data.nbytes = sizeof(phy_tuning_pattern);
>> +	op.data.buf.out = phy_tuning_pattern;
>> +
>> +	ret = ctlr->mem_ops->exec_op(mem, &op);
>> +	if (ret) {
>> +		dev_err(dev, "Failed to write PHY pattern to cache: %d\n", ret);
>> +		return ret;
>> +	}
>> +	dev_dbg(dev, "PHY pattern (%zu bytes) written to cache\n",
>> +		sizeof(phy_tuning_pattern));
>> +
>> +	return 0;
>> +}
> 
> spinand_write_page() has a multi-operation sequence, I've not checked if
> any fancy flashes with DQS support actually need that.  _read_page()
> looks more straightforward.

cqspi_write_pattern_to_cache() does a PROGRAM_LOAD only (no
PROGRAM_EXECUTE), and tuning reads the pattern back from cache - no cell
wear. True for all SPI NANDs we've tested; a DQS capable device needing
EXECUTE before readback would need separate handling, but haven't seen one.

Thanks,
Santhosh.


  reply	other threads:[~2026-09-02  9:46 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
2026-08-26 21:43   ` Mark Brown
2026-08-26 21:43     ` Mark Brown
2026-09-02  9:45     ` Santhosh Kumar K [this message]
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=ebf61988-9fe6-495b-b1e2-eaeba9f6b98f@ti.com \
    --to=s-k6@ti.com \
    --cc=a-dutta@ti.com \
    --cc=broonie@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=krzk+dt@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=linux-spi@vger.kernel.org \
    --cc=miquel.raynal@bootlin.com \
    --cc=mwalle@kernel.org \
    --cc=praneeth@ti.com \
    --cc=pratyush@kernel.org \
    --cc=richard@nod.at \
    --cc=robh@kernel.org \
    --cc=sebin.francis@ti.com \
    --cc=takahiro.kuwano@infineon.com \
    --cc=u-kumar1@ti.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.