Message ID | 20191004082610.24664-2-swati2.sharma@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | fix broken state checker and enable state checker for icl+ | expand |
On Fri, Oct 04, 2019 at 01:56:07PM +0530, Swati Sharma wrote: > Premature gamma lut prepration and loading which was getting > reflected in first modeset causing different colors on > screen during boot. > > Issue: In BIOS, gamma is disabled by default. However, legacy read_luts() > was setting crtc_state->base.gamma_lut and gamma_lut was programmed > with junk values which led to visual artifacts (different > colored screens instead of usual black during boot). > > Fix: Calling read_luts() only when gamma is enabled which will happen > after first modeset. > > This fix is independent from the revert 1b8588741fdc ("Revert > "drm/i915/color: Extract icl_read_luts()"") and should fix different colors > on screen in legacy platforms too. > > -Added gamma_enable checks inside read_luts() [Ville/Jani N] > -Corrected gamma enable check for CHV [Ville] > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111809 > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111885 > Signed-off-by: Swati Sharma <swati2.sharma@intel.com> > --- > drivers/gpu/drm/i915/display/intel_color.c | 27 +++++++++++++++++++--- > 1 file changed, 24 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_color.c b/drivers/gpu/drm/i915/display/intel_color.c > index 9ab34902663e..8f02313a7fef 100644 > --- a/drivers/gpu/drm/i915/display/intel_color.c > +++ b/drivers/gpu/drm/i915/display/intel_color.c > @@ -1613,6 +1613,9 @@ i9xx_read_lut_8(const struct intel_crtc_state *crtc_state) > > static void i9xx_read_luts(struct intel_crtc_state *crtc_state) > { > + if (!crtc_state->gamma_enable) > + return; > + > crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state); > } > > @@ -1659,6 +1662,9 @@ i965_read_lut_10p6(const struct intel_crtc_state *crtc_state) > > static void i965_read_luts(struct intel_crtc_state *crtc_state) > { > + if (!crtc_state->gamma_enable) > + return; > + > if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) > crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state); > else > @@ -1701,10 +1707,19 @@ chv_read_cgm_lut(const struct intel_crtc_state *crtc_state) > > static void chv_read_luts(struct intel_crtc_state *crtc_state) > { > - if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) > - crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state); > - else > + if (crtc_state->cgm_mode) { > + if ((crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA) == 0) > + return; > + > crtc_state->base.gamma_lut = chv_read_cgm_lut(crtc_state); > + } > + > + if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) { > + if (!crtc_state->gamma_enable) > + return; > + > + crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state); > + } I'd simply make this something like: if (crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA) { crtc_state->base.gamma_lut = chv_read_cgm_lut(crtc_state); } else { i965_read_luts(crtc_state); } > } > > static struct drm_property_blob * > @@ -1742,6 +1757,9 @@ ilk_read_lut_10(const struct intel_crtc_state *crtc_state) > > static void ilk_read_luts(struct intel_crtc_state *crtc_state) > { > + if (!crtc_state->gamma_enable) > + return; We should check if ((crtc_state->csc_mode & CSC_POSITION_BEFORE_GAMMA) == 0) return; here so we don't read the hw degamma into the state gmama_lut. > + > if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) > crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state); > else > @@ -1788,6 +1806,9 @@ glk_read_lut_10(const struct intel_crtc_state *crtc_state, u32 prec_index) > > static void glk_read_luts(struct intel_crtc_state *crtc_state) > { > + if (!crtc_state->gamma_enable) > + return; > + > if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) > crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state); > else > -- > 2.23.0
diff --git a/drivers/gpu/drm/i915/display/intel_color.c b/drivers/gpu/drm/i915/display/intel_color.c index 9ab34902663e..8f02313a7fef 100644 --- a/drivers/gpu/drm/i915/display/intel_color.c +++ b/drivers/gpu/drm/i915/display/intel_color.c @@ -1613,6 +1613,9 @@ i9xx_read_lut_8(const struct intel_crtc_state *crtc_state) static void i9xx_read_luts(struct intel_crtc_state *crtc_state) { + if (!crtc_state->gamma_enable) + return; + crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state); } @@ -1659,6 +1662,9 @@ i965_read_lut_10p6(const struct intel_crtc_state *crtc_state) static void i965_read_luts(struct intel_crtc_state *crtc_state) { + if (!crtc_state->gamma_enable) + return; + if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state); else @@ -1701,10 +1707,19 @@ chv_read_cgm_lut(const struct intel_crtc_state *crtc_state) static void chv_read_luts(struct intel_crtc_state *crtc_state) { - if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) - crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state); - else + if (crtc_state->cgm_mode) { + if ((crtc_state->cgm_mode & CGM_PIPE_MODE_GAMMA) == 0) + return; + crtc_state->base.gamma_lut = chv_read_cgm_lut(crtc_state); + } + + if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) { + if (!crtc_state->gamma_enable) + return; + + crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state); + } } static struct drm_property_blob * @@ -1742,6 +1757,9 @@ ilk_read_lut_10(const struct intel_crtc_state *crtc_state) static void ilk_read_luts(struct intel_crtc_state *crtc_state) { + if (!crtc_state->gamma_enable) + return; + if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state); else @@ -1788,6 +1806,9 @@ glk_read_lut_10(const struct intel_crtc_state *crtc_state, u32 prec_index) static void glk_read_luts(struct intel_crtc_state *crtc_state) { + if (!crtc_state->gamma_enable) + return; + if (crtc_state->gamma_mode == GAMMA_MODE_MODE_8BIT) crtc_state->base.gamma_lut = i9xx_read_lut_8(crtc_state); else
Premature gamma lut prepration and loading which was getting reflected in first modeset causing different colors on screen during boot. Issue: In BIOS, gamma is disabled by default. However, legacy read_luts() was setting crtc_state->base.gamma_lut and gamma_lut was programmed with junk values which led to visual artifacts (different colored screens instead of usual black during boot). Fix: Calling read_luts() only when gamma is enabled which will happen after first modeset. This fix is independent from the revert 1b8588741fdc ("Revert "drm/i915/color: Extract icl_read_luts()"") and should fix different colors on screen in legacy platforms too. -Added gamma_enable checks inside read_luts() [Ville/Jani N] -Corrected gamma enable check for CHV [Ville] Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111809 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111885 Signed-off-by: Swati Sharma <swati2.sharma@intel.com> --- drivers/gpu/drm/i915/display/intel_color.c | 27 +++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-)