2 * IOMMU helper functions for the free area management
5 #include <linux/module.h>
6 #include <linux/bitops.h>
8 static unsigned long find_next_zero_area(unsigned long *map
,
12 unsigned long align_mask
)
14 unsigned long index
, end
, i
;
16 index
= find_next_zero_bit(map
, size
, start
);
18 /* Align allocation */
19 index
= (index
+ align_mask
) & ~align_mask
;
24 for (i
= index
; i
< end
; i
++) {
25 if (test_bit(i
, map
)) {
33 static inline void set_bit_area(unsigned long *map
, unsigned long i
,
36 unsigned long end
= i
+ len
;
43 static inline int is_span_boundary(unsigned int index
, unsigned int nr
,
45 unsigned long boundary_size
)
47 shift
= (shift
+ index
) & (boundary_size
- 1);
48 return shift
+ nr
> boundary_size
;
51 unsigned long iommu_area_alloc(unsigned long *map
, unsigned long size
,
52 unsigned long start
, unsigned int nr
,
53 unsigned long shift
, unsigned long boundary_size
,
54 unsigned long align_mask
)
58 index
= find_next_zero_area(map
, size
, start
, nr
, align_mask
);
60 if (is_span_boundary(index
, nr
, shift
, boundary_size
)) {
61 /* we could do more effectively */
65 set_bit_area(map
, index
, nr
);
69 EXPORT_SYMBOL(iommu_area_alloc
);
71 void iommu_area_free(unsigned long *map
, unsigned long start
, unsigned int nr
)
73 unsigned long end
= start
+ nr
;
76 __clear_bit(start
, map
);
80 EXPORT_SYMBOL(iommu_area_free
);