Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1247665 > unrolled thread
| Started by | John Ogness <john.ogness@linutronix.de> |
|---|---|
| First post | 2015-10-15 12:50 +0200 |
| Last post | 2015-10-16 13:30 +0200 |
| Articles | 4 — 2 participants |
Back to article view | Back to linux.kernel
[PATCH] ARM: edma: special case slot limit workaround John Ogness <john.ogness@linutronix.de> - 2015-10-15 12:50 +0200
Re: [PATCH] ARM: edma: special case slot limit workaround Peter Ujfalusi <peter.ujfalusi@ti.com> - 2015-10-15 13:10 +0200
[PATCH v2] ARM: edma: special case slot limit workaround John Ogness <john.ogness@linutronix.de> - 2015-10-16 12:50 +0200
Re: [PATCH v2] ARM: edma: special case slot limit workaround Peter Ujfalusi <peter.ujfalusi@ti.com> - 2015-10-16 13:30 +0200
| From | John Ogness <john.ogness@linutronix.de> |
|---|---|
| Date | 2015-10-15 12:50 +0200 |
| Subject | [PATCH] ARM: edma: special case slot limit workaround |
| Message-ID | <qjOgG-3WB-13@gated-at.bofh.it> |
Currently drivers are limited to 19 slots for cyclic transfers.
However, if the DMA burst size is the same as the period size,
the period size can be changed to the full buffer size and
intermediate interrupts activated. Since intermediate interrupts
will trigger for each burst and the burst size is the same as
the period size, the driver will get interrupts each period as
expected. This has the benefit of allowing the functionality of
many more slots, but only uses 2 slots.
This workaround is only active if more than 19 slots are needed
and the burst size matches the period size.
Signed-off-by: John Ogness <john.ogness@linutronix.de>
---
drivers/dma/edma.c | 25 ++++++++++++++++++++++---
1 file changed, 22 insertions(+), 3 deletions(-)
diff --git a/drivers/dma/edma.c b/drivers/dma/edma.c
index 493c774..16bd193 100644
--- a/drivers/dma/edma.c
+++ b/drivers/dma/edma.c
@@ -585,6 +585,7 @@ static struct dma_async_tx_descriptor *edma_prep_dma_cyclic(
struct edma_desc *edesc;
dma_addr_t src_addr, dst_addr;
enum dma_slave_buswidth dev_width;
+ bool use_intermediate = false;
u32 burst;
int i, ret, nslots;
@@ -626,8 +627,21 @@ static struct dma_async_tx_descriptor *edma_prep_dma_cyclic(
* but the synchronization is difficult to achieve with Cyclic and
* cannot be guaranteed, so we error out early.
*/
- if (nslots > MAX_NR_SG)
- return NULL;
+ if (nslots > MAX_NR_SG) {
+ /*
+ * If the burst and period sizes are the same, we can put
+ * the full buffer into a single period and activate
+ * intermediate interrupts. This will produce interrupts
+ * after each burst, which is also after each desired period.
+ */
+ if (burst == period_len) {
+ period_len = buf_len;
+ nslots = 2;
+ use_intermediate = true;
+ } else {
+ return NULL;
+ }
+ }
edesc = kzalloc(sizeof(*edesc) + nslots *
sizeof(edesc->pset[0]), GFP_ATOMIC);
@@ -706,8 +720,13 @@ static struct dma_async_tx_descriptor *edma_prep_dma_cyclic(
/*
* Enable period interrupt only if it is requested
*/
- if (tx_flags & DMA_PREP_INTERRUPT)
+ if (tx_flags & DMA_PREP_INTERRUPT) {
edesc->pset[i].param.opt |= TCINTEN;
+
+ /* Also enable intermediate interrupts if necessary */
+ if (use_intermediate)
+ edesc->pset[i].param.opt |= ITCINTEN;
+ }
}
/* Place the cyclic channel to highest priority queue */
--
1.7.10.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | Peter Ujfalusi <peter.ujfalusi@ti.com> |
|---|---|
| Date | 2015-10-15 13:10 +0200 |
| Message-ID | <qjOA1-4Aq-11@gated-at.bofh.it> |
| In reply to | #1247665 |
On 10/15/2015 01:48 PM, John Ogness wrote:
> Currently drivers are limited to 19 slots for cyclic transfers.
> However, if the DMA burst size is the same as the period size,
> the period size can be changed to the full buffer size and
> intermediate interrupts activated. Since intermediate interrupts
> will trigger for each burst and the burst size is the same as
> the period size, the driver will get interrupts each period as
> expected. This has the benefit of allowing the functionality of
> many more slots, but only uses 2 slots.
>
> This workaround is only active if more than 19 slots are needed
> and the burst size matches the period size.
To: Vinod
CC: l-o, Sekhar at least
>
> Signed-off-by: John Ogness <john.ogness@linutronix.de>
> ---
> drivers/dma/edma.c | 25 ++++++++++++++++++++++---
> 1 file changed, 22 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/dma/edma.c b/drivers/dma/edma.c
> index 493c774..16bd193 100644
> --- a/drivers/dma/edma.c
> +++ b/drivers/dma/edma.c
> @@ -585,6 +585,7 @@ static struct dma_async_tx_descriptor *edma_prep_dma_cyclic(
> struct edma_desc *edesc;
> dma_addr_t src_addr, dst_addr;
> enum dma_slave_buswidth dev_width;
> + bool use_intermediate = false;
> u32 burst;
> int i, ret, nslots;
>
> @@ -626,8 +627,21 @@ static struct dma_async_tx_descriptor *edma_prep_dma_cyclic(
> * but the synchronization is difficult to achieve with Cyclic and
> * cannot be guaranteed, so we error out early.
> */
> - if (nslots > MAX_NR_SG)
> - return NULL;
> + if (nslots > MAX_NR_SG) {
> + /*
> + * If the burst and period sizes are the same, we can put
> + * the full buffer into a single period and activate
> + * intermediate interrupts. This will produce interrupts
> + * after each burst, which is also after each desired period.
> + */
> + if (burst == period_len) {
> + period_len = buf_len;
> + nslots = 2;
> + use_intermediate = true;
> + } else {
> + return NULL;
> + }
> + }
>
> edesc = kzalloc(sizeof(*edesc) + nslots *
> sizeof(edesc->pset[0]), GFP_ATOMIC);
> @@ -706,8 +720,13 @@ static struct dma_async_tx_descriptor *edma_prep_dma_cyclic(
> /*
> * Enable period interrupt only if it is requested
> */
> - if (tx_flags & DMA_PREP_INTERRUPT)
> + if (tx_flags & DMA_PREP_INTERRUPT) {
> edesc->pset[i].param.opt |= TCINTEN;
> +
> + /* Also enable intermediate interrupts if necessary */
> + if (use_intermediate)
> + edesc->pset[i].param.opt |= ITCINTEN;
> + }
> }
The workaround looks fine, but please rebase it on the latest edma code from
linux-next.
--
Péter
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | John Ogness <john.ogness@linutronix.de> |
|---|---|
| Date | 2015-10-16 12:50 +0200 |
| Subject | [PATCH v2] ARM: edma: special case slot limit workaround |
| Message-ID | <qkaKf-3Nh-35@gated-at.bofh.it> |
| In reply to | #1247679 |
Currently drivers are limited to 19 slots for cyclic transfers.
However, if the DMA burst size is the same as the period size,
the period size can be changed to the full buffer size and
intermediate interrupts activated. Since intermediate interrupts
will trigger for each burst and the burst size is the same as
the period size, the driver will get interrupts each period as
expected. This has the benefit of allowing the functionality of
many more slots, but only uses 2 slots.
This workaround is only active if more than 19 slots are needed
and the burst size matches the period size.
Signed-off-by: John Ogness <john.ogness@linutronix.de>
---
v1-v2 changes
. rebased for next-20151016
drivers/dma/edma.c | 25 ++++++++++++++++++++++---
1 file changed, 22 insertions(+), 3 deletions(-)
diff --git a/drivers/dma/edma.c b/drivers/dma/edma.c
index 7eefbf1..f846935 100644
--- a/drivers/dma/edma.c
+++ b/drivers/dma/edma.c
@@ -1364,6 +1364,7 @@ static struct dma_async_tx_descriptor *edma_prep_dma_cyclic(
struct edma_desc *edesc;
dma_addr_t src_addr, dst_addr;
enum dma_slave_buswidth dev_width;
+ bool use_intermediate = false;
u32 burst;
int i, ret, nslots;
@@ -1405,8 +1406,21 @@ static struct dma_async_tx_descriptor *edma_prep_dma_cyclic(
* but the synchronization is difficult to achieve with Cyclic and
* cannot be guaranteed, so we error out early.
*/
- if (nslots > MAX_NR_SG)
- return NULL;
+ if (nslots > MAX_NR_SG) {
+ /*
+ * If the burst and period sizes are the same, we can put
+ * the full buffer into a single period and activate
+ * intermediate interrupts. This will produce interrupts
+ * after each burst, which is also after each desired period.
+ */
+ if (burst == period_len) {
+ period_len = buf_len;
+ nslots = 2;
+ use_intermediate = true;
+ } else {
+ return NULL;
+ }
+ }
edesc = kzalloc(sizeof(*edesc) + nslots * sizeof(edesc->pset[0]),
GFP_ATOMIC);
@@ -1484,8 +1498,13 @@ static struct dma_async_tx_descriptor *edma_prep_dma_cyclic(
/*
* Enable period interrupt only if it is requested
*/
- if (tx_flags & DMA_PREP_INTERRUPT)
+ if (tx_flags & DMA_PREP_INTERRUPT) {
edesc->pset[i].param.opt |= TCINTEN;
+
+ /* Also enable intermediate interrupts if necessary */
+ if (use_intermediate)
+ edesc->pset[i].param.opt |= ITCINTEN;
+ }
}
/* Place the cyclic channel to highest priority queue */
--
1.7.10.4
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Peter Ujfalusi <peter.ujfalusi@ti.com> |
|---|---|
| Date | 2015-10-16 13:30 +0200 |
| Subject | Re: [PATCH v2] ARM: edma: special case slot limit workaround |
| Message-ID | <qkbmW-4Og-9@gated-at.bofh.it> |
| In reply to | #1248590 |
On 10/16/2015 01:43 PM, John Ogness wrote:
> Currently drivers are limited to 19 slots for cyclic transfers.
> However, if the DMA burst size is the same as the period size,
> the period size can be changed to the full buffer size and
> intermediate interrupts activated. Since intermediate interrupts
> will trigger for each burst and the burst size is the same as
> the period size, the driver will get interrupts each period as
> expected. This has the benefit of allowing the functionality of
> many more slots, but only uses 2 slots.
>
> This workaround is only active if more than 19 slots are needed
> and the burst size matches the period size.
Acked-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
> Signed-off-by: John Ogness <john.ogness@linutronix.de>
> ---
> v1-v2 changes
> . rebased for next-20151016
>
> drivers/dma/edma.c | 25 ++++++++++++++++++++++---
> 1 file changed, 22 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/dma/edma.c b/drivers/dma/edma.c
> index 7eefbf1..f846935 100644
> --- a/drivers/dma/edma.c
> +++ b/drivers/dma/edma.c
> @@ -1364,6 +1364,7 @@ static struct dma_async_tx_descriptor *edma_prep_dma_cyclic(
> struct edma_desc *edesc;
> dma_addr_t src_addr, dst_addr;
> enum dma_slave_buswidth dev_width;
> + bool use_intermediate = false;
> u32 burst;
> int i, ret, nslots;
>
> @@ -1405,8 +1406,21 @@ static struct dma_async_tx_descriptor *edma_prep_dma_cyclic(
> * but the synchronization is difficult to achieve with Cyclic and
> * cannot be guaranteed, so we error out early.
> */
> - if (nslots > MAX_NR_SG)
> - return NULL;
> + if (nslots > MAX_NR_SG) {
> + /*
> + * If the burst and period sizes are the same, we can put
> + * the full buffer into a single period and activate
> + * intermediate interrupts. This will produce interrupts
> + * after each burst, which is also after each desired period.
> + */
> + if (burst == period_len) {
> + period_len = buf_len;
> + nslots = 2;
> + use_intermediate = true;
> + } else {
> + return NULL;
> + }
> + }
>
> edesc = kzalloc(sizeof(*edesc) + nslots * sizeof(edesc->pset[0]),
> GFP_ATOMIC);
> @@ -1484,8 +1498,13 @@ static struct dma_async_tx_descriptor *edma_prep_dma_cyclic(
> /*
> * Enable period interrupt only if it is requested
> */
> - if (tx_flags & DMA_PREP_INTERRUPT)
> + if (tx_flags & DMA_PREP_INTERRUPT) {
> edesc->pset[i].param.opt |= TCINTEN;
> +
> + /* Also enable intermediate interrupts if necessary */
> + if (use_intermediate)
> + edesc->pset[i].param.opt |= ITCINTEN;
> + }
> }
>
> /* Place the cyclic channel to highest priority queue */
>
--
Péter
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web