drm/i915: Assert {pre,post}_csc_lut were assigned sensibly
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Mon, 24 Oct 2022 16:15:12 +0000 (19:15 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 25 Oct 2022 22:37:58 +0000 (01:37 +0300)
Since we now have the extra step from hw.(de)gamma_lut into
{pre,post}_csc_lut let's make sure we didn't forget to assign
them appropriately. Ie. basically making sure intel_color_check()
was called when necessary (and that it did its job suitable well).

Reviewed-by: Uma Shankar <uma.shankar@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221024161514.5340-4-ville.syrjala@linux.intel.com
drivers/gpu/drm/i915/display/intel_color.c
drivers/gpu/drm/i915/display/intel_color.h
drivers/gpu/drm/i915/display/intel_display.c

index 2b37e3c..f1d207e 100644 (file)
@@ -1359,6 +1359,26 @@ static u32 i9xx_gamma_mode(struct intel_crtc_state *crtc_state)
                return GAMMA_MODE_MODE_10BIT; /* i965+ only */
 }
 
+void intel_color_assert_luts(const struct intel_crtc_state *crtc_state)
+{
+       struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
+
+       /* make sure {pre,post}_csc_lut were correctly assigned */
+       if (DISPLAY_VER(i915) >= 10 || HAS_GMCH(i915)) {
+               drm_WARN_ON(&i915->drm,
+                           crtc_state->pre_csc_lut != crtc_state->hw.degamma_lut);
+               drm_WARN_ON(&i915->drm,
+                           crtc_state->post_csc_lut != crtc_state->hw.gamma_lut);
+       } else {
+               drm_WARN_ON(&i915->drm,
+                           crtc_state->pre_csc_lut != crtc_state->hw.degamma_lut &&
+                           crtc_state->pre_csc_lut != crtc_state->hw.gamma_lut);
+               drm_WARN_ON(&i915->drm,
+                           crtc_state->post_csc_lut != crtc_state->hw.degamma_lut &&
+                           crtc_state->post_csc_lut != crtc_state->hw.gamma_lut);
+       }
+}
+
 static void intel_assign_luts(struct intel_crtc_state *crtc_state)
 {
        drm_property_replace_blob(&crtc_state->pre_csc_lut,
index 04984e6..e1d4239 100644 (file)
@@ -24,5 +24,6 @@ int intel_color_get_gamma_bit_precision(const struct intel_crtc_state *crtc_stat
 bool intel_color_lut_equal(struct drm_property_blob *blob1,
                           struct drm_property_blob *blob2,
                           u32 gamma_mode, u32 bit_precision);
+void intel_color_assert_luts(const struct intel_crtc_state *crtc_state);
 
 #endif /* __INTEL_COLOR_H__ */
index e7a72d1..1572a58 100644 (file)
@@ -6886,6 +6886,8 @@ static int intel_atomic_check(struct drm_device *dev,
 
        for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
                                            new_crtc_state, i) {
+               intel_color_assert_luts(new_crtc_state);
+
                ret = intel_async_flip_check_hw(state, crtc);
                if (ret)
                        goto fail;