drm/i915: Fix state checker hw.active/hw.enable readout
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 25 Sep 2020 13:16:48 +0000 (16:16 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Mon, 28 Sep 2020 15:09:28 +0000 (18:09 +0300)
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.

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>
Link: https://patchwork.freedesktop.org/patch/msgid/20200925131656.10022-2-ville.syrjala@linux.intel.com
drivers/gpu/drm/i915/display/intel_display.c

index 13a27fe..aabb8de 100644 (file)
@@ -14359,7 +14359,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);
@@ -14369,16 +14368,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 "
@@ -14387,6 +14389,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,