aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorØrjan Eide <orjan.eide@arm.com>2018-01-30 15:28:33 -0500
committerHeiko Stuebner <heiko@sntech.de>2018-02-18 05:16:55 -0500
commit57de50af162b67612da99207b061ade3239e57db (patch)
tree0487d270d8cf88ee6f49bbe5bc55489e7d59982f
parent6fd0bfe2f7ea1a5828c44b8d8811820bf7be13a9 (diff)
drm/rockchip: Respect page offset for PRIME mmap calls
When mapping external DMA-bufs through the PRIME mmap call, we might be given an offset which has to be respected. However for the internal DRM GEM mmap path, we have to ignore the fake mmap offset used to identify the buffer only. Currently the code always zeroes out vma->vm_pgoff, which breaks the former. This patch fixes the problem by moving the vm_pgoff assignment to a function that is used only for GEM mmap path, so that the PRIME path retains the original offset. Cc: Daniel Kurtz <djkurtz@chromium.org> Signed-off-by: Ørjan Eide <orjan.eide@arm.com> Signed-off-by: Tomasz Figa <tfiga@chromium.org> Signed-off-by: Sean Paul <seanpaul@chromium.org> Signed-off-by: Thierry Escande <thierry.escande@collabora.com> Tested-by: Heiko Stuebner <heiko@sntech.de> Signed-off-by: Heiko Stuebner <heiko@sntech.de> Link: https://patchwork.freedesktop.org/patch/msgid/20180130202913.28724-4-thierry.escande@collabora.com
-rw-r--r--drivers/gpu/drm/rockchip/rockchip_drm_gem.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
index 5d52020deca1..074db7a92809 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c
@@ -264,7 +264,6 @@ static int rockchip_drm_gem_object_mmap(struct drm_gem_object *obj,
264 * VM_PFNMAP flag that was set by drm_gem_mmap_obj()/drm_gem_mmap(). 264 * VM_PFNMAP flag that was set by drm_gem_mmap_obj()/drm_gem_mmap().
265 */ 265 */
266 vma->vm_flags &= ~VM_PFNMAP; 266 vma->vm_flags &= ~VM_PFNMAP;
267 vma->vm_pgoff = 0;
268 267
269 if (rk_obj->pages) 268 if (rk_obj->pages)
270 ret = rockchip_drm_gem_object_mmap_iommu(obj, vma); 269 ret = rockchip_drm_gem_object_mmap_iommu(obj, vma);
@@ -299,6 +298,12 @@ int rockchip_gem_mmap(struct file *filp, struct vm_area_struct *vma)
299 if (ret) 298 if (ret)
300 return ret; 299 return ret;
301 300
301 /*
302 * Set vm_pgoff (used as a fake buffer offset by DRM) to 0 and map the
303 * whole buffer from the start.
304 */
305 vma->vm_pgoff = 0;
306
302 obj = vma->vm_private_data; 307 obj = vma->vm_private_data;
303 308
304 return rockchip_drm_gem_object_mmap(obj, vma); 309 return rockchip_drm_gem_object_mmap(obj, vma);