drm/i915/gvt: correct the emulation in TLB control handler
[sfrench/cifs-2.6.git] / drivers / gpu / drm / i915 / gvt / handlers.c
index 3e74fb3d4aa93398381e5a032398886f3a313dda..2d97fb78343edd676520916f0b3e7b0c3bbf9d7b 100644 (file)
@@ -239,7 +239,11 @@ static int handle_device_reset(struct intel_vgpu *vgpu, unsigned int offset,
        vgpu->resetting = true;
 
        intel_vgpu_stop_schedule(vgpu);
-       if (scheduler->current_vgpu == vgpu) {
+       /*
+        * The current_vgpu will set to NULL after stopping the
+        * scheduler when the reset is triggered by current vgpu.
+        */
+       if (scheduler->current_vgpu == NULL) {
                mutex_unlock(&vgpu->gvt->lock);
                intel_gvt_wait_vgpu_idle(vgpu);
                mutex_lock(&vgpu->gvt->lock);
@@ -247,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;
@@ -258,6 +272,7 @@ static int gdrst_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
        u32 data;
        u64 bitmap = 0;
 
+       write_vreg(vgpu, offset, p_data, bytes);
        data = vgpu_vreg(vgpu, offset);
 
        if (data & GEN6_GRDOM_FULL) {
@@ -1143,7 +1158,10 @@ static int fpga_dbg_mmio_write(struct intel_vgpu *vgpu,
 static int dma_ctrl_write(struct intel_vgpu *vgpu, unsigned int offset,
                void *p_data, unsigned int bytes)
 {
-       u32 mode = *(u32 *)p_data;
+       u32 mode;
+
+       write_vreg(vgpu, offset, p_data, bytes);
+       mode = vgpu_vreg(vgpu, offset);
 
        if (GFX_MODE_BIT_SET_IN_MASK(mode, START_DMA)) {
                WARN_ONCE(1, "VM(%d): iGVT-g doesn't supporte GuC\n",
@@ -1305,7 +1323,7 @@ static int elsp_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
        int ring_id = render_mmio_to_ring_id(vgpu->gvt, offset);
        struct intel_vgpu_execlist *execlist;
        u32 data = *(u32 *)p_data;
-       int ret;
+       int ret = 0;
 
        if (WARN_ON(ring_id < 0 || ring_id > I915_NUM_ENGINES - 1))
                return -EINVAL;
@@ -1313,12 +1331,15 @@ static int elsp_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
        execlist = &vgpu->execlist[ring_id];
 
        execlist->elsp_dwords.data[execlist->elsp_dwords.index] = data;
-       if (execlist->elsp_dwords.index == 3)
+       if (execlist->elsp_dwords.index == 3) {
                ret = intel_vgpu_submit_execlist(vgpu, ring_id);
+               if(ret)
+                       gvt_err("fail submit workload on ring %d\n", ring_id);
+       }
 
        ++execlist->elsp_dwords.index;
        execlist->elsp_dwords.index &= 0x3;
-       return 0;
+       return ret;
 }
 
 static int ring_mode_mmio_write(struct intel_vgpu *vgpu, unsigned int offset,
@@ -1349,6 +1370,8 @@ static int gvt_reg_tlb_control_handler(struct intel_vgpu *vgpu,
        int rc = 0;
        unsigned int id = 0;
 
+       write_vreg(vgpu, offset, p_data, bytes);
+
        switch (offset) {
        case 0x4260:
                id = RCS;