[PATCH 1/3] spi: stm32-ospi: Increase read throughput in indirect mode

Patrice Chotard patrice.chotard at foss.st.com
Tue Dec 16 16:31:52 CET 2025


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%

Signed-off-by: Patrice Chotard <patrice.chotard at foss.st.com>
---
 drivers/spi/stm32_ospi.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

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;

-- 
2.43.0



More information about the U-Boot mailing list