aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_display.c
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2012-07-02 15:54:27 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-09-06 01:59:42 -0400
commit0a91ca29215a41760cca03999498959d0e05d9b3 (patch)
tree48ef24cb35243dbb69c2d10fef3eb843f52bc2b3 /drivers/gpu/drm/i915/intel_display.c
parent24929352481f085c5f85d4d4cbc919ddf106d381 (diff)
drm/i915: check connector hw/sw state
Atm we can only check the connector state after a dpms call - while doing modeset with the copy&pasted crtc helper code things are too ill-defined for proper checking. But the idea is very much to call this check from the modeset code, too. v2: Fix dpms check and don't presume that if the hw isn't on that it must not be linked up with an encoder (it could simply be switched off with the dpms state). Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 8c8dbc90faf1..15e4a652dee6 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -3562,6 +3562,41 @@ void intel_encoder_dpms(struct intel_encoder *encoder, int mode)
3562 } 3562 }
3563} 3563}
3564 3564
3565/* Cross check the actual hw state with our own modeset state tracking (and it's
3566 * internal consistency). */
3567void intel_connector_check_state(struct intel_connector *connector)
3568{
3569 if (connector->get_hw_state(connector)) {
3570 struct intel_encoder *encoder = connector->encoder;
3571 struct drm_crtc *crtc;
3572 bool encoder_enabled;
3573 enum pipe pipe;
3574
3575 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
3576 connector->base.base.id,
3577 drm_get_connector_name(&connector->base));
3578
3579 WARN(connector->base.dpms == DRM_MODE_DPMS_OFF,
3580 "wrong connector dpms state\n");
3581 WARN(connector->base.encoder != &encoder->base,
3582 "active connector not linked to encoder\n");
3583 WARN(!encoder->connectors_active,
3584 "encoder->connectors_active not set\n");
3585
3586 encoder_enabled = encoder->get_hw_state(encoder, &pipe);
3587 WARN(!encoder_enabled, "encoder not enabled\n");
3588 if (WARN_ON(!encoder->base.crtc))
3589 return;
3590
3591 crtc = encoder->base.crtc;
3592
3593 WARN(!crtc->enabled, "crtc not enabled\n");
3594 WARN(!to_intel_crtc(crtc)->active, "crtc not active\n");
3595 WARN(pipe != to_intel_crtc(crtc)->pipe,
3596 "encoder active on the wrong pipe\n");
3597 }
3598}
3599
3565/* Even simpler default implementation, if there's really no special case to 3600/* Even simpler default implementation, if there's really no special case to
3566 * consider. */ 3601 * consider. */
3567void intel_connector_dpms(struct drm_connector *connector, int mode) 3602void intel_connector_dpms(struct drm_connector *connector, int mode)
@@ -3582,6 +3617,8 @@ void intel_connector_dpms(struct drm_connector *connector, int mode)
3582 intel_encoder_dpms(encoder, mode); 3617 intel_encoder_dpms(encoder, mode);
3583 else 3618 else
3584 encoder->connectors_active = false; 3619 encoder->connectors_active = false;
3620
3621 intel_connector_check_state(to_intel_connector(connector));
3585} 3622}
3586 3623
3587/* Simple connector->get_hw_state implementation for encoders that support only 3624/* Simple connector->get_hw_state implementation for encoders that support only