Lines Matching refs:bitmap
103 u64 __user *bitmap; member
127 static unsigned long iova_bitmap_offset_to_index(struct iova_bitmap *bitmap, in iova_bitmap_offset_to_index() argument
130 unsigned long pgsize = 1 << bitmap->mapped.pgshift; in iova_bitmap_offset_to_index()
132 return iova / (BITS_PER_TYPE(*bitmap->bitmap) * pgsize); in iova_bitmap_offset_to_index()
138 static unsigned long iova_bitmap_index_to_offset(struct iova_bitmap *bitmap, in iova_bitmap_index_to_offset() argument
141 unsigned long pgshift = bitmap->mapped.pgshift; in iova_bitmap_index_to_offset()
143 return (index * BITS_PER_TYPE(*bitmap->bitmap)) << pgshift; in iova_bitmap_index_to_offset()
149 static unsigned long iova_bitmap_mapped_iova(struct iova_bitmap *bitmap) in iova_bitmap_mapped_iova() argument
151 unsigned long skip = bitmap->mapped_base_index; in iova_bitmap_mapped_iova()
153 return bitmap->iova + iova_bitmap_index_to_offset(bitmap, skip); in iova_bitmap_mapped_iova()
161 static int iova_bitmap_get(struct iova_bitmap *bitmap) in iova_bitmap_get() argument
163 struct iova_bitmap_map *mapped = &bitmap->mapped; in iova_bitmap_get()
174 npages = DIV_ROUND_UP((bitmap->mapped_total_index - in iova_bitmap_get()
175 bitmap->mapped_base_index) * in iova_bitmap_get()
176 sizeof(*bitmap->bitmap), PAGE_SIZE); in iova_bitmap_get()
188 addr = bitmap->bitmap + bitmap->mapped_base_index; in iova_bitmap_get()
197 mapped->iova = iova_bitmap_mapped_iova(bitmap); in iova_bitmap_get()
213 static void iova_bitmap_put(struct iova_bitmap *bitmap) in iova_bitmap_put() argument
215 struct iova_bitmap_map *mapped = &bitmap->mapped; in iova_bitmap_put()
241 struct iova_bitmap *bitmap; in iova_bitmap_alloc() local
244 bitmap = kzalloc(sizeof(*bitmap), GFP_KERNEL); in iova_bitmap_alloc()
245 if (!bitmap) in iova_bitmap_alloc()
248 mapped = &bitmap->mapped; in iova_bitmap_alloc()
250 bitmap->bitmap = data; in iova_bitmap_alloc()
251 bitmap->mapped_total_index = in iova_bitmap_alloc()
252 iova_bitmap_offset_to_index(bitmap, length - 1) + 1; in iova_bitmap_alloc()
253 bitmap->iova = iova; in iova_bitmap_alloc()
254 bitmap->length = length; in iova_bitmap_alloc()
262 rc = iova_bitmap_get(bitmap); in iova_bitmap_alloc()
265 return bitmap; in iova_bitmap_alloc()
268 iova_bitmap_free(bitmap); in iova_bitmap_alloc()
279 void iova_bitmap_free(struct iova_bitmap *bitmap) in iova_bitmap_free() argument
281 struct iova_bitmap_map *mapped = &bitmap->mapped; in iova_bitmap_free()
283 iova_bitmap_put(bitmap); in iova_bitmap_free()
290 kfree(bitmap); in iova_bitmap_free()
297 static unsigned long iova_bitmap_mapped_remaining(struct iova_bitmap *bitmap) in iova_bitmap_mapped_remaining() argument
301 bytes = (bitmap->mapped.npages << PAGE_SHIFT) - bitmap->mapped.pgoff; in iova_bitmap_mapped_remaining()
303 remaining = bitmap->mapped_total_index - bitmap->mapped_base_index; in iova_bitmap_mapped_remaining()
305 bytes / sizeof(*bitmap->bitmap)); in iova_bitmap_mapped_remaining()
313 static unsigned long iova_bitmap_mapped_length(struct iova_bitmap *bitmap) in iova_bitmap_mapped_length() argument
315 unsigned long max_iova = bitmap->iova + bitmap->length - 1; in iova_bitmap_mapped_length()
316 unsigned long iova = iova_bitmap_mapped_iova(bitmap); in iova_bitmap_mapped_length()
325 remaining = iova_bitmap_index_to_offset(bitmap, in iova_bitmap_mapped_length()
326 iova_bitmap_mapped_remaining(bitmap)); in iova_bitmap_mapped_length()
337 static bool iova_bitmap_done(struct iova_bitmap *bitmap) in iova_bitmap_done() argument
339 return bitmap->mapped_base_index >= bitmap->mapped_total_index; in iova_bitmap_done()
347 static int iova_bitmap_advance(struct iova_bitmap *bitmap) in iova_bitmap_advance() argument
349 unsigned long iova = iova_bitmap_mapped_length(bitmap) - 1; in iova_bitmap_advance()
350 unsigned long count = iova_bitmap_offset_to_index(bitmap, iova) + 1; in iova_bitmap_advance()
352 bitmap->mapped_base_index += count; in iova_bitmap_advance()
354 iova_bitmap_put(bitmap); in iova_bitmap_advance()
355 if (iova_bitmap_done(bitmap)) in iova_bitmap_advance()
359 return iova_bitmap_get(bitmap); in iova_bitmap_advance()
375 int iova_bitmap_for_each(struct iova_bitmap *bitmap, void *opaque, in iova_bitmap_for_each() argument
380 for (; !iova_bitmap_done(bitmap) && !ret; in iova_bitmap_for_each()
381 ret = iova_bitmap_advance(bitmap)) { in iova_bitmap_for_each()
382 ret = fn(bitmap, iova_bitmap_mapped_iova(bitmap), in iova_bitmap_for_each()
383 iova_bitmap_mapped_length(bitmap), opaque); in iova_bitmap_for_each()
401 void iova_bitmap_set(struct iova_bitmap *bitmap, in iova_bitmap_set() argument
404 struct iova_bitmap_map *mapped = &bitmap->mapped; in iova_bitmap_set()