3 * (C) COPYRIGHT ARM Limited. All rights reserved.
5 * This program is free software and is provided to you under the terms of the
6 * GNU General Public License version 2 as published by the Free Software
7 * Foundation, and any use by you of this program is subject to the terms
10 * A copy of the licence is included with the program, and can also be obtained
11 * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
12 * Boston, MA 02110-1301, USA.
21 * @file mali_kbase_mem.c
22 * Base kernel memory APIs
24 #ifdef CONFIG_DMA_SHARED_BUFFER
25 #include <linux/dma-buf.h>
26 #endif /* CONFIG_DMA_SHARED_BUFFER */
28 #include <linux/bug.h>
29 #include <linux/compat.h>
31 #include <kbase/mali_kbase_config.h>
32 #include <kbase/src/common/mali_kbase.h>
33 #include <kbase/src/common/mali_midg_regmap.h>
34 #include <kbase/src/common/mali_kbase_cache_policy.h>
35 #include <kbase/src/common/mali_kbase_hw.h>
36 #include <kbase/src/common/mali_kbase_gator.h>
39 * @brief Check the zone compatibility of two regions.
41 STATIC int kbase_region_tracker_match_zone(struct kbase_va_region *reg1, struct kbase_va_region *reg2)
43 return ((reg1->flags & KBASE_REG_ZONE_MASK) == (reg2->flags & KBASE_REG_ZONE_MASK));
46 KBASE_EXPORT_TEST_API(kbase_region_tracker_match_zone)
48 /* This function inserts a region into the tree. */
49 static void kbase_region_tracker_insert(struct kbase_context *kctx, struct kbase_va_region *new_reg)
51 u64 start_pfn = new_reg->start_pfn;
52 struct rb_node **link = &(kctx->reg_rbtree.rb_node);
53 struct rb_node *parent = NULL;
55 /* Find the right place in the tree using tree search */
57 struct kbase_va_region *old_reg;
60 old_reg = rb_entry(parent, struct kbase_va_region, rblink);
62 /* RBTree requires no duplicate entries. */
63 KBASE_DEBUG_ASSERT(old_reg->start_pfn != start_pfn);
65 if (old_reg->start_pfn > start_pfn)
66 link = &(*link)->rb_left;
68 link = &(*link)->rb_right;
71 /* Put the new node there, and rebalance tree */
72 rb_link_node(&(new_reg->rblink), parent, link);
73 rb_insert_color(&(new_reg->rblink), &(kctx->reg_rbtree));
76 /* Find allocated region enclosing range. */
77 struct kbase_va_region *kbase_region_tracker_find_region_enclosing_range(kbase_context *kctx, u64 start_pfn, size_t nr_pages)
79 struct rb_node *rbnode;
80 struct kbase_va_region *reg;
81 u64 end_pfn = start_pfn + nr_pages;
83 rbnode = kctx->reg_rbtree.rb_node;
86 u64 tmp_start_pfn, tmp_end_pfn;
87 reg = rb_entry(rbnode, struct kbase_va_region, rblink);
88 tmp_start_pfn = reg->start_pfn;
89 tmp_end_pfn = reg->start_pfn + kbase_reg_current_backed_size(reg);
91 /* If start is lower than this, go left. */
92 if (start_pfn < tmp_start_pfn)
93 rbnode = rbnode->rb_left;
94 /* If end is higher than this, then go right. */
95 else if (end_pfn > tmp_end_pfn)
96 rbnode = rbnode->rb_right;
104 /* Find allocated region enclosing free range. */
105 struct kbase_va_region *kbase_region_tracker_find_region_enclosing_range_free(kbase_context *kctx, u64 start_pfn, size_t nr_pages)
107 struct rb_node *rbnode;
108 struct kbase_va_region *reg;
109 u64 end_pfn = start_pfn + nr_pages;
111 rbnode = kctx->reg_rbtree.rb_node;
113 u64 tmp_start_pfn, tmp_end_pfn;
114 reg = rb_entry(rbnode, struct kbase_va_region, rblink);
115 tmp_start_pfn = reg->start_pfn;
116 tmp_end_pfn = reg->start_pfn + reg->nr_pages;
118 /* If start is lower than this, go left. */
119 if (start_pfn < tmp_start_pfn)
120 rbnode = rbnode->rb_left;
121 /* If end is higher than this, then go right. */
122 else if (end_pfn > tmp_end_pfn)
123 rbnode = rbnode->rb_right;
131 /* Find region enclosing given address. */
132 kbase_va_region *kbase_region_tracker_find_region_enclosing_address(kbase_context *kctx, mali_addr64 gpu_addr)
134 struct rb_node *rbnode;
135 struct kbase_va_region *reg;
136 u64 gpu_pfn = gpu_addr >> PAGE_SHIFT;
138 KBASE_DEBUG_ASSERT(NULL != kctx);
140 rbnode = kctx->reg_rbtree.rb_node;
142 u64 tmp_start_pfn, tmp_end_pfn;
143 reg = rb_entry(rbnode, struct kbase_va_region, rblink);
144 tmp_start_pfn = reg->start_pfn;
145 tmp_end_pfn = reg->start_pfn + reg->nr_pages;
147 /* If start is lower than this, go left. */
148 if (gpu_pfn < tmp_start_pfn)
149 rbnode = rbnode->rb_left;
150 /* If end is higher than this, then go right. */
151 else if (gpu_pfn >= tmp_end_pfn)
152 rbnode = rbnode->rb_right;
160 KBASE_EXPORT_TEST_API(kbase_region_tracker_find_region_enclosing_address)
162 /* Find region with given base address */
163 kbase_va_region *kbase_region_tracker_find_region_base_address(kbase_context *kctx, mali_addr64 gpu_addr)
165 u64 gpu_pfn = gpu_addr >> PAGE_SHIFT;
166 struct rb_node *rbnode;
167 struct kbase_va_region *reg;
169 KBASE_DEBUG_ASSERT(NULL != kctx);
171 rbnode = kctx->reg_rbtree.rb_node;
173 reg = rb_entry(rbnode, struct kbase_va_region, rblink);
174 if (reg->start_pfn > gpu_pfn)
175 rbnode = rbnode->rb_left;
176 else if (reg->start_pfn < gpu_pfn)
177 rbnode = rbnode->rb_right;
178 else if (gpu_pfn == reg->start_pfn)
187 KBASE_EXPORT_TEST_API(kbase_region_tracker_find_region_base_address)
189 /* Find region meeting given requirements */
190 static struct kbase_va_region *kbase_region_tracker_find_region_meeting_reqs(kbase_context *kctx, struct kbase_va_region *reg_reqs, size_t nr_pages, size_t align)
192 struct rb_node *rbnode;
193 struct kbase_va_region *reg;
195 /* Note that this search is a linear search, as we do not have a target
196 address in mind, so does not benefit from the rbtree search */
197 rbnode = rb_first(&(kctx->reg_rbtree));
199 reg = rb_entry(rbnode, struct kbase_va_region, rblink);
200 if ((reg->nr_pages >= nr_pages) && (reg->flags & KBASE_REG_FREE) && kbase_region_tracker_match_zone(reg, reg_reqs)) {
202 /* Check alignment */
203 u64 start_pfn = (reg->start_pfn + align - 1) & ~(align - 1);
204 if ((start_pfn >= reg->start_pfn) && (start_pfn <= (reg->start_pfn + reg->nr_pages - 1)) && ((start_pfn + nr_pages - 1) <= (reg->start_pfn + reg->nr_pages - 1)))
207 rbnode = rb_next(rbnode);
214 * @brief Remove a region object from the global list.
216 * The region reg is removed, possibly by merging with other free and
217 * compatible adjacent regions. It must be called with the context
218 * region lock held. The associated memory is not released (see
219 * kbase_free_alloced_region). Internal use only.
221 STATIC mali_error kbase_remove_va_region(kbase_context *kctx, struct kbase_va_region *reg)
223 struct rb_node *rbprev;
224 struct kbase_va_region *prev = NULL;
225 struct rb_node *rbnext;
226 struct kbase_va_region *next = NULL;
228 int merged_front = 0;
230 mali_error err = MALI_ERROR_NONE;
232 /* Try to merge with the previous block first */
233 rbprev = rb_prev(&(reg->rblink));
235 prev = rb_entry(rbprev, struct kbase_va_region, rblink);
236 if ((prev->flags & KBASE_REG_FREE) && kbase_region_tracker_match_zone(prev, reg)) {
237 /* We're compatible with the previous VMA, merge with it */
238 prev->nr_pages += reg->nr_pages;
239 rb_erase(&(reg->rblink), &kctx->reg_rbtree);
245 /* Try to merge with the next block second */
246 /* Note we do the lookup here as the tree may have been rebalanced. */
247 rbnext = rb_next(&(reg->rblink));
249 /* We're compatible with the next VMA, merge with it */
250 next = rb_entry(rbnext, struct kbase_va_region, rblink);
251 if ((next->flags & KBASE_REG_FREE) && kbase_region_tracker_match_zone(next, reg)) {
252 next->start_pfn = reg->start_pfn;
253 next->nr_pages += reg->nr_pages;
254 rb_erase(&(reg->rblink), &kctx->reg_rbtree);
257 /* We already merged with prev, free it */
258 kbase_free_alloced_region(reg);
263 /* If we failed to merge then we need to add a new block */
264 if (!(merged_front || merged_back)) {
266 * We didn't merge anything. Add a new free
267 * placeholder and remove the original one.
269 struct kbase_va_region *free_reg;
271 free_reg = kbase_alloc_free_region(kctx, reg->start_pfn, reg->nr_pages, reg->flags & KBASE_REG_ZONE_MASK);
273 err = MALI_ERROR_OUT_OF_MEMORY;
277 rb_replace_node(&(reg->rblink), &(free_reg->rblink), &(kctx->reg_rbtree));
284 KBASE_EXPORT_TEST_API(kbase_remove_va_region)
287 * @brief Insert a VA region to the list, replacing the current at_reg.
289 static mali_error kbase_insert_va_region_nolock(kbase_context *kctx, struct kbase_va_region *new_reg, struct kbase_va_region *at_reg, u64 start_pfn, size_t nr_pages)
291 mali_error err = MALI_ERROR_NONE;
293 /* Must be a free region */
294 KBASE_DEBUG_ASSERT((at_reg->flags & KBASE_REG_FREE) != 0);
295 /* start_pfn should be contained within at_reg */
296 KBASE_DEBUG_ASSERT((start_pfn >= at_reg->start_pfn) && (start_pfn < at_reg->start_pfn + at_reg->nr_pages));
297 /* at least nr_pages from start_pfn should be contained within at_reg */
298 KBASE_DEBUG_ASSERT(start_pfn + nr_pages <= at_reg->start_pfn + at_reg->nr_pages);
300 new_reg->start_pfn = start_pfn;
301 new_reg->nr_pages = nr_pages;
303 /* Regions are a whole use, so swap and delete old one. */
304 if (at_reg->start_pfn == start_pfn && at_reg->nr_pages == nr_pages) {
305 rb_replace_node(&(at_reg->rblink), &(new_reg->rblink), &(kctx->reg_rbtree));
306 kbase_free_alloced_region(at_reg);
308 /* New region replaces the start of the old one, so insert before. */
309 else if (at_reg->start_pfn == start_pfn) {
310 at_reg->start_pfn += nr_pages;
311 KBASE_DEBUG_ASSERT(at_reg->nr_pages >= nr_pages);
312 at_reg->nr_pages -= nr_pages;
314 kbase_region_tracker_insert(kctx, new_reg);
316 /* New region replaces the end of the old one, so insert after. */
317 else if ((at_reg->start_pfn + at_reg->nr_pages) == (start_pfn + nr_pages)) {
318 at_reg->nr_pages -= nr_pages;
320 kbase_region_tracker_insert(kctx, new_reg);
322 /* New region splits the old one, so insert and create new */
324 struct kbase_va_region *new_front_reg = kbase_alloc_free_region(kctx, at_reg->start_pfn, start_pfn - at_reg->start_pfn, at_reg->flags & KBASE_REG_ZONE_MASK);
326 at_reg->nr_pages -= nr_pages + new_front_reg->nr_pages;
327 at_reg->start_pfn = start_pfn + nr_pages;
329 kbase_region_tracker_insert(kctx, new_front_reg);
330 kbase_region_tracker_insert(kctx, new_reg);
332 err = MALI_ERROR_OUT_OF_MEMORY;
340 * @brief Add a VA region to the list.
342 mali_error kbase_add_va_region(kbase_context *kctx, struct kbase_va_region *reg, mali_addr64 addr, size_t nr_pages, size_t align)
344 struct kbase_va_region *tmp;
345 u64 gpu_pfn = addr >> PAGE_SHIFT;
346 mali_error err = MALI_ERROR_NONE;
348 KBASE_DEBUG_ASSERT(NULL != kctx);
349 KBASE_DEBUG_ASSERT(NULL != reg);
354 /* must be a power of 2 */
355 KBASE_DEBUG_ASSERT((align & (align - 1)) == 0);
356 KBASE_DEBUG_ASSERT(nr_pages > 0);
358 /* Path 1: Map a specific address. Find the enclosing region, which *must* be free. */
360 KBASE_DEBUG_ASSERT(!(gpu_pfn & (align - 1)));
362 tmp = kbase_region_tracker_find_region_enclosing_range_free(kctx, gpu_pfn, nr_pages);
364 KBASE_DEBUG_PRINT_WARN(KBASE_MEM, "Enclosing region not found: 0x%08llx gpu_pfn, %zu nr_pages", gpu_pfn, nr_pages);
365 err = MALI_ERROR_OUT_OF_GPU_MEMORY;
369 if ((!kbase_region_tracker_match_zone(tmp, reg)) || (!(tmp->flags & KBASE_REG_FREE))) {
370 KBASE_DEBUG_PRINT_WARN(KBASE_MEM, "Zone mismatch: %lu != %lu", tmp->flags & KBASE_REG_ZONE_MASK, reg->flags & KBASE_REG_ZONE_MASK);
371 KBASE_DEBUG_PRINT_WARN(KBASE_MEM, "!(tmp->flags & KBASE_REG_FREE): tmp->start_pfn=0x%llx tmp->flags=0x%lx tmp->nr_pages=0x%zx gpu_pfn=0x%llx nr_pages=0x%zx\n", tmp->start_pfn, tmp->flags, tmp->nr_pages, gpu_pfn, nr_pages);
372 KBASE_DEBUG_PRINT_WARN(KBASE_MEM, "in function %s (%p, %p, 0x%llx, 0x%zx, 0x%zx)\n", __func__, kctx, reg, addr, nr_pages, align);
373 err = MALI_ERROR_OUT_OF_GPU_MEMORY;
377 err = kbase_insert_va_region_nolock(kctx, reg, tmp, gpu_pfn, nr_pages);
379 KBASE_DEBUG_PRINT_WARN(KBASE_MEM, "Failed to insert va region");
380 err = MALI_ERROR_OUT_OF_GPU_MEMORY;
387 /* Path 2: Map any free address which meets the requirements. */
390 tmp = kbase_region_tracker_find_region_meeting_reqs(kctx, reg, nr_pages, align);
392 err = MALI_ERROR_OUT_OF_GPU_MEMORY;
395 start_pfn = (tmp->start_pfn + align - 1) & ~(align - 1);
396 err = kbase_insert_va_region_nolock(kctx, reg, tmp, start_pfn, nr_pages);
403 KBASE_EXPORT_TEST_API(kbase_add_va_region)
406 * @brief Initialize the internal region tracker data structure.
408 static void kbase_region_tracker_ds_init(kbase_context *kctx, struct kbase_va_region *same_va_reg, struct kbase_va_region *exec_reg, struct kbase_va_region *custom_va_reg)
410 kctx->reg_rbtree = RB_ROOT;
411 kbase_region_tracker_insert(kctx, same_va_reg);
413 /* exec and custom_va_reg doesn't always exist */
414 if (exec_reg && custom_va_reg) {
415 kbase_region_tracker_insert(kctx, exec_reg);
416 kbase_region_tracker_insert(kctx, custom_va_reg);
420 void kbase_region_tracker_term(kbase_context *kctx)
422 struct rb_node *rbnode;
423 struct kbase_va_region *reg;
425 rbnode = rb_first(&(kctx->reg_rbtree));
427 rb_erase(rbnode, &(kctx->reg_rbtree));
428 reg = rb_entry(rbnode, struct kbase_va_region, rblink);
429 kbase_free_alloced_region(reg);
435 * Initialize the region tracker data structure.
437 mali_error kbase_region_tracker_init(kbase_context *kctx)
439 struct kbase_va_region *same_va_reg;
440 struct kbase_va_region *exec_reg = NULL;
441 struct kbase_va_region *custom_va_reg = NULL;
442 size_t same_va_bits = sizeof(void*) * BITS_PER_BYTE;
443 u64 custom_va_size = KBASE_REG_ZONE_CUSTOM_VA_SIZE;
444 u64 gpu_va_limit = (1ULL << kctx->kbdev->gpu_props.mmu.va_bits) >> PAGE_SHIFT;
447 if (is_compat_task())
451 if (kctx->kbdev->gpu_props.mmu.va_bits < same_va_bits)
452 return MALI_ERROR_FUNCTION_FAILED;
454 /* all have SAME_VA */
455 same_va_reg = kbase_alloc_free_region(kctx, 1, (1ULL << (same_va_bits - PAGE_SHIFT)) - 2, KBASE_REG_ZONE_SAME_VA);
457 return MALI_ERROR_OUT_OF_MEMORY;
460 /* only 32-bit clients have the other two zones */
461 if (is_compat_task()) {
463 if (gpu_va_limit <= KBASE_REG_ZONE_CUSTOM_VA_BASE) {
464 kbase_free_alloced_region(same_va_reg);
465 return MALI_ERROR_FUNCTION_FAILED;
467 /* If the current size of TMEM is out of range of the
468 * virtual address space addressable by the MMU then
469 * we should shrink it to fit
471 if( (KBASE_REG_ZONE_CUSTOM_VA_BASE + KBASE_REG_ZONE_CUSTOM_VA_SIZE) >= gpu_va_limit )
472 custom_va_size = gpu_va_limit - KBASE_REG_ZONE_CUSTOM_VA_BASE;
474 exec_reg = kbase_alloc_free_region(kctx, KBASE_REG_ZONE_EXEC_BASE, KBASE_REG_ZONE_EXEC_SIZE, KBASE_REG_ZONE_EXEC);
476 kbase_free_alloced_region(same_va_reg);
477 return MALI_ERROR_OUT_OF_MEMORY;
480 custom_va_reg = kbase_alloc_free_region(kctx, KBASE_REG_ZONE_CUSTOM_VA_BASE, custom_va_size, KBASE_REG_ZONE_CUSTOM_VA);
481 if (!custom_va_reg) {
482 kbase_free_alloced_region(same_va_reg);
483 kbase_free_alloced_region(exec_reg);
484 return MALI_ERROR_OUT_OF_MEMORY;
490 kbase_region_tracker_ds_init(kctx, same_va_reg, exec_reg, custom_va_reg);
492 return MALI_ERROR_NONE;
495 mali_error kbase_mem_init(struct kbase_device *kbdev)
497 kbasep_mem_device *memdev;
498 size_t max_shared_memory;
499 KBASE_DEBUG_ASSERT(kbdev);
501 memdev = &kbdev->memdev;
503 max_shared_memory = (size_t)kbasep_get_config_value(kbdev, kbdev->config_attributes, KBASE_CONFIG_ATTR_MEMORY_OS_SHARED_MAX);
505 if (MALI_ERROR_NONE != kbase_mem_usage_init(&memdev->usage, max_shared_memory >> PAGE_SHIFT)) {
506 return MALI_ERROR_FUNCTION_FAILED;
509 /* nothing to do, zero-inited when kbase_device was created */
510 return MALI_ERROR_NONE;
513 void kbase_mem_halt(kbase_device *kbdev)
518 void kbase_mem_term(kbase_device *kbdev)
520 kbasep_mem_device *memdev;
521 KBASE_DEBUG_ASSERT(kbdev);
523 memdev = &kbdev->memdev;
525 kbase_mem_usage_term(&memdev->usage);
528 KBASE_EXPORT_TEST_API(kbase_mem_term)
530 mali_error kbase_mem_usage_init(struct kbasep_mem_usage *usage, size_t max_pages)
532 KBASE_DEBUG_ASSERT(usage);
534 atomic_set(&usage->cur_pages, 0);
535 /* query the max page count */
536 usage->max_pages = max_pages;
538 return MALI_ERROR_NONE;
541 void kbase_mem_usage_term(kbasep_mem_usage *usage)
543 KBASE_DEBUG_ASSERT(usage);
544 /* No memory should be in use now */
545 if (0 != atomic_read(&usage->cur_pages)) {
546 printk(KERN_ERR "Pages in use! %d\n", atomic_read(&usage->cur_pages));
548 /* So any new alloc requests will fail */
549 usage->max_pages = 0;
550 /* So we printk on double term */
551 atomic_set(&usage->cur_pages, INT_MAX);
554 mali_error kbase_mem_usage_request_pages(kbasep_mem_usage *usage, size_t nr_pages)
559 KBASE_DEBUG_ASSERT(usage);
560 KBASE_DEBUG_ASSERT(nr_pages); /* 0 pages would be an error in the calling code */
563 * Fetch the initial cur_pages value
564 * each loop iteration below fetches
565 * it as part of the store attempt
567 cur_pages = atomic_read(&usage->cur_pages);
569 /* this check allows the simple if test in the loop below */
570 if (usage->max_pages < nr_pages)
571 goto usage_cap_exceeded;
575 /* enough pages to fullfill the request? */
576 if (usage->max_pages - nr_pages < cur_pages) {
578 KBASE_DEBUG_PRINT_WARN(KBASE_MEM, "Memory usage cap has been reached:\n" "\t%lu pages currently used\n" "\t%lu pages usage cap\n" "\t%lu new pages requested\n" "\twould result in %lu pages over the cap\n", (unsigned long)cur_pages, (unsigned long)usage->max_pages, (unsigned long)nr_pages, (unsigned long)(cur_pages + nr_pages - usage->max_pages));
579 return MALI_ERROR_OUT_OF_MEMORY;
582 /* try to atomically commit the new count */
583 old_cur_pages = cur_pages;
584 new_cur_pages = cur_pages + nr_pages;
585 cur_pages = atomic_cmpxchg(&usage->cur_pages, old_cur_pages,
587 /* cur_pages will be like old_cur_pages if there was no race */
588 } while (cur_pages != old_cur_pages);
590 #ifdef CONFIG_MALI_GATOR_SUPPORT
591 kbase_trace_mali_total_alloc_pages_change((long long int)cur_pages);
592 #endif /* CONFIG_MALI_GATOR_SUPPORT */
594 return MALI_ERROR_NONE;
597 KBASE_EXPORT_TEST_API(kbase_mem_usage_request_pages)
599 void kbase_mem_usage_release_pages(kbasep_mem_usage *usage, size_t nr_pages)
602 KBASE_DEBUG_ASSERT(usage);
603 KBASE_DEBUG_ASSERT(nr_pages <= atomic_read(&usage->cur_pages));
605 new_val = atomic_sub_return(nr_pages, &usage->cur_pages);
606 #ifdef CONFIG_MALI_GATOR_SUPPORT
607 kbase_trace_mali_total_alloc_pages_change((long long int)new_val);
608 #endif /* CONFIG_MALI_GATOR_SUPPORT */
611 KBASE_EXPORT_TEST_API(kbase_mem_usage_release_pages)
614 * @brief Wait for GPU write flush - only in use for BASE_HW_ISSUE_6367
616 * Wait 1000 GPU clock cycles. This delay is known to give the GPU time to flush its write buffer.
617 * @note If GPU resets occur then the counters are reset to zero, the delay may not be as expected.
619 #ifndef CONFIG_MALI_NO_MALI
620 void kbase_wait_write_flush(kbase_context *kctx)
623 /* A suspend won't happen here, because we're in a syscall from a userspace thread */
624 kbase_pm_context_active(kctx->kbdev);
625 kbase_pm_request_gpu_cycle_counter(kctx->kbdev);
628 new_count = kbase_reg_read(kctx->kbdev, GPU_CONTROL_REG(CYCLE_COUNT_LO), NULL);
629 /* First time around, just store the count. */
630 if (base_count == 0) {
631 base_count = new_count;
635 /* No need to handle wrapping, unsigned maths works for this. */
636 if ((new_count - base_count) > 1000)
639 kbase_pm_release_gpu_cycle_counter(kctx->kbdev);
640 kbase_pm_context_idle(kctx->kbdev);
642 #endif /* CONFIG_MALI_NO_MALI */
647 * @brief Allocate a free region object.
649 * The allocated object is not part of any list yet, and is flagged as
650 * KBASE_REG_FREE. No mapping is allocated yet.
652 * zone is KBASE_REG_ZONE_CUSTOM_VA, KBASE_REG_ZONE_SAME_VA, or KBASE_REG_ZONE_EXEC
655 struct kbase_va_region *kbase_alloc_free_region(kbase_context *kctx, u64 start_pfn, size_t nr_pages, int zone)
657 struct kbase_va_region *new_reg;
659 KBASE_DEBUG_ASSERT(kctx != NULL);
661 /* zone argument should only contain zone related region flags */
662 KBASE_DEBUG_ASSERT((zone & ~KBASE_REG_ZONE_MASK) == 0);
663 KBASE_DEBUG_ASSERT(nr_pages > 0);
664 KBASE_DEBUG_ASSERT(start_pfn + nr_pages <= (UINT64_MAX / PAGE_SIZE)); /* 64-bit address range is the max */
666 new_reg = kzalloc(sizeof(*new_reg), GFP_KERNEL);
669 KBASE_DEBUG_PRINT_WARN(KBASE_MEM, "kzalloc failed");
673 new_reg->alloc = NULL; /* no alloc bound yet */
674 new_reg->kctx = kctx;
675 new_reg->flags = zone | KBASE_REG_FREE;
677 new_reg->flags |= KBASE_REG_GROWABLE;
679 new_reg->start_pfn = start_pfn;
680 new_reg->nr_pages = nr_pages;
685 KBASE_EXPORT_TEST_API(kbase_alloc_free_region)
688 * @brief Free a region object.
690 * The described region must be freed of any mapping.
692 * If the region is not flagged as KBASE_REG_FREE, the region's
693 * alloc object will be released.
694 * It is a bug if no alloc object exists for non-free regions.
697 void kbase_free_alloced_region(struct kbase_va_region *reg)
699 KBASE_DEBUG_ASSERT(NULL != reg);
700 if (!(reg->flags & KBASE_REG_FREE)) {
701 KBASE_DEBUG_ASSERT(reg->alloc);
702 kbase_mem_phy_alloc_put(reg->alloc);
704 /* To detect use-after-free in debug builds */
705 reg->flags |= KBASE_REG_FREE);
710 KBASE_EXPORT_TEST_API(kbase_free_alloced_region)
712 void kbase_mmu_update(kbase_context *kctx)
714 /* Use GPU implementation-defined caching policy. */
715 u32 memattr = ASn_MEMATTR_IMPL_DEF_CACHE_POLICY;
718 KBASE_DEBUG_ASSERT(NULL != kctx);
719 /* ASSERT that the context has a valid as_nr, which is only the case
720 * when it's scheduled in.
722 * as_nr won't change because the caller has the runpool_irq lock */
723 KBASE_DEBUG_ASSERT(kctx->as_nr != KBASEP_AS_NR_INVALID);
725 pgd_high = sizeof(kctx->pgd) > 4 ? (kctx->pgd >> 32) : 0;
727 kbase_reg_write(kctx->kbdev, MMU_AS_REG(kctx->as_nr, ASn_TRANSTAB_LO), (kctx->pgd & ASn_TRANSTAB_ADDR_SPACE_MASK) | ASn_TRANSTAB_READ_INNER | ASn_TRANSTAB_ADRMODE_TABLE, kctx);
729 /* Need to use a conditional expression to avoid "right shift count >= width of type"
730 * error when using an if statement - although the size_of condition is evaluated at compile
731 * time the unused branch is not removed until after it is type-checked and the error
734 pgd_high = sizeof(kctx->pgd) > 4 ? (kctx->pgd >> 32) : 0;
736 kbase_reg_write(kctx->kbdev, MMU_AS_REG(kctx->as_nr, ASn_TRANSTAB_HI), pgd_high, kctx);
738 kbase_reg_write(kctx->kbdev, MMU_AS_REG(kctx->as_nr, ASn_MEMATTR_LO), memattr, kctx);
739 kbase_reg_write(kctx->kbdev, MMU_AS_REG(kctx->as_nr, ASn_MEMATTR_HI), memattr, kctx);
740 kbase_reg_write(kctx->kbdev, MMU_AS_REG(kctx->as_nr, ASn_COMMAND), ASn_COMMAND_UPDATE, kctx);
743 KBASE_EXPORT_TEST_API(kbase_mmu_update)
745 void kbase_mmu_disable(kbase_context *kctx)
747 KBASE_DEBUG_ASSERT(NULL != kctx);
748 /* ASSERT that the context has a valid as_nr, which is only the case
749 * when it's scheduled in.
751 * as_nr won't change because the caller has the runpool_irq lock */
752 KBASE_DEBUG_ASSERT(kctx->as_nr != KBASEP_AS_NR_INVALID);
754 kbase_reg_write(kctx->kbdev, MMU_AS_REG(kctx->as_nr, ASn_TRANSTAB_LO), 0, kctx);
755 kbase_reg_write(kctx->kbdev, MMU_AS_REG(kctx->as_nr, ASn_TRANSTAB_HI), 0, kctx);
756 kbase_reg_write(kctx->kbdev, MMU_AS_REG(kctx->as_nr, ASn_COMMAND), ASn_COMMAND_UPDATE, kctx);
759 KBASE_EXPORT_TEST_API(kbase_mmu_disable)
761 mali_error kbase_gpu_mmap(kbase_context *kctx, struct kbase_va_region *reg, mali_addr64 addr, size_t nr_pages, size_t align)
764 KBASE_DEBUG_ASSERT(NULL != kctx);
765 KBASE_DEBUG_ASSERT(NULL != reg);
767 err = kbase_add_va_region(kctx, reg, addr, nr_pages, align);
768 if (MALI_ERROR_NONE != err)
771 err = kbase_mmu_insert_pages(kctx, reg->start_pfn, kbase_get_phy_pages(reg), kbase_reg_current_backed_size(reg) , reg->flags & ((1 << KBASE_REG_FLAGS_NR_BITS) - 1));
772 if (MALI_ERROR_NONE != err)
773 kbase_remove_va_region(kctx, reg);
778 KBASE_EXPORT_TEST_API(kbase_gpu_mmap)
780 mali_error kbase_gpu_munmap(kbase_context *kctx, struct kbase_va_region *reg)
784 if (reg->start_pfn == 0)
785 return MALI_ERROR_NONE;
787 err = kbase_mmu_teardown_pages(kctx, reg->start_pfn, kbase_reg_current_backed_size(reg));
788 if (MALI_ERROR_NONE != err)
791 err = kbase_remove_va_region(kctx, reg);
795 STATIC struct kbase_cpu_mapping *kbasep_find_enclosing_cpu_mapping_of_region(const struct kbase_va_region *reg, unsigned long uaddr, size_t size)
797 struct kbase_cpu_mapping *map;
798 struct list_head *pos;
800 KBASE_DEBUG_ASSERT(NULL != reg);
801 KBASE_DEBUG_ASSERT(reg->alloc);
803 if ((uintptr_t) uaddr + size < (uintptr_t) uaddr) /* overflow check */
806 list_for_each(pos, ®->alloc->mappings) {
807 map = list_entry(pos, kbase_cpu_mapping, mappings_list);
808 if (map->vma->vm_start <= uaddr && map->vma->vm_end >= uaddr + size)
815 KBASE_EXPORT_TEST_API(kbasep_find_enclosing_cpu_mapping_of_region)
817 struct kbase_cpu_mapping *kbasep_find_enclosing_cpu_mapping(kbase_context *kctx, mali_addr64 gpu_addr, unsigned long uaddr, size_t size)
819 struct kbase_cpu_mapping *map = NULL;
820 const struct kbase_va_region *reg;
822 KBASE_DEBUG_ASSERT(kctx != NULL);
824 kbase_gpu_vm_lock(kctx);
826 reg = kbase_region_tracker_find_region_enclosing_address(kctx, gpu_addr);
828 map = kbasep_find_enclosing_cpu_mapping_of_region(reg, uaddr, size);
830 kbase_gpu_vm_unlock(kctx);
835 KBASE_EXPORT_TEST_API(kbasep_find_enclosing_cpu_mapping)
837 static mali_error kbase_do_syncset(kbase_context *kctx, struct base_syncset *set, kbase_sync_kmem_fn sync_fn)
839 mali_error err = MALI_ERROR_NONE;
840 struct basep_syncset *sset = &set->basep_sset;
841 struct kbase_va_region *reg;
842 struct kbase_cpu_mapping *map;
845 phys_addr_t base_phy_addr = 0;
847 u64 page_off, page_count;
849 unsigned int offset_within_page;
850 void *base_virt_addr = 0;
851 size_t area_size = 0;
853 kbase_os_mem_map_lock(kctx);
855 kbase_gpu_vm_lock(kctx);
857 /* find the region where the virtual address is contained */
858 reg = kbase_region_tracker_find_region_enclosing_address(kctx, sset->mem_handle);
860 KBASE_DEBUG_PRINT_WARN(KBASE_MEM, "Can't find region at VA 0x%016llX", sset->mem_handle);
861 err = MALI_ERROR_FUNCTION_FAILED;
865 if (!(reg->flags & KBASE_REG_CPU_CACHED))
868 start = (uintptr_t)sset->user_addr;
869 size = (size_t)sset->size;
871 map = kbasep_find_enclosing_cpu_mapping_of_region(reg, start, size);
873 KBASE_DEBUG_PRINT_WARN(KBASE_MEM, "Can't find CPU mapping 0x%016lX for VA 0x%016llX", start, sset->mem_handle);
874 err = MALI_ERROR_FUNCTION_FAILED;
878 offset_within_page = start & (PAGE_SIZE - 1);
879 page_off = map->page_off + ((start - map->vma->vm_start) >> PAGE_SHIFT);
880 page_count = ((size + offset_within_page + (PAGE_SIZE - 1)) & PAGE_MASK) >> PAGE_SHIFT;
881 pa = kbase_get_phy_pages(reg);
883 for (i = 0; i < page_count; i++) {
884 u32 offset = start & (PAGE_SIZE - 1);
885 phys_addr_t paddr = pa[page_off + i] + offset;
886 size_t sz = MIN(((size_t) PAGE_SIZE - offset), size);
888 if (paddr == base_phy_addr + area_size && start == ((uintptr_t) base_virt_addr + area_size)) {
890 } else if (area_size > 0) {
891 sync_fn(base_phy_addr, base_virt_addr, area_size);
895 if (area_size == 0) {
896 base_phy_addr = paddr;
897 base_virt_addr = (void *)(uintptr_t)start;
906 sync_fn(base_phy_addr, base_virt_addr, area_size);
908 KBASE_DEBUG_ASSERT(size == 0);
911 kbase_gpu_vm_unlock(kctx);
912 kbase_os_mem_map_unlock(kctx);
916 mali_error kbase_sync_now(kbase_context *kctx, struct base_syncset *syncset)
918 mali_error err = MALI_ERROR_FUNCTION_FAILED;
919 struct basep_syncset *sset;
921 KBASE_DEBUG_ASSERT(NULL != kctx);
922 KBASE_DEBUG_ASSERT(NULL != syncset);
924 sset = &syncset->basep_sset;
926 switch (sset->type) {
927 case BASE_SYNCSET_OP_MSYNC:
928 err = kbase_do_syncset(kctx, syncset, kbase_sync_to_memory);
931 case BASE_SYNCSET_OP_CSYNC:
932 err = kbase_do_syncset(kctx, syncset, kbase_sync_to_cpu);
936 KBASE_DEBUG_PRINT_WARN(KBASE_MEM, "Unknown msync op %d\n", sset->type);
943 KBASE_EXPORT_TEST_API(kbase_sync_now)
945 /* vm lock must be held */
946 mali_error kbase_mem_free_region(kbase_context *kctx, kbase_va_region *reg)
949 KBASE_DEBUG_ASSERT(NULL != kctx);
950 KBASE_DEBUG_ASSERT(NULL != reg);
951 BUG_ON(!mutex_is_locked(&kctx->reg_lock));
952 err = kbase_gpu_munmap(kctx, reg);
954 KBASE_DEBUG_PRINT_WARN(KBASE_MEM, "Could not unmap from the GPU...\n");
958 if (kbase_hw_has_issue(kctx->kbdev, BASE_HW_ISSUE_6367)) {
959 /* Wait for GPU to flush write buffer before freeing physical pages */
960 kbase_wait_write_flush(kctx);
963 /* This will also free the physical pages */
964 kbase_free_alloced_region(reg);
970 KBASE_EXPORT_TEST_API(kbase_mem_free_region)
973 * @brief Free the region from the GPU and unregister it.
975 * This function implements the free operation on a memory segment.
976 * It will loudly fail if called with outstanding mappings.
978 mali_error kbase_mem_free(kbase_context *kctx, mali_addr64 gpu_addr)
980 mali_error err = MALI_ERROR_NONE;
981 struct kbase_va_region *reg;
983 KBASE_DEBUG_ASSERT(kctx != NULL);
986 KBASE_DEBUG_PRINT_WARN(KBASE_MEM, "gpu_addr 0 is reserved for the ringbuffer and it's an error to try to free it using kbase_mem_free\n");
987 return MALI_ERROR_FUNCTION_FAILED;
989 kbase_gpu_vm_lock(kctx);
991 if (gpu_addr < PAGE_SIZE) {
992 /* an OS specific cookie, ask the OS specific code to validate it */
993 reg = kbase_lookup_cookie(kctx, gpu_addr);
995 err = MALI_ERROR_FUNCTION_FAILED;
999 /* ask to unlink the cookie as we'll free it */
1000 kbase_unlink_cookie(kctx, gpu_addr, reg);
1002 kbase_free_alloced_region(reg);
1006 /* Validate the region */
1007 reg = kbase_region_tracker_find_region_base_address(kctx, gpu_addr);
1009 KBASE_DEBUG_ASSERT_MSG(0, "Trying to free nonexistent region\n 0x%llX", gpu_addr);
1010 err = MALI_ERROR_FUNCTION_FAILED;
1014 err = kbase_mem_free_region(kctx, reg);
1018 kbase_gpu_vm_unlock(kctx);
1022 KBASE_EXPORT_TEST_API(kbase_mem_free)
1024 void kbase_update_region_flags(struct kbase_va_region *reg, unsigned long flags)
1026 KBASE_DEBUG_ASSERT(NULL != reg);
1027 KBASE_DEBUG_ASSERT((flags & ~((1 << BASE_MEM_FLAGS_NR_BITS) - 1)) == 0);
1029 reg->flags |= kbase_cache_enabled(flags, reg->nr_pages);
1030 /* all memory is now growable */
1031 reg->flags |= KBASE_REG_GROWABLE;
1033 if (flags & BASE_MEM_GROW_ON_GPF)
1034 reg->flags |= KBASE_REG_PF_GROW;
1036 if (flags & BASE_MEM_PROT_CPU_WR)
1037 reg->flags |= KBASE_REG_CPU_WR;
1039 if (flags & BASE_MEM_PROT_CPU_RD)
1040 reg->flags |= KBASE_REG_CPU_RD;
1042 if (flags & BASE_MEM_PROT_GPU_WR)
1043 reg->flags |= KBASE_REG_GPU_WR;
1045 if (flags & BASE_MEM_PROT_GPU_RD)
1046 reg->flags |= KBASE_REG_GPU_RD;
1048 if (0 == (flags & BASE_MEM_PROT_GPU_EX))
1049 reg->flags |= KBASE_REG_GPU_NX;
1051 if (flags & BASE_MEM_COHERENT_LOCAL)
1052 reg->flags |= KBASE_REG_SHARE_IN;
1053 else if (flags & BASE_MEM_COHERENT_SYSTEM)
1054 reg->flags |= KBASE_REG_SHARE_BOTH;
1057 KBASE_EXPORT_TEST_API(kbase_update_region_flags)
1059 int kbase_alloc_phy_pages_helper(struct kbase_mem_phy_alloc * alloc, size_t nr_pages_requested)
1061 KBASE_DEBUG_ASSERT(alloc);
1062 KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_NATIVE);
1063 KBASE_DEBUG_ASSERT(alloc->imported.kctx);
1065 if (0 == nr_pages_requested)
1066 goto done; /*nothing to do*/
1068 if (MALI_ERROR_NONE != kbase_mem_usage_request_pages(&alloc->imported.kctx->usage, nr_pages_requested))
1071 if (MALI_ERROR_NONE != kbase_mem_usage_request_pages(&alloc->imported.kctx->kbdev->memdev.usage, nr_pages_requested))
1072 goto no_memdev_usage;
1074 if (MALI_ERROR_NONE != kbase_mem_allocator_alloc(&alloc->imported.kctx->osalloc, nr_pages_requested, alloc->pages + alloc->nents))
1077 alloc->nents += nr_pages_requested;
1079 kbase_process_page_usage_inc(alloc->imported.kctx, nr_pages_requested);
1084 kbase_mem_usage_release_pages(&alloc->imported.kctx->kbdev->memdev.usage, nr_pages_requested);
1086 kbase_mem_usage_release_pages(&alloc->imported.kctx->usage, nr_pages_requested);
1091 int kbase_free_phy_pages_helper(struct kbase_mem_phy_alloc * alloc, size_t nr_pages_to_free)
1094 phys_addr_t *start_free;
1095 KBASE_DEBUG_ASSERT(alloc);
1096 KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_NATIVE);
1097 KBASE_DEBUG_ASSERT(alloc->imported.kctx);
1098 KBASE_DEBUG_ASSERT(alloc->nents >= nr_pages_to_free);
1100 /* early out if nothing to do */
1101 if (0 == nr_pages_to_free)
1104 start_free = alloc->pages + alloc->nents - nr_pages_to_free;
1106 syncback = alloc->accessed_cached ? MALI_TRUE : MALI_FALSE;
1108 kbase_mem_allocator_free(&alloc->imported.kctx->osalloc,
1113 alloc->nents -= nr_pages_to_free;
1114 kbase_process_page_usage_dec(alloc->imported.kctx, nr_pages_to_free);
1115 kbase_mem_usage_release_pages(&alloc->imported.kctx->usage, nr_pages_to_free);
1116 kbase_mem_usage_release_pages(&alloc->imported.kctx->kbdev->memdev.usage, nr_pages_to_free);
1121 void kbase_mem_kref_free(struct kref * kref)
1123 struct kbase_mem_phy_alloc * alloc;
1124 alloc = container_of(kref, struct kbase_mem_phy_alloc, kref);
1126 switch (alloc->type) {
1127 case KBASE_MEM_TYPE_NATIVE:
1129 KBASE_DEBUG_ASSERT(alloc->imported.kctx);
1130 kbase_free_phy_pages_helper(alloc, alloc->nents);
1133 case KBASE_MEM_TYPE_RAW:
1134 /* raw pages, external cleanup */
1137 case KBASE_MEM_TYPE_IMPORTED_UMP:
1138 ump_dd_release(alloc->imported.ump_handle);
1141 #ifdef CONFIG_DMA_SHARED_BUFFER
1142 case KBASE_MEM_TYPE_IMPORTED_UMM:
1143 dma_buf_detach(alloc->imported.umm.dma_buf, alloc->imported.umm.dma_attachment);
1144 dma_buf_put(alloc->imported.umm.dma_buf);
1147 case KBASE_MEM_TYPE_TB:
1150 tb = alloc->imported.kctx->jctx.tb;
1151 kbase_device_trace_buffer_uninstall(alloc->imported.kctx);
1156 WARN(1, "Unexecpted free of type %d\n", alloc->type);
1162 KBASE_EXPORT_TEST_API(kbase_mem_kref_free);
1164 int kbase_alloc_phy_pages(struct kbase_va_region *reg, size_t vsize, size_t size)
1166 KBASE_DEBUG_ASSERT(NULL != reg);
1167 KBASE_DEBUG_ASSERT(vsize > 0);
1169 /* validate user provided arguments */
1170 if (size > vsize || vsize > reg->nr_pages)
1173 /* Prevent vsize*sizeof from wrapping around.
1174 * For instance, if vsize is 2**29+1, we'll allocate 1 byte and the alloc won't fail.
1176 if ((size_t) vsize > ((size_t) -1 / sizeof(*reg->alloc->pages)))
1179 KBASE_DEBUG_ASSERT(0 != vsize);
1181 if (MALI_ERROR_NONE != kbase_alloc_phy_pages_helper(reg->alloc, size))
1190 KBASE_EXPORT_TEST_API(kbase_alloc_phy_pages)
1192 mali_bool kbase_check_alloc_flags(unsigned long flags)
1194 /* Only known flags should be set. */
1195 if (flags & ~((1 << BASE_MEM_FLAGS_NR_BITS) - 1))
1198 /* At least one flag should be set */
1202 /* Either the GPU or CPU must be reading from the allocated memory */
1203 if ((flags & (BASE_MEM_PROT_CPU_RD | BASE_MEM_PROT_GPU_RD)) == 0)
1206 /* Either the GPU or CPU must be writing to the allocated memory */
1207 if ((flags & (BASE_MEM_PROT_CPU_WR | BASE_MEM_PROT_GPU_WR)) == 0)
1210 /* GPU cannot be writing to GPU executable memory and cannot grow the memory on page fault. */
1211 if ((flags & BASE_MEM_PROT_GPU_EX) && (flags & (BASE_MEM_PROT_GPU_WR | BASE_MEM_GROW_ON_GPF)))
1214 /* GPU should have at least read or write access otherwise there is no
1215 reason for allocating. */
1216 if ((flags & (BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR)) == 0)
1223 * @brief Acquire the per-context region list lock
1225 void kbase_gpu_vm_lock(kbase_context *kctx)
1227 KBASE_DEBUG_ASSERT(kctx != NULL);
1228 mutex_lock(&kctx->reg_lock);
1231 KBASE_EXPORT_TEST_API(kbase_gpu_vm_lock)
1234 * @brief Release the per-context region list lock
1236 void kbase_gpu_vm_unlock(kbase_context *kctx)
1238 KBASE_DEBUG_ASSERT(kctx != NULL);
1239 mutex_unlock(&kctx->reg_lock);
1242 KBASE_EXPORT_TEST_API(kbase_gpu_vm_unlock)