xref: /linux/drivers/gpu/drm/imagination/pvr_vm.c (revision f6e8dc9edf963dbc99085e54f6ced6da9daa6100)
1 // SPDX-License-Identifier: GPL-2.0-only OR MIT
2 /* Copyright (c) 2023 Imagination Technologies Ltd. */
3 
4 #include "pvr_vm.h"
5 
6 #include "pvr_device.h"
7 #include "pvr_drv.h"
8 #include "pvr_gem.h"
9 #include "pvr_mmu.h"
10 #include "pvr_rogue_fwif.h"
11 #include "pvr_rogue_heap_config.h"
12 
13 #include <drm/drm_exec.h>
14 #include <drm/drm_gem.h>
15 #include <drm/drm_gpuvm.h>
16 #include <drm/drm_print.h>
17 
18 #include <linux/bug.h>
19 #include <linux/container_of.h>
20 #include <linux/err.h>
21 #include <linux/errno.h>
22 #include <linux/gfp_types.h>
23 #include <linux/kref.h>
24 #include <linux/mutex.h>
25 #include <linux/stddef.h>
26 
27 /**
28  * DOC: Memory context
29  *
30  * This is the "top level" datatype in the VM code. It's exposed in the public
31  * API as an opaque handle.
32  */
33 
34 /**
35  * struct pvr_vm_context - Context type used to represent a single VM.
36  */
37 struct pvr_vm_context {
38 	/**
39 	 * @pvr_dev: The PowerVR device to which this context is bound.
40 	 * This binding is immutable for the life of the context.
41 	 */
42 	struct pvr_device *pvr_dev;
43 
44 	/** @mmu_ctx: The context for binding to physical memory. */
45 	struct pvr_mmu_context *mmu_ctx;
46 
47 	/** @gpuvm_mgr: GPUVM object associated with this context. */
48 	struct drm_gpuvm gpuvm_mgr;
49 
50 	/** @lock: Global lock on this VM. */
51 	struct mutex lock;
52 
53 	/**
54 	 * @fw_mem_ctx_obj: Firmware object representing firmware memory
55 	 * context.
56 	 */
57 	struct pvr_fw_object *fw_mem_ctx_obj;
58 
59 	/** @ref_count: Reference count of object. */
60 	struct kref ref_count;
61 
62 	/**
63 	 * @dummy_gem: GEM object to enable VM reservation. All private BOs
64 	 * should use the @dummy_gem.resv and not their own _resv field.
65 	 */
66 	struct drm_gem_object dummy_gem;
67 };
68 
69 static inline
70 struct pvr_vm_context *to_pvr_vm_context(struct drm_gpuvm *gpuvm)
71 {
72 	return container_of(gpuvm, struct pvr_vm_context, gpuvm_mgr);
73 }
74 
75 struct pvr_vm_context *pvr_vm_context_get(struct pvr_vm_context *vm_ctx)
76 {
77 	if (vm_ctx)
78 		kref_get(&vm_ctx->ref_count);
79 
80 	return vm_ctx;
81 }
82 
83 /**
84  * pvr_vm_get_page_table_root_addr() - Get the DMA address of the root of the
85  *                                     page table structure behind a VM context.
86  * @vm_ctx: Target VM context.
87  */
88 dma_addr_t pvr_vm_get_page_table_root_addr(struct pvr_vm_context *vm_ctx)
89 {
90 	return pvr_mmu_get_root_table_dma_addr(vm_ctx->mmu_ctx);
91 }
92 
93 /**
94  * pvr_vm_get_dma_resv() - Expose the dma_resv owned by the VM context.
95  * @vm_ctx: Target VM context.
96  *
97  * This is used to allow private BOs to share a dma_resv for faster fence
98  * updates.
99  *
100  * Returns: The dma_resv pointer.
101  */
102 struct dma_resv *pvr_vm_get_dma_resv(struct pvr_vm_context *vm_ctx)
103 {
104 	return vm_ctx->dummy_gem.resv;
105 }
106 
107 /**
108  * DOC: Memory mappings
109  */
110 
111 /**
112  * struct pvr_vm_gpuva - Wrapper type representing a single VM mapping.
113  */
114 struct pvr_vm_gpuva {
115 	/** @base: The wrapped drm_gpuva object. */
116 	struct drm_gpuva base;
117 };
118 
119 #define to_pvr_vm_gpuva(va) container_of_const(va, struct pvr_vm_gpuva, base)
120 
121 enum pvr_vm_bind_type {
122 	PVR_VM_BIND_TYPE_MAP,
123 	PVR_VM_BIND_TYPE_UNMAP,
124 };
125 
126 /**
127  * struct pvr_vm_bind_op - Context of a map/unmap operation.
128  */
129 struct pvr_vm_bind_op {
130 	/** @type: Map or unmap. */
131 	enum pvr_vm_bind_type type;
132 
133 	/** @pvr_obj: Object associated with mapping (map only). */
134 	struct pvr_gem_object *pvr_obj;
135 
136 	/**
137 	 * @vm_ctx: VM context where the mapping will be created or destroyed.
138 	 */
139 	struct pvr_vm_context *vm_ctx;
140 
141 	/** @mmu_op_ctx: MMU op context. */
142 	struct pvr_mmu_op_context *mmu_op_ctx;
143 
144 	/** @gpuvm_bo: Prealloced wrapped BO for attaching to the gpuvm. */
145 	struct drm_gpuvm_bo *gpuvm_bo;
146 
147 	/**
148 	 * @new_va: Prealloced VA mapping object (init in callback).
149 	 * Used when creating a mapping.
150 	 */
151 	struct pvr_vm_gpuva *new_va;
152 
153 	/**
154 	 * @prev_va: Prealloced VA mapping object (init in callback).
155 	 * Used when a mapping or unmapping operation overlaps an existing
156 	 * mapping and splits away the beginning into a new mapping.
157 	 */
158 	struct pvr_vm_gpuva *prev_va;
159 
160 	/**
161 	 * @next_va: Prealloced VA mapping object (init in callback).
162 	 * Used when a mapping or unmapping operation overlaps an existing
163 	 * mapping and splits away the end into a new mapping.
164 	 */
165 	struct pvr_vm_gpuva *next_va;
166 
167 	/** @offset: Offset into @pvr_obj to begin mapping from. */
168 	u64 offset;
169 
170 	/** @device_addr: Device-virtual address at the start of the mapping. */
171 	u64 device_addr;
172 
173 	/** @size: Size of the desired mapping. */
174 	u64 size;
175 };
176 
177 /**
178  * pvr_vm_bind_op_exec() - Execute a single bind op.
179  * @bind_op: Bind op context.
180  *
181  * Returns:
182  *  * 0 on success,
183  *  * Any error code returned by drm_gpuva_sm_map(), drm_gpuva_sm_unmap(), or
184  *    a callback function.
185  */
186 static int pvr_vm_bind_op_exec(struct pvr_vm_bind_op *bind_op)
187 {
188 	switch (bind_op->type) {
189 	case PVR_VM_BIND_TYPE_MAP: {
190 		const struct drm_gpuvm_map_req map_req = {
191 			.map.va.addr = bind_op->device_addr,
192 			.map.va.range = bind_op->size,
193 			.map.gem.obj = gem_from_pvr_gem(bind_op->pvr_obj),
194 			.map.gem.offset = bind_op->offset,
195 		};
196 
197 		return drm_gpuvm_sm_map(&bind_op->vm_ctx->gpuvm_mgr,
198 					bind_op, &map_req);
199 	}
200 
201 	case PVR_VM_BIND_TYPE_UNMAP:
202 		return drm_gpuvm_sm_unmap(&bind_op->vm_ctx->gpuvm_mgr,
203 					  bind_op, bind_op->device_addr,
204 					  bind_op->size);
205 	}
206 
207 	/*
208 	 * This shouldn't happen unless something went wrong
209 	 * in drm_sched.
210 	 */
211 	WARN_ON(1);
212 	return -EINVAL;
213 }
214 
215 static void pvr_vm_bind_op_fini(struct pvr_vm_bind_op *bind_op)
216 {
217 	drm_gpuvm_bo_put(bind_op->gpuvm_bo);
218 
219 	kfree(bind_op->new_va);
220 	kfree(bind_op->prev_va);
221 	kfree(bind_op->next_va);
222 
223 	if (bind_op->pvr_obj)
224 		pvr_gem_object_put(bind_op->pvr_obj);
225 
226 	if (bind_op->mmu_op_ctx)
227 		pvr_mmu_op_context_destroy(bind_op->mmu_op_ctx);
228 }
229 
230 static int
231 pvr_vm_bind_op_map_init(struct pvr_vm_bind_op *bind_op,
232 			struct pvr_vm_context *vm_ctx,
233 			struct pvr_gem_object *pvr_obj, u64 offset,
234 			u64 device_addr, u64 size)
235 {
236 	struct drm_gem_object *obj = gem_from_pvr_gem(pvr_obj);
237 	const bool is_user = vm_ctx != vm_ctx->pvr_dev->kernel_vm_ctx;
238 	const u64 pvr_obj_size = pvr_gem_object_size(pvr_obj);
239 	struct sg_table *sgt;
240 	u64 offset_plus_size;
241 	int err;
242 
243 	if (check_add_overflow(offset, size, &offset_plus_size))
244 		return -EINVAL;
245 
246 	if (is_user &&
247 	    !pvr_find_heap_containing(vm_ctx->pvr_dev, device_addr, size)) {
248 		return -EINVAL;
249 	}
250 
251 	if (!pvr_device_addr_and_size_are_valid(vm_ctx, device_addr, size) ||
252 	    offset & ~PAGE_MASK || size & ~PAGE_MASK ||
253 	    offset >= pvr_obj_size || offset_plus_size > pvr_obj_size)
254 		return -EINVAL;
255 
256 	bind_op->type = PVR_VM_BIND_TYPE_MAP;
257 
258 	dma_resv_lock(obj->resv, NULL);
259 	bind_op->gpuvm_bo = drm_gpuvm_bo_obtain(&vm_ctx->gpuvm_mgr, obj);
260 	dma_resv_unlock(obj->resv);
261 	if (IS_ERR(bind_op->gpuvm_bo))
262 		return PTR_ERR(bind_op->gpuvm_bo);
263 
264 	bind_op->new_va = kzalloc(sizeof(*bind_op->new_va), GFP_KERNEL);
265 	bind_op->prev_va = kzalloc(sizeof(*bind_op->prev_va), GFP_KERNEL);
266 	bind_op->next_va = kzalloc(sizeof(*bind_op->next_va), GFP_KERNEL);
267 	if (!bind_op->new_va || !bind_op->prev_va || !bind_op->next_va) {
268 		err = -ENOMEM;
269 		goto err_bind_op_fini;
270 	}
271 
272 	/* Pin pages so they're ready for use. */
273 	sgt = pvr_gem_object_get_pages_sgt(pvr_obj);
274 	err = PTR_ERR_OR_ZERO(sgt);
275 	if (err)
276 		goto err_bind_op_fini;
277 
278 	bind_op->mmu_op_ctx =
279 		pvr_mmu_op_context_create(vm_ctx->mmu_ctx, sgt, offset, size);
280 	err = PTR_ERR_OR_ZERO(bind_op->mmu_op_ctx);
281 	if (err) {
282 		bind_op->mmu_op_ctx = NULL;
283 		goto err_bind_op_fini;
284 	}
285 
286 	bind_op->pvr_obj = pvr_obj;
287 	bind_op->vm_ctx = vm_ctx;
288 	bind_op->device_addr = device_addr;
289 	bind_op->size = size;
290 	bind_op->offset = offset;
291 
292 	return 0;
293 
294 err_bind_op_fini:
295 	pvr_vm_bind_op_fini(bind_op);
296 
297 	return err;
298 }
299 
300 static int
301 pvr_vm_bind_op_unmap_init(struct pvr_vm_bind_op *bind_op,
302 			  struct pvr_vm_context *vm_ctx,
303 			  struct pvr_gem_object *pvr_obj,
304 			  u64 device_addr, u64 size)
305 {
306 	int err;
307 
308 	if (!pvr_device_addr_and_size_are_valid(vm_ctx, device_addr, size))
309 		return -EINVAL;
310 
311 	bind_op->type = PVR_VM_BIND_TYPE_UNMAP;
312 
313 	bind_op->prev_va = kzalloc(sizeof(*bind_op->prev_va), GFP_KERNEL);
314 	bind_op->next_va = kzalloc(sizeof(*bind_op->next_va), GFP_KERNEL);
315 	if (!bind_op->prev_va || !bind_op->next_va) {
316 		err = -ENOMEM;
317 		goto err_bind_op_fini;
318 	}
319 
320 	bind_op->mmu_op_ctx =
321 		pvr_mmu_op_context_create(vm_ctx->mmu_ctx, NULL, 0, 0);
322 	err = PTR_ERR_OR_ZERO(bind_op->mmu_op_ctx);
323 	if (err) {
324 		bind_op->mmu_op_ctx = NULL;
325 		goto err_bind_op_fini;
326 	}
327 
328 	bind_op->pvr_obj = pvr_obj;
329 	bind_op->vm_ctx = vm_ctx;
330 	bind_op->device_addr = device_addr;
331 	bind_op->size = size;
332 
333 	return 0;
334 
335 err_bind_op_fini:
336 	pvr_vm_bind_op_fini(bind_op);
337 
338 	return err;
339 }
340 
341 /**
342  * pvr_vm_gpuva_map() - Insert a mapping into a memory context.
343  * @op: gpuva op containing the remap details.
344  * @op_ctx: Operation context.
345  *
346  * Context: Called by drm_gpuvm_sm_map following a successful mapping while
347  * @op_ctx.vm_ctx mutex is held.
348  *
349  * Return:
350  *  * 0 on success, or
351  *  * Any error returned by pvr_mmu_map().
352  */
353 static int
354 pvr_vm_gpuva_map(struct drm_gpuva_op *op, void *op_ctx)
355 {
356 	struct pvr_gem_object *pvr_gem = gem_to_pvr_gem(op->map.gem.obj);
357 	struct pvr_vm_bind_op *ctx = op_ctx;
358 	int err;
359 
360 	if ((op->map.gem.offset | op->map.va.range) & ~PVR_DEVICE_PAGE_MASK)
361 		return -EINVAL;
362 
363 	err = pvr_mmu_map(ctx->mmu_op_ctx, op->map.va.range, pvr_gem->flags,
364 			  op->map.va.addr);
365 	if (err)
366 		return err;
367 
368 	drm_gpuva_map(&ctx->vm_ctx->gpuvm_mgr, &ctx->new_va->base, &op->map);
369 	drm_gpuva_link(&ctx->new_va->base, ctx->gpuvm_bo);
370 	ctx->new_va = NULL;
371 
372 	return 0;
373 }
374 
375 /**
376  * pvr_vm_gpuva_unmap() - Remove a mapping from a memory context.
377  * @op: gpuva op containing the unmap details.
378  * @op_ctx: Operation context.
379  *
380  * Context: Called by drm_gpuvm_sm_unmap following a successful unmapping while
381  * @op_ctx.vm_ctx mutex is held.
382  *
383  * Return:
384  *  * 0 on success, or
385  *  * Any error returned by pvr_mmu_unmap().
386  */
387 static int
388 pvr_vm_gpuva_unmap(struct drm_gpuva_op *op, void *op_ctx)
389 {
390 	struct pvr_vm_bind_op *ctx = op_ctx;
391 
392 	int err = pvr_mmu_unmap(ctx->mmu_op_ctx, op->unmap.va->va.addr,
393 				op->unmap.va->va.range);
394 
395 	if (err)
396 		return err;
397 
398 	drm_gpuva_unmap(&op->unmap);
399 	drm_gpuva_unlink(op->unmap.va);
400 	kfree(to_pvr_vm_gpuva(op->unmap.va));
401 
402 	return 0;
403 }
404 
405 /**
406  * pvr_vm_gpuva_remap() - Remap a mapping within a memory context.
407  * @op: gpuva op containing the remap details.
408  * @op_ctx: Operation context.
409  *
410  * Context: Called by either drm_gpuvm_sm_map or drm_gpuvm_sm_unmap when a
411  * mapping or unmapping operation causes a region to be split. The
412  * @op_ctx.vm_ctx mutex is held.
413  *
414  * Return:
415  *  * 0 on success, or
416  *  * Any error returned by pvr_vm_gpuva_unmap() or pvr_vm_gpuva_unmap().
417  */
418 static int
419 pvr_vm_gpuva_remap(struct drm_gpuva_op *op, void *op_ctx)
420 {
421 	struct pvr_vm_bind_op *ctx = op_ctx;
422 	u64 va_start = 0, va_range = 0;
423 	int err;
424 
425 	drm_gpuva_op_remap_to_unmap_range(&op->remap, &va_start, &va_range);
426 	err = pvr_mmu_unmap(ctx->mmu_op_ctx, va_start, va_range);
427 	if (err)
428 		return err;
429 
430 	/* No actual remap required: the page table tree depth is fixed to 3,
431 	 * and we use 4k page table entries only for now.
432 	 */
433 	drm_gpuva_remap(&ctx->prev_va->base, &ctx->next_va->base, &op->remap);
434 
435 	if (op->remap.prev) {
436 		pvr_gem_object_get(gem_to_pvr_gem(ctx->prev_va->base.gem.obj));
437 		drm_gpuva_link(&ctx->prev_va->base, ctx->gpuvm_bo);
438 		ctx->prev_va = NULL;
439 	}
440 
441 	if (op->remap.next) {
442 		pvr_gem_object_get(gem_to_pvr_gem(ctx->next_va->base.gem.obj));
443 		drm_gpuva_link(&ctx->next_va->base, ctx->gpuvm_bo);
444 		ctx->next_va = NULL;
445 	}
446 
447 	drm_gpuva_unlink(op->remap.unmap->va);
448 	kfree(to_pvr_vm_gpuva(op->remap.unmap->va));
449 
450 	return 0;
451 }
452 
453 /*
454  * Public API
455  *
456  * For an overview of these functions, see *DOC: Public API* in "pvr_vm.h".
457  */
458 
459 /**
460  * pvr_device_addr_is_valid() - Tests whether a device-virtual address
461  *                              is valid.
462  * @device_addr: Virtual device address to test.
463  *
464  * Return:
465  *  * %true if @device_addr is within the valid range for a device page
466  *    table and is aligned to the device page size, or
467  *  * %false otherwise.
468  */
469 bool
470 pvr_device_addr_is_valid(u64 device_addr)
471 {
472 	return (device_addr & ~PVR_PAGE_TABLE_ADDR_MASK) == 0 &&
473 	       (device_addr & ~PVR_DEVICE_PAGE_MASK) == 0;
474 }
475 
476 /**
477  * pvr_device_addr_and_size_are_valid() - Tests whether a device-virtual
478  * address and associated size are both valid.
479  * @vm_ctx: Target VM context.
480  * @device_addr: Virtual device address to test.
481  * @size: Size of the range based at @device_addr to test.
482  *
483  * Calling pvr_device_addr_is_valid() twice (once on @size, and again on
484  * @device_addr + @size) to verify a device-virtual address range initially
485  * seems intuitive, but it produces a false-negative when the address range
486  * is right at the end of device-virtual address space.
487  *
488  * This function catches that corner case, as well as checking that
489  * @size is non-zero.
490  *
491  * Return:
492  *  * %true if @device_addr is device page aligned; @size is device page
493  *    aligned; the range specified by @device_addr and @size is within the
494  *    bounds of the device-virtual address space, and @size is non-zero, or
495  *  * %false otherwise.
496  */
497 bool
498 pvr_device_addr_and_size_are_valid(struct pvr_vm_context *vm_ctx,
499 				   u64 device_addr, u64 size)
500 {
501 	return pvr_device_addr_is_valid(device_addr) &&
502 	       drm_gpuvm_range_valid(&vm_ctx->gpuvm_mgr, device_addr, size) &&
503 	       size != 0 && (size & ~PVR_DEVICE_PAGE_MASK) == 0 &&
504 	       (device_addr + size <= PVR_PAGE_TABLE_ADDR_SPACE_SIZE);
505 }
506 
507 static void pvr_gpuvm_free(struct drm_gpuvm *gpuvm)
508 {
509 	kfree(to_pvr_vm_context(gpuvm));
510 }
511 
512 static const struct drm_gpuvm_ops pvr_vm_gpuva_ops = {
513 	.vm_free = pvr_gpuvm_free,
514 	.sm_step_map = pvr_vm_gpuva_map,
515 	.sm_step_remap = pvr_vm_gpuva_remap,
516 	.sm_step_unmap = pvr_vm_gpuva_unmap,
517 };
518 
519 static void
520 fw_mem_context_init(void *cpu_ptr, void *priv)
521 {
522 	struct rogue_fwif_fwmemcontext *fw_mem_ctx = cpu_ptr;
523 	struct pvr_vm_context *vm_ctx = priv;
524 
525 	fw_mem_ctx->pc_dev_paddr = pvr_vm_get_page_table_root_addr(vm_ctx);
526 	fw_mem_ctx->page_cat_base_reg_set = ROGUE_FW_BIF_INVALID_PCSET;
527 }
528 
529 /**
530  * pvr_vm_create_context() - Create a new VM context.
531  * @pvr_dev: Target PowerVR device.
532  * @is_userspace_context: %true if this context is for userspace. This will
533  *                        create a firmware memory context for the VM context
534  *                        and disable warnings when tearing down mappings.
535  *
536  * Return:
537  *  * A handle to the newly-minted VM context on success,
538  *  * -%EINVAL if the feature "virtual address space bits" on @pvr_dev is
539  *    missing or has an unsupported value,
540  *  * -%ENOMEM if allocation of the structure behind the opaque handle fails,
541  *    or
542  *  * Any error encountered while setting up internal structures.
543  */
544 struct pvr_vm_context *
545 pvr_vm_create_context(struct pvr_device *pvr_dev, bool is_userspace_context)
546 {
547 	struct drm_device *drm_dev = from_pvr_device(pvr_dev);
548 
549 	struct pvr_vm_context *vm_ctx;
550 	u16 device_addr_bits;
551 
552 	int err;
553 
554 	err = PVR_FEATURE_VALUE(pvr_dev, virtual_address_space_bits,
555 				&device_addr_bits);
556 	if (err) {
557 		drm_err(drm_dev,
558 			"Failed to get device virtual address space bits\n");
559 		return ERR_PTR(err);
560 	}
561 
562 	if (device_addr_bits != PVR_PAGE_TABLE_ADDR_BITS) {
563 		drm_err(drm_dev,
564 			"Device has unsupported virtual address space size\n");
565 		return ERR_PTR(-EINVAL);
566 	}
567 
568 	vm_ctx = kzalloc(sizeof(*vm_ctx), GFP_KERNEL);
569 	if (!vm_ctx)
570 		return ERR_PTR(-ENOMEM);
571 
572 	vm_ctx->pvr_dev = pvr_dev;
573 
574 	vm_ctx->mmu_ctx = pvr_mmu_context_create(pvr_dev);
575 	err = PTR_ERR_OR_ZERO(vm_ctx->mmu_ctx);
576 	if (err)
577 		goto err_free;
578 
579 	if (is_userspace_context) {
580 		err = pvr_fw_object_create(pvr_dev, sizeof(struct rogue_fwif_fwmemcontext),
581 					   PVR_BO_FW_FLAGS_DEVICE_UNCACHED,
582 					   fw_mem_context_init, vm_ctx, &vm_ctx->fw_mem_ctx_obj);
583 
584 		if (err)
585 			goto err_page_table_destroy;
586 	}
587 
588 	drm_gem_private_object_init(&pvr_dev->base, &vm_ctx->dummy_gem, 0);
589 	drm_gpuvm_init(&vm_ctx->gpuvm_mgr,
590 		       is_userspace_context ? "PowerVR-user-VM" : "PowerVR-FW-VM",
591 		       0, &pvr_dev->base, &vm_ctx->dummy_gem,
592 		       0, 1ULL << device_addr_bits, 0, 0, &pvr_vm_gpuva_ops);
593 
594 	mutex_init(&vm_ctx->lock);
595 	kref_init(&vm_ctx->ref_count);
596 
597 	return vm_ctx;
598 
599 err_page_table_destroy:
600 	pvr_mmu_context_destroy(vm_ctx->mmu_ctx);
601 
602 err_free:
603 	kfree(vm_ctx);
604 
605 	return ERR_PTR(err);
606 }
607 
608 /**
609  * pvr_vm_context_release() - Teardown a VM context.
610  * @ref_count: Pointer to reference counter of the VM context.
611  *
612  * This function also ensures that no mappings are left dangling by calling
613  * pvr_vm_unmap_all.
614  */
615 static void
616 pvr_vm_context_release(struct kref *ref_count)
617 {
618 	struct pvr_vm_context *vm_ctx =
619 		container_of(ref_count, struct pvr_vm_context, ref_count);
620 
621 	if (vm_ctx->fw_mem_ctx_obj)
622 		pvr_fw_object_destroy(vm_ctx->fw_mem_ctx_obj);
623 
624 	pvr_vm_unmap_all(vm_ctx);
625 
626 	pvr_mmu_context_destroy(vm_ctx->mmu_ctx);
627 	drm_gem_private_object_fini(&vm_ctx->dummy_gem);
628 	mutex_destroy(&vm_ctx->lock);
629 
630 	drm_gpuvm_put(&vm_ctx->gpuvm_mgr);
631 }
632 
633 /**
634  * pvr_vm_context_lookup() - Look up VM context from handle
635  * @pvr_file: Pointer to pvr_file structure.
636  * @handle: Object handle.
637  *
638  * Takes reference on VM context object. Call pvr_vm_context_put() to release.
639  *
640  * Returns:
641  *  * The requested object on success, or
642  *  * %NULL on failure (object does not exist in list, or is not a VM context)
643  */
644 struct pvr_vm_context *
645 pvr_vm_context_lookup(struct pvr_file *pvr_file, u32 handle)
646 {
647 	struct pvr_vm_context *vm_ctx;
648 
649 	xa_lock(&pvr_file->vm_ctx_handles);
650 	vm_ctx = xa_load(&pvr_file->vm_ctx_handles, handle);
651 	pvr_vm_context_get(vm_ctx);
652 	xa_unlock(&pvr_file->vm_ctx_handles);
653 
654 	return vm_ctx;
655 }
656 
657 /**
658  * pvr_vm_context_put() - Release a reference on a VM context
659  * @vm_ctx: Target VM context.
660  *
661  * Returns:
662  *  * %true if the VM context was destroyed, or
663  *  * %false if there are any references still remaining.
664  */
665 bool
666 pvr_vm_context_put(struct pvr_vm_context *vm_ctx)
667 {
668 	if (vm_ctx)
669 		return kref_put(&vm_ctx->ref_count, pvr_vm_context_release);
670 
671 	return true;
672 }
673 
674 /**
675  * pvr_destroy_vm_contexts_for_file: Destroy any VM contexts associated with the
676  * given file.
677  * @pvr_file: Pointer to pvr_file structure.
678  *
679  * Removes all vm_contexts associated with @pvr_file from the device VM context
680  * list and drops initial references. vm_contexts will then be destroyed once
681  * all outstanding references are dropped.
682  */
683 void pvr_destroy_vm_contexts_for_file(struct pvr_file *pvr_file)
684 {
685 	struct pvr_vm_context *vm_ctx;
686 	unsigned long handle;
687 
688 	xa_for_each(&pvr_file->vm_ctx_handles, handle, vm_ctx) {
689 		/* vm_ctx is not used here because that would create a race with xa_erase */
690 		pvr_vm_context_put(xa_erase(&pvr_file->vm_ctx_handles, handle));
691 	}
692 }
693 
694 static int
695 pvr_vm_lock_extra(struct drm_gpuvm_exec *vm_exec)
696 {
697 	struct pvr_vm_bind_op *bind_op = vm_exec->extra.priv;
698 	struct pvr_gem_object *pvr_obj = bind_op->pvr_obj;
699 
700 	/* Acquire lock on the GEM object being mapped/unmapped. */
701 	return drm_exec_lock_obj(&vm_exec->exec, gem_from_pvr_gem(pvr_obj));
702 }
703 
704 /**
705  * pvr_vm_map() - Map a section of physical memory into a section of
706  * device-virtual memory.
707  * @vm_ctx: Target VM context.
708  * @pvr_obj: Target PowerVR memory object.
709  * @pvr_obj_offset: Offset into @pvr_obj to map from.
710  * @device_addr: Virtual device address at the start of the requested mapping.
711  * @size: Size of the requested mapping.
712  *
713  * No handle is returned to represent the mapping. Instead, callers should
714  * remember @device_addr and use that as a handle.
715  *
716  * Return:
717  *  * 0 on success,
718  *  * -%EINVAL if @device_addr is not a valid page-aligned device-virtual
719  *    address; the region specified by @pvr_obj_offset and @size does not fall
720  *    entirely within @pvr_obj, or any part of the specified region of @pvr_obj
721  *    is not device-virtual page-aligned,
722  *  * Any error encountered while performing internal operations required to
723  *    destroy the mapping (returned from pvr_vm_gpuva_map or
724  *    pvr_vm_gpuva_remap).
725  */
726 int
727 pvr_vm_map(struct pvr_vm_context *vm_ctx, struct pvr_gem_object *pvr_obj,
728 	   u64 pvr_obj_offset, u64 device_addr, u64 size)
729 {
730 	struct pvr_vm_bind_op bind_op = {0};
731 	struct drm_gpuvm_exec vm_exec = {
732 		.vm = &vm_ctx->gpuvm_mgr,
733 		.flags = DRM_EXEC_INTERRUPTIBLE_WAIT |
734 			 DRM_EXEC_IGNORE_DUPLICATES,
735 		.extra = {
736 			.fn = pvr_vm_lock_extra,
737 			.priv = &bind_op,
738 		},
739 	};
740 
741 	int err = pvr_vm_bind_op_map_init(&bind_op, vm_ctx, pvr_obj,
742 					  pvr_obj_offset, device_addr,
743 					  size);
744 
745 	if (err)
746 		return err;
747 
748 	pvr_gem_object_get(pvr_obj);
749 
750 	err = drm_gpuvm_exec_lock(&vm_exec);
751 	if (err)
752 		goto err_cleanup;
753 
754 	err = pvr_vm_bind_op_exec(&bind_op);
755 
756 	drm_gpuvm_exec_unlock(&vm_exec);
757 
758 err_cleanup:
759 	pvr_vm_bind_op_fini(&bind_op);
760 
761 	return err;
762 }
763 
764 /**
765  * pvr_vm_unmap_obj_locked() - Unmap an already mapped section of device-virtual
766  * memory.
767  * @vm_ctx: Target VM context.
768  * @pvr_obj: Target PowerVR memory object.
769  * @device_addr: Virtual device address at the start of the target mapping.
770  * @size: Size of the target mapping.
771  *
772  * Return:
773  *  * 0 on success,
774  *  * -%EINVAL if @device_addr is not a valid page-aligned device-virtual
775  *    address,
776  *  * Any error encountered while performing internal operations required to
777  *    destroy the mapping (returned from pvr_vm_gpuva_unmap or
778  *    pvr_vm_gpuva_remap).
779  *
780  * The vm_ctx->lock must be held when calling this function.
781  */
782 static int
783 pvr_vm_unmap_obj_locked(struct pvr_vm_context *vm_ctx,
784 			struct pvr_gem_object *pvr_obj,
785 			u64 device_addr, u64 size)
786 {
787 	struct pvr_vm_bind_op bind_op = {0};
788 	struct drm_gpuvm_exec vm_exec = {
789 		.vm = &vm_ctx->gpuvm_mgr,
790 		.flags = DRM_EXEC_INTERRUPTIBLE_WAIT |
791 			 DRM_EXEC_IGNORE_DUPLICATES,
792 		.extra = {
793 			.fn = pvr_vm_lock_extra,
794 			.priv = &bind_op,
795 		},
796 	};
797 
798 	int err = pvr_vm_bind_op_unmap_init(&bind_op, vm_ctx, pvr_obj,
799 					    device_addr, size);
800 	if (err)
801 		return err;
802 
803 	pvr_gem_object_get(pvr_obj);
804 
805 	err = drm_gpuvm_exec_lock(&vm_exec);
806 	if (err)
807 		goto err_cleanup;
808 
809 	err = pvr_vm_bind_op_exec(&bind_op);
810 
811 	drm_gpuvm_exec_unlock(&vm_exec);
812 
813 err_cleanup:
814 	pvr_vm_bind_op_fini(&bind_op);
815 
816 	return err;
817 }
818 
819 /**
820  * pvr_vm_unmap_obj() - Unmap an already mapped section of device-virtual
821  * memory.
822  * @vm_ctx: Target VM context.
823  * @pvr_obj: Target PowerVR memory object.
824  * @device_addr: Virtual device address at the start of the target mapping.
825  * @size: Size of the target mapping.
826  *
827  * Return:
828  *  * 0 on success,
829  *  * Any error encountered by pvr_vm_unmap_obj_locked.
830  */
831 int
832 pvr_vm_unmap_obj(struct pvr_vm_context *vm_ctx, struct pvr_gem_object *pvr_obj,
833 		 u64 device_addr, u64 size)
834 {
835 	int err;
836 
837 	mutex_lock(&vm_ctx->lock);
838 	err = pvr_vm_unmap_obj_locked(vm_ctx, pvr_obj, device_addr, size);
839 	mutex_unlock(&vm_ctx->lock);
840 
841 	return err;
842 }
843 
844 /**
845  * pvr_vm_unmap() - Unmap an already mapped section of device-virtual memory.
846  * @vm_ctx: Target VM context.
847  * @device_addr: Virtual device address at the start of the target mapping.
848  * @size: Size of the target mapping.
849  *
850  * Return:
851  *  * 0 on success,
852  *  * Any error encountered by drm_gpuva_find,
853  *  * Any error encountered by pvr_vm_unmap_obj_locked.
854  */
855 int
856 pvr_vm_unmap(struct pvr_vm_context *vm_ctx, u64 device_addr, u64 size)
857 {
858 	struct pvr_gem_object *pvr_obj;
859 	struct drm_gpuva *va;
860 	int err;
861 
862 	mutex_lock(&vm_ctx->lock);
863 
864 	va = drm_gpuva_find(&vm_ctx->gpuvm_mgr, device_addr, size);
865 	if (va) {
866 		pvr_obj = gem_to_pvr_gem(va->gem.obj);
867 		err = pvr_vm_unmap_obj_locked(vm_ctx, pvr_obj,
868 					      va->va.addr, va->va.range);
869 	} else {
870 		err = -ENOENT;
871 	}
872 
873 	mutex_unlock(&vm_ctx->lock);
874 
875 	return err;
876 }
877 
878 /**
879  * pvr_vm_unmap_all() - Unmap all mappings associated with a VM context.
880  * @vm_ctx: Target VM context.
881  *
882  * This function ensures that no mappings are left dangling by unmapping them
883  * all in order of ascending device-virtual address.
884  */
885 void
886 pvr_vm_unmap_all(struct pvr_vm_context *vm_ctx)
887 {
888 	mutex_lock(&vm_ctx->lock);
889 
890 	for (;;) {
891 		struct pvr_gem_object *pvr_obj;
892 		struct drm_gpuva *va;
893 
894 		va = drm_gpuva_find_first(&vm_ctx->gpuvm_mgr,
895 					  vm_ctx->gpuvm_mgr.mm_start,
896 					  vm_ctx->gpuvm_mgr.mm_range);
897 		if (!va)
898 			break;
899 
900 		pvr_obj = gem_to_pvr_gem(va->gem.obj);
901 
902 		WARN_ON(pvr_vm_unmap_obj_locked(vm_ctx, pvr_obj,
903 						va->va.addr, va->va.range));
904 	}
905 
906 	mutex_unlock(&vm_ctx->lock);
907 }
908 
909 /* Static data areas are determined by firmware. */
910 static const struct drm_pvr_static_data_area static_data_areas[] = {
911 	{
912 		.area_usage = DRM_PVR_STATIC_DATA_AREA_FENCE,
913 		.location_heap_id = DRM_PVR_HEAP_GENERAL,
914 		.offset = 0,
915 		.size = 128,
916 	},
917 	{
918 		.area_usage = DRM_PVR_STATIC_DATA_AREA_YUV_CSC,
919 		.location_heap_id = DRM_PVR_HEAP_GENERAL,
920 		.offset = 128,
921 		.size = 1024,
922 	},
923 	{
924 		.area_usage = DRM_PVR_STATIC_DATA_AREA_VDM_SYNC,
925 		.location_heap_id = DRM_PVR_HEAP_PDS_CODE_DATA,
926 		.offset = 0,
927 		.size = 128,
928 	},
929 	{
930 		.area_usage = DRM_PVR_STATIC_DATA_AREA_EOT,
931 		.location_heap_id = DRM_PVR_HEAP_PDS_CODE_DATA,
932 		.offset = 128,
933 		.size = 128,
934 	},
935 	{
936 		.area_usage = DRM_PVR_STATIC_DATA_AREA_VDM_SYNC,
937 		.location_heap_id = DRM_PVR_HEAP_USC_CODE,
938 		.offset = 0,
939 		.size = 128,
940 	},
941 };
942 
943 #define GET_RESERVED_SIZE(last_offset, last_size) round_up((last_offset) + (last_size), PAGE_SIZE)
944 
945 /*
946  * The values given to GET_RESERVED_SIZE() are taken from the last entry in the corresponding
947  * static data area for each heap.
948  */
949 static const struct drm_pvr_heap pvr_heaps[] = {
950 	[DRM_PVR_HEAP_GENERAL] = {
951 		.base = ROGUE_GENERAL_HEAP_BASE,
952 		.size = ROGUE_GENERAL_HEAP_SIZE,
953 		.flags = 0,
954 		.page_size_log2 = PVR_DEVICE_PAGE_SHIFT,
955 	},
956 	[DRM_PVR_HEAP_PDS_CODE_DATA] = {
957 		.base = ROGUE_PDSCODEDATA_HEAP_BASE,
958 		.size = ROGUE_PDSCODEDATA_HEAP_SIZE,
959 		.flags = 0,
960 		.page_size_log2 = PVR_DEVICE_PAGE_SHIFT,
961 	},
962 	[DRM_PVR_HEAP_USC_CODE] = {
963 		.base = ROGUE_USCCODE_HEAP_BASE,
964 		.size = ROGUE_USCCODE_HEAP_SIZE,
965 		.flags = 0,
966 		.page_size_log2 = PVR_DEVICE_PAGE_SHIFT,
967 	},
968 	[DRM_PVR_HEAP_RGNHDR] = {
969 		.base = ROGUE_RGNHDR_HEAP_BASE,
970 		.size = ROGUE_RGNHDR_HEAP_SIZE,
971 		.flags = 0,
972 		.page_size_log2 = PVR_DEVICE_PAGE_SHIFT,
973 	},
974 	[DRM_PVR_HEAP_VIS_TEST] = {
975 		.base = ROGUE_VISTEST_HEAP_BASE,
976 		.size = ROGUE_VISTEST_HEAP_SIZE,
977 		.flags = 0,
978 		.page_size_log2 = PVR_DEVICE_PAGE_SHIFT,
979 	},
980 	[DRM_PVR_HEAP_TRANSFER_FRAG] = {
981 		.base = ROGUE_TRANSFER_FRAG_HEAP_BASE,
982 		.size = ROGUE_TRANSFER_FRAG_HEAP_SIZE,
983 		.flags = 0,
984 		.page_size_log2 = PVR_DEVICE_PAGE_SHIFT,
985 	},
986 };
987 
988 int
989 pvr_static_data_areas_get(const struct pvr_device *pvr_dev,
990 			  struct drm_pvr_ioctl_dev_query_args *args)
991 {
992 	struct drm_pvr_dev_query_static_data_areas query = {0};
993 	int err;
994 
995 	if (!args->pointer) {
996 		args->size = sizeof(struct drm_pvr_dev_query_static_data_areas);
997 		return 0;
998 	}
999 
1000 	err = PVR_UOBJ_GET(query, args->size, args->pointer);
1001 	if (err < 0)
1002 		return err;
1003 
1004 	if (!query.static_data_areas.array) {
1005 		query.static_data_areas.count = ARRAY_SIZE(static_data_areas);
1006 		query.static_data_areas.stride = sizeof(struct drm_pvr_static_data_area);
1007 		goto copy_out;
1008 	}
1009 
1010 	if (query.static_data_areas.count > ARRAY_SIZE(static_data_areas))
1011 		query.static_data_areas.count = ARRAY_SIZE(static_data_areas);
1012 
1013 	err = PVR_UOBJ_SET_ARRAY(&query.static_data_areas, static_data_areas);
1014 	if (err < 0)
1015 		return err;
1016 
1017 copy_out:
1018 	err = PVR_UOBJ_SET(args->pointer, args->size, query);
1019 	if (err < 0)
1020 		return err;
1021 
1022 	args->size = sizeof(query);
1023 	return 0;
1024 }
1025 
1026 int
1027 pvr_heap_info_get(const struct pvr_device *pvr_dev,
1028 		  struct drm_pvr_ioctl_dev_query_args *args)
1029 {
1030 	struct drm_pvr_dev_query_heap_info query = {0};
1031 	u64 dest;
1032 	int err;
1033 
1034 	if (!args->pointer) {
1035 		args->size = sizeof(struct drm_pvr_dev_query_heap_info);
1036 		return 0;
1037 	}
1038 
1039 	err = PVR_UOBJ_GET(query, args->size, args->pointer);
1040 	if (err < 0)
1041 		return err;
1042 
1043 	if (!query.heaps.array) {
1044 		query.heaps.count = ARRAY_SIZE(pvr_heaps);
1045 		query.heaps.stride = sizeof(struct drm_pvr_heap);
1046 		goto copy_out;
1047 	}
1048 
1049 	if (query.heaps.count > ARRAY_SIZE(pvr_heaps))
1050 		query.heaps.count = ARRAY_SIZE(pvr_heaps);
1051 
1052 	/* Region header heap is only present if BRN63142 is present. */
1053 	dest = query.heaps.array;
1054 	for (size_t i = 0; i < query.heaps.count; i++) {
1055 		struct drm_pvr_heap heap = pvr_heaps[i];
1056 
1057 		if (i == DRM_PVR_HEAP_RGNHDR && !PVR_HAS_QUIRK(pvr_dev, 63142))
1058 			heap.size = 0;
1059 
1060 		err = PVR_UOBJ_SET(dest, query.heaps.stride, heap);
1061 		if (err < 0)
1062 			return err;
1063 
1064 		dest += query.heaps.stride;
1065 	}
1066 
1067 copy_out:
1068 	err = PVR_UOBJ_SET(args->pointer, args->size, query);
1069 	if (err < 0)
1070 		return err;
1071 
1072 	args->size = sizeof(query);
1073 	return 0;
1074 }
1075 
1076 /**
1077  * pvr_heap_contains_range() - Determine if a given heap contains the specified
1078  *                             device-virtual address range.
1079  * @pvr_heap: Target heap.
1080  * @start: Inclusive start of the target range.
1081  * @end: Inclusive end of the target range.
1082  *
1083  * It is an error to call this function with values of @start and @end that do
1084  * not satisfy the condition @start <= @end.
1085  */
1086 static __always_inline bool
1087 pvr_heap_contains_range(const struct drm_pvr_heap *pvr_heap, u64 start, u64 end)
1088 {
1089 	return pvr_heap->base <= start && end < pvr_heap->base + pvr_heap->size;
1090 }
1091 
1092 /**
1093  * pvr_find_heap_containing() - Find a heap which contains the specified
1094  *                              device-virtual address range.
1095  * @pvr_dev: Target PowerVR device.
1096  * @start: Start of the target range.
1097  * @size: Size of the target range.
1098  *
1099  * Return:
1100  *  * A pointer to a constant instance of struct drm_pvr_heap representing the
1101  *    heap containing the entire range specified by @start and @size on
1102  *    success, or
1103  *  * %NULL if no such heap exists.
1104  */
1105 const struct drm_pvr_heap *
1106 pvr_find_heap_containing(struct pvr_device *pvr_dev, u64 start, u64 size)
1107 {
1108 	u64 end;
1109 
1110 	if (check_add_overflow(start, size - 1, &end))
1111 		return NULL;
1112 
1113 	/*
1114 	 * There are no guarantees about the order of address ranges in
1115 	 * &pvr_heaps, so iterate over the entire array for a heap whose
1116 	 * range completely encompasses the given range.
1117 	 */
1118 	for (u32 heap_id = 0; heap_id < ARRAY_SIZE(pvr_heaps); heap_id++) {
1119 		/* Filter heaps that present only with an associated quirk */
1120 		if (heap_id == DRM_PVR_HEAP_RGNHDR &&
1121 		    !PVR_HAS_QUIRK(pvr_dev, 63142)) {
1122 			continue;
1123 		}
1124 
1125 		if (pvr_heap_contains_range(&pvr_heaps[heap_id], start, end))
1126 			return &pvr_heaps[heap_id];
1127 	}
1128 
1129 	return NULL;
1130 }
1131 
1132 /**
1133  * pvr_vm_find_gem_object() - Look up a buffer object from a given
1134  *                            device-virtual address.
1135  * @vm_ctx: [IN] Target VM context.
1136  * @device_addr: [IN] Virtual device address at the start of the required
1137  *               object.
1138  * @mapped_offset_out: [OUT] Pointer to location to write offset of the start
1139  *                     of the mapped region within the buffer object. May be
1140  *                     %NULL if this information is not required.
1141  * @mapped_size_out: [OUT] Pointer to location to write size of the mapped
1142  *                   region. May be %NULL if this information is not required.
1143  *
1144  * If successful, a reference will be taken on the buffer object. The caller
1145  * must drop the reference with pvr_gem_object_put().
1146  *
1147  * Return:
1148  *  * The PowerVR buffer object mapped at @device_addr if one exists, or
1149  *  * %NULL otherwise.
1150  */
1151 struct pvr_gem_object *
1152 pvr_vm_find_gem_object(struct pvr_vm_context *vm_ctx, u64 device_addr,
1153 		       u64 *mapped_offset_out, u64 *mapped_size_out)
1154 {
1155 	struct pvr_gem_object *pvr_obj;
1156 	struct drm_gpuva *va;
1157 
1158 	mutex_lock(&vm_ctx->lock);
1159 
1160 	va = drm_gpuva_find_first(&vm_ctx->gpuvm_mgr, device_addr, 1);
1161 	if (!va)
1162 		goto err_unlock;
1163 
1164 	pvr_obj = gem_to_pvr_gem(va->gem.obj);
1165 	pvr_gem_object_get(pvr_obj);
1166 
1167 	if (mapped_offset_out)
1168 		*mapped_offset_out = va->gem.offset;
1169 	if (mapped_size_out)
1170 		*mapped_size_out = va->va.range;
1171 
1172 	mutex_unlock(&vm_ctx->lock);
1173 
1174 	return pvr_obj;
1175 
1176 err_unlock:
1177 	mutex_unlock(&vm_ctx->lock);
1178 
1179 	return NULL;
1180 }
1181 
1182 /**
1183  * pvr_vm_get_fw_mem_context: Get object representing firmware memory context
1184  * @vm_ctx: Target VM context.
1185  *
1186  * Returns:
1187  *  * FW object representing firmware memory context, or
1188  *  * %NULL if this VM context does not have a firmware memory context.
1189  */
1190 struct pvr_fw_object *
1191 pvr_vm_get_fw_mem_context(struct pvr_vm_context *vm_ctx)
1192 {
1193 	return vm_ctx->fw_mem_ctx_obj;
1194 }
1195