scatterlist: introduce sg_nents_for_dma() helper

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>
Link: https://patch.msgid.link/20260108105619.3513561-2-andriy.shevchenko@linux.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
This commit is contained in:
Andy Shevchenko
2026-01-08 11:50:12 +01:00
committed by Vinod Koul
parent fe7b87d908
commit 80c70bfb95
2 changed files with 28 additions and 0 deletions

View File

@@ -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);

View File

@@ -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