* Re: [Intel-gfx] [PATCH 01/20] drm/i915: Fix state checker hw.active/hw.enable readout [not found] ` <20200717211345.26851-2-ville.syrjala@linux.intel.com> @ 2020-09-17 19:20 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 19:20 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:43 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 01/20] drm/i915: Fix state checker > hw.active/hw.enable readout > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Previously intel_dump_pipe_config() used to dump the full crtc state whether or > not the crtc was logically enabled or not. As that meant occasionally dumping > confusing stale garbage I changed it to check whether the crtc is logically enabled > or not. However I did not realize that the state checker readout code does not > populate crtc_state.hw.{active,enabled}. Hence the state checker dump would > only give us a full dump of the sw state but not the hw state. Fix that by > populating those bits of the hw state as well. Looks good. Reviewed-by: Uma Shankar <uma.shankar@intel.com> > Fixes: 10d75f5428fd ("drm/i915: Fix plane state dumps") > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_display.c | 15 +++++++++------ > 1 file changed, 9 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c > b/drivers/gpu/drm/i915/display/intel_display.c > index 729ec6e0d43a..ae0af452d776 100644 > --- a/drivers/gpu/drm/i915/display/intel_display.c > +++ b/drivers/gpu/drm/i915/display/intel_display.c > @@ -14244,7 +14244,6 @@ verify_crtc_state(struct intel_crtc *crtc, > struct intel_encoder *encoder; > struct intel_crtc_state *pipe_config = old_crtc_state; > struct drm_atomic_state *state = old_crtc_state->uapi.state; > - bool active; > > __drm_atomic_helper_crtc_destroy_state(&old_crtc_state->uapi); > intel_crtc_free_hw_state(old_crtc_state); > @@ -14254,16 +14253,19 @@ verify_crtc_state(struct intel_crtc *crtc, > drm_dbg_kms(&dev_priv->drm, "[CRTC:%d:%s]\n", crtc->base.base.id, > crtc->base.name); > > - active = dev_priv->display.get_pipe_config(crtc, pipe_config); > + pipe_config->hw.enable = new_crtc_state->hw.enable; > + > + pipe_config->hw.active = > + dev_priv->display.get_pipe_config(crtc, pipe_config); > > /* we keep both pipes enabled on 830 */ > - if (IS_I830(dev_priv)) > - active = new_crtc_state->hw.active; > + if (IS_I830(dev_priv) && pipe_config->hw.active) > + pipe_config->hw.active = new_crtc_state->hw.active; > > - I915_STATE_WARN(new_crtc_state->hw.active != active, > + I915_STATE_WARN(new_crtc_state->hw.active != pipe_config->hw.active, > "crtc active state doesn't match with hw state " > "(expected %i, found %i)\n", > - new_crtc_state->hw.active, active); > + new_crtc_state->hw.active, pipe_config->hw.active); > > I915_STATE_WARN(crtc->active != new_crtc_state->hw.active, > "transitional active state does not match atomic hw state > " > @@ -14272,6 +14274,7 @@ verify_crtc_state(struct intel_crtc *crtc, > > for_each_encoder_on_crtc(dev, &crtc->base, encoder) { > enum pipe pipe; > + bool active; > > active = encoder->get_hw_state(encoder, &pipe); > I915_STATE_WARN(active != new_crtc_state->hw.active, > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-3-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 02/20] drm/i915: Move MST master transcoder dump earlier [not found] ` <20200717211345.26851-3-ville.syrjala@linux.intel.com> @ 2020-09-17 19:24 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 19:24 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:43 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 02/20] drm/i915: Move MST master transcoder dump > earlier > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Move the MST master transcoder dump next to the other transcoder bits. Reviewed-by: Uma Shankar <uma.shankar@intel.com> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_display.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c > b/drivers/gpu/drm/i915/display/intel_display.c > index ae0af452d776..c36379cf07fc 100644 > --- a/drivers/gpu/drm/i915/display/intel_display.c > +++ b/drivers/gpu/drm/i915/display/intel_display.c > @@ -13031,6 +13031,9 @@ static void intel_dump_pipe_config(const struct > intel_crtc_state *pipe_config, > transcoder_name(pipe_config->cpu_transcoder), > pipe_config->pipe_bpp, pipe_config->dither); > > + drm_dbg_kms(&dev_priv->drm, "MST master transcoder: %s\n", > + transcoder_name(pipe_config->mst_master_transcoder)); > + > drm_dbg_kms(&dev_priv->drm, > "port sync: master transcoder: %s, slave transcoder bitmask = > 0x%x\n", > transcoder_name(pipe_config->master_transcoder), > @@ -13128,9 +13131,6 @@ static void intel_dump_pipe_config(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(&dev_priv->drm, "MST master transcoder: %s\n", > - transcoder_name(pipe_config->mst_master_transcoder)); > - > dump_planes: > if (!state) > return; > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-4-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 03/20] drm/i915: Include the LUT sizes in the state dump [not found] ` <20200717211345.26851-4-ville.syrjala@linux.intel.com> @ 2020-09-17 19:27 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 19:27 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:43 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 03/20] drm/i915: Include the LUT sizes in the state > dump > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Dump the sizes of the software LUTs in the state dump. Makes it a bit easier to > see which is is present without having to decode it from the gamma_mode and Nitpick: Drop an extra "is" With this, Reviewed-by: Uma Shankar <uma.shankar@intel.com> > other bits of state. > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_display.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c > b/drivers/gpu/drm/i915/display/intel_display.c > index c36379cf07fc..9279df7757fc 100644 > --- a/drivers/gpu/drm/i915/display/intel_display.c > +++ b/drivers/gpu/drm/i915/display/intel_display.c > @@ -13131,6 +13131,12 @@ static void intel_dump_pipe_config(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(&dev_priv->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); > + > dump_planes: > if (!state) > return; > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-5-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 04/20] drm/i915: s/glk_read_lut_10/bdw_read_lut_10/ [not found] ` <20200717211345.26851-5-ville.syrjala@linux.intel.com> @ 2020-09-17 19:29 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 19:29 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:43 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 04/20] drm/i915: > s/glk_read_lut_10/bdw_read_lut_10/ > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > glk_read_lut_10() works just find for all bdw+ platforms, so rename it. Reviewed-by: Uma Shankar <uma.shankar@intel.com> > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_color.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_color.c > b/drivers/gpu/drm/i915/display/intel_color.c > index 945bb03bdd4d..77c103a86a30 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.c > +++ b/drivers/gpu/drm/i915/display/intel_color.c > @@ -1919,7 +1919,8 @@ static void ilk_read_luts(struct intel_crtc_state > *crtc_state) > crtc_state->hw.gamma_lut = ilk_read_lut_10(crtc); } > > -static struct drm_property_blob *glk_read_lut_10(struct intel_crtc *crtc, > +/* On BDW+ the index auto increment mode actually works */ static > +struct drm_property_blob *bdw_read_lut_10(struct intel_crtc *crtc, > u32 prec_index) > { > struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); @@ -1960,7 > +1961,7 @@ static void glk_read_luts(struct intel_crtc_state *crtc_state) > if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) > crtc_state->hw.gamma_lut = ilk_read_lut_8(crtc); > else > - crtc_state->hw.gamma_lut = glk_read_lut_10(crtc, > PAL_PREC_INDEX_VALUE(0)); > + crtc_state->hw.gamma_lut = bdw_read_lut_10(crtc, > +PAL_PREC_INDEX_VALUE(0)); > } > > static struct drm_property_blob * > @@ -2016,7 +2017,7 @@ static void icl_read_luts(struct intel_crtc_state > *crtc_state) > crtc_state->hw.gamma_lut = icl_read_lut_multi_segment(crtc); > break; > default: > - crtc_state->hw.gamma_lut = glk_read_lut_10(crtc, > PAL_PREC_INDEX_VALUE(0)); > + crtc_state->hw.gamma_lut = bdw_read_lut_10(crtc, > +PAL_PREC_INDEX_VALUE(0)); > } > } > > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-6-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 05/20] drm/i915: Reset glk degamma index after programming/readout [not found] ` <20200717211345.26851-6-ville.syrjala@linux.intel.com> @ 2020-09-17 19:39 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 19:39 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:44 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 05/20] drm/i915: Reset glk degamma index after > programming/readout > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Just for some extra consistency let's reset the glk degamma LUT index back to 0 > after we're dong trawling the LUT. We do set this to 0 in the beginning, but I think good to leave in a clean state. Reviewed-by: Uma Shankar <uma.shankar@intel.com> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_color.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_color.c > b/drivers/gpu/drm/i915/display/intel_color.c > index 77c103a86a30..37a4fede7bc0 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.c > +++ b/drivers/gpu/drm/i915/display/intel_color.c > @@ -818,12 +818,14 @@ static void glk_load_degamma_lut(const struct > intel_crtc_state *crtc_state) > * as compared to just 16 to achieve this. > */ > intel_de_write(dev_priv, PRE_CSC_GAMC_DATA(pipe), > - lut[i].green); > + lut[i].green); > } > > /* Clamp values > 1.0. */ > while (i++ < 35) > intel_de_write(dev_priv, PRE_CSC_GAMC_DATA(pipe), 1 << 16); > + > + intel_de_write(dev_priv, PRE_CSC_GAMC_INDEX(pipe), 0); > } > > static void glk_load_degamma_lut_linear(const struct intel_crtc_state > *crtc_state) @@ -851,6 +853,8 @@ static void > glk_load_degamma_lut_linear(const struct intel_crtc_state *crtc_stat > /* Clamp values > 1.0. */ > while (i++ < 35) > intel_de_write(dev_priv, PRE_CSC_GAMC_DATA(pipe), 1 << 16); > + > + intel_de_write(dev_priv, PRE_CSC_GAMC_INDEX(pipe), 0); > } > > static void glk_load_luts(const struct intel_crtc_state *crtc_state) > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-7-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 06/20] drm/i915: Shuffle chv_cgm_gamma_pack() around a bit [not found] ` <20200717211345.26851-7-ville.syrjala@linux.intel.com> @ 2020-09-17 19:42 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 19:42 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:44 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 06/20] drm/i915: Shuffle chv_cgm_gamma_pack() > around a bit > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Move chv_cgm_gamma_pack() next to the other CGM gamma functions. > Right now it's stuck in the middle of the CGM degamma functions. Reviewed-by: Uma Shankar <uma.shankar@intel.com> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_color.c | 14 +++++++------- > 1 file changed, 7 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_color.c > b/drivers/gpu/drm/i915/display/intel_color.c > index 37a4fede7bc0..260bbbd5bbf2 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.c > +++ b/drivers/gpu/drm/i915/display/intel_color.c > @@ -1030,13 +1030,6 @@ static u32 chv_cgm_degamma_udw(const struct > drm_color_lut *color) > return drm_color_lut_extract(color->red, 14); } > > -static void chv_cgm_gamma_pack(struct drm_color_lut *entry, u32 ldw, u32 > udw) -{ > - entry->green = > intel_color_lut_pack(REG_FIELD_GET(CGM_PIPE_GAMMA_GREEN_MASK, ldw), > 10); > - entry->blue = > intel_color_lut_pack(REG_FIELD_GET(CGM_PIPE_GAMMA_BLUE_MASK, ldw), 10); > - entry->red = > intel_color_lut_pack(REG_FIELD_GET(CGM_PIPE_GAMMA_RED_MASK, udw), 10); > -} > - > static void chv_load_cgm_degamma(struct intel_crtc *crtc, > const struct drm_property_blob *blob) { @@ - > 1064,6 +1057,13 @@ static u32 chv_cgm_gamma_udw(const struct > drm_color_lut *color) > return drm_color_lut_extract(color->red, 10); } > > +static void chv_cgm_gamma_pack(struct drm_color_lut *entry, u32 ldw, > +u32 udw) { > + entry->green = > intel_color_lut_pack(REG_FIELD_GET(CGM_PIPE_GAMMA_GREEN_MASK, ldw), > 10); > + entry->blue = > intel_color_lut_pack(REG_FIELD_GET(CGM_PIPE_GAMMA_BLUE_MASK, ldw), 10); > + entry->red = > +intel_color_lut_pack(REG_FIELD_GET(CGM_PIPE_GAMMA_RED_MASK, udw), > 10); > +} > + > static void chv_load_cgm_gamma(struct intel_crtc *crtc, > const struct drm_property_blob *blob) { > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-8-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 07/20] drm/i915: Relocate CHV CGM gamma masks [not found] ` <20200717211345.26851-8-ville.syrjala@linux.intel.com> @ 2020-09-17 19:46 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 19:46 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:44 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 07/20] drm/i915: Relocate CHV CGM gamma masks > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > CGM_PIPE_GAMMA_RED_MASK & co. are misplaced. Move then below the > relevant register. And while at it add the degamma counterparts. Reviewed-by: Uma Shankar <uma.shankar@intel.com> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/i915_reg.h | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h > index b9607ac3620d..428ef06b8084 100644 > --- a/drivers/gpu/drm/i915/i915_reg.h > +++ b/drivers/gpu/drm/i915/i915_reg.h > @@ -10999,14 +10999,17 @@ enum skl_power_gate { > #define _CGM_PIPE_A_CSC_COEFF67 (VLV_DISPLAY_BASE + 0x6790C) > #define _CGM_PIPE_A_CSC_COEFF8 (VLV_DISPLAY_BASE + 0x67910) > #define _CGM_PIPE_A_DEGAMMA (VLV_DISPLAY_BASE + 0x66000) > +#define CGM_PIPE_DEGAMMA_RED_MASK REG_GENMASK(13, 0) > +#define CGM_PIPE_DEGAMMA_GREEN_MASK REG_GENMASK(29, 16) > +#define CGM_PIPE_DEGAMMA_BLUE_MASK REG_GENMASK(13, 0) > #define _CGM_PIPE_A_GAMMA (VLV_DISPLAY_BASE + 0x67000) > +#define CGM_PIPE_GAMMA_RED_MASK REG_GENMASK(9, 0) > +#define CGM_PIPE_GAMMA_GREEN_MASK REG_GENMASK(25, 16) > +#define CGM_PIPE_GAMMA_BLUE_MASK REG_GENMASK(9, 0) > #define _CGM_PIPE_A_MODE (VLV_DISPLAY_BASE + 0x67A00) > #define CGM_PIPE_MODE_GAMMA (1 << 2) > #define CGM_PIPE_MODE_CSC (1 << 1) > #define CGM_PIPE_MODE_DEGAMMA (1 << 0) > -#define CGM_PIPE_GAMMA_RED_MASK REG_GENMASK(9, 0) > -#define CGM_PIPE_GAMMA_GREEN_MASK REG_GENMASK(25, 16) > -#define CGM_PIPE_GAMMA_BLUE_MASK REG_GENMASK(9, 0) > > #define _CGM_PIPE_B_CSC_COEFF01 (VLV_DISPLAY_BASE + 0x69900) > #define _CGM_PIPE_B_CSC_COEFF23 (VLV_DISPLAY_BASE + 0x69904) > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-9-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 08/20] drm/i915: Add glk+ degamma readout [not found] ` <20200717211345.26851-9-ville.syrjala@linux.intel.com> @ 2020-09-17 19:58 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 19:58 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:44 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 08/20] drm/i915: Add glk+ degamma readout > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Read out the degamma LUT on glk+. No state cheker as of yet since it requires > dealing with he glk csc vs. degamma mess. s/he/the With this, Reviewed-by: Uma Shankar <uma.shankar@intel.com> > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_color.c | 44 ++++++++++++++++++++++ > 1 file changed, 44 insertions(+) > > diff --git a/drivers/gpu/drm/i915/display/intel_color.c > b/drivers/gpu/drm/i915/display/intel_color.c > index 260bbbd5bbf2..437cc56925ab 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.c > +++ b/drivers/gpu/drm/i915/display/intel_color.c > @@ -1955,10 +1955,51 @@ static struct drm_property_blob > *bdw_read_lut_10(struct intel_crtc *crtc, > return blob; > } > > +static struct drm_property_blob *glk_read_degamma_lut(struct intel_crtc > +*crtc) { > + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); > + int i, lut_size = INTEL_INFO(dev_priv)->color.degamma_lut_size; > + enum pipe pipe = crtc->pipe; > + struct drm_property_blob *blob; > + struct drm_color_lut *lut; > + > + blob = drm_property_create_blob(&dev_priv->drm, > + sizeof(struct drm_color_lut) * lut_size, > + NULL); > + if (IS_ERR(blob)) > + return NULL; > + > + lut = blob->data; > + > + /* > + * When setting the auto-increment bit, the hardware seems to > + * ignore the index bits, so we need to reset it to index 0 > + * separately. > + */ > + intel_de_write(dev_priv, PRE_CSC_GAMC_INDEX(pipe), 0); > + intel_de_write(dev_priv, PRE_CSC_GAMC_INDEX(pipe), > + PRE_CSC_GAMC_AUTO_INCREMENT); > + > + for (i = 0; i < lut_size; i++) { > + u32 val = intel_de_read(dev_priv, PRE_CSC_GAMC_DATA(pipe)); > + > + lut[i].red = val; > + lut[i].green = val; > + lut[i].blue = val; > + } > + > + intel_de_write(dev_priv, PRE_CSC_GAMC_INDEX(pipe), 0); > + > + return blob; > +} > + > static void glk_read_luts(struct intel_crtc_state *crtc_state) { > struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); > > + if (crtc_state->csc_enable) > + crtc_state->hw.degamma_lut = glk_read_degamma_lut(crtc); > + > if (!crtc_state->gamma_enable) > return; > > @@ -2010,6 +2051,9 @@ static void icl_read_luts(struct intel_crtc_state > *crtc_state) { > struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); > > + if (crtc_state->gamma_mode & PRE_CSC_GAMMA_ENABLE) > + crtc_state->hw.degamma_lut = glk_read_degamma_lut(crtc); > + > if ((crtc_state->gamma_mode & POST_CSC_GAMMA_ENABLE) == 0) > return; > > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-10-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 09/20] drm/i915: Read out CHV CGM degamma [not found] ` <20200717211345.26851-10-ville.syrjala@linux.intel.com> @ 2020-09-17 20:06 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 20:06 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:44 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 09/20] drm/i915: Read out CHV CGM degamma > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Since CHV has the dedicate CGM degamma unit readout is trivial. > Just do it. Reviewed-by: Uma Shankar <uma.shankar@intel.com> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_color.c | 36 ++++++++++++++++++++++ > 1 file changed, 36 insertions(+) > > diff --git a/drivers/gpu/drm/i915/display/intel_color.c > b/drivers/gpu/drm/i915/display/intel_color.c > index 437cc56925ab..6842f5c0356d 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.c > +++ b/drivers/gpu/drm/i915/display/intel_color.c > @@ -1030,6 +1030,13 @@ static u32 chv_cgm_degamma_udw(const struct > drm_color_lut *color) > return drm_color_lut_extract(color->red, 14); } > > +static void chv_cgm_degamma_pack(struct drm_color_lut *entry, u32 ldw, > +u32 udw) { > + entry->green = > intel_color_lut_pack(REG_FIELD_GET(CGM_PIPE_DEGAMMA_GREEN_MASK, ldw), > 14); > + entry->blue = > intel_color_lut_pack(REG_FIELD_GET(CGM_PIPE_DEGAMMA_BLUE_MASK, ldw), > 14); > + entry->red = > +intel_color_lut_pack(REG_FIELD_GET(CGM_PIPE_DEGAMMA_RED_MASK, udw), > +14); } > + > static void chv_load_cgm_degamma(struct intel_crtc *crtc, > const struct drm_property_blob *blob) { @@ - > 1821,6 +1828,32 @@ static void i965_read_luts(struct intel_crtc_state > *crtc_state) > crtc_state->hw.gamma_lut = i965_read_lut_10p6(crtc); } > > +static struct drm_property_blob *chv_read_cgm_degamma(struct intel_crtc > +*crtc) { > + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); > + int i, lut_size = INTEL_INFO(dev_priv)->color.degamma_lut_size; > + enum pipe pipe = crtc->pipe; > + struct drm_property_blob *blob; > + struct drm_color_lut *lut; > + > + blob = drm_property_create_blob(&dev_priv->drm, > + sizeof(struct drm_color_lut) * lut_size, > + NULL); > + if (IS_ERR(blob)) > + return NULL; > + > + lut = blob->data; > + > + for (i = 0; i < lut_size; i++) { > + u32 ldw = intel_de_read(dev_priv, CGM_PIPE_DEGAMMA(pipe, i, > 0)); > + u32 udw = intel_de_read(dev_priv, CGM_PIPE_DEGAMMA(pipe, i, > 1)); > + > + chv_cgm_degamma_pack(&lut[i], ldw, udw); > + } > + > + return blob; > +} > + > static struct drm_property_blob *chv_read_cgm_gamma(struct intel_crtc *crtc) > { > struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); @@ -1851,6 > +1884,9 @@ 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_DEGAMMA) > + crtc_state->hw.degamma_lut = chv_read_cgm_degamma(crtc); > + > if (crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA) > crtc_state->hw.gamma_lut = chv_read_cgm_gamma(crtc); > else > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-11-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 10/20] drm/i915: Add gamma/degamma readout for bdw+ [not found] ` <20200717211345.26851-11-ville.syrjala@linux.intel.com> @ 2020-09-17 20:15 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 20:15 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:44 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 10/20] drm/i915: Add gamma/degamma readout for > bdw+ > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Read out the gamme/degamma LUT on bdw+. Not entirely complete as we need s/gamme/gamma With this, Reviewed-by: Uma Shankar <uma.shankar@intel.com> > a bit more special sauce to handle the split gamma mode. > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_color.c | 27 ++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > > diff --git a/drivers/gpu/drm/i915/display/intel_color.c > b/drivers/gpu/drm/i915/display/intel_color.c > index 6842f5c0356d..5742ac1af862 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.c > +++ b/drivers/gpu/drm/i915/display/intel_color.c > @@ -1991,6 +1991,32 @@ static struct drm_property_blob > *bdw_read_lut_10(struct intel_crtc *crtc, > return blob; > } > > +static void bdw_read_luts(struct intel_crtc_state *crtc_state) { > + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); > + struct drm_property_blob **blob = > + crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA ? > + &crtc_state->hw.gamma_lut : &crtc_state->hw.degamma_lut; > + > + if (!crtc_state->gamma_enable) > + return; > + > + switch (crtc_state->gamma_mode) { > + case GAMMA_MODE_MODE_8BIT: > + *blob = ilk_read_lut_8(crtc); > + break; > + case GAMMA_MODE_MODE_SPLIT: > + /* FIXME */ > + break; > + case GAMMA_MODE_MODE_10BIT: > + *blob = bdw_read_lut_10(crtc, PAL_PREC_INDEX_VALUE(0)); > + break; > + default: > + MISSING_CASE(crtc_state->gamma_mode); > + break; > + } > +} > + > static struct drm_property_blob *glk_read_degamma_lut(struct intel_crtc *crtc) > { > struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); @@ -2154,6 > +2180,7 @@ void intel_color_init(struct intel_crtc *crtc) > dev_priv->display.read_luts = glk_read_luts; > } else if (INTEL_GEN(dev_priv) >= 8) { > dev_priv->display.load_luts = bdw_load_luts; > + dev_priv->display.read_luts = bdw_read_luts; > } else if (INTEL_GEN(dev_priv) >= 7) { > dev_priv->display.load_luts = ivb_load_luts; > } else { > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-12-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 11/20] drm/i915: Do degamma+gamma readout in bdw+ split gamma mode [not found] ` <20200717211345.26851-12-ville.syrjala@linux.intel.com> @ 2020-09-17 20:40 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 20:40 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:44 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 11/20] drm/i915: Do degamma+gamma readout in > bdw+ split gamma mode > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Read out both gamma and degamma when usng the split gamma mode on s/usng/using With this, Reviewed-by: Uma Shankar <uma.shankar@intel.com> > bdw+. We can't use the auto increment mode to iterate the LUTs since we want > to read out less entries than what we stuff into the software LUT. > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_color.c | 52 +++++++++++++++++++++- > 1 file changed, 51 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_color.c > b/drivers/gpu/drm/i915/display/intel_color.c > index 5742ac1af862..f34257922e4d 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.c > +++ b/drivers/gpu/drm/i915/display/intel_color.c > @@ -1959,6 +1959,46 @@ static void ilk_read_luts(struct intel_crtc_state > *crtc_state) > crtc_state->hw.gamma_lut = ilk_read_lut_10(crtc); } > > +/* > + * IVB/HSW Bspec / PAL_PREC_INDEX: > + * "Restriction : Index auto increment mode is not > + * supported and must not be enabled." > + */ > +static struct drm_property_blob *ivb_read_lut_10(struct intel_crtc *crtc, > + u32 prec_index) > +{ > + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); > + int i, hw_lut_size = ivb_lut_10_size(prec_index); > + int lut_size = INTEL_INFO(dev_priv)->color.gamma_lut_size; > + enum pipe pipe = crtc->pipe; > + struct drm_property_blob *blob; > + struct drm_color_lut *lut;/ > + > + blob = drm_property_create_blob(&dev_priv->drm, > + sizeof(struct drm_color_lut) * lut_size, > + NULL); > + if (IS_ERR(blob)) > + return NULL; > + > + lut = blob->data; > + > + for (i = 0; i < lut_size; i++) { > + /* We discard half the user entries in split gamma mode */ > + int index = DIV_ROUND_UP(i * (hw_lut_size - 1), lut_size - 1); > + u32 val; > + > + intel_de_write(dev_priv, PREC_PAL_INDEX(pipe), > + prec_index + index); > + val = intel_de_read(dev_priv, PREC_PAL_DATA(pipe)); > + > + ilk_lut_10_pack(&lut[i], val); > + } > + > + intel_de_write(dev_priv, PREC_PAL_INDEX(pipe), 0); > + > + return blob; > +} > + > /* On BDW+ the index auto increment mode actually works */ static struct > drm_property_blob *bdw_read_lut_10(struct intel_crtc *crtc, > u32 prec_index) > @@ -2006,7 +2046,17 @@ static void bdw_read_luts(struct intel_crtc_state > *crtc_state) > *blob = ilk_read_lut_8(crtc); > break; > case GAMMA_MODE_MODE_SPLIT: > - /* FIXME */ > + /* > + * Can't use bdw_read_lut_10() with its auto-increment > + * mode here since we want to generate 1024 entry > + * software LUTs from the 512 entry hardware LUTs. > + */ > + crtc_state->hw.degamma_lut = > + ivb_read_lut_10(crtc, PAL_PREC_SPLIT_MODE | > + PAL_PREC_INDEX_VALUE(0)); > + crtc_state->hw.gamma_lut = > + ivb_read_lut_10(crtc, PAL_PREC_SPLIT_MODE | > + PAL_PREC_INDEX_VALUE(512)); > break; > case GAMMA_MODE_MODE_10BIT: > *blob = bdw_read_lut_10(crtc, PAL_PREC_INDEX_VALUE(0)); > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-13-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 12/20] drm/i915: Polish bdw_read_lut_10() a bit [not found] ` <20200717211345.26851-13-ville.syrjala@linux.intel.com> @ 2020-09-17 20:43 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 20:43 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:44 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 12/20] drm/i915: Polish bdw_read_lut_10() a bit > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Since bdw_read_lut_10() uses the auto-increment mode we must have an equal > number of entries in the software LUT and the hardware LUT. WARN if that is > not the case. Reviewed-by: Uma Shankar <uma.shankar@intel.com> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_color.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_color.c > b/drivers/gpu/drm/i915/display/intel_color.c > index f34257922e4d..9f01fb316efa 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.c > +++ b/drivers/gpu/drm/i915/display/intel_color.c > @@ -2005,12 +2005,15 @@ static struct drm_property_blob > *bdw_read_lut_10(struct intel_crtc *crtc, { > struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); > int i, hw_lut_size = ivb_lut_10_size(prec_index); > + int lut_size = INTEL_INFO(dev_priv)->color.gamma_lut_size; > enum pipe pipe = crtc->pipe; > struct drm_property_blob *blob; > struct drm_color_lut *lut; > > + drm_WARN_ON(&dev_priv->drm, lut_size != hw_lut_size); > + > blob = drm_property_create_blob(&dev_priv->drm, > - sizeof(struct drm_color_lut) * > hw_lut_size, > + sizeof(struct drm_color_lut) * lut_size, > NULL); > if (IS_ERR(blob)) > return NULL; > @@ -2020,7 +2023,7 @@ static struct drm_property_blob > *bdw_read_lut_10(struct intel_crtc *crtc, > intel_de_write(dev_priv, PREC_PAL_INDEX(pipe), > prec_index | PAL_PREC_AUTO_INCREMENT); > > - for (i = 0; i < hw_lut_size; i++) { > + for (i = 0; i < lut_size; i++) { > u32 val = intel_de_read(dev_priv, PREC_PAL_DATA(pipe)); > > ilk_lut_10_pack(&lut[i], val); > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-14-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 13/20] drm/i915: Add gamma/degamm readout for ivb/hsw [not found] ` <20200717211345.26851-14-ville.syrjala@linux.intel.com> @ 2020-09-17 20:46 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 20:46 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:44 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 13/20] drm/i915: Add gamma/degamm readout for Typo in degamma. With this fixed, Reviewed-by: Uma Shankar <uma.shankar@intel.com> > ivb/hsw > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > We now have all the code necessary for gamma/degamma readout on ivb/hsw. > Plug it all in. > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_color.c | 32 ++++++++++++++++++++++ > 1 file changed, 32 insertions(+) > > diff --git a/drivers/gpu/drm/i915/display/intel_color.c > b/drivers/gpu/drm/i915/display/intel_color.c > index 9f01fb316efa..886f3f0d873a 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.c > +++ b/drivers/gpu/drm/i915/display/intel_color.c > @@ -1999,6 +1999,37 @@ static struct drm_property_blob > *ivb_read_lut_10(struct intel_crtc *crtc, > return blob; > } > > +static void ivb_read_luts(struct intel_crtc_state *crtc_state) { > + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); > + struct drm_property_blob **blob = > + crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA ? > + &crtc_state->hw.gamma_lut : &crtc_state->hw.degamma_lut; > + > + if (!crtc_state->gamma_enable) > + return; > + > + switch (crtc_state->gamma_mode) { > + case GAMMA_MODE_MODE_8BIT: > + *blob = ilk_read_lut_8(crtc); > + break; > + case GAMMA_MODE_MODE_SPLIT: > + crtc_state->hw.degamma_lut = > + ivb_read_lut_10(crtc, PAL_PREC_SPLIT_MODE | > + PAL_PREC_INDEX_VALUE(0)); > + crtc_state->hw.gamma_lut = > + ivb_read_lut_10(crtc, PAL_PREC_SPLIT_MODE | > + PAL_PREC_INDEX_VALUE(512)); > + break; > + case GAMMA_MODE_MODE_10BIT: > + *blob = ivb_read_lut_10(crtc, PAL_PREC_INDEX_VALUE(0)); > + break; > + default: > + MISSING_CASE(crtc_state->gamma_mode); > + break; > + } > +} > + > /* On BDW+ the index auto increment mode actually works */ static struct > drm_property_blob *bdw_read_lut_10(struct intel_crtc *crtc, > u32 prec_index) > @@ -2236,6 +2267,7 @@ void intel_color_init(struct intel_crtc *crtc) > dev_priv->display.read_luts = bdw_read_luts; > } else if (INTEL_GEN(dev_priv) >= 7) { > dev_priv->display.load_luts = ivb_load_luts; > + dev_priv->display.read_luts = ivb_read_luts; > } else { > dev_priv->display.load_luts = ilk_load_luts; > dev_priv->display.read_luts = ilk_read_luts; > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-15-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 14/20] drm/i915: Replace some gamma_mode ifs with switches [not found] ` <20200717211345.26851-15-ville.syrjala@linux.intel.com> @ 2020-09-17 20:52 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 20:52 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:44 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 14/20] drm/i915: Replace some gamma_mode ifs with > switches > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Since gamma_mode can have more than two values on ilk+ let's use switch > statemnts when interpreting them. Nit: Typo in statements With this fixed, Reviewed-by: Uma Shankar <uma.shankar@intel.com> > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_color.c | 93 ++++++++++++++++------ > 1 file changed, 70 insertions(+), 23 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_color.c > b/drivers/gpu/drm/i915/display/intel_color.c > index 886f3f0d873a..d5ce58c3bc11 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.c > +++ b/drivers/gpu/drm/i915/display/intel_color.c > @@ -638,10 +638,17 @@ 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; > > - if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) > + switch (crtc_state->gamma_mode) { > + case GAMMA_MODE_MODE_8BIT: > ilk_load_lut_8(crtc, gamma_lut); > - else > + break; > + case GAMMA_MODE_MODE_10BIT: > ilk_load_lut_10(crtc, gamma_lut); > + break; > + default: > + MISSING_CASE(crtc_state->gamma_mode); > + break; > + } > } > > static int ivb_lut_10_size(u32 prec_index) @@ -745,21 +752,27 @@ 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; > > - if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) { > - ilk_load_lut_8(crtc, gamma_lut); > - } else if (crtc_state->gamma_mode == GAMMA_MODE_MODE_SPLIT) { > + 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 | > PAL_PREC_INDEX_VALUE(0)); > ivb_load_lut_ext_max(crtc_state); > ivb_load_lut_10(crtc, gamma_lut, PAL_PREC_SPLIT_MODE | > PAL_PREC_INDEX_VALUE(512)); > - } else { > - const struct drm_property_blob *blob = gamma_lut ?: > degamma_lut; > - > + break; > + case GAMMA_MODE_MODE_10BIT: > ivb_load_lut_10(crtc, blob, > PAL_PREC_INDEX_VALUE(0)); > ivb_load_lut_ext_max(crtc_state); > + break; > + default: > + MISSING_CASE(crtc_state->gamma_mode); > + break; > } > } > > @@ -768,21 +781,27 @@ 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; > > - if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) { > - ilk_load_lut_8(crtc, gamma_lut); > - } else if (crtc_state->gamma_mode == GAMMA_MODE_MODE_SPLIT) { > + 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 | > PAL_PREC_INDEX_VALUE(0)); > ivb_load_lut_ext_max(crtc_state); > bdw_load_lut_10(crtc, gamma_lut, PAL_PREC_SPLIT_MODE | > PAL_PREC_INDEX_VALUE(512)); > - } else { > - const struct drm_property_blob *blob = gamma_lut ?: > degamma_lut; > - > + break; > + case GAMMA_MODE_MODE_10BIT: > bdw_load_lut_10(crtc, blob, > PAL_PREC_INDEX_VALUE(0)); > ivb_load_lut_ext_max(crtc_state); > + break; > + default: > + MISSING_CASE(crtc_state->gamma_mode); > + break; > } > } > > @@ -875,11 +894,17 @@ static void glk_load_luts(const struct intel_crtc_state > *crtc_state) > else > glk_load_degamma_lut_linear(crtc_state); > > - if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) { > + switch (crtc_state->gamma_mode) { > + case GAMMA_MODE_MODE_8BIT: > ilk_load_lut_8(crtc, gamma_lut); > - } else { > + break; > + case GAMMA_MODE_MODE_10BIT: > bdw_load_lut_10(crtc, gamma_lut, PAL_PREC_INDEX_VALUE(0)); > ivb_load_lut_ext_max(crtc_state); > + break; > + default: > + MISSING_CASE(crtc_state->gamma_mode); > + break; > } > } > > @@ -1011,9 +1036,13 @@ static void icl_load_luts(const struct intel_crtc_state > *crtc_state) > icl_program_gamma_superfine_segment(crtc_state); > icl_program_gamma_multi_segment(crtc_state); > break; > - default: > + case GAMMA_MODE_MODE_10BIT: > bdw_load_lut_10(crtc, gamma_lut, PAL_PREC_INDEX_VALUE(0)); > ivb_load_lut_ext_max(crtc_state); > + break; > + default: > + MISSING_CASE(crtc_state->gamma_mode); > + break; > } > > intel_dsb_commit(crtc_state); > @@ -1744,7 +1773,7 @@ bool intel_color_lut_equal(struct drm_property_blob > *blob1, > break; > default: > MISSING_CASE(gamma_mode); > - return false; > + return false; > } > > return true; > @@ -1953,10 +1982,17 @@ static void ilk_read_luts(struct intel_crtc_state > *crtc_state) > if ((crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA) == 0) > return; > > - if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) > + switch (crtc_state->gamma_mode) { > + case GAMMA_MODE_MODE_8BIT: > crtc_state->hw.gamma_lut = ilk_read_lut_8(crtc); > - else > + break; > + case GAMMA_MODE_MODE_10BIT: > crtc_state->hw.gamma_lut = ilk_read_lut_10(crtc); > + break; > + default: > + MISSING_CASE(crtc_state->gamma_mode); > + break; > + } > } > > /* > @@ -2149,10 +2185,17 @@ 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) > + switch (crtc_state->gamma_mode) { > + case GAMMA_MODE_MODE_8BIT: > crtc_state->hw.gamma_lut = ilk_read_lut_8(crtc); > - else > + break; > + case GAMMA_MODE_MODE_10BIT: > crtc_state->hw.gamma_lut = bdw_read_lut_10(crtc, > PAL_PREC_INDEX_VALUE(0)); > + break; > + default: > + MISSING_CASE(crtc_state->gamma_mode); > + break; > + } > } > > static struct drm_property_blob * > @@ -2207,11 +2250,15 @@ static void icl_read_luts(struct intel_crtc_state > *crtc_state) > case GAMMA_MODE_MODE_8BIT: > crtc_state->hw.gamma_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)); > + break; > case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED: > crtc_state->hw.gamma_lut = icl_read_lut_multi_segment(crtc); > break; > default: > - crtc_state->hw.gamma_lut = bdw_read_lut_10(crtc, > PAL_PREC_INDEX_VALUE(0)); > + MISSING_CASE(crtc_state->gamma_mode); > + break; > } > } > > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-16-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 15/20] drm/i915: Make ilk_load_luts() deal with degamma [not found] ` <20200717211345.26851-16-ville.syrjala@linux.intel.com> @ 2020-09-17 20:56 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 20:56 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:44 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 15/20] drm/i915: Make ilk_load_luts() deal with > degamma > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Make ilk_load_luts() ready for a degamma lut. Currently we never have one, but > soon we may get one from readout, and I think we may want to change the state > computation such that we may end up with one even when userspace has simply > supplied a gamma lut. > > At least the code now follows the path laid out by the ivb/bdw counterpars. Sounds good. Reviewed-by: Uma Shankar <uma.shankar@intel.com> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_color.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_color.c > b/drivers/gpu/drm/i915/display/intel_color.c > index d5ce58c3bc11..12a41fb4a98c 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.c > +++ b/drivers/gpu/drm/i915/display/intel_color.c > @@ -637,13 +637,15 @@ 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; > > switch (crtc_state->gamma_mode) { > case GAMMA_MODE_MODE_8BIT: > - ilk_load_lut_8(crtc, gamma_lut); > + ilk_load_lut_8(crtc, blob); > break; > case GAMMA_MODE_MODE_10BIT: > - ilk_load_lut_10(crtc, gamma_lut); > + ilk_load_lut_10(crtc, blob); > break; > default: > MISSING_CASE(crtc_state->gamma_mode); > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-17-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 16/20] drm/i915: Make ilk_read_luts() capable of degamma readout [not found] ` <20200717211345.26851-17-ville.syrjala@linux.intel.com> @ 2020-09-17 20:58 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 20:58 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:44 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 16/20] drm/i915: Make ilk_read_luts() capable of > degamma readout > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Just like ivb+, ilk/snb can select whether the hw lut acts as gamma or degamma. > Make the readout cognizant of that fact. Reviewed-by: Uma Shankar <uma.shankar@intel.com> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_color.c | 10 +++++----- > 1 file changed, 5 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_color.c > b/drivers/gpu/drm/i915/display/intel_color.c > index 12a41fb4a98c..7f9e26419b56 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.c > +++ b/drivers/gpu/drm/i915/display/intel_color.c > @@ -1977,19 +1977,19 @@ static struct drm_property_blob > *ilk_read_lut_10(struct intel_crtc *crtc) static void ilk_read_luts(struct > intel_crtc_state *crtc_state) { > struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); > + struct drm_property_blob **blob = > + crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA ? > + &crtc_state->hw.gamma_lut : &crtc_state->hw.degamma_lut; > > if (!crtc_state->gamma_enable) > return; > > - if ((crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA) == 0) > - return; > - > switch (crtc_state->gamma_mode) { > case GAMMA_MODE_MODE_8BIT: > - crtc_state->hw.gamma_lut = ilk_read_lut_8(crtc); > + *blob = ilk_read_lut_8(crtc); > break; > case GAMMA_MODE_MODE_10BIT: > - crtc_state->hw.gamma_lut = ilk_read_lut_10(crtc); > + *blob = ilk_read_lut_10(crtc); > break; > default: > MISSING_CASE(crtc_state->gamma_mode); > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-18-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 17/20] drm/i915: Make .read_luts() mandatory [not found] ` <20200717211345.26851-18-ville.syrjala@linux.intel.com> @ 2020-09-17 21:00 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 21:00 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:44 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 17/20] drm/i915: Make .read_luts() mandatory > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Every platform now implemnts .read_luts(). Make it not optional. Nit: Typo in implements. With this, Reviewed-by: Uma Shankar <uma.shankar@intel.com> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_color.c | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_color.c > b/drivers/gpu/drm/i915/display/intel_color.c > index 7f9e26419b56..acf3d152edfe 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.c > +++ b/drivers/gpu/drm/i915/display/intel_color.c > @@ -1215,8 +1215,7 @@ void intel_color_get_config(struct intel_crtc_state > *crtc_state) { > struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); > > - if (dev_priv->display.read_luts) > - dev_priv->display.read_luts(crtc_state); > + dev_priv->display.read_luts(crtc_state); > } > > static bool need_plane_update(struct intel_plane *plane, > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-19-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 18/20] drm/i915: Extract ilk_crtc_has_gamma() & co. [not found] ` <20200717211345.26851-19-ville.syrjala@linux.intel.com> @ 2020-09-17 21:03 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 21:03 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:44 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 18/20] drm/i915: Extract ilk_crtc_has_gamma() & co. > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Extract a few helpers to check whether the hw degamma or gamma LUT is > enabled. Reviewed-by: Uma Shankar <uma.shankar@intel.com> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_color.c | 27 ++++++++++++++++------ > 1 file changed, 20 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_color.c > b/drivers/gpu/drm/i915/display/intel_color.c > index acf3d152edfe..f714c87d8e42 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.c > +++ b/drivers/gpu/drm/i915/display/intel_color.c > @@ -1628,12 +1628,15 @@ static int i9xx_gamma_precision(const struct > intel_crtc_state *crtc_state) > } > } > > +static bool ilk_crtc_has_gamma(const struct intel_crtc_state > +*crtc_state) { > + return crtc_state->gamma_enable && > + (crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA) != 0; } > + > static int ilk_gamma_precision(const struct intel_crtc_state *crtc_state) { > - if (!crtc_state->gamma_enable) > - return 0; > - > - if ((crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA) == 0) > + if (!ilk_crtc_has_gamma(crtc_state)) > return 0; > > switch (crtc_state->gamma_mode) { > @@ -1671,9 +1674,19 @@ static int glk_gamma_precision(const struct > intel_crtc_state *crtc_state) > } > } > > +static bool icl_crtc_has_degamma(const struct intel_crtc_state > +*crtc_state) { > + return crtc_state->gamma_mode & PRE_CSC_GAMMA_ENABLE; } > + > +static bool icl_crtc_has_gamma(const struct intel_crtc_state > +*crtc_state) { > + return crtc_state->gamma_mode & POST_CSC_GAMMA_ENABLE; } > + > static int icl_gamma_precision(const struct intel_crtc_state *crtc_state) { > - if ((crtc_state->gamma_mode & POST_CSC_GAMMA_ENABLE) == 0) > + if (!icl_crtc_has_gamma(crtc_state)) > return 0; > > switch (crtc_state->gamma_mode & GAMMA_MODE_MODE_MASK) { > @@ -2241,10 +2254,10 @@ static void icl_read_luts(struct intel_crtc_state > *crtc_state) { > struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); > > - if (crtc_state->gamma_mode & PRE_CSC_GAMMA_ENABLE) > + if (icl_crtc_has_degamma(crtc_state)) > crtc_state->hw.degamma_lut = glk_read_degamma_lut(crtc); > > - if ((crtc_state->gamma_mode & POST_CSC_GAMMA_ENABLE) == 0) > + if (!icl_crtc_has_gamma(crtc_state)) > return; > > switch (crtc_state->gamma_mode & GAMMA_MODE_MODE_MASK) { > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-20-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 19/20] drm/i915: Complete the gamma/degamma state checking [not found] ` <20200717211345.26851-20-ville.syrjala@linux.intel.com> @ 2020-09-17 21:52 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-17 21:52 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:44 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 19/20] drm/i915: Complete the gamma/degamma > state checking > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Add new .gamma_equal() and .degamma_equal() vfuncs to be used by the state > checker to verify the gamma/degamma LUTs. We need somewhat custom > behaviour for some platforms due to sometimes swapping the roles of the > gamma and degamma LUTs (due to RGB limited color range or YCbCr output CSC > usage). Also glk has a special relationship between the CSC enable bit and the > degamma LUT so it also needs customized behaviour. > > We could pontially compute the state in a better way to make these state check > hacks unnecessary, but that's going to require some actual thought so we'll leave > it for the future. Like the idea of how the anomalies of various platforms are balanced. Reviewed-by: Uma Shankar <uma.shankar@intel.com> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_color.c | 435 +++++++++++++++---- > drivers/gpu/drm/i915/display/intel_color.h | 10 +- > drivers/gpu/drm/i915/display/intel_display.c | 25 +- > drivers/gpu/drm/i915/i915_drv.h | 7 + > 4 files changed, 378 insertions(+), 99 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_color.c > b/drivers/gpu/drm/i915/display/intel_color.c > index f714c87d8e42..ca6c6679368c 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.c > +++ b/drivers/gpu/drm/i915/display/intel_color.c > @@ -1628,26 +1628,71 @@ static int i9xx_gamma_precision(const struct > intel_crtc_state *crtc_state) > } > } > > +static bool ilk_crtc_has_degamma(const struct intel_crtc_state > +*crtc_state) { > + return crtc_state->gamma_enable && > + (crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA) == 0; } > + > static bool ilk_crtc_has_gamma(const struct intel_crtc_state *crtc_state) { > return crtc_state->gamma_enable && > (crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA) != 0; } > > +static int ilk_lut_precision(const struct intel_crtc_state *crtc_state) > +{ > + switch (crtc_state->gamma_mode) { > + case GAMMA_MODE_MODE_8BIT: > + return 8; > + case GAMMA_MODE_MODE_10BIT: > + return 10; > + default: > + MISSING_CASE(crtc_state->gamma_mode); > + return 0; > + } > +} > + > +static int ilk_degamma_precision(const struct intel_crtc_state > +*crtc_state) { > + if (ilk_crtc_has_degamma(crtc_state)) > + return ilk_lut_precision(crtc_state); > + else > + return 0; > +} > + > static int ilk_gamma_precision(const struct intel_crtc_state *crtc_state) { > - if (!ilk_crtc_has_gamma(crtc_state)) > + if (ilk_crtc_has_gamma(crtc_state)) > + return ilk_lut_precision(crtc_state); > + else > return 0; > +} > > - switch (crtc_state->gamma_mode) { > - case GAMMA_MODE_MODE_8BIT: > - return 8; > - case GAMMA_MODE_MODE_10BIT: > +static int ivb_degamma_precision(const struct intel_crtc_state > +*crtc_state) { > + if (crtc_state->gamma_enable && > + crtc_state->gamma_mode == GAMMA_MODE_MODE_SPLIT) > return 10; > - default: > - MISSING_CASE(crtc_state->gamma_mode); > + else > + return ilk_degamma_precision(crtc_state); > +} > + > +static int ivb_gamma_precision(const struct intel_crtc_state > +*crtc_state) { > + if (crtc_state->gamma_enable && > + crtc_state->gamma_mode == GAMMA_MODE_MODE_SPLIT) > + return 10; > + else > + return ilk_gamma_precision(crtc_state); } > + > +static int chv_degamma_precision(const struct intel_crtc_state > +*crtc_state) { > + if (crtc_state->cgm_mode & CGM_PIPE_MODE_DEGAMMA) > + return 14; > + else > return 0; > - } > } > > static int chv_gamma_precision(const struct intel_crtc_state *crtc_state) @@ - > 1658,20 +1703,20 @@ static int chv_gamma_precision(const struct > intel_crtc_state *crtc_state) > return i9xx_gamma_precision(crtc_state); } > > +static int glk_degamma_precision(const struct intel_crtc_state > +*crtc_state) { > + if (crtc_state->csc_enable) > + return 16; > + else > + return 0; > +} > + > static int glk_gamma_precision(const struct intel_crtc_state *crtc_state) { > - if (!crtc_state->gamma_enable) > + if (crtc_state->gamma_enable) > + return ilk_lut_precision(crtc_state); > + else > return 0; > - > - switch (crtc_state->gamma_mode) { > - case GAMMA_MODE_MODE_8BIT: > - return 8; > - case GAMMA_MODE_MODE_10BIT: > - return 10; > - default: > - MISSING_CASE(crtc_state->gamma_mode); > - return 0; > - } > } > > static bool icl_crtc_has_degamma(const struct intel_crtc_state *crtc_state) @@ - > 1684,6 +1729,14 @@ static bool icl_crtc_has_gamma(const struct intel_crtc_state > *crtc_state) > return crtc_state->gamma_mode & POST_CSC_GAMMA_ENABLE; } > > +static int icl_degamma_precision(const struct intel_crtc_state > +*crtc_state) { > + if (icl_crtc_has_degamma(crtc_state)) > + return 16; > + else > + return 0; > +} > + > static int icl_gamma_precision(const struct intel_crtc_state *crtc_state) { > if (!icl_crtc_has_gamma(crtc_state)) > @@ -1702,97 +1755,310 @@ static int icl_gamma_precision(const struct > intel_crtc_state *crtc_state) > } > } > > -int intel_color_get_gamma_bit_precision(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); > - > - if (HAS_GMCH(dev_priv)) { > - if (IS_CHERRYVIEW(dev_priv)) > - return chv_gamma_precision(crtc_state); > - else > - return i9xx_gamma_precision(crtc_state); > - } else { > - if (INTEL_GEN(dev_priv) >= 11) > - return icl_gamma_precision(crtc_state); > - else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv)) > - return glk_gamma_precision(crtc_state); > - else if (IS_IRONLAKE(dev_priv)) > - return ilk_gamma_precision(crtc_state); > - } > - > - return 0; > -} > - > -static bool err_check(struct drm_color_lut *lut1, > - struct drm_color_lut *lut2, u32 err) > +static bool lut_entry_equal(const struct drm_color_lut *lut1, > + const struct drm_color_lut *lut2, u32 err) > { > return ((abs((long)lut2->red - lut1->red)) <= err) && > ((abs((long)lut2->blue - lut1->blue)) <= err) && > ((abs((long)lut2->green - lut1->green)) <= err); } > > -static bool intel_color_lut_entries_equal(struct drm_color_lut *lut1, > - struct drm_color_lut *lut2, > - int lut_size, u32 err) > +static int intel_color_lut_size(const struct drm_property_blob *blob) > { > - int i; > + return blob ? drm_color_lut_size(blob) : 0; } > + > +static bool intel_color_lut_sizes_equal(const struct drm_property_blob *blob1, > + const struct drm_property_blob *blob2) { > + return intel_color_lut_size(blob1) == intel_color_lut_size(blob2); } > + > +static bool intel_lut_equal(const struct drm_property_blob *blob1, > + const struct drm_property_blob *blob2, > + int bit_precision) > +{ > + const struct drm_color_lut *lut1, *lut2; > + int i, lut_size; > + > + if (!intel_color_lut_sizes_equal(blob1, blob2)) > + return false; > + > + if (!blob1) > + return true; > + > + if (!bit_precision) > + return false; > + > + lut_size = drm_color_lut_size(blob1); > + lut1 = blob1->data; > + lut2 = blob2->data; > > for (i = 0; i < lut_size; i++) { > - if (!err_check(&lut1[i], &lut2[i], err)) > + if (!lut_entry_equal(&lut1[i], &lut2[i], > + 0xffff >> bit_precision)) > return false; > } > > return true; > } > > -bool intel_color_lut_equal(struct drm_property_blob *blob1, > - struct drm_property_blob *blob2, > - u32 gamma_mode, u32 bit_precision) > +static bool i9xx_degamma_equal(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset) > { > - struct drm_color_lut *lut1, *lut2; > - int lut_size1, lut_size2; > - u32 err; > + const struct drm_property_blob *degamma_lut1 = crtc_state1- > >hw.degamma_lut; > + const struct drm_property_blob *degamma_lut2 = > +crtc_state2->hw.degamma_lut; > > - if (!blob1 != !blob2) > + /* no degamma */ > + return !degamma_lut1 && !degamma_lut2; } > + > +static bool i9xx_gamma_equal(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset) > +{ > + const struct drm_property_blob *gamma_lut1 = crtc_state1- > >hw.gamma_lut; > + const struct drm_property_blob *gamma_lut2 = > +crtc_state2->hw.gamma_lut; > + > + return intel_lut_equal(gamma_lut1, gamma_lut2, > + i9xx_gamma_precision(crtc_state1)); > +} > + > +static bool chv_degamma_equal(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset) > +{ > + const struct drm_property_blob *degamma_lut1 = crtc_state1- > >hw.degamma_lut; > + const struct drm_property_blob *degamma_lut2 = > +crtc_state2->hw.degamma_lut; > + > + return intel_lut_equal(degamma_lut1, degamma_lut2, > + chv_degamma_precision(crtc_state1)); > +} > + > +static bool chv_gamma_equal(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset) > +{ > + const struct drm_property_blob *gamma_lut1 = crtc_state1- > >hw.gamma_lut; > + const struct drm_property_blob *gamma_lut2 = > +crtc_state2->hw.gamma_lut; > + > + return intel_lut_equal(gamma_lut1, gamma_lut2, > + chv_gamma_precision(crtc_state1)); > +} > + > +static bool ilk_degamma_equal(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset) > +{ > + const struct drm_property_blob *degamma_lut1 = crtc_state2- > >hw.degamma_lut; > + const struct drm_property_blob *degamma_lut2 = > +crtc_state2->hw.degamma_lut; > + > + if (!fastset) { > + const struct drm_property_blob *gamma_lut2 = > +crtc_state2->hw.gamma_lut; > + > + /* > + * For readout crtc_state1 is the software state, > + * crtc_state2 is the hardware state. > + * > + * On ILK-BDW the single LUT may appear before or after the > + * CSC due to various reasons. Readout does not know whether > + * the user supplied it as a gamma LUT or degamma LUT. If the > + * software and hardware states look inconsistent assume > + * readout got things the wrong way around. > + * > + * FIXME think about assigning these consistently from the > hardware > + * POV already when computing the state. Would avoid this > hideous > + * hack, but possibly not entirely trivial to do since we currently > + * just blindly copy those from the uapi state. > + */ > + if (!!degamma_lut1 != !!degamma_lut2) > + swap(gamma_lut2, degamma_lut2); > + } > + > + return intel_lut_equal(degamma_lut1, degamma_lut2, > + ilk_degamma_precision(crtc_state1)); > +} > + > +static bool ilk_gamma_equal(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset) > +{ > + const struct drm_property_blob *gamma_lut1 = crtc_state1- > >hw.gamma_lut; > + const struct drm_property_blob *gamma_lut2 = > +crtc_state2->hw.gamma_lut; > + > + if (!fastset) { > + const struct drm_property_blob *degamma_lut2 = > +crtc_state2->hw.degamma_lut; > + > + /* > + * For readout crtc_state1 is the software state, > + * crtc_state2 is the hardware state. > + * > + * On ILK-BDW the single LUT may appear before or after the > + * CSC due to various reasons. Readout does not know whether > + * the user supplied it as a gamma LUT or degamma LUT. If the > + * software and hardware states look inconsistent assume > + * readout got things the wrong way around. > + * > + * FIXME think about assigning these consistently from the > hardware > + * POV already when computing the state. Would avoid this > hideous > + * hack, but possibly not entirely trivial to do since we currently > + * just blindly copy those from the uapi state. > + */ > + if (!!gamma_lut1 != !!gamma_lut2) > + swap(gamma_lut2, degamma_lut2); > + } > + > + return intel_lut_equal(gamma_lut1, gamma_lut2, > + ilk_gamma_precision(crtc_state1)); > +} > + > +static bool ivb_lut_split_equal(const struct drm_property_blob *blob1, > + const struct drm_property_blob *blob2, > + int bit_precision) > +{ > + const struct drm_color_lut *lut1, *lut2; > + int i, lut_size, hw_lut_size; > + > + if (!intel_color_lut_sizes_equal(blob1, blob2)) > return false; > > if (!blob1) > return true; > > - lut_size1 = drm_color_lut_size(blob1); > - lut_size2 = drm_color_lut_size(blob2); > - > - /* check sw and hw lut size */ > - if (lut_size1 != lut_size2) > + if (!bit_precision) > return false; > > + lut_size = drm_color_lut_size(blob1); > + hw_lut_size = ivb_lut_10_size(PAL_PREC_SPLIT_MODE); > lut1 = blob1->data; > lut2 = blob2->data; > > - err = 0xffff >> bit_precision; > + for (i = 0; i < hw_lut_size; i++) { > + /* We discard half the user entries in split gamma mode */ > + const struct drm_color_lut *entry1 = > + &lut1[i * (lut_size - 1) / (hw_lut_size - 1)]; > + const struct drm_color_lut *entry2 = > + &lut2[i * (lut_size - 1) / (hw_lut_size - 1)]; > > - /* check sw and hw lut entry to be equal */ > - switch (gamma_mode & GAMMA_MODE_MODE_MASK) { > - case GAMMA_MODE_MODE_8BIT: > - case GAMMA_MODE_MODE_10BIT: > - if (!intel_color_lut_entries_equal(lut1, lut2, > - lut_size2, err)) > + if (!lut_entry_equal(entry1, entry2, 0xffff >> bit_precision)) > return false; > - break; > - case GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED: > - if (!intel_color_lut_entries_equal(lut1, lut2, > - 9, err)) > - return false; > - break; > - default: > - MISSING_CASE(gamma_mode); > - return false; > } > > return true; > } > > +static bool ivb_degamma_equal(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset) > +{ > + if (crtc_state1->gamma_mode == GAMMA_MODE_MODE_SPLIT) { > + const struct drm_property_blob *degamma_lut1 = crtc_state1- > >hw.degamma_lut; > + const struct drm_property_blob *degamma_lut2 = > +crtc_state2->hw.degamma_lut; > + > + return ivb_lut_split_equal(degamma_lut1, degamma_lut2, > + ivb_degamma_precision(crtc_state1)); > + } else { > + return ilk_degamma_equal(crtc_state1, crtc_state2, fastset); > + } > +} > + > +static bool ivb_gamma_equal(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset) > +{ > + if (crtc_state1->gamma_mode == GAMMA_MODE_MODE_SPLIT) { > + const struct drm_property_blob *gamma_lut1 = crtc_state1- > >hw.gamma_lut; > + const struct drm_property_blob *gamma_lut2 = > +crtc_state2->hw.gamma_lut; > + > + return ivb_lut_split_equal(gamma_lut1, gamma_lut2, > + ivb_gamma_precision(crtc_state1)); > + } else { > + return ilk_gamma_equal(crtc_state1, crtc_state2, fastset); > + } > +} > + > +static bool glk_degamma_equal(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset) > +{ > + const struct drm_property_blob *degamma_lut1 = crtc_state1- > >hw.degamma_lut; > + const struct drm_property_blob *degamma_lut2 = > +crtc_state2->hw.degamma_lut; > + > + if (!fastset) { > + /* > + * For readout crtc_state1 is the software state, > + * crtc_state2 is the hardware state. > + * > + * Readout can't tell the difference between an actual > + * degamma LUT and the linear degamma LUT we have to load > + * whenever the pipe CSC is active. Ignore the hardware > + * degamma LUT when we don't have a software degamma LUT. > + * > + * FIXME think about assigning an internal linear lut already > + * when computing the state. Would avoid this hideous hack, > + * but possibly not entirely trivial to do since we currently > + * just blindly copy this from the uapi state. > + */ > + if (!degamma_lut1) > + degamma_lut2 = NULL; > + } > + > + return intel_lut_equal(degamma_lut1, degamma_lut2, > + glk_degamma_precision(crtc_state1)); > +} > + > +static bool glk_gamma_equal(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset) > +{ > + const struct drm_property_blob *gamma_lut1 = crtc_state1- > >hw.gamma_lut; > + const struct drm_property_blob *gamma_lut2 = > +crtc_state2->hw.gamma_lut; > + > + return intel_lut_equal(gamma_lut1, gamma_lut2, > + glk_gamma_precision(crtc_state1)); > +} > + > +static bool icl_degamma_equal(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset) > +{ > + const struct drm_property_blob *degamma_lut1 = crtc_state1- > >hw.degamma_lut; > + const struct drm_property_blob *degamma_lut2 = > +crtc_state2->hw.degamma_lut; > + > + return intel_lut_equal(degamma_lut1, degamma_lut2, > + icl_degamma_precision(crtc_state1)); > +} > + > +static bool icl_gamma_equal(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset) > +{ > + const struct drm_property_blob *gamma_lut1 = crtc_state1- > >hw.gamma_lut; > + const struct drm_property_blob *gamma_lut2 = > +crtc_state2->hw.gamma_lut; > + > + return intel_lut_equal(gamma_lut1, gamma_lut2, > + icl_gamma_precision(crtc_state1)); > +} > + > +bool intel_color_degamma_lut_equal(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset) > +{ > + struct drm_i915_private *dev_priv = > +to_i915(crtc_state1->uapi.crtc->dev); > + > + return dev_priv->display.degamma_equal(crtc_state1, crtc_state2, > +fastset); } > + > +bool intel_color_gamma_lut_equal(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset) > +{ > + struct drm_i915_private *dev_priv = > +to_i915(crtc_state1->uapi.crtc->dev); > + > + return dev_priv->display.gamma_equal(crtc_state1, crtc_state2, > +fastset); } > + > static struct drm_property_blob *i9xx_read_lut_8(struct intel_crtc *crtc) { > struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); @@ - > 2289,16 +2555,22 @@ void intel_color_init(struct intel_crtc *crtc) > dev_priv->display.color_commit = i9xx_color_commit; > dev_priv->display.load_luts = chv_load_luts; > dev_priv->display.read_luts = chv_read_luts; > + dev_priv->display.gamma_equal = chv_gamma_equal; > + dev_priv->display.degamma_equal = > chv_degamma_equal; > } else if (INTEL_GEN(dev_priv) >= 4) { > dev_priv->display.color_check = i9xx_color_check; > dev_priv->display.color_commit = i9xx_color_commit; > dev_priv->display.load_luts = i965_load_luts; > dev_priv->display.read_luts = i965_read_luts; > + dev_priv->display.gamma_equal = i9xx_gamma_equal; > + dev_priv->display.degamma_equal = > i9xx_degamma_equal; > } else { > dev_priv->display.color_check = i9xx_color_check; > dev_priv->display.color_commit = i9xx_color_commit; > dev_priv->display.load_luts = i9xx_load_luts; > dev_priv->display.read_luts = i9xx_read_luts; > + dev_priv->display.gamma_equal = i9xx_gamma_equal; > + dev_priv->display.degamma_equal = > i9xx_degamma_equal; > } > } else { > if (INTEL_GEN(dev_priv) >= 11) > @@ -2320,19 +2592,30 @@ void intel_color_init(struct intel_crtc *crtc) > if (INTEL_GEN(dev_priv) >= 11) { > dev_priv->display.load_luts = icl_load_luts; > dev_priv->display.read_luts = icl_read_luts; > + dev_priv->display.gamma_equal = icl_gamma_equal; > + dev_priv->display.degamma_equal = icl_degamma_equal; > } else if (IS_CANNONLAKE(dev_priv) || IS_GEMINILAKE(dev_priv)) > { > dev_priv->display.load_luts = glk_load_luts; > dev_priv->display.read_luts = glk_read_luts; > + dev_priv->display.gamma_equal = glk_gamma_equal; > + dev_priv->display.degamma_equal = > glk_degamma_equal; > } else if (INTEL_GEN(dev_priv) >= 8) { > dev_priv->display.load_luts = bdw_load_luts; > dev_priv->display.read_luts = bdw_read_luts; > + dev_priv->display.gamma_equal = ivb_gamma_equal; > + dev_priv->display.degamma_equal = > ivb_degamma_equal; > } else if (INTEL_GEN(dev_priv) >= 7) { > dev_priv->display.load_luts = ivb_load_luts; > dev_priv->display.read_luts = ivb_read_luts; > + dev_priv->display.gamma_equal = ivb_gamma_equal; > + dev_priv->display.degamma_equal = > ivb_degamma_equal; > } else { > dev_priv->display.load_luts = ilk_load_luts; > dev_priv->display.read_luts = ilk_read_luts; > + dev_priv->display.gamma_equal = ilk_gamma_equal; > + dev_priv->display.degamma_equal = > ilk_degamma_equal; > } > + > } > > drm_crtc_enable_color_mgmt(&crtc->base, > diff --git a/drivers/gpu/drm/i915/display/intel_color.h > b/drivers/gpu/drm/i915/display/intel_color.h > index 173727aaa24d..079ea90c22c8 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.h > +++ b/drivers/gpu/drm/i915/display/intel_color.h > @@ -17,9 +17,11 @@ int intel_color_check(struct intel_crtc_state *crtc_state); > void intel_color_commit(const struct intel_crtc_state *crtc_state); void > intel_color_load_luts(const struct intel_crtc_state *crtc_state); void > intel_color_get_config(struct intel_crtc_state *crtc_state); -int > intel_color_get_gamma_bit_precision(const struct intel_crtc_state *crtc_state); - > bool intel_color_lut_equal(struct drm_property_blob *blob1, > - struct drm_property_blob *blob2, > - u32 gamma_mode, u32 bit_precision); > +bool intel_color_gamma_lut_equal(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset); > +bool intel_color_degamma_lut_equal(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset); > > #endif /* __INTEL_COLOR_H__ */ > diff --git a/drivers/gpu/drm/i915/display/intel_display.c > b/drivers/gpu/drm/i915/display/intel_display.c > index 9279df7757fc..e80b4cd8eea1 100644 > --- a/drivers/gpu/drm/i915/display/intel_display.c > +++ b/drivers/gpu/drm/i915/display/intel_display.c > @@ -13635,7 +13635,6 @@ intel_pipe_config_compare(const struct > intel_crtc_state *current_config, > struct drm_i915_private *dev_priv = to_i915(current_config->uapi.crtc- > >dev); > struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc); > bool ret = true; > - u32 bp_gamma = 0; > bool fixup_inherited = fastset && > current_config->inherited && !pipe_config->inherited; > > @@ -13798,21 +13797,10 @@ intel_pipe_config_compare(const struct > intel_crtc_state *current_config, > } \ > } while (0) > > -#define PIPE_CONF_CHECK_COLOR_LUT(name1, name2, bit_precision) do { \ > - if (current_config->name1 != pipe_config->name1) { \ > - pipe_config_mismatch(fastset, crtc, __stringify(name1), \ > - "(expected %i, found %i, won't compare lut > values)", \ > - current_config->name1, \ > - pipe_config->name1); \ > - ret = false;\ > - } else { \ > - if (!intel_color_lut_equal(current_config->name2, \ > - pipe_config->name2, pipe_config- > >name1, \ > - bit_precision)) { \ > - pipe_config_mismatch(fastset, crtc, __stringify(name2), \ > - "hw_state doesn't match sw_state"); \ > - ret = false; \ > - } \ > +#define PIPE_CONF_CHECK_COLOR_LUT(name) do { \ > + if (!intel_color_##name##_equal(current_config, pipe_config, fastset)) { \ > + pipe_config_mismatch(fastset, crtc, "hw." __stringify(name), " "); > \ > + ret = false; \ > } \ > } while (0) > > @@ -13918,9 +13906,8 @@ intel_pipe_config_compare(const struct > intel_crtc_state *current_config, > PIPE_CONF_CHECK_I(linetime); > PIPE_CONF_CHECK_I(ips_linetime); > > - 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_lut); > + PIPE_CONF_CHECK_COLOR_LUT(degamma_lut); > } > > PIPE_CONF_CHECK_BOOL(double_wide); > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index e4f7f6518945..54d224be256a 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -256,6 +256,7 @@ struct sdvo_device_mapping { > u8 ddc_pin; > }; > > +struct drm_property_blob; > struct intel_connector; > struct intel_encoder; > struct intel_atomic_state; > @@ -334,6 +335,12 @@ struct drm_i915_display_funcs { > */ > void (*load_luts)(const struct intel_crtc_state *crtc_state); > void (*read_luts)(struct intel_crtc_state *crtc_state); > + bool (*gamma_equal)(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset); > + bool (*degamma_equal)(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset); > }; > > struct intel_csr { > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
[parent not found: <20200717211345.26851-21-ville.syrjala@linux.intel.com>]
* Re: [Intel-gfx] [PATCH 20/20] drm/i915: Add 10bit gamma mode for gen2/3 [not found] ` <20200717211345.26851-21-ville.syrjala@linux.intel.com> @ 2020-09-21 19:40 ` Shankar, Uma 0 siblings, 0 replies; 20+ messages in thread From: Shankar, Uma @ 2020-09-21 19:40 UTC (permalink / raw) To: Ville Syrjala, intel-gfx@lists.freedesktop.org > -----Original Message----- > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Ville > Syrjala > Sent: Saturday, July 18, 2020 2:44 AM > To: intel-gfx@lists.freedesktop.org > Subject: [Intel-gfx] [PATCH 20/20] drm/i915: Add 10bit gamma mode for gen2/3 > > From: Ville Syrjälä <ville.syrjala@linux.intel.com> > > Some gen2/gen3 parts have a 10bit gamma mode, on some pipes. > Expose it. > > The format is different to the later i965+ style in that we store a 10bit value and > a 6 bit floating point slope for each entry. Ie. the hardware extrapolates the > intermediate steps from the current LUT entry, instead of interpolating between > the current and next LUT entries. This also means we don't store the last LUT > entry in any register as it is defined by the previous LUT entry's value+slope. > > The slope has limited precision though (2 bit exponent + 4 bit mantissa), so we > have to allow for more error in the state checker for the last entry, and we have > to make sure userspace doesn't pass in something where the slope is simply to > steep. In theory we should perhaps check the slope for every interval, but we > don't do that for any other interpolated gamma mode and I suspect they may > also have some internal limit on the slope. I haven't confirmed that theory > though. Anyways, only the last entry provides a slight challenge for the state > checker since all the other entries do have an explicit value stored in a register. Couldn't verify the details from spec. But with the description, was not able to spot any issue with the implementation. Acked-by: Uma Shankar <uma.shankar@intel.com> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> > --- > drivers/gpu/drm/i915/display/intel_color.c | 248 ++++++++++++++++++++- > drivers/gpu/drm/i915/i915_pci.c | 10 +- > drivers/gpu/drm/i915/i915_reg.h | 38 +++- > 3 files changed, 279 insertions(+), 17 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_color.c > b/drivers/gpu/drm/i915/display/intel_color.c > index ca6c6679368c..055a49ed4e3a 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.c > +++ b/drivers/gpu/drm/i915/display/intel_color.c > @@ -414,6 +414,79 @@ static void i9xx_lut_8_pack(struct drm_color_lut *entry, > u32 val) > entry->blue = > intel_color_lut_pack(REG_FIELD_GET(LGC_PALETTE_BLUE_MASK, val), 8); } > > +/* i8xx/i9xx+ 10bit slope format "even DW" (low 8 bits) */ static u32 > +_i9xx_lut_10_ldw(u16 a) { > + return drm_color_lut_extract(a, 10) & 0xff; } > + > +static u32 i9xx_lut_10_ldw(const struct drm_color_lut *color) { > + return _i9xx_lut_10_ldw(color[0].red) << 16 | > + _i9xx_lut_10_ldw(color[0].green) << 8 | > + _i9xx_lut_10_ldw(color[0].blue); > +} > + > +/* i8xx/i9xx+ 10bit slope format "odd DW" (high 2 bits + slope) */ > +static u32 _i9xx_lut_10_udw(u16 a, u16 b) { > + unsigned int mantissa, exponent; > + > + a = drm_color_lut_extract(a, 10); > + b = drm_color_lut_extract(b, 10); > + > + /* b = a + 8 * m * 2 ^ -e */ > + mantissa = clamp(b - a, 0, 0x7f); > + exponent = 3; > + while (mantissa > 0xf) { > + mantissa >>= 1; > + exponent--; > + } > + > + return (exponent << 6) | > + (mantissa << 2) | > + (a >> 8); > +} > + > +static u32 i9xx_lut_10_udw(const struct drm_color_lut *color) { > + return _i9xx_lut_10_udw(color[0].red, color[1].red) << 16 | > + _i9xx_lut_10_udw(color[0].green, color[1].green) << 8 | > + _i9xx_lut_10_udw(color[0].blue, color[1].blue); } > + > +static void i9xx_lut_10_pack(struct drm_color_lut *color, > + u32 ldw, u32 udw) > +{ > + u16 red = REG_FIELD_GET(PALETTE_10BIT_RED_LDW_MASK, ldw) | > + REG_FIELD_GET(PALETTE_10BIT_RED_UDW_MASK, udw) << 8; > + u16 green = REG_FIELD_GET(PALETTE_10BIT_GREEN_LDW_MASK, ldw) | > + REG_FIELD_GET(PALETTE_10BIT_GREEN_UDW_MASK, udw) << 8; > + u16 blue = REG_FIELD_GET(PALETTE_10BIT_BLUE_LDW_MASK, ldw) | > + REG_FIELD_GET(PALETTE_10BIT_BLUE_UDW_MASK, udw) << 8; > + > + color->red = intel_color_lut_pack(red, 10); > + color->green = intel_color_lut_pack(green, 10); > + color->blue = intel_color_lut_pack(blue, 10); } > + > +static void i9xx_lut_10_pack_slope(struct drm_color_lut *color, > + u32 ldw, u32 udw) > +{ > + int r_exp = REG_FIELD_GET(PALETTE_10BIT_RED_EXP_MASK, udw); > + int r_mant = REG_FIELD_GET(PALETTE_10BIT_RED_MANT_MASK, udw); > + int g_exp = REG_FIELD_GET(PALETTE_10BIT_GREEN_EXP_MASK, udw); > + int g_mant = REG_FIELD_GET(PALETTE_10BIT_GREEN_MANT_MASK, > udw); > + int b_exp = REG_FIELD_GET(PALETTE_10BIT_BLUE_EXP_MASK, udw); > + int b_mant = REG_FIELD_GET(PALETTE_10BIT_BLUE_MANT_MASK, udw); > + > + i9xx_lut_10_pack(color, ldw, udw); > + > + color->red += r_mant << (3 - r_exp); > + color->green += g_mant << (3 - g_exp); > + color->blue += b_mant << (3 - b_exp); > +} > + > /* i965+ "10.6" bit interpolated format "even DW" (low 8 bits) */ static u32 > i965_lut_10p6_ldw(const struct drm_color_lut *color) { @@ -554,6 +627,22 @@ > static void i9xx_load_lut_8(struct intel_crtc *crtc, > i9xx_lut_8(&lut[i])); > } > > +static void i9xx_load_lut_10(struct intel_crtc *crtc, > + const struct drm_property_blob *blob) { > + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); > + const struct drm_color_lut *lut = blob->data; > + int i, lut_size = drm_color_lut_size(blob); > + enum pipe pipe = crtc->pipe; > + > + for (i = 0; i < lut_size - 1; i++) { > + intel_de_write(dev_priv, PALETTE(pipe, 2 * i + 0), > + i9xx_lut_10_ldw(&lut[i])); > + intel_de_write(dev_priv, PALETTE(pipe, 2 * i + 1), > + i9xx_lut_10_udw(&lut[i])); > + } > +} > + > static void i9xx_load_luts(const struct intel_crtc_state *crtc_state) { > struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); > @@ -562,7 +651,10 @@ static void i9xx_load_luts(const struct intel_crtc_state > *crtc_state) > > assert_pll_enabled(dev_priv, crtc->pipe); > > - i9xx_load_lut_8(crtc, gamma_lut); > + if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) > + i9xx_load_lut_8(crtc, gamma_lut); > + else > + i9xx_load_lut_10(crtc, gamma_lut); > } > > static void i965_load_lut_10p6(struct intel_crtc *crtc, @@ -1326,11 +1418,36 > @@ static u32 i9xx_gamma_mode(struct intel_crtc_state *crtc_state) > crtc_state_is_legacy_gamma(crtc_state)) > return GAMMA_MODE_MODE_8BIT; > else > - return GAMMA_MODE_MODE_10BIT; /* i965+ only */ > + return GAMMA_MODE_MODE_10BIT; > +} > + > +static int i9xx_lut_10_diff(u16 a, u16 b) { > + return drm_color_lut_extract(a, 10) - > + drm_color_lut_extract(b, 10); > +} > + > +static int i9xx_check_lut_10(struct drm_i915_private *dev_priv, > + const struct drm_property_blob *blob) { > + const struct drm_color_lut *lut = blob->data; > + int lut_size = drm_color_lut_size(blob); > + const struct drm_color_lut *a = &lut[lut_size - 2]; > + const struct drm_color_lut *b = &lut[lut_size - 1]; > + > + if (i9xx_lut_10_diff(b->red, a->red) > 0x7f || > + i9xx_lut_10_diff(b->green, a->green) > 0x7f || > + i9xx_lut_10_diff(b->blue, a->blue) > 0x7f) { > + drm_dbg_kms(&dev_priv->drm, "Last gamma LUT entry exceeds > max slope\n"); > + return -EINVAL; > + } > + > + return 0; > } > > static int i9xx_color_check(struct intel_crtc_state *crtc_state) { > + struct drm_i915_private *dev_priv = > +to_i915(crtc_state->uapi.crtc->dev); > int ret; > > ret = check_luts(crtc_state); > @@ -1343,6 +1460,13 @@ static int i9xx_color_check(struct intel_crtc_state > *crtc_state) > > crtc_state->gamma_mode = i9xx_gamma_mode(crtc_state); > > + if (INTEL_GEN(dev_priv) < 4 && > + crtc_state->gamma_mode == GAMMA_MODE_MODE_10BIT) { > + ret = i9xx_check_lut_10(dev_priv, crtc_state->hw.gamma_lut); > + if (ret) > + return ret; > + } > + > ret = intel_color_add_affected_planes(crtc_state); > if (ret) > return ret; > @@ -1613,6 +1737,22 @@ static int icl_color_check(struct intel_crtc_state > *crtc_state) } > > static int i9xx_gamma_precision(const struct intel_crtc_state *crtc_state) > +{ > + if (!crtc_state->gamma_enable) > + return 0; > + > + switch (crtc_state->gamma_mode) { > + case GAMMA_MODE_MODE_8BIT: > + return 8; > + case GAMMA_MODE_MODE_10BIT: > + return 10; > + default: > + MISSING_CASE(crtc_state->gamma_mode); > + return 0; > + } > +} > + > +static int i965_gamma_precision(const struct intel_crtc_state > +*crtc_state) > { > if (!crtc_state->gamma_enable) > return 0; > @@ -1700,7 +1840,7 @@ static int chv_gamma_precision(const struct > intel_crtc_state *crtc_state) > if (crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA) > return 10; > else > - return i9xx_gamma_precision(crtc_state); > + return i965_gamma_precision(crtc_state); > } > > static int glk_degamma_precision(const struct intel_crtc_state *crtc_state) @@ - > 1803,6 +1943,37 @@ static bool intel_lut_equal(const struct drm_property_blob > *blob1, > return true; > } > > +static bool i9xx_lut_10_equal(const struct drm_property_blob *blob1, > + const struct drm_property_blob *blob2, > + int bit_precision) > +{ > + const struct drm_color_lut *lut1, *lut2; > + int i, lut_size; > + > + if (!intel_color_lut_sizes_equal(blob1, blob2)) > + return false; > + > + if (!blob1) > + return true; > + > + if (!bit_precision) > + return false; > + > + lut_size = drm_color_lut_size(blob1); > + lut1 = blob1->data; > + lut2 = blob2->data; > + > + for (i = 0; i < lut_size - 1; i++) { > + if (!lut_entry_equal(&lut1[i], &lut2[i], > + 0xffff >> bit_precision)) > + return false; > + } > + > + /* limited precision for the last entry due to floating point slope */ > + return lut_entry_equal(&lut1[i], &lut2[i], > + 0xffff >> (bit_precision - 3)); } > + > static bool i9xx_degamma_equal(const struct intel_crtc_state *crtc_state1, > const struct intel_crtc_state *crtc_state2, > bool fastset) > @@ -1821,8 +1992,23 @@ static bool i9xx_gamma_equal(const struct > intel_crtc_state *crtc_state1, > const struct drm_property_blob *gamma_lut1 = crtc_state1- > >hw.gamma_lut; > const struct drm_property_blob *gamma_lut2 = crtc_state2- > >hw.gamma_lut; > > + if (crtc_state1->gamma_mode == GAMMA_MODE_MODE_10BIT) > + return i9xx_lut_10_equal(gamma_lut1, gamma_lut2, > + i9xx_gamma_precision(crtc_state1)); > + else > + return intel_lut_equal(gamma_lut1, gamma_lut2, > + i9xx_gamma_precision(crtc_state1)); > +} > + > +static bool i965_gamma_equal(const struct intel_crtc_state *crtc_state1, > + const struct intel_crtc_state *crtc_state2, > + bool fastset) > +{ > + const struct drm_property_blob *gamma_lut1 = crtc_state1- > >hw.gamma_lut; > + const struct drm_property_blob *gamma_lut2 = > +crtc_state2->hw.gamma_lut; > + > return intel_lut_equal(gamma_lut1, gamma_lut2, > - i9xx_gamma_precision(crtc_state1)); > + i965_gamma_precision(crtc_state1)); > } > > static bool chv_degamma_equal(const struct intel_crtc_state *crtc_state1, @@ - > 2084,6 +2270,36 @@ static struct drm_property_blob *i9xx_read_lut_8(struct > intel_crtc *crtc) > return blob; > } > > +static struct drm_property_blob * > +i9xx_read_lut_10(struct intel_crtc *crtc) { > + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); > + u32 lut_size = INTEL_INFO(dev_priv)->color.gamma_lut_size; > + enum pipe pipe = crtc->pipe; > + struct drm_property_blob *blob; > + struct drm_color_lut *lut; > + u32 ldw, udw; > + int i; > + > + blob = drm_property_create_blob(&dev_priv->drm, > + lut_size * sizeof(lut[0]), NULL); > + if (IS_ERR(blob)) > + return NULL; > + > + lut = blob->data; > + > + for (i = 0; i < lut_size - 1; i++) { > + ldw = intel_de_read(dev_priv, PALETTE(pipe, 2 * i + 0)); > + udw = intel_de_read(dev_priv, PALETTE(pipe, 2 * i + 1)); > + > + i9xx_lut_10_pack(&lut[i], ldw, udw); > + } > + > + i9xx_lut_10_pack_slope(&lut[i], ldw, udw); > + > + return blob; > +} > + > static void i9xx_read_luts(struct intel_crtc_state *crtc_state) { > struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); > @@ -2091,7 +2307,10 @@ 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); > + if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) > + crtc_state->hw.gamma_lut = i9xx_read_lut_8(crtc); > + else > + crtc_state->hw.gamma_lut = i9xx_read_lut_10(crtc); > } > > static struct drm_property_blob *i965_read_lut_10p6(struct intel_crtc *crtc) > @@ -2546,6 +2765,7 @@ void intel_color_init(struct intel_crtc *crtc) { > struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); > bool has_ctm = INTEL_INFO(dev_priv)->color.degamma_lut_size != 0; > + int gamma_lut_size; > > drm_mode_crtc_set_gamma_size(&crtc->base, 256); > > @@ -2562,7 +2782,7 @@ void intel_color_init(struct intel_crtc *crtc) > dev_priv->display.color_commit = i9xx_color_commit; > dev_priv->display.load_luts = i965_load_luts; > dev_priv->display.read_luts = i965_read_luts; > - dev_priv->display.gamma_equal = i9xx_gamma_equal; > + dev_priv->display.gamma_equal = i965_gamma_equal; > dev_priv->display.degamma_equal = > i9xx_degamma_equal; > } else { > dev_priv->display.color_check = i9xx_color_check; @@ - > 2618,8 +2838,20 @@ void intel_color_init(struct intel_crtc *crtc) > > } > > + /* > + * "DPALETTE_A: NOTE: The 8-bit (non-10-bit) mode is the > + * only mode supported by Alviso and Grantsdale." > + * > + * Actually looks like this affects all of gen3. > + * Confirmed on alv,cst,pnv. Mobile gen2 parts (alm,mgm) > + * are confirmed not to suffer from this restriction. > + */ > + if (IS_GEN(dev_priv, 3) && crtc->pipe == PIPE_A) > + gamma_lut_size = 256; > + else > + gamma_lut_size = INTEL_INFO(dev_priv)->color.gamma_lut_size; > + > drm_crtc_enable_color_mgmt(&crtc->base, > INTEL_INFO(dev_priv)- > >color.degamma_lut_size, > - has_ctm, > - INTEL_INFO(dev_priv)->color.gamma_lut_size); > + has_ctm, gamma_lut_size); > } > diff --git a/drivers/gpu/drm/i915/i915_pci.c b/drivers/gpu/drm/i915/i915_pci.c > index 2338f92ce490..baa24e4691c0 100644 > --- a/drivers/gpu/drm/i915/i915_pci.c > +++ b/drivers/gpu/drm/i915/i915_pci.c > @@ -127,9 +127,9 @@ > [PIPE_D] = TGL_CURSOR_D_OFFSET, \ > } > > -#define I9XX_COLORS \ > +#define I845_COLORS \ > .color = { .gamma_lut_size = 256 } > -#define I965_COLORS \ > +#define I9XX_COLORS \ > .color = { .gamma_lut_size = 129, \ > .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \ > } > @@ -194,7 +194,7 @@ > .dma_mask_size = 32, \ > I845_PIPE_OFFSETS, \ > I845_CURSOR_OFFSETS, \ > - I9XX_COLORS, \ > + I845_COLORS, \ > GEN_DEFAULT_PAGE_SIZES, \ > GEN_DEFAULT_REGIONS > > @@ -323,7 +323,7 @@ static const struct intel_device_info pnv_m_info = { > .dma_mask_size = 36, \ > I9XX_PIPE_OFFSETS, \ > I9XX_CURSOR_OFFSETS, \ > - I965_COLORS, \ > + I9XX_COLORS, \ > GEN_DEFAULT_PAGE_SIZES, \ > GEN_DEFAULT_REGIONS > > @@ -524,7 +524,7 @@ static const struct intel_device_info vlv_info = { > .display_mmio_offset = VLV_DISPLAY_BASE, > I9XX_PIPE_OFFSETS, > I9XX_CURSOR_OFFSETS, > - I965_COLORS, > + I9XX_COLORS, > GEN_DEFAULT_PAGE_SIZES, > GEN_DEFAULT_REGIONS, > }; > diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h > index 428ef06b8084..0c34d62f22f4 100644 > --- a/drivers/gpu/drm/i915/i915_reg.h > +++ b/drivers/gpu/drm/i915/i915_reg.h > @@ -3708,10 +3708,40 @@ static inline bool i915_mmio_reg_valid(i915_reg_t > reg) > #define _PALETTE_A 0xa000 > #define _PALETTE_B 0xa800 > #define _CHV_PALETTE_C 0xc000 > -#define PALETTE_RED_MASK REG_GENMASK(23, 16) > -#define PALETTE_GREEN_MASK REG_GENMASK(15, 8) > -#define PALETTE_BLUE_MASK REG_GENMASK(7, 0) > -#define PALETTE(pipe, i) _MMIO(DISPLAY_MMIO_BASE(dev_priv) + \ > +/* 8bit palette mode */ > +#define PALETTE_RED_MASK REG_GENMASK(23, 16) > +#define PALETTE_RED(x) > REG_FIELD_PREP(PALETTE_RED_MASK, (x)) > +#define PALETTE_GREEN_MASK REG_GENMASK(15, 8) > +#define PALETTE_GREEN(x) REG_FIELD_PREP(PALETTE_GREEN_MASK, > (x)) > +#define PALETTE_BLUE_MASK REG_GENMASK(7, 0) > +#define PALETTE_BLUE(x) REG_FIELD_PREP(PALETTE_BLUE_MASK, > (x)) > +/* i9xx 10bit interpolated ldw */ > +#define PALETTE_10BIT_RED_LDW_MASK REG_GENMASK(23, 16) > +#define PALETTE_10BIT_RED_LDW(x) > REG_FIELD_PREP(PALETTE_10BIT_RED_LDW_MASK, (x)) > +#define PALETTE_10BIT_GREEN_LDW_MASK REG_GENMASK(15, 8) > +#define PALETTE_10BIT_GREEN_LDW(x) > REG_FIELD_PREP(PALETTE_10BIT_GREEN_LDW_MASK, (x)) > +#define PALETTE_10BIT_BLUE_LDW_MASK REG_GENMASK(7, 0) > +#define PALETTE_10BIT_BLUE_LDW(x) > REG_FIELD_PREP(PALETTE_10BIT_BLUE_LDW_MASK, (x)) > +/* i9xx 10bit interpolated udw */ > +#define PALETTE_10BIT_RED_EXP_MASK REG_GENMASK(23, 22) > +#define PALETTE_10BIT_RED_EXP(x) > REG_FIELD_PREP(PALETTE_10BIT_RED_EXP_MASK, (x)) > +#define PALETTE_10BIT_RED_MANT_MASK REG_GENMASK(21, 18) > +#define PALETTE_10BIT_RED_MANT(x) > REG_FIELD_PREP(PALETTE_10BIT_RED_MANT_MASK, (x)) > +#define PALETTE_10BIT_RED_UDW_MASK REG_GENMASK(17, 16) > +#define PALETTE_10BIT_RED_UDW(x) > REG_FIELD_PREP(PALETTE_10BIT_RED_UDW_MASK, (X)) > +#define PALETTE_10BIT_GREEN_EXP_MASK REG_GENMASK(15, 14) > +#define PALETTE_10BIT_GREEN_EXP(x) > REG_FIELD_PREP(PALETTE_10BIT_GREEN_EXP_MASK, (x)) > +#define PALETTE_10BIT_GREEN_MANT_MASK REG_GENMASK(13, 10) > +#define PALETTE_10BIT_GREEN_MANT(x) > REG_FIELD_PREP(PALETTE_10BIT_GREEN_MANT_MASK, (x)) > +#define PALETTE_10BIT_GREEN_UDW_MASK REG_GENMASK(9, 8) > +#define PALETTE_10BIT_GREEN_UDW(x) > REG_FIELD_PREP(PALETTE_10BIT_GREEN_UDW_MASK, (x)) > +#define PALETTE_10BIT_BLUE_EXP_MASK REG_GENMASK(7, 6) > +#define PALETTE_10BIT_BLUE_EXP(x) > REG_FIELD_PREP(PALETTE_10BIT_BLUE_EXP_MASK, (x)) > +#define PALETTE_10BIT_BLUE_MANT_MASK REG_GENMASK(5, 2) > +#define PALETTE_10BIT_BLUE_MANT(x) > REG_FIELD_PREP(PALETTE_10BIT_BLUE_MANT_MASK, (x)) > +#define PALETTE_10BIT_BLUE_UDW_MASK REG_GENMASK(1, 0) > +#define PALETTE_10BIT_BLUE_UDW(x) > REG_FIELD_PREP(PALETTE_10BIT_BLUE_UDW_MASK, (x)) > +#define PALETTE(pipe, i) _MMIO(DISPLAY_MMIO_BASE(dev_priv) + \ > _PICK((pipe), _PALETTE_A, \ > _PALETTE_B, _CHV_PALETTE_C) + \ > (i) * 4) > -- > 2.26.2 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx ^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2020-09-21 19:40 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20200717211345.26851-1-ville.syrjala@linux.intel.com>
[not found] ` <20200717211345.26851-2-ville.syrjala@linux.intel.com>
2020-09-17 19:20 ` [Intel-gfx] [PATCH 01/20] drm/i915: Fix state checker hw.active/hw.enable readout Shankar, Uma
[not found] ` <20200717211345.26851-3-ville.syrjala@linux.intel.com>
2020-09-17 19:24 ` [Intel-gfx] [PATCH 02/20] drm/i915: Move MST master transcoder dump earlier Shankar, Uma
[not found] ` <20200717211345.26851-4-ville.syrjala@linux.intel.com>
2020-09-17 19:27 ` [Intel-gfx] [PATCH 03/20] drm/i915: Include the LUT sizes in the state dump Shankar, Uma
[not found] ` <20200717211345.26851-5-ville.syrjala@linux.intel.com>
2020-09-17 19:29 ` [Intel-gfx] [PATCH 04/20] drm/i915: s/glk_read_lut_10/bdw_read_lut_10/ Shankar, Uma
[not found] ` <20200717211345.26851-6-ville.syrjala@linux.intel.com>
2020-09-17 19:39 ` [Intel-gfx] [PATCH 05/20] drm/i915: Reset glk degamma index after programming/readout Shankar, Uma
[not found] ` <20200717211345.26851-7-ville.syrjala@linux.intel.com>
2020-09-17 19:42 ` [Intel-gfx] [PATCH 06/20] drm/i915: Shuffle chv_cgm_gamma_pack() around a bit Shankar, Uma
[not found] ` <20200717211345.26851-8-ville.syrjala@linux.intel.com>
2020-09-17 19:46 ` [Intel-gfx] [PATCH 07/20] drm/i915: Relocate CHV CGM gamma masks Shankar, Uma
[not found] ` <20200717211345.26851-9-ville.syrjala@linux.intel.com>
2020-09-17 19:58 ` [Intel-gfx] [PATCH 08/20] drm/i915: Add glk+ degamma readout Shankar, Uma
[not found] ` <20200717211345.26851-10-ville.syrjala@linux.intel.com>
2020-09-17 20:06 ` [Intel-gfx] [PATCH 09/20] drm/i915: Read out CHV CGM degamma Shankar, Uma
[not found] ` <20200717211345.26851-11-ville.syrjala@linux.intel.com>
2020-09-17 20:15 ` [Intel-gfx] [PATCH 10/20] drm/i915: Add gamma/degamma readout for bdw+ Shankar, Uma
[not found] ` <20200717211345.26851-12-ville.syrjala@linux.intel.com>
2020-09-17 20:40 ` [Intel-gfx] [PATCH 11/20] drm/i915: Do degamma+gamma readout in bdw+ split gamma mode Shankar, Uma
[not found] ` <20200717211345.26851-13-ville.syrjala@linux.intel.com>
2020-09-17 20:43 ` [Intel-gfx] [PATCH 12/20] drm/i915: Polish bdw_read_lut_10() a bit Shankar, Uma
[not found] ` <20200717211345.26851-14-ville.syrjala@linux.intel.com>
2020-09-17 20:46 ` [Intel-gfx] [PATCH 13/20] drm/i915: Add gamma/degamm readout for ivb/hsw Shankar, Uma
[not found] ` <20200717211345.26851-15-ville.syrjala@linux.intel.com>
2020-09-17 20:52 ` [Intel-gfx] [PATCH 14/20] drm/i915: Replace some gamma_mode ifs with switches Shankar, Uma
[not found] ` <20200717211345.26851-16-ville.syrjala@linux.intel.com>
2020-09-17 20:56 ` [Intel-gfx] [PATCH 15/20] drm/i915: Make ilk_load_luts() deal with degamma Shankar, Uma
[not found] ` <20200717211345.26851-17-ville.syrjala@linux.intel.com>
2020-09-17 20:58 ` [Intel-gfx] [PATCH 16/20] drm/i915: Make ilk_read_luts() capable of degamma readout Shankar, Uma
[not found] ` <20200717211345.26851-18-ville.syrjala@linux.intel.com>
2020-09-17 21:00 ` [Intel-gfx] [PATCH 17/20] drm/i915: Make .read_luts() mandatory Shankar, Uma
[not found] ` <20200717211345.26851-19-ville.syrjala@linux.intel.com>
2020-09-17 21:03 ` [Intel-gfx] [PATCH 18/20] drm/i915: Extract ilk_crtc_has_gamma() & co Shankar, Uma
[not found] ` <20200717211345.26851-20-ville.syrjala@linux.intel.com>
2020-09-17 21:52 ` [Intel-gfx] [PATCH 19/20] drm/i915: Complete the gamma/degamma state checking Shankar, Uma
[not found] ` <20200717211345.26851-21-ville.syrjala@linux.intel.com>
2020-09-21 19:40 ` [Intel-gfx] [PATCH 20/20] drm/i915: Add 10bit gamma mode for gen2/3 Shankar, Uma
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox