Lines Matching refs:cma
42 struct cma cma_areas[MAX_CMA_AREAS];
46 phys_addr_t cma_get_base(const struct cma *cma) in cma_get_base() argument
48 return PFN_PHYS(cma->base_pfn); in cma_get_base()
51 unsigned long cma_get_size(const struct cma *cma) in cma_get_size() argument
53 return cma->count << PAGE_SHIFT; in cma_get_size()
56 static unsigned long cma_bitmap_aligned_mask(const struct cma *cma, in cma_bitmap_aligned_mask() argument
59 if (align_order <= cma->order_per_bit) in cma_bitmap_aligned_mask()
61 return (1UL << (align_order - cma->order_per_bit)) - 1; in cma_bitmap_aligned_mask()
68 static unsigned long cma_bitmap_aligned_offset(const struct cma *cma, in cma_bitmap_aligned_offset() argument
71 if (align_order <= cma->order_per_bit) in cma_bitmap_aligned_offset()
74 return (ALIGN(cma->base_pfn, (1UL << align_order)) in cma_bitmap_aligned_offset()
75 - cma->base_pfn) >> cma->order_per_bit; in cma_bitmap_aligned_offset()
78 static unsigned long cma_bitmap_pages_to_bits(const struct cma *cma, in cma_bitmap_pages_to_bits() argument
81 return ALIGN(pages, 1UL << cma->order_per_bit) >> cma->order_per_bit; in cma_bitmap_pages_to_bits()
84 static void cma_clear_bitmap(struct cma *cma, unsigned long pfn, in cma_clear_bitmap() argument
89 bitmap_no = (pfn - cma->base_pfn) >> cma->order_per_bit; in cma_clear_bitmap()
90 bitmap_count = cma_bitmap_pages_to_bits(cma, count); in cma_clear_bitmap()
92 mutex_lock(&cma->lock); in cma_clear_bitmap()
93 bitmap_clear(cma->bitmap, bitmap_no, bitmap_count); in cma_clear_bitmap()
94 mutex_unlock(&cma->lock); in cma_clear_bitmap()
97 static int __init cma_activate_area(struct cma *cma) in cma_activate_area() argument
99 int bitmap_size = BITS_TO_LONGS(cma_bitmap_maxno(cma)) * sizeof(long); in cma_activate_area()
100 unsigned long base_pfn = cma->base_pfn, pfn = base_pfn; in cma_activate_area()
101 unsigned i = cma->count >> pageblock_order; in cma_activate_area()
104 cma->bitmap = kzalloc(bitmap_size, GFP_KERNEL); in cma_activate_area()
106 if (!cma->bitmap) in cma_activate_area()
130 mutex_init(&cma->lock); in cma_activate_area()
133 INIT_HLIST_HEAD(&cma->mem_head); in cma_activate_area()
134 spin_lock_init(&cma->mem_head_lock); in cma_activate_area()
140 kfree(cma->bitmap); in cma_activate_area()
141 cma->count = 0; in cma_activate_area()
171 struct cma **res_cma) in cma_init_reserved_mem()
173 struct cma *cma; in cma_init_reserved_mem() local
199 cma = &cma_areas[cma_area_count]; in cma_init_reserved_mem()
200 cma->base_pfn = PFN_DOWN(base); in cma_init_reserved_mem()
201 cma->count = size >> PAGE_SHIFT; in cma_init_reserved_mem()
202 cma->order_per_bit = order_per_bit; in cma_init_reserved_mem()
203 *res_cma = cma; in cma_init_reserved_mem()
231 bool fixed, struct cma **res_cma) in cma_declare_contiguous()
362 struct page *cma_alloc(struct cma *cma, unsigned int count, unsigned int align) in cma_alloc() argument
369 if (!cma || !cma->count) in cma_alloc()
372 pr_debug("%s(cma %p, count %d, align %d)\n", __func__, (void *)cma, in cma_alloc()
378 mask = cma_bitmap_aligned_mask(cma, align); in cma_alloc()
379 offset = cma_bitmap_aligned_offset(cma, align); in cma_alloc()
380 bitmap_maxno = cma_bitmap_maxno(cma); in cma_alloc()
381 bitmap_count = cma_bitmap_pages_to_bits(cma, count); in cma_alloc()
384 mutex_lock(&cma->lock); in cma_alloc()
385 bitmap_no = bitmap_find_next_zero_area_off(cma->bitmap, in cma_alloc()
389 mutex_unlock(&cma->lock); in cma_alloc()
392 bitmap_set(cma->bitmap, bitmap_no, bitmap_count); in cma_alloc()
398 mutex_unlock(&cma->lock); in cma_alloc()
400 pfn = cma->base_pfn + (bitmap_no << cma->order_per_bit); in cma_alloc()
409 cma_clear_bitmap(cma, pfn, count); in cma_alloc()
435 bool cma_release(struct cma *cma, const struct page *pages, unsigned int count) in cma_release() argument
439 if (!cma || !pages) in cma_release()
446 if (pfn < cma->base_pfn || pfn >= cma->base_pfn + cma->count) in cma_release()
449 VM_BUG_ON(pfn + count > cma->base_pfn + cma->count); in cma_release()
452 cma_clear_bitmap(cma, pfn, count); in cma_release()