diff options
author | Maarten Lankhorst <maarten.lankhorst@linux.intel.com> | 2015-07-27 07:24:29 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2015-07-27 10:23:29 -0400 |
commit | 8c10342cb48f3140d9abeadcfd2fa6625d447282 (patch) | |
tree | 6c30fe623fad2bc59a866c48017c9f07bcc9b31c /drivers | |
parent | 9a69a9ac20f7f3435dd18019f902351c61a9ad1d (diff) |
drm/atomic: Update legacy DPMS state during modesets, v3.
This is required for DPMS to work correctly, during a modeset
the DPMS property should be turned off, unless the state is
crtc is made active in which case it should be set to DPMS on.
Changes since v1:
- Set DPMS to off when a connector is removed from a crtc too.
- Update the legacy dpms property too.
- Add an exception for the legacy dpms paths, it updates its own state.
Changes since v2:
- Do not preserve dpms property.
Cc: dri-devel@lists.freedesktop.org
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/drm_atomic_helper.c | 26 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 9 |
2 files changed, 21 insertions, 14 deletions
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index 57847ae8ce8c..0b475fae067d 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c | |||
@@ -660,15 +660,29 @@ drm_atomic_helper_update_legacy_modeset_state(struct drm_device *dev, | |||
660 | struct drm_crtc_state *old_crtc_state; | 660 | struct drm_crtc_state *old_crtc_state; |
661 | int i; | 661 | int i; |
662 | 662 | ||
663 | /* clear out existing links */ | 663 | /* clear out existing links and update dpms */ |
664 | for_each_connector_in_state(old_state, connector, old_conn_state, i) { | 664 | for_each_connector_in_state(old_state, connector, old_conn_state, i) { |
665 | if (!connector->encoder) | 665 | if (connector->encoder) { |
666 | continue; | 666 | WARN_ON(!connector->encoder->crtc); |
667 | |||
668 | connector->encoder->crtc = NULL; | ||
669 | connector->encoder = NULL; | ||
670 | } | ||
667 | 671 | ||
668 | WARN_ON(!connector->encoder->crtc); | 672 | crtc = connector->state->crtc; |
673 | if ((!crtc && old_conn_state->crtc) || | ||
674 | (crtc && drm_atomic_crtc_needs_modeset(crtc->state))) { | ||
675 | struct drm_property *dpms_prop = | ||
676 | dev->mode_config.dpms_property; | ||
677 | int mode = DRM_MODE_DPMS_OFF; | ||
669 | 678 | ||
670 | connector->encoder->crtc = NULL; | 679 | if (crtc && crtc->state->active) |
671 | connector->encoder = NULL; | 680 | mode = DRM_MODE_DPMS_ON; |
681 | |||
682 | connector->dpms = mode; | ||
683 | drm_object_property_set_value(&connector->base, | ||
684 | dpms_prop, mode); | ||
685 | } | ||
672 | } | 686 | } |
673 | 687 | ||
674 | /* set new links */ | 688 | /* set new links */ |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 13a6608be689..43b0f17ad1fa 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -12349,16 +12349,9 @@ intel_modeset_update_state(struct drm_atomic_state *state) | |||
12349 | continue; | 12349 | continue; |
12350 | 12350 | ||
12351 | if (crtc->state->active) { | 12351 | if (crtc->state->active) { |
12352 | struct drm_property *dpms_property = | ||
12353 | dev->mode_config.dpms_property; | ||
12354 | |||
12355 | connector->dpms = DRM_MODE_DPMS_ON; | ||
12356 | drm_object_property_set_value(&connector->base, dpms_property, DRM_MODE_DPMS_ON); | ||
12357 | |||
12358 | intel_encoder = to_intel_encoder(connector->encoder); | 12352 | intel_encoder = to_intel_encoder(connector->encoder); |
12359 | intel_encoder->connectors_active = true; | 12353 | intel_encoder->connectors_active = true; |
12360 | } else | 12354 | } |
12361 | connector->dpms = DRM_MODE_DPMS_OFF; | ||
12362 | } | 12355 | } |
12363 | } | 12356 | } |
12364 | 12357 | ||