diff options
author | Samuel Li <Samuel.Li@amd.com> | 2017-08-22 15:25:33 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-09-26 15:14:37 -0400 |
commit | dfced2e4bcbc8d6bd9bad11cc6b4643ba36ed35a (patch) | |
tree | 217d000e2043004a94b4972889126d2ea558e659 /drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c | |
parent | aec8d5cc28b32b02e09c92c422f4a4ed9f53ff74 (diff) |
drm/amdgpu: Add gem_prime_mmap support
v2: drop hdp invalidate/flush.
v3: honor pgoff during prime mmap. Add a barrier after cpu access.
v4: drop begin/end_cpu_access() for now, revisit later.
Signed-off-by: Samuel Li <Samuel.Li@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c index 7e0826469b5e..90af8e82b16a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c | |||
@@ -57,6 +57,40 @@ void amdgpu_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr) | |||
57 | ttm_bo_kunmap(&bo->dma_buf_vmap); | 57 | ttm_bo_kunmap(&bo->dma_buf_vmap); |
58 | } | 58 | } |
59 | 59 | ||
60 | int amdgpu_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma) | ||
61 | { | ||
62 | struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); | ||
63 | struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); | ||
64 | unsigned asize = amdgpu_bo_size(bo); | ||
65 | int ret; | ||
66 | |||
67 | if (!vma->vm_file) | ||
68 | return -ENODEV; | ||
69 | |||
70 | if (adev == NULL) | ||
71 | return -ENODEV; | ||
72 | |||
73 | /* Check for valid size. */ | ||
74 | if (asize < vma->vm_end - vma->vm_start) | ||
75 | return -EINVAL; | ||
76 | |||
77 | if (amdgpu_ttm_tt_get_usermm(bo->tbo.ttm) || | ||
78 | (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)) { | ||
79 | return -EPERM; | ||
80 | } | ||
81 | vma->vm_pgoff += amdgpu_bo_mmap_offset(bo) >> PAGE_SHIFT; | ||
82 | |||
83 | /* prime mmap does not need to check access, so allow here */ | ||
84 | ret = drm_vma_node_allow(&obj->vma_node, vma->vm_file->private_data); | ||
85 | if (ret) | ||
86 | return ret; | ||
87 | |||
88 | ret = ttm_bo_mmap(vma->vm_file, vma, &adev->mman.bdev); | ||
89 | drm_vma_node_revoke(&obj->vma_node, vma->vm_file->private_data); | ||
90 | |||
91 | return ret; | ||
92 | } | ||
93 | |||
60 | struct drm_gem_object * | 94 | struct drm_gem_object * |
61 | amdgpu_gem_prime_import_sg_table(struct drm_device *dev, | 95 | amdgpu_gem_prime_import_sg_table(struct drm_device *dev, |
62 | struct dma_buf_attachment *attach, | 96 | struct dma_buf_attachment *attach, |