1*4882a593SmuzhiyunFrom af6bc7c09802c8f8b603cdd72881f07f729e85c6 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com>
3*4882a593SmuzhiyunDate: Wed, 21 Oct 2020 15:27:38 +0800
4*4882a593SmuzhiyunSubject: [PATCH 36/95] backend-drm: Support setting interlaced mode
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunTested with:
7*4882a593Smuzhiyunecho "output:HDMI-A-1:mode=1920x1080i" > /tmp/.weston_drm.conf
8*4882a593Smuzhiyun> Output HDMI-A-1 changed to 1920x1080i@60 for mode(1920x1080i)
9*4882a593Smuzhiyun
10*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
11*4882a593Smuzhiyun---
12*4882a593Smuzhiyun libweston/backend-drm/drm.c   |  4 ++--
13*4882a593Smuzhiyun libweston/backend-drm/modes.c | 25 +++++++++++++++----------
14*4882a593Smuzhiyun 2 files changed, 17 insertions(+), 12 deletions(-)
15*4882a593Smuzhiyun
16*4882a593Smuzhiyundiff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c
17*4882a593Smuzhiyunindex 9d4354d..7760205 100644
18*4882a593Smuzhiyun--- a/libweston/backend-drm/drm.c
19*4882a593Smuzhiyun+++ b/libweston/backend-drm/drm.c
20*4882a593Smuzhiyun@@ -3711,9 +3711,9 @@ drm_output_modeset(struct drm_output *output, const char *modeline)
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun 	mode = to_drm_mode(output->base.current_mode);
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun-	weston_log("Output %s changed to %dx%d@%d for mode(%s)\n",
25*4882a593Smuzhiyun+	weston_log("Output %s changed to %s@%d for mode(%s)\n",
26*4882a593Smuzhiyun 		   output->base.name,
27*4882a593Smuzhiyun-		   mode->mode_info.hdisplay, mode->mode_info.vdisplay,
28*4882a593Smuzhiyun+		   mode->mode_info.name,
29*4882a593Smuzhiyun 		   mode->mode_info.vrefresh,
30*4882a593Smuzhiyun 		   modeline);
31*4882a593Smuzhiyun
32*4882a593Smuzhiyundiff --git a/libweston/backend-drm/modes.c b/libweston/backend-drm/modes.c
33*4882a593Smuzhiyunindex f3d2c00..8bf6be8 100644
34*4882a593Smuzhiyun--- a/libweston/backend-drm/modes.c
35*4882a593Smuzhiyun+++ b/libweston/backend-drm/modes.c
36*4882a593Smuzhiyun@@ -470,9 +470,8 @@ drm_output_print_modes(struct drm_output *output)
37*4882a593Smuzhiyun 		dm = to_drm_mode(m);
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun 		aspect_ratio = aspect_ratio_to_string(m->aspect_ratio);
40*4882a593Smuzhiyun-		weston_log_continue(STAMP_SPACE "%dx%d@%.1f%s%s%s, %.1f MHz\n",
41*4882a593Smuzhiyun-				    dm->mode_info.hdisplay,
42*4882a593Smuzhiyun-				    dm->mode_info.vdisplay,
43*4882a593Smuzhiyun+		weston_log_continue(STAMP_SPACE "%s@%.1f%s%s%s, %.1f MHz\n",
44*4882a593Smuzhiyun+				    dm->mode_info.name,
45*4882a593Smuzhiyun 				    m->refresh / 1000.0,
46*4882a593Smuzhiyun 				    aspect_ratio,
47*4882a593Smuzhiyun 				    m->flags & WL_OUTPUT_MODE_PREFERRED ?
48*4882a593Smuzhiyun@@ -515,11 +514,15 @@ drm_output_choose_mode(struct drm_output *output,
49*4882a593Smuzhiyun 	enum weston_mode_aspect_ratio target_aspect = WESTON_MODE_PIC_AR_NONE;
50*4882a593Smuzhiyun 	struct drm_device *device;
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun+#define WESTON_MODE_NAME(mode) \
53*4882a593Smuzhiyun+	to_drm_mode(mode)->mode_info.name
54*4882a593Smuzhiyun+
55*4882a593Smuzhiyun 	device = output->device;
56*4882a593Smuzhiyun+
57*4882a593Smuzhiyun 	target_aspect = target_mode->aspect_ratio;
58*4882a593Smuzhiyun 	src_aspect = output->base.current_mode->aspect_ratio;
59*4882a593Smuzhiyun-	if (output->base.current_mode->width == target_mode->width &&
60*4882a593Smuzhiyun-	    output->base.current_mode->height == target_mode->height &&
61*4882a593Smuzhiyun+	if (!strcmp(WESTON_MODE_NAME(output->base.current_mode),
62*4882a593Smuzhiyun+		    WESTON_MODE_NAME(target_mode)) &&
63*4882a593Smuzhiyun 	    (output->base.current_mode->refresh == target_mode->refresh ||
64*4882a593Smuzhiyun 	     target_mode->refresh == 0)) {
65*4882a593Smuzhiyun 		if (!device->aspect_ratio_supported || src_aspect == target_aspect)
66*4882a593Smuzhiyun@@ -529,8 +532,8 @@ drm_output_choose_mode(struct drm_output *output,
67*4882a593Smuzhiyun 	wl_list_for_each(mode, &output->base.mode_list, base.link) {
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun 		src_aspect = mode->base.aspect_ratio;
70*4882a593Smuzhiyun-		if (mode->mode_info.hdisplay == target_mode->width &&
71*4882a593Smuzhiyun-		    mode->mode_info.vdisplay == target_mode->height) {
72*4882a593Smuzhiyun+		if (!strcmp(mode->mode_info.name,
73*4882a593Smuzhiyun+			    WESTON_MODE_NAME(target_mode))) {
74*4882a593Smuzhiyun 			if (mode->base.refresh == target_mode->refresh ||
75*4882a593Smuzhiyun 			    target_mode->refresh == 0) {
76*4882a593Smuzhiyun 				if (!device->aspect_ratio_supported ||
77*4882a593Smuzhiyun@@ -607,6 +610,7 @@ drm_output_choose_initial_mode(struct drm_device *device,
78*4882a593Smuzhiyun 	struct drm_mode *best = NULL;
79*4882a593Smuzhiyun 	struct drm_mode *drm_mode;
80*4882a593Smuzhiyun 	drmModeModeInfo drm_modeline;
81*4882a593Smuzhiyun+	char name[16] = {0};
82*4882a593Smuzhiyun 	int32_t width = 0;
83*4882a593Smuzhiyun 	int32_t height = 0;
84*4882a593Smuzhiyun 	uint32_t refresh = 0;
85*4882a593Smuzhiyun@@ -616,7 +620,9 @@ drm_output_choose_initial_mode(struct drm_device *device,
86*4882a593Smuzhiyun 	int n;
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun 	if (mode == WESTON_DRM_BACKEND_OUTPUT_PREFERRED && modeline) {
89*4882a593Smuzhiyun-		n = sscanf(modeline, "%dx%d@%d %u:%u", &width, &height,
90*4882a593Smuzhiyun+		sscanf(modeline, "%12[^@pP]", name);
91*4882a593Smuzhiyun+
92*4882a593Smuzhiyun+		n = sscanf(modeline, "%dx%d%*[^0-9]%d %u:%u", &width, &height,
93*4882a593Smuzhiyun 			   &refresh, &aspect_width, &aspect_height);
94*4882a593Smuzhiyun 		if (device->aspect_ratio_supported && n == 5) {
95*4882a593Smuzhiyun 			if (aspect_width == 4 && aspect_height == 3)
96*4882a593Smuzhiyun@@ -646,8 +652,7 @@ drm_output_choose_initial_mode(struct drm_device *device,
97*4882a593Smuzhiyun 	}
98*4882a593Smuzhiyun
99*4882a593Smuzhiyun 	wl_list_for_each_reverse(drm_mode, &output->base.mode_list, base.link) {
100*4882a593Smuzhiyun-		if (width == drm_mode->mode_info.hdisplay &&
101*4882a593Smuzhiyun-		    height == drm_mode->mode_info.vdisplay &&
102*4882a593Smuzhiyun+		if (!strcmp(name, drm_mode->mode_info.name) &&
103*4882a593Smuzhiyun 		    (refresh == 0 || refresh == drm_mode->mode_info.vrefresh)) {
104*4882a593Smuzhiyun 			if (!device->aspect_ratio_supported ||
105*4882a593Smuzhiyun 			    aspect_ratio == drm_mode->base.aspect_ratio)
106*4882a593Smuzhiyun--
107*4882a593Smuzhiyun2.20.1
108*4882a593Smuzhiyun
109