Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp110946pxj; Fri, 7 May 2021 05:02:09 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxTlS2nmbxpsoV8qJgbK1oP6mXONXCVnmJBSv72NwffyifhAY8RK377wXBa++S/Ts9ma8y5 X-Received: by 2002:a17:906:ce2b:: with SMTP id sd11mr9890157ejb.143.1620388929238; Fri, 07 May 2021 05:02:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620388929; cv=none; d=google.com; s=arc-20160816; b=YnD93USipJA7gkzGewphRtHw3x09yVM4P6sApV14Z7DP7K4OdfMWC6mW3Nw4DNIK9h 6A7qaO4daWaeTJK2jZC5eXohRdjrd8csi1Js0oygkuZzALSlkErPCIgHFmz5n/afVIZG 7o5RbeSXM+jQqhb7UjEFKNvAb6kfgqAUeLTEH2tApnpTrfuaFHWpsNKhAX5/hHBSaTAl FxUU1+ZcNqFW5XYqvVjSJBKqmFs9p+IO/LuRoM7s9mB00U+eLmMl6UL9kgOzAESEBgWX 2+1T5wmbDCMoWYBPNusjjkysJAWIEmo/W06a+C8w4Y5Wxueup0vqyQQenKaaYsrjbT8m zeRA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=0NnOOwQuxXWDRywEykqdHSgkTxKeEBz7Tf2bDX7SgX8=; b=Ym77IHgJpucGVZEDta4KpDbNkPRq6k9/TXQ7BeDOBGKlukG+kFSrvBRHJeY0lFBjN1 Oy/VfomFcLYoSsuRP1FfkAGEht/Ct0DJaL4uOEzA20oQVn4vS22fOCn3Rvoq2MR4xm8H nkCjvDASge5O+9nClgJaSVhx13sWUf4yjoD7zjqRfH2K4TTfPPQDjUGPbSikwj72zqMY T2MVXg/tMWLyvIVDql1/pomUOsM/4Dt5lVagnIY3Jm3VNIsaMdm8k3VvgouLGrVQujJ5 MadPxpFM3ktD3O8jy/Uiw7dAg9DceicxhUvKZGd4qSvgXPD2Lj2dEHnpU1QuIP2KkSV8 tvmg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id e22si5613412edu.575.2021.05.07.05.01.40; Fri, 07 May 2021 05:02:09 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236522AbhEGIuU (ORCPT + 99 others); Fri, 7 May 2021 04:50:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37548 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236481AbhEGIuP (ORCPT ); Fri, 7 May 2021 04:50:15 -0400 Received: from srv6.fidu.org (srv6.fidu.org [IPv6:2a01:4f8:231:de0::2]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 826F2C061574 for ; Fri, 7 May 2021 01:49:15 -0700 (PDT) Received: from localhost (localhost.localdomain [127.0.0.1]) by srv6.fidu.org (Postfix) with ESMTP id 1E384C800B2; Fri, 7 May 2021 10:49:14 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at srv6.fidu.org Received: from srv6.fidu.org ([127.0.0.1]) by localhost (srv6.fidu.org [127.0.0.1]) (amavisd-new, port 10026) with LMTP id xMR939HFgnDh; Fri, 7 May 2021 10:49:13 +0200 (CEST) Received: from wsembach-tuxedo.fritz.box (p200300E37f12F200FD3bB57523c33F70.dip0.t-ipconnect.de [IPv6:2003:e3:7f12:f200:fd3b:b575:23c3:3f70]) (Authenticated sender: wse@tuxedocomputers.com) by srv6.fidu.org (Postfix) with ESMTPA id CE809C800AA; Fri, 7 May 2021 10:49:13 +0200 (CEST) From: Werner Sembach To: ville.syrjala@linux.intel.com, airlied@linux.ie, daniel@ffwll.ch, intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Cc: Werner Sembach Subject: [PATCH v6 3/3] drm/i915/display: Use YCbCr420 as fallback when RGB fails Date: Fri, 7 May 2021 10:49:03 +0200 Message-Id: <20210507084903.28877-4-wse@tuxedocomputers.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210507084903.28877-1-wse@tuxedocomputers.com> References: <20210506172325.1995964-1-wse@tuxedocomputers.com> <20210507084903.28877-1-wse@tuxedocomputers.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When encoder validation of a display mode fails, retry with less bandwidth heavy YCbCr420 color mode, if available. This enables some HDMI 1.4 setups to support 4k60Hz output, which previously failed silently. AMDGPU had nearly the exact same issue. This problem description is therefore copied from my commit message of the AMDGPU patch. On some setups, while the monitor and the gpu support display modes with pixel clocks of up to 600MHz, the link encoder might not. This prevents YCbCr444 and RGB encoding for 4k60Hz, but YCbCr420 encoding might still be possible. However, which color mode is used is decided before the link encoder capabilities are checked. This patch fixes the problem by retrying to find a display mode with YCbCr420 enforced and using it, if it is valid. Signed-off-by: Werner Sembach --- drivers/gpu/drm/i915/display/intel_hdmi.c | 25 ++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c index 9f3da72dabee..3c4d7a3e0969 100644 --- a/drivers/gpu/drm/i915/display/intel_hdmi.c +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c @@ -1897,6 +1897,7 @@ intel_hdmi_mode_valid(struct drm_connector *connector, int clock = mode->clock; int max_dotclk = to_i915(connector->dev)->max_dotclk_freq; bool has_hdmi_sink = intel_has_hdmi_sink(hdmi, connector->state); + bool ycbcr_420_only; if (mode->flags & DRM_MODE_FLAG_DBLSCAN) return MODE_NO_DBLESCAN; @@ -1913,12 +1914,22 @@ intel_hdmi_mode_valid(struct drm_connector *connector, clock *= 2; } - if (drm_mode_is_420_only(&connector->display_info, mode)) + ycbcr_420_only = drm_mode_is_420_only(&connector->display_info, mode); + if (ycbcr_420_only) clock /= 2; status = intel_hdmi_mode_clock_valid(hdmi, clock, has_hdmi_sink); - if (status != MODE_OK) - return status; + if (status != MODE_OK) { + if (ycbcr_420_only || + !connector->ycbcr_420_allowed || + !drm_mode_is_420_also(&connector->display_info, mode)) + return status; + + clock /= 2; + status = intel_hdmi_mode_clock_valid(hdmi, clock, has_hdmi_sink); + if (status != MODE_OK) + return status; + } return intel_mode_valid_max_plane_size(dev_priv, mode, false); } @@ -2125,6 +2136,14 @@ static int intel_hdmi_compute_output_format(struct intel_encoder *encoder, } ret = intel_hdmi_compute_clock(encoder, crtc_state); + if (ret) { + if (crtc_state->output_format != INTEL_OUTPUT_FORMAT_YCBCR420 && + connector->ycbcr_420_allowed && + drm_mode_is_420_also(&connector->display_info, adjusted_mode)) { + crtc_state->output_format = INTEL_OUTPUT_FORMAT_YCBCR420; + ret = intel_hdmi_compute_clock(encoder, crtc_state); + } + } return ret; } -- 2.25.1