From: sashiko-bot@kernel.org
To: "Santhosh Kumar K" <s-k6@ti.com>
Cc: devicetree@vger.kernel.org, robh@kernel.org, conor+dt@kernel.org
Subject: Re: [PATCH v10 08/19] spi: cadence-quadspi: add PHY tuning support
Date: Tue, 29 Sep 2026 06:57:12 +0000 [thread overview]
Message-ID: <20260929065713.4AD921F000FF@smtp.kernel.org> (raw)
In-Reply-To: <20260929063529.1235417-9-s-k6@ti.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] spi: cadence-quadspi: infinite loop in cqspi_find_rx_high_sdr() on underflow
- [Medium] spi: cadence-quadspi: masking of -ENOMEM in PHY tuning loops
--
commit 62a3174b365e4277190116eb19dbdefea81fa88c
Author: Santhosh Kumar K <s-k6@ti.com>
spi: cadence-quadspi: add PHY tuning support
This commit adds PHY tuning support for the Cadence QSPI controller. It
introduces a calibration sequence that reads a known data pattern to determine
optimal RX and TX delays for DDR and SDR protocols. The tuning ensures
reliable high-speed operation by selecting the midpoint of the passing timing
window.
> diff --git a/drivers/spi/spi-cadence-quadspi.c b/drivers/spi/spi-cadence-quadspi.c
> index 046fa5d69b0f7..e21164419b00f 100644
> --- a/drivers/spi/spi-cadence-quadspi.c
> +++ b/drivers/spi/spi-cadence-quadspi.c
[ ... ]
> @@ -1559,10 +1718,1572 @@ static bool cqspi_supports_mem_op(struct spi_mem *mem,
[ ... ]
> +static int cqspi_phy_check_pattern(struct cqspi_flash_pdata *f_pdata,
> + struct spi_mem *mem)
> +{
> + struct spi_controller *ctlr = mem->spi->controller;
> + struct spi_mem_op op;
> + u8 *read_data;
> + int ret;
> +
> + read_data = kmalloc_array(ARRAY_SIZE(phy_tuning_pattern),
> + sizeof(phy_tuning_pattern[0]), GFP_KERNEL);
> + if (!read_data)
> + return -ENOMEM;
[ ... ]
> +static int cqspi_find_rx_low_ddr(struct cqspi_flash_pdata *f_pdata,
> + struct spi_mem *mem, struct cqspi_phy_setting *phy)
> +{
> + struct device *dev = &f_pdata->cqspi->pdev->dev;
> + int ret;
> +
> + do {
> + phy->rx = CQSPI_PHY_RX_LOW_SEARCH_START;
> + 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 += CQSPI_PHY_DDR_SEARCH_STEP;
> + } while (phy->rx <= CQSPI_PHY_RX_LOW_SEARCH_END);
[Severity: Medium]
Will this correctly handle and propagate memory allocation failures?
The function cqspi_phy_check_pattern() returns -ENOMEM if kmalloc_array()
fails. However, this tuning loop (along with the other tuning loops) only
evaluates if (!ret).
If an -ENOMEM error is returned, the loop advances to the next delay tap and
pointlessly retries the allocation instead of aborting. Can we differentiate
between a pattern mismatch (-EAGAIN) and a fatal allocation failure (-ENOMEM)
so the controller avoids looping over the entire tuning grid under memory
pressure?
[ ... ]
> +static int cqspi_find_rx_high_sdr(struct cqspi_flash_pdata *f_pdata,
> + struct spi_mem *mem, struct cqspi_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: High]
Does this loop terminate if lowerbound is 0 and the pattern is never found?
Since phy->rx is an unsigned 8-bit integer, if it reaches 0 and the pattern
check fails, the phy->rx-- decrement will underflow to 255. Because 255 >= 0
is always true, won't this result in an infinite loop?
This sequence seems reachable during hardware probe from cqspi_phy_tuning_sdr()
where cqspi_find_rx_high_sdr() is called with rxlow.rx as the lowerbound,
which can be 0.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260929063529.1235417-1-s-k6@ti.com?part=8
next prev parent reply other threads:[~2026-09-29 6:57 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-29 6:35 [PATCH v10 00/19] spi: cadence-quadspi: add PHY tuning support Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 6:35 ` [PATCH v10 01/19] spi: dt-bindings: add spi-max-post-config-frequency-hz property Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 6:35 ` [PATCH v10 02/19] spi: dt-bindings: add spi-phy-pattern-partition property Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 6:35 ` [PATCH v10 03/19] spi: parse spi-max-post-config-frequency-hz into post_config_max_speed_hz Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 6:48 ` sashiko-bot
2026-09-29 6:35 ` [PATCH v10 04/19] spi: spi-mem: teach spi_mem_adjust_op_freq() about post-config ops Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 6:51 ` sashiko-bot
2026-09-29 6:35 ` [PATCH v10 05/19] spi: spi-mem: add execute_tuning callback and spi_mem_execute_tuning() Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 6:35 ` [PATCH v10 06/19] spi: cadence-quadspi: move cqspi_readdata_capture earlier Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 6:35 ` [PATCH v10 07/19] spi: cadence-quadspi: add DQS support to read data capture Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 6:51 ` sashiko-bot
2026-09-29 6:35 ` [PATCH v10 08/19] spi: cadence-quadspi: add PHY tuning support Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 6:57 ` sashiko-bot [this message]
2026-09-29 6:35 ` [PATCH v10 09/19] spi: cadence-quadspi: skip DDR PHY tuning for 2-byte-address ops (i2383) Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 6:35 ` [PATCH v10 10/19] spi: cadence-quadspi: refactor direct read path for PHY support Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 6:35 ` [PATCH v10 11/19] spi: cadence-quadspi: enable PHY for direct reads Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 6:59 ` sashiko-bot
2026-09-29 6:35 ` [PATCH v10 12/19] spi: cadence-quadspi: enable PHY for indirect writes Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 7:00 ` sashiko-bot
2026-09-29 6:35 ` [PATCH v10 13/19] spi: cadence-quadspi: reprogram CS timing on every chip-select switch Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 6:35 ` [PATCH v10 14/19] spi: cadence-quadspi: reprogram PHY DLL on runtime resume Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 6:35 ` [PATCH v10 15/19] mtd: spinand: extract variant ranking logic into spinand_op_find_best_variant() Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 6:35 ` [PATCH v10 16/19] mtd: spinand: negotiate optimal controller operating point before dirmap creation Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 6:35 ` [PATCH v10 17/19] mtd: spi-nor: extract read op template construction into helper Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 6:35 ` [PATCH v10 18/19] mtd: spi-nor: run controller optimization before dirmap creation Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
2026-09-29 6:35 ` [PATCH v10 19/19] mtd: spi-nor: reset max_read_op frequency for security register reads Santhosh Kumar K
2026-09-29 6:35 ` Santhosh Kumar K
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=20260929065713.4AD921F000FF@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=robh@kernel.org \
--cc=s-k6@ti.com \
--cc=sashiko-reviews@lists.linux.dev \
/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.