All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] dmaengine: dmatest: Add support for scatter-gather DMA mode
@ 2016-04-25  8:48 Kedareswara rao Appana
  2016-04-25 14:01 ` Ramon Fried
  2016-06-07  5:34 ` Vinod Koul
  0 siblings, 2 replies; 5+ messages in thread
From: Kedareswara rao Appana @ 2016-04-25  8:48 UTC (permalink / raw)
  To: vinod.koul, dan.j.williams, ramon.fried
  Cc: dmaengine, linux-kernel, Kedareswara rao Appana

This patch updates the dmatest client to support
scatter-gather dma mode.

Signed-off-by: Kedareswara rao Appana <appanad@xilinx.com>
---
 drivers/dma/dmatest.c | 38 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 36 insertions(+), 2 deletions(-)

diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c
index b8576fd..6f259d8 100644
--- a/drivers/dma/dmatest.c
+++ b/drivers/dma/dmatest.c
@@ -51,6 +51,14 @@ module_param(iterations, uint, S_IRUGO | S_IWUSR);
 MODULE_PARM_DESC(iterations,
 		"Iterations before stopping test (default: infinite)");
 
+static unsigned int sg_sources = 1;
+module_param(sg_sources, uint, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(sg_sources,
+		"Number of scatter gather buffers (default: 1)");
+static unsigned int dmatest = 1;
+module_param(dmatest, uint, S_IRUGO | S_IWUSR);
+MODULE_PARM_DESC(dmatest,
+		"dmatest 0-memcpy 1-slave_sg (default: 1)");
 static unsigned int xor_sources = 3;
 module_param(xor_sources, uint, S_IRUGO | S_IWUSR);
 MODULE_PARM_DESC(xor_sources,
@@ -431,6 +439,8 @@ static int dmatest_func(void *data)
 	dev = chan->device;
 	if (thread->type == DMA_MEMCPY)
 		src_cnt = dst_cnt = 1;
+	else if (thread->type == DMA_SG)
+		src_cnt = dst_cnt = sg_sources;
 	else if (thread->type == DMA_XOR) {
 		/* force odd to ensure dst = src */
 		src_cnt = min_odd(params->xor_sources | 1, dev->max_xor);
@@ -485,6 +495,8 @@ static int dmatest_func(void *data)
 		dma_addr_t *dsts;
 		unsigned int src_off, dst_off, len;
 		u8 align = 0;
+		struct scatterlist tx_sg[src_cnt];
+		struct scatterlist rx_sg[src_cnt];
 
 		total_tests++;
 
@@ -577,10 +589,21 @@ static int dmatest_func(void *data)
 			um->bidi_cnt++;
 		}
 
+		sg_init_table(tx_sg, src_cnt);
+		sg_init_table(rx_sg, dst_cnt);
+		for (i = 0; i < src_cnt; i++) {
+			sg_dma_address(&rx_sg[i]) = srcs[i];
+			sg_dma_address(&tx_sg[i]) = dsts[i] + dst_off;
+			sg_dma_len(&tx_sg[i]) = len;
+			sg_dma_len(&rx_sg[i]) = len;
+		}
 		if (thread->type == DMA_MEMCPY)
 			tx = dev->device_prep_dma_memcpy(chan,
 							 dsts[0] + dst_off,
 							 srcs[0], len, flags);
+		else if (thread->type == DMA_SG)
+			tx = dev->device_prep_dma_sg(chan, tx_sg,
+					dst_cnt, rx_sg, src_cnt, flags);
 		else if (thread->type == DMA_XOR)
 			tx = dev->device_prep_dma_xor(chan,
 						      dsts[0] + dst_off,
@@ -748,6 +771,8 @@ static int dmatest_add_threads(struct dmatest_info *info,
 
 	if (type == DMA_MEMCPY)
 		op = "copy";
+	else if (type == DMA_SG)
+		op = "sg";
 	else if (type == DMA_XOR)
 		op = "xor";
 	else if (type == DMA_PQ)
@@ -802,8 +827,16 @@ static int dmatest_add_channel(struct dmatest_info *info,
 	INIT_LIST_HEAD(&dtc->threads);
 
 	if (dma_has_cap(DMA_MEMCPY, dma_dev->cap_mask)) {
-		cnt = dmatest_add_threads(info, dtc, DMA_MEMCPY);
-		thread_count += cnt > 0 ? cnt : 0;
+		if (dmatest == 0) {
+			cnt = dmatest_add_threads(info, dtc, DMA_MEMCPY);
+			thread_count += cnt > 0 ? cnt : 0;
+		}
+	}
+	if (dma_has_cap(DMA_SG, dma_dev->cap_mask)) {
+		if (dmatest == 1) {
+			cnt = dmatest_add_threads(info, dtc, DMA_SG);
+			thread_count += cnt > 0 ? cnt : 0;
+		}
 	}
 	if (dma_has_cap(DMA_XOR, dma_dev->cap_mask)) {
 		cnt = dmatest_add_threads(info, dtc, DMA_XOR);
@@ -877,6 +910,7 @@ static void run_threaded_test(struct dmatest_info *info)
 
 	request_channels(info, DMA_MEMCPY);
 	request_channels(info, DMA_XOR);
+	request_channels(info, DMA_SG);
 	request_channels(info, DMA_PQ);
 }
 
-- 
2.1.2

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* RE: [PATCH] dmaengine: dmatest: Add support for scatter-gather DMA mode
  2016-04-25  8:48 [PATCH] dmaengine: dmatest: Add support for scatter-gather DMA mode Kedareswara rao Appana
@ 2016-04-25 14:01 ` Ramon Fried
  2016-06-07  5:27   ` Vinod Koul
  2016-06-07  5:34 ` Vinod Koul
  1 sibling, 1 reply; 5+ messages in thread
From: Ramon Fried @ 2016-04-25 14:01 UTC (permalink / raw)
  To: Kedareswara rao Appana; +Cc: dmaengine, linux-kernel

Wow. Thanks a lot !

-----Original Message-----
From: Kedareswara rao Appana [mailto:appana.durga.rao@xilinx.com] 
Sent: Monday, April 25, 2016 11:48 AM
To: vinod.koul@intel.com; dan.j.williams@intel.com; Ramon Fried <ramon.fried@tandemg.com>
Cc: dmaengine@vger.kernel.org; linux-kernel@vger.kernel.org; Kedareswara rao Appana <appanad@xilinx.com>
Subject: [PATCH] dmaengine: dmatest: Add support for scatter-gather DMA mode

This patch updates the dmatest client to support scatter-gather dma mode.

Signed-off-by: Kedareswara rao Appana <appanad@xilinx.com>
---
 drivers/dma/dmatest.c | 38 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 36 insertions(+), 2 deletions(-)

diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c index b8576fd..6f259d8 100644
--- a/drivers/dma/dmatest.c
+++ b/drivers/dma/dmatest.c
@@ -51,6 +51,14 @@ module_param(iterations, uint, S_IRUGO | S_IWUSR);  MODULE_PARM_DESC(iterations,
 		"Iterations before stopping test (default: infinite)");
 
+static unsigned int sg_sources = 1;
+module_param(sg_sources, uint, S_IRUGO | S_IWUSR); 
+MODULE_PARM_DESC(sg_sources,
+		"Number of scatter gather buffers (default: 1)"); static unsigned int 
+dmatest = 1; module_param(dmatest, uint, S_IRUGO | S_IWUSR); 
+MODULE_PARM_DESC(dmatest,
+		"dmatest 0-memcpy 1-slave_sg (default: 1)");
 static unsigned int xor_sources = 3;
 module_param(xor_sources, uint, S_IRUGO | S_IWUSR);  MODULE_PARM_DESC(xor_sources, @@ -431,6 +439,8 @@ static int dmatest_func(void *data)
 	dev = chan->device;
 	if (thread->type == DMA_MEMCPY)
 		src_cnt = dst_cnt = 1;
+	else if (thread->type == DMA_SG)
+		src_cnt = dst_cnt = sg_sources;
 	else if (thread->type == DMA_XOR) {
 		/* force odd to ensure dst = src */
 		src_cnt = min_odd(params->xor_sources | 1, dev->max_xor); @@ -485,6 +495,8 @@ static int dmatest_func(void *data)
 		dma_addr_t *dsts;
 		unsigned int src_off, dst_off, len;
 		u8 align = 0;
+		struct scatterlist tx_sg[src_cnt];
+		struct scatterlist rx_sg[src_cnt];
 
 		total_tests++;
 
@@ -577,10 +589,21 @@ static int dmatest_func(void *data)
 			um->bidi_cnt++;
 		}
 
+		sg_init_table(tx_sg, src_cnt);
+		sg_init_table(rx_sg, dst_cnt);
+		for (i = 0; i < src_cnt; i++) {
+			sg_dma_address(&rx_sg[i]) = srcs[i];
+			sg_dma_address(&tx_sg[i]) = dsts[i] + dst_off;
+			sg_dma_len(&tx_sg[i]) = len;
+			sg_dma_len(&rx_sg[i]) = len;
+		}
 		if (thread->type == DMA_MEMCPY)
 			tx = dev->device_prep_dma_memcpy(chan,
 							 dsts[0] + dst_off,
 							 srcs[0], len, flags);
+		else if (thread->type == DMA_SG)
+			tx = dev->device_prep_dma_sg(chan, tx_sg,
+					dst_cnt, rx_sg, src_cnt, flags);
 		else if (thread->type == DMA_XOR)
 			tx = dev->device_prep_dma_xor(chan,
 						      dsts[0] + dst_off,
@@ -748,6 +771,8 @@ static int dmatest_add_threads(struct dmatest_info *info,
 
 	if (type == DMA_MEMCPY)
 		op = "copy";
+	else if (type == DMA_SG)
+		op = "sg";
 	else if (type == DMA_XOR)
 		op = "xor";
 	else if (type == DMA_PQ)
@@ -802,8 +827,16 @@ static int dmatest_add_channel(struct dmatest_info *info,
 	INIT_LIST_HEAD(&dtc->threads);
 
 	if (dma_has_cap(DMA_MEMCPY, dma_dev->cap_mask)) {
-		cnt = dmatest_add_threads(info, dtc, DMA_MEMCPY);
-		thread_count += cnt > 0 ? cnt : 0;
+		if (dmatest == 0) {
+			cnt = dmatest_add_threads(info, dtc, DMA_MEMCPY);
+			thread_count += cnt > 0 ? cnt : 0;
+		}
+	}
+	if (dma_has_cap(DMA_SG, dma_dev->cap_mask)) {
+		if (dmatest == 1) {
+			cnt = dmatest_add_threads(info, dtc, DMA_SG);
+			thread_count += cnt > 0 ? cnt : 0;
+		}
 	}
 	if (dma_has_cap(DMA_XOR, dma_dev->cap_mask)) {
 		cnt = dmatest_add_threads(info, dtc, DMA_XOR); @@ -877,6 +910,7 @@ static void run_threaded_test(struct dmatest_info *info)
 
 	request_channels(info, DMA_MEMCPY);
 	request_channels(info, DMA_XOR);
+	request_channels(info, DMA_SG);
 	request_channels(info, DMA_PQ);
 }
 
--
2.1.2

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] dmaengine: dmatest: Add support for scatter-gather DMA mode
  2016-04-25 14:01 ` Ramon Fried
@ 2016-06-07  5:27   ` Vinod Koul
  0 siblings, 0 replies; 5+ messages in thread
From: Vinod Koul @ 2016-06-07  5:27 UTC (permalink / raw)
  To: Ramon Fried; +Cc: Kedareswara rao Appana, dmaengine, linux-kernel

On Mon, Apr 25, 2016 at 02:01:59PM +0000, Ramon Fried wrote:
> Wow. Thanks a lot !

care to give tested-by ?

-- 
~Vinod

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] dmaengine: dmatest: Add support for scatter-gather DMA mode
  2016-04-25  8:48 [PATCH] dmaengine: dmatest: Add support for scatter-gather DMA mode Kedareswara rao Appana
  2016-04-25 14:01 ` Ramon Fried
@ 2016-06-07  5:34 ` Vinod Koul
  2016-06-07  6:08   ` Appana Durga Kedareswara Rao
  1 sibling, 1 reply; 5+ messages in thread
From: Vinod Koul @ 2016-06-07  5:34 UTC (permalink / raw)
  To: Kedareswara rao Appana
  Cc: dan.j.williams, ramon.fried, dmaengine, linux-kernel,
	Kedareswara rao Appana

On Mon, Apr 25, 2016 at 02:18:05PM +0530, Kedareswara rao Appana wrote:
> This patch updates the dmatest client to support
> scatter-gather dma mode.
> 
> Signed-off-by: Kedareswara rao Appana <appanad@xilinx.com>
> ---
>  drivers/dma/dmatest.c | 38 ++++++++++++++++++++++++++++++++++++--
>  1 file changed, 36 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/dma/dmatest.c b/drivers/dma/dmatest.c
> index b8576fd..6f259d8 100644
> --- a/drivers/dma/dmatest.c
> +++ b/drivers/dma/dmatest.c
> @@ -51,6 +51,14 @@ module_param(iterations, uint, S_IRUGO | S_IWUSR);
>  MODULE_PARM_DESC(iterations,
>  		"Iterations before stopping test (default: infinite)");
>  
> +static unsigned int sg_sources = 1;
> +module_param(sg_sources, uint, S_IRUGO | S_IWUSR);
> +MODULE_PARM_DESC(sg_sources,

sg_buffers rather?

> +		"Number of scatter gather buffers (default: 1)");

blank line please

> +static unsigned int dmatest = 1;
> +module_param(dmatest, uint, S_IRUGO | S_IWUSR);
> +MODULE_PARM_DESC(dmatest,
> +		"dmatest 0-memcpy 1-slave_sg (default: 1)");

dmatest? What does this mean!

>  static unsigned int xor_sources = 3;
>  module_param(xor_sources, uint, S_IRUGO | S_IWUSR);
>  MODULE_PARM_DESC(xor_sources,
> @@ -431,6 +439,8 @@ static int dmatest_func(void *data)
>  	dev = chan->device;
>  	if (thread->type == DMA_MEMCPY)
>  		src_cnt = dst_cnt = 1;
> +	else if (thread->type == DMA_SG)
> +		src_cnt = dst_cnt = sg_sources;
>  	else if (thread->type == DMA_XOR) {
>  		/* force odd to ensure dst = src */
>  		src_cnt = min_odd(params->xor_sources | 1, dev->max_xor);
> @@ -485,6 +495,8 @@ static int dmatest_func(void *data)
>  		dma_addr_t *dsts;
>  		unsigned int src_off, dst_off, len;
>  		u8 align = 0;
> +		struct scatterlist tx_sg[src_cnt];
> +		struct scatterlist rx_sg[src_cnt];
>  
>  		total_tests++;
>  
> @@ -577,10 +589,21 @@ static int dmatest_func(void *data)
>  			um->bidi_cnt++;
>  		}
>  
> +		sg_init_table(tx_sg, src_cnt);
> +		sg_init_table(rx_sg, dst_cnt);

why dst_cnt  here wheras you used src_cnt to create the list!

> +		for (i = 0; i < src_cnt; i++) {
> +			sg_dma_address(&rx_sg[i]) = srcs[i];
> +			sg_dma_address(&tx_sg[i]) = dsts[i] + dst_off;
> +			sg_dma_len(&tx_sg[i]) = len;
> +			sg_dma_len(&rx_sg[i]) = len;
> +		}
>  		if (thread->type == DMA_MEMCPY)
>  			tx = dev->device_prep_dma_memcpy(chan,
>  							 dsts[0] + dst_off,
>  							 srcs[0], len, flags);
> +		else if (thread->type == DMA_SG)
> +			tx = dev->device_prep_dma_sg(chan, tx_sg,
> +					dst_cnt, rx_sg, src_cnt, flags);

again dst_cnt

>  		else if (thread->type == DMA_XOR)
>  			tx = dev->device_prep_dma_xor(chan,
>  						      dsts[0] + dst_off,
> @@ -748,6 +771,8 @@ static int dmatest_add_threads(struct dmatest_info *info,
>  
>  	if (type == DMA_MEMCPY)
>  		op = "copy";
> +	else if (type == DMA_SG)
> +		op = "sg";
>  	else if (type == DMA_XOR)
>  		op = "xor";
>  	else if (type == DMA_PQ)
> @@ -802,8 +827,16 @@ static int dmatest_add_channel(struct dmatest_info *info,
>  	INIT_LIST_HEAD(&dtc->threads);
>  
>  	if (dma_has_cap(DMA_MEMCPY, dma_dev->cap_mask)) {
> -		cnt = dmatest_add_threads(info, dtc, DMA_MEMCPY);
> -		thread_count += cnt > 0 ? cnt : 0;
> +		if (dmatest == 0) {
> +			cnt = dmatest_add_threads(info, dtc, DMA_MEMCPY);
> +			thread_count += cnt > 0 ? cnt : 0;
> +		}
> +	}

blank line

-- 
~Vinod

^ permalink raw reply	[flat|nested] 5+ messages in thread

* RE: [PATCH] dmaengine: dmatest: Add support for scatter-gather DMA mode
  2016-06-07  5:34 ` Vinod Koul
@ 2016-06-07  6:08   ` Appana Durga Kedareswara Rao
  0 siblings, 0 replies; 5+ messages in thread
From: Appana Durga Kedareswara Rao @ 2016-06-07  6:08 UTC (permalink / raw)
  To: Vinod Koul; +Cc: dan.j.williams, ramon.fried, dmaengine, linux-kernel

Hi Vinod,

> >
> > +static unsigned int sg_sources = 1;
> > +module_param(sg_sources, uint, S_IRUGO | S_IWUSR);
> > +MODULE_PARM_DESC(sg_sources,
> 
> sg_buffers rather?

Ok sure will fix...

> 
> > +		"Number of scatter gather buffers (default: 1)");
> 
> blank line please

Ok

> 
> > +static unsigned int dmatest = 1;
> > +module_param(dmatest, uint, S_IRUGO | S_IWUSR);
> > +MODULE_PARM_DESC(dmatest,
> > +		"dmatest 0-memcpy 1-slave_sg (default: 1)");
> 
> dmatest? What does this mean!

To differentiate b/w the memcpy and slave_sg transfers using this dmatest 
Sysfs entry.

> 
> >  static unsigned int xor_sources = 3;
> >  module_param(xor_sources, uint, S_IRUGO | S_IWUSR);
> > MODULE_PARM_DESC(xor_sources, @@ -431,6 +439,8 @@ static int
> > dmatest_func(void *data)
> >  	dev = chan->device;
> >  	if (thread->type == DMA_MEMCPY)
> >  		src_cnt = dst_cnt = 1;
> > +	else if (thread->type == DMA_SG)
> > +		src_cnt = dst_cnt = sg_sources;
> >  	else if (thread->type == DMA_XOR) {
> >  		/* force odd to ensure dst = src */
> >  		src_cnt = min_odd(params->xor_sources | 1, dev->max_xor);
> @@ -485,6
> > +495,8 @@ static int dmatest_func(void *data)
> >  		dma_addr_t *dsts;
> >  		unsigned int src_off, dst_off, len;
> >  		u8 align = 0;
> > +		struct scatterlist tx_sg[src_cnt];
> > +		struct scatterlist rx_sg[src_cnt];
> >
> >  		total_tests++;
> >
> > @@ -577,10 +589,21 @@ static int dmatest_func(void *data)
> >  			um->bidi_cnt++;
> >  		}
> >
> > +		sg_init_table(tx_sg, src_cnt);
> > +		sg_init_table(rx_sg, dst_cnt);
> 
> why dst_cnt  here wheras you used src_cnt to create the list!

dst_cnt is used in prep_dma_sg will use dst_cnt to created list for rx buffers
Will fix this in v2.

> 
> > +		for (i = 0; i < src_cnt; i++) {
> > +			sg_dma_address(&rx_sg[i]) = srcs[i];
> > +			sg_dma_address(&tx_sg[i]) = dsts[i] + dst_off;
> > +			sg_dma_len(&tx_sg[i]) = len;
> > +			sg_dma_len(&rx_sg[i]) = len;
> > +		}
> >  		if (thread->type == DMA_MEMCPY)
> >  			tx = dev->device_prep_dma_memcpy(chan,
> >  							 dsts[0] + dst_off,
> >  							 srcs[0], len, flags);
> > +		else if (thread->type == DMA_SG)
> > +			tx = dev->device_prep_dma_sg(chan, tx_sg,
> > +					dst_cnt, rx_sg, src_cnt, flags);
> 
> again dst_cnt

Will fix in v2.

> 
> >  		else if (thread->type == DMA_XOR)
> >  			tx = dev->device_prep_dma_xor(chan,
> >  						      dsts[0] + dst_off,
> > @@ -748,6 +771,8 @@ static int dmatest_add_threads(struct dmatest_info
> > *info,
> >
> >  	if (type == DMA_MEMCPY)
> >  		op = "copy";
> > +	else if (type == DMA_SG)
> > +		op = "sg";
> >  	else if (type == DMA_XOR)
> >  		op = "xor";
> >  	else if (type == DMA_PQ)
> > @@ -802,8 +827,16 @@ static int dmatest_add_channel(struct dmatest_info
> *info,
> >  	INIT_LIST_HEAD(&dtc->threads);
> >
> >  	if (dma_has_cap(DMA_MEMCPY, dma_dev->cap_mask)) {
> > -		cnt = dmatest_add_threads(info, dtc, DMA_MEMCPY);
> > -		thread_count += cnt > 0 ? cnt : 0;
> > +		if (dmatest == 0) {
> > +			cnt = dmatest_add_threads(info, dtc, DMA_MEMCPY);
> > +			thread_count += cnt > 0 ? cnt : 0;
> > +		}
> > +	}
> 
> blank line

Ok sure will fix in v2...

Thanks,
Kedar.

> 
> --
> ~Vinod

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2016-06-07  6:09 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-04-25  8:48 [PATCH] dmaengine: dmatest: Add support for scatter-gather DMA mode Kedareswara rao Appana
2016-04-25 14:01 ` Ramon Fried
2016-06-07  5:27   ` Vinod Koul
2016-06-07  5:34 ` Vinod Koul
2016-06-07  6:08   ` Appana Durga Kedareswara Rao

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.