From: kernel-TqfNSX0MhmxHKSADF0wUEw@public.gmane.org
To: Mark Brown <broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
Eric Anholt <eric-WhKQ6XTQaPysTnJN9+BGXg@public.gmane.org>,
Stefan Wahren <stefan.wahren-eS4NqCHxEME@public.gmane.org>,
linux-spi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-rpi-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
Subject: [PATCH V2 5/6] spi: bcm2835: make the lower limit for dma mode configurable
Date: Tue, 23 Apr 2019 20:15:12 +0000 [thread overview]
Message-ID: <20190423201513.8073-6-kernel@martin.sperl.org> (raw)
In-Reply-To: <20190423201513.8073-1-kernel-TqfNSX0MhmxHKSADF0wUEw@public.gmane.org>
From: Martin Sperl <kernel-TqfNSX0MhmxHKSADF0wUEw@public.gmane.org>
Under some circumstances the default 96 byte limit is not optimal.
The polling and interrupt mode of the spi-bcm2835 controller exhibit a
1 idle clock cycle which is missing when using DMA.
So when transferring a longer spi_transfer to some low spec MCU devices
without SPI FIFOs like a ATMega it means that the SPI has to get reduced
by a factor of 2 or more when using DMA mode compared to using PIO modes
to give the MCU enough time to handle the incoming spi byte and prepare
the next byte to get delivered - these extra 4+ CPU cycles that the idle
spi clock is providing allows bigger transfers to work at faster speeds
(assuming highly optimized MCU code).
So forcing the transfer to use PIO mode to geth this behaviour for
longer transfers is of advantage.
The oposite is true when (ab)using the spi MOSI line alone to control a
WS2812B RGB LED stripe, where the DMA mode makes it possible to use the
MOSI lines alone (with correct encoding) to control the LED.
So both extremes have there use cases and with this patch we allow to
control the policy on a controller wide basis.
Right now we only allow to control the limit on a controller wide basis,
but in the future it may be possible to configure this on a per spi_device
basis.
Signed-off-by: Martin Sperl <kernel-TqfNSX0MhmxHKSADF0wUEw@public.gmane.org>
---
drivers/spi/spi-bcm2835.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/spi/spi-bcm2835.c b/drivers/spi/spi-bcm2835.c
index 2d702db8689c..755e1e6d2252 100644
--- a/drivers/spi/spi-bcm2835.c
+++ b/drivers/spi/spi-bcm2835.c
@@ -73,7 +73,6 @@
#define BCM2835_SPI_FIFO_SIZE 64
#define BCM2835_SPI_FIFO_SIZE_3_4 48
-#define BCM2835_SPI_DMA_MIN_LENGTH 96
#define BCM2835_SPI_MODE_BITS (SPI_CPOL | SPI_CPHA | SPI_CS_HIGH \
| SPI_NO_CS | SPI_3WIRE)
@@ -85,6 +84,12 @@ module_param(polling_limit_us, uint, 0664);
MODULE_PARM_DESC(polling_limit_us,
"time in us to run a transfer in polling mode\n");
+/* define minimum transfer length for which we may use DMA */
+unsigned int dma_min_bytes_limit = 96;
+module_param(dma_min_bytes_limit, uint, 0664);
+MODULE_PARM_DESC(dma_min_bytes_limit,
+ "minimum number of bytes to run a transfer in dma mode - 0 disables dma-mode completely\n");
+
/**
* struct bcm2835_spi - BCM2835 SPI controller
* @regs: base address of register map
@@ -631,7 +636,7 @@ static bool bcm2835_spi_can_dma(struct spi_master *master,
struct spi_transfer *tfr)
{
/* we start DMA efforts only on bigger transfers */
- if (tfr->len < BCM2835_SPI_DMA_MIN_LENGTH)
+ if (!dma_min_bytes_limit || tfr->len < dma_min_bytes_limit)
return false;
/* BCM2835_SPI_DLEN has defined a max transfer size as
--
2.11.0
next prev parent reply other threads:[~2019-04-23 20:15 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-23 20:15 [PATCH V2 0/6] spi: bcm2835: improvements kernel
[not found] ` <20190423201513.8073-1-kernel-TqfNSX0MhmxHKSADF0wUEw@public.gmane.org>
2019-04-23 20:15 ` [PATCH V2 1/6] spi: bcm2835: bcm2835_spi_transfer_one_poll remove unnecessary argument kernel-TqfNSX0MhmxHKSADF0wUEw
2019-05-08 8:26 ` Mark Brown
[not found] ` <20190423201513.8073-2-kernel-TqfNSX0MhmxHKSADF0wUEw@public.gmane.org>
2019-05-08 9:08 ` Applied "spi: bcm2835: bcm2835_spi_transfer_one_poll remove unnecessary argument" to the spi tree Mark Brown
2019-04-23 20:15 ` [PATCH V2 3/6] spi: bcm2835: added comment about different bus behaviour of DMA mode kernel-TqfNSX0MhmxHKSADF0wUEw
2019-05-08 9:08 ` Applied "spi: bcm2835: added comment about different bus behaviour of DMA mode" to the spi tree Mark Brown
2019-04-23 20:15 ` [PATCH V2 4/6] spi: bcm2835: make the polling duration limits configurable kernel-TqfNSX0MhmxHKSADF0wUEw
2019-05-08 9:08 ` Applied "spi: bcm2835: make the polling duration limits configurable" to the spi tree Mark Brown
2019-04-23 20:15 ` kernel-TqfNSX0MhmxHKSADF0wUEw [this message]
[not found] ` <20190424070712.hh6ozvhkvkxhwak3@wunner.de>
2019-05-08 8:42 ` [PATCH V2 5/6] spi: bcm2835: make the lower limit for dma mode configurable Mark Brown
[not found] ` <20190508084205.GD14916-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2019-05-08 10:55 ` kernel-TqfNSX0MhmxHKSADF0wUEw
2019-04-23 20:15 ` [PATCH V2 6/6] spi: bcm2835: add driver stats to debugfs kernel-TqfNSX0MhmxHKSADF0wUEw
2019-05-08 9:08 ` Applied "spi: bcm2835: add driver stats to debugfs" to the spi tree Mark Brown
2019-04-23 20:15 ` [PATCH V2 2/6] spi: bcm2835: Avoid 64-bit arithmetic in xfer len calc kernel
2019-05-08 9:08 ` Applied "spi: bcm2835: Avoid 64-bit arithmetic in xfer len calc" to the spi tree Mark Brown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190423201513.8073-6-kernel@martin.sperl.org \
--to=kernel-tqfnsx0mhmxhksadf0wuew@public.gmane.org \
--cc=broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=eric-WhKQ6XTQaPysTnJN9+BGXg@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-rpi-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-spi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=stefan.wahren-eS4NqCHxEME@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).