Re: [PATCH v4 5/6] spi: spi-fsl-dspi: Increase DMA buffer size

From: Vladimir Oltean
Date: Tue Jul 01 2025 - 10:47:32 EST


On Fri, Jun 27, 2025 at 11:21:41AM +0100, James Clark wrote:
> diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c
> index e7856f9c9440..46d3cae9efed 100644
> --- a/drivers/spi/spi-fsl-dspi.c
> +++ b/drivers/spi/spi-fsl-dspi.c
> @@ -493,6 +493,39 @@ static u32 dspi_pop_tx_pushr(struct fsl_dspi *dspi)
> return cmd << 16 | data;
> }
>
> +static int dspi_dma_bufsize(struct fsl_dspi *dspi)
> +{
> + if (spi_controller_is_target(dspi->ctlr)) {
> + /*
> + * In target mode we have to be ready to receive the maximum
> + * that can possibly be transferred at once by EDMA without any
> + * FIFO underflows. This is CITER * SSIZE, where SSIZE is a max
> + * of 4 when transferring to a peripheral.
> + */
> + return GENMASK(14, 0) * DMA_SLAVE_BUSWIDTH_4_BYTES;

Is this really a constant that can be hardcoded? Should this be queried
from the EDMA driver somehow?

I'm not well versed in the dmaengine/dma-mapping API at all, but I see
fsl_edma_probe() makes a call to dma_set_max_seg_size(), which consumer
drivers such as DSPI can query using dma_get_max_seg_size(). To the
untrained eye, and from a great distance, it looks like the value you're
interested in. Apologies if that isn't the case.

> + }
> +
> + return PAGE_SIZE;
> +}

The other question is: what's fundamentally different between the host
and target operating modes, such that we return different values? Why
not the same?