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