Lines Matching +full:vm +full:- +full:map
1 // SPDX-License-Identifier: GPL-2.0 OR MIT
2 /* Copyright 2017-2019 Qiang Yu <yuq825@gmail.com> */
8 #include <linux/dma-mapping.h>
20 int lima_heap_alloc(struct lima_bo *bo, struct lima_vm *vm) in lima_heap_alloc() argument
23 struct address_space *mapping = bo->base.base.filp->f_mapping; in lima_heap_alloc()
24 struct device *dev = bo->base.base.dev->dev; in lima_heap_alloc()
25 size_t old_size = bo->heap_size; in lima_heap_alloc()
26 size_t new_size = bo->heap_size ? bo->heap_size * 2 : in lima_heap_alloc()
31 if (bo->heap_size >= bo->base.base.size) in lima_heap_alloc()
32 return -ENOSPC; in lima_heap_alloc()
34 new_size = min(new_size, bo->base.base.size); in lima_heap_alloc()
36 mutex_lock(&bo->base.pages_lock); in lima_heap_alloc()
38 if (bo->base.pages) { in lima_heap_alloc()
39 pages = bo->base.pages; in lima_heap_alloc()
41 pages = kvmalloc_array(bo->base.base.size >> PAGE_SHIFT, in lima_heap_alloc()
44 mutex_unlock(&bo->base.pages_lock); in lima_heap_alloc()
45 return -ENOMEM; in lima_heap_alloc()
48 bo->base.pages = pages; in lima_heap_alloc()
49 bo->base.pages_use_count = 1; in lima_heap_alloc()
58 mutex_unlock(&bo->base.pages_lock); in lima_heap_alloc()
64 mutex_unlock(&bo->base.pages_lock); in lima_heap_alloc()
71 if (bo->base.sgt) { in lima_heap_alloc()
72 dma_unmap_sgtable(dev, bo->base.sgt, DMA_BIDIRECTIONAL, 0); in lima_heap_alloc()
73 sg_free_table(bo->base.sgt); in lima_heap_alloc()
75 bo->base.sgt = kmalloc(sizeof(*bo->base.sgt), GFP_KERNEL); in lima_heap_alloc()
76 if (!bo->base.sgt) { in lima_heap_alloc()
78 return -ENOMEM; in lima_heap_alloc()
85 kfree(bo->base.sgt); in lima_heap_alloc()
86 bo->base.sgt = NULL; in lima_heap_alloc()
90 *bo->base.sgt = sgt; in lima_heap_alloc()
92 if (vm) { in lima_heap_alloc()
93 ret = lima_vm_map_bo(vm, bo, old_size >> PAGE_SHIFT); in lima_heap_alloc()
98 bo->heap_size = new_size; in lima_heap_alloc()
116 obj = &shmem->base; in lima_gem_create_handle()
119 mask = mapping_gfp_mask(obj->filp->f_mapping); in lima_gem_create_handle()
122 mapping_set_gfp_mask(obj->filp->f_mapping, mask); in lima_gem_create_handle()
141 /* drop reference from allocate - handle holds it now */ in lima_gem_create_handle()
151 if (!list_empty(&bo->va)) in lima_gem_free_object()
152 dev_err(obj->dev->dev, "lima gem free bo still has va\n"); in lima_gem_free_object()
161 struct lima_vm *vm = priv->vm; in lima_gem_object_open() local
163 return lima_vm_bo_add(vm, bo, true); in lima_gem_object_open()
170 struct lima_vm *vm = priv->vm; in lima_gem_object_close() local
172 lima_vm_bo_del(vm, bo); in lima_gem_object_close()
179 if (bo->heap_size) in lima_gem_pin()
180 return -EINVAL; in lima_gem_pin()
185 static int lima_gem_vmap(struct drm_gem_object *obj, struct dma_buf_map *map) in lima_gem_vmap() argument
189 if (bo->heap_size) in lima_gem_vmap()
190 return -EINVAL; in lima_gem_vmap()
192 return drm_gem_shmem_vmap(obj, map); in lima_gem_vmap()
199 if (bo->heap_size) in lima_gem_mmap()
200 return -EINVAL; in lima_gem_mmap()
226 mutex_init(&bo->lock); in lima_gem_create_object()
227 INIT_LIST_HEAD(&bo->va); in lima_gem_create_object()
228 bo->base.map_wc = true; in lima_gem_create_object()
229 bo->base.base.funcs = &lima_gem_funcs; in lima_gem_create_object()
231 return &bo->base.base; in lima_gem_create_object()
239 struct lima_vm *vm = priv->vm; in lima_gem_get_info() local
243 return -ENOENT; in lima_gem_get_info()
247 *va = lima_vm_get_va(vm, bo); in lima_gem_get_info()
249 *offset = drm_vma_node_offset_addr(&obj->vma_node); in lima_gem_get_info()
270 return drm_gem_fence_array_add_implicit(&task->deps, &bo->base.base, write); in lima_gem_sync_bo()
277 for (i = 0; i < ARRAY_SIZE(submit->in_sync); i++) { in lima_gem_add_deps()
280 if (!submit->in_sync[i]) in lima_gem_add_deps()
283 err = drm_syncobj_find_fence(file, submit->in_sync[i], in lima_gem_add_deps()
288 err = drm_gem_fence_array_add(&submit->task->deps, fence); in lima_gem_add_deps()
303 struct lima_vm *vm = priv->vm; in lima_gem_submit() local
306 struct lima_bo **bos = submit->lbos; in lima_gem_submit()
308 if (submit->out_sync) { in lima_gem_submit()
309 out_sync = drm_syncobj_find(file, submit->out_sync); in lima_gem_submit()
311 return -ENOENT; in lima_gem_submit()
314 for (i = 0; i < submit->nr_bos; i++) { in lima_gem_submit()
318 obj = drm_gem_object_lookup(file, submit->bos[i].handle); in lima_gem_submit()
320 err = -ENOENT; in lima_gem_submit()
326 /* increase refcnt of gpu va map to prevent unmapped when executing, in lima_gem_submit()
329 err = lima_vm_bo_add(vm, bo, false); in lima_gem_submit()
339 submit->nr_bos, &ctx); in lima_gem_submit()
344 submit->task, submit->ctx->context + submit->pipe, in lima_gem_submit()
345 bos, submit->nr_bos, vm); in lima_gem_submit()
353 for (i = 0; i < submit->nr_bos; i++) { in lima_gem_submit()
355 submit->task, bos[i], in lima_gem_submit()
356 submit->bos[i].flags & LIMA_SUBMIT_BO_WRITE, in lima_gem_submit()
357 submit->flags & LIMA_SUBMIT_FLAG_EXPLICIT_FENCE); in lima_gem_submit()
363 submit->ctx->context + submit->pipe, submit->task); in lima_gem_submit()
365 for (i = 0; i < submit->nr_bos; i++) { in lima_gem_submit()
366 if (submit->bos[i].flags & LIMA_SUBMIT_BO_WRITE) in lima_gem_submit()
373 submit->nr_bos, &ctx); in lima_gem_submit()
375 for (i = 0; i < submit->nr_bos; i++) in lima_gem_submit()
376 drm_gem_object_put(&bos[i]->base.base); in lima_gem_submit()
388 lima_sched_task_fini(submit->task); in lima_gem_submit()
391 submit->nr_bos, &ctx); in lima_gem_submit()
393 for (i = 0; i < submit->nr_bos; i++) { in lima_gem_submit()
396 lima_vm_bo_del(vm, bos[i]); in lima_gem_submit()
397 drm_gem_object_put(&bos[i]->base.base); in lima_gem_submit()
415 if (ret == -ETIME) in lima_gem_wait()
416 ret = timeout ? -ETIMEDOUT : -EBUSY; in lima_gem_wait()