Commit 11c5ec78 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-intel-fixes-2020-04-23' of...

Merge tag 'drm-intel-fixes-2020-04-23' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes

- Tigerlake Workaround - disabling media recompression (Matt)
- Fix RPS interrupts for right GPU frequency (Chris)
- HDCP fix prime check (Oliver)
- Tigerlake Thunderbolt power well fix (Matt)
- Tigerlake DP link training fixes (Jose)
- Documentation sphinx build fix (Jani)
- Fix enable_dpcd_backlight modparam (Lyude)
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200423190246.GA1710303@intel.com
parents c2c39adb d082119f
...@@ -3141,9 +3141,6 @@ static void hsw_ddi_pre_enable_dp(struct intel_encoder *encoder, ...@@ -3141,9 +3141,6 @@ static void hsw_ddi_pre_enable_dp(struct intel_encoder *encoder,
intel_dp_set_link_params(intel_dp, crtc_state->port_clock, intel_dp_set_link_params(intel_dp, crtc_state->port_clock,
crtc_state->lane_count, is_mst); crtc_state->lane_count, is_mst);
intel_dp->regs.dp_tp_ctl = DP_TP_CTL(port);
intel_dp->regs.dp_tp_status = DP_TP_STATUS(port);
intel_edp_panel_on(intel_dp); intel_edp_panel_on(intel_dp);
intel_ddi_clk_select(encoder, crtc_state); intel_ddi_clk_select(encoder, crtc_state);
...@@ -3848,12 +3845,18 @@ void intel_ddi_get_config(struct intel_encoder *encoder, ...@@ -3848,12 +3845,18 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->uapi.crtc); struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->uapi.crtc);
enum transcoder cpu_transcoder = pipe_config->cpu_transcoder; enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
u32 temp, flags = 0; u32 temp, flags = 0;
/* XXX: DSI transcoder paranoia */ /* XXX: DSI transcoder paranoia */
if (drm_WARN_ON(&dev_priv->drm, transcoder_is_dsi(cpu_transcoder))) if (drm_WARN_ON(&dev_priv->drm, transcoder_is_dsi(cpu_transcoder)))
return; return;
if (INTEL_GEN(dev_priv) >= 12) {
intel_dp->regs.dp_tp_ctl = TGL_DP_TP_CTL(cpu_transcoder);
intel_dp->regs.dp_tp_status = TGL_DP_TP_STATUS(cpu_transcoder);
}
intel_dsc_get_config(encoder, pipe_config); intel_dsc_get_config(encoder, pipe_config);
temp = intel_de_read(dev_priv, TRANS_DDI_FUNC_CTL(cpu_transcoder)); temp = intel_de_read(dev_priv, TRANS_DDI_FUNC_CTL(cpu_transcoder));
...@@ -4173,6 +4176,7 @@ static const struct drm_encoder_funcs intel_ddi_funcs = { ...@@ -4173,6 +4176,7 @@ static const struct drm_encoder_funcs intel_ddi_funcs = {
static struct intel_connector * static struct intel_connector *
intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port) intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port)
{ {
struct drm_i915_private *dev_priv = to_i915(intel_dig_port->base.base.dev);
struct intel_connector *connector; struct intel_connector *connector;
enum port port = intel_dig_port->base.port; enum port port = intel_dig_port->base.port;
...@@ -4183,6 +4187,10 @@ intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port) ...@@ -4183,6 +4187,10 @@ intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port)
intel_dig_port->dp.output_reg = DDI_BUF_CTL(port); intel_dig_port->dp.output_reg = DDI_BUF_CTL(port);
intel_dig_port->dp.prepare_link_retrain = intel_dig_port->dp.prepare_link_retrain =
intel_ddi_prepare_link_retrain; intel_ddi_prepare_link_retrain;
if (INTEL_GEN(dev_priv) < 12) {
intel_dig_port->dp.regs.dp_tp_ctl = DP_TP_CTL(port);
intel_dig_port->dp.regs.dp_tp_status = DP_TP_STATUS(port);
}
if (!intel_dp_init_connector(intel_dig_port, connector)) { if (!intel_dp_init_connector(intel_dig_port, connector)) {
kfree(connector); kfree(connector);
......
...@@ -4140,7 +4140,7 @@ static const struct i915_power_well_desc tgl_power_wells[] = { ...@@ -4140,7 +4140,7 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
{ {
.name = "AUX D TBT1", .name = "AUX D TBT1",
.domains = TGL_AUX_D_TBT1_IO_POWER_DOMAINS, .domains = TGL_AUX_D_TBT1_IO_POWER_DOMAINS,
.ops = &hsw_power_well_ops, .ops = &icl_tc_phy_aux_power_well_ops,
.id = DISP_PW_ID_NONE, .id = DISP_PW_ID_NONE,
{ {
.hsw.regs = &icl_aux_power_well_regs, .hsw.regs = &icl_aux_power_well_regs,
...@@ -4151,7 +4151,7 @@ static const struct i915_power_well_desc tgl_power_wells[] = { ...@@ -4151,7 +4151,7 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
{ {
.name = "AUX E TBT2", .name = "AUX E TBT2",
.domains = TGL_AUX_E_TBT2_IO_POWER_DOMAINS, .domains = TGL_AUX_E_TBT2_IO_POWER_DOMAINS,
.ops = &hsw_power_well_ops, .ops = &icl_tc_phy_aux_power_well_ops,
.id = DISP_PW_ID_NONE, .id = DISP_PW_ID_NONE,
{ {
.hsw.regs = &icl_aux_power_well_regs, .hsw.regs = &icl_aux_power_well_regs,
...@@ -4162,7 +4162,7 @@ static const struct i915_power_well_desc tgl_power_wells[] = { ...@@ -4162,7 +4162,7 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
{ {
.name = "AUX F TBT3", .name = "AUX F TBT3",
.domains = TGL_AUX_F_TBT3_IO_POWER_DOMAINS, .domains = TGL_AUX_F_TBT3_IO_POWER_DOMAINS,
.ops = &hsw_power_well_ops, .ops = &icl_tc_phy_aux_power_well_ops,
.id = DISP_PW_ID_NONE, .id = DISP_PW_ID_NONE,
{ {
.hsw.regs = &icl_aux_power_well_regs, .hsw.regs = &icl_aux_power_well_regs,
...@@ -4173,7 +4173,7 @@ static const struct i915_power_well_desc tgl_power_wells[] = { ...@@ -4173,7 +4173,7 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
{ {
.name = "AUX G TBT4", .name = "AUX G TBT4",
.domains = TGL_AUX_G_TBT4_IO_POWER_DOMAINS, .domains = TGL_AUX_G_TBT4_IO_POWER_DOMAINS,
.ops = &hsw_power_well_ops, .ops = &icl_tc_phy_aux_power_well_ops,
.id = DISP_PW_ID_NONE, .id = DISP_PW_ID_NONE,
{ {
.hsw.regs = &icl_aux_power_well_regs, .hsw.regs = &icl_aux_power_well_regs,
...@@ -4184,7 +4184,7 @@ static const struct i915_power_well_desc tgl_power_wells[] = { ...@@ -4184,7 +4184,7 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
{ {
.name = "AUX H TBT5", .name = "AUX H TBT5",
.domains = TGL_AUX_H_TBT5_IO_POWER_DOMAINS, .domains = TGL_AUX_H_TBT5_IO_POWER_DOMAINS,
.ops = &hsw_power_well_ops, .ops = &icl_tc_phy_aux_power_well_ops,
.id = DISP_PW_ID_NONE, .id = DISP_PW_ID_NONE,
{ {
.hsw.regs = &icl_aux_power_well_regs, .hsw.regs = &icl_aux_power_well_regs,
...@@ -4195,7 +4195,7 @@ static const struct i915_power_well_desc tgl_power_wells[] = { ...@@ -4195,7 +4195,7 @@ static const struct i915_power_well_desc tgl_power_wells[] = {
{ {
.name = "AUX I TBT6", .name = "AUX I TBT6",
.domains = TGL_AUX_I_TBT6_IO_POWER_DOMAINS, .domains = TGL_AUX_I_TBT6_IO_POWER_DOMAINS,
.ops = &hsw_power_well_ops, .ops = &icl_tc_phy_aux_power_well_ops,
.id = DISP_PW_ID_NONE, .id = DISP_PW_ID_NONE,
{ {
.hsw.regs = &icl_aux_power_well_regs, .hsw.regs = &icl_aux_power_well_regs,
......
...@@ -2517,9 +2517,6 @@ static void intel_dp_prepare(struct intel_encoder *encoder, ...@@ -2517,9 +2517,6 @@ static void intel_dp_prepare(struct intel_encoder *encoder,
intel_crtc_has_type(pipe_config, intel_crtc_has_type(pipe_config,
INTEL_OUTPUT_DP_MST)); INTEL_OUTPUT_DP_MST));
intel_dp->regs.dp_tp_ctl = DP_TP_CTL(port);
intel_dp->regs.dp_tp_status = DP_TP_STATUS(port);
/* /*
* There are four kinds of DP registers: * There are four kinds of DP registers:
* *
...@@ -7836,6 +7833,8 @@ bool intel_dp_init(struct drm_i915_private *dev_priv, ...@@ -7836,6 +7833,8 @@ bool intel_dp_init(struct drm_i915_private *dev_priv,
intel_dig_port->dp.output_reg = output_reg; intel_dig_port->dp.output_reg = output_reg;
intel_dig_port->max_lanes = 4; intel_dig_port->max_lanes = 4;
intel_dig_port->dp.regs.dp_tp_ctl = DP_TP_CTL(port);
intel_dig_port->dp.regs.dp_tp_status = DP_TP_STATUS(port);
intel_encoder->type = INTEL_OUTPUT_DP; intel_encoder->type = INTEL_OUTPUT_DP;
intel_encoder->power_domain = intel_port_to_power_domain(port); intel_encoder->power_domain = intel_port_to_power_domain(port);
......
...@@ -342,6 +342,7 @@ int intel_dp_aux_init_backlight_funcs(struct intel_connector *intel_connector) ...@@ -342,6 +342,7 @@ int intel_dp_aux_init_backlight_funcs(struct intel_connector *intel_connector)
*/ */
if (dev_priv->vbt.backlight.type != if (dev_priv->vbt.backlight.type !=
INTEL_BACKLIGHT_VESA_EDP_AUX_INTERFACE && INTEL_BACKLIGHT_VESA_EDP_AUX_INTERFACE &&
i915_modparams.enable_dpcd_backlight != 1 &&
!drm_dp_has_quirk(&intel_dp->desc, intel_dp->edid_quirks, !drm_dp_has_quirk(&intel_dp->desc, intel_dp->edid_quirks,
DP_QUIRK_FORCE_DPCD_BACKLIGHT)) { DP_QUIRK_FORCE_DPCD_BACKLIGHT)) {
DRM_DEV_INFO(dev->dev, DRM_DEV_INFO(dev->dev,
......
...@@ -1536,7 +1536,8 @@ bool intel_hdmi_hdcp_check_link(struct intel_digital_port *intel_dig_port) ...@@ -1536,7 +1536,8 @@ bool intel_hdmi_hdcp_check_link(struct intel_digital_port *intel_dig_port)
intel_de_write(i915, HDCP_RPRIME(i915, cpu_transcoder, port), ri.reg); intel_de_write(i915, HDCP_RPRIME(i915, cpu_transcoder, port), ri.reg);
/* Wait for Ri prime match */ /* Wait for Ri prime match */
if (wait_for(intel_de_read(i915, HDCP_STATUS(i915, cpu_transcoder, port)) & if (wait_for((intel_de_read(i915, HDCP_STATUS(i915, cpu_transcoder, port)) &
(HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC)) ==
(HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC), 1)) { (HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC), 1)) {
DRM_ERROR("Ri' mismatch detected, link check failed (%x)\n", DRM_ERROR("Ri' mismatch detected, link check failed (%x)\n",
intel_de_read(i915, HDCP_STATUS(i915, cpu_transcoder, port))); intel_de_read(i915, HDCP_STATUS(i915, cpu_transcoder, port)));
......
...@@ -2817,19 +2817,25 @@ static bool skl_plane_format_mod_supported(struct drm_plane *_plane, ...@@ -2817,19 +2817,25 @@ static bool skl_plane_format_mod_supported(struct drm_plane *_plane,
} }
} }
static bool gen12_plane_supports_mc_ccs(enum plane_id plane_id) static bool gen12_plane_supports_mc_ccs(struct drm_i915_private *dev_priv,
enum plane_id plane_id)
{ {
/* Wa_14010477008:tgl[a0..c0] */
if (IS_TGL_REVID(dev_priv, TGL_REVID_A0, TGL_REVID_C0))
return false;
return plane_id < PLANE_SPRITE4; return plane_id < PLANE_SPRITE4;
} }
static bool gen12_plane_format_mod_supported(struct drm_plane *_plane, static bool gen12_plane_format_mod_supported(struct drm_plane *_plane,
u32 format, u64 modifier) u32 format, u64 modifier)
{ {
struct drm_i915_private *dev_priv = to_i915(_plane->dev);
struct intel_plane *plane = to_intel_plane(_plane); struct intel_plane *plane = to_intel_plane(_plane);
switch (modifier) { switch (modifier) {
case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS: case I915_FORMAT_MOD_Y_TILED_GEN12_MC_CCS:
if (!gen12_plane_supports_mc_ccs(plane->id)) if (!gen12_plane_supports_mc_ccs(dev_priv, plane->id))
return false; return false;
/* fall through */ /* fall through */
case DRM_FORMAT_MOD_LINEAR: case DRM_FORMAT_MOD_LINEAR:
...@@ -2998,9 +3004,10 @@ static const u32 *icl_get_plane_formats(struct drm_i915_private *dev_priv, ...@@ -2998,9 +3004,10 @@ static const u32 *icl_get_plane_formats(struct drm_i915_private *dev_priv,
} }
} }
static const u64 *gen12_get_plane_modifiers(enum plane_id plane_id) static const u64 *gen12_get_plane_modifiers(struct drm_i915_private *dev_priv,
enum plane_id plane_id)
{ {
if (gen12_plane_supports_mc_ccs(plane_id)) if (gen12_plane_supports_mc_ccs(dev_priv, plane_id))
return gen12_plane_format_modifiers_mc_ccs; return gen12_plane_format_modifiers_mc_ccs;
else else
return gen12_plane_format_modifiers_rc_ccs; return gen12_plane_format_modifiers_rc_ccs;
...@@ -3070,7 +3077,7 @@ skl_universal_plane_create(struct drm_i915_private *dev_priv, ...@@ -3070,7 +3077,7 @@ skl_universal_plane_create(struct drm_i915_private *dev_priv,
plane->has_ccs = skl_plane_has_ccs(dev_priv, pipe, plane_id); plane->has_ccs = skl_plane_has_ccs(dev_priv, pipe, plane_id);
if (INTEL_GEN(dev_priv) >= 12) { if (INTEL_GEN(dev_priv) >= 12) {
modifiers = gen12_get_plane_modifiers(plane_id); modifiers = gen12_get_plane_modifiers(dev_priv, plane_id);
plane_funcs = &gen12_plane_funcs; plane_funcs = &gen12_plane_funcs;
} else { } else {
if (plane->has_ccs) if (plane->has_ccs)
......
...@@ -81,13 +81,14 @@ static void rps_enable_interrupts(struct intel_rps *rps) ...@@ -81,13 +81,14 @@ static void rps_enable_interrupts(struct intel_rps *rps)
events = (GEN6_PM_RP_UP_THRESHOLD | events = (GEN6_PM_RP_UP_THRESHOLD |
GEN6_PM_RP_DOWN_THRESHOLD | GEN6_PM_RP_DOWN_THRESHOLD |
GEN6_PM_RP_DOWN_TIMEOUT); GEN6_PM_RP_DOWN_TIMEOUT);
WRITE_ONCE(rps->pm_events, events); WRITE_ONCE(rps->pm_events, events);
spin_lock_irq(&gt->irq_lock); spin_lock_irq(&gt->irq_lock);
gen6_gt_pm_enable_irq(gt, rps->pm_events); gen6_gt_pm_enable_irq(gt, rps->pm_events);
spin_unlock_irq(&gt->irq_lock); spin_unlock_irq(&gt->irq_lock);
set(gt->uncore, GEN6_PMINTRMSK, rps_pm_mask(rps, rps->cur_freq)); intel_uncore_write(gt->uncore,
GEN6_PMINTRMSK, rps_pm_mask(rps, rps->last_freq));
} }
static void gen6_rps_reset_interrupts(struct intel_rps *rps) static void gen6_rps_reset_interrupts(struct intel_rps *rps)
...@@ -120,7 +121,9 @@ static void rps_disable_interrupts(struct intel_rps *rps) ...@@ -120,7 +121,9 @@ static void rps_disable_interrupts(struct intel_rps *rps)
struct intel_gt *gt = rps_to_gt(rps); struct intel_gt *gt = rps_to_gt(rps);
WRITE_ONCE(rps->pm_events, 0); WRITE_ONCE(rps->pm_events, 0);
set(gt->uncore, GEN6_PMINTRMSK, rps_pm_sanitize_mask(rps, ~0u));
intel_uncore_write(gt->uncore,
GEN6_PMINTRMSK, rps_pm_sanitize_mask(rps, ~0u));
spin_lock_irq(&gt->irq_lock); spin_lock_irq(&gt->irq_lock);
gen6_gt_pm_disable_irq(gt, GEN6_PM_RPS_EVENTS); gen6_gt_pm_disable_irq(gt, GEN6_PM_RPS_EVENTS);
......
...@@ -1507,6 +1507,8 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915, ...@@ -1507,6 +1507,8 @@ IS_SUBPLATFORM(const struct drm_i915_private *i915,
(IS_ICELAKE(p) && IS_REVID(p, since, until)) (IS_ICELAKE(p) && IS_REVID(p, since, until))
#define TGL_REVID_A0 0x0 #define TGL_REVID_A0 0x0
#define TGL_REVID_B0 0x1
#define TGL_REVID_C0 0x2
#define IS_TGL_REVID(p, since, until) \ #define IS_TGL_REVID(p, since, until) \
(IS_TIGERLAKE(p) && IS_REVID(p, since, until)) (IS_TIGERLAKE(p) && IS_REVID(p, since, until))
......
...@@ -34,8 +34,8 @@ ...@@ -34,8 +34,8 @@
* Follow the style described here for new macros, and while changing existing * Follow the style described here for new macros, and while changing existing
* macros. Do **not** mass change existing definitions just to update the style. * macros. Do **not** mass change existing definitions just to update the style.
* *
* Layout * File Layout
* ~~~~~~ * ~~~~~~~~~~~
* *
* Keep helper macros near the top. For example, _PIPE() and friends. * Keep helper macros near the top. For example, _PIPE() and friends.
* *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment