summaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorLyude Paul <lyude@redhat.com>2018-11-13 20:14:10 -0500
committerAdam Jackson <ajax@redhat.com>2019-02-20 14:23:03 -0500
commit4e12cba65682e97b056d8a8207189d4cf9c31862 (patch)
tree4d17c1167c625cf7ddf030426cc11f6a9e93c5ab /hw
parent652918e736bcc577e221184415dcf61c05ac7bfb (diff)
modesetting: Actually disable CRTCs in legacy mode
Believe it or not, somehow we've never done this in legacy mode! We currently simply change the DPMS property on the CRTC's output's respective DRM connector, but this means that we're just setting the CRTC as inactive-not disabled. From the perspective of the kernel, this means that any shared resources used by the CRTC are still in use. This can cause problems for drivers that are not yet fully atomic, despite using the atomic helpers internally. For instance: if CRTC-1 and CRTC-2 are still enabled and use shared resources within the kernel (an MST topology, for example), and then userspace tries to go enable CRTC-3 on the same topology this might suddenly fail if CRTC-3 needs the shared resources CRTC-1 and CRTC-2 are using. While I don't know of any situations in the mainline kernel that actually trigger this, future plans for reworking the atomic check of MST drivers are absolutely going to make this into a real issue (they already are in my WIP branches for the kernel). So: actually do the right thing here and disable CRTCs when they're not going to be used anymore, even in legacy mode. Signed-off-by: Lyude Paul <lyude@redhat.com> (cherry picked from commit 7a44e8d4007b9c3ca55a5cc3f5e98601565311c7)
Diffstat (limited to 'hw')
-rw-r--r--hw/xfree86/drivers/modesetting/drmmode_display.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c
index 9717d9d39..101d9613a 100644
--- a/hw/xfree86/drivers/modesetting/drmmode_display.c
+++ b/hw/xfree86/drivers/modesetting/drmmode_display.c
@@ -1354,13 +1354,19 @@ drmmode_crtc_dpms(xf86CrtcPtr crtc, int mode)
{
modesettingPtr ms = modesettingPTR(crtc->scrn);
drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private;
+ drmmode_ptr drmmode = drmmode_crtc->drmmode;
/* XXX Check if DPMS mode is already the right one */
drmmode_crtc->dpms_mode = mode;
- if (ms->atomic_modeset && mode != DPMSModeOn && !ms->pending_modeset)
- drmmode_crtc_disable(crtc);
+ if (ms->atomic_modeset) {
+ if (mode != DPMSModeOn && !ms->pending_modeset)
+ drmmode_crtc_disable(crtc);
+ } else if (crtc->enabled == FALSE) {
+ drmModeSetCrtc(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id,
+ 0, 0, 0, NULL, 0, NULL);
+ }
}
#ifdef GLAMOR_HAS_GBM