]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
spi: stm32-ospi: Increase read throughput in indirect mode
authorPatrice Chotard <patrice.chotard@foss.st.com>
Tue, 16 Dec 2025 15:31:52 +0000 (16:31 +0100)
committerPatrice Chotard <patrice.chotard@foss.st.com>
Thu, 29 Jan 2026 09:47:57 +0000 (10:47 +0100)
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 <patrick.delaunay@foss.st.com>
Signed-off-by: Patrice Chotard <patrice.chotard@foss.st.com>
drivers/spi/stm32_ospi.c

index 01b8f8e49878e89621c6f5c9a1197aa2faf5743d..9e143a735590bd08dc3e4bbeb620acc34ec1af26 100644 (file)
@@ -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;