drm/i915/gvt: add full vGPU reset support
authorPing Gao <ping.a.gao@intel.com>
Wed, 26 Oct 2016 01:38:52 +0000 (09:38 +0800)
committerZhenyu Wang <zhenyuw@linux.intel.com>
Thu, 27 Oct 2016 03:20:19 +0000 (11:20 +0800)
Full vGPU reset need to release all the shadow PPGGT pages to avoid
unnecessary write-protect and also should re-initialize pvinfo after
resetting vregs to keep pvinfo correct.

Signed-off-by: Ping Gao <ping.a.gao@intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
drivers/gpu/drm/i915/gvt/gvt.h
drivers/gpu/drm/i915/gvt/handlers.c
drivers/gpu/drm/i915/gvt/vgpu.c

index 11df62b542b19655e2dcc9c7e53caa13aa28491e..62fc9e3ac5c6d324d0fba10ea530a678c0c3400a 100644 (file)
@@ -382,6 +382,8 @@ void intel_vgpu_clean_opregion(struct intel_vgpu *vgpu);
 int intel_vgpu_init_opregion(struct intel_vgpu *vgpu, u32 gpa);
 
 int intel_vgpu_emulate_opregion_request(struct intel_vgpu *vgpu, u32 swsci);
+int setup_vgpu_mmio(struct intel_vgpu *vgpu);
+void populate_pvinfo_page(struct intel_vgpu *vgpu);
 
 #include "mpt.h"
 
index 7832e49ed5b3f47b3f367bb95387e36311bbff3e..4850cf3e0dbd94d114569f437a4a95610b4f3f82 100644 (file)
@@ -251,6 +251,16 @@ static int handle_device_reset(struct intel_vgpu *vgpu, unsigned int offset,
 
        intel_vgpu_reset_execlist(vgpu, bitmap);
 
+       /* full GPU reset */
+       if (bitmap == 0xff) {
+               mutex_unlock(&vgpu->gvt->lock);
+               intel_vgpu_clean_gtt(vgpu);
+               mutex_lock(&vgpu->gvt->lock);
+               setup_vgpu_mmio(vgpu);
+               populate_pvinfo_page(vgpu);
+               intel_vgpu_init_gtt(vgpu);
+       }
+
        vgpu->resetting = false;
 
        return 0;
index 9401436d721fe922adde13d1f281026e50bf8c16..4f54005b976d4f5308845deea643ec03ff9dfb7a 100644 (file)
@@ -41,7 +41,7 @@ static void clean_vgpu_mmio(struct intel_vgpu *vgpu)
        vgpu->mmio.vreg = vgpu->mmio.sreg = NULL;
 }
 
-static int setup_vgpu_mmio(struct intel_vgpu *vgpu)
+int setup_vgpu_mmio(struct intel_vgpu *vgpu)
 {
        struct intel_gvt *gvt = vgpu->gvt;
        const struct intel_gvt_device_info *info = &gvt->device_info;
@@ -103,7 +103,7 @@ static void setup_vgpu_cfg_space(struct intel_vgpu *vgpu,
        }
 }
 
-static void populate_pvinfo_page(struct intel_vgpu *vgpu)
+void populate_pvinfo_page(struct intel_vgpu *vgpu)
 {
        /* setup the ballooning information */
        vgpu_vreg64(vgpu, vgtif_reg(magic)) = VGT_MAGIC;