[Intel-gfx] [PATCH 07/10] drm/i915: Introduce crtc_state->{pre, post}_csc_lut

Shankar, Uma uma.shankar at intel.com
Wed Oct 19 07:06:41 UTC 2022



> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces at lists.freedesktop.org> On Behalf Of Ville Syrjala
> Sent: Thursday, September 29, 2022 12:45 PM
> To: intel-gfx at lists.freedesktop.org
> Subject: [Intel-gfx] [PATCH 07/10] drm/i915: Introduce crtc_state->{pre,
> post}_csc_lut
> 
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> Add an extra remapping step between the logical state of the LUTs
> (hw.(de)gamma_lut) as specified via uapi/bigjoiner copy vs.
> the actual state of the LUTs programmed into the hardware.
> 
> With this we should be finally able finish the (de)gamma readout/state checker
> support for the remaining platforms
> (ilk-skl) where the same hardware LUT can be positioned either before or after the
> pipe CSC unit. Where we position it depends on factors such as presence of the
> logical degamma LUT, RGB vs. YCbCr output, full vs. limited RGB quantization range.
> 
> Without the extra remapping step the state readout doesn't really know whether the
> LUT read from the hardware is the degamma or gamma LUT, and so we is unable to
> accurately store it into our crtc state. With the remapping step we know exactly
> where to put it given the order of the LUT vs. CSC in the hardware state.
> 
> Only the initial hw->uapi state readout done during driver load/resume still has the
> problem of not really knowing what to do with the LUT(s). But we can just assume
> 1:1 mapping there and let subsequent commits fix things up.
> 
> Another benefit is that we now have a place for purely internal LUTs, without
> complicating the bigjoiner uapi->hw copy logic. This should prove useful for
> streamlining glk degamma LUT handling.

Looks Good to me.
Reviewed-by: Uma Shankar <uma.shankar at intel.com>

> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_atomic.c   |   8 +
>  drivers/gpu/drm/i915/display/intel_color.c    | 141 +++++++++++-------
>  .../drm/i915/display/intel_crtc_state_dump.c  |  10 +-
>  drivers/gpu/drm/i915/display/intel_display.c  |   2 +-
>  .../drm/i915/display/intel_display_types.h    |   4 +
>  .../drm/i915/display/intel_modeset_setup.c    |   6 +
>  6 files changed, 114 insertions(+), 57 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_atomic.c
> b/drivers/gpu/drm/i915/display/intel_atomic.c
> index 18f0a5ae3bac..6621aa245caf 100644
> --- a/drivers/gpu/drm/i915/display/intel_atomic.c
> +++ b/drivers/gpu/drm/i915/display/intel_atomic.c
> @@ -252,6 +252,11 @@ intel_crtc_duplicate_state(struct drm_crtc *crtc)
>  	if (crtc_state->hw.gamma_lut)
>  		drm_property_blob_get(crtc_state->hw.gamma_lut);
> 
> +	if (crtc_state->pre_csc_lut)
> +		drm_property_blob_get(crtc_state->pre_csc_lut);
> +	if (crtc_state->post_csc_lut)
> +		drm_property_blob_get(crtc_state->post_csc_lut);
> +
>  	crtc_state->update_pipe = false;
>  	crtc_state->disable_lp_wm = false;
>  	crtc_state->disable_cxsr = false;
> @@ -274,6 +279,9 @@ static void intel_crtc_put_color_blobs(struct intel_crtc_state
> *crtc_state)
>  	drm_property_blob_put(crtc_state->hw.degamma_lut);
>  	drm_property_blob_put(crtc_state->hw.gamma_lut);
>  	drm_property_blob_put(crtc_state->hw.ctm);
> +
> +	drm_property_blob_put(crtc_state->pre_csc_lut);
> +	drm_property_blob_put(crtc_state->post_csc_lut);
>  }
> 
>  void intel_crtc_free_hw_state(struct intel_crtc_state *crtc_state) diff --git
> a/drivers/gpu/drm/i915/display/intel_color.c
> b/drivers/gpu/drm/i915/display/intel_color.c
> index abaa1abab64d..380f44720fe6 100644
> --- a/drivers/gpu/drm/i915/display/intel_color.c
> +++ b/drivers/gpu/drm/i915/display/intel_color.c
> @@ -578,9 +578,9 @@ static void i9xx_load_lut_8(struct intel_crtc *crtc,  static
> void i9xx_load_luts(const struct intel_crtc_state *crtc_state)  {
>  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> -	const struct drm_property_blob *gamma_lut = crtc_state->hw.gamma_lut;
> +	const struct drm_property_blob *post_csc_lut =
> +crtc_state->post_csc_lut;
> 
> -	i9xx_load_lut_8(crtc, gamma_lut);
> +	i9xx_load_lut_8(crtc, post_csc_lut);
>  }
> 
>  static void i965_load_lut_10p6(struct intel_crtc *crtc, @@ -606,12 +606,12 @@
> static void i965_load_lut_10p6(struct intel_crtc *crtc,  static void
> i965_load_luts(const struct intel_crtc_state *crtc_state)  {
>  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> -	const struct drm_property_blob *gamma_lut = crtc_state->hw.gamma_lut;
> +	const struct drm_property_blob *post_csc_lut =
> +crtc_state->post_csc_lut;
> 
>  	if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
> -		i9xx_load_lut_8(crtc, gamma_lut);
> +		i9xx_load_lut_8(crtc, post_csc_lut);
>  	else
> -		i965_load_lut_10p6(crtc, gamma_lut);
> +		i965_load_lut_10p6(crtc, post_csc_lut);
>  }
> 
>  static void ilk_load_lut_8(struct intel_crtc *crtc, @@ -648,9 +648,9 @@ static void
> ilk_load_lut_10(struct intel_crtc *crtc,  static void ilk_load_luts(const struct
> intel_crtc_state *crtc_state)  {
>  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> -	const struct drm_property_blob *gamma_lut = crtc_state->hw.gamma_lut;
> -	const struct drm_property_blob *degamma_lut = crtc_state-
> >hw.degamma_lut;
> -	const struct drm_property_blob *blob = gamma_lut ?: degamma_lut;
> +	const struct drm_property_blob *post_csc_lut = crtc_state->post_csc_lut;
> +	const struct drm_property_blob *pre_csc_lut = crtc_state->pre_csc_lut;
> +	const struct drm_property_blob *blob = post_csc_lut ?: pre_csc_lut;
> 
>  	switch (crtc_state->gamma_mode) {
>  	case GAMMA_MODE_MODE_8BIT:
> @@ -764,19 +764,19 @@ static void ivb_load_lut_ext_max(const struct
> intel_crtc_state *crtc_state)  static void ivb_load_luts(const struct intel_crtc_state
> *crtc_state)  {
>  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> -	const struct drm_property_blob *gamma_lut = crtc_state->hw.gamma_lut;
> -	const struct drm_property_blob *degamma_lut = crtc_state-
> >hw.degamma_lut;
> -	const struct drm_property_blob *blob = gamma_lut ?: degamma_lut;
> +	const struct drm_property_blob *post_csc_lut = crtc_state->post_csc_lut;
> +	const struct drm_property_blob *pre_csc_lut = crtc_state->pre_csc_lut;
> +	const struct drm_property_blob *blob = post_csc_lut ?: pre_csc_lut;
> 
>  	switch (crtc_state->gamma_mode) {
>  	case GAMMA_MODE_MODE_8BIT:
>  		ilk_load_lut_8(crtc, blob);
>  		break;
>  	case GAMMA_MODE_MODE_SPLIT:
> -		ivb_load_lut_10(crtc, degamma_lut, PAL_PREC_SPLIT_MODE |
> +		ivb_load_lut_10(crtc, pre_csc_lut, PAL_PREC_SPLIT_MODE |
>  				PAL_PREC_INDEX_VALUE(0));
>  		ivb_load_lut_ext_max(crtc_state);
> -		ivb_load_lut_10(crtc, gamma_lut, PAL_PREC_SPLIT_MODE |
> +		ivb_load_lut_10(crtc, post_csc_lut, PAL_PREC_SPLIT_MODE |
>  				PAL_PREC_INDEX_VALUE(512));
>  		break;
>  	case GAMMA_MODE_MODE_10BIT:
> @@ -793,19 +793,19 @@ static void ivb_load_luts(const struct intel_crtc_state
> *crtc_state)  static void bdw_load_luts(const struct intel_crtc_state *crtc_state)  {
>  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> -	const struct drm_property_blob *gamma_lut = crtc_state->hw.gamma_lut;
> -	const struct drm_property_blob *degamma_lut = crtc_state-
> >hw.degamma_lut;
> -	const struct drm_property_blob *blob = gamma_lut ?: degamma_lut;
> +	const struct drm_property_blob *post_csc_lut = crtc_state->post_csc_lut;
> +	const struct drm_property_blob *pre_csc_lut = crtc_state->pre_csc_lut;
> +	const struct drm_property_blob *blob = post_csc_lut ?: pre_csc_lut;
> 
>  	switch (crtc_state->gamma_mode) {
>  	case GAMMA_MODE_MODE_8BIT:
>  		ilk_load_lut_8(crtc, blob);
>  		break;
>  	case GAMMA_MODE_MODE_SPLIT:
> -		bdw_load_lut_10(crtc, degamma_lut, PAL_PREC_SPLIT_MODE |
> +		bdw_load_lut_10(crtc, pre_csc_lut, PAL_PREC_SPLIT_MODE |
>  				PAL_PREC_INDEX_VALUE(0));
>  		ivb_load_lut_ext_max(crtc_state);
> -		bdw_load_lut_10(crtc, gamma_lut, PAL_PREC_SPLIT_MODE |
> +		bdw_load_lut_10(crtc, post_csc_lut, PAL_PREC_SPLIT_MODE |
>  				PAL_PREC_INDEX_VALUE(512));
>  		break;
>  	case GAMMA_MODE_MODE_10BIT:
> @@ -902,8 +902,8 @@ static void glk_load_degamma_lut_linear(const struct
> intel_crtc_state *crtc_stat
> 
>  static void glk_load_luts(const struct intel_crtc_state *crtc_state)  {
> -	const struct drm_property_blob *degamma_lut = crtc_state-
> >hw.degamma_lut;
> -	const struct drm_property_blob *gamma_lut = crtc_state->hw.gamma_lut;
> +	const struct drm_property_blob *pre_csc_lut = crtc_state->pre_csc_lut;
> +	const struct drm_property_blob *post_csc_lut =
> +crtc_state->post_csc_lut;
>  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> 
>  	/*
> @@ -914,17 +914,17 @@ static void glk_load_luts(const struct intel_crtc_state
> *crtc_state)
>  	 * the degama LUT so that we don't have to reload
>  	 * it every time the pipe CSC is being enabled.
>  	 */
> -	if (degamma_lut)
> -		glk_load_degamma_lut(crtc_state, degamma_lut);
> +	if (pre_csc_lut)
> +		glk_load_degamma_lut(crtc_state, pre_csc_lut);
>  	else
>  		glk_load_degamma_lut_linear(crtc_state);
> 
>  	switch (crtc_state->gamma_mode) {
>  	case GAMMA_MODE_MODE_8BIT:
> -		ilk_load_lut_8(crtc, gamma_lut);
> +		ilk_load_lut_8(crtc, post_csc_lut);
>  		break;
>  	case GAMMA_MODE_MODE_10BIT:
> -		bdw_load_lut_10(crtc, gamma_lut, PAL_PREC_INDEX_VALUE(0));
> +		bdw_load_lut_10(crtc, post_csc_lut, PAL_PREC_INDEX_VALUE(0));
>  		ivb_load_lut_ext_max(crtc_state);
>  		break;
>  	default:
> @@ -964,7 +964,7 @@ static void
>  icl_program_gamma_superfine_segment(const struct intel_crtc_state *crtc_state)
> {
>  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> -	const struct drm_property_blob *blob = crtc_state->hw.gamma_lut;
> +	const struct drm_property_blob *blob = crtc_state->post_csc_lut;
>  	const struct drm_color_lut *lut = blob->data;
>  	enum pipe pipe = crtc->pipe;
>  	int i;
> @@ -993,7 +993,7 @@ static void
>  icl_program_gamma_multi_segment(const struct intel_crtc_state *crtc_state)  {
>  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> -	const struct drm_property_blob *blob = crtc_state->hw.gamma_lut;
> +	const struct drm_property_blob *blob = crtc_state->post_csc_lut;
>  	const struct drm_color_lut *lut = blob->data;
>  	const struct drm_color_lut *entry;
>  	enum pipe pipe = crtc->pipe;
> @@ -1047,23 +1047,23 @@ icl_program_gamma_multi_segment(const struct
> intel_crtc_state *crtc_state)
> 
>  static void icl_load_luts(const struct intel_crtc_state *crtc_state)  {
> -	const struct drm_property_blob *degamma_lut = crtc_state-
> >hw.degamma_lut;
> -	const struct drm_property_blob *gamma_lut = crtc_state->hw.gamma_lut;
> +	const struct drm_property_blob *pre_csc_lut = crtc_state->pre_csc_lut;
> +	const struct drm_property_blob *post_csc_lut =
> +crtc_state->post_csc_lut;
>  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> 
> -	if (degamma_lut)
> -		glk_load_degamma_lut(crtc_state, degamma_lut);
> +	if (pre_csc_lut)
> +		glk_load_degamma_lut(crtc_state, pre_csc_lut);
> 
>  	switch (crtc_state->gamma_mode & GAMMA_MODE_MODE_MASK) {
>  	case GAMMA_MODE_MODE_8BIT:
> -		ilk_load_lut_8(crtc, gamma_lut);
> +		ilk_load_lut_8(crtc, post_csc_lut);
>  		break;
>  	case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED:
>  		icl_program_gamma_superfine_segment(crtc_state);
>  		icl_program_gamma_multi_segment(crtc_state);
>  		break;
>  	case GAMMA_MODE_MODE_10BIT:
> -		bdw_load_lut_10(crtc, gamma_lut, PAL_PREC_INDEX_VALUE(0));
> +		bdw_load_lut_10(crtc, post_csc_lut, PAL_PREC_INDEX_VALUE(0));
>  		ivb_load_lut_ext_max(crtc_state);
>  		break;
>  	default:
> @@ -1139,18 +1139,18 @@ static void chv_load_luts(const struct intel_crtc_state
> *crtc_state)  {
>  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
>  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> -	const struct drm_property_blob *degamma_lut = crtc_state-
> >hw.degamma_lut;
> -	const struct drm_property_blob *gamma_lut = crtc_state->hw.gamma_lut;
> +	const struct drm_property_blob *pre_csc_lut = crtc_state->pre_csc_lut;
> +	const struct drm_property_blob *post_csc_lut =
> +crtc_state->post_csc_lut;
>  	const struct drm_property_blob *ctm = crtc_state->hw.ctm;
> 
>  	if (crtc_state->cgm_mode & CGM_PIPE_MODE_CSC)
>  		chv_load_cgm_csc(crtc, ctm);
> 
>  	if (crtc_state->cgm_mode & CGM_PIPE_MODE_DEGAMMA)
> -		chv_load_cgm_degamma(crtc, degamma_lut);
> +		chv_load_cgm_degamma(crtc, pre_csc_lut);
> 
>  	if (crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA)
> -		chv_load_cgm_gamma(crtc, gamma_lut);
> +		chv_load_cgm_gamma(crtc, post_csc_lut);
>  	else
>  		i965_load_luts(crtc_state);
> 
> @@ -1188,8 +1188,8 @@ static bool intel_can_preload_luts(const struct
> intel_crtc_state *new_crtc_state
>  	const struct intel_crtc_state *old_crtc_state =
>  		intel_atomic_get_old_crtc_state(state, crtc);
> 
> -	return !old_crtc_state->hw.gamma_lut &&
> -		!old_crtc_state->hw.degamma_lut;
> +	return !old_crtc_state->post_csc_lut &&
> +		!old_crtc_state->pre_csc_lut;
>  }
> 
>  static bool chv_can_preload_luts(const struct intel_crtc_state *new_crtc_state)
> @@ -1208,7 +1208,7 @@ static bool chv_can_preload_luts(const struct
> intel_crtc_state *new_crtc_state)
>  	if (old_crtc_state->cgm_mode || new_crtc_state->cgm_mode)
>  		return false;
> 
> -	return !old_crtc_state->hw.gamma_lut;
> +	return !old_crtc_state->post_csc_lut;
>  }
> 
>  static bool glk_can_preload_luts(const struct intel_crtc_state *new_crtc_state) @@
> -1226,7 +1226,7 @@ static bool glk_can_preload_luts(const struct intel_crtc_state
> *new_crtc_state)
>  	 * linear hardware degamma mid scanout.
>  	 */
>  	return !old_crtc_state->csc_enable &&
> -		!old_crtc_state->hw.gamma_lut;
> +		!old_crtc_state->post_csc_lut;
>  }
> 
>  int intel_color_check(struct intel_crtc_state *crtc_state) @@ -1355,6 +1355,14 @@
> static u32 i9xx_gamma_mode(struct intel_crtc_state *crtc_state)
>  		return GAMMA_MODE_MODE_10BIT; /* i965+ only */  }
> 
> +static void intel_assign_luts(struct intel_crtc_state *crtc_state) {
> +	drm_property_replace_blob(&crtc_state->pre_csc_lut,
> +				  crtc_state->hw.degamma_lut);
> +	drm_property_replace_blob(&crtc_state->post_csc_lut,
> +				  crtc_state->hw.gamma_lut);
> +}
> +
>  static int i9xx_color_check(struct intel_crtc_state *crtc_state)  {
>  	int ret;
> @@ -1373,6 +1381,8 @@ static int i9xx_color_check(struct intel_crtc_state
> *crtc_state)
>  	if (ret)
>  		return ret;
> 
> +	intel_assign_luts(crtc_state);
> +
>  	crtc_state->preload_luts = intel_can_preload_luts(crtc_state);
> 
>  	return 0;
> @@ -1427,6 +1437,8 @@ static int chv_color_check(struct intel_crtc_state
> *crtc_state)
>  	if (ret)
>  		return ret;
> 
> +	intel_assign_luts(crtc_state);
> +
>  	crtc_state->preload_luts = chv_can_preload_luts(crtc_state);
> 
>  	return 0;
> @@ -1452,10 +1464,29 @@ static u32 ilk_csc_mode(const struct intel_crtc_state
> *crtc_state)
>  	if (crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB)
>  		return CSC_BLACK_SCREEN_OFFSET;
> 
> +	if (crtc_state->hw.degamma_lut)
> +		return CSC_MODE_YUV_TO_RGB;
> +
>  	return CSC_MODE_YUV_TO_RGB |
>  		CSC_POSITION_BEFORE_GAMMA;
>  }
> 
> +static void ilk_assign_luts(struct intel_crtc_state *crtc_state) {
> +	if (crtc_state->hw.degamma_lut ||
> +	    crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA) {
> +		drm_property_replace_blob(&crtc_state->pre_csc_lut,
> +					  crtc_state->hw.degamma_lut);
> +		drm_property_replace_blob(&crtc_state->post_csc_lut,
> +					  crtc_state->hw.gamma_lut);
> +	} else {
> +		drm_property_replace_blob(&crtc_state->pre_csc_lut,
> +					  crtc_state->hw.gamma_lut);
> +		drm_property_replace_blob(&crtc_state->post_csc_lut,
> +					  NULL);
> +	}
> +}
> +
>  static int ilk_color_check(struct intel_crtc_state *crtc_state)  {
>  	int ret;
> @@ -1483,6 +1514,8 @@ static int ilk_color_check(struct intel_crtc_state
> *crtc_state)
>  	if (ret)
>  		return ret;
> 
> +	ilk_assign_luts(crtc_state);
> +
>  	crtc_state->preload_luts = intel_can_preload_luts(crtc_state);
> 
>  	return 0;
> @@ -1550,6 +1583,8 @@ static int ivb_color_check(struct intel_crtc_state
> *crtc_state)
>  	if (ret)
>  		return ret;
> 
> +	ilk_assign_luts(crtc_state);
> +
>  	crtc_state->preload_luts = intel_can_preload_luts(crtc_state);
> 
>  	return 0;
> @@ -1598,6 +1633,8 @@ static int glk_color_check(struct intel_crtc_state
> *crtc_state)
>  	if (ret)
>  		return ret;
> 
> +	intel_assign_luts(crtc_state);
> +
>  	crtc_state->preload_luts = glk_can_preload_luts(crtc_state);
> 
>  	return 0;
> @@ -1658,6 +1695,8 @@ static int icl_color_check(struct intel_crtc_state
> *crtc_state)
> 
>  	crtc_state->csc_mode = icl_csc_mode(crtc_state);
> 
> +	intel_assign_luts(crtc_state);
> +
>  	crtc_state->preload_luts = intel_can_preload_luts(crtc_state);
> 
>  	return 0;
> @@ -1863,7 +1902,7 @@ static void i9xx_read_luts(struct intel_crtc_state
> *crtc_state)
>  	if (!crtc_state->gamma_enable)
>  		return;
> 
> -	crtc_state->hw.gamma_lut = i9xx_read_lut_8(crtc);
> +	crtc_state->post_csc_lut = i9xx_read_lut_8(crtc);
>  }
> 
>  static struct drm_property_blob *i965_read_lut_10p6(struct intel_crtc *crtc) @@ -
> 1904,9 +1943,9 @@ static void i965_read_luts(struct intel_crtc_state *crtc_state)
>  		return;
> 
>  	if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT)
> -		crtc_state->hw.gamma_lut = i9xx_read_lut_8(crtc);
> +		crtc_state->post_csc_lut = i9xx_read_lut_8(crtc);
>  	else
> -		crtc_state->hw.gamma_lut = i965_read_lut_10p6(crtc);
> +		crtc_state->post_csc_lut = i965_read_lut_10p6(crtc);
>  }
> 
>  static struct drm_property_blob *chv_read_cgm_gamma(struct intel_crtc *crtc)
> @@ -1940,7 +1979,7 @@ static void chv_read_luts(struct intel_crtc_state
> *crtc_state)
>  	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> 
>  	if (crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA)
> -		crtc_state->hw.gamma_lut = chv_read_cgm_gamma(crtc);
> +		crtc_state->post_csc_lut = chv_read_cgm_gamma(crtc);
>  	else
>  		i965_read_luts(crtc_state);
>  }
> @@ -2007,10 +2046,10 @@ static void ilk_read_luts(struct intel_crtc_state
> *crtc_state)
> 
>  	switch (crtc_state->gamma_mode) {
>  	case GAMMA_MODE_MODE_8BIT:
> -		crtc_state->hw.gamma_lut = ilk_read_lut_8(crtc);
> +		crtc_state->post_csc_lut = ilk_read_lut_8(crtc);
>  		break;
>  	case GAMMA_MODE_MODE_10BIT:
> -		crtc_state->hw.gamma_lut = ilk_read_lut_10(crtc);
> +		crtc_state->post_csc_lut = ilk_read_lut_10(crtc);
>  		break;
>  	default:
>  		MISSING_CASE(crtc_state->gamma_mode);
> @@ -2062,10 +2101,10 @@ static void glk_read_luts(struct intel_crtc_state
> *crtc_state)
> 
>  	switch (crtc_state->gamma_mode) {
>  	case GAMMA_MODE_MODE_8BIT:
> -		crtc_state->hw.gamma_lut = ilk_read_lut_8(crtc);
> +		crtc_state->post_csc_lut = ilk_read_lut_8(crtc);
>  		break;
>  	case GAMMA_MODE_MODE_10BIT:
> -		crtc_state->hw.gamma_lut = bdw_read_lut_10(crtc,
> PAL_PREC_INDEX_VALUE(0));
> +		crtc_state->post_csc_lut = bdw_read_lut_10(crtc,
> +PAL_PREC_INDEX_VALUE(0));
>  		break;
>  	default:
>  		MISSING_CASE(crtc_state->gamma_mode);
> @@ -2120,13 +2159,13 @@ static void icl_read_luts(struct intel_crtc_state
> *crtc_state)
> 
>  	switch (crtc_state->gamma_mode & GAMMA_MODE_MODE_MASK) {
>  	case GAMMA_MODE_MODE_8BIT:
> -		crtc_state->hw.gamma_lut = ilk_read_lut_8(crtc);
> +		crtc_state->post_csc_lut = ilk_read_lut_8(crtc);
>  		break;
>  	case GAMMA_MODE_MODE_10BIT:
> -		crtc_state->hw.gamma_lut = bdw_read_lut_10(crtc,
> PAL_PREC_INDEX_VALUE(0));
> +		crtc_state->post_csc_lut = bdw_read_lut_10(crtc,
> +PAL_PREC_INDEX_VALUE(0));
>  		break;
>  	case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED:
> -		crtc_state->hw.gamma_lut = icl_read_lut_multi_segment(crtc);
> +		crtc_state->post_csc_lut = icl_read_lut_multi_segment(crtc);
>  		break;
>  	default:
>  		MISSING_CASE(crtc_state->gamma_mode);
> diff --git a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
> b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
> index e9212f69c360..98e36ab55e9e 100644
> --- a/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
> +++ b/drivers/gpu/drm/i915/display/intel_crtc_state_dump.c
> @@ -298,11 +298,11 @@ void intel_crtc_state_dump(const struct intel_crtc_state
> *pipe_config,
>  			    pipe_config->csc_mode, pipe_config->gamma_mode,
>  			    pipe_config->gamma_enable, pipe_config->csc_enable);
> 
> -	drm_dbg_kms(&i915->drm, "degamma lut: %d entries, gamma lut: %d
> entries\n",
> -		    pipe_config->hw.degamma_lut ?
> -		    drm_color_lut_size(pipe_config->hw.degamma_lut) : 0,
> -		    pipe_config->hw.gamma_lut ?
> -		    drm_color_lut_size(pipe_config->hw.gamma_lut) : 0);
> +	drm_dbg_kms(&i915->drm, "pre csc lut: %d entries, post csc lut: %d
> entries\n",
> +		    pipe_config->pre_csc_lut ?
> +		    drm_color_lut_size(pipe_config->pre_csc_lut) : 0,
> +		    pipe_config->post_csc_lut ?
> +		    drm_color_lut_size(pipe_config->post_csc_lut) : 0);
> 
>  dump_planes:
>  	if (!state)
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c
> b/drivers/gpu/drm/i915/display/intel_display.c
> index a103413cb081..20569b6838d1 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -5815,7 +5815,7 @@ intel_pipe_config_compare(const struct intel_crtc_state
> *current_config,
> 
>  		bp_gamma = intel_color_get_gamma_bit_precision(pipe_config);
>  		if (bp_gamma)
> -			PIPE_CONF_CHECK_COLOR_LUT(gamma_mode,
> hw.gamma_lut, bp_gamma);
> +			PIPE_CONF_CHECK_COLOR_LUT(gamma_mode,
> post_csc_lut, bp_gamma);
> 
>  		if (current_config->active_planes) {
>  			PIPE_CONF_CHECK_BOOL(has_psr);
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> b/drivers/gpu/drm/i915/display/intel_display_types.h
> index e2b853e9e51d..cd76236d5fa3 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1001,11 +1001,15 @@ struct intel_crtc_state {
>  	 */
>  	struct {
>  		bool active, enable;
> +		/* logical state of LUTs */
>  		struct drm_property_blob *degamma_lut, *gamma_lut, *ctm;
>  		struct drm_display_mode mode, pipe_mode, adjusted_mode;
>  		enum drm_scaling_filter scaling_filter;
>  	} hw;
> 
> +	/* actual state of LUTs */
> +	struct drm_property_blob *pre_csc_lut, *post_csc_lut;
> +
>  	/**
>  	 * quirks - bitfield with hw state readout quirks
>  	 *
> diff --git a/drivers/gpu/drm/i915/display/intel_modeset_setup.c
> b/drivers/gpu/drm/i915/display/intel_modeset_setup.c
> index cbfabd58b75a..55ccdafefd27 100644
> --- a/drivers/gpu/drm/i915/display/intel_modeset_setup.c
> +++ b/drivers/gpu/drm/i915/display/intel_modeset_setup.c
> @@ -155,6 +155,12 @@ static void intel_crtc_copy_hw_to_uapi_state(struct
> intel_crtc_state *crtc_state
>  	crtc_state->uapi.adjusted_mode = crtc_state->hw.adjusted_mode;
>  	crtc_state->uapi.scaling_filter = crtc_state->hw.scaling_filter;
> 
> +	/* assume 1:1 mapping */
> +	drm_property_replace_blob(&crtc_state->hw.degamma_lut,
> +				  crtc_state->pre_csc_lut);
> +	drm_property_replace_blob(&crtc_state->hw.gamma_lut,
> +				  crtc_state->post_csc_lut);
> +
>  	drm_property_replace_blob(&crtc_state->uapi.degamma_lut,
>  				  crtc_state->hw.degamma_lut);
>  	drm_property_replace_blob(&crtc_state->uapi.gamma_lut,
> --
> 2.35.1



More information about the Intel-gfx mailing list