[Intel-gfx] [PATCH 08/12] drm/i915: Simplify intel_get_crtc_ycbcr_config()

Mun, Gwan-gyeong gwan-gyeong.mun at intel.com
Wed Sep 18 19:02:22 UTC 2019


On Thu, 2019-07-18 at 17:50 +0300, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> Make intel_get_crtc_ycbcr_config() simpler and rename it
> to bdw_get_pipemisc_output_format() to better reflect what
> it does.
> 
> Also toss in some comments to document that the 4:2:0 PIPECONF
> bits are glk+ only. They are mbz on earlier platforms so reading
> them unconditionally is safe however.
> 
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_display.c | 71 +++++++++---------
> --
>  drivers/gpu/drm/i915/i915_reg.h              |  4 +-
>  2 files changed, 34 insertions(+), 41 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> b/drivers/gpu/drm/i915/display/intel_display.c
> index ffdc350dc24a..1dd1aa29a649 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -8713,47 +8713,24 @@ static void chv_crtc_clock_get(struct
> intel_crtc *crtc,
>  	pipe_config->port_clock = chv_calc_dpll_params(refclk, &clock);
>  }
>  
> -static void intel_get_crtc_ycbcr_config(struct intel_crtc *crtc,
> -					struct intel_crtc_state
> *pipe_config)
> +static enum intel_output_format
> +bdw_get_pipemisc_output_format(struct intel_crtc *crtc)
>  {
>  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> -	enum intel_output_format output = INTEL_OUTPUT_FORMAT_RGB;
> -
> -	pipe_config->lspcon_downsampling = false;
> -
> -	if (IS_BROADWELL(dev_priv) || INTEL_GEN(dev_priv) >= 9) {
> -		u32 tmp = I915_READ(PIPEMISC(crtc->pipe));
> -
> -		if (tmp & PIPEMISC_OUTPUT_COLORSPACE_YUV) {
> -			bool ycbcr420_enabled = tmp &
> PIPEMISC_YUV420_ENABLE;
> -			bool blend = tmp &
> PIPEMISC_YUV420_MODE_FULL_BLEND;
> -
> -			if (ycbcr420_enabled) {
> -				/* We support 4:2:0 in full blend mode
> only */
> -				if (!blend)
> -					output =
> INTEL_OUTPUT_FORMAT_INVALID;
> -				else if (!(IS_GEMINILAKE(dev_priv) ||
> -					   INTEL_GEN(dev_priv) >= 10))
> -					output =
> INTEL_OUTPUT_FORMAT_INVALID;
> -				else
> -					output =
> INTEL_OUTPUT_FORMAT_YCBCR420;
> -			} else {
> -				/*
> -				 * Currently there is no interface
> defined to
> -				 * check user preference between
> RGB/YCBCR444
> -				 * or YCBCR420. So the only possible
> case for
> -				 * YCBCR444 usage is driving YCBCR420
> output
> -				 * with LSPCON, when pipe is configured
> for
> -				 * YCBCR444 output and LSPCON takes
> care of
> -				 * downsampling it.
> -				 */
> -				pipe_config->lspcon_downsampling =
> true;
> -				output = INTEL_OUTPUT_FORMAT_YCBCR444;
> -			}
> -		}
> -	}
> +	u32 tmp;
> +
> +	tmp = I915_READ(PIPEMISC(crtc->pipe));
>  
> -	pipe_config->output_format = output;
> +	if (tmp & PIPEMISC_YUV420_ENABLE) {
> +		/* We support 4:2:0 in full blend mode only */
> +		WARN_ON((tmp & PIPEMISC_YUV420_MODE_FULL_BLEND) == 0);
> +
> +		return INTEL_OUTPUT_FORMAT_YCBCR420;
> +	} else if (tmp & PIPEMISC_OUTPUT_COLORSPACE_YUV) {
> +		return INTEL_OUTPUT_FORMAT_YCBCR444;
> +	} else {
> +		return INTEL_OUTPUT_FORMAT_RGB;
> +	}
>  }
>  
>  static void i9xx_get_pipe_color_config(struct intel_crtc_state
> *crtc_state)
> @@ -10445,7 +10422,23 @@ static bool haswell_get_pipe_config(struct
> intel_crtc *crtc,
>  	}
>  
>  	intel_get_pipe_src_size(crtc, pipe_config);
> -	intel_get_crtc_ycbcr_config(crtc, pipe_config);
> +
> +	if (INTEL_GEN(dev_priv) >= 9 || IS_BROADWELL(dev_priv)) {
> +		pipe_config->output_format =
> +			bdw_get_pipemisc_output_format(crtc);
> +
> +		/*
> +		 * Currently there is no interface defined to
> +		 * check user preference between RGB/YCBCR444
> +		 * or YCBCR420. So the only possible case for
> +		 * YCBCR444 usage is driving YCBCR420 output
> +		 * with LSPCON, when pipe is configured for
> +		 * YCBCR444 output and LSPCON takes care of
> +		 * downsampling it.
> +		 */
> +		pipe_config->lspcon_downsampling =
> +			pipe_config->output_format ==
> INTEL_OUTPUT_FORMAT_YCBCR444;
> +	}
>  
>  	pipe_config->gamma_mode = I915_READ(GAMMA_MODE(crtc->pipe));
>  
> diff --git a/drivers/gpu/drm/i915/i915_reg.h
> b/drivers/gpu/drm/i915/i915_reg.h
> index 91bf714897e5..66f7f417231f 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -5803,8 +5803,8 @@ enum {
>  
>  #define _PIPE_MISC_A			0x70030
>  #define _PIPE_MISC_B			0x71030
> -#define   PIPEMISC_YUV420_ENABLE	(1 << 27)
> -#define   PIPEMISC_YUV420_MODE_FULL_BLEND (1 << 26)
> +#define   PIPEMISC_YUV420_ENABLE	(1 << 27) /* glk+ */
> +#define   PIPEMISC_YUV420_MODE_FULL_BLEND (1 << 26) /* glk+ */
>  #define   PIPEMISC_HDR_MODE_PRECISION	(1 << 23) /* icl+ */
>  #define   PIPEMISC_OUTPUT_COLORSPACE_YUV  (1 << 11)
>  #define   PIPEMISC_DITHER_BPC_MASK	(7 << 5)
The changes look good to me.
Reviewed-by: Gwan-gyeong Mun <gwan-gyeong.mun at intel.com>


More information about the dri-devel mailing list