aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1898-drm-amdgpu-Add-gem_prime_mmap-support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1898-drm-amdgpu-Add-gem_prime_mmap-support.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1898-drm-amdgpu-Add-gem_prime_mmap-support.patch93
1 files changed, 93 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1898-drm-amdgpu-Add-gem_prime_mmap-support.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1898-drm-amdgpu-Add-gem_prime_mmap-support.patch
new file mode 100644
index 00000000..c2add04e
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1898-drm-amdgpu-Add-gem_prime_mmap-support.patch
@@ -0,0 +1,93 @@
+From b7bba25053372ac08d6e29b55b89b6f8badd2f2c Mon Sep 17 00:00:00 2001
+From: Samuel Li <Samuel.Li@amd.com>
+Date: Tue, 22 Aug 2017 15:25:33 -0400
+Subject: [PATCH 1898/4131] drm/amdgpu: Add gem_prime_mmap support
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+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>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 +
+ drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 1 +
+ drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c | 34 +++++++++++++++++++++++++++++++
+ 3 files changed, 36 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+index 8566bf2..3d65b20 100755
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+@@ -431,6 +431,7 @@ void amdgpu_gem_prime_unpin(struct drm_gem_object *obj);
+ struct reservation_object *amdgpu_gem_prime_res_obj(struct drm_gem_object *);
+ void *amdgpu_gem_prime_vmap(struct drm_gem_object *obj);
+ void amdgpu_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
++int amdgpu_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
+ int amdgpu_gem_debugfs_init(struct amdgpu_device *adev);
+
+ /* sub-allocation manager, it has to be protected by another lock.
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+index cad11ae..238b01e 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+@@ -853,6 +853,7 @@ static struct drm_driver kms_driver = {
+ .gem_prime_import_sg_table = amdgpu_gem_prime_import_sg_table,
+ .gem_prime_vmap = amdgpu_gem_prime_vmap,
+ .gem_prime_vunmap = amdgpu_gem_prime_vunmap,
++ .gem_prime_mmap = amdgpu_gem_prime_mmap,
+
+ .name = DRIVER_NAME,
+ .desc = DRIVER_DESC,
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
+index 8beb92e..581ba9d 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)
+ ttm_bo_kunmap(&bo->dma_buf_vmap);
+ }
+
++int amdgpu_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma)
++{
++ struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
++ struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
++ unsigned asize = amdgpu_bo_size(bo);
++ int ret;
++
++ if (!vma->vm_file)
++ return -ENODEV;
++
++ if (adev == NULL)
++ return -ENODEV;
++
++ /* Check for valid size. */
++ if (asize < vma->vm_end - vma->vm_start)
++ return -EINVAL;
++
++ if (amdgpu_ttm_tt_get_usermm(bo->tbo.ttm) ||
++ (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)) {
++ return -EPERM;
++ }
++ vma->vm_pgoff += amdgpu_bo_mmap_offset(bo) >> PAGE_SHIFT;
++
++ /* prime mmap does not need to check access, so allow here */
++ ret = drm_vma_node_allow(&obj->vma_node, vma->vm_file->private_data);
++ if (ret)
++ return ret;
++
++ ret = ttm_bo_mmap(vma->vm_file, vma, &adev->mman.bdev);
++ drm_vma_node_revoke(&obj->vma_node, vma->vm_file->private_data);
++
++ return ret;
++}
++
+ struct drm_gem_object *
+ amdgpu_gem_prime_import_sg_table(struct drm_device *dev,
+ struct dma_buf_attachment *attach,
+--
+2.7.4
+