mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
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:
committed by
Vinod Koul
parent
fe7b87d908
commit
80c70bfb95
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user