linux/drivers/spi
Mark Brown b005d618c8
spi: cadence-quadspi: Prevent indirect read
Merge series from Mateusz Litwin <mateusz.litwin@nokia.com>:

On the Stratix10 platform, indirect reads can become very slow due to lost
interrupts and/or missed `complete()` calls, causing
`wait_for_completion_timeout()` to expire.

Three issues were identified:
1) A race condition exists between the read loop and IRQ `complete()`
   call:
   An IRQ can call `complete()` after the inner loop ends, but before
   `reinit_completion()`, losing the completion event and leading to
   `wait_for_completion_timeout()` expire. This function will not return
   an error because `bytes_to_read` > 0 (indicating data is already in the
   FIFO) and the final `ret` value is overwritten by
   `cqspi_wait_for_bit()` return value (indicating request completion),
   masking the timeout.

   For test purpose, logging was added to print the count of timeouts and
   the outer loop count.
   $ dd if=/dev/mtd0 of=/dev/null bs=64M count=1
   [ 2232.925219] cadence-qspi ff8d2000.spi: Indirect read error timeout
    (1) loop (12472)
   [ 2236.200391] cadence-qspi ff8d2000.spi: Indirect read error timeout
    (1) loop (12460)
   [ 2239.482836] cadence-qspi ff8d2000.spi: Indirect read error timeout
    (5) loop (12450)
   This indicates that such an event is rare, but possible.
   Tested on the Stratix10 platform.

2) The quirk assumes the indirect read path never leaves the inner loop on
   SoCFPGA. This assumption is incorrect when using slow flash. Disabling
   IRQs in the inner loop can cause lost interrupts.

3) The `CQSPI_SLOW_SRAM` quirk disables `CQSPI_REG_IRQ_IND_COMP` (indirect
   completion) interrupt, relying solely on the `CQSPI_REG_IRQ_WATERMARK`
   (FIFO watermark) interrupt. For small transfers sizes, the final data
   read might not fill the FIFO sufficiently to trigger the watermark,
   preventing completion and leading to wait_for_completion_timeout()
   expiration.

Two patches have been prepared to resolve these issues.
-  [1/2] spi: cadence-quadspi: Prevent lost complete() call during
   indirect read
   Moving `reinit_completion()` before the inner loop prevents a race
   condition. This might cause a premature IRQ complete() call to occur;
   however, in the worst case, this will result in a spurious wakeup and
   another wait cycle, which is preferable to waiting for a timeout.

-  [2/2] spi: cadence-quadspi: Improve CQSPI_SLOW_SRAM quirk if flash is
   slow
   Re-enabling `CQSPI_REG_IRQ_IND_COMP` interrupt resolves the problem for
   small reads and removes the disabling of interrupts, addressing the
   issue with lost interrupts. This marginally increases the IRQ count.

   Test:
   $ dd if=/dev/mtd0 of=/dev/null bs=1M count=64
   Results from the Stratix10 platform with mt25qu02g flash.
   FIFO size in all tests: 128

   Serviced interrupt call counts:
   Without `CQSPI_SLOW_SRAM` quirk: 16 668 850
   With `CQSPI_SLOW_SRAM` quirk: 204 176
   With `CQSPI_SLOW_SRAM` and this patch: 224 528

