Browse Source

Merge tag 'drm-intel-fixes-2018-01-11-1' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes

Hopefully final drm/i915 fixes for v4.15:
- Fix a KASAN reported use after free
- Whitelist a register to avoid hangs
- GVT fixes

* tag 'drm-intel-fixes-2018-01-11-1' of git://anongit.freedesktop.org/drm/drm-intel:
  drm/i915: Don't adjust priority on an already signaled fence
  drm/i915: Whitelist SLICE_COMMON_ECO_CHICKEN1 on Geminilake.
  drm/i915/gvt: Fix stack-out-of-bounds bug in cmd parser
  drm/i915/gvt: Clear the shadow page table entry after post-sync
Dave Airlie 7 years ago
parent
commit
fee6c614a5

+ 2 - 2
drivers/gpu/drm/i915/gvt/cmd_parser.c

@@ -2777,12 +2777,12 @@ int intel_gvt_scan_and_shadow_wa_ctx(struct intel_shadow_wa_ctx *wa_ctx)
 }
 }
 
 
 static struct cmd_info *find_cmd_entry_any_ring(struct intel_gvt *gvt,
 static struct cmd_info *find_cmd_entry_any_ring(struct intel_gvt *gvt,
-		unsigned int opcode, int rings)
+		unsigned int opcode, unsigned long rings)
 {
 {
 	struct cmd_info *info = NULL;
 	struct cmd_info *info = NULL;
 	unsigned int ring;
 	unsigned int ring;
 
 
-	for_each_set_bit(ring, (unsigned long *)&rings, I915_NUM_ENGINES) {
+	for_each_set_bit(ring, &rings, I915_NUM_ENGINES) {
 		info = find_cmd_entry(gvt, opcode, ring);
 		info = find_cmd_entry(gvt, opcode, ring);
 		if (info)
 		if (info)
 			break;
 			break;

+ 4 - 1
drivers/gpu/drm/i915/gvt/gtt.c

@@ -1359,12 +1359,15 @@ static int ppgtt_handle_guest_write_page_table_bytes(void *gp,
 			return ret;
 			return ret;
 	} else {
 	} else {
 		if (!test_bit(index, spt->post_shadow_bitmap)) {
 		if (!test_bit(index, spt->post_shadow_bitmap)) {
+			int type = spt->shadow_page.type;
+
 			ppgtt_get_shadow_entry(spt, &se, index);
 			ppgtt_get_shadow_entry(spt, &se, index);
 			ret = ppgtt_handle_guest_entry_removal(gpt, &se, index);
 			ret = ppgtt_handle_guest_entry_removal(gpt, &se, index);
 			if (ret)
 			if (ret)
 				return ret;
 				return ret;
+			ops->set_pfn(&se, vgpu->gtt.scratch_pt[type].page_mfn);
+			ppgtt_set_shadow_entry(spt, &se, index);
 		}
 		}
-
 		ppgtt_set_post_shadow(spt, index);
 		ppgtt_set_post_shadow(spt, index);
 	}
 	}
 
 

+ 1 - 1
drivers/gpu/drm/i915/i915_gem.c

@@ -467,7 +467,7 @@ static void __fence_set_priority(struct dma_fence *fence, int prio)
 	struct drm_i915_gem_request *rq;
 	struct drm_i915_gem_request *rq;
 	struct intel_engine_cs *engine;
 	struct intel_engine_cs *engine;
 
 
-	if (!dma_fence_is_i915(fence))
+	if (dma_fence_is_signaled(fence) || !dma_fence_is_i915(fence))
 		return;
 		return;
 
 
 	rq = to_request(fence);
 	rq = to_request(fence);

+ 2 - 0
drivers/gpu/drm/i915/i915_reg.h

@@ -7027,6 +7027,8 @@ enum {
 #define GEN9_SLICE_COMMON_ECO_CHICKEN0		_MMIO(0x7308)
 #define GEN9_SLICE_COMMON_ECO_CHICKEN0		_MMIO(0x7308)
 #define  DISABLE_PIXEL_MASK_CAMMING		(1<<14)
 #define  DISABLE_PIXEL_MASK_CAMMING		(1<<14)
 
 
+#define GEN9_SLICE_COMMON_ECO_CHICKEN1		_MMIO(0x731c)
+
 #define GEN7_L3SQCREG1				_MMIO(0xB010)
 #define GEN7_L3SQCREG1				_MMIO(0xB010)
 #define  VLV_B0_WA_L3SQCREG1_VALUE		0x00D30000
 #define  VLV_B0_WA_L3SQCREG1_VALUE		0x00D30000
 
 

+ 5 - 0
drivers/gpu/drm/i915/intel_engine_cs.c

@@ -1390,6 +1390,11 @@ static int glk_init_workarounds(struct intel_engine_cs *engine)
 	if (ret)
 	if (ret)
 		return ret;
 		return ret;
 
 
+	/* WA #0862: Userspace has to set "Barrier Mode" to avoid hangs. */
+	ret = wa_ring_whitelist_reg(engine, GEN9_SLICE_COMMON_ECO_CHICKEN1);
+	if (ret)
+		return ret;
+
 	/* WaToEnableHwFixForPushConstHWBug:glk */
 	/* WaToEnableHwFixForPushConstHWBug:glk */
 	WA_SET_BIT_MASKED(COMMON_SLICE_CHICKEN2,
 	WA_SET_BIT_MASKED(COMMON_SLICE_CHICKEN2,
 			  GEN8_SBE_DISABLE_REPLAY_BUF_OPTIMIZATION);
 			  GEN8_SBE_DISABLE_REPLAY_BUF_OPTIMIZATION);

+ 3 - 0
drivers/gpu/drm/i915/intel_lrc.c

@@ -974,6 +974,9 @@ static void execlists_schedule(struct drm_i915_gem_request *request, int prio)
 
 
 	GEM_BUG_ON(prio == I915_PRIORITY_INVALID);
 	GEM_BUG_ON(prio == I915_PRIORITY_INVALID);
 
 
+	if (i915_gem_request_completed(request))
+		return;
+
 	if (prio <= READ_ONCE(request->priotree.priority))
 	if (prio <= READ_ONCE(request->priotree.priority))
 		return;
 		return;