forked from Minki/linux
drm/i915: Unify error handling for missing DDI buf trans tables
Handle missing buf trans tables, or out of bounds buf trans levels the same way everywhere. These should never be hit under normal conditions, but let's play it safe for now. v2: Avoid the hdmi_level=-1 case (James) Cc: James Ausmus <james.ausmus@intel.com> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20171018181934.4229-1-ville.syrjala@linux.intel.com Reviewed-by: James Ausmus <james.ausmus@intel.com>
This commit is contained in:
parent
edba48fdfc
commit
21b39d2a3a
@ -801,6 +801,11 @@ static int intel_ddi_hdmi_level(struct drm_i915_private *dev_priv, enum port por
|
||||
hdmi_level >= n_hdmi_entries)
|
||||
hdmi_level = hdmi_default_entry;
|
||||
|
||||
if (WARN_ON_ONCE(n_hdmi_entries == 0))
|
||||
return 0;
|
||||
if (WARN_ON_ONCE(hdmi_level >= n_hdmi_entries))
|
||||
hdmi_level = n_hdmi_entries - 1;
|
||||
|
||||
return hdmi_level;
|
||||
}
|
||||
|
||||
@ -864,6 +869,11 @@ static void intel_prepare_hdmi_ddi_buffers(struct intel_encoder *encoder,
|
||||
|
||||
ddi_translations_hdmi = intel_ddi_get_buf_trans_hdmi(dev_priv, &n_hdmi_entries);
|
||||
|
||||
if (WARN_ON_ONCE(!ddi_translations_hdmi))
|
||||
return;
|
||||
if (WARN_ON_ONCE(hdmi_level >= n_hdmi_entries))
|
||||
hdmi_level = n_hdmi_entries - 1;
|
||||
|
||||
/* If we're boosting the current, set bit 31 of trans1 */
|
||||
if (IS_GEN9_BC(dev_priv) &&
|
||||
dev_priv->vbt.ddi_port_info[port].hdmi_boost_level)
|
||||
@ -1847,6 +1857,11 @@ static void skl_ddi_set_iboost(struct intel_encoder *encoder,
|
||||
else
|
||||
ddi_translations = intel_ddi_get_buf_trans_dp(dev_priv, port, &n_entries);
|
||||
|
||||
if (WARN_ON_ONCE(!ddi_translations))
|
||||
return;
|
||||
if (WARN_ON_ONCE(level >= n_entries))
|
||||
level = n_entries - 1;
|
||||
|
||||
iboost = ddi_translations[level].i_boost;
|
||||
}
|
||||
|
||||
@ -1877,6 +1892,11 @@ static void bxt_ddi_vswing_sequence(struct intel_encoder *encoder,
|
||||
else
|
||||
ddi_translations = bxt_get_buf_trans_dp(dev_priv, &n_entries);
|
||||
|
||||
if (WARN_ON_ONCE(!ddi_translations))
|
||||
return;
|
||||
if (WARN_ON_ONCE(level >= n_entries))
|
||||
level = n_entries - 1;
|
||||
|
||||
bxt_ddi_phy_set_signal_level(dev_priv, port,
|
||||
ddi_translations[level].margin,
|
||||
ddi_translations[level].scale,
|
||||
@ -1932,13 +1952,10 @@ static void cnl_ddi_vswing_program(struct intel_encoder *encoder,
|
||||
else
|
||||
ddi_translations = cnl_get_buf_trans_dp(dev_priv, &n_entries);
|
||||
|
||||
if (WARN_ON(ddi_translations == NULL))
|
||||
if (WARN_ON_ONCE(!ddi_translations))
|
||||
return;
|
||||
|
||||
if (level >= n_entries) {
|
||||
DRM_DEBUG_KMS("DDI translation not found for level %d. Using %d instead.", level, n_entries - 1);
|
||||
if (WARN_ON_ONCE(level >= n_entries))
|
||||
level = n_entries - 1;
|
||||
}
|
||||
|
||||
/* Set PORT_TX_DW5 Scaling Mode Sel to 010b. */
|
||||
val = I915_READ(CNL_PORT_TX_DW5_LN0(port));
|
||||
|
Loading…
Reference in New Issue
Block a user