• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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(&reg->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 			&reg->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(&current->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(&reg->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(&reg->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(&reg->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(&reg->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(&reg->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(&reg->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(&reg->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(&reg->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(&reg->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