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 f6ec948309
("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: Dave 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
This commit is contained in:
Коммит
023b3b0e13
|
@ -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. */
|
/* 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);
|
glk_force_audio_cdclk(dev_priv, true);
|
||||||
|
|
||||||
if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
|
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. */
|
/* Stop forcing CDCLK to 2*BCLK if no need for audio to be powered. */
|
||||||
if (--dev_priv->audio_power_refcount == 0)
|
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);
|
glk_force_audio_cdclk(dev_priv, false);
|
||||||
|
|
||||||
intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO, cookie);
|
intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO, cookie);
|
||||||
|
|
|
@ -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 intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc);
|
||||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
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)
|
if (old_crtc_state->master_transcoder == INVALID_TRANSCODER)
|
||||||
return;
|
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",
|
DRM_DEBUG_KMS("Disabling Transcoder Port Sync on Slave Transcoder %s\n",
|
||||||
transcoder_name(old_crtc_state->cpu_transcoder));
|
transcoder_name(old_crtc_state->cpu_transcoder));
|
||||||
|
|
||||||
reg = TRANS_DDI_FUNC_CTL2(old_crtc_state->cpu_transcoder);
|
I915_WRITE(TRANS_DDI_FUNC_CTL2(old_crtc_state->cpu_transcoder), 0);
|
||||||
trans_ddi_func_ctl2_val = ~(PORT_SYNC_MODE_ENABLE |
|
|
||||||
PORT_SYNC_MODE_MASTER_SELECT_MASK);
|
|
||||||
I915_WRITE(reg, trans_ddi_func_ctl2_val);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void intel_fdi_normal_train(struct intel_crtc *crtc)
|
static void intel_fdi_normal_train(struct intel_crtc *crtc)
|
||||||
|
|
|
@ -4416,9 +4416,11 @@ intel_execlists_create_virtual(struct i915_gem_context *ctx,
|
||||||
ve->base.gt = siblings[0]->gt;
|
ve->base.gt = siblings[0]->gt;
|
||||||
ve->base.uncore = siblings[0]->uncore;
|
ve->base.uncore = siblings[0]->uncore;
|
||||||
ve->base.id = -1;
|
ve->base.id = -1;
|
||||||
|
|
||||||
ve->base.class = OTHER_CLASS;
|
ve->base.class = OTHER_CLASS;
|
||||||
ve->base.uabi_class = I915_ENGINE_CLASS_INVALID;
|
ve->base.uabi_class = I915_ENGINE_CLASS_INVALID;
|
||||||
ve->base.instance = I915_ENGINE_CLASS_INVALID_VIRTUAL;
|
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
|
* The decision on whether to submit a request using semaphores
|
||||||
|
|
|
@ -1413,14 +1413,6 @@ static inline int mi_set_context(struct i915_request *rq, u32 flags)
|
||||||
int len;
|
int len;
|
||||||
u32 *cs;
|
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;
|
len = 4;
|
||||||
if (IS_GEN(i915, 7))
|
if (IS_GEN(i915, 7))
|
||||||
len += 2 + (num_engines ? 4 * num_engines + 6 : 0);
|
len += 2 + (num_engines ? 4 * num_engines + 6 : 0);
|
||||||
|
@ -1589,22 +1581,21 @@ static int switch_context(struct i915_request *rq)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ce->state) {
|
if (ce->state) {
|
||||||
u32 hw_flags;
|
u32 flags;
|
||||||
|
|
||||||
GEM_BUG_ON(rq->engine->id != RCS0);
|
GEM_BUG_ON(rq->engine->id != RCS0);
|
||||||
|
|
||||||
/*
|
/* For resource streamer on HSW+ and power context elsewhere */
|
||||||
* The kernel context(s) is treated as pure scratch and is not
|
BUILD_BUG_ON(HSW_MI_RS_SAVE_STATE_EN != MI_SAVE_EXT_STATE_EN);
|
||||||
* expected to retain any state (as we sacrifice it during
|
BUILD_BUG_ON(HSW_MI_RS_RESTORE_STATE_EN != MI_RESTORE_EXT_STATE_EN);
|
||||||
* 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;
|
|
||||||
|
|
||||||
ret = mi_set_context(rq, hw_flags);
|
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, flags);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1660,8 +1660,10 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
|
||||||
(IS_BROADWELL(dev_priv) || IS_GEN(dev_priv, 9))
|
(IS_BROADWELL(dev_priv) || IS_GEN(dev_priv, 9))
|
||||||
|
|
||||||
/* WaRsDisableCoarsePowerGating:skl,cnl */
|
/* WaRsDisableCoarsePowerGating:skl,cnl */
|
||||||
#define NEEDS_WaRsDisableCoarsePowerGating(dev_priv) \
|
#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_IRQ(dev_priv) (INTEL_GEN(dev_priv) >= 4)
|
||||||
#define HAS_GMBUS_BURST_READ(dev_priv) (INTEL_GEN(dev_priv) >= 10 || \
|
#define HAS_GMBUS_BURST_READ(dev_priv) (INTEL_GEN(dev_priv) >= 10 || \
|
||||||
|
|
|
@ -4177,7 +4177,13 @@ enum {
|
||||||
#define CPSSUNIT_CLKGATE_DIS REG_BIT(9)
|
#define CPSSUNIT_CLKGATE_DIS REG_BIT(9)
|
||||||
|
|
||||||
#define UNSLICE_UNIT_LEVEL_CLKGATE _MMIO(0x9434)
|
#define UNSLICE_UNIT_LEVEL_CLKGATE _MMIO(0x9434)
|
||||||
#define VFUNIT_CLKGATE_DIS (1 << 20)
|
#define VFUNIT_CLKGATE_DIS REG_BIT(20)
|
||||||
|
#define HSUNIT_CLKGATE_DIS REG_BIT(8)
|
||||||
|
#define VSUNIT_CLKGATE_DIS REG_BIT(3)
|
||||||
|
|
||||||
|
#define UNSLICE_UNIT_LEVEL_CLKGATE2 _MMIO(0x94e4)
|
||||||
|
#define VSUNIT_CLKGATE_DIS_TGL REG_BIT(19)
|
||||||
|
#define PSDUNIT_CLKGATE_DIS REG_BIT(5)
|
||||||
|
|
||||||
#define INF_UNIT_LEVEL_CLKGATE _MMIO(0x9560)
|
#define INF_UNIT_LEVEL_CLKGATE _MMIO(0x9560)
|
||||||
#define CGPSF_CLKGATE_DIS (1 << 3)
|
#define CGPSF_CLKGATE_DIS (1 << 3)
|
||||||
|
|
|
@ -6565,6 +6565,17 @@ static void icl_init_clock_gating(struct drm_i915_private *dev_priv)
|
||||||
/* WaEnable32PlaneMode:icl */
|
/* WaEnable32PlaneMode:icl */
|
||||||
I915_WRITE(GEN9_CSFE_CHICKEN1_RCS,
|
I915_WRITE(GEN9_CSFE_CHICKEN1_RCS,
|
||||||
_MASKED_BIT_ENABLE(GEN11_ENABLE_32_PLANE_MODE));
|
_MASKED_BIT_ENABLE(GEN11_ENABLE_32_PLANE_MODE));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wa_1408615072:icl,ehl (vsunit)
|
||||||
|
* Wa_1407596294:icl,ehl (hsunit)
|
||||||
|
*/
|
||||||
|
intel_uncore_rmw(&dev_priv->uncore, UNSLICE_UNIT_LEVEL_CLKGATE,
|
||||||
|
0, VSUNIT_CLKGATE_DIS | HSUNIT_CLKGATE_DIS);
|
||||||
|
|
||||||
|
/* Wa_1407352427:icl,ehl */
|
||||||
|
intel_uncore_rmw(&dev_priv->uncore, UNSLICE_UNIT_LEVEL_CLKGATE2,
|
||||||
|
0, PSDUNIT_CLKGATE_DIS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tgl_init_clock_gating(struct drm_i915_private *dev_priv)
|
static void tgl_init_clock_gating(struct drm_i915_private *dev_priv)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче