提交 3715863a 编写于 作者: F FUJITA Tomonori 提交者: Linus Torvalds

iommu: export iommu_is_span_boundary helper function

iommu_is_span_boundary is used internally in the IOMMU helper
(lib/iommu-helper.c), a primitive function that judges whether a memory area
spans LLD's segment boundary or not.

It's difficult to convert some IOMMUs to use the IOMMU helper but
iommu_is_span_boundary is still useful for them.  So this patch exports it.

This is needed for the parisc iommu fixes.
Signed-off-by: NFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Cc: Kyle McMartin <kyle@parisc-linux.org>
Cc: Matthew Wilcox <matthew@wil.cx>
Cc: Grant Grundler <grundler@parisc-linux.org>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 7eb701dc
extern int iommu_is_span_boundary(unsigned int index, unsigned int nr,
unsigned long shift,
unsigned long boundary_size);
extern unsigned long iommu_area_alloc(unsigned long *map, unsigned long size, extern unsigned long iommu_area_alloc(unsigned long *map, unsigned long size,
unsigned long start, unsigned int nr, unsigned long start, unsigned int nr,
unsigned long shift, unsigned long shift,
......
...@@ -40,10 +40,12 @@ static inline void set_bit_area(unsigned long *map, unsigned long i, ...@@ -40,10 +40,12 @@ static inline void set_bit_area(unsigned long *map, unsigned long i,
} }
} }
static inline int is_span_boundary(unsigned int index, unsigned int nr, int iommu_is_span_boundary(unsigned int index, unsigned int nr,
unsigned long shift, unsigned long shift,
unsigned long boundary_size) unsigned long boundary_size)
{ {
BUG_ON(!is_power_of_2(boundary_size));
shift = (shift + index) & (boundary_size - 1); shift = (shift + index) & (boundary_size - 1);
return shift + nr > boundary_size; return shift + nr > boundary_size;
} }
...@@ -57,7 +59,7 @@ unsigned long iommu_area_alloc(unsigned long *map, unsigned long size, ...@@ -57,7 +59,7 @@ unsigned long iommu_area_alloc(unsigned long *map, unsigned long size,
again: again:
index = find_next_zero_area(map, size, start, nr, align_mask); index = find_next_zero_area(map, size, start, nr, align_mask);
if (index != -1) { if (index != -1) {
if (is_span_boundary(index, nr, shift, boundary_size)) { if (iommu_is_span_boundary(index, nr, shift, boundary_size)) {
/* we could do more effectively */ /* we could do more effectively */
start = index + 1; start = index + 1;
goto again; goto again;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册