[Intel-gfx] [PATCH 1/4] [v2] drm/i915/color: fix broken gamma state-checker during boot

Ville Syrjälä ville.syrjala at linux.intel.com
Fri Oct 4 20:12:04 UTC 2019


On Fri, Oct 04, 2019 at 01:56:07PM +0530, Swati Sharma wrote:
> Premature gamma lut prepration and loading which was getting
> reflected in first modeset causing different colors on
> screen during boot.
> 
> Issue: In BIOS, gamma is disabled by default. However, legacy read_luts()
> was setting crtc_state->base.gamma_lut and gamma_lut was programmed
> with junk values which led to visual artifacts (different
> colored screens instead of usual black during boot).
> 
> Fix: Calling read_luts() only when gamma is enabled which will happen
> after first modeset.
> 
> This fix is independent from the revert 1b8588741fdc ("Revert
> "drm/i915/color: Extract icl_read_luts()"") and should fix different colors
> on screen in legacy platforms too.
> 
> -Added gamma_enable checks inside read_luts() [Ville/Jani N]
> -Corrected gamma enable check for CHV [Ville]
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111809
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111885
> Signed-off-by: Swati Sharma <swati2.sharma at intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_color.c | 27 +++++++++++++++++++---
>  1 file changed, 24 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_color.c b/drivers/gpu/drm/i915/display/intel_color.c
> index 9ab34902663e..8f02313a7fef 100644
> --- a/drivers/gpu/drm/i915/display/intel_color.c
> +++ b/drivers/gpu/drm/i915/display/intel_color.c
> @@ -1613,6 +1613,9 @@ i9xx_read_lut_8(const struct intel_crtc_state *crtc_state)
>  
>  static void i9xx_read_luts(struct intel_crtc_state *crtc_state)
>  {
> +	if (!crtc_state->gamma_enable)
> +		return;
> +
>  	crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
>  }
>  
> @@ -1659,6 +1662,9 @@ i965_read_lut_10p6(const struct intel_crtc_state *crtc_state)
>  
>  static void i965_read_luts(struct intel_crtc_state *crtc_state)
>  {
> +	if (!crtc_state->gamma_enable)
> +		return;
> +
>  	if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
>  		crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
>  	else
> @@ -1701,10 +1707,19 @@ chv_read_cgm_lut(const struct intel_crtc_state *crtc_state)
>  
>  static void chv_read_luts(struct intel_crtc_state *crtc_state)
>  {
> -	if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
> -		crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
> -	else
> +	if (crtc_state->cgm_mode) {
> +		if ((crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA) == 0)
> +			return;
> +
>  		crtc_state->base.gamma_lut = chv_read_cgm_lut(crtc_state);
> +	}
> +
> +	if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) {
> +		if (!crtc_state->gamma_enable)
> +			return;
> +
> +		crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
> +	}

I'd simply make this something like:

if (crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA) {
	crtc_state->base.gamma_lut = chv_read_cgm_lut(crtc_state);
} else {
	i965_read_luts(crtc_state);
}

>  }
>  
>  static struct drm_property_blob *
> @@ -1742,6 +1757,9 @@ ilk_read_lut_10(const struct intel_crtc_state *crtc_state)
>  
>  static void ilk_read_luts(struct intel_crtc_state *crtc_state)
>  {
> +	if (!crtc_state->gamma_enable)
> +		return;

We should check
        if ((crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA) == 0)
	                return;

here so we don't read the hw degamma into the state gmama_lut.

> +
>  	if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
>  		crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
>  	else
> @@ -1788,6 +1806,9 @@ glk_read_lut_10(const struct intel_crtc_state *crtc_state, u32 prec_index)
>  
>  static void glk_read_luts(struct intel_crtc_state *crtc_state)
>  {
> +	if (!crtc_state->gamma_enable)
> +		return;
> +
>  	if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
>  		crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state);
>  	else
> -- 
> 2.23.0

-- 
Ville Syrjälä
Intel


More information about the Intel-gfx mailing list