Message ID | 1487327904-28311-6-git-send-email-fisaksen@baylibre.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Feb 17, 2017 at 11:38 AM, Frode Isaksen <fisaksen@baylibre.com> wrote: > Higher bitrate and lower CPU load if using PIO in this case. > > Signed-off-by: Frode Isaksen <fisaksen@baylibre.com> > --- > drivers/spi/spi-davinci.c | 13 +++++++------ > 1 file changed, 7 insertions(+), 6 deletions(-) > > diff --git a/drivers/spi/spi-davinci.c b/drivers/spi/spi-davinci.c > index b69a370..826bff1 100644 > --- a/drivers/spi/spi-davinci.c > +++ b/drivers/spi/spi-davinci.c > @@ -110,6 +110,8 @@ > #define SPIDEF 0x4c > #define SPIFMT0 0x50 > > +#define DMA_MIN_BYTES 16 16 seems low as the cutoff. Have you found this experimentally and tested that for e.g. 32 bytes there is actually an advantage in using DMA? Arnd -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 17/02/2017 17:37, Arnd Bergmann wrote: > On Fri, Feb 17, 2017 at 11:38 AM, Frode Isaksen <fisaksen@baylibre.com> wrote: >> Higher bitrate and lower CPU load if using PIO in this case. >> >> Signed-off-by: Frode Isaksen <fisaksen@baylibre.com> >> --- >> drivers/spi/spi-davinci.c | 13 +++++++------ >> 1 file changed, 7 insertions(+), 6 deletions(-) >> >> diff --git a/drivers/spi/spi-davinci.c b/drivers/spi/spi-davinci.c >> index b69a370..826bff1 100644 >> --- a/drivers/spi/spi-davinci.c >> +++ b/drivers/spi/spi-davinci.c >> @@ -110,6 +110,8 @@ >> #define SPIDEF 0x4c >> #define SPIFMT0 0x50 >> >> +#define DMA_MIN_BYTES 16 > 16 seems low as the cutoff. Have you found this experimentally and > tested that for e.g. 32 > bytes there is actually an advantage in using DMA? Yes, I have tested for different sizes. Actually 32 bytes is better @30MHz, but if the bit rate goes down, DMA wins over PIO. Do you prefer 32 bytes ? Frode > > Arnd -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Fri, Feb 17, 2017 at 5:43 PM, Frode Isaksen <fisaksen@baylibre.com> wrote: > On 17/02/2017 17:37, Arnd Bergmann wrote: >> On Fri, Feb 17, 2017 at 11:38 AM, Frode Isaksen <fisaksen@baylibre.com> wrote: >> 16 seems low as the cutoff. Have you found this experimentally and >> tested that for e.g. 32 >> bytes there is actually an advantage in using DMA? > Yes, I have tested for different sizes. Actually 32 bytes is better @30MHz, but if the bit rate goes down, DMA wins over PIO. Do you prefer 32 bytes ? No, I don't care about the specific value, just making sure that you had actually tested this, as I had expected PIO to be faster here. Arnd -- To unsubscribe from this list: send the line "unsubscribe linux-spi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/spi/spi-davinci.c b/drivers/spi/spi-davinci.c index b69a370..826bff1 100644 --- a/drivers/spi/spi-davinci.c +++ b/drivers/spi/spi-davinci.c @@ -110,6 +110,8 @@ #define SPIDEF 0x4c #define SPIFMT0 0x50 +#define DMA_MIN_BYTES 16 + /* SPI Controller driver's private data. */ struct davinci_spi { struct spi_bitbang bitbang; @@ -483,7 +485,7 @@ static bool davinci_spi_can_dma(struct spi_master *master, struct spi_device *spi, struct spi_transfer *xfer) { - return __davinci_spi_can_dma(spi); + return __davinci_spi_can_dma(spi) && (xfer->len >= DMA_MIN_BYTES); } static int davinci_spi_check_error(struct davinci_spi *dspi, int int_status) @@ -622,10 +624,9 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t) reinit_completion(&dspi->done); - if (spicfg->io_type == SPI_IO_TYPE_INTR) - set_io_bits(dspi->base + SPIINT, SPIINT_MASKINT); - - if (spicfg->io_type != SPI_IO_TYPE_DMA) { + if (!davinci_spi_can_dma(spi->master, spi, t)) { + if (spicfg->io_type != SPI_IO_TYPE_POLL) + set_io_bits(dspi->base + SPIINT, SPIINT_MASKINT); /* start the transfer */ dspi->wcount--; tx_data = dspi->get_tx(dspi); @@ -706,7 +707,7 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t) } clear_io_bits(dspi->base + SPIINT, SPIINT_MASKALL); - if (spicfg->io_type == SPI_IO_TYPE_DMA) { + if (davinci_spi_can_dma(spi->master, spi, t)) { clear_io_bits(dspi->base + SPIINT, SPIINT_DMA_REQ_EN); if (is_vmalloc_addr(t->rx_buf)) /* VIVT cache: invalidate since addr. may be aliased */
Higher bitrate and lower CPU load if using PIO in this case. Signed-off-by: Frode Isaksen <fisaksen@baylibre.com> --- drivers/spi/spi-davinci.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)