diff mbox

[v2,09/10] drm/i915: Unify error handling for missing DDI buf trans tables

Message ID 20171018181934.4229-1-ville.syrjala@linux.intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ville Syrjälä Oct. 18, 2017, 6:19 p.m. UTC
From: Ville Syrjälä <ville.syrjala@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.

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>
---
 drivers/gpu/drm/i915/intel_ddi.c | 27 ++++++++++++++++++++++-----
 1 file changed, 22 insertions(+), 5 deletions(-)

Comments

James Ausmus Oct. 18, 2017, 7:59 p.m. UTC | #1
On Wed, Oct 18, 2017 at 09:19:34PM +0300, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala@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.
> 
> 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>

Reviewed-by: James Ausmus <james.ausmus@intel.com>

> ---
>  drivers/gpu/drm/i915/intel_ddi.c | 27 ++++++++++++++++++++++-----
>  1 file changed, 22 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
> index 5ee0e33e2c00..cd7a0d979a10 100644
> --- a/drivers/gpu/drm/i915/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/intel_ddi.c
> @@ -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));
> -- 
> 2.13.6
>
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 5ee0e33e2c00..cd7a0d979a10 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -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));