Version:  2.0.40 2.2.26 2.4.37 3.13 3.14 3.15 3.16 3.17 3.18 3.19 4.0 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10

Linux/lib/iommu-helper.c

  1 /*
  2  * IOMMU helper functions for the free area management
  3  */
  4 
  5 #include <linux/export.h>
  6 #include <linux/bitmap.h>
  7 #include <linux/bug.h>
  8 
  9 int iommu_is_span_boundary(unsigned int index, unsigned int nr,
 10                            unsigned long shift,
 11                            unsigned long boundary_size)
 12 {
 13         BUG_ON(!is_power_of_2(boundary_size));
 14 
 15         shift = (shift + index) & (boundary_size - 1);
 16         return shift + nr > boundary_size;
 17 }
 18 
 19 unsigned long iommu_area_alloc(unsigned long *map, unsigned long size,
 20                                unsigned long start, unsigned int nr,
 21                                unsigned long shift, unsigned long boundary_size,
 22                                unsigned long align_mask)
 23 {
 24         unsigned long index;
 25 
 26         /* We don't want the last of the limit */
 27         size -= 1;
 28 again:
 29         index = bitmap_find_next_zero_area(map, size, start, nr, align_mask);
 30         if (index < size) {
 31                 if (iommu_is_span_boundary(index, nr, shift, boundary_size)) {
 32                         start = ALIGN(shift + index, boundary_size) - shift;
 33                         goto again;
 34                 }
 35                 bitmap_set(map, index, nr);
 36                 return index;
 37         }
 38         return -1;
 39 }
 40 EXPORT_SYMBOL(iommu_area_alloc);
 41 

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us