Patch 2/2: Delivers a substantial read‑performance improvement for the
Cadence QSPI controller on the Stratix10 platform. Patch 1/2: Applies to
all platforms and should yield a modest performance gain, most noticeable
with large `CQSPI_READ_TIMEOUT_MS` values and workloads dominated by many
small reads.
2025-12-23 15:18:22 +00:00
..
Kconfig spi: Updates for v6.19 2025-12-04 11:24:24 -08:00
Makefile spi: add support for microchip "soft" spi controller 2025-11-14 13:54:43 +00:00
atmel-quadspi.c
internals.h
spi-airoha-snfi.c spi: airoha-snfi: en7523: workaround flash damaging if UART_TXD was short to GND 2025-11-27 11:42:15 +00:00
spi-altera-core.c
spi-altera-dfl.c
spi-altera-platform.c
spi-amd-pci.c
spi-amd.c
spi-amd.h
spi-amlogic-spifc-a1.c spi: amlogic-spifc-a1: Handle devm_pm_runtime_enable() errors 2025-11-24 11:31:27 +00:00
spi-amlogic-spifc-a4.c spi: amlogic: fix spifc build error 2025-10-15 14:09:57 +01:00
spi-amlogic-spisg.c
spi-apple.c
spi-ar934x.c
spi-armada-3700.c
spi-aspeed-smc.c spi: aspeed: Add support for the AST2700 SPI controller 2025-11-17 00:49:57 +00:00
spi-at91-usart.c
spi-ath79.c
spi-atmel.c
spi-au1550.c
spi-axi-spi-engine.c
spi-bcm-qspi.c
spi-bcm-qspi.h
spi-bcm63xx-hsspi.c
spi-bcm63xx.c spi: Updates for v6.19 2025-12-04 11:24:24 -08:00
spi-bcm2835.c
spi-bcm2835aux.c
spi-bcmbca-hsspi.c
spi-bitbang-txrx.h
spi-bitbang.c
spi-brcmstb-qspi.c
spi-butterfly.c
spi-cadence-quadspi.c spi: cadence-quadspi: Improve CQSPI_SLOW_SRAM quirk if flash is slow 2025-12-23 10:58:57 +00:00
spi-cadence-xspi.c
spi-cadence.c spi: spi-cadence: supports transmission with bits_per_word of 16 and 32 2025-11-13 18:56:49 +00:00
spi-cavium-octeon.c
spi-cavium-thunderx.c
spi-cavium.c
spi-cavium.h
spi-ch341.c spi: ch341: fix out-of-bounds memory access in ch341_transfer_one 2025-11-28 11:48:08 +00:00
spi-clps711x.c
spi-coldfire-qspi.c
spi-cs42l43.c spi: cs42l43: Use actual ACPI firmware node for chip selects 2025-11-20 16:51:48 +01:00
spi-davinci.c spi: davinci: remove platform data header 2025-11-17 17:27:38 +00:00
spi-dln2.c
spi-dw-bt1.c spi: dw: rename the spi controller to ctlr 2025-10-13 11:27:35 +01:00
spi-dw-core.c spi: dw: add target mode support 2025-10-13 11:27:36 +01:00
spi-dw-dma.c spi: dw: rename the spi controller to ctlr 2025-10-13 11:27:35 +01:00
spi-dw-mmio.c spi: dw: add target mode support 2025-10-13 11:27:36 +01:00
spi-dw-pci.c spi: dw: rename the spi controller to ctlr 2025-10-13 11:27:35 +01:00
spi-dw.h spi: dw: rename the spi controller to ctlr 2025-10-13 11:27:35 +01:00
spi-ep93xx.c
spi-falcon.c
spi-fsi.c
spi-fsl-cpm.c
spi-fsl-cpm.h
spi-fsl-dspi.c
spi-fsl-espi.c
spi-fsl-lib.c
spi-fsl-lib.h
spi-fsl-lpspi.c spi: spi-fsl-lpspi: fix watermark truncation caused by type cast 2025-11-21 14:23:45 +00:00
spi-fsl-qspi.c spi: fsl-qspi: support the SpacemiT K1 SoC 2025-11-06 16:57:36 +00:00
spi-fsl-spi.c spi: fsl-cpm: Check length parity before switching to 16 bit mode 2025-12-14 19:32:49 +09:00
spi-fsl-spi.h
spi-geni-qcom.c
spi-gpio.c
spi-gxp.c
spi-hisi-kunpeng.c
spi-hisi-sfc-v3xx.c
spi-img-spfi.c
spi-imx.c Add RSPI support for RZ/T2H and RZ/N2H 2025-11-24 19:25:58 +00:00
spi-ingenic.c
spi-intel-pci.c spi: intel: Add support for Oak Stream SPI serial flash 2025-10-29 12:53:45 +00:00
spi-intel-platform.c
spi-intel.c spi: intel: Add support for 128M component density 2025-10-20 16:15:29 +01:00
spi-intel.h
spi-iproc-qspi.c
spi-jcore.c
spi-kspi2.c
spi-lantiq-ssc.c
spi-ljca.c
spi-lm70llp.c
spi-loongson-core.c
spi-loongson-pci.c
spi-loongson-plat.c
spi-loongson.h
spi-loopback-test.c
spi-lp8841-rtc.c
spi-mem.c spi: spi-mem: Trace exec_op 2025-10-27 11:10:50 +00:00
spi-meson-spicc.c
spi-meson-spifc.c
spi-microchip-core-qspi.c
spi-microchip-core-spi.c spi: microchip-core: Fix an error handling path in mchp_corespi_probe() 2025-12-09 10:01:32 +09:00
spi-mpc52xx-psc.c
spi-mpc52xx.c
spi-mpc512x-psc.c
spi-mpfs.c spi: mpfs: Fix an error handling path in mpfs_spi_probe() 2025-12-14 19:32:48 +09:00
spi-mt65xx.c spi: mt65xx: Use IRQF_ONESHOT with threaded IRQ 2025-12-17 12:01:17 +00:00
spi-mt7621.c
spi-mtk-nor.c
spi-mtk-snfi.c
spi-mux.c
spi-mxic.c
spi-mxs.c
spi-npcm-fiu.c
spi-npcm-pspi.c
spi-nxp-fspi.c spi: nxp-fspi: Propagate fwnode in ACPI case as well 2025-11-27 11:41:06 +00:00
spi-oc-tiny.c
spi-offload-trigger-adi-util-sigma-delta.c
spi-offload-trigger-pwm.c spi: offload: Add offset parameter 2025-10-13 11:27:52 +01:00
spi-offload.c
spi-omap-uwire.c
spi-omap2-mcspi.c
spi-orion.c
spi-pci1xxxx.c
spi-pic32-sqi.c
spi-pic32.c
spi-pl022.c
spi-ppc4xx.c
spi-pxa2xx-dma.c
spi-pxa2xx-pci.c
spi-pxa2xx-platform.c
spi-pxa2xx.c
spi-pxa2xx.h
spi-qcom-qspi.c
spi-qpic-snand.c spi: spi-qpic-snand: make qcom_spi_ecc_engine_ops_pipelined const 2025-10-23 14:10:53 +01:00
spi-qup.c
spi-rb4xx.c
spi-realtek-rtl-snand.c
spi-realtek-rtl.c
spi-rockchip-sfc.c
spi-rockchip.c
spi-rpc-if.c
spi-rspi.c
spi-rzv2h-rspi.c spi: rzv2h-rspi: add support for RZ/T2H and RZ/N2H 2025-11-24 14:10:48 +00:00
spi-rzv2m-csi.c
spi-s3c64xx.c
spi-sc18is602.c
spi-sg2044-nor.c spi: sophgo: Fix incorrect use of bus width value macros 2025-11-18 23:15:11 +00:00
spi-sh-hspi.c
spi-sh-msiof.c
spi-sh-sci.c
spi-sh.c
spi-sifive.c
spi-slave-mt27xx.c
spi-slave-system-control.c
spi-slave-time.c
spi-sn-f-ospi.c
spi-sprd-adi.c
spi-sprd.c
spi-st-ssc4.c
spi-stm32-ospi.c
spi-stm32-qspi.c
spi-stm32.c
spi-sun4i.c
spi-sun6i.c spi: sun6i: Support A523's SPI controllers 2025-12-22 09:00:50 +00:00
spi-sunplus-sp7021.c
spi-synquacer.c
spi-tegra20-sflash.c
spi-tegra20-slink.c
spi-tegra114.c
spi-tegra210-quad.c spi: tegra210-quad: Check hardware status on timeout 2025-11-04 16:48:55 +00:00
spi-test.h
spi-ti-qspi.c
spi-tle62x0.c spi: tle62x0: Add newline to sysfs attribute output 2025-10-30 13:08:11 +00:00
spi-topcliff-pch.c
spi-uniphier.c
spi-virtio.c
spi-wpcm-fiu.c
spi-xcomm.c
spi-xilinx.c spi: xilinx: increase number of retries before declaring stall 2025-11-07 09:37:46 +00:00
spi-xlp.c
spi-xtensa-xtfpga.c
spi-zynq-qspi.c
spi-zynqmp-gqspi.c
spi.c spi: Add TODO comment about ACPI GPIO setup 2025-11-10 14:03:53 +00:00
spidev.c spi: spidev: add compatible for arduino spi mcu interface 2025-11-20 17:22:39 +00:00