Handle the special case of a MAP op simply updating the va flags by
detecting the special case, and skip pgtable updates.

Signed-off-by: Rob Clark <robin.cl...@oss.qualcomm.com>
---
 drivers/gpu/drm/msm/msm_gem_vma.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/msm/msm_gem_vma.c 
b/drivers/gpu/drm/msm/msm_gem_vma.c
index dc54c693b28d..d4b1cfb3aa03 100644
--- a/drivers/gpu/drm/msm/msm_gem_vma.c
+++ b/drivers/gpu/drm/msm/msm_gem_vma.c
@@ -519,9 +519,10 @@ msm_gem_vm_sm_step_map(struct drm_gpuva_op *op, void *arg)
 }
 
 static int
-msm_gem_vm_sm_step_remap(struct drm_gpuva_op *op, void *arg)
+msm_gem_vm_sm_step_remap(struct drm_gpuva_op *op, void *_arg)
 {
-       struct msm_vm_bind_job *job = ((struct op_arg *)arg)->job;
+       struct op_arg *arg = _arg;
+       struct msm_vm_bind_job *job = arg->job;
        struct drm_gpuvm *vm = job->vm;
        struct drm_gpuva *orig_vma = op->remap.unmap->va;
        struct drm_gpuva *prev_vma = NULL, *next_vma = NULL;
@@ -529,6 +530,18 @@ msm_gem_vm_sm_step_remap(struct drm_gpuva_op *op, void 
*arg)
        bool mapped = to_msm_vma(orig_vma)->mapped;
        unsigned flags;
 
+       /* Special case for in-place updates: */
+       if (op->remap.unmap->keep && arg->flags &&
+           op->remap.next && !op->remap.prev &&
+           (orig_vma->gem.obj == op->remap.next->gem.obj) &&
+           (orig_vma->gem.offset == op->remap.next->gem.offset) &&
+           (orig_vma->va.addr == op->remap.next->va.addr) &&
+           (orig_vma->va.range == op->remap.next->va.range)) {
+               /* Only flags are changing, so update that in-place: */
+               unsigned orig_flags = orig_vma->flags & (DRM_GPUVA_USERBITS - 
1);
+               orig_vma->flags |= orig_flags | arg->flags;
+       }
+
        vm_dbg("orig_vma: %p:%p:%p: %016llx %016llx", vm, orig_vma,
               orig_vma->gem.obj, orig_vma->va.addr, orig_vma->va.range);
 
-- 
2.50.1

Reply via email to