1 /*
2 *
3 * (C) COPYRIGHT 2010-2017 ARM Limited. All rights reserved.
4 *
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
8 * of such GNU licence.
9 *
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.
13 *
14 */
15
16
17
18
19
20 /**
21 * @file mali_kbase_mem.c
22 * Base kernel memory APIs
23 */
24 #ifdef CONFIG_DMA_SHARED_BUFFER
25 #include <linux/dma-buf.h>
26 #endif /* CONFIG_DMA_SHARED_BUFFER */
27 #ifdef CONFIG_UMP
28 #include <linux/ump.h>
29 #endif /* CONFIG_UMP */
30 #include <linux/kernel.h>
31 #include <linux/bug.h>
32 #include <linux/compat.h>
33 #include <linux/version.h>
34 #include <linux/sched/mm.h>
35
36 #include <mali_kbase_config.h>
37 #include <mali_kbase.h>
38 #include <mali_midg_regmap.h>
39 #include <mali_kbase_cache_policy.h>
40 #include <mali_kbase_hw.h>
41 #include <mali_kbase_hwaccess_time.h>
42 #include <mali_kbase_tlstream.h>
43
44 /* This function finds out which RB tree the given GPU VA region belongs to
45 * based on the region zone */
kbase_reg_flags_to_rbtree(struct kbase_context * kctx,struct kbase_va_region * reg)46 static struct rb_root *kbase_reg_flags_to_rbtree(struct kbase_context *kctx,
47 struct kbase_va_region *reg)
48 {
49 struct rb_root *rbtree = NULL;
50
51 switch (reg->flags & KBASE_REG_ZONE_MASK) {
52 case KBASE_REG_ZONE_CUSTOM_VA:
53 rbtree = &kctx->reg_rbtree_custom;
54 break;
55 case KBASE_REG_ZONE_EXEC:
56 rbtree = &kctx->reg_rbtree_exec;
57 break;
58 case KBASE_REG_ZONE_SAME_VA:
59 rbtree = &kctx->reg_rbtree_same;
60 /* fall through */
61 default:
62 rbtree = &kctx->reg_rbtree_same;
63 break;
64 }
65
66 return rbtree;
67 }
68
69 /* This function finds out which RB tree the given pfn from the GPU VA belongs
70 * to based on the memory zone the pfn refers to */
kbase_gpu_va_to_rbtree(struct kbase_context * kctx,u64 gpu_pfn)71 static struct rb_root *kbase_gpu_va_to_rbtree(struct kbase_context *kctx,
72 u64 gpu_pfn)
73 {
74 struct rb_root *rbtree = NULL;
75
76 #ifdef CONFIG_64BIT
77 if (kbase_ctx_flag(kctx, KCTX_COMPAT)) {
78 #endif /* CONFIG_64BIT */
79 if (gpu_pfn >= KBASE_REG_ZONE_CUSTOM_VA_BASE)
80 rbtree = &kctx->reg_rbtree_custom;
81 else if (gpu_pfn >= KBASE_REG_ZONE_EXEC_BASE)
82 rbtree = &kctx->reg_rbtree_exec;
83 else
84 rbtree = &kctx->reg_rbtree_same;
85 #ifdef CONFIG_64BIT
86 } else {
87 if (gpu_pfn >= kctx->same_va_end)
88 rbtree = &kctx->reg_rbtree_custom;
89 else
90 rbtree = &kctx->reg_rbtree_same;
91 }
92 #endif /* CONFIG_64BIT */
93
94 return rbtree;
95 }
96
97 /* This function inserts a region into the tree. */
kbase_region_tracker_insert(struct kbase_context * kctx,struct kbase_va_region * new_reg)98 static void kbase_region_tracker_insert(struct kbase_context *kctx,
99 struct kbase_va_region *new_reg)
100 {
101 u64 start_pfn = new_reg->start_pfn;
102 struct rb_node **link = NULL;
103 struct rb_node *parent = NULL;
104 struct rb_root *rbtree = NULL;
105
106 rbtree = kbase_reg_flags_to_rbtree(kctx, new_reg);
107
108 link = &(rbtree->rb_node);
109 /* Find the right place in the tree using tree search */
110 while (*link) {
111 struct kbase_va_region *old_reg;
112
113 parent = *link;
114 old_reg = rb_entry(parent, struct kbase_va_region, rblink);
115
116 /* RBTree requires no duplicate entries. */
117 KBASE_DEBUG_ASSERT(old_reg->start_pfn != start_pfn);
118
119 if (old_reg->start_pfn > start_pfn)
120 link = &(*link)->rb_left;
121 else
122 link = &(*link)->rb_right;
123 }
124
125 /* Put the new node there, and rebalance tree */
126 rb_link_node(&(new_reg->rblink), parent, link);
127
128 rb_insert_color(&(new_reg->rblink), rbtree);
129 }
130
131 /* Find allocated region enclosing free range. */
kbase_region_tracker_find_region_enclosing_range_free(struct kbase_context * kctx,u64 start_pfn,size_t nr_pages)132 static struct kbase_va_region *kbase_region_tracker_find_region_enclosing_range_free(
133 struct kbase_context *kctx, u64 start_pfn, size_t nr_pages)
134 {
135 struct rb_node *rbnode = NULL;
136 struct kbase_va_region *reg = NULL;
137 struct rb_root *rbtree = NULL;
138
139 u64 end_pfn = start_pfn + nr_pages;
140
141 rbtree = kbase_gpu_va_to_rbtree(kctx, start_pfn);
142
143 rbnode = rbtree->rb_node;
144
145 while (rbnode) {
146 u64 tmp_start_pfn, tmp_end_pfn;
147
148 reg = rb_entry(rbnode, struct kbase_va_region, rblink);
149 tmp_start_pfn = reg->start_pfn;
150 tmp_end_pfn = reg->start_pfn + reg->nr_pages;
151
152 /* If start is lower than this, go left. */
153 if (start_pfn < tmp_start_pfn)
154 rbnode = rbnode->rb_left;
155 /* If end is higher than this, then go right. */
156 else if (end_pfn > tmp_end_pfn)
157 rbnode = rbnode->rb_right;
158 else /* Enclosing */
159 return reg;
160 }
161
162 return NULL;
163 }
164
165 /* Find region enclosing given address. */
kbase_region_tracker_find_region_enclosing_address(struct kbase_context * kctx,u64 gpu_addr)166 struct kbase_va_region *kbase_region_tracker_find_region_enclosing_address(struct kbase_context *kctx, u64 gpu_addr)
167 {
168 struct rb_node *rbnode;
169 struct kbase_va_region *reg;
170 u64 gpu_pfn = gpu_addr >> PAGE_SHIFT;
171 struct rb_root *rbtree = NULL;
172
173 KBASE_DEBUG_ASSERT(NULL != kctx);
174
175 lockdep_assert_held(&kctx->reg_lock);
176
177 rbtree = kbase_gpu_va_to_rbtree(kctx, gpu_pfn);
178
179 rbnode = rbtree->rb_node;
180
181 while (rbnode) {
182 u64 tmp_start_pfn, tmp_end_pfn;
183
184 reg = rb_entry(rbnode, struct kbase_va_region, rblink);
185 tmp_start_pfn = reg->start_pfn;
186 tmp_end_pfn = reg->start_pfn + reg->nr_pages;
187
188 /* If start is lower than this, go left. */
189 if (gpu_pfn < tmp_start_pfn)
190 rbnode = rbnode->rb_left;
191 /* If end is higher than this, then go right. */
192 else if (gpu_pfn >= tmp_end_pfn)
193 rbnode = rbnode->rb_right;
194 else /* Enclosing */
195 return reg;
196 }
197
198 return NULL;
199 }
200
201 KBASE_EXPORT_TEST_API(kbase_region_tracker_find_region_enclosing_address);
202
203 /* Find region with given base address */
kbase_region_tracker_find_region_base_address(struct kbase_context * kctx,u64 gpu_addr)204 struct kbase_va_region *kbase_region_tracker_find_region_base_address(struct kbase_context *kctx, u64 gpu_addr)
205 {
206 u64 gpu_pfn = gpu_addr >> PAGE_SHIFT;
207 struct rb_node *rbnode = NULL;
208 struct kbase_va_region *reg = NULL;
209 struct rb_root *rbtree = NULL;
210
211 KBASE_DEBUG_ASSERT(NULL != kctx);
212
213 lockdep_assert_held(&kctx->reg_lock);
214
215 rbtree = kbase_gpu_va_to_rbtree(kctx, gpu_pfn);
216
217 rbnode = rbtree->rb_node;
218
219 while (rbnode) {
220 reg = rb_entry(rbnode, struct kbase_va_region, rblink);
221 if (reg->start_pfn > gpu_pfn)
222 rbnode = rbnode->rb_left;
223 else if (reg->start_pfn < gpu_pfn)
224 rbnode = rbnode->rb_right;
225 else
226 return reg;
227
228 }
229
230 return NULL;
231 }
232
233 KBASE_EXPORT_TEST_API(kbase_region_tracker_find_region_base_address);
234
235 /* Find region meeting given requirements */
kbase_region_tracker_find_region_meeting_reqs(struct kbase_context * kctx,struct kbase_va_region * reg_reqs,size_t nr_pages,size_t align)236 static struct kbase_va_region *kbase_region_tracker_find_region_meeting_reqs(struct kbase_context *kctx, struct kbase_va_region *reg_reqs, size_t nr_pages, size_t align)
237 {
238 struct rb_node *rbnode = NULL;
239 struct kbase_va_region *reg = NULL;
240 struct rb_root *rbtree = NULL;
241
242 /* Note that this search is a linear search, as we do not have a target
243 address in mind, so does not benefit from the rbtree search */
244
245 rbtree = kbase_reg_flags_to_rbtree(kctx, reg_reqs);
246
247 rbnode = rb_first(rbtree);
248
249 while (rbnode) {
250 reg = rb_entry(rbnode, struct kbase_va_region, rblink);
251 if ((reg->nr_pages >= nr_pages) &&
252 (reg->flags & KBASE_REG_FREE)) {
253 /* Check alignment */
254 u64 start_pfn = (reg->start_pfn + align - 1) & ~(align - 1);
255
256 if ((start_pfn >= reg->start_pfn) &&
257 (start_pfn <= (reg->start_pfn + reg->nr_pages - 1)) &&
258 ((start_pfn + nr_pages - 1) <= (reg->start_pfn + reg->nr_pages - 1)))
259 return reg;
260 }
261 rbnode = rb_next(rbnode);
262 }
263
264 return NULL;
265 }
266
267 /**
268 * @brief Remove a region object from the global list.
269 *
270 * The region reg is removed, possibly by merging with other free and
271 * compatible adjacent regions. It must be called with the context
272 * region lock held. The associated memory is not released (see
273 * kbase_free_alloced_region). Internal use only.
274 */
kbase_remove_va_region(struct kbase_context * kctx,struct kbase_va_region * reg)275 static int kbase_remove_va_region(struct kbase_context *kctx, struct kbase_va_region *reg)
276 {
277 struct rb_node *rbprev;
278 struct kbase_va_region *prev = NULL;
279 struct rb_node *rbnext;
280 struct kbase_va_region *next = NULL;
281 struct rb_root *reg_rbtree = NULL;
282
283 int merged_front = 0;
284 int merged_back = 0;
285 int err = 0;
286
287 reg_rbtree = kbase_reg_flags_to_rbtree(kctx, reg);
288
289 /* Try to merge with the previous block first */
290 rbprev = rb_prev(&(reg->rblink));
291 if (rbprev) {
292 prev = rb_entry(rbprev, struct kbase_va_region, rblink);
293 if (prev->flags & KBASE_REG_FREE) {
294 /* We're compatible with the previous VMA,
295 * merge with it */
296 WARN_ON((prev->flags & KBASE_REG_ZONE_MASK) !=
297 (reg->flags & KBASE_REG_ZONE_MASK));
298 prev->nr_pages += reg->nr_pages;
299 rb_erase(&(reg->rblink), reg_rbtree);
300 reg = prev;
301 merged_front = 1;
302 }
303 }
304
305 /* Try to merge with the next block second */
306 /* Note we do the lookup here as the tree may have been rebalanced. */
307 rbnext = rb_next(&(reg->rblink));
308 if (rbnext) {
309 /* We're compatible with the next VMA, merge with it */
310 next = rb_entry(rbnext, struct kbase_va_region, rblink);
311 if (next->flags & KBASE_REG_FREE) {
312 WARN_ON((next->flags & KBASE_REG_ZONE_MASK) !=
313 (reg->flags & KBASE_REG_ZONE_MASK));
314 next->start_pfn = reg->start_pfn;
315 next->nr_pages += reg->nr_pages;
316 rb_erase(&(reg->rblink), reg_rbtree);
317 merged_back = 1;
318 if (merged_front) {
319 /* We already merged with prev, free it */
320 kbase_free_alloced_region(reg);
321 }
322 }
323 }
324
325 /* If we failed to merge then we need to add a new block */
326 if (!(merged_front || merged_back)) {
327 /*
328 * We didn't merge anything. Add a new free
329 * placeholder and remove the original one.
330 */
331 struct kbase_va_region *free_reg;
332
333 free_reg = kbase_alloc_free_region(kctx, reg->start_pfn, reg->nr_pages, reg->flags & KBASE_REG_ZONE_MASK);
334 if (!free_reg) {
335 err = -ENOMEM;
336 goto out;
337 }
338 rb_replace_node(&(reg->rblink), &(free_reg->rblink), reg_rbtree);
339 }
340
341 out:
342 return err;
343 }
344
345 KBASE_EXPORT_TEST_API(kbase_remove_va_region);
346
347 /**
348 * @brief Insert a VA region to the list, replacing the current at_reg.
349 */
kbase_insert_va_region_nolock(struct kbase_context * kctx,struct kbase_va_region * new_reg,struct kbase_va_region * at_reg,u64 start_pfn,size_t nr_pages)350 static int kbase_insert_va_region_nolock(struct kbase_context *kctx, struct kbase_va_region *new_reg, struct kbase_va_region *at_reg, u64 start_pfn, size_t nr_pages)
351 {
352 struct rb_root *reg_rbtree = NULL;
353 int err = 0;
354
355 reg_rbtree = kbase_reg_flags_to_rbtree(kctx, at_reg);
356
357 /* Must be a free region */
358 KBASE_DEBUG_ASSERT((at_reg->flags & KBASE_REG_FREE) != 0);
359 /* start_pfn should be contained within at_reg */
360 KBASE_DEBUG_ASSERT((start_pfn >= at_reg->start_pfn) && (start_pfn < at_reg->start_pfn + at_reg->nr_pages));
361 /* at least nr_pages from start_pfn should be contained within at_reg */
362 KBASE_DEBUG_ASSERT(start_pfn + nr_pages <= at_reg->start_pfn + at_reg->nr_pages);
363
364 new_reg->start_pfn = start_pfn;
365 new_reg->nr_pages = nr_pages;
366
367 /* Regions are a whole use, so swap and delete old one. */
368 if (at_reg->start_pfn == start_pfn && at_reg->nr_pages == nr_pages) {
369 rb_replace_node(&(at_reg->rblink), &(new_reg->rblink),
370 reg_rbtree);
371 kbase_free_alloced_region(at_reg);
372 }
373 /* New region replaces the start of the old one, so insert before. */
374 else if (at_reg->start_pfn == start_pfn) {
375 at_reg->start_pfn += nr_pages;
376 KBASE_DEBUG_ASSERT(at_reg->nr_pages >= nr_pages);
377 at_reg->nr_pages -= nr_pages;
378
379 kbase_region_tracker_insert(kctx, new_reg);
380 }
381 /* New region replaces the end of the old one, so insert after. */
382 else if ((at_reg->start_pfn + at_reg->nr_pages) == (start_pfn + nr_pages)) {
383 at_reg->nr_pages -= nr_pages;
384
385 kbase_region_tracker_insert(kctx, new_reg);
386 }
387 /* New region splits the old one, so insert and create new */
388 else {
389 struct kbase_va_region *new_front_reg;
390
391 new_front_reg = kbase_alloc_free_region(kctx,
392 at_reg->start_pfn,
393 start_pfn - at_reg->start_pfn,
394 at_reg->flags & KBASE_REG_ZONE_MASK);
395
396 if (new_front_reg) {
397 at_reg->nr_pages -= nr_pages + new_front_reg->nr_pages;
398 at_reg->start_pfn = start_pfn + nr_pages;
399
400 kbase_region_tracker_insert(kctx, new_front_reg);
401 kbase_region_tracker_insert(kctx, new_reg);
402 } else {
403 err = -ENOMEM;
404 }
405 }
406
407 return err;
408 }
409
410 /**
411 * @brief Add a VA region to the list.
412 */
kbase_add_va_region(struct kbase_context * kctx,struct kbase_va_region * reg,u64 addr,size_t nr_pages,size_t align)413 int kbase_add_va_region(struct kbase_context *kctx,
414 struct kbase_va_region *reg, u64 addr,
415 size_t nr_pages, size_t align)
416 {
417 struct kbase_va_region *tmp;
418 u64 gpu_pfn = addr >> PAGE_SHIFT;
419 int err = 0;
420
421 KBASE_DEBUG_ASSERT(NULL != kctx);
422 KBASE_DEBUG_ASSERT(NULL != reg);
423
424 lockdep_assert_held(&kctx->reg_lock);
425
426 if (!align)
427 align = 1;
428
429 /* must be a power of 2 */
430 KBASE_DEBUG_ASSERT((align & (align - 1)) == 0);
431 KBASE_DEBUG_ASSERT(nr_pages > 0);
432
433 /* Path 1: Map a specific address. Find the enclosing region, which *must* be free. */
434 if (gpu_pfn) {
435 struct device *dev = kctx->kbdev->dev;
436
437 KBASE_DEBUG_ASSERT(!(gpu_pfn & (align - 1)));
438
439 tmp = kbase_region_tracker_find_region_enclosing_range_free(kctx, gpu_pfn, nr_pages);
440 if (!tmp) {
441 dev_warn(dev, "Enclosing region not found: 0x%08llx gpu_pfn, %zu nr_pages", gpu_pfn, nr_pages);
442 err = -ENOMEM;
443 goto exit;
444 }
445 if (!(tmp->flags & KBASE_REG_FREE)) {
446 dev_warn(dev, "Zone mismatch: %lu != %lu", tmp->flags & KBASE_REG_ZONE_MASK, reg->flags & KBASE_REG_ZONE_MASK);
447 dev_warn(dev, "!(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);
448 dev_warn(dev, "in function %s (%p, %p, 0x%llx, 0x%zx, 0x%zx)\n", __func__, kctx, reg, addr, nr_pages, align);
449 err = -ENOMEM;
450 goto exit;
451 }
452
453 err = kbase_insert_va_region_nolock(kctx, reg, tmp, gpu_pfn, nr_pages);
454 if (err) {
455 dev_warn(dev, "Failed to insert va region");
456 err = -ENOMEM;
457 goto exit;
458 }
459
460 goto exit;
461 }
462
463 /* Path 2: Map any free address which meets the requirements. */
464 {
465 u64 start_pfn;
466
467 /*
468 * Depending on the zone the allocation request is for
469 * we might need to retry it.
470 */
471 do {
472 tmp = kbase_region_tracker_find_region_meeting_reqs(
473 kctx, reg, nr_pages, align);
474 if (tmp) {
475 start_pfn = (tmp->start_pfn + align - 1) &
476 ~(align - 1);
477 err = kbase_insert_va_region_nolock(kctx, reg,
478 tmp, start_pfn, nr_pages);
479 break;
480 }
481
482 /*
483 * If the allocation is not from the same zone as JIT
484 * then don't retry, we're out of VA and there is
485 * nothing which can be done about it.
486 */
487 if ((reg->flags & KBASE_REG_ZONE_MASK) !=
488 KBASE_REG_ZONE_CUSTOM_VA)
489 break;
490 } while (kbase_jit_evict(kctx));
491
492 if (!tmp)
493 err = -ENOMEM;
494 }
495
496 exit:
497 return err;
498 }
499
500 KBASE_EXPORT_TEST_API(kbase_add_va_region);
501
502 /**
503 * @brief Initialize the internal region tracker data structure.
504 */
kbase_region_tracker_ds_init(struct kbase_context * kctx,struct kbase_va_region * same_va_reg,struct kbase_va_region * exec_reg,struct kbase_va_region * custom_va_reg)505 static void kbase_region_tracker_ds_init(struct kbase_context *kctx,
506 struct kbase_va_region *same_va_reg,
507 struct kbase_va_region *exec_reg,
508 struct kbase_va_region *custom_va_reg)
509 {
510 kctx->reg_rbtree_same = RB_ROOT;
511 kbase_region_tracker_insert(kctx, same_va_reg);
512
513 /* Although exec and custom_va_reg don't always exist,
514 * initialize unconditionally because of the mem_view debugfs
515 * implementation which relies on these being empty */
516 kctx->reg_rbtree_exec = RB_ROOT;
517 kctx->reg_rbtree_custom = RB_ROOT;
518
519 if (exec_reg)
520 kbase_region_tracker_insert(kctx, exec_reg);
521 if (custom_va_reg)
522 kbase_region_tracker_insert(kctx, custom_va_reg);
523 }
524
kbase_region_tracker_erase_rbtree(struct rb_root * rbtree)525 static void kbase_region_tracker_erase_rbtree(struct rb_root *rbtree)
526 {
527 struct rb_node *rbnode;
528 struct kbase_va_region *reg;
529
530 do {
531 rbnode = rb_first(rbtree);
532 if (rbnode) {
533 rb_erase(rbnode, rbtree);
534 reg = rb_entry(rbnode, struct kbase_va_region, rblink);
535 kbase_free_alloced_region(reg);
536 }
537 } while (rbnode);
538 }
539
kbase_region_tracker_term(struct kbase_context * kctx)540 void kbase_region_tracker_term(struct kbase_context *kctx)
541 {
542 kbase_region_tracker_erase_rbtree(&kctx->reg_rbtree_same);
543 kbase_region_tracker_erase_rbtree(&kctx->reg_rbtree_exec);
544 kbase_region_tracker_erase_rbtree(&kctx->reg_rbtree_custom);
545 }
546
547 /**
548 * Initialize the region tracker data structure.
549 */
kbase_region_tracker_init(struct kbase_context * kctx)550 int kbase_region_tracker_init(struct kbase_context *kctx)
551 {
552 struct kbase_va_region *same_va_reg;
553 struct kbase_va_region *exec_reg = NULL;
554 struct kbase_va_region *custom_va_reg = NULL;
555 size_t same_va_bits = sizeof(void *) * BITS_PER_BYTE;
556 u64 custom_va_size = KBASE_REG_ZONE_CUSTOM_VA_SIZE;
557 u64 gpu_va_limit = (1ULL << kctx->kbdev->gpu_props.mmu.va_bits) >> PAGE_SHIFT;
558 u64 same_va_pages;
559 int err;
560
561 /* Take the lock as kbase_free_alloced_region requires it */
562 kbase_gpu_vm_lock(kctx);
563
564 #if defined(CONFIG_ARM64)
565 same_va_bits = VA_BITS;
566 #elif defined(CONFIG_X86_64)
567 same_va_bits = 47;
568 #elif defined(CONFIG_64BIT)
569 #error Unsupported 64-bit architecture
570 #endif
571
572 #ifdef CONFIG_64BIT
573 if (kbase_ctx_flag(kctx, KCTX_COMPAT))
574 same_va_bits = 32;
575 else if (kbase_hw_has_feature(kctx->kbdev, BASE_HW_FEATURE_33BIT_VA))
576 same_va_bits = 33;
577 #endif
578
579 if (kctx->kbdev->gpu_props.mmu.va_bits < same_va_bits) {
580 err = -EINVAL;
581 goto fail_unlock;
582 }
583
584 same_va_pages = (1ULL << (same_va_bits - PAGE_SHIFT)) - 1;
585 /* all have SAME_VA */
586 same_va_reg = kbase_alloc_free_region(kctx, 1,
587 same_va_pages,
588 KBASE_REG_ZONE_SAME_VA);
589
590 if (!same_va_reg) {
591 err = -ENOMEM;
592 goto fail_unlock;
593 }
594
595 #ifdef CONFIG_64BIT
596 /* 32-bit clients have exec and custom VA zones */
597 if (kbase_ctx_flag(kctx, KCTX_COMPAT)) {
598 #endif
599 if (gpu_va_limit <= KBASE_REG_ZONE_CUSTOM_VA_BASE) {
600 err = -EINVAL;
601 goto fail_free_same_va;
602 }
603 /* If the current size of TMEM is out of range of the
604 * virtual address space addressable by the MMU then
605 * we should shrink it to fit
606 */
607 if ((KBASE_REG_ZONE_CUSTOM_VA_BASE + KBASE_REG_ZONE_CUSTOM_VA_SIZE) >= gpu_va_limit)
608 custom_va_size = gpu_va_limit - KBASE_REG_ZONE_CUSTOM_VA_BASE;
609
610 exec_reg = kbase_alloc_free_region(kctx,
611 KBASE_REG_ZONE_EXEC_BASE,
612 KBASE_REG_ZONE_EXEC_SIZE,
613 KBASE_REG_ZONE_EXEC);
614
615 if (!exec_reg) {
616 err = -ENOMEM;
617 goto fail_free_same_va;
618 }
619
620 custom_va_reg = kbase_alloc_free_region(kctx,
621 KBASE_REG_ZONE_CUSTOM_VA_BASE,
622 custom_va_size, KBASE_REG_ZONE_CUSTOM_VA);
623
624 if (!custom_va_reg) {
625 err = -ENOMEM;
626 goto fail_free_exec;
627 }
628 #ifdef CONFIG_64BIT
629 }
630 #endif
631
632 kbase_region_tracker_ds_init(kctx, same_va_reg, exec_reg, custom_va_reg);
633
634 kctx->same_va_end = same_va_pages + 1;
635
636 kbase_gpu_vm_unlock(kctx);
637 return 0;
638
639 fail_free_exec:
640 kbase_free_alloced_region(exec_reg);
641 fail_free_same_va:
642 kbase_free_alloced_region(same_va_reg);
643 fail_unlock:
644 kbase_gpu_vm_unlock(kctx);
645 return err;
646 }
647
kbase_region_tracker_init_jit(struct kbase_context * kctx,u64 jit_va_pages)648 int kbase_region_tracker_init_jit(struct kbase_context *kctx, u64 jit_va_pages)
649 {
650 #ifdef CONFIG_64BIT
651 struct kbase_va_region *same_va;
652 struct kbase_va_region *custom_va_reg;
653 u64 same_va_bits;
654 u64 total_va_size;
655 int err;
656
657 /*
658 * Nothing to do for 32-bit clients, JIT uses the existing
659 * custom VA zone.
660 */
661 if (kbase_ctx_flag(kctx, KCTX_COMPAT))
662 return 0;
663
664 #if defined(CONFIG_ARM64)
665 same_va_bits = VA_BITS;
666 #elif defined(CONFIG_X86_64)
667 same_va_bits = 47;
668 #elif defined(CONFIG_64BIT)
669 #error Unsupported 64-bit architecture
670 #endif
671
672 if (kbase_hw_has_feature(kctx->kbdev, BASE_HW_FEATURE_33BIT_VA))
673 same_va_bits = 33;
674
675 total_va_size = (1ULL << (same_va_bits - PAGE_SHIFT)) - 1;
676
677 kbase_gpu_vm_lock(kctx);
678
679 /*
680 * Modify the same VA free region after creation. Be careful to ensure
681 * that allocations haven't been made as they could cause an overlap
682 * to happen with existing same VA allocations and the custom VA zone.
683 */
684 same_va = kbase_region_tracker_find_region_base_address(kctx,
685 PAGE_SIZE);
686 if (!same_va) {
687 err = -ENOMEM;
688 goto fail_unlock;
689 }
690
691 /* The region flag or region size has changed since creation so bail. */
692 if ((!(same_va->flags & KBASE_REG_FREE)) ||
693 (same_va->nr_pages != total_va_size)) {
694 err = -ENOMEM;
695 goto fail_unlock;
696 }
697
698 if (same_va->nr_pages < jit_va_pages ||
699 kctx->same_va_end < jit_va_pages) {
700 err = -ENOMEM;
701 goto fail_unlock;
702 }
703
704 /* It's safe to adjust the same VA zone now */
705 same_va->nr_pages -= jit_va_pages;
706 kctx->same_va_end -= jit_va_pages;
707
708 /*
709 * Create a custom VA zone at the end of the VA for allocations which
710 * JIT can use so it doesn't have to allocate VA from the kernel.
711 */
712 custom_va_reg = kbase_alloc_free_region(kctx,
713 kctx->same_va_end,
714 jit_va_pages,
715 KBASE_REG_ZONE_CUSTOM_VA);
716
717 if (!custom_va_reg) {
718 /*
719 * The context will be destroyed if we fail here so no point
720 * reverting the change we made to same_va.
721 */
722 err = -ENOMEM;
723 goto fail_unlock;
724 }
725
726 kbase_region_tracker_insert(kctx, custom_va_reg);
727
728 kbase_gpu_vm_unlock(kctx);
729 return 0;
730
731 fail_unlock:
732 kbase_gpu_vm_unlock(kctx);
733 return err;
734 #else
735 return 0;
736 #endif
737 }
738
kbase_mem_init(struct kbase_device * kbdev)739 int kbase_mem_init(struct kbase_device *kbdev)
740 {
741 struct kbasep_mem_device *memdev;
742
743 KBASE_DEBUG_ASSERT(kbdev);
744
745 memdev = &kbdev->memdev;
746 kbdev->mem_pool_max_size_default = KBASE_MEM_POOL_MAX_SIZE_KCTX;
747
748 /* Initialize memory usage */
749 atomic_set(&memdev->used_pages, 0);
750
751 return kbase_mem_pool_init(&kbdev->mem_pool,
752 KBASE_MEM_POOL_MAX_SIZE_KBDEV, kbdev, NULL);
753 }
754
kbase_mem_halt(struct kbase_device * kbdev)755 void kbase_mem_halt(struct kbase_device *kbdev)
756 {
757 CSTD_UNUSED(kbdev);
758 }
759
kbase_mem_term(struct kbase_device * kbdev)760 void kbase_mem_term(struct kbase_device *kbdev)
761 {
762 struct kbasep_mem_device *memdev;
763 int pages;
764
765 KBASE_DEBUG_ASSERT(kbdev);
766
767 memdev = &kbdev->memdev;
768
769 pages = atomic_read(&memdev->used_pages);
770 if (pages != 0)
771 dev_warn(kbdev->dev, "%s: %d pages in use!\n", __func__, pages);
772
773 kbase_mem_pool_term(&kbdev->mem_pool);
774 }
775
776 KBASE_EXPORT_TEST_API(kbase_mem_term);
777
778
779
780
781 /**
782 * @brief Allocate a free region object.
783 *
784 * The allocated object is not part of any list yet, and is flagged as
785 * KBASE_REG_FREE. No mapping is allocated yet.
786 *
787 * zone is KBASE_REG_ZONE_CUSTOM_VA, KBASE_REG_ZONE_SAME_VA, or KBASE_REG_ZONE_EXEC
788 *
789 */
kbase_alloc_free_region(struct kbase_context * kctx,u64 start_pfn,size_t nr_pages,int zone)790 struct kbase_va_region *kbase_alloc_free_region(struct kbase_context *kctx, u64 start_pfn, size_t nr_pages, int zone)
791 {
792 struct kbase_va_region *new_reg;
793
794 KBASE_DEBUG_ASSERT(kctx != NULL);
795
796 /* zone argument should only contain zone related region flags */
797 KBASE_DEBUG_ASSERT((zone & ~KBASE_REG_ZONE_MASK) == 0);
798 KBASE_DEBUG_ASSERT(nr_pages > 0);
799 /* 64-bit address range is the max */
800 KBASE_DEBUG_ASSERT(start_pfn + nr_pages <= (U64_MAX / PAGE_SIZE));
801
802 new_reg = kzalloc(sizeof(*new_reg), GFP_KERNEL);
803
804 if (!new_reg)
805 return NULL;
806
807 new_reg->cpu_alloc = NULL; /* no alloc bound yet */
808 new_reg->gpu_alloc = NULL; /* no alloc bound yet */
809 new_reg->kctx = kctx;
810 new_reg->flags = zone | KBASE_REG_FREE;
811
812 new_reg->flags |= KBASE_REG_GROWABLE;
813
814 new_reg->start_pfn = start_pfn;
815 new_reg->nr_pages = nr_pages;
816
817 return new_reg;
818 }
819
820 KBASE_EXPORT_TEST_API(kbase_alloc_free_region);
821
822 /**
823 * @brief Free a region object.
824 *
825 * The described region must be freed of any mapping.
826 *
827 * If the region is not flagged as KBASE_REG_FREE, the region's
828 * alloc object will be released.
829 * It is a bug if no alloc object exists for non-free regions.
830 *
831 */
kbase_free_alloced_region(struct kbase_va_region * reg)832 void kbase_free_alloced_region(struct kbase_va_region *reg)
833 {
834 if (!(reg->flags & KBASE_REG_FREE)) {
835 /*
836 * The physical allocation should have been removed from the
837 * eviction list before this function is called. However, in the
838 * case of abnormal process termination or the app leaking the
839 * memory kbase_mem_free_region is not called so it can still be
840 * on the list at termination time of the region tracker.
841 */
842 if (!list_empty(®->gpu_alloc->evict_node)) {
843 /*
844 * Unlink the physical allocation before unmaking it
845 * evictable so that the allocation isn't grown back to
846 * its last backed size as we're going to unmap it
847 * anyway.
848 */
849 reg->cpu_alloc->reg = NULL;
850 if (reg->cpu_alloc != reg->gpu_alloc)
851 reg->gpu_alloc->reg = NULL;
852
853 /*
854 * If a region has been made evictable then we must
855 * unmake it before trying to free it.
856 * If the memory hasn't been reclaimed it will be
857 * unmapped and freed below, if it has been reclaimed
858 * then the operations below are no-ops.
859 */
860 if (reg->flags & KBASE_REG_DONT_NEED) {
861 KBASE_DEBUG_ASSERT(reg->cpu_alloc->type ==
862 KBASE_MEM_TYPE_NATIVE);
863 kbase_mem_evictable_unmake(reg->gpu_alloc);
864 }
865 }
866
867 /*
868 * Remove the region from the sticky resource metadata
869 * list should it be there.
870 */
871 kbase_sticky_resource_release(reg->kctx, NULL,
872 reg->start_pfn << PAGE_SHIFT);
873
874 kbase_mem_phy_alloc_put(reg->cpu_alloc);
875 kbase_mem_phy_alloc_put(reg->gpu_alloc);
876 /* To detect use-after-free in debug builds */
877 KBASE_DEBUG_CODE(reg->flags |= KBASE_REG_FREE);
878 }
879 kfree(reg);
880 }
881
882 KBASE_EXPORT_TEST_API(kbase_free_alloced_region);
883
kbase_gpu_mmap(struct kbase_context * kctx,struct kbase_va_region * reg,u64 addr,size_t nr_pages,size_t align)884 int kbase_gpu_mmap(struct kbase_context *kctx, struct kbase_va_region *reg, u64 addr, size_t nr_pages, size_t align)
885 {
886 int err;
887 size_t i = 0;
888 unsigned long attr;
889 unsigned long mask = ~KBASE_REG_MEMATTR_MASK;
890
891 if ((kctx->kbdev->system_coherency == COHERENCY_ACE) &&
892 (reg->flags & KBASE_REG_SHARE_BOTH))
893 attr = KBASE_REG_MEMATTR_INDEX(AS_MEMATTR_INDEX_OUTER_WA);
894 else
895 attr = KBASE_REG_MEMATTR_INDEX(AS_MEMATTR_INDEX_WRITE_ALLOC);
896
897 KBASE_DEBUG_ASSERT(NULL != kctx);
898 KBASE_DEBUG_ASSERT(NULL != reg);
899
900 err = kbase_add_va_region(kctx, reg, addr, nr_pages, align);
901 if (err)
902 return err;
903
904 if (reg->gpu_alloc->type == KBASE_MEM_TYPE_ALIAS) {
905 u64 stride;
906 struct kbase_mem_phy_alloc *alloc;
907
908 alloc = reg->gpu_alloc;
909 stride = alloc->imported.alias.stride;
910 KBASE_DEBUG_ASSERT(alloc->imported.alias.aliased);
911 for (i = 0; i < alloc->imported.alias.nents; i++) {
912 if (alloc->imported.alias.aliased[i].alloc) {
913 err = kbase_mmu_insert_pages(kctx,
914 reg->start_pfn + (i * stride),
915 alloc->imported.alias.aliased[i].alloc->pages + alloc->imported.alias.aliased[i].offset,
916 alloc->imported.alias.aliased[i].length,
917 reg->flags);
918 if (err)
919 goto bad_insert;
920
921 kbase_mem_phy_alloc_gpu_mapped(alloc->imported.alias.aliased[i].alloc);
922 } else {
923 err = kbase_mmu_insert_single_page(kctx,
924 reg->start_pfn + i * stride,
925 page_to_phys(kctx->aliasing_sink_page),
926 alloc->imported.alias.aliased[i].length,
927 (reg->flags & mask) | attr);
928
929 if (err)
930 goto bad_insert;
931 }
932 }
933 } else {
934 err = kbase_mmu_insert_pages(kctx, reg->start_pfn,
935 kbase_get_gpu_phy_pages(reg),
936 kbase_reg_current_backed_size(reg),
937 reg->flags);
938 if (err)
939 goto bad_insert;
940 kbase_mem_phy_alloc_gpu_mapped(reg->gpu_alloc);
941 }
942
943 return err;
944
945 bad_insert:
946 if (reg->gpu_alloc->type == KBASE_MEM_TYPE_ALIAS) {
947 u64 stride;
948
949 stride = reg->gpu_alloc->imported.alias.stride;
950 KBASE_DEBUG_ASSERT(reg->gpu_alloc->imported.alias.aliased);
951 while (i--)
952 if (reg->gpu_alloc->imported.alias.aliased[i].alloc) {
953 kbase_mmu_teardown_pages(kctx, reg->start_pfn + (i * stride), reg->gpu_alloc->imported.alias.aliased[i].length);
954 kbase_mem_phy_alloc_gpu_unmapped(reg->gpu_alloc->imported.alias.aliased[i].alloc);
955 }
956 }
957
958 kbase_remove_va_region(kctx, reg);
959
960 return err;
961 }
962
963 KBASE_EXPORT_TEST_API(kbase_gpu_mmap);
964
965 static void kbase_jd_user_buf_unmap(struct kbase_context *kctx,
966 struct kbase_mem_phy_alloc *alloc, bool writeable);
967
kbase_gpu_munmap(struct kbase_context * kctx,struct kbase_va_region * reg)968 int kbase_gpu_munmap(struct kbase_context *kctx, struct kbase_va_region *reg)
969 {
970 int err;
971
972 if (reg->start_pfn == 0)
973 return 0;
974
975 if (reg->gpu_alloc && reg->gpu_alloc->type == KBASE_MEM_TYPE_ALIAS) {
976 size_t i;
977
978 err = kbase_mmu_teardown_pages(kctx, reg->start_pfn, reg->nr_pages);
979 KBASE_DEBUG_ASSERT(reg->gpu_alloc->imported.alias.aliased);
980 for (i = 0; i < reg->gpu_alloc->imported.alias.nents; i++)
981 if (reg->gpu_alloc->imported.alias.aliased[i].alloc)
982 kbase_mem_phy_alloc_gpu_unmapped(reg->gpu_alloc->imported.alias.aliased[i].alloc);
983 } else {
984 err = kbase_mmu_teardown_pages(kctx, reg->start_pfn, kbase_reg_current_backed_size(reg));
985 kbase_mem_phy_alloc_gpu_unmapped(reg->gpu_alloc);
986 }
987
988 if (reg->gpu_alloc && reg->gpu_alloc->type ==
989 KBASE_MEM_TYPE_IMPORTED_USER_BUF) {
990 struct kbase_alloc_import_user_buf *user_buf =
991 ®->gpu_alloc->imported.user_buf;
992
993 if (user_buf->current_mapping_usage_count & PINNED_ON_IMPORT) {
994 user_buf->current_mapping_usage_count &=
995 ~PINNED_ON_IMPORT;
996
997 kbase_jd_user_buf_unmap(kctx, reg->gpu_alloc,
998 (reg->flags & KBASE_REG_GPU_WR));
999 }
1000 }
1001
1002 if (err)
1003 return err;
1004
1005 err = kbase_remove_va_region(kctx, reg);
1006 return err;
1007 }
1008
kbasep_find_enclosing_cpu_mapping(struct kbase_context * kctx,unsigned long uaddr,size_t size,u64 * offset)1009 static struct kbase_cpu_mapping *kbasep_find_enclosing_cpu_mapping(
1010 struct kbase_context *kctx,
1011 unsigned long uaddr, size_t size, u64 *offset)
1012 {
1013 struct vm_area_struct *vma;
1014 struct kbase_cpu_mapping *map;
1015 unsigned long vm_pgoff_in_region;
1016 unsigned long vm_off_in_region;
1017 unsigned long map_start;
1018 size_t map_size;
1019
1020 lockdep_assert_held(¤t->mm->mmap_lock);
1021
1022 if ((uintptr_t) uaddr + size < (uintptr_t) uaddr) /* overflow check */
1023 return NULL;
1024
1025 vma = find_vma_intersection(current->mm, uaddr, uaddr+size);
1026
1027 if (!vma || vma->vm_start > uaddr)
1028 return NULL;
1029 if (vma->vm_ops != &kbase_vm_ops)
1030 /* Not ours! */
1031 return NULL;
1032
1033 map = vma->vm_private_data;
1034
1035 if (map->kctx != kctx)
1036 /* Not from this context! */
1037 return NULL;
1038
1039 vm_pgoff_in_region = vma->vm_pgoff - map->region->start_pfn;
1040 vm_off_in_region = vm_pgoff_in_region << PAGE_SHIFT;
1041 map_start = vma->vm_start - vm_off_in_region;
1042 map_size = map->region->nr_pages << PAGE_SHIFT;
1043
1044 if ((uaddr + size) > (map_start + map_size))
1045 /* Not within the CPU mapping */
1046 return NULL;
1047
1048 *offset = (uaddr - vma->vm_start) + vm_off_in_region;
1049
1050 return map;
1051 }
1052
kbasep_find_enclosing_cpu_mapping_offset(struct kbase_context * kctx,unsigned long uaddr,size_t size,u64 * offset)1053 int kbasep_find_enclosing_cpu_mapping_offset(
1054 struct kbase_context *kctx,
1055 unsigned long uaddr, size_t size, u64 *offset)
1056 {
1057 struct kbase_cpu_mapping *map;
1058
1059 kbase_os_mem_map_lock(kctx);
1060
1061 map = kbasep_find_enclosing_cpu_mapping(kctx, uaddr, size, offset);
1062
1063 kbase_os_mem_map_unlock(kctx);
1064
1065 if (!map)
1066 return -EINVAL;
1067
1068 return 0;
1069 }
1070
1071 KBASE_EXPORT_TEST_API(kbasep_find_enclosing_cpu_mapping_offset);
1072
kbase_sync_single(struct kbase_context * kctx,phys_addr_t cpu_pa,phys_addr_t gpu_pa,off_t offset,size_t size,enum kbase_sync_type sync_fn)1073 void kbase_sync_single(struct kbase_context *kctx,
1074 phys_addr_t cpu_pa, phys_addr_t gpu_pa,
1075 off_t offset, size_t size, enum kbase_sync_type sync_fn)
1076 {
1077 struct page *cpu_page;
1078
1079 cpu_page = pfn_to_page(PFN_DOWN(cpu_pa));
1080
1081 if (likely(cpu_pa == gpu_pa)) {
1082 dma_addr_t dma_addr;
1083
1084 BUG_ON(!cpu_page);
1085 BUG_ON(offset + size > PAGE_SIZE);
1086
1087 dma_addr = kbase_dma_addr(cpu_page) + offset;
1088 if (sync_fn == KBASE_SYNC_TO_CPU)
1089 dma_sync_single_for_cpu(kctx->kbdev->dev, dma_addr,
1090 size, DMA_BIDIRECTIONAL);
1091 else if (sync_fn == KBASE_SYNC_TO_DEVICE)
1092 dma_sync_single_for_device(kctx->kbdev->dev, dma_addr,
1093 size, DMA_BIDIRECTIONAL);
1094 } else {
1095 void *src = NULL;
1096 void *dst = NULL;
1097 struct page *gpu_page;
1098
1099 if (WARN(!gpu_pa, "No GPU PA found for infinite cache op"))
1100 return;
1101
1102 gpu_page = pfn_to_page(PFN_DOWN(gpu_pa));
1103
1104 if (sync_fn == KBASE_SYNC_TO_DEVICE) {
1105 src = ((unsigned char *)kmap(cpu_page)) + offset;
1106 dst = ((unsigned char *)kmap(gpu_page)) + offset;
1107 } else if (sync_fn == KBASE_SYNC_TO_CPU) {
1108 dma_sync_single_for_cpu(kctx->kbdev->dev,
1109 kbase_dma_addr(gpu_page) + offset,
1110 size, DMA_BIDIRECTIONAL);
1111 src = ((unsigned char *)kmap(gpu_page)) + offset;
1112 dst = ((unsigned char *)kmap(cpu_page)) + offset;
1113 }
1114 memcpy(dst, src, size);
1115 kunmap(gpu_page);
1116 kunmap(cpu_page);
1117 if (sync_fn == KBASE_SYNC_TO_DEVICE)
1118 dma_sync_single_for_device(kctx->kbdev->dev,
1119 kbase_dma_addr(gpu_page) + offset,
1120 size, DMA_BIDIRECTIONAL);
1121 }
1122 }
1123
kbase_do_syncset(struct kbase_context * kctx,struct basep_syncset * sset,enum kbase_sync_type sync_fn)1124 static int kbase_do_syncset(struct kbase_context *kctx,
1125 struct basep_syncset *sset, enum kbase_sync_type sync_fn)
1126 {
1127 int err = 0;
1128 struct kbase_va_region *reg;
1129 struct kbase_cpu_mapping *map;
1130 unsigned long start;
1131 size_t size;
1132 phys_addr_t *cpu_pa;
1133 phys_addr_t *gpu_pa;
1134 u64 page_off, page_count;
1135 u64 i;
1136 u64 offset;
1137
1138 kbase_os_mem_map_lock(kctx);
1139 kbase_gpu_vm_lock(kctx);
1140
1141 /* find the region where the virtual address is contained */
1142 reg = kbase_region_tracker_find_region_enclosing_address(kctx,
1143 sset->mem_handle.basep.handle);
1144 if (!reg) {
1145 dev_warn(kctx->kbdev->dev, "Can't find region at VA 0x%016llX",
1146 sset->mem_handle.basep.handle);
1147 err = -EINVAL;
1148 goto out_unlock;
1149 }
1150
1151 if (!(reg->flags & KBASE_REG_CPU_CACHED))
1152 goto out_unlock;
1153
1154 start = (uintptr_t)sset->user_addr;
1155 size = (size_t)sset->size;
1156
1157 map = kbasep_find_enclosing_cpu_mapping(kctx, start, size, &offset);
1158 if (!map) {
1159 dev_warn(kctx->kbdev->dev, "Can't find CPU mapping 0x%016lX for VA 0x%016llX",
1160 start, sset->mem_handle.basep.handle);
1161 err = -EINVAL;
1162 goto out_unlock;
1163 }
1164
1165 page_off = offset >> PAGE_SHIFT;
1166 offset &= ~PAGE_MASK;
1167 page_count = (size + offset + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
1168 cpu_pa = kbase_get_cpu_phy_pages(reg);
1169 gpu_pa = kbase_get_gpu_phy_pages(reg);
1170
1171 if (page_off > reg->nr_pages ||
1172 page_off + page_count > reg->nr_pages) {
1173 /* Sync overflows the region */
1174 err = -EINVAL;
1175 goto out_unlock;
1176 }
1177
1178 /* Sync first page */
1179 if (cpu_pa[page_off]) {
1180 size_t sz = MIN(((size_t) PAGE_SIZE - offset), size);
1181
1182 kbase_sync_single(kctx, cpu_pa[page_off], gpu_pa[page_off],
1183 offset, sz, sync_fn);
1184 }
1185
1186 /* Sync middle pages (if any) */
1187 for (i = 1; page_count > 2 && i < page_count - 1; i++) {
1188 /* we grow upwards, so bail on first non-present page */
1189 if (!cpu_pa[page_off + i])
1190 break;
1191
1192 kbase_sync_single(kctx, cpu_pa[page_off + i],
1193 gpu_pa[page_off + i], 0, PAGE_SIZE, sync_fn);
1194 }
1195
1196 /* Sync last page (if any) */
1197 if (page_count > 1 && cpu_pa[page_off + page_count - 1]) {
1198 size_t sz = ((start + size - 1) & ~PAGE_MASK) + 1;
1199
1200 kbase_sync_single(kctx, cpu_pa[page_off + page_count - 1],
1201 gpu_pa[page_off + page_count - 1], 0, sz,
1202 sync_fn);
1203 }
1204
1205 out_unlock:
1206 kbase_gpu_vm_unlock(kctx);
1207 kbase_os_mem_map_unlock(kctx);
1208 return err;
1209 }
1210
kbase_sync_now(struct kbase_context * kctx,struct basep_syncset * sset)1211 int kbase_sync_now(struct kbase_context *kctx, struct basep_syncset *sset)
1212 {
1213 int err = -EINVAL;
1214
1215 KBASE_DEBUG_ASSERT(kctx != NULL);
1216 KBASE_DEBUG_ASSERT(sset != NULL);
1217
1218 if (sset->mem_handle.basep.handle & ~PAGE_MASK) {
1219 dev_warn(kctx->kbdev->dev,
1220 "mem_handle: passed parameter is invalid");
1221 return -EINVAL;
1222 }
1223
1224 switch (sset->type) {
1225 case BASE_SYNCSET_OP_MSYNC:
1226 err = kbase_do_syncset(kctx, sset, KBASE_SYNC_TO_DEVICE);
1227 break;
1228
1229 case BASE_SYNCSET_OP_CSYNC:
1230 err = kbase_do_syncset(kctx, sset, KBASE_SYNC_TO_CPU);
1231 break;
1232
1233 default:
1234 dev_warn(kctx->kbdev->dev, "Unknown msync op %d\n", sset->type);
1235 break;
1236 }
1237
1238 return err;
1239 }
1240
1241 KBASE_EXPORT_TEST_API(kbase_sync_now);
1242
1243 /* vm lock must be held */
kbase_mem_free_region(struct kbase_context * kctx,struct kbase_va_region * reg)1244 int kbase_mem_free_region(struct kbase_context *kctx, struct kbase_va_region *reg)
1245 {
1246 int err;
1247
1248 KBASE_DEBUG_ASSERT(NULL != kctx);
1249 KBASE_DEBUG_ASSERT(NULL != reg);
1250 lockdep_assert_held(&kctx->reg_lock);
1251
1252 /*
1253 * Unlink the physical allocation before unmaking it evictable so
1254 * that the allocation isn't grown back to its last backed size
1255 * as we're going to unmap it anyway.
1256 */
1257 reg->cpu_alloc->reg = NULL;
1258 if (reg->cpu_alloc != reg->gpu_alloc)
1259 reg->gpu_alloc->reg = NULL;
1260
1261 /*
1262 * If a region has been made evictable then we must unmake it
1263 * before trying to free it.
1264 * If the memory hasn't been reclaimed it will be unmapped and freed
1265 * below, if it has been reclaimed then the operations below are no-ops.
1266 */
1267 if (reg->flags & KBASE_REG_DONT_NEED) {
1268 KBASE_DEBUG_ASSERT(reg->cpu_alloc->type ==
1269 KBASE_MEM_TYPE_NATIVE);
1270 kbase_mem_evictable_unmake(reg->gpu_alloc);
1271 }
1272
1273 err = kbase_gpu_munmap(kctx, reg);
1274 if (err) {
1275 dev_warn(reg->kctx->kbdev->dev, "Could not unmap from the GPU...\n");
1276 goto out;
1277 }
1278
1279 /* This will also free the physical pages */
1280 kbase_free_alloced_region(reg);
1281
1282 out:
1283 return err;
1284 }
1285
1286 KBASE_EXPORT_TEST_API(kbase_mem_free_region);
1287
1288 /**
1289 * @brief Free the region from the GPU and unregister it.
1290 *
1291 * This function implements the free operation on a memory segment.
1292 * It will loudly fail if called with outstanding mappings.
1293 */
kbase_mem_free(struct kbase_context * kctx,u64 gpu_addr)1294 int kbase_mem_free(struct kbase_context *kctx, u64 gpu_addr)
1295 {
1296 int err = 0;
1297 struct kbase_va_region *reg;
1298
1299 KBASE_DEBUG_ASSERT(kctx != NULL);
1300
1301 if ((gpu_addr & ~PAGE_MASK) && (gpu_addr >= PAGE_SIZE)) {
1302 dev_warn(kctx->kbdev->dev, "kbase_mem_free: gpu_addr parameter is invalid");
1303 return -EINVAL;
1304 }
1305
1306 if (0 == gpu_addr) {
1307 dev_warn(kctx->kbdev->dev, "gpu_addr 0 is reserved for the ringbuffer and it's an error to try to free it using kbase_mem_free\n");
1308 return -EINVAL;
1309 }
1310 kbase_gpu_vm_lock(kctx);
1311
1312 if (gpu_addr >= BASE_MEM_COOKIE_BASE &&
1313 gpu_addr < BASE_MEM_FIRST_FREE_ADDRESS) {
1314 int cookie = PFN_DOWN(gpu_addr - BASE_MEM_COOKIE_BASE);
1315
1316 reg = kctx->pending_regions[cookie];
1317 if (!reg) {
1318 err = -EINVAL;
1319 goto out_unlock;
1320 }
1321
1322 /* ask to unlink the cookie as we'll free it */
1323
1324 kctx->pending_regions[cookie] = NULL;
1325 kctx->cookies |= (1UL << cookie);
1326
1327 kbase_free_alloced_region(reg);
1328 } else {
1329 /* A real GPU va */
1330 /* Validate the region */
1331 reg = kbase_region_tracker_find_region_base_address(kctx, gpu_addr);
1332 if (!reg || (reg->flags & KBASE_REG_FREE)) {
1333 dev_warn(kctx->kbdev->dev, "kbase_mem_free called with nonexistent gpu_addr 0x%llX",
1334 gpu_addr);
1335 err = -EINVAL;
1336 goto out_unlock;
1337 }
1338
1339 if ((reg->flags & KBASE_REG_ZONE_MASK) == KBASE_REG_ZONE_SAME_VA) {
1340 /* SAME_VA must be freed through munmap */
1341 dev_warn(kctx->kbdev->dev, "%s called on SAME_VA memory 0x%llX", __func__,
1342 gpu_addr);
1343 err = -EINVAL;
1344 goto out_unlock;
1345 }
1346 err = kbase_mem_free_region(kctx, reg);
1347 }
1348
1349 out_unlock:
1350 kbase_gpu_vm_unlock(kctx);
1351 return err;
1352 }
1353
1354 KBASE_EXPORT_TEST_API(kbase_mem_free);
1355
kbase_update_region_flags(struct kbase_context * kctx,struct kbase_va_region * reg,unsigned long flags)1356 int kbase_update_region_flags(struct kbase_context *kctx,
1357 struct kbase_va_region *reg, unsigned long flags)
1358 {
1359 KBASE_DEBUG_ASSERT(NULL != reg);
1360 KBASE_DEBUG_ASSERT((flags & ~((1ul << BASE_MEM_FLAGS_NR_BITS) - 1)) == 0);
1361
1362 reg->flags |= kbase_cache_enabled(flags, reg->nr_pages);
1363 /* all memory is now growable */
1364 reg->flags |= KBASE_REG_GROWABLE;
1365
1366 if (flags & BASE_MEM_GROW_ON_GPF)
1367 reg->flags |= KBASE_REG_PF_GROW;
1368
1369 if (flags & BASE_MEM_PROT_CPU_WR)
1370 reg->flags |= KBASE_REG_CPU_WR;
1371
1372 if (flags & BASE_MEM_PROT_CPU_RD)
1373 reg->flags |= KBASE_REG_CPU_RD;
1374
1375 if (flags & BASE_MEM_PROT_GPU_WR)
1376 reg->flags |= KBASE_REG_GPU_WR;
1377
1378 if (flags & BASE_MEM_PROT_GPU_RD)
1379 reg->flags |= KBASE_REG_GPU_RD;
1380
1381 if (0 == (flags & BASE_MEM_PROT_GPU_EX))
1382 reg->flags |= KBASE_REG_GPU_NX;
1383
1384 if (!kbase_device_is_cpu_coherent(kctx->kbdev)) {
1385 if (flags & BASE_MEM_COHERENT_SYSTEM_REQUIRED)
1386 return -EINVAL;
1387 } else if (flags & (BASE_MEM_COHERENT_SYSTEM |
1388 BASE_MEM_COHERENT_SYSTEM_REQUIRED)) {
1389 reg->flags |= KBASE_REG_SHARE_BOTH;
1390 }
1391
1392 if (!(reg->flags & KBASE_REG_SHARE_BOTH) &&
1393 flags & BASE_MEM_COHERENT_LOCAL) {
1394 reg->flags |= KBASE_REG_SHARE_IN;
1395 }
1396
1397 /* Set up default MEMATTR usage */
1398 if (kctx->kbdev->system_coherency == COHERENCY_ACE &&
1399 (reg->flags & KBASE_REG_SHARE_BOTH)) {
1400 reg->flags |=
1401 KBASE_REG_MEMATTR_INDEX(AS_MEMATTR_INDEX_DEFAULT_ACE);
1402 } else {
1403 reg->flags |=
1404 KBASE_REG_MEMATTR_INDEX(AS_MEMATTR_INDEX_DEFAULT);
1405 }
1406
1407 return 0;
1408 }
1409
kbase_alloc_phy_pages_helper(struct kbase_mem_phy_alloc * alloc,size_t nr_pages_requested)1410 int kbase_alloc_phy_pages_helper(
1411 struct kbase_mem_phy_alloc *alloc,
1412 size_t nr_pages_requested)
1413 {
1414 int new_page_count __maybe_unused;
1415 size_t old_page_count = alloc->nents;
1416
1417 KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_NATIVE);
1418 KBASE_DEBUG_ASSERT(alloc->imported.kctx);
1419
1420 if (nr_pages_requested == 0)
1421 goto done; /*nothing to do*/
1422
1423 new_page_count = kbase_atomic_add_pages(
1424 nr_pages_requested, &alloc->imported.kctx->used_pages);
1425 kbase_atomic_add_pages(nr_pages_requested, &alloc->imported.kctx->kbdev->memdev.used_pages);
1426
1427 /* Increase mm counters before we allocate pages so that this
1428 * allocation is visible to the OOM killer */
1429 kbase_process_page_usage_inc(alloc->imported.kctx, nr_pages_requested);
1430
1431 if (kbase_mem_pool_alloc_pages(&alloc->imported.kctx->mem_pool,
1432 nr_pages_requested, alloc->pages + old_page_count) != 0)
1433 goto no_alloc;
1434
1435 KBASE_TLSTREAM_AUX_PAGESALLOC(
1436 (u32)alloc->imported.kctx->id,
1437 (u64)new_page_count);
1438
1439 alloc->nents += nr_pages_requested;
1440 done:
1441 return 0;
1442
1443 no_alloc:
1444 kbase_process_page_usage_dec(alloc->imported.kctx, nr_pages_requested);
1445 kbase_atomic_sub_pages(nr_pages_requested, &alloc->imported.kctx->used_pages);
1446 kbase_atomic_sub_pages(nr_pages_requested, &alloc->imported.kctx->kbdev->memdev.used_pages);
1447
1448 return -ENOMEM;
1449 }
1450
kbase_free_phy_pages_helper(struct kbase_mem_phy_alloc * alloc,size_t nr_pages_to_free)1451 int kbase_free_phy_pages_helper(
1452 struct kbase_mem_phy_alloc *alloc,
1453 size_t nr_pages_to_free)
1454 {
1455 struct kbase_context *kctx = alloc->imported.kctx;
1456 bool syncback;
1457 bool reclaimed = (alloc->evicted != 0);
1458 phys_addr_t *start_free;
1459 int new_page_count __maybe_unused;
1460
1461 KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_NATIVE);
1462 KBASE_DEBUG_ASSERT(alloc->imported.kctx);
1463 KBASE_DEBUG_ASSERT(alloc->nents >= nr_pages_to_free);
1464
1465 /* early out if nothing to do */
1466 if (0 == nr_pages_to_free)
1467 return 0;
1468
1469 start_free = alloc->pages + alloc->nents - nr_pages_to_free;
1470
1471 syncback = alloc->properties & KBASE_MEM_PHY_ALLOC_ACCESSED_CACHED;
1472
1473 kbase_mem_pool_free_pages(&kctx->mem_pool,
1474 nr_pages_to_free,
1475 start_free,
1476 syncback,
1477 reclaimed);
1478
1479 alloc->nents -= nr_pages_to_free;
1480
1481 /*
1482 * If the allocation was not evicted (i.e. evicted == 0) then
1483 * the page accounting needs to be done.
1484 */
1485 if (!reclaimed) {
1486 kbase_process_page_usage_dec(kctx, nr_pages_to_free);
1487 new_page_count = kbase_atomic_sub_pages(nr_pages_to_free,
1488 &kctx->used_pages);
1489 kbase_atomic_sub_pages(nr_pages_to_free,
1490 &kctx->kbdev->memdev.used_pages);
1491
1492 KBASE_TLSTREAM_AUX_PAGESALLOC(
1493 (u32)kctx->id,
1494 (u64)new_page_count);
1495 }
1496
1497 return 0;
1498 }
1499
kbase_mem_kref_free(struct kref * kref)1500 void kbase_mem_kref_free(struct kref *kref)
1501 {
1502 struct kbase_mem_phy_alloc *alloc;
1503
1504 alloc = container_of(kref, struct kbase_mem_phy_alloc, kref);
1505
1506 switch (alloc->type) {
1507 case KBASE_MEM_TYPE_NATIVE: {
1508 WARN_ON(!alloc->imported.kctx);
1509 /*
1510 * The physical allocation must have been removed from the
1511 * eviction list before trying to free it.
1512 */
1513 WARN_ON(!list_empty(&alloc->evict_node));
1514 kbase_free_phy_pages_helper(alloc, alloc->nents);
1515 break;
1516 }
1517 case KBASE_MEM_TYPE_ALIAS: {
1518 /* just call put on the underlying phy allocs */
1519 size_t i;
1520 struct kbase_aliased *aliased;
1521
1522 aliased = alloc->imported.alias.aliased;
1523 if (aliased) {
1524 for (i = 0; i < alloc->imported.alias.nents; i++)
1525 if (aliased[i].alloc)
1526 kbase_mem_phy_alloc_put(aliased[i].alloc);
1527 vfree(aliased);
1528 }
1529 break;
1530 }
1531 case KBASE_MEM_TYPE_RAW:
1532 /* raw pages, external cleanup */
1533 break;
1534 #ifdef CONFIG_UMP
1535 case KBASE_MEM_TYPE_IMPORTED_UMP:
1536 ump_dd_release(alloc->imported.ump_handle);
1537 break;
1538 #endif
1539 #ifdef CONFIG_DMA_SHARED_BUFFER
1540 case KBASE_MEM_TYPE_IMPORTED_UMM:
1541 dma_buf_detach(alloc->imported.umm.dma_buf,
1542 alloc->imported.umm.dma_attachment);
1543 dma_buf_put(alloc->imported.umm.dma_buf);
1544 break;
1545 #endif
1546 case KBASE_MEM_TYPE_IMPORTED_USER_BUF:
1547 if (alloc->imported.user_buf.mm)
1548 mmdrop(alloc->imported.user_buf.mm);
1549 kfree(alloc->imported.user_buf.pages);
1550 break;
1551 case KBASE_MEM_TYPE_TB:{
1552 void *tb;
1553
1554 tb = alloc->imported.kctx->jctx.tb;
1555 kbase_device_trace_buffer_uninstall(alloc->imported.kctx);
1556 vfree(tb);
1557 break;
1558 }
1559 default:
1560 WARN(1, "Unexecpted free of type %d\n", alloc->type);
1561 break;
1562 }
1563
1564 /* Free based on allocation type */
1565 if (alloc->properties & KBASE_MEM_PHY_ALLOC_LARGE)
1566 vfree(alloc);
1567 else
1568 kfree(alloc);
1569 }
1570
1571 KBASE_EXPORT_TEST_API(kbase_mem_kref_free);
1572
kbase_alloc_phy_pages(struct kbase_va_region * reg,size_t vsize,size_t size)1573 int kbase_alloc_phy_pages(struct kbase_va_region *reg, size_t vsize, size_t size)
1574 {
1575 KBASE_DEBUG_ASSERT(NULL != reg);
1576 KBASE_DEBUG_ASSERT(vsize > 0);
1577
1578 /* validate user provided arguments */
1579 if (size > vsize || vsize > reg->nr_pages)
1580 goto out_term;
1581
1582 /* Prevent vsize*sizeof from wrapping around.
1583 * For instance, if vsize is 2**29+1, we'll allocate 1 byte and the alloc won't fail.
1584 */
1585 if ((size_t) vsize > ((size_t) -1 / sizeof(*reg->cpu_alloc->pages)))
1586 goto out_term;
1587
1588 KBASE_DEBUG_ASSERT(0 != vsize);
1589
1590 if (kbase_alloc_phy_pages_helper(reg->cpu_alloc, size) != 0)
1591 goto out_term;
1592
1593 reg->cpu_alloc->reg = reg;
1594 if (reg->cpu_alloc != reg->gpu_alloc) {
1595 if (kbase_alloc_phy_pages_helper(reg->gpu_alloc, size) != 0)
1596 goto out_rollback;
1597 reg->gpu_alloc->reg = reg;
1598 }
1599
1600 return 0;
1601
1602 out_rollback:
1603 kbase_free_phy_pages_helper(reg->cpu_alloc, size);
1604 out_term:
1605 return -1;
1606 }
1607
1608 KBASE_EXPORT_TEST_API(kbase_alloc_phy_pages);
1609
kbase_check_alloc_flags(unsigned long flags)1610 bool kbase_check_alloc_flags(unsigned long flags)
1611 {
1612 /* Only known input flags should be set. */
1613 if (flags & ~BASE_MEM_FLAGS_INPUT_MASK)
1614 return false;
1615
1616 /* At least one flag should be set */
1617 if (flags == 0)
1618 return false;
1619
1620 /* Either the GPU or CPU must be reading from the allocated memory */
1621 if ((flags & (BASE_MEM_PROT_CPU_RD | BASE_MEM_PROT_GPU_RD)) == 0)
1622 return false;
1623
1624 /* Either the GPU or CPU must be writing to the allocated memory */
1625 if ((flags & (BASE_MEM_PROT_CPU_WR | BASE_MEM_PROT_GPU_WR)) == 0)
1626 return false;
1627
1628 /* GPU cannot be writing to GPU executable memory and cannot grow the memory on page fault. */
1629 if ((flags & BASE_MEM_PROT_GPU_EX) && (flags & (BASE_MEM_PROT_GPU_WR | BASE_MEM_GROW_ON_GPF)))
1630 return false;
1631
1632 /* GPU should have at least read or write access otherwise there is no
1633 reason for allocating. */
1634 if ((flags & (BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR)) == 0)
1635 return false;
1636
1637 /* BASE_MEM_IMPORT_SHARED is only valid for imported memory */
1638 if ((flags & BASE_MEM_IMPORT_SHARED) == BASE_MEM_IMPORT_SHARED)
1639 return false;
1640
1641 return true;
1642 }
1643
kbase_check_import_flags(unsigned long flags)1644 bool kbase_check_import_flags(unsigned long flags)
1645 {
1646 /* Only known input flags should be set. */
1647 if (flags & ~BASE_MEM_FLAGS_INPUT_MASK)
1648 return false;
1649
1650 /* At least one flag should be set */
1651 if (flags == 0)
1652 return false;
1653
1654 /* Imported memory cannot be GPU executable */
1655 if (flags & BASE_MEM_PROT_GPU_EX)
1656 return false;
1657
1658 /* Imported memory cannot grow on page fault */
1659 if (flags & BASE_MEM_GROW_ON_GPF)
1660 return false;
1661
1662 /* GPU should have at least read or write access otherwise there is no
1663 reason for importing. */
1664 if ((flags & (BASE_MEM_PROT_GPU_RD | BASE_MEM_PROT_GPU_WR)) == 0)
1665 return false;
1666
1667 /* Secure memory cannot be read by the CPU */
1668 if ((flags & BASE_MEM_SECURE) && (flags & BASE_MEM_PROT_CPU_RD))
1669 return false;
1670
1671 return true;
1672 }
1673
1674 /**
1675 * @brief Acquire the per-context region list lock
1676 */
kbase_gpu_vm_lock(struct kbase_context * kctx)1677 void kbase_gpu_vm_lock(struct kbase_context *kctx)
1678 {
1679 KBASE_DEBUG_ASSERT(kctx != NULL);
1680 mutex_lock(&kctx->reg_lock);
1681 }
1682
1683 KBASE_EXPORT_TEST_API(kbase_gpu_vm_lock);
1684
1685 /**
1686 * @brief Release the per-context region list lock
1687 */
kbase_gpu_vm_unlock(struct kbase_context * kctx)1688 void kbase_gpu_vm_unlock(struct kbase_context *kctx)
1689 {
1690 KBASE_DEBUG_ASSERT(kctx != NULL);
1691 mutex_unlock(&kctx->reg_lock);
1692 }
1693
1694 KBASE_EXPORT_TEST_API(kbase_gpu_vm_unlock);
1695
1696 #ifdef CONFIG_DEBUG_FS
1697 struct kbase_jit_debugfs_data {
1698 int (*func)(struct kbase_jit_debugfs_data *);
1699 struct mutex lock;
1700 struct kbase_context *kctx;
1701 u64 active_value;
1702 u64 pool_value;
1703 u64 destroy_value;
1704 char buffer[50];
1705 };
1706
kbase_jit_debugfs_common_open(struct inode * inode,struct file * file,int (* func)(struct kbase_jit_debugfs_data *))1707 static int kbase_jit_debugfs_common_open(struct inode *inode,
1708 struct file *file, int (*func)(struct kbase_jit_debugfs_data *))
1709 {
1710 struct kbase_jit_debugfs_data *data;
1711
1712 data = kzalloc(sizeof(*data), GFP_KERNEL);
1713 if (!data)
1714 return -ENOMEM;
1715
1716 data->func = func;
1717 mutex_init(&data->lock);
1718 data->kctx = (struct kbase_context *) inode->i_private;
1719
1720 file->private_data = data;
1721
1722 return nonseekable_open(inode, file);
1723 }
1724
kbase_jit_debugfs_common_read(struct file * file,char __user * buf,size_t len,loff_t * ppos)1725 static ssize_t kbase_jit_debugfs_common_read(struct file *file,
1726 char __user *buf, size_t len, loff_t *ppos)
1727 {
1728 struct kbase_jit_debugfs_data *data;
1729 size_t size;
1730 int ret;
1731
1732 data = (struct kbase_jit_debugfs_data *) file->private_data;
1733 mutex_lock(&data->lock);
1734
1735 if (*ppos) {
1736 size = strnlen(data->buffer, sizeof(data->buffer));
1737 } else {
1738 if (!data->func) {
1739 ret = -EACCES;
1740 goto out_unlock;
1741 }
1742
1743 if (data->func(data)) {
1744 ret = -EACCES;
1745 goto out_unlock;
1746 }
1747
1748 size = scnprintf(data->buffer, sizeof(data->buffer),
1749 "%llu,%llu,%llu", data->active_value,
1750 data->pool_value, data->destroy_value);
1751 }
1752
1753 ret = simple_read_from_buffer(buf, len, ppos, data->buffer, size);
1754
1755 out_unlock:
1756 mutex_unlock(&data->lock);
1757 return ret;
1758 }
1759
kbase_jit_debugfs_common_release(struct inode * inode,struct file * file)1760 static int kbase_jit_debugfs_common_release(struct inode *inode,
1761 struct file *file)
1762 {
1763 kfree(file->private_data);
1764 return 0;
1765 }
1766
1767 #define KBASE_JIT_DEBUGFS_DECLARE(__fops, __func) \
1768 static int __fops ## _open(struct inode *inode, struct file *file) \
1769 { \
1770 return kbase_jit_debugfs_common_open(inode, file, __func); \
1771 } \
1772 static const struct file_operations __fops = { \
1773 .owner = THIS_MODULE, \
1774 .open = __fops ## _open, \
1775 .release = kbase_jit_debugfs_common_release, \
1776 .read = kbase_jit_debugfs_common_read, \
1777 .write = NULL, \
1778 .llseek = generic_file_llseek, \
1779 }
1780
kbase_jit_debugfs_count_get(struct kbase_jit_debugfs_data * data)1781 static int kbase_jit_debugfs_count_get(struct kbase_jit_debugfs_data *data)
1782 {
1783 struct kbase_context *kctx = data->kctx;
1784 struct list_head *tmp;
1785
1786 mutex_lock(&kctx->jit_evict_lock);
1787 list_for_each(tmp, &kctx->jit_active_head) {
1788 data->active_value++;
1789 }
1790
1791 list_for_each(tmp, &kctx->jit_pool_head) {
1792 data->pool_value++;
1793 }
1794
1795 list_for_each(tmp, &kctx->jit_destroy_head) {
1796 data->destroy_value++;
1797 }
1798 mutex_unlock(&kctx->jit_evict_lock);
1799
1800 return 0;
1801 }
1802 KBASE_JIT_DEBUGFS_DECLARE(kbase_jit_debugfs_count_fops,
1803 kbase_jit_debugfs_count_get);
1804
kbase_jit_debugfs_vm_get(struct kbase_jit_debugfs_data * data)1805 static int kbase_jit_debugfs_vm_get(struct kbase_jit_debugfs_data *data)
1806 {
1807 struct kbase_context *kctx = data->kctx;
1808 struct kbase_va_region *reg;
1809
1810 mutex_lock(&kctx->jit_evict_lock);
1811 list_for_each_entry(reg, &kctx->jit_active_head, jit_node) {
1812 data->active_value += reg->nr_pages;
1813 }
1814
1815 list_for_each_entry(reg, &kctx->jit_pool_head, jit_node) {
1816 data->pool_value += reg->nr_pages;
1817 }
1818
1819 list_for_each_entry(reg, &kctx->jit_destroy_head, jit_node) {
1820 data->destroy_value += reg->nr_pages;
1821 }
1822 mutex_unlock(&kctx->jit_evict_lock);
1823
1824 return 0;
1825 }
1826 KBASE_JIT_DEBUGFS_DECLARE(kbase_jit_debugfs_vm_fops,
1827 kbase_jit_debugfs_vm_get);
1828
kbase_jit_debugfs_phys_get(struct kbase_jit_debugfs_data * data)1829 static int kbase_jit_debugfs_phys_get(struct kbase_jit_debugfs_data *data)
1830 {
1831 struct kbase_context *kctx = data->kctx;
1832 struct kbase_va_region *reg;
1833
1834 mutex_lock(&kctx->jit_evict_lock);
1835 list_for_each_entry(reg, &kctx->jit_active_head, jit_node) {
1836 data->active_value += reg->gpu_alloc->nents;
1837 }
1838
1839 list_for_each_entry(reg, &kctx->jit_pool_head, jit_node) {
1840 data->pool_value += reg->gpu_alloc->nents;
1841 }
1842
1843 list_for_each_entry(reg, &kctx->jit_destroy_head, jit_node) {
1844 data->destroy_value += reg->gpu_alloc->nents;
1845 }
1846 mutex_unlock(&kctx->jit_evict_lock);
1847
1848 return 0;
1849 }
1850 KBASE_JIT_DEBUGFS_DECLARE(kbase_jit_debugfs_phys_fops,
1851 kbase_jit_debugfs_phys_get);
1852
kbase_jit_debugfs_init(struct kbase_context * kctx)1853 void kbase_jit_debugfs_init(struct kbase_context *kctx)
1854 {
1855 /* Debugfs entry for getting the number of JIT allocations. */
1856 debugfs_create_file("mem_jit_count", S_IRUGO, kctx->kctx_dentry,
1857 kctx, &kbase_jit_debugfs_count_fops);
1858
1859 /*
1860 * Debugfs entry for getting the total number of virtual pages
1861 * used by JIT allocations.
1862 */
1863 debugfs_create_file("mem_jit_vm", S_IRUGO, kctx->kctx_dentry,
1864 kctx, &kbase_jit_debugfs_vm_fops);
1865
1866 /*
1867 * Debugfs entry for getting the number of physical pages used
1868 * by JIT allocations.
1869 */
1870 debugfs_create_file("mem_jit_phys", S_IRUGO, kctx->kctx_dentry,
1871 kctx, &kbase_jit_debugfs_phys_fops);
1872 }
1873 #endif /* CONFIG_DEBUG_FS */
1874
1875 /**
1876 * kbase_jit_destroy_worker - Deferred worker which frees JIT allocations
1877 * @work: Work item
1878 *
1879 * This function does the work of freeing JIT allocations whose physical
1880 * backing has been released.
1881 */
kbase_jit_destroy_worker(struct work_struct * work)1882 static void kbase_jit_destroy_worker(struct work_struct *work)
1883 {
1884 struct kbase_context *kctx;
1885 struct kbase_va_region *reg;
1886
1887 kctx = container_of(work, struct kbase_context, jit_work);
1888 do {
1889 mutex_lock(&kctx->jit_evict_lock);
1890 if (list_empty(&kctx->jit_destroy_head)) {
1891 mutex_unlock(&kctx->jit_evict_lock);
1892 break;
1893 }
1894
1895 reg = list_first_entry(&kctx->jit_destroy_head,
1896 struct kbase_va_region, jit_node);
1897
1898 list_del(®->jit_node);
1899 mutex_unlock(&kctx->jit_evict_lock);
1900
1901 kbase_gpu_vm_lock(kctx);
1902 kbase_mem_free_region(kctx, reg);
1903 kbase_gpu_vm_unlock(kctx);
1904 } while (1);
1905 }
1906
kbase_jit_init(struct kbase_context * kctx)1907 int kbase_jit_init(struct kbase_context *kctx)
1908 {
1909 INIT_LIST_HEAD(&kctx->jit_active_head);
1910 INIT_LIST_HEAD(&kctx->jit_pool_head);
1911 INIT_LIST_HEAD(&kctx->jit_destroy_head);
1912 INIT_WORK(&kctx->jit_work, kbase_jit_destroy_worker);
1913
1914 INIT_LIST_HEAD(&kctx->jit_pending_alloc);
1915 INIT_LIST_HEAD(&kctx->jit_atoms_head);
1916
1917 return 0;
1918 }
1919
kbase_jit_allocate(struct kbase_context * kctx,struct base_jit_alloc_info * info)1920 struct kbase_va_region *kbase_jit_allocate(struct kbase_context *kctx,
1921 struct base_jit_alloc_info *info)
1922 {
1923 struct kbase_va_region *reg = NULL;
1924 struct kbase_va_region *walker;
1925 struct kbase_va_region *temp;
1926 size_t current_diff = SIZE_MAX;
1927
1928 int ret;
1929
1930 mutex_lock(&kctx->jit_evict_lock);
1931 /*
1932 * Scan the pool for an existing allocation which meets our
1933 * requirements and remove it.
1934 */
1935 list_for_each_entry_safe(walker, temp, &kctx->jit_pool_head, jit_node) {
1936
1937 if (walker->nr_pages >= info->va_pages) {
1938 size_t min_size, max_size, diff;
1939
1940 /*
1941 * The JIT allocations VA requirements have been
1942 * meet, it's suitable but other allocations
1943 * might be a better fit.
1944 */
1945 min_size = min_t(size_t, walker->gpu_alloc->nents,
1946 info->commit_pages);
1947 max_size = max_t(size_t, walker->gpu_alloc->nents,
1948 info->commit_pages);
1949 diff = max_size - min_size;
1950
1951 if (current_diff > diff) {
1952 current_diff = diff;
1953 reg = walker;
1954 }
1955
1956 /* The allocation is an exact match, stop looking */
1957 if (current_diff == 0)
1958 break;
1959 }
1960 }
1961
1962 if (reg) {
1963 /*
1964 * Remove the found region from the pool and add it to the
1965 * active list.
1966 */
1967 list_move(®->jit_node, &kctx->jit_active_head);
1968
1969 /*
1970 * Remove the allocation from the eviction list as it's no
1971 * longer eligible for eviction. This must be done before
1972 * dropping the jit_evict_lock
1973 */
1974 list_del_init(®->gpu_alloc->evict_node);
1975 mutex_unlock(&kctx->jit_evict_lock);
1976
1977 kbase_gpu_vm_lock(kctx);
1978
1979 /* Make the physical backing no longer reclaimable */
1980 if (!kbase_mem_evictable_unmake(reg->gpu_alloc))
1981 goto update_failed;
1982
1983 /* Grow the backing if required */
1984 if (reg->gpu_alloc->nents < info->commit_pages) {
1985 size_t delta;
1986 size_t old_size = reg->gpu_alloc->nents;
1987
1988 /* Allocate some more pages */
1989 delta = info->commit_pages - reg->gpu_alloc->nents;
1990 if (kbase_alloc_phy_pages_helper(reg->gpu_alloc, delta)
1991 != 0)
1992 goto update_failed;
1993
1994 if (reg->cpu_alloc != reg->gpu_alloc) {
1995 if (kbase_alloc_phy_pages_helper(
1996 reg->cpu_alloc, delta) != 0) {
1997 kbase_free_phy_pages_helper(
1998 reg->gpu_alloc, delta);
1999 goto update_failed;
2000 }
2001 }
2002
2003 ret = kbase_mem_grow_gpu_mapping(kctx, reg,
2004 info->commit_pages, old_size);
2005 /*
2006 * The grow failed so put the allocation back in the
2007 * pool and return failure.
2008 */
2009 if (ret)
2010 goto update_failed;
2011 }
2012 kbase_gpu_vm_unlock(kctx);
2013 } else {
2014 /* No suitable JIT allocation was found so create a new one */
2015 u64 flags = BASE_MEM_PROT_CPU_RD | BASE_MEM_PROT_GPU_RD |
2016 BASE_MEM_PROT_GPU_WR | BASE_MEM_GROW_ON_GPF |
2017 BASE_MEM_COHERENT_LOCAL;
2018 u64 gpu_addr;
2019
2020 mutex_unlock(&kctx->jit_evict_lock);
2021
2022 reg = kbase_mem_alloc(kctx, info->va_pages, info->commit_pages,
2023 info->extent, &flags, &gpu_addr);
2024 if (!reg)
2025 goto out_unlocked;
2026
2027 mutex_lock(&kctx->jit_evict_lock);
2028 list_add(®->jit_node, &kctx->jit_active_head);
2029 mutex_unlock(&kctx->jit_evict_lock);
2030 }
2031
2032 return reg;
2033
2034 update_failed:
2035 /*
2036 * An update to an allocation from the pool failed, chances
2037 * are slim a new allocation would fair any better so return
2038 * the allocation to the pool and return the function with failure.
2039 */
2040 kbase_gpu_vm_unlock(kctx);
2041 mutex_lock(&kctx->jit_evict_lock);
2042 list_move(®->jit_node, &kctx->jit_pool_head);
2043 mutex_unlock(&kctx->jit_evict_lock);
2044 out_unlocked:
2045 return NULL;
2046 }
2047
kbase_jit_free(struct kbase_context * kctx,struct kbase_va_region * reg)2048 void kbase_jit_free(struct kbase_context *kctx, struct kbase_va_region *reg)
2049 {
2050 /* The physical backing of memory in the pool is always reclaimable */
2051 kbase_gpu_vm_lock(kctx);
2052 kbase_mem_evictable_make(reg->gpu_alloc);
2053 kbase_gpu_vm_unlock(kctx);
2054
2055 mutex_lock(&kctx->jit_evict_lock);
2056 list_move(®->jit_node, &kctx->jit_pool_head);
2057 mutex_unlock(&kctx->jit_evict_lock);
2058 }
2059
kbase_jit_backing_lost(struct kbase_va_region * reg)2060 void kbase_jit_backing_lost(struct kbase_va_region *reg)
2061 {
2062 struct kbase_context *kctx = reg->kctx;
2063
2064 lockdep_assert_held(&kctx->jit_evict_lock);
2065
2066 /*
2067 * JIT allocations will always be on a list, if the region
2068 * is not on a list then it's not a JIT allocation.
2069 */
2070 if (list_empty(®->jit_node))
2071 return;
2072
2073 /*
2074 * Freeing the allocation requires locks we might not be able
2075 * to take now, so move the allocation to the free list and kick
2076 * the worker which will do the freeing.
2077 */
2078 list_move(®->jit_node, &kctx->jit_destroy_head);
2079
2080 schedule_work(&kctx->jit_work);
2081 }
2082
kbase_jit_evict(struct kbase_context * kctx)2083 bool kbase_jit_evict(struct kbase_context *kctx)
2084 {
2085 struct kbase_va_region *reg = NULL;
2086
2087 lockdep_assert_held(&kctx->reg_lock);
2088
2089 /* Free the oldest allocation from the pool */
2090 mutex_lock(&kctx->jit_evict_lock);
2091 if (!list_empty(&kctx->jit_pool_head)) {
2092 reg = list_entry(kctx->jit_pool_head.prev,
2093 struct kbase_va_region, jit_node);
2094 list_del(®->jit_node);
2095 }
2096 mutex_unlock(&kctx->jit_evict_lock);
2097
2098 if (reg)
2099 kbase_mem_free_region(kctx, reg);
2100
2101 return (reg != NULL);
2102 }
2103
kbase_jit_term(struct kbase_context * kctx)2104 void kbase_jit_term(struct kbase_context *kctx)
2105 {
2106 struct kbase_va_region *walker;
2107
2108 /* Free all allocations for this context */
2109
2110 /*
2111 * Flush the freeing of allocations whose backing has been freed
2112 * (i.e. everything in jit_destroy_head).
2113 */
2114 cancel_work_sync(&kctx->jit_work);
2115
2116 kbase_gpu_vm_lock(kctx);
2117 mutex_lock(&kctx->jit_evict_lock);
2118 /* Free all allocations from the pool */
2119 while (!list_empty(&kctx->jit_pool_head)) {
2120 walker = list_first_entry(&kctx->jit_pool_head,
2121 struct kbase_va_region, jit_node);
2122 list_del(&walker->jit_node);
2123 mutex_unlock(&kctx->jit_evict_lock);
2124 kbase_mem_free_region(kctx, walker);
2125 mutex_lock(&kctx->jit_evict_lock);
2126 }
2127
2128 /* Free all allocations from active list */
2129 while (!list_empty(&kctx->jit_active_head)) {
2130 walker = list_first_entry(&kctx->jit_active_head,
2131 struct kbase_va_region, jit_node);
2132 list_del(&walker->jit_node);
2133 mutex_unlock(&kctx->jit_evict_lock);
2134 kbase_mem_free_region(kctx, walker);
2135 mutex_lock(&kctx->jit_evict_lock);
2136 }
2137 mutex_unlock(&kctx->jit_evict_lock);
2138 kbase_gpu_vm_unlock(kctx);
2139 }
2140
kbase_jd_user_buf_map(struct kbase_context * kctx,struct kbase_va_region * reg)2141 static int kbase_jd_user_buf_map(struct kbase_context *kctx,
2142 struct kbase_va_region *reg)
2143 {
2144 long pinned_pages;
2145 struct kbase_mem_phy_alloc *alloc;
2146 struct page **pages;
2147 phys_addr_t *pa;
2148 long i;
2149 int err = -ENOMEM;
2150 unsigned long address;
2151 struct mm_struct *mm;
2152 struct device *dev;
2153 unsigned long offset;
2154 unsigned long local_size;
2155
2156 alloc = reg->gpu_alloc;
2157 pa = kbase_get_gpu_phy_pages(reg);
2158 address = alloc->imported.user_buf.address;
2159 mm = alloc->imported.user_buf.mm;
2160
2161 KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_IMPORTED_USER_BUF);
2162
2163 pages = alloc->imported.user_buf.pages;
2164
2165 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0)
2166 pinned_pages = get_user_pages(NULL, mm,
2167 address,
2168 alloc->imported.user_buf.nr_pages,
2169 reg->flags & KBASE_REG_GPU_WR,
2170 0, pages, NULL);
2171 #elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
2172 pinned_pages = get_user_pages_remote(NULL, mm,
2173 address,
2174 alloc->imported.user_buf.nr_pages,
2175 reg->flags & KBASE_REG_GPU_WR,
2176 0, pages, NULL);
2177 #elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 10, 0)
2178 pinned_pages = get_user_pages_remote(NULL, mm,
2179 address,
2180 alloc->imported.user_buf.nr_pages,
2181 reg->flags & KBASE_REG_GPU_WR ? FOLL_WRITE : 0,
2182 pages, NULL);
2183 #elif LINUX_VERSION_CODE < KERNEL_VERSION(5, 9, 0)
2184 pinned_pages = get_user_pages_remote(NULL, mm,
2185 address,
2186 alloc->imported.user_buf.nr_pages,
2187 reg->flags & KBASE_REG_GPU_WR ? FOLL_WRITE : 0,
2188 pages, NULL, NULL);
2189 #else
2190 pinned_pages = get_user_pages_remote(mm,
2191 address,
2192 alloc->imported.user_buf.nr_pages,
2193 reg->flags & KBASE_REG_GPU_WR ? FOLL_WRITE : 0,
2194 pages, NULL, NULL);
2195 #endif
2196
2197 if (pinned_pages <= 0)
2198 return pinned_pages;
2199
2200 if (pinned_pages != alloc->imported.user_buf.nr_pages) {
2201 for (i = 0; i < pinned_pages; i++)
2202 put_page(pages[i]);
2203 return -ENOMEM;
2204 }
2205
2206 dev = kctx->kbdev->dev;
2207 offset = address & ~PAGE_MASK;
2208 local_size = alloc->imported.user_buf.size;
2209
2210 for (i = 0; i < pinned_pages; i++) {
2211 dma_addr_t dma_addr;
2212 unsigned long min;
2213
2214 min = MIN(PAGE_SIZE - offset, local_size);
2215 dma_addr = dma_map_page(dev, pages[i],
2216 offset, min,
2217 DMA_BIDIRECTIONAL);
2218 if (dma_mapping_error(dev, dma_addr))
2219 goto unwind;
2220
2221 alloc->imported.user_buf.dma_addrs[i] = dma_addr;
2222 pa[i] = page_to_phys(pages[i]);
2223
2224 local_size -= min;
2225 offset = 0;
2226 }
2227
2228 alloc->nents = pinned_pages;
2229
2230 err = kbase_mmu_insert_pages(kctx, reg->start_pfn, pa,
2231 kbase_reg_current_backed_size(reg),
2232 reg->flags);
2233 if (err == 0)
2234 return 0;
2235
2236 alloc->nents = 0;
2237 /* fall down */
2238 unwind:
2239 while (i--) {
2240 dma_unmap_page(kctx->kbdev->dev,
2241 alloc->imported.user_buf.dma_addrs[i],
2242 PAGE_SIZE, DMA_BIDIRECTIONAL);
2243 put_page(pages[i]);
2244 pages[i] = NULL;
2245 }
2246
2247 return err;
2248 }
2249
kbase_jd_user_buf_unmap(struct kbase_context * kctx,struct kbase_mem_phy_alloc * alloc,bool writeable)2250 static void kbase_jd_user_buf_unmap(struct kbase_context *kctx,
2251 struct kbase_mem_phy_alloc *alloc, bool writeable)
2252 {
2253 long i;
2254 struct page **pages;
2255 unsigned long size = alloc->imported.user_buf.size;
2256
2257 KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_IMPORTED_USER_BUF);
2258 pages = alloc->imported.user_buf.pages;
2259 for (i = 0; i < alloc->imported.user_buf.nr_pages; i++) {
2260 unsigned long local_size;
2261 dma_addr_t dma_addr = alloc->imported.user_buf.dma_addrs[i];
2262
2263 local_size = MIN(size, PAGE_SIZE - (dma_addr & ~PAGE_MASK));
2264 dma_unmap_page(kctx->kbdev->dev, dma_addr, local_size,
2265 DMA_BIDIRECTIONAL);
2266 if (writeable)
2267 set_page_dirty_lock(pages[i]);
2268 put_page(pages[i]);
2269 pages[i] = NULL;
2270
2271 size -= local_size;
2272 }
2273 alloc->nents = 0;
2274 }
2275
2276
2277 /* to replace sg_dma_len. */
2278 #define MALI_SG_DMA_LEN(sg) ((sg)->length)
2279
2280 #ifdef CONFIG_DMA_SHARED_BUFFER
kbase_jd_umm_map(struct kbase_context * kctx,struct kbase_va_region * reg)2281 static int kbase_jd_umm_map(struct kbase_context *kctx,
2282 struct kbase_va_region *reg)
2283 {
2284 struct sg_table *sgt;
2285 struct scatterlist *s;
2286 int i;
2287 phys_addr_t *pa;
2288 int err;
2289 size_t count = 0;
2290 struct kbase_mem_phy_alloc *alloc;
2291
2292 alloc = reg->gpu_alloc;
2293
2294 KBASE_DEBUG_ASSERT(alloc->type == KBASE_MEM_TYPE_IMPORTED_UMM);
2295 KBASE_DEBUG_ASSERT(NULL == alloc->imported.umm.sgt);
2296 sgt = dma_buf_map_attachment(alloc->imported.umm.dma_attachment,
2297 DMA_BIDIRECTIONAL);
2298
2299 if (IS_ERR_OR_NULL(sgt))
2300 return -EINVAL;
2301
2302 /* save for later */
2303 alloc->imported.umm.sgt = sgt;
2304
2305 pa = kbase_get_gpu_phy_pages(reg);
2306 KBASE_DEBUG_ASSERT(pa);
2307
2308 for_each_sg(sgt->sgl, s, sgt->nents, i) {
2309 int j;
2310 size_t pages = PFN_UP(MALI_SG_DMA_LEN(s));
2311
2312 WARN_ONCE(MALI_SG_DMA_LEN(s) & (PAGE_SIZE-1),
2313 "MALI_SG_DMA_LEN(s)=%u is not a multiple of PAGE_SIZE\n",
2314 MALI_SG_DMA_LEN(s));
2315
2316 WARN_ONCE(sg_dma_address(s) & (PAGE_SIZE-1),
2317 "sg_dma_address(s)=%llx is not aligned to PAGE_SIZE\n",
2318 (unsigned long long) sg_dma_address(s));
2319
2320 for (j = 0; (j < pages) && (count < reg->nr_pages); j++,
2321 count++)
2322 *pa++ = sg_dma_address(s) + (j << PAGE_SHIFT);
2323 WARN_ONCE(j < pages,
2324 "sg list from dma_buf_map_attachment > dma_buf->size=%zu\n",
2325 alloc->imported.umm.dma_buf->size);
2326 }
2327
2328 if (!(reg->flags & KBASE_REG_IMPORT_PAD) &&
2329 WARN_ONCE(count < reg->nr_pages,
2330 "sg list from dma_buf_map_attachment < dma_buf->size=%zu\n",
2331 alloc->imported.umm.dma_buf->size)) {
2332 err = -EINVAL;
2333 goto err_unmap_attachment;
2334 }
2335
2336 /* Update nents as we now have pages to map */
2337 alloc->nents = reg->nr_pages;
2338
2339 err = kbase_mmu_insert_pages(kctx, reg->start_pfn,
2340 kbase_get_gpu_phy_pages(reg),
2341 count,
2342 reg->flags | KBASE_REG_GPU_WR | KBASE_REG_GPU_RD);
2343 if (err)
2344 goto err_unmap_attachment;
2345
2346 if (reg->flags & KBASE_REG_IMPORT_PAD) {
2347 err = kbase_mmu_insert_single_page(kctx,
2348 reg->start_pfn + count,
2349 page_to_phys(kctx->aliasing_sink_page),
2350 reg->nr_pages - count,
2351 (reg->flags | KBASE_REG_GPU_RD) &
2352 ~KBASE_REG_GPU_WR);
2353 if (err)
2354 goto err_teardown_orig_pages;
2355 }
2356
2357 return 0;
2358
2359 err_teardown_orig_pages:
2360 kbase_mmu_teardown_pages(kctx, reg->start_pfn, count);
2361 err_unmap_attachment:
2362 dma_buf_unmap_attachment(alloc->imported.umm.dma_attachment,
2363 alloc->imported.umm.sgt, DMA_BIDIRECTIONAL);
2364 alloc->imported.umm.sgt = NULL;
2365
2366 return err;
2367 }
2368
kbase_jd_umm_unmap(struct kbase_context * kctx,struct kbase_mem_phy_alloc * alloc)2369 static void kbase_jd_umm_unmap(struct kbase_context *kctx,
2370 struct kbase_mem_phy_alloc *alloc)
2371 {
2372 KBASE_DEBUG_ASSERT(kctx);
2373 KBASE_DEBUG_ASSERT(alloc);
2374 KBASE_DEBUG_ASSERT(alloc->imported.umm.dma_attachment);
2375 KBASE_DEBUG_ASSERT(alloc->imported.umm.sgt);
2376 dma_buf_unmap_attachment(alloc->imported.umm.dma_attachment,
2377 alloc->imported.umm.sgt, DMA_BIDIRECTIONAL);
2378 alloc->imported.umm.sgt = NULL;
2379 alloc->nents = 0;
2380 }
2381 #endif /* CONFIG_DMA_SHARED_BUFFER */
2382
2383 #if (defined(CONFIG_KDS) && defined(CONFIG_UMP)) \
2384 || defined(CONFIG_DMA_SHARED_BUFFER_USES_KDS)
add_kds_resource(struct kds_resource * kds_res,struct kds_resource ** kds_resources,u32 * kds_res_count,unsigned long * kds_access_bitmap,bool exclusive)2385 static void add_kds_resource(struct kds_resource *kds_res,
2386 struct kds_resource **kds_resources, u32 *kds_res_count,
2387 unsigned long *kds_access_bitmap, bool exclusive)
2388 {
2389 u32 i;
2390
2391 for (i = 0; i < *kds_res_count; i++) {
2392 /* Duplicate resource, ignore */
2393 if (kds_resources[i] == kds_res)
2394 return;
2395 }
2396
2397 kds_resources[*kds_res_count] = kds_res;
2398 if (exclusive)
2399 set_bit(*kds_res_count, kds_access_bitmap);
2400 (*kds_res_count)++;
2401 }
2402 #endif
2403
kbase_map_external_resource(struct kbase_context * kctx,struct kbase_va_region * reg,struct mm_struct * locked_mm,u32 * kds_res_count,struct kds_resource ** kds_resources,unsigned long * kds_access_bitmap,bool exclusive)2404 struct kbase_mem_phy_alloc *kbase_map_external_resource(
2405 struct kbase_context *kctx, struct kbase_va_region *reg,
2406 struct mm_struct *locked_mm
2407 #ifdef CONFIG_KDS
2408 , u32 *kds_res_count, struct kds_resource **kds_resources,
2409 unsigned long *kds_access_bitmap, bool exclusive
2410 #endif
2411 )
2412 {
2413 int err;
2414
2415 /* decide what needs to happen for this resource */
2416 switch (reg->gpu_alloc->type) {
2417 case KBASE_MEM_TYPE_IMPORTED_USER_BUF: {
2418 if (reg->gpu_alloc->imported.user_buf.mm != locked_mm)
2419 goto exit;
2420
2421 reg->gpu_alloc->imported.user_buf.current_mapping_usage_count++;
2422 if (1 == reg->gpu_alloc->imported.user_buf.current_mapping_usage_count) {
2423 err = kbase_jd_user_buf_map(kctx, reg);
2424 if (err) {
2425 reg->gpu_alloc->imported.user_buf.current_mapping_usage_count--;
2426 goto exit;
2427 }
2428 }
2429 }
2430 break;
2431 case KBASE_MEM_TYPE_IMPORTED_UMP: {
2432 #if defined(CONFIG_KDS) && defined(CONFIG_UMP)
2433 if (kds_res_count) {
2434 struct kds_resource *kds_res;
2435
2436 kds_res = ump_dd_kds_resource_get(
2437 reg->gpu_alloc->imported.ump_handle);
2438 if (kds_res)
2439 add_kds_resource(kds_res, kds_resources,
2440 kds_res_count,
2441 kds_access_bitmap, exclusive);
2442 }
2443 #endif /*defined(CONFIG_KDS) && defined(CONFIG_UMP) */
2444 break;
2445 }
2446 #ifdef CONFIG_DMA_SHARED_BUFFER
2447 case KBASE_MEM_TYPE_IMPORTED_UMM: {
2448 #ifdef CONFIG_DMA_SHARED_BUFFER_USES_KDS
2449 if (kds_res_count) {
2450 struct kds_resource *kds_res;
2451
2452 kds_res = get_dma_buf_kds_resource(
2453 reg->gpu_alloc->imported.umm.dma_buf);
2454 if (kds_res)
2455 add_kds_resource(kds_res, kds_resources,
2456 kds_res_count,
2457 kds_access_bitmap, exclusive);
2458 }
2459 #endif
2460 reg->gpu_alloc->imported.umm.current_mapping_usage_count++;
2461 if (1 == reg->gpu_alloc->imported.umm.current_mapping_usage_count) {
2462 err = kbase_jd_umm_map(kctx, reg);
2463 if (err) {
2464 reg->gpu_alloc->imported.umm.current_mapping_usage_count--;
2465 goto exit;
2466 }
2467 }
2468 break;
2469 }
2470 #endif
2471 default:
2472 goto exit;
2473 }
2474
2475 return kbase_mem_phy_alloc_get(reg->gpu_alloc);
2476 exit:
2477 return NULL;
2478 }
2479
kbase_unmap_external_resource(struct kbase_context * kctx,struct kbase_va_region * reg,struct kbase_mem_phy_alloc * alloc)2480 void kbase_unmap_external_resource(struct kbase_context *kctx,
2481 struct kbase_va_region *reg, struct kbase_mem_phy_alloc *alloc)
2482 {
2483 switch (alloc->type) {
2484 #ifdef CONFIG_DMA_SHARED_BUFFER
2485 case KBASE_MEM_TYPE_IMPORTED_UMM: {
2486 alloc->imported.umm.current_mapping_usage_count--;
2487
2488 if (0 == alloc->imported.umm.current_mapping_usage_count) {
2489 if (reg && reg->gpu_alloc == alloc) {
2490 int err;
2491
2492 err = kbase_mmu_teardown_pages(
2493 kctx,
2494 reg->start_pfn,
2495 alloc->nents);
2496 WARN_ON(err);
2497 }
2498
2499 kbase_jd_umm_unmap(kctx, alloc);
2500 }
2501 }
2502 break;
2503 #endif /* CONFIG_DMA_SHARED_BUFFER */
2504 case KBASE_MEM_TYPE_IMPORTED_USER_BUF: {
2505 alloc->imported.user_buf.current_mapping_usage_count--;
2506
2507 if (0 == alloc->imported.user_buf.current_mapping_usage_count) {
2508 bool writeable = true;
2509
2510 if (reg && reg->gpu_alloc == alloc)
2511 kbase_mmu_teardown_pages(
2512 kctx,
2513 reg->start_pfn,
2514 kbase_reg_current_backed_size(reg));
2515
2516 if (reg && ((reg->flags & KBASE_REG_GPU_WR) == 0))
2517 writeable = false;
2518
2519 kbase_jd_user_buf_unmap(kctx, alloc, writeable);
2520 }
2521 }
2522 break;
2523 default:
2524 break;
2525 }
2526 kbase_mem_phy_alloc_put(alloc);
2527 }
2528
kbase_sticky_resource_acquire(struct kbase_context * kctx,u64 gpu_addr)2529 struct kbase_ctx_ext_res_meta *kbase_sticky_resource_acquire(
2530 struct kbase_context *kctx, u64 gpu_addr)
2531 {
2532 struct kbase_ctx_ext_res_meta *meta = NULL;
2533 struct kbase_ctx_ext_res_meta *walker;
2534
2535 lockdep_assert_held(&kctx->reg_lock);
2536
2537 /*
2538 * Walk the per context external resource metadata list for the
2539 * metadata which matches the region which is being acquired.
2540 */
2541 list_for_each_entry(walker, &kctx->ext_res_meta_head, ext_res_node) {
2542 if (walker->gpu_addr == gpu_addr) {
2543 meta = walker;
2544 break;
2545 }
2546 }
2547
2548 /* No metadata exists so create one. */
2549 if (!meta) {
2550 struct kbase_va_region *reg;
2551
2552 /* Find the region */
2553 reg = kbase_region_tracker_find_region_enclosing_address(
2554 kctx, gpu_addr);
2555 if (NULL == reg || (reg->flags & KBASE_REG_FREE))
2556 goto failed;
2557
2558 /* Allocate the metadata object */
2559 meta = kzalloc(sizeof(*meta), GFP_KERNEL);
2560 if (!meta)
2561 goto failed;
2562
2563 /*
2564 * Fill in the metadata object and acquire a reference
2565 * for the physical resource.
2566 */
2567 meta->alloc = kbase_map_external_resource(kctx, reg, NULL
2568 #ifdef CONFIG_KDS
2569 , NULL, NULL,
2570 NULL, false
2571 #endif
2572 );
2573
2574 if (!meta->alloc)
2575 goto fail_map;
2576
2577 meta->gpu_addr = reg->start_pfn << PAGE_SHIFT;
2578
2579 list_add(&meta->ext_res_node, &kctx->ext_res_meta_head);
2580 }
2581
2582 return meta;
2583
2584 fail_map:
2585 kfree(meta);
2586 failed:
2587 return NULL;
2588 }
2589
kbase_sticky_resource_release(struct kbase_context * kctx,struct kbase_ctx_ext_res_meta * meta,u64 gpu_addr)2590 bool kbase_sticky_resource_release(struct kbase_context *kctx,
2591 struct kbase_ctx_ext_res_meta *meta, u64 gpu_addr)
2592 {
2593 struct kbase_ctx_ext_res_meta *walker;
2594 struct kbase_va_region *reg;
2595
2596 lockdep_assert_held(&kctx->reg_lock);
2597
2598 /* Search of the metadata if one isn't provided. */
2599 if (!meta) {
2600 /*
2601 * Walk the per context external resource metadata list for the
2602 * metadata which matches the region which is being released.
2603 */
2604 list_for_each_entry(walker, &kctx->ext_res_meta_head,
2605 ext_res_node) {
2606 if (walker->gpu_addr == gpu_addr) {
2607 meta = walker;
2608 break;
2609 }
2610 }
2611 }
2612
2613 /* No metadata so just return. */
2614 if (!meta)
2615 return false;
2616
2617 /* Drop the physical memory reference and free the metadata. */
2618 reg = kbase_region_tracker_find_region_enclosing_address(
2619 kctx,
2620 meta->gpu_addr);
2621
2622 kbase_unmap_external_resource(kctx, reg, meta->alloc);
2623 list_del(&meta->ext_res_node);
2624 kfree(meta);
2625
2626 return true;
2627 }
2628
kbase_sticky_resource_init(struct kbase_context * kctx)2629 int kbase_sticky_resource_init(struct kbase_context *kctx)
2630 {
2631 INIT_LIST_HEAD(&kctx->ext_res_meta_head);
2632
2633 return 0;
2634 }
2635
kbase_sticky_resource_term(struct kbase_context * kctx)2636 void kbase_sticky_resource_term(struct kbase_context *kctx)
2637 {
2638 struct kbase_ctx_ext_res_meta *walker;
2639
2640 lockdep_assert_held(&kctx->reg_lock);
2641
2642 /*
2643 * Free any sticky resources which haven't been unmapped.
2644 *
2645 * Note:
2646 * We don't care about refcounts at this point as no future
2647 * references to the meta data will be made.
2648 * Region termination would find these if we didn't free them
2649 * here, but it's more efficient if we do the clean up here.
2650 */
2651 while (!list_empty(&kctx->ext_res_meta_head)) {
2652 walker = list_first_entry(&kctx->ext_res_meta_head,
2653 struct kbase_ctx_ext_res_meta, ext_res_node);
2654
2655 kbase_sticky_resource_release(kctx, walker, 0);
2656 }
2657 }
2658