Received: by 2002:a05:6a10:a852:0:0:0:0 with SMTP id d18csp733639pxy; Wed, 5 May 2021 12:27:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwa1xpQkQ5YxxhoDvSKADiw154t4+kdQ8p7gI54AUqBpAMRtqRfHOgorz4wINiZZxbx2Sc7 X-Received: by 2002:a17:906:4c82:: with SMTP id q2mr391684eju.80.1620242870719; Wed, 05 May 2021 12:27:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620242870; cv=none; d=google.com; s=arc-20160816; b=ML8IeRw+jAGjuPuodhyyKY7rdWIcQqmszIymBKQoItY7oOJJKjI0tF/P2mChmaE4rk 7n8aaRhXBsR22lAWIifv8vvnR/758qfy2qD8BNugCGeVbhNWnISlGBep/5rwFyqpN1uX 82SIlbd9P0vyvtToiEhbKZCwzAa07zzWzzaPLfKO5toQYcmu4xNMCwKnO0OGLZKw75Kf UD8u8SXqcKDs3V3GPUXcDCkwG2eBi8i9tvIZs5XseLFEcun6x/kNbwH3LOwX1zuSr/8d upZGKFHG6LD+Xo9xZiZzNgKqovLn7F1mdoQg+Uu4OFME+02UAaApGJSR0jcNxSDVr0md 9mWg== 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:to:from; bh=CbCxa8cxrQhmmyXgVw7meFJs71YEAUWDwjJdsAWkO6w=; b=MDnJHbfYC3YJB5wSaNMouA+rgKJE5jPVwgvFak9eBtXLYmWLj7BmAPHjvsaqhNYims OTKkSjP/m6v2/ex6zgtTIL371E7oG9djgAOp1+Oilx9bDpwDpFzQBLBD5o/01wR1mOgo jaWWiGhWiMf3vwN0L5v9ciw7sQTbrs7S1G38bqlt+B4xzklsgd6BCGolSjlVAKsJsGVr 6c/EG+zIG8cNtbmfXIG44CW2jgJY4E9GQZOOo1lHH+6cNgwIRWuYRk1ImlNJfa8mF6Hq /wUwE2+pSngEcsIDk+yKFU79GFCtS7LhyL4yhTj4AdWh6FNQ2Txk15ygyAMs1je36zsO bHiQ== 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 d18si225224ede.25.2021.05.05.12.27.21; Wed, 05 May 2021 12:27:50 -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 S233736AbhEEOL7 (ORCPT + 99 others); Wed, 5 May 2021 10:11:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33966 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233683AbhEEOLz (ORCPT ); Wed, 5 May 2021 10:11:55 -0400 Received: from srv6.fidu.org (srv6.fidu.org [IPv6:2a01:4f8:231:de0::2]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6C074C061574 for ; Wed, 5 May 2021 07:10:58 -0700 (PDT) Received: from localhost (localhost.localdomain [127.0.0.1]) by srv6.fidu.org (Postfix) with ESMTP id 5E622C800B5; Wed, 5 May 2021 16:10:56 +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 ve98rAr3URfw; Wed, 5 May 2021 16:10:56 +0200 (CEST) Received: from wsembach-tuxedo.fritz.box (p200300E37F39860005a4018A54F094b9.dip0.t-ipconnect.de [IPv6:2003:e3:7f39:8600:5a4:18a:54f0:94b9]) (Authenticated sender: wse@tuxedocomputers.com) by srv6.fidu.org (Postfix) with ESMTPA id 08B3EC800A8; Wed, 5 May 2021 16:10:56 +0200 (CEST) From: Werner Sembach To: wse@tuxedocomputers.com, 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 Subject: [PATCH 2/3] Restructure output format computation for better expandability Date: Wed, 5 May 2021 16:10:51 +0200 Message-Id: <20210505141052.3467-3-wse@tuxedocomputers.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210505141052.3467-1-wse@tuxedocomputers.com> References: <20210505141052.3467-1-wse@tuxedocomputers.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Couples the decission between RGB and YCbCr420 mode and the check if the port clock can archive the required frequency. Other checks and configuration steps that where previously done in between can also be done before or after. This allows for are cleaner implementation of retrying different color encodings. Slight change in behaviour: If YCbCr420 is not allowed but display is YCbCr420 only it no longer fails, but just prints an error and tries to fallback on RGB. Signed-off-by: Werner Sembach --- Imho an error message in when YCbCR420 not allowed meets YCbCr420 only can be a usefull bugfinding tool for cases of blackscreen on exotic configurations. I'm unsure if this should be a warning instead. From 50f0f396c3363dc05291d8a0873a9c9f23fa5b4b Mon Sep 17 00:00:00 2001 From: Werner Sembach Date: Mon, 3 May 2021 15:30:40 +0200 Subject: [PATCH 2/3] Restructure output format computation for better expandability --- drivers/gpu/drm/i915/display/intel_hdmi.c | 65 ++++++++++++----------- 1 file changed, 34 insertions(+), 31 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c index 576d3d910d06..2c3b545d5f24 100644 --- a/drivers/gpu/drm/i915/display/intel_hdmi.c +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c @@ -1999,29 +1999,6 @@ static bool hdmi_deep_color_possible(const struct intel_crtc_state *crtc_state, INTEL_OUTPUT_FORMAT_YCBCR420); } -static int -intel_hdmi_ycbcr420_config(struct intel_crtc_state *crtc_state, - const struct drm_connector_state *conn_state) -{ - struct drm_connector *connector = conn_state->connector; - struct drm_i915_private *i915 = to_i915(connector->dev); - const struct drm_display_mode *adjusted_mode = - &crtc_state->hw.adjusted_mode; - - if (!drm_mode_is_420_only(&connector->display_info, adjusted_mode)) - return 0; - - if (!connector->ycbcr_420_allowed) { - drm_err(&i915->drm, - "Platform doesn't support YCBCR420 output\n"); - return -EINVAL; - } - - crtc_state->output_format = INTEL_OUTPUT_FORMAT_YCBCR420; - - return intel_pch_panel_fitting(crtc_state, conn_state); -} - static int intel_hdmi_compute_bpc(struct intel_encoder *encoder, struct intel_crtc_state *crtc_state, int clock) @@ -2128,6 +2105,30 @@ static bool intel_hdmi_has_audio(struct intel_encoder *encoder, return intel_conn_state->force_audio == HDMI_AUDIO_ON; } +static int intel_hdmi_compute_output_format(struct intel_encoder *encoder, + struct intel_crtc_state *crtc_state, + const struct drm_connector_state *conn_state) +{ + struct drm_connector *connector = conn_state->connector; + struct drm_i915_private *i915 = to_i915(connector->dev); + const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; + int ret; + bool ycbcr_420_only; + + ycbcr_420_only = drm_mode_is_420_only(&connector->display_info, adjusted_mode); + if (connector->ycbcr_420_allowed && ycbcr_420_only) + crtc_state->output_format = INTEL_OUTPUT_FORMAT_YCBCR420; + else { + if (!connector->ycbcr_420_allowed && ycbcr_420_only) + drm_err(&i915->drm, "Display only supports YCbCr420 output, but connector does not allow it. Fallback to RGB, but this will likely fail.\n"); + crtc_state->output_format = INTEL_OUTPUT_FORMAT_RGB; + } + + ret = intel_hdmi_compute_clock(encoder, crtc_state); + + return ret; +} + int intel_hdmi_compute_config(struct intel_encoder *encoder, struct intel_crtc_state *pipe_config, struct drm_connector_state *conn_state) @@ -2152,23 +2153,25 @@ int intel_hdmi_compute_config(struct intel_encoder *encoder, if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) pipe_config->pixel_multiplier = 2; - ret = intel_hdmi_ycbcr420_config(pipe_config, conn_state); - if (ret) - return ret; - - pipe_config->limited_color_range = - intel_hdmi_limited_color_range(pipe_config, conn_state); - if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv)) pipe_config->has_pch_encoder = true; pipe_config->has_audio = intel_hdmi_has_audio(encoder, pipe_config, conn_state); - ret = intel_hdmi_compute_clock(encoder, pipe_config); + ret = intel_hdmi_compute_output_format(encoder, pipe_config, conn_state); if (ret) return ret; + if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420) { + ret = intel_pch_panel_fitting(pipe_config, conn_state); + if (ret) + return ret; + } + + pipe_config->limited_color_range = + intel_hdmi_limited_color_range(pipe_config, conn_state); + if (conn_state->picture_aspect_ratio) adjusted_mode->picture_aspect_ratio = conn_state->picture_aspect_ratio; -- 2.25.1