From: Ville Syrjälä <ville.syrj...@linux.intel.com>

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.

Signed-off-by: Ville Syrjälä <ville.syrj...@linux.intel.com>
---
 drivers/gpu/drm/i915/intel_ddi.c | 25 ++++++++++++++++++++-----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index e93ed0d31738..b33b35757b34 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -793,6 +793,9 @@ 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(hdmi_level >= n_hdmi_entries))
+               hdmi_level = n_hdmi_entries - 1;
+
        return hdmi_level;
 }
 
@@ -849,6 +852,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)
@@ -1825,6 +1833,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;
        }
 
@@ -1855,6 +1868,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,
@@ -1908,13 +1926,10 @@ static void cnl_ddi_vswing_program(struct 
drm_i915_private *dev_priv,
        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));
-- 
2.13.5

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to