2 * IOMMU mmap management and range allocation functions.
3 * Based almost entirely upon the powerpc iommu allocator.
6 #include <linux/export.h>
7 #include <linux/bitmap.h>
9 #include <linux/iommu-helper.h>
10 #include <linux/iommu-common.h>
11 #include <linux/dma-mapping.h>
12 #include <linux/hash.h>
14 static unsigned long iommu_large_alloc
= 15;
16 static DEFINE_PER_CPU(unsigned int, iommu_hash_common
);
18 static inline bool need_flush(struct iommu_map_table
*iommu
)
20 return ((iommu
->flags
& IOMMU_NEED_FLUSH
) != 0);
23 static inline void set_flush(struct iommu_map_table
*iommu
)
25 iommu
->flags
|= IOMMU_NEED_FLUSH
;
28 static inline void clear_flush(struct iommu_map_table
*iommu
)
30 iommu
->flags
&= ~IOMMU_NEED_FLUSH
;
33 static void setup_iommu_pool_hash(void)
41 for_each_possible_cpu(i
)
42 per_cpu(iommu_hash_common
, i
) = hash_32(i
, IOMMU_POOL_HASHBITS
);
46 * Initialize iommu_pool entries for the iommu_map_table. `num_entries'
47 * is the number of table entries. If `large_pool' is set to true,
48 * the top 1/4 of the table will be set aside for pool allocations
49 * of more than iommu_large_alloc pages.
51 void iommu_tbl_pool_init(struct iommu_map_table
*iommu
,
52 unsigned long num_entries
,
54 void (*lazy_flush
)(struct iommu_map_table
*),
55 bool large_pool
, u32 npools
,
56 bool skip_span_boundary_check
)
58 unsigned int start
, i
;
59 struct iommu_pool
*p
= &(iommu
->large_pool
);
61 setup_iommu_pool_hash();
63 iommu
->nr_pools
= IOMMU_NR_POOLS
;
65 iommu
->nr_pools
= npools
;
66 BUG_ON(npools
> IOMMU_NR_POOLS
);
68 iommu
->table_shift
= table_shift
;
69 iommu
->lazy_flush
= lazy_flush
;
71 if (skip_span_boundary_check
)
72 iommu
->flags
|= IOMMU_NO_SPAN_BOUND
;
74 iommu
->flags
|= IOMMU_HAS_LARGE_POOL
;
77 iommu
->poolsize
= num_entries
/iommu
->nr_pools
;
79 iommu
->poolsize
= (num_entries
* 3 / 4)/iommu
->nr_pools
;
80 for (i
= 0; i
< iommu
->nr_pools
; i
++) {
81 spin_lock_init(&(iommu
->pools
[i
].lock
));
82 iommu
->pools
[i
].start
= start
;
83 iommu
->pools
[i
].hint
= start
;
84 start
+= iommu
->poolsize
; /* start for next pool */
85 iommu
->pools
[i
].end
= start
- 1;
89 /* initialize large_pool */
90 spin_lock_init(&(p
->lock
));
95 EXPORT_SYMBOL(iommu_tbl_pool_init
);
97 unsigned long iommu_tbl_range_alloc(struct device
*dev
,
98 struct iommu_map_table
*iommu
,
100 unsigned long *handle
,
102 unsigned int align_order
)
104 unsigned int pool_hash
= __this_cpu_read(iommu_hash_common
);
105 unsigned long n
, end
, start
, limit
, boundary_size
;
106 struct iommu_pool
*pool
;
108 unsigned int pool_nr
;
109 unsigned int npools
= iommu
->nr_pools
;
111 bool large_pool
= ((iommu
->flags
& IOMMU_HAS_LARGE_POOL
) != 0);
112 bool largealloc
= (large_pool
&& npages
> iommu_large_alloc
);
114 unsigned long align_mask
= 0;
117 align_mask
= ~0ul >> (BITS_PER_LONG
- align_order
);
120 if (unlikely(npages
== 0)) {
122 return IOMMU_ERROR_CODE
;
126 pool
= &(iommu
->large_pool
);
127 pool_nr
= 0; /* to keep compiler happy */
129 /* pick out pool_nr */
130 pool_nr
= pool_hash
& (npools
- 1);
131 pool
= &(iommu
->pools
[pool_nr
]);
133 spin_lock_irqsave(&pool
->lock
, flags
);
136 if (pass
== 0 && handle
&& *handle
&&
137 (*handle
>= pool
->start
) && (*handle
< pool
->end
))
144 /* The case below can happen if we have a small segment appended
145 * to a large, or when the previous alloc was at the very end of
146 * the available space. If so, go back to the beginning. If a
147 * flush is needed, it will get done based on the return value
148 * from iommu_area_alloc() below.
152 shift
= iommu
->table_map_base
>> iommu
->table_shift
;
153 if (limit
+ shift
> mask
) {
154 limit
= mask
- shift
+ 1;
155 /* If we're constrained on address range, first try
156 * at the masked hint to avoid O(n) search complexity,
157 * but on second pass, start at 0 in pool 0.
159 if ((start
& mask
) >= limit
|| pass
> 0) {
160 spin_unlock(&(pool
->lock
));
161 pool
= &(iommu
->pools
[0]);
162 spin_lock(&(pool
->lock
));
170 boundary_size
= ALIGN(dma_get_seg_boundary(dev
) + 1,
171 1 << iommu
->table_shift
);
173 boundary_size
= ALIGN(1ULL << 32, 1 << iommu
->table_shift
);
175 boundary_size
= boundary_size
>> iommu
->table_shift
;
177 * if the skip_span_boundary_check had been set during init, we set
178 * things up so that iommu_is_span_boundary() merely checks if the
179 * (index + npages) < num_tsb_entries
181 if ((iommu
->flags
& IOMMU_NO_SPAN_BOUND
) != 0) {
183 boundary_size
= iommu
->poolsize
* iommu
->nr_pools
;
185 n
= iommu_area_alloc(iommu
->map
, limit
, start
, npages
, shift
,
186 boundary_size
, align_mask
);
188 if (likely(pass
== 0)) {
189 /* First failure, rescan from the beginning. */
190 pool
->hint
= pool
->start
;
194 } else if (!largealloc
&& pass
<= iommu
->nr_pools
) {
195 spin_unlock(&(pool
->lock
));
196 pool_nr
= (pool_nr
+ 1) & (iommu
->nr_pools
- 1);
197 pool
= &(iommu
->pools
[pool_nr
]);
198 spin_lock(&(pool
->lock
));
199 pool
->hint
= pool
->start
;
205 n
= IOMMU_ERROR_CODE
;
209 if (iommu
->lazy_flush
&&
210 (n
< pool
->hint
|| need_flush(iommu
))) {
212 iommu
->lazy_flush(iommu
);
218 /* Update handle for SG allocations */
222 spin_unlock_irqrestore(&(pool
->lock
), flags
);
226 EXPORT_SYMBOL(iommu_tbl_range_alloc
);
228 static struct iommu_pool
*get_pool(struct iommu_map_table
*tbl
,
231 struct iommu_pool
*p
;
232 unsigned long largepool_start
= tbl
->large_pool
.start
;
233 bool large_pool
= ((tbl
->flags
& IOMMU_HAS_LARGE_POOL
) != 0);
235 /* The large pool is the last pool at the top of the table */
236 if (large_pool
&& entry
>= largepool_start
) {
237 p
= &tbl
->large_pool
;
239 unsigned int pool_nr
= entry
/ tbl
->poolsize
;
241 BUG_ON(pool_nr
>= tbl
->nr_pools
);
242 p
= &tbl
->pools
[pool_nr
];
247 /* Caller supplies the index of the entry into the iommu map table
248 * itself when the mapping from dma_addr to the entry is not the
249 * default addr->entry mapping below.
251 void iommu_tbl_range_free(struct iommu_map_table
*iommu
, u64 dma_addr
,
252 unsigned long npages
, unsigned long entry
)
254 struct iommu_pool
*pool
;
256 unsigned long shift
= iommu
->table_shift
;
258 if (entry
== IOMMU_ERROR_CODE
) /* use default addr->entry mapping */
259 entry
= (dma_addr
- iommu
->table_map_base
) >> shift
;
260 pool
= get_pool(iommu
, entry
);
262 spin_lock_irqsave(&(pool
->lock
), flags
);
263 bitmap_clear(iommu
->map
, entry
, npages
);
264 spin_unlock_irqrestore(&(pool
->lock
), flags
);
266 EXPORT_SYMBOL(iommu_tbl_range_free
);