summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrice Chotard <[email protected]>2025-12-16 16:31:52 +0100
committerPatrice Chotard <[email protected]>2026-01-29 10:47:57 +0100
commit9e8bc1c6be751b59e1d782dff3c0cc8703cc18d4 (patch)
tree107492ba63dfa0c37af613e0fc996c487faff965
parent6a1bdb7e952d5841f42742fefa907cae5dc8d50a (diff)
spi: stm32-ospi: Increase read throughput in indirect mode
Schedule() is called every u8/u16 or u32 read accesses which is overkill. Move schedule() from stm32_ospi_read_fifo() to stm32_ospi_tx_poll() and call schedule() only every 1MB chunk of data. Test performed by reading 64MB on sNOR on stm32mp257f-ev1 board: before after ratio Read : 10.6MB/s 14.2MB/s +34% Reviewed-by: Patrick Delaunay <[email protected]> Signed-off-by: Patrice Chotard <[email protected]>
-rw-r--r--drivers/spi/stm32_ospi.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/spi/stm32_ospi.c b/drivers/spi/stm32_ospi.c
index 01b8f8e4987..9e143a73559 100644
--- a/drivers/spi/stm32_ospi.c
+++ b/drivers/spi/stm32_ospi.c
@@ -142,7 +142,6 @@ static void stm32_ospi_read_fifo(void *val, phys_addr_t addr, u8 len)
case sizeof(u8):
*((u8 *)val) = readb_relaxed(addr);
};
- schedule();
}
static void stm32_ospi_write_fifo(void *val, phys_addr_t addr, u8 len)
@@ -200,6 +199,9 @@ int stm32_ospi_tx_poll(struct udevice *dev, void *buf, u32 len, bool read)
fifo(buf, regs_base + OSPI_DR, step);
len -= step;
buf += step;
+
+ if (!(len % SZ_1M))
+ schedule();
}
return 0;