From: Chris Wilson <ch...@chris-wilson.co.uk>

---
 drivers/gpu/drm/i915/i915_drv.h         |  1 +
 drivers/gpu/drm/i915/i915_gem_context.c | 34 ++++++++++++++++++++++-----------
 2 files changed, 24 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 55afb66..5a260db 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -3437,6 +3437,7 @@ struct drm_i915_gem_object *
 i915_gem_alloc_context_obj(struct drm_device *dev, size_t size);
 struct i915_gem_context *
 i915_gem_context_create_gvt(struct drm_device *dev);
+struct i915_vma *i915_gem_context_pin_legacy(struct i915_gem_context *ctx);

 static inline struct i915_gem_context *
 i915_gem_context_lookup(struct drm_i915_file_private *file_priv, u32 id)
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c 
b/drivers/gpu/drm/i915/i915_gem_context.c
index 5dca32a..a620e15b 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -751,12 +751,31 @@ needs_pd_load_post(struct i915_hw_ppgtt *ppgtt,
        return false;
 }

+struct i915_vma *i915_gem_context_pin_legacy(struct i915_gem_context *ctx)
+{
+       struct i915_vma *vma = ctx->engine[RCS].state;
+       int ret;
+
+       /* Clear this page out of any CPU caches for coherent swap-in/out. */
+       if (!(vma->flags & I915_VMA_GLOBAL_BIND)) {
+               ret = i915_gem_object_set_to_gtt_domain(vma->obj, false);
+               if (ret)
+                       return ERR_PTR(ret);
+       }
+
+       ret = i915_vma_pin(vma, 0, ctx->ggtt_alignment, PIN_GLOBAL);
+       if (ret)
+               return ERR_PTR(ret);
+
+       return vma;
+}
+
 static int do_rcs_switch(struct drm_i915_gem_request *req)
 {
        struct i915_gem_context *to = req->ctx;
        struct intel_engine_cs *engine = req->engine;
        struct i915_hw_ppgtt *ppgtt = to->ppgtt ?: req->i915->mm.aliasing_ppgtt;
-       struct i915_vma *vma = to->engine[RCS].state;
+       struct i915_vma *vma;
        struct i915_gem_context *from;
        u32 hw_flags;
        int ret, i;
@@ -764,17 +783,10 @@ static int do_rcs_switch(struct drm_i915_gem_request *req)
        if (skip_rcs_switch(ppgtt, engine, to))
                return 0;

-       /* Clear this page out of any CPU caches for coherent swap-in/out. */
-       if (!(vma->flags & I915_VMA_GLOBAL_BIND)) {
-               ret = i915_gem_object_set_to_gtt_domain(vma->obj, false);
-               if (ret)
-                       return ret;
-       }
-
        /* Trying to pin first makes error handling easier. */
-       ret = i915_vma_pin(vma, 0, to->ggtt_alignment, PIN_GLOBAL);
-       if (ret)
-               return ret;
+       vma = i915_gem_context_pin_legacy(to);
+       if (IS_ERR(vma))
+               return PTR_ERR(vma);

        /*
         * Pin can switch back to the default context if we end up calling into
-- 
2.10.1

Reply via email to