1From fc3415733e84b0f9f635b793a0ab18d6fcb8a727 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 61/79] 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 | 7 +++++++ 14 libweston/backend-drm/kms.c | 6 +++--- 15 3 files changed, 11 insertions(+), 3 deletions(-) 16 17diff --git a/libweston/backend-drm/drm-internal.h b/libweston/backend-drm/drm-internal.h 18index 9543f1b..8035826 100644 19--- a/libweston/backend-drm/drm-internal.h 20+++ b/libweston/backend-drm/drm-internal.h 21@@ -340,6 +340,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 ff41669..ed28956 100644 31--- a/libweston/backend-drm/drm.c 32+++ b/libweston/backend-drm/drm.c 33@@ -2251,6 +2251,9 @@ drm_output_detach_crtc(struct drm_output *output) 34 /* Force resetting unused CRTCs */ 35 b->state_invalid = true; 36 output->state_invalid = true; 37+ 38+ /* HACK: Do it here rather than in the kms.c for drm-master config */ 39+ drmModeSetCrtc(b->drm.fd, crtc->crtc_id, 0, 0, 0, NULL, 0, NULL); 40 } 41 42 static int 43@@ -4120,6 +4123,10 @@ drm_backend_create(struct weston_compositor *compositor, 44 if (b == NULL) 45 return NULL; 46 47+ buf = getenv("WESTON_DRM_MASTER"); 48+ if (buf && buf[0] == '1') 49+ b->master = true; 50+ 51 buf = getenv("WESTON_DRM_SINGLE_HEAD"); 52 if (buf && buf[0] == '1') 53 b->single_head = true; 54diff --git a/libweston/backend-drm/kms.c b/libweston/backend-drm/kms.c 55index 82247fb..37da3f6 100644 56--- a/libweston/backend-drm/kms.c 57+++ b/libweston/backend-drm/kms.c 58@@ -1190,7 +1190,7 @@ drm_pending_state_apply_atomic(struct drm_pending_state *pending_state, 59 break; 60 } 61 62- if (b->state_invalid) { 63+ if (b->state_invalid && b->master) { 64 struct weston_head *head_base; 65 struct drm_head *head; 66 struct drm_crtc *crtc; 67@@ -1388,7 +1388,7 @@ drm_pending_state_apply(struct drm_pending_state *pending_state) 68 return drm_pending_state_apply_atomic(pending_state, 69 DRM_STATE_APPLY_ASYNC); 70 71- if (b->state_invalid) { 72+ if (b->state_invalid && b->master) { 73 /* If we need to reset all our state (e.g. because we've 74 * just started, or just been VT-switched in), explicitly 75 * disable all the CRTCs we aren't using. This also disables 76@@ -1455,7 +1455,7 @@ drm_pending_state_apply_sync(struct drm_pending_state *pending_state) 77 return drm_pending_state_apply_atomic(pending_state, 78 DRM_STATE_APPLY_SYNC); 79 80- if (b->state_invalid) { 81+ if (b->state_invalid && b->master) { 82 /* If we need to reset all our state (e.g. because we've 83 * just started, or just been VT-switched in), explicitly 84 * disable all the CRTCs we aren't using. This also disables 85-- 862.20.1 87 88