drm/i915/gvt: use cmd to restore in-context mmios to hw for gen9 platform
authorYan Zhao <yan.y.zhao@intel.com>
Wed, 8 May 2019 02:14:04 +0000 (22:14 -0400)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Tue, 21 May 2019 02:57:30 +0000 (10:57 +0800)
for restore-inhibit context, hardware will not load in-context mmios
(engine context part) to hardware, but hardware will save the mmio
values in hardware back to context image. So, in order to save correct
values of vGPU back to context image, values of vGPU mmios have to be
loaded into hardware first for restore-inhibit context.

In this patch, the mechanism is applied to all gen9 platform.

The reason excluding gen8 platforms is only because of lacking of testing
on those platforms.

v3: for mocs registers, goto in-context mmios save-restore path for skl
platform as well (weinan li)
v2: update vreg when scanning indirect context for inhibit context for
gen9

Cc: Weinan Li <weinan.z.li@intel.com>
Acked-by: Weinan Li <weinan.z.li@intel.com>
Signed-off-by: Yan Zhao <yan.y.zhao@intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
drivers/gpu/drm/i915/gvt/cmd_parser.c
drivers/gpu/drm/i915/gvt/mmio_context.c
drivers/gpu/drm/i915/gvt/scheduler.c

index ab002cfd3cabe78bd088e37b51c655c7c9016326..5cb59c0b4bbe5a7376bdd8107be80889e83c55b0 100644 (file)
@@ -896,12 +896,16 @@ static int cmd_reg_handler(struct parser_exec_state *s,
        }
 
        /* TODO
-        * Right now only scan LRI command on KBL and in inhibit context.
-        * It's good enough to support initializing mmio by lri command in
-        * vgpu inhibit context on KBL.
+        * In order to let workload with inhibit context to generate
+        * correct image data into memory, vregs values will be loaded to
+        * hw via LRIs in the workload with inhibit context. But as
+        * indirect context is loaded prior to LRIs in workload, we don't
+        * want reg values specified in indirect context overwritten by
+        * LRIs in workloads. So, when scanning an indirect context, we
+        * update reg values in it into vregs, so LRIs in workload with
+        * inhibit context will restore with correct values
         */
-       if ((IS_KABYLAKE(s->vgpu->gvt->dev_priv)
-               || IS_COFFEELAKE(s->vgpu->gvt->dev_priv)) &&
+       if (IS_GEN(gvt->dev_priv, 9) &&
                        intel_gvt_mmio_is_in_ctx(gvt, offset) &&
                        !strncmp(cmd, "lri", 3)) {
                intel_gvt_hypervisor_read_gpa(s->vgpu,
index edf6d646eb251e530d94e60baa24876ad7487416..299b602b06434ef4e708e4480edd8d7c6f681095 100644 (file)
@@ -392,10 +392,7 @@ static void switch_mocs(struct intel_vgpu *pre, struct intel_vgpu *next,
        if (WARN_ON(ring_id >= ARRAY_SIZE(regs)))
                return;
 
-       if (ring_id == RCS0 &&
-           (IS_KABYLAKE(dev_priv) ||
-            IS_BROXTON(dev_priv) ||
-            IS_COFFEELAKE(dev_priv)))
+       if (ring_id == RCS0 && IS_GEN(dev_priv, 9))
                return;
 
        if (!pre && !gen9_render_mocs.initialized)
@@ -470,11 +467,10 @@ static void switch_mmio(struct intel_vgpu *pre,
                        continue;
                /*
                 * No need to do save or restore of the mmio which is in context
-                * state image on kabylake, it's initialized by lri command and
+                * state image on gen9, it's initialized by lri command and
                 * save or restore with context together.
                 */
-               if ((IS_KABYLAKE(dev_priv) || IS_BROXTON(dev_priv)
-                       || IS_COFFEELAKE(dev_priv)) && mmio->in_context)
+               if (IS_GEN(dev_priv, 9) && mmio->in_context)
                        continue;
 
                // save
index ccd71152c9bcd5047bb6eb47a4abb045d47c563b..13632dba8b2afb516effcfa1ec79bdabb1e692d6 100644 (file)
@@ -300,9 +300,7 @@ static int copy_workload_to_ring_buffer(struct intel_vgpu_workload *workload)
        u32 *cs;
        int err;
 
-       if ((IS_KABYLAKE(req->i915) || IS_BROXTON(req->i915)
-               || IS_COFFEELAKE(req->i915))
-               && is_inhibit_context(req->hw_context))
+       if (IS_GEN(req->i915, 9) && is_inhibit_context(req->hw_context))
                intel_vgpu_restore_inhibit_context(vgpu, req);
 
        /*