1From 9b58d2a3e97518b9dafefa445ee691608da5e25b Mon Sep 17 00:00:00 2001 2From: Jeffy Chen <jeffy.chen@rock-chips.com> 3Date: Wed, 27 Apr 2022 15:17:39 +0800 4Subject: [PATCH 64/93] backend-drm: Stop disabling unused CRTCs by default 5 6So that we can launch multiple weston instances for different monitors. 7 8Set env "WESTON_DRM_MASTER" to take charge of all CRTCs again. 9 10Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 11--- 12 libweston/backend-drm/drm-internal.h | 1 + 13 libweston/backend-drm/drm.c | 8 ++++++++ 14 libweston/backend-drm/kms.c | 7 ++++--- 15 3 files changed, 13 insertions(+), 3 deletions(-) 16 17diff --git a/libweston/backend-drm/drm-internal.h b/libweston/backend-drm/drm-internal.h 18index b7deeb0..46edbc6 100644 19--- a/libweston/backend-drm/drm-internal.h 20+++ b/libweston/backend-drm/drm-internal.h 21@@ -356,6 +356,7 @@ struct drm_backend { 22 int64_t last_resize_ms; 23 int64_t resize_freeze_ms; 24 25+ bool master; 26 bool single_head; 27 bool head_fallback; 28 bool head_fallback_all; 29diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c 30index 6083eb7..d8b8623 100644 31--- a/libweston/backend-drm/drm.c 32+++ b/libweston/backend-drm/drm.c 33@@ -2326,6 +2326,10 @@ drm_output_detach_crtc(struct drm_output *output) 34 35 crtc->output = NULL; 36 output->crtc = NULL; 37+ 38+ /* HACK: Do it here rather than in the kms.c for drm-master config */ 39+ drmModeSetCrtc(crtc->device->drm.fd, 40+ crtc->crtc_id, 0, 0, 0, NULL, 0, NULL); 41 } 42 43 static int 44@@ -4254,6 +4258,10 @@ drm_backend_create(struct weston_compositor *compositor, 45 if (b == NULL) 46 return NULL; 47 48+ buf = getenv("WESTON_DRM_MASTER"); 49+ if (buf && buf[0] == '1') 50+ b->master = true; 51+ 52 buf = getenv("WESTON_DRM_SINGLE_HEAD"); 53 if (buf && buf[0] == '1') 54 b->single_head = true; 55diff --git a/libweston/backend-drm/kms.c b/libweston/backend-drm/kms.c 56index 607bf70..38ecf68 100644 57--- a/libweston/backend-drm/kms.c 58+++ b/libweston/backend-drm/kms.c 59@@ -1217,7 +1217,7 @@ drm_pending_state_apply_atomic(struct drm_pending_state *pending_state, 60 break; 61 } 62 63- if (device->state_invalid) { 64+ if (device->state_invalid && b->master) { 65 struct weston_head *head_base; 66 struct drm_head *head; 67 struct drm_crtc *crtc; 68@@ -1417,7 +1417,7 @@ drm_pending_state_apply(struct drm_pending_state *pending_state) 69 return drm_pending_state_apply_atomic(pending_state, 70 DRM_STATE_APPLY_ASYNC); 71 72- if (device->state_invalid) { 73+ if (device->state_invalid && b->master) { 74 /* If we need to reset all our state (e.g. because we've 75 * just started, or just been VT-switched in), explicitly 76 * disable all the CRTCs we aren't using. This also disables 77@@ -1476,6 +1476,7 @@ int 78 drm_pending_state_apply_sync(struct drm_pending_state *pending_state) 79 { 80 struct drm_device *device = pending_state->device; 81+ struct drm_backend *b = device->backend; 82 struct drm_output_state *output_state, *tmp; 83 struct drm_crtc *crtc; 84 int has_error = 0; 85@@ -1484,7 +1485,7 @@ drm_pending_state_apply_sync(struct drm_pending_state *pending_state) 86 return drm_pending_state_apply_atomic(pending_state, 87 DRM_STATE_APPLY_SYNC); 88 89- if (device->state_invalid) { 90+ if (device->state_invalid && b->master) { 91 /* If we need to reset all our state (e.g. because we've 92 * just started, or just been VT-switched in), explicitly 93 * disable all the CRTCs we aren't using. This also disables 94-- 952.20.1 96 97