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

Patrick DELAUNAY patrick.delaunay at foss.st.com
Mon Jan 19 14:00:47 CET 2026


Hi,

On 12/16/25 16:31, Patrice Chotard wrote:
> 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;
>

Reviewed-by: Patrick Delaunay <patrick.delaunay at foss.st.com>

Thanks
Patrick




More information about the U-Boot mailing list