* [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users
@ 2025-11-24 12:09 Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 01/13] scatterlist: introduce sg_nents_for_dma() helper Andy Shevchenko
` (13 more replies)
0 siblings, 14 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-11-24 12:09 UTC (permalink / raw)
To: Bjorn Andersson, Andy Shevchenko, Stefan Wahren, Vinod Koul,
Thomas Andreatta, Caleb Sander Mateos, dmaengine, linux-kernel,
linux-rpi-kernel, linux-arm-kernel, linux-arm-msm
Cc: Olivier Dautricourt, Stefan Roese, Florian Fainelli, Ray Jui,
Scott Branden, Broadcom internal kernel review list,
Lars-Peter Clausen, Eugeniy Paltsev, Daniel Mack, Haojian Zhuang,
Robert Jarzmik, Lizhi Hou, Brian Xu, Raj Kumar Rampelli,
Michal Simek, Andrew Morton
A handful of the DMAengine drivers use same routine to calculate the number of
SG entries needed for the given DMA transfer. Provide a common helper for them
and convert.
I left the new helper on SG level of API because brief grepping shows potential
candidates outside of DMA engine, e.g.:
drivers/crypto/chelsio/chcr_algo.c:154: nents += DIV_ROUND_UP(less, entlen);
drivers/spi/spi-stm32.c:1495: /* Count the number of entries needed */
Changelog v4:
- fixed compilation errors (Vinod)
v3: <20251113151603.3031717-1-andriy.shevchenko@linux.intel.com>
Changelog v3:
- added missed EXPORT_SYMBOL() (Bjorn)
- left the return type as signed int (as agreed with Bjorn)
- collected tags (Bjorn)
v2: <20251110103805.3562136-1-andriy.shevchenko@linux.intel.com>
Changelog v2:
- dropped outdated patches (only 9 years passed :-)
- rebased on top of the current kernel
- left API SG wide It might
v1: https://patchwork.kernel.org/project/linux-dmaengine/patch/20161021173535.100245-1-andriy.shevchenko@linux.intel.com/
Andy Shevchenko (13):
scatterlist: introduce sg_nents_for_dma() helper
dmaengine: altera-msgdma: use sg_nents_for_dma() helper
dmaengine: axi-dmac: use sg_nents_for_dma() helper
dmaengine: bcm2835-dma: use sg_nents_for_dma() helper
dmaengine: dw-axi-dmac: use sg_nents_for_dma() helper
dmaengine: k3dma: use sg_nents_for_dma() helper
dmaengine: lgm: use sg_nents_for_dma() helper
dmaengine: pxa-dma: use sg_nents_for_dma() helper
dmaengine: qcom: adm: use sg_nents_for_dma() helper
dmaengine: qcom: bam_dma: use sg_nents_for_dma() helper
dmaengine: sa11x0: use sg_nents_for_dma() helper
dmaengine: sh: use sg_nents_for_dma() helper
dmaengine: xilinx: xdma: use sg_nents_for_dma() helper
drivers/dma/altera-msgdma.c | 5 ++--
drivers/dma/bcm2835-dma.c | 19 +-------------
drivers/dma/dma-axi-dmac.c | 5 +---
.../dma/dw-axi-dmac/dw-axi-dmac-platform.c | 6 ++---
drivers/dma/k3dma.c | 9 ++-----
drivers/dma/lgm/lgm-dma.c | 9 ++-----
drivers/dma/pxa_dma.c | 5 ++--
drivers/dma/qcom/bam_dma.c | 9 ++-----
drivers/dma/qcom/qcom_adm.c | 9 +++----
drivers/dma/sa11x0-dma.c | 6 ++---
drivers/dma/sh/shdma-base.c | 5 ++--
drivers/dma/xilinx/xdma.c | 6 ++---
include/linux/scatterlist.h | 2 ++
lib/scatterlist.c | 26 +++++++++++++++++++
14 files changed, 52 insertions(+), 69 deletions(-)
--
2.50.1
^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v4 01/13] scatterlist: introduce sg_nents_for_dma() helper
2025-11-24 12:09 [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users Andy Shevchenko
@ 2025-11-24 12:09 ` Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 02/13] dmaengine: altera-msgdma: use " Andy Shevchenko
` (12 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-11-24 12:09 UTC (permalink / raw)
To: Bjorn Andersson, Andy Shevchenko, Stefan Wahren, Vinod Koul,
Thomas Andreatta, Caleb Sander Mateos, dmaengine, linux-kernel,
linux-rpi-kernel, linux-arm-kernel, linux-arm-msm
Cc: Olivier Dautricourt, Stefan Roese, Florian Fainelli, Ray Jui,
Scott Branden, Broadcom internal kernel review list,
Lars-Peter Clausen, Eugeniy Paltsev, Daniel Mack, Haojian Zhuang,
Robert Jarzmik, Lizhi Hou, Brian Xu, Raj Kumar Rampelli,
Michal Simek, Andrew Morton
Sometimes the user needs to split each entry on the mapped scatter list
due to DMA length constrains. This helper returns a number of entities
assuming that each of them is not bigger than supplied maximum length.
Reviewed-by: Bjorn Andersson <andersson@kernel.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
include/linux/scatterlist.h | 2 ++
lib/scatterlist.c | 26 ++++++++++++++++++++++++++
2 files changed, 28 insertions(+)
diff --git a/include/linux/scatterlist.h b/include/linux/scatterlist.h
index 29f6ceb98d74..6de1a2434299 100644
--- a/include/linux/scatterlist.h
+++ b/include/linux/scatterlist.h
@@ -441,6 +441,8 @@ static inline void sg_init_marker(struct scatterlist *sgl,
int sg_nents(struct scatterlist *sg);
int sg_nents_for_len(struct scatterlist *sg, u64 len);
+int sg_nents_for_dma(struct scatterlist *sgl, unsigned int sglen, size_t len);
+
struct scatterlist *sg_last(struct scatterlist *s, unsigned int);
void sg_init_table(struct scatterlist *, unsigned int);
void sg_init_one(struct scatterlist *, const void *, unsigned int);
diff --git a/lib/scatterlist.c b/lib/scatterlist.c
index 4af1c8b0775a..21bc9c1f7c06 100644
--- a/lib/scatterlist.c
+++ b/lib/scatterlist.c
@@ -64,6 +64,32 @@ int sg_nents_for_len(struct scatterlist *sg, u64 len)
}
EXPORT_SYMBOL(sg_nents_for_len);
+/**
+ * sg_nents_for_dma - return the count of DMA-capable entries in scatterlist
+ * @sgl: The scatterlist
+ * @sglen: The current number of entries
+ * @len: The maximum length of DMA-capable block
+ *
+ * Description:
+ * Determines the number of entries in @sgl which would be permitted in
+ * DMA-capable transfer if list had been split accordingly, taking into
+ * account chaining as well.
+ *
+ * Returns:
+ * the number of sgl entries needed
+ *
+ **/
+int sg_nents_for_dma(struct scatterlist *sgl, unsigned int sglen, size_t len)
+{
+ struct scatterlist *sg;
+ int i, nents = 0;
+
+ for_each_sg(sgl, sg, sglen, i)
+ nents += DIV_ROUND_UP(sg_dma_len(sg), len);
+ return nents;
+}
+EXPORT_SYMBOL(sg_nents_for_dma);
+
/**
* sg_last - return the last scatterlist entry in a list
* @sgl: First entry in the scatterlist
--
2.50.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v4 02/13] dmaengine: altera-msgdma: use sg_nents_for_dma() helper
2025-11-24 12:09 [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 01/13] scatterlist: introduce sg_nents_for_dma() helper Andy Shevchenko
@ 2025-11-24 12:09 ` Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 03/13] dmaengine: axi-dmac: " Andy Shevchenko
` (11 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-11-24 12:09 UTC (permalink / raw)
To: Bjorn Andersson, Andy Shevchenko, Stefan Wahren, Vinod Koul,
Thomas Andreatta, Caleb Sander Mateos, dmaengine, linux-kernel,
linux-rpi-kernel, linux-arm-kernel, linux-arm-msm
Cc: Olivier Dautricourt, Stefan Roese, Florian Fainelli, Ray Jui,
Scott Branden, Broadcom internal kernel review list,
Lars-Peter Clausen, Eugeniy Paltsev, Daniel Mack, Haojian Zhuang,
Robert Jarzmik, Lizhi Hou, Brian Xu, Raj Kumar Rampelli,
Michal Simek, Andrew Morton
Instead of open coded variant let's use recently introduced helper.
Reviewed-by: Bjorn Andersson <andersson@kernel.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/dma/altera-msgdma.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/dma/altera-msgdma.c b/drivers/dma/altera-msgdma.c
index a203fdd84950..48d2a0e638bb 100644
--- a/drivers/dma/altera-msgdma.c
+++ b/drivers/dma/altera-msgdma.c
@@ -396,13 +396,12 @@ msgdma_prep_slave_sg(struct dma_chan *dchan, struct scatterlist *sgl,
void *desc = NULL;
size_t len, avail;
dma_addr_t dma_dst, dma_src;
- u32 desc_cnt = 0, i;
struct scatterlist *sg;
+ u32 desc_cnt;
u32 stride;
unsigned long irqflags;
- for_each_sg(sgl, sg, sg_len, i)
- desc_cnt += DIV_ROUND_UP(sg_dma_len(sg), MSGDMA_MAX_TRANS_LEN);
+ desc_cnt = sg_nents_for_dma(sgl, sg_len, MSGDMA_MAX_TRANS_LEN);
spin_lock_irqsave(&mdev->lock, irqflags);
if (desc_cnt > mdev->desc_free_cnt) {
--
2.50.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v4 03/13] dmaengine: axi-dmac: use sg_nents_for_dma() helper
2025-11-24 12:09 [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 01/13] scatterlist: introduce sg_nents_for_dma() helper Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 02/13] dmaengine: altera-msgdma: use " Andy Shevchenko
@ 2025-11-24 12:09 ` Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 04/13] dmaengine: bcm2835-dma: " Andy Shevchenko
` (10 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-11-24 12:09 UTC (permalink / raw)
To: Bjorn Andersson, Andy Shevchenko, Stefan Wahren, Vinod Koul,
Thomas Andreatta, Caleb Sander Mateos, dmaengine, linux-kernel,
linux-rpi-kernel, linux-arm-kernel, linux-arm-msm
Cc: Olivier Dautricourt, Stefan Roese, Florian Fainelli, Ray Jui,
Scott Branden, Broadcom internal kernel review list,
Lars-Peter Clausen, Eugeniy Paltsev, Daniel Mack, Haojian Zhuang,
Robert Jarzmik, Lizhi Hou, Brian Xu, Raj Kumar Rampelli,
Michal Simek, Andrew Morton
Instead of open coded variant let's use recently introduced helper.
Reviewed-by: Bjorn Andersson <andersson@kernel.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/dma/dma-axi-dmac.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/drivers/dma/dma-axi-dmac.c b/drivers/dma/dma-axi-dmac.c
index 5b06b0dc67ee..5d4436e7d2ee 100644
--- a/drivers/dma/dma-axi-dmac.c
+++ b/drivers/dma/dma-axi-dmac.c
@@ -674,10 +674,7 @@ static struct dma_async_tx_descriptor *axi_dmac_prep_slave_sg(
if (direction != chan->direction)
return NULL;
- num_sgs = 0;
- for_each_sg(sgl, sg, sg_len, i)
- num_sgs += DIV_ROUND_UP(sg_dma_len(sg), chan->max_length);
-
+ num_sgs = sg_nents_for_dma(sgl, sg_len, chan->max_length);
desc = axi_dmac_alloc_desc(chan, num_sgs);
if (!desc)
return NULL;
--
2.50.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v4 04/13] dmaengine: bcm2835-dma: use sg_nents_for_dma() helper
2025-11-24 12:09 [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users Andy Shevchenko
` (2 preceding siblings ...)
2025-11-24 12:09 ` [PATCH v4 03/13] dmaengine: axi-dmac: " Andy Shevchenko
@ 2025-11-24 12:09 ` Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 05/13] dmaengine: dw-axi-dmac: " Andy Shevchenko
` (9 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-11-24 12:09 UTC (permalink / raw)
To: Bjorn Andersson, Andy Shevchenko, Stefan Wahren, Vinod Koul,
Thomas Andreatta, Caleb Sander Mateos, dmaengine, linux-kernel,
linux-rpi-kernel, linux-arm-kernel, linux-arm-msm
Cc: Olivier Dautricourt, Stefan Roese, Florian Fainelli, Ray Jui,
Scott Branden, Broadcom internal kernel review list,
Lars-Peter Clausen, Eugeniy Paltsev, Daniel Mack, Haojian Zhuang,
Robert Jarzmik, Lizhi Hou, Brian Xu, Raj Kumar Rampelli,
Michal Simek, Andrew Morton
Instead of open coded variant let's use recently introduced helper.
Reviewed-by: Bjorn Andersson <andersson@kernel.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/dma/bcm2835-dma.c | 19 +------------------
1 file changed, 1 insertion(+), 18 deletions(-)
diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c
index 0117bb2e8591..802b23be2fd8 100644
--- a/drivers/dma/bcm2835-dma.c
+++ b/drivers/dma/bcm2835-dma.c
@@ -260,23 +260,6 @@ static void bcm2835_dma_create_cb_set_length(
control_block->info |= finalextrainfo;
}
-static inline size_t bcm2835_dma_count_frames_for_sg(
- struct bcm2835_chan *c,
- struct scatterlist *sgl,
- unsigned int sg_len)
-{
- size_t frames = 0;
- struct scatterlist *sgent;
- unsigned int i;
- size_t plength = bcm2835_dma_max_frame_length(c);
-
- for_each_sg(sgl, sgent, sg_len, i)
- frames += bcm2835_dma_frames_for_length(
- sg_dma_len(sgent), plength);
-
- return frames;
-}
-
/**
* bcm2835_dma_create_cb_chain - create a control block and fills data in
*
@@ -672,7 +655,7 @@ static struct dma_async_tx_descriptor *bcm2835_dma_prep_slave_sg(
}
/* count frames in sg list */
- frames = bcm2835_dma_count_frames_for_sg(c, sgl, sg_len);
+ frames = sg_nents_for_dma(sgl, sg_len, bcm2835_dma_max_frame_length(c));
/* allocate the CB chain */
d = bcm2835_dma_create_cb_chain(chan, direction, false,
--
2.50.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v4 05/13] dmaengine: dw-axi-dmac: use sg_nents_for_dma() helper
2025-11-24 12:09 [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users Andy Shevchenko
` (3 preceding siblings ...)
2025-11-24 12:09 ` [PATCH v4 04/13] dmaengine: bcm2835-dma: " Andy Shevchenko
@ 2025-11-24 12:09 ` Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 06/13] dmaengine: k3dma: " Andy Shevchenko
` (8 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-11-24 12:09 UTC (permalink / raw)
To: Bjorn Andersson, Andy Shevchenko, Stefan Wahren, Vinod Koul,
Thomas Andreatta, Caleb Sander Mateos, dmaengine, linux-kernel,
linux-rpi-kernel, linux-arm-kernel, linux-arm-msm
Cc: Olivier Dautricourt, Stefan Roese, Florian Fainelli, Ray Jui,
Scott Branden, Broadcom internal kernel review list,
Lars-Peter Clausen, Eugeniy Paltsev, Daniel Mack, Haojian Zhuang,
Robert Jarzmik, Lizhi Hou, Brian Xu, Raj Kumar Rampelli,
Michal Simek, Andrew Morton
Instead of open coded variant let's use recently introduced helper.
Reviewed-by: Bjorn Andersson <andersson@kernel.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c b/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c
index b23536645ff7..493c2a32b0fe 100644
--- a/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c
+++ b/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c
@@ -850,7 +850,7 @@ dw_axi_dma_chan_prep_slave_sg(struct dma_chan *dchan, struct scatterlist *sgl,
unsigned int loop = 0;
struct scatterlist *sg;
size_t axi_block_len;
- u32 len, num_sgs = 0;
+ u32 len, num_sgs;
unsigned int i;
dma_addr_t mem;
int status;
@@ -867,9 +867,7 @@ dw_axi_dma_chan_prep_slave_sg(struct dma_chan *dchan, struct scatterlist *sgl,
if (axi_block_len == 0)
return NULL;
- for_each_sg(sgl, sg, sg_len, i)
- num_sgs += DIV_ROUND_UP(sg_dma_len(sg), axi_block_len);
-
+ num_sgs = sg_nents_for_dma(sgl, sg_len, axi_block_len);
desc = axi_desc_alloc(num_sgs);
if (unlikely(!desc))
goto err_desc_get;
--
2.50.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v4 06/13] dmaengine: k3dma: use sg_nents_for_dma() helper
2025-11-24 12:09 [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users Andy Shevchenko
` (4 preceding siblings ...)
2025-11-24 12:09 ` [PATCH v4 05/13] dmaengine: dw-axi-dmac: " Andy Shevchenko
@ 2025-11-24 12:09 ` Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 07/13] dmaengine: lgm: " Andy Shevchenko
` (7 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-11-24 12:09 UTC (permalink / raw)
To: Bjorn Andersson, Andy Shevchenko, Stefan Wahren, Vinod Koul,
Thomas Andreatta, Caleb Sander Mateos, dmaengine, linux-kernel,
linux-rpi-kernel, linux-arm-kernel, linux-arm-msm
Cc: Olivier Dautricourt, Stefan Roese, Florian Fainelli, Ray Jui,
Scott Branden, Broadcom internal kernel review list,
Lars-Peter Clausen, Eugeniy Paltsev, Daniel Mack, Haojian Zhuang,
Robert Jarzmik, Lizhi Hou, Brian Xu, Raj Kumar Rampelli,
Michal Simek, Andrew Morton
Instead of open coded variant let's use recently introduced helper.
Reviewed-by: Bjorn Andersson <andersson@kernel.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/dma/k3dma.c | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
diff --git a/drivers/dma/k3dma.c b/drivers/dma/k3dma.c
index acc2983e28e0..88f9a2952edc 100644
--- a/drivers/dma/k3dma.c
+++ b/drivers/dma/k3dma.c
@@ -536,19 +536,14 @@ static struct dma_async_tx_descriptor *k3_dma_prep_slave_sg(
size_t len, avail, total = 0;
struct scatterlist *sg;
dma_addr_t addr, src = 0, dst = 0;
- int num = sglen, i;
+ int num, i;
if (sgl == NULL)
return NULL;
c->cyclic = 0;
- for_each_sg(sgl, sg, sglen, i) {
- avail = sg_dma_len(sg);
- if (avail > DMA_MAX_SIZE)
- num += DIV_ROUND_UP(avail, DMA_MAX_SIZE) - 1;
- }
-
+ num = sg_nents_for_dma(sgl, sglen, DMA_MAX_SIZE);
ds = k3_dma_alloc_desc_resource(num, chan);
if (!ds)
return NULL;
--
2.50.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v4 07/13] dmaengine: lgm: use sg_nents_for_dma() helper
2025-11-24 12:09 [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users Andy Shevchenko
` (5 preceding siblings ...)
2025-11-24 12:09 ` [PATCH v4 06/13] dmaengine: k3dma: " Andy Shevchenko
@ 2025-11-24 12:09 ` Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 08/13] dmaengine: pxa-dma: " Andy Shevchenko
` (6 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-11-24 12:09 UTC (permalink / raw)
To: Bjorn Andersson, Andy Shevchenko, Stefan Wahren, Vinod Koul,
Thomas Andreatta, Caleb Sander Mateos, dmaengine, linux-kernel,
linux-rpi-kernel, linux-arm-kernel, linux-arm-msm
Cc: Olivier Dautricourt, Stefan Roese, Florian Fainelli, Ray Jui,
Scott Branden, Broadcom internal kernel review list,
Lars-Peter Clausen, Eugeniy Paltsev, Daniel Mack, Haojian Zhuang,
Robert Jarzmik, Lizhi Hou, Brian Xu, Raj Kumar Rampelli,
Michal Simek, Andrew Morton
Instead of open coded variant let's use recently introduced helper.
Reviewed-by: Bjorn Andersson <andersson@kernel.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/dma/lgm/lgm-dma.c | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
diff --git a/drivers/dma/lgm/lgm-dma.c b/drivers/dma/lgm/lgm-dma.c
index 8173c3f1075a..a7b9cf30f6ad 100644
--- a/drivers/dma/lgm/lgm-dma.c
+++ b/drivers/dma/lgm/lgm-dma.c
@@ -1164,8 +1164,8 @@ ldma_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
struct dw2_desc *hw_ds;
struct dw2_desc_sw *ds;
struct scatterlist *sg;
- int num = sglen, i;
dma_addr_t addr;
+ int num, i;
if (!sgl)
return NULL;
@@ -1173,12 +1173,7 @@ ldma_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
if (d->ver > DMA_VER22)
return ldma_chan_desc_cfg(chan, sgl->dma_address, sglen);
- for_each_sg(sgl, sg, sglen, i) {
- avail = sg_dma_len(sg);
- if (avail > DMA_MAX_SIZE)
- num += DIV_ROUND_UP(avail, DMA_MAX_SIZE) - 1;
- }
-
+ num = sg_nents_for_dma(sgl, sglen, DMA_MAX_SIZE);
ds = dma_alloc_desc_resource(num, c);
if (!ds)
return NULL;
--
2.50.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v4 08/13] dmaengine: pxa-dma: use sg_nents_for_dma() helper
2025-11-24 12:09 [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users Andy Shevchenko
` (6 preceding siblings ...)
2025-11-24 12:09 ` [PATCH v4 07/13] dmaengine: lgm: " Andy Shevchenko
@ 2025-11-24 12:09 ` Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 09/13] dmaengine: qcom: adm: " Andy Shevchenko
` (5 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-11-24 12:09 UTC (permalink / raw)
To: Bjorn Andersson, Andy Shevchenko, Stefan Wahren, Vinod Koul,
Thomas Andreatta, Caleb Sander Mateos, dmaengine, linux-kernel,
linux-rpi-kernel, linux-arm-kernel, linux-arm-msm
Cc: Olivier Dautricourt, Stefan Roese, Florian Fainelli, Ray Jui,
Scott Branden, Broadcom internal kernel review list,
Lars-Peter Clausen, Eugeniy Paltsev, Daniel Mack, Haojian Zhuang,
Robert Jarzmik, Lizhi Hou, Brian Xu, Raj Kumar Rampelli,
Michal Simek, Andrew Morton
Instead of open coded variant let's use recently introduced helper.
Reviewed-by: Bjorn Andersson <andersson@kernel.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/dma/pxa_dma.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/dma/pxa_dma.c b/drivers/dma/pxa_dma.c
index 249296389771..b639c8b51e87 100644
--- a/drivers/dma/pxa_dma.c
+++ b/drivers/dma/pxa_dma.c
@@ -970,7 +970,7 @@ pxad_prep_slave_sg(struct dma_chan *dchan, struct scatterlist *sgl,
struct scatterlist *sg;
dma_addr_t dma;
u32 dcmd, dsadr = 0, dtadr = 0;
- unsigned int nb_desc = 0, i, j = 0;
+ unsigned int nb_desc, i, j = 0;
if ((sgl == NULL) || (sg_len == 0))
return NULL;
@@ -979,8 +979,7 @@ pxad_prep_slave_sg(struct dma_chan *dchan, struct scatterlist *sgl,
dev_dbg(&chan->vc.chan.dev->device,
"%s(): dir=%d flags=%lx\n", __func__, dir, flags);
- for_each_sg(sgl, sg, sg_len, i)
- nb_desc += DIV_ROUND_UP(sg_dma_len(sg), PDMA_MAX_DESC_BYTES);
+ nb_desc = sg_nents_for_dma(sgl, sg_len, PDMA_MAX_DESC_BYTES);
sw_desc = pxad_alloc_desc(chan, nb_desc + 1);
if (!sw_desc)
return NULL;
--
2.50.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v4 09/13] dmaengine: qcom: adm: use sg_nents_for_dma() helper
2025-11-24 12:09 [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users Andy Shevchenko
` (7 preceding siblings ...)
2025-11-24 12:09 ` [PATCH v4 08/13] dmaengine: pxa-dma: " Andy Shevchenko
@ 2025-11-24 12:09 ` Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 10/13] dmaengine: qcom: bam_dma: " Andy Shevchenko
` (4 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-11-24 12:09 UTC (permalink / raw)
To: Bjorn Andersson, Andy Shevchenko, Stefan Wahren, Vinod Koul,
Thomas Andreatta, Caleb Sander Mateos, dmaengine, linux-kernel,
linux-rpi-kernel, linux-arm-kernel, linux-arm-msm
Cc: Olivier Dautricourt, Stefan Roese, Florian Fainelli, Ray Jui,
Scott Branden, Broadcom internal kernel review list,
Lars-Peter Clausen, Eugeniy Paltsev, Daniel Mack, Haojian Zhuang,
Robert Jarzmik, Lizhi Hou, Brian Xu, Raj Kumar Rampelli,
Michal Simek, Andrew Morton
Instead of open coded variant let's use recently introduced helper.
Reviewed-by: Bjorn Andersson <andersson@kernel.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/dma/qcom/qcom_adm.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/drivers/dma/qcom/qcom_adm.c b/drivers/dma/qcom/qcom_adm.c
index e0f0c6f42c1f..aeb01b7087e2 100644
--- a/drivers/dma/qcom/qcom_adm.c
+++ b/drivers/dma/qcom/qcom_adm.c
@@ -390,16 +390,15 @@ static struct dma_async_tx_descriptor *adm_prep_slave_sg(struct dma_chan *chan,
}
/* iterate through sgs and compute allocation size of structures */
- for_each_sg(sgl, sg, sg_len, i) {
- if (achan->slave.device_fc) {
+ if (achan->slave.device_fc) {
+ for_each_sg(sgl, sg, sg_len, i) {
box_count += DIV_ROUND_UP(sg_dma_len(sg) / burst,
ADM_MAX_ROWS);
if (sg_dma_len(sg) % burst)
single_count++;
- } else {
- single_count += DIV_ROUND_UP(sg_dma_len(sg),
- ADM_MAX_XFER);
}
+ } else {
+ single_count = sg_nents_for_dma(sgl, sg_len, ADM_MAX_XFER);
}
async_desc = kzalloc(sizeof(*async_desc), GFP_NOWAIT);
--
2.50.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v4 10/13] dmaengine: qcom: bam_dma: use sg_nents_for_dma() helper
2025-11-24 12:09 [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users Andy Shevchenko
` (8 preceding siblings ...)
2025-11-24 12:09 ` [PATCH v4 09/13] dmaengine: qcom: adm: " Andy Shevchenko
@ 2025-11-24 12:09 ` Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 11/13] dmaengine: sa11x0: " Andy Shevchenko
` (3 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-11-24 12:09 UTC (permalink / raw)
To: Bjorn Andersson, Andy Shevchenko, Stefan Wahren, Vinod Koul,
Thomas Andreatta, Caleb Sander Mateos, dmaengine, linux-kernel,
linux-rpi-kernel, linux-arm-kernel, linux-arm-msm
Cc: Olivier Dautricourt, Stefan Roese, Florian Fainelli, Ray Jui,
Scott Branden, Broadcom internal kernel review list,
Lars-Peter Clausen, Eugeniy Paltsev, Daniel Mack, Haojian Zhuang,
Robert Jarzmik, Lizhi Hou, Brian Xu, Raj Kumar Rampelli,
Michal Simek, Andrew Morton
Instead of open coded variant let's use recently introduced helper.
Reviewed-by: Bjorn Andersson <andersson@kernel.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/dma/qcom/bam_dma.c | 9 ++-------
1 file changed, 2 insertions(+), 7 deletions(-)
diff --git a/drivers/dma/qcom/bam_dma.c b/drivers/dma/qcom/bam_dma.c
index 2cf060174795..62b3921f0d11 100644
--- a/drivers/dma/qcom/bam_dma.c
+++ b/drivers/dma/qcom/bam_dma.c
@@ -655,22 +655,17 @@ static struct dma_async_tx_descriptor *bam_prep_slave_sg(struct dma_chan *chan,
struct scatterlist *sg;
u32 i;
struct bam_desc_hw *desc;
- unsigned int num_alloc = 0;
-
+ unsigned int num_alloc;
if (!is_slave_direction(direction)) {
dev_err(bdev->dev, "invalid dma direction\n");
return NULL;
}
- /* calculate number of required entries */
- for_each_sg(sgl, sg, sg_len, i)
- num_alloc += DIV_ROUND_UP(sg_dma_len(sg), BAM_FIFO_SIZE);
-
/* allocate enough room to accommodate the number of entries */
+ num_alloc = sg_nents_for_dma(sgl, sg_len, BAM_FIFO_SIZE);
async_desc = kzalloc(struct_size(async_desc, desc, num_alloc),
GFP_NOWAIT);
-
if (!async_desc)
return NULL;
--
2.50.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v4 11/13] dmaengine: sa11x0: use sg_nents_for_dma() helper
2025-11-24 12:09 [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users Andy Shevchenko
` (9 preceding siblings ...)
2025-11-24 12:09 ` [PATCH v4 10/13] dmaengine: qcom: bam_dma: " Andy Shevchenko
@ 2025-11-24 12:09 ` Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 12/13] dmaengine: sh: " Andy Shevchenko
` (2 subsequent siblings)
13 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-11-24 12:09 UTC (permalink / raw)
To: Bjorn Andersson, Andy Shevchenko, Stefan Wahren, Vinod Koul,
Thomas Andreatta, Caleb Sander Mateos, dmaengine, linux-kernel,
linux-rpi-kernel, linux-arm-kernel, linux-arm-msm
Cc: Olivier Dautricourt, Stefan Roese, Florian Fainelli, Ray Jui,
Scott Branden, Broadcom internal kernel review list,
Lars-Peter Clausen, Eugeniy Paltsev, Daniel Mack, Haojian Zhuang,
Robert Jarzmik, Lizhi Hou, Brian Xu, Raj Kumar Rampelli,
Michal Simek, Andrew Morton
Instead of open coded variant let's use recently introduced helper.
Reviewed-by: Bjorn Andersson <andersson@kernel.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/dma/sa11x0-dma.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/drivers/dma/sa11x0-dma.c b/drivers/dma/sa11x0-dma.c
index dc1a9a05252e..86f1d7461f56 100644
--- a/drivers/dma/sa11x0-dma.c
+++ b/drivers/dma/sa11x0-dma.c
@@ -526,7 +526,7 @@ static struct dma_async_tx_descriptor *sa11x0_dma_prep_slave_sg(
struct sa11x0_dma_chan *c = to_sa11x0_dma_chan(chan);
struct sa11x0_dma_desc *txd;
struct scatterlist *sgent;
- unsigned i, j = sglen;
+ unsigned int i, j;
size_t size = 0;
/* SA11x0 channels can only operate in their native direction */
@@ -542,10 +542,7 @@ static struct dma_async_tx_descriptor *sa11x0_dma_prep_slave_sg(
for_each_sg(sg, sgent, sglen, i) {
dma_addr_t addr = sg_dma_address(sgent);
- unsigned int len = sg_dma_len(sgent);
- if (len > DMA_MAX_SIZE)
- j += DIV_ROUND_UP(len, DMA_MAX_SIZE & ~DMA_ALIGN) - 1;
if (addr & DMA_ALIGN) {
dev_dbg(chan->device->dev, "vchan %p: bad buffer alignment: %pad\n",
&c->vc, &addr);
@@ -553,6 +550,7 @@ static struct dma_async_tx_descriptor *sa11x0_dma_prep_slave_sg(
}
}
+ j = sg_nents_for_dma(sg, sglen, DMA_MAX_SIZE & ~DMA_ALIGN);
txd = kzalloc(struct_size(txd, sg, j), GFP_ATOMIC);
if (!txd) {
dev_dbg(chan->device->dev, "vchan %p: kzalloc failed\n", &c->vc);
--
2.50.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v4 12/13] dmaengine: sh: use sg_nents_for_dma() helper
2025-11-24 12:09 [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users Andy Shevchenko
` (10 preceding siblings ...)
2025-11-24 12:09 ` [PATCH v4 11/13] dmaengine: sa11x0: " Andy Shevchenko
@ 2025-11-24 12:09 ` Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 13/13] dmaengine: xilinx: xdma: " Andy Shevchenko
2025-12-16 13:11 ` [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users Vinod Koul
13 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-11-24 12:09 UTC (permalink / raw)
To: Bjorn Andersson, Andy Shevchenko, Stefan Wahren, Vinod Koul,
Thomas Andreatta, Caleb Sander Mateos, dmaengine, linux-kernel,
linux-rpi-kernel, linux-arm-kernel, linux-arm-msm
Cc: Olivier Dautricourt, Stefan Roese, Florian Fainelli, Ray Jui,
Scott Branden, Broadcom internal kernel review list,
Lars-Peter Clausen, Eugeniy Paltsev, Daniel Mack, Haojian Zhuang,
Robert Jarzmik, Lizhi Hou, Brian Xu, Raj Kumar Rampelli,
Michal Simek, Andrew Morton
Instead of open coded variant let's use recently introduced helper.
Reviewed-by: Bjorn Andersson <andersson@kernel.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/dma/sh/shdma-base.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/dma/sh/shdma-base.c b/drivers/dma/sh/shdma-base.c
index 834741adadaa..1e1b65e46668 100644
--- a/drivers/dma/sh/shdma-base.c
+++ b/drivers/dma/sh/shdma-base.c
@@ -577,12 +577,11 @@ static struct dma_async_tx_descriptor *shdma_prep_sg(struct shdma_chan *schan,
struct scatterlist *sg;
struct shdma_desc *first = NULL, *new = NULL /* compiler... */;
LIST_HEAD(tx_list);
- int chunks = 0;
+ int chunks;
unsigned long irq_flags;
int i;
- for_each_sg(sgl, sg, sg_len, i)
- chunks += DIV_ROUND_UP(sg_dma_len(sg), schan->max_xfer_len);
+ chunks = sg_nents_for_dma(sgl, sg_len, schan->max_xfer_len);
/* Have to lock the whole loop to protect against concurrent release */
spin_lock_irqsave(&schan->chan_lock, irq_flags);
--
2.50.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v4 13/13] dmaengine: xilinx: xdma: use sg_nents_for_dma() helper
2025-11-24 12:09 [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users Andy Shevchenko
` (11 preceding siblings ...)
2025-11-24 12:09 ` [PATCH v4 12/13] dmaengine: sh: " Andy Shevchenko
@ 2025-11-24 12:09 ` Andy Shevchenko
2025-12-16 13:11 ` [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users Vinod Koul
13 siblings, 0 replies; 15+ messages in thread
From: Andy Shevchenko @ 2025-11-24 12:09 UTC (permalink / raw)
To: Bjorn Andersson, Andy Shevchenko, Stefan Wahren, Vinod Koul,
Thomas Andreatta, Caleb Sander Mateos, dmaengine, linux-kernel,
linux-rpi-kernel, linux-arm-kernel, linux-arm-msm
Cc: Olivier Dautricourt, Stefan Roese, Florian Fainelli, Ray Jui,
Scott Branden, Broadcom internal kernel review list,
Lars-Peter Clausen, Eugeniy Paltsev, Daniel Mack, Haojian Zhuang,
Robert Jarzmik, Lizhi Hou, Brian Xu, Raj Kumar Rampelli,
Michal Simek, Andrew Morton
Instead of open coded variant let's use recently introduced helper.
Reviewed-by: Bjorn Andersson <andersson@kernel.org>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/dma/xilinx/xdma.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/drivers/dma/xilinx/xdma.c b/drivers/dma/xilinx/xdma.c
index 5ecf8223c112..118199a04902 100644
--- a/drivers/dma/xilinx/xdma.c
+++ b/drivers/dma/xilinx/xdma.c
@@ -605,13 +605,11 @@ xdma_prep_device_sg(struct dma_chan *chan, struct scatterlist *sgl,
struct xdma_chan *xdma_chan = to_xdma_chan(chan);
struct dma_async_tx_descriptor *tx_desc;
struct xdma_desc *sw_desc;
- u32 desc_num = 0, i;
u64 addr, dev_addr, *src, *dst;
+ u32 desc_num, i;
struct scatterlist *sg;
- for_each_sg(sgl, sg, sg_len, i)
- desc_num += DIV_ROUND_UP(sg_dma_len(sg), XDMA_DESC_BLEN_MAX);
-
+ desc_num = sg_nents_for_dma(sgl, sg_len, XDMA_DESC_BLEN_MAX);
sw_desc = xdma_alloc_desc(xdma_chan, desc_num, false);
if (!sw_desc)
return NULL;
--
2.50.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users
2025-11-24 12:09 [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users Andy Shevchenko
` (12 preceding siblings ...)
2025-11-24 12:09 ` [PATCH v4 13/13] dmaengine: xilinx: xdma: " Andy Shevchenko
@ 2025-12-16 13:11 ` Vinod Koul
13 siblings, 0 replies; 15+ messages in thread
From: Vinod Koul @ 2025-12-16 13:11 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Bjorn Andersson, Stefan Wahren, Thomas Andreatta,
Caleb Sander Mateos, dmaengine, linux-kernel, linux-rpi-kernel,
linux-arm-kernel, linux-arm-msm, Olivier Dautricourt,
Stefan Roese, Florian Fainelli, Ray Jui, Scott Branden,
Broadcom internal kernel review list, Lars-Peter Clausen,
Eugeniy Paltsev, Daniel Mack, Haojian Zhuang, Robert Jarzmik,
Lizhi Hou, Brian Xu, Raj Kumar Rampelli, Michal Simek,
Andrew Morton
On 24-11-25, 13:09, Andy Shevchenko wrote:
> A handful of the DMAengine drivers use same routine to calculate the number of
> SG entries needed for the given DMA transfer. Provide a common helper for them
> and convert.
>
> I left the new helper on SG level of API because brief grepping shows potential
> candidates outside of DMA engine, e.g.:
>
> drivers/crypto/chelsio/chcr_algo.c:154: nents += DIV_ROUND_UP(less, entlen);
> drivers/spi/spi-stm32.c:1495: /* Count the number of entries needed */
>
> Changelog v4:
> - fixed compilation errors (Vinod)
:-(
drivers/dma/altera-msgdma.c: In function ‘msgdma_prep_slave_sg’:
drivers/dma/altera-msgdma.c:399:29: error: unused variable ‘sg’ [-Werror=unused-variable]
Clearly your script is not working. I am surprised that you are not able
to compile these changes. Bit disappointed tbh!
--
~Vinod
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2025-12-16 13:11 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-24 12:09 [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 01/13] scatterlist: introduce sg_nents_for_dma() helper Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 02/13] dmaengine: altera-msgdma: use " Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 03/13] dmaengine: axi-dmac: " Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 04/13] dmaengine: bcm2835-dma: " Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 05/13] dmaengine: dw-axi-dmac: " Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 06/13] dmaengine: k3dma: " Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 07/13] dmaengine: lgm: " Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 08/13] dmaengine: pxa-dma: " Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 09/13] dmaengine: qcom: adm: " Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 10/13] dmaengine: qcom: bam_dma: " Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 11/13] dmaengine: sa11x0: " Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 12/13] dmaengine: sh: " Andy Shevchenko
2025-11-24 12:09 ` [PATCH v4 13/13] dmaengine: xilinx: xdma: " Andy Shevchenko
2025-12-16 13:11 ` [PATCH v4 0/13] dmaengine: introduce sg_nents_for_dma() and convert users 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).