* [PATCH 0/4] at_xdmac: improvment and fixes for the interleaved mode
@ 2015-09-15 13:29 Ludovic Desroches
2015-09-15 13:29 ` [PATCH 1/4] dmaengine: at_xdmac: handle numf > 1 Ludovic Desroches
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Ludovic Desroches @ 2015-09-15 13:29 UTC (permalink / raw)
To: linux-arm-kernel
Hi Vinod,
This set of patches introduces the support of 'numf > 1' case for the
interleaved mode and several fixes: 'change block increment addressing mode'
and 'clean used descriptor' can be backported to 4.2.
Maxime,
I had some conflicts to merge on a mainline kernel the 'handle numf > 1'
patch. Can you check if I have not done a mistake. Thanks.
Regards
Ludovic Desroches (2):
dmaengine: at_xdmac: fix memory leak in interleaved mode
dmaengine: at_xdmac: clean used descriptor
Maxime Ripard (2):
dmaengine: at_xdmac: handle numf > 1
dmaengine: at_xdmac: change block increment addressing mode
drivers/dma/at_xdmac.c | 121 ++++++++++++++++++++++++++-----------------------
1 file changed, 65 insertions(+), 56 deletions(-)
--
2.5.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/4] dmaengine: at_xdmac: handle numf > 1
2015-09-15 13:29 [PATCH 0/4] at_xdmac: improvment and fixes for the interleaved mode Ludovic Desroches
@ 2015-09-15 13:29 ` Ludovic Desroches
2015-09-15 13:36 ` [PATCH 2/4] dmaengine: at_xdmac: change block increment addressing mode Ludovic Desroches
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Ludovic Desroches @ 2015-09-15 13:29 UTC (permalink / raw)
To: linux-arm-kernel
From: Maxime Ripard <maxime.ripard@free-electrons.com>
Handle 'numf > 1' case for interleaved mode.
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com>
---
drivers/dma/at_xdmac.c | 104 ++++++++++++++++++++++++-------------------------
1 file changed, 50 insertions(+), 54 deletions(-)
diff --git a/drivers/dma/at_xdmac.c b/drivers/dma/at_xdmac.c
index a165b4b..0190d1c 100644
--- a/drivers/dma/at_xdmac.c
+++ b/drivers/dma/at_xdmac.c
@@ -929,13 +929,19 @@ at_xdmac_prep_interleaved(struct dma_chan *chan,
{
struct at_xdmac_chan *atchan = to_at_xdmac_chan(chan);
struct at_xdmac_desc *prev = NULL, *first = NULL;
- struct data_chunk *chunk, *prev_chunk = NULL;
dma_addr_t dst_addr, src_addr;
- size_t dst_skip, src_skip, len = 0;
- size_t prev_dst_icg = 0, prev_src_icg = 0;
+ size_t src_skip = 0, dst_skip = 0, len = 0;
+ struct data_chunk *chunk;
int i;
- if (!xt || (xt->numf != 1) || (xt->dir != DMA_MEM_TO_MEM))
+ if (!xt || !xt->numf || (xt->dir != DMA_MEM_TO_MEM))
+ return NULL;
+
+ /*
+ * TODO: Handle the case where we have to repeat a chain of
+ * descriptors...
+ */
+ if ((xt->numf > 1) && (xt->frame_size > 1))
return NULL;
dev_dbg(chan2dev(chan), "%s: src=0x%08x, dest=0x%08x, numf=%d, frame_size=%d, flags=0x%lx\n",
@@ -945,66 +951,56 @@ at_xdmac_prep_interleaved(struct dma_chan *chan,
src_addr = xt->src_start;
dst_addr = xt->dst_start;
- for (i = 0; i < xt->frame_size; i++) {
- struct at_xdmac_desc *desc;
- size_t src_icg, dst_icg;
-
- chunk = xt->sgl + i;
+ if (xt->numf > 1) {
+ first = at_xdmac_interleaved_queue_desc(chan, atchan,
+ NULL,
+ src_addr, dst_addr,
+ xt, xt->sgl);
+ for (i = 0; i < xt->numf; i++)
+ at_xdmac_increment_block_count(chan, first);
+ } else {
+ for (i = 0; i < xt->frame_size; i++) {
+ size_t src_icg = 0, dst_icg = 0;
+ struct at_xdmac_desc *desc;
- dst_icg = dmaengine_get_dst_icg(xt, chunk);
- src_icg = dmaengine_get_src_icg(xt, chunk);
+ chunk = xt->sgl + i;
- src_skip = chunk->size + src_icg;
- dst_skip = chunk->size + dst_icg;
+ dst_icg = dmaengine_get_dst_icg(xt, chunk);
+ src_icg = dmaengine_get_src_icg(xt, chunk);
- dev_dbg(chan2dev(chan),
- "%s: chunk size=%d, src icg=%d, dst icg=%d\n",
- __func__, chunk->size, src_icg, dst_icg);
+ src_skip = chunk->size + src_icg;
+ dst_skip = chunk->size + dst_icg;
- /*
- * Handle the case where we just have the same
- * transfer to setup, we can just increase the
- * block number and reuse the same descriptor.
- */
- if (prev_chunk && prev &&
- (prev_chunk->size == chunk->size) &&
- (prev_src_icg == src_icg) &&
- (prev_dst_icg == dst_icg)) {
dev_dbg(chan2dev(chan),
- "%s: same configuration that the previous chunk, merging the descriptors...\n",
- __func__);
- at_xdmac_increment_block_count(chan, prev);
- continue;
- }
-
- desc = at_xdmac_interleaved_queue_desc(chan, atchan,
- prev,
- src_addr, dst_addr,
- xt, chunk);
- if (!desc) {
- list_splice_init(&first->descs_list,
- &atchan->free_descs_list);
- return NULL;
- }
+ "%s: chunk size=%d, src icg=%d, dst icg=%d\n",
+ __func__, chunk->size, src_icg, dst_icg);
+
+ desc = at_xdmac_interleaved_queue_desc(chan, atchan,
+ prev,
+ src_addr, dst_addr,
+ xt, chunk);
+ if (!desc) {
+ list_splice_init(&first->descs_list,
+ &atchan->free_descs_list);
+ return NULL;
+ }
- if (!first)
- first = desc;
+ if (!first)
+ first = desc;
- dev_dbg(chan2dev(chan), "%s: add desc 0x%p to descs_list 0x%p\n",
- __func__, desc, first);
- list_add_tail(&desc->desc_node, &first->descs_list);
+ dev_dbg(chan2dev(chan), "%s: add desc 0x%p to descs_list 0x%p\n",
+ __func__, desc, first);
+ list_add_tail(&desc->desc_node, &first->descs_list);
- if (xt->src_sgl)
- src_addr += src_skip;
+ if (xt->src_sgl)
+ src_addr += src_skip;
- if (xt->dst_sgl)
- dst_addr += dst_skip;
+ if (xt->dst_sgl)
+ dst_addr += dst_skip;
- len += chunk->size;
- prev_chunk = chunk;
- prev_dst_icg = dst_icg;
- prev_src_icg = src_icg;
- prev = desc;
+ len += chunk->size;
+ prev = desc;
+ }
}
first->tx_dma_desc.cookie = -EBUSY;
--
2.5.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/4] dmaengine: at_xdmac: change block increment addressing mode
2015-09-15 13:29 [PATCH 0/4] at_xdmac: improvment and fixes for the interleaved mode Ludovic Desroches
2015-09-15 13:29 ` [PATCH 1/4] dmaengine: at_xdmac: handle numf > 1 Ludovic Desroches
@ 2015-09-15 13:36 ` Ludovic Desroches
2015-09-15 13:38 ` [PATCH 3/4] dmaengine: at_xdmac: fix memory leak in interleaved mode Ludovic Desroches
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Ludovic Desroches @ 2015-09-15 13:36 UTC (permalink / raw)
To: linux-arm-kernel
From: Maxime Ripard <maxime.ripard@free-electrons.com>
The addressing mode we were using was not only incrementing the address at
each microblock, but also at each data boundary, which was severely slowing
the transfer, without any benefit since we were not using the data stride.
Switch to the micro block increment only in order to get back to an
acceptable performance level.
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com>
Fixes: 6007ccb57744 ("dmaengine: xdmac: Add interleaved transfer support")
Cc: stable at vger.kernel.org #4.2
---
drivers/dma/at_xdmac.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/dma/at_xdmac.c b/drivers/dma/at_xdmac.c
index 0190d1c..3952bff 100644
--- a/drivers/dma/at_xdmac.c
+++ b/drivers/dma/at_xdmac.c
@@ -875,14 +875,14 @@ at_xdmac_interleaved_queue_desc(struct dma_chan *chan,
if (xt->src_inc) {
if (xt->src_sgl)
- chan_cc |= AT_XDMAC_CC_SAM_UBS_DS_AM;
+ chan_cc |= AT_XDMAC_CC_SAM_UBS_AM;
else
chan_cc |= AT_XDMAC_CC_SAM_INCREMENTED_AM;
}
if (xt->dst_inc) {
if (xt->dst_sgl)
- chan_cc |= AT_XDMAC_CC_DAM_UBS_DS_AM;
+ chan_cc |= AT_XDMAC_CC_DAM_UBS_AM;
else
chan_cc |= AT_XDMAC_CC_DAM_INCREMENTED_AM;
}
--
2.5.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/4] dmaengine: at_xdmac: fix memory leak in interleaved mode
2015-09-15 13:29 [PATCH 0/4] at_xdmac: improvment and fixes for the interleaved mode Ludovic Desroches
2015-09-15 13:29 ` [PATCH 1/4] dmaengine: at_xdmac: handle numf > 1 Ludovic Desroches
2015-09-15 13:36 ` [PATCH 2/4] dmaengine: at_xdmac: change block increment addressing mode Ludovic Desroches
@ 2015-09-15 13:38 ` Ludovic Desroches
2015-09-15 13:39 ` [PATCH 4/4] dmaengine: at_xdmac: clean used descriptor Ludovic Desroches
2015-10-01 2:01 ` [PATCH 0/4] at_xdmac: improvment and fixes for the interleaved mode Vinod Koul
4 siblings, 0 replies; 6+ messages in thread
From: Ludovic Desroches @ 2015-09-15 13:38 UTC (permalink / raw)
To: linux-arm-kernel
In interleaved mode, when numf > 1, we have only one descriptor for the
transfer but this descriptor has to be added to the descs_list. If not,
when doing remove_xfer, the descriptor won't be put back in the
free_descs_list.
Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com>
---
drivers/dma/at_xdmac.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/dma/at_xdmac.c b/drivers/dma/at_xdmac.c
index 3952bff..fbd4093 100644
--- a/drivers/dma/at_xdmac.c
+++ b/drivers/dma/at_xdmac.c
@@ -958,6 +958,10 @@ at_xdmac_prep_interleaved(struct dma_chan *chan,
xt, xt->sgl);
for (i = 0; i < xt->numf; i++)
at_xdmac_increment_block_count(chan, first);
+
+ dev_dbg(chan2dev(chan), "%s: add desc 0x%p to descs_list 0x%p\n",
+ __func__, first, first);
+ list_add_tail(&first->desc_node, &first->descs_list);
} else {
for (i = 0; i < xt->frame_size; i++) {
size_t src_icg = 0, dst_icg = 0;
--
2.5.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 4/4] dmaengine: at_xdmac: clean used descriptor
2015-09-15 13:29 [PATCH 0/4] at_xdmac: improvment and fixes for the interleaved mode Ludovic Desroches
` (2 preceding siblings ...)
2015-09-15 13:38 ` [PATCH 3/4] dmaengine: at_xdmac: fix memory leak in interleaved mode Ludovic Desroches
@ 2015-09-15 13:39 ` Ludovic Desroches
2015-10-01 2:01 ` [PATCH 0/4] at_xdmac: improvment and fixes for the interleaved mode Vinod Koul
4 siblings, 0 replies; 6+ messages in thread
From: Ludovic Desroches @ 2015-09-15 13:39 UTC (permalink / raw)
To: linux-arm-kernel
When putting back a descriptor to the free descs list, some fields are
not set to 0, it can cause bugs if someone uses it without having this
in mind.
Descriptor are not put back one by one so it is easier to clean
descriptors when we request them.
Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com>
Cc: stable at vger.kernel.org #4.2
---
drivers/dma/at_xdmac.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/drivers/dma/at_xdmac.c b/drivers/dma/at_xdmac.c
index fbd4093..b5e132d 100644
--- a/drivers/dma/at_xdmac.c
+++ b/drivers/dma/at_xdmac.c
@@ -455,6 +455,15 @@ static struct at_xdmac_desc *at_xdmac_alloc_desc(struct dma_chan *chan,
return desc;
}
+void at_xdmac_init_used_desc(struct at_xdmac_desc *desc)
+{
+ memset(&desc->lld, 0, sizeof(desc->lld));
+ INIT_LIST_HEAD(&desc->descs_list);
+ desc->direction = DMA_TRANS_NONE;
+ desc->xfer_size = 0;
+ desc->active_xfer = false;
+}
+
/* Call must be protected by lock. */
static struct at_xdmac_desc *at_xdmac_get_desc(struct at_xdmac_chan *atchan)
{
@@ -466,7 +475,7 @@ static struct at_xdmac_desc *at_xdmac_get_desc(struct at_xdmac_chan *atchan)
desc = list_first_entry(&atchan->free_descs_list,
struct at_xdmac_desc, desc_node);
list_del(&desc->desc_node);
- desc->active_xfer = false;
+ at_xdmac_init_used_desc(desc);
}
return desc;
--
2.5.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 0/4] at_xdmac: improvment and fixes for the interleaved mode
2015-09-15 13:29 [PATCH 0/4] at_xdmac: improvment and fixes for the interleaved mode Ludovic Desroches
` (3 preceding siblings ...)
2015-09-15 13:39 ` [PATCH 4/4] dmaengine: at_xdmac: clean used descriptor Ludovic Desroches
@ 2015-10-01 2:01 ` Vinod Koul
4 siblings, 0 replies; 6+ messages in thread
From: Vinod Koul @ 2015-10-01 2:01 UTC (permalink / raw)
To: linux-arm-kernel
On Tue, Sep 15, 2015 at 03:29:26PM +0200, Ludovic Desroches wrote:
> Hi Vinod,
>
> This set of patches introduces the support of 'numf > 1' case for the
> interleaved mode and several fixes: 'change block increment addressing mode'
> and 'clean used descriptor' can be backported to 4.2.
Applied all,
Thanks
--
~Vinod
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-10-01 2:01 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-09-15 13:29 [PATCH 0/4] at_xdmac: improvment and fixes for the interleaved mode Ludovic Desroches
2015-09-15 13:29 ` [PATCH 1/4] dmaengine: at_xdmac: handle numf > 1 Ludovic Desroches
2015-09-15 13:36 ` [PATCH 2/4] dmaengine: at_xdmac: change block increment addressing mode Ludovic Desroches
2015-09-15 13:38 ` [PATCH 3/4] dmaengine: at_xdmac: fix memory leak in interleaved mode Ludovic Desroches
2015-09-15 13:39 ` [PATCH 4/4] dmaengine: at_xdmac: clean used descriptor Ludovic Desroches
2015-10-01 2:01 ` [PATCH 0/4] at_xdmac: improvment and fixes for the interleaved mode Vinod Koul
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).