Commit 023b3b0e authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'drm-intel-fixes-2020-01-09-1' of...

Merge tag 'drm-intel-fixes-2020-01-09-1' of git://anongit.freedesktop.org/drm/drm-intel

 into drm-fixes

- Fix GitLab issue #446 causing GPU hangs: Do not restore invalid RS state
- Fix GitLab issue #846: Restore coarse power gating that was disabled
  by initial RC66 context corruption security fixes.
- Revert f6ec9483 ("drm/i915: extend audio CDCLK>=2*BCLK constraint to more platforms")
  to avoid screen flicker
- Fix to fill in unitialized uabi_instance in virtual engine uAPI
- Add two missing W/As for ICL and EHL

Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
From: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200109133458.GA15558@jlahtine-desk.ger.corp.intel.com
parents ac0c9d3f 2b2c4a83
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -856,7 +856,7 @@ static unsigned long i915_audio_component_get_power(struct device *kdev)
		}

		/* Force CDCLK to 2*BCLK as long as we need audio powered. */
		if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
		if (IS_GEMINILAKE(dev_priv))
			glk_force_audio_cdclk(dev_priv, true);

		if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
@@ -875,7 +875,7 @@ static void i915_audio_component_put_power(struct device *kdev,

	/* Stop forcing CDCLK to 2*BCLK if no need for audio to be powered. */
	if (--dev_priv->audio_power_refcount == 0)
		if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
		if (IS_GEMINILAKE(dev_priv))
			glk_force_audio_cdclk(dev_priv, false);

	intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO, cookie);
+1 −6
Original line number Diff line number Diff line
@@ -4515,8 +4515,6 @@ static void icl_disable_transcoder_port_sync(const struct intel_crtc_state *old_
{
	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
	i915_reg_t reg;
	u32 trans_ddi_func_ctl2_val;

	if (old_crtc_state->master_transcoder == INVALID_TRANSCODER)
		return;
@@ -4524,10 +4522,7 @@ static void icl_disable_transcoder_port_sync(const struct intel_crtc_state *old_
	DRM_DEBUG_KMS("Disabling Transcoder Port Sync on Slave Transcoder %s\n",
		      transcoder_name(old_crtc_state->cpu_transcoder));

	reg = TRANS_DDI_FUNC_CTL2(old_crtc_state->cpu_transcoder);
	trans_ddi_func_ctl2_val = ~(PORT_SYNC_MODE_ENABLE |
				    PORT_SYNC_MODE_MASTER_SELECT_MASK);
	I915_WRITE(reg, trans_ddi_func_ctl2_val);
	I915_WRITE(TRANS_DDI_FUNC_CTL2(old_crtc_state->cpu_transcoder), 0);
}

static void intel_fdi_normal_train(struct intel_crtc *crtc)
+2 −0
Original line number Diff line number Diff line
@@ -4416,9 +4416,11 @@ intel_execlists_create_virtual(struct i915_gem_context *ctx,
	ve->base.gt = siblings[0]->gt;
	ve->base.uncore = siblings[0]->uncore;
	ve->base.id = -1;

	ve->base.class = OTHER_CLASS;
	ve->base.uabi_class = I915_ENGINE_CLASS_INVALID;
	ve->base.instance = I915_ENGINE_CLASS_INVALID_VIRTUAL;
	ve->base.uabi_instance = I915_ENGINE_CLASS_INVALID_VIRTUAL;

	/*
	 * The decision on whether to submit a request using semaphores
+11 −20
Original line number Diff line number Diff line
@@ -1413,14 +1413,6 @@ static inline int mi_set_context(struct i915_request *rq, u32 flags)
	int len;
	u32 *cs;

	flags |= MI_MM_SPACE_GTT;
	if (IS_HASWELL(i915))
		/* These flags are for resource streamer on HSW+ */
		flags |= HSW_MI_RS_SAVE_STATE_EN | HSW_MI_RS_RESTORE_STATE_EN;
	else
		/* We need to save the extended state for powersaving modes */
		flags |= MI_SAVE_EXT_STATE_EN | MI_RESTORE_EXT_STATE_EN;

	len = 4;
	if (IS_GEN(i915, 7))
		len += 2 + (num_engines ? 4 * num_engines + 6 : 0);
@@ -1589,22 +1581,21 @@ static int switch_context(struct i915_request *rq)
	}

	if (ce->state) {
		u32 hw_flags;
		u32 flags;

		GEM_BUG_ON(rq->engine->id != RCS0);

		/*
		 * The kernel context(s) is treated as pure scratch and is not
		 * expected to retain any state (as we sacrifice it during
		 * suspend and on resume it may be corrupted). This is ok,
		 * as nothing actually executes using the kernel context; it
		 * is purely used for flushing user contexts.
		 */
		hw_flags = 0;
		if (i915_gem_context_is_kernel(rq->gem_context))
			hw_flags = MI_RESTORE_INHIBIT;
		/* For resource streamer on HSW+ and power context elsewhere */
		BUILD_BUG_ON(HSW_MI_RS_SAVE_STATE_EN != MI_SAVE_EXT_STATE_EN);
		BUILD_BUG_ON(HSW_MI_RS_RESTORE_STATE_EN != MI_RESTORE_EXT_STATE_EN);

		flags = MI_SAVE_EXT_STATE_EN | MI_MM_SPACE_GTT;
		if (!i915_gem_context_is_kernel(rq->gem_context))
			flags |= MI_RESTORE_EXT_STATE_EN;
		else
			flags |= MI_RESTORE_INHIBIT;

		ret = mi_set_context(rq, hw_flags);
		ret = mi_set_context(rq, flags);
		if (ret)
			return ret;
	}
+4 −2
Original line number Diff line number Diff line
@@ -1661,7 +1661,9 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,

/* WaRsDisableCoarsePowerGating:skl,cnl */
#define NEEDS_WaRsDisableCoarsePowerGating(dev_priv)			\
	(IS_CANNONLAKE(dev_priv) || IS_GEN(dev_priv, 9))
	(IS_CANNONLAKE(dev_priv) ||					\
	 IS_SKL_GT3(dev_priv) ||					\
	 IS_SKL_GT4(dev_priv))

#define HAS_GMBUS_IRQ(dev_priv) (INTEL_GEN(dev_priv) >= 4)
#define HAS_GMBUS_BURST_READ(dev_priv) (INTEL_GEN(dev_priv) >= 10 || \
Loading