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 int iommu_is_span_boundary(unsigned int index
, unsigned int nr
,
45 unsigned long boundary_size
)
47 BUG_ON(!is_power_of_2(boundary_size
));
49 shift
= (shift
+ index
) & (boundary_size
- 1);
50 return shift
+ nr
> boundary_size
;
53 unsigned long iommu_area_alloc(unsigned long *map
, unsigned long size
,
54 unsigned long start
, unsigned int nr
,
55 unsigned long shift
, unsigned long boundary_size
,
56 unsigned long align_mask
)
60 index
= find_next_zero_area(map
, size
, start
, nr
, align_mask
);
62 if (iommu_is_span_boundary(index
, nr
, shift
, boundary_size
)) {
63 /* we could do more effectively */
67 set_bit_area(map
, index
, nr
);
71 EXPORT_SYMBOL(iommu_area_alloc
);
73 void iommu_area_free(unsigned long *map
, unsigned long start
, unsigned int nr
)
75 unsigned long end
= start
+ nr
;
78 __clear_bit(start
, map
);
82 EXPORT_SYMBOL(iommu_area_free
);