[Intel-gfx] [PATCH v2 2/2] drm/i915/bios: Fixup h/vsync_end instead of h/vtotal

Jani Nikula jani.nikula at linux.intel.com
Thu Sep 21 07:17:32 UTC 2023


On Thu, 21 Sep 2023, Ville Syrjala <ville.syrjala at linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> We have the same h/vsync_end vs. h/vtotal quirk in the VBT parser
> that was also present in EDID parser. Adjust the VBT parser the
> same way as was done for hte EDID parser to fixup h/vsync_end
> instead of h/vtotal. While I'm not currently aware of any machines
> that need this for the VBT it seems prudent to keep both parsers
> in sync.
>
> And while at it let's add some debugs here as well. A bit
> lackluster but didn't feel like plumbing the connector all
> the way down at this time.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>

Reviewed-by: Jani Nikula <jani.nikula at intel.com>


> ---
>  drivers/gpu/drm/i915/display/intel_bios.c | 23 +++++++++++++++--------
>  1 file changed, 15 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c
> index f735b035436c..863ff54fffd1 100644
> --- a/drivers/gpu/drm/i915/display/intel_bios.c
> +++ b/drivers/gpu/drm/i915/display/intel_bios.c
> @@ -521,7 +521,8 @@ static void init_bdb_blocks(struct drm_i915_private *i915,
>  }
>  
>  static void
> -fill_detail_timing_data(struct drm_display_mode *panel_fixed_mode,
> +fill_detail_timing_data(struct drm_i915_private *i915,
> +			struct drm_display_mode *panel_fixed_mode,
>  			const struct lvds_dvo_timing *dvo_timing)
>  {
>  	panel_fixed_mode->hdisplay = (dvo_timing->hactive_hi << 8) |
> @@ -561,11 +562,17 @@ fill_detail_timing_data(struct drm_display_mode *panel_fixed_mode,
>  	panel_fixed_mode->height_mm = (dvo_timing->vimage_hi << 8) |
>  		dvo_timing->vimage_lo;
>  
> -	/* Some VBTs have bogus h/vtotal values */
> -	if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal)
> -		panel_fixed_mode->htotal = panel_fixed_mode->hsync_end + 1;
> -	if (panel_fixed_mode->vsync_end > panel_fixed_mode->vtotal)
> -		panel_fixed_mode->vtotal = panel_fixed_mode->vsync_end + 1;
> +	/* Some VBTs have bogus h/vsync_end values */
> +	if (panel_fixed_mode->hsync_end > panel_fixed_mode->htotal) {
> +		drm_dbg_kms(&i915->drm, "reducing hsync_end %d->%d\n",
> +			    panel_fixed_mode->hsync_end, panel_fixed_mode->htotal);
> +		panel_fixed_mode->hsync_end = panel_fixed_mode->htotal;
> +	}
> +	if (panel_fixed_mode->vsync_end > panel_fixed_mode->vtotal) {
> +		drm_dbg_kms(&i915->drm, "reducing vsync_end %d->%d\n",
> +			    panel_fixed_mode->vsync_end, panel_fixed_mode->vtotal);
> +		panel_fixed_mode->vsync_end = panel_fixed_mode->vtotal;
> +	}
>  
>  	drm_mode_set_name(panel_fixed_mode);
>  }
> @@ -849,7 +856,7 @@ parse_lfp_panel_dtd(struct drm_i915_private *i915,
>  	if (!panel_fixed_mode)
>  		return;
>  
> -	fill_detail_timing_data(panel_fixed_mode, panel_dvo_timing);
> +	fill_detail_timing_data(i915, panel_fixed_mode, panel_dvo_timing);
>  
>  	panel->vbt.lfp_lvds_vbt_mode = panel_fixed_mode;
>  
> @@ -1134,7 +1141,7 @@ parse_sdvo_panel_data(struct drm_i915_private *i915,
>  	if (!panel_fixed_mode)
>  		return;
>  
> -	fill_detail_timing_data(panel_fixed_mode, &dtds->dtds[index]);
> +	fill_detail_timing_data(i915, panel_fixed_mode, &dtds->dtds[index]);
>  
>  	panel->vbt.sdvo_lvds_vbt_mode = panel_fixed_mode;

-- 
Jani Nikula, Intel


More information about the Intel-gfx mailing list