On Tue, Oct 15, 2019 at 05:32:36PM +0300, Andy Shevchenko wrote:
On Fri, Jul 19, 2019 at 05:59:10PM +0200, Noralf Trønnes wrote:
spi-bcm2835 can handle >64kB buffers now so there is no need to check ->max_dma_len. The tinydrm_spi_max_transfer_size() max_len argument is not used by any callers, so not needed.
Then we have the spi_max module parameter. It was added because staging/fbtft has support for it and there was a report that someone used it to set a small buffer size to avoid popping on a USB soundcard on a Raspberry Pi. In hindsight it shouldn't have been added, I should have waited for it to become a problem first. I don't know it anyone is actually using it, but since tinydrm_spi_transfer() is being moved to mipi-dbi, I'm taking the opportunity to remove it. I'll add it back to mipi-dbi if someone complains.
With that out of the way, spi_max_transfer_size() can be used instead.
The chosen 16kB buffer size for Type C Option 1 (9-bit) interface is somewhat arbitrary, but a bigger buffer will have a miniscule impact on transfer speed, so it's probably fine.
This breaks the SPI PXA2xx case I'm using. The world is not a Pi:e.
[ 388.445752] mi0283qt spi-PRP0001:01: DMA disabled for transfer length 153600 greater than 65536 [ 388.634437] mi0283qt spi-PRP0001:01: DMA disabled for transfer length 153600 greater than 65536 [ 388.822933] mi0283qt spi-PRP0001:01: DMA disabled for transfer length 153600 greater than 65536
The crucial thing is to check the transfer size against maximum DMA length of the master.
Please, fix.
Partial revert fixes the issue, though I'm not sure it's the best approach.
--- a/drivers/gpu/drm/drm_mipi_dbi.c +++ b/drivers/gpu/drm/drm_mipi_dbi.c @@ -1147,7 +1147,7 @@ EXPORT_SYMBOL(mipi_dbi_spi_init); int mipi_dbi_spi_transfer(struct spi_device *spi, u32 speed_hz, u8 bpw, const void *buf, size_t len) { - size_t max_chunk = spi_max_transfer_size(spi); + size_t max_chunk = min(spi_max_transfer_size(spi), spi->master->max_dma_len); struct spi_transfer tr = { .bits_per_word = bpw, .speed_hz = speed_hz,