Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 372835a

Browse files
danvetairlied
authored andcommitted
drm/crtc-helper: explicit DPMS on after modeset
Atm the crtc helper implementation of set_config has really inconsisten semantics: If just an fb update is good enough, dpms state will be left as-is, but if we do a full modeset we force everything to dpms on. This change has already been applied to the i915 modeset code in commit e3de42b Author: Imre Deak <[email protected]> Date: Fri May 3 19:44:07 2013 +0200 drm/i915: force full modeset if the connector is in DPMS OFF mode which according to Greg KH seems to aim for a new record in most Bugzilla: links in a commit message. The history of this dpms forcing is pretty interesting. This patch here is an almost-revert of commit 811aaa5 Author: Keith Packard <[email protected]> Date: Thu Feb 3 16:57:28 2011 -0800 drm: Only set DPMS ON when actually configuring a mode which fixed the bug of trying to dpms on disabled outputs, but introduced the new discrepancy between an fb update only and full modesets. The actual introduction of this goes back to commit bf9dc10 Author: Keith Packard <[email protected]> Date: Fri Nov 26 10:45:58 2010 -0800 drm: Set connector DPMS status to ON in drm_crtc_helper_set_config And if you'd dig around in the i915 driver code there's even more fun around forcing dpms on and losing our heads and temper of the resulting inconsistencies. Especially the DP re-training code had tons of funny stuff in it. Signed-off-by: Daniel Vetter <[email protected]> Signed-off-by: Dave Airlie <[email protected]>
1 parent cbdfebc commit 372835a

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

drivers/gpu/drm/drm_crtc_helper.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -754,12 +754,6 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
754754
ret = -EINVAL;
755755
goto fail;
756756
}
757-
DRM_DEBUG_KMS("Setting connector DPMS state to on\n");
758-
for (i = 0; i < set->num_connectors; i++) {
759-
DRM_DEBUG_KMS("\t[CONNECTOR:%d:%s] set DPMS on\n", set->connectors[i]->base.id,
760-
drm_get_connector_name(set->connectors[i]));
761-
set->connectors[i]->funcs->dpms(set->connectors[i], DRM_MODE_DPMS_ON);
762-
}
763757
}
764758
drm_helper_disable_unused_functions(dev);
765759
} else if (fb_changed) {
@@ -777,6 +771,22 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
777771
}
778772
}
779773

774+
/*
775+
* crtc set_config helpers implicit set the crtc and all connected
776+
* encoders to DPMS on for a full mode set. But for just an fb update it
777+
* doesn't do that. To not confuse userspace, do an explicit DPMS_ON
778+
* unconditionally. This will also ensure driver internal dpms state is
779+
* consistent again.
780+
*/
781+
if (set->crtc->enabled) {
782+
DRM_DEBUG_KMS("Setting connector DPMS state to on\n");
783+
for (i = 0; i < set->num_connectors; i++) {
784+
DRM_DEBUG_KMS("\t[CONNECTOR:%d:%s] set DPMS on\n", set->connectors[i]->base.id,
785+
drm_get_connector_name(set->connectors[i]));
786+
set->connectors[i]->funcs->dpms(set->connectors[i], DRM_MODE_DPMS_ON);
787+
}
788+
}
789+
780790
kfree(save_connectors);
781791
kfree(save_encoders);
782792
kfree(save_crtcs);

0 commit comments

Comments
 (0)