Received: by 2002:a05:6a10:a852:0:0:0:0 with SMTP id d18csp820516pxy; Wed, 5 May 2021 14:59:08 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxZmrN/RqzDx3dzzTd+Rtr9qRMPeaPnyXlw7oTok7h+E3VFCi3VSObNr/q/9sWeyvLQ5PmX X-Received: by 2002:a17:906:32d1:: with SMTP id k17mr917144ejk.94.1620251947826; Wed, 05 May 2021 14:59:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620251947; cv=none; d=google.com; s=arc-20160816; b=EBq9rKnq8NvV8XLKrqJ7KvcMJNIpSXIyrbOtJyOnf4UKP6XMNhXxwnkYMcwW+/6eay XwnvzG+XhEZ/dDoqk7JKpPba2jEb8do6QiePE/UNoNcoiSv9s/mOjVkl8kjZ071h2rVb fgx3QzNqOhNTBPa+7Va5e755lbeS1uTxKmJOFPEGFGVWRu4F8pRg8OkQTSD8N/qmDmiu pgFTku+zYcW4F4O8qjH6So9pQL5DDtVJxwG96h0RQ2iBXhZNZPfrmiddbvcuHxsZ/VkL bgab6lcE8BjTexGl46TDzw3g5au9QqLwiilP6/Q72i7QUS1Ig6ewZL4YYmsR9/dURJ7L iwTg== 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=YUzTF+Ip2gfonn3VrjIne3gefrR0JYOURBXjJADKyb8=; b=dSAx3qqO5jDq07uEnoNWwjr4nESGy+6X9KFcmm7B/ow6DDyOAoQABt3m4pAkEZNN7y a91fr7VVeWYdf/yRfCrdSftdm8SaTexSnCX9IuMJ59C5kTeQ3N6PLw47wIlpIi80m6js LQVr6HNNNr+7gqQZMIM1AALEgcO8/lsTTpHjoVEQN1P8Ux4n4Lyr/UpIu3/BS7ej3mUr SfuScboVokfz1PuVVININSOcIcBbMX1UwKTNawP4gPV/zujToxrdpRUZpF7BK0XE1R5l qhPKxa6dZtrFd73L1wI2zfxnWO4fpxWhc3dA+fwk6lLJSdmjct0po+6c2MnsiM1FsakJ gXKg== 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 v27si523079eja.157.2021.05.05.14.58.44; Wed, 05 May 2021 14:59:07 -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 S234465AbhEERyy (ORCPT + 99 others); Wed, 5 May 2021 13:54:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54582 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235196AbhEERxb (ORCPT ); Wed, 5 May 2021 13:53:31 -0400 Received: from srv6.fidu.org (srv6.fidu.org [IPv6:2a01:4f8:231:de0::2]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 442DCC07E5E9 for ; Wed, 5 May 2021 10:24:10 -0700 (PDT) Received: from localhost (localhost.localdomain [127.0.0.1]) by srv6.fidu.org (Postfix) with ESMTP id 9D63EC800B1; Wed, 5 May 2021 19:24:09 +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 I5elOUaPq9BT; Wed, 5 May 2021 19:24:09 +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 53CC3C800A8; Wed, 5 May 2021 19:24:09 +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 19:24:00 +0200 Message-Id: <20210505172401.1453178-3-wse@tuxedocomputers.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210505172401.1453178-1-wse@tuxedocomputers.com> References: <20210505172401.1453178-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 883678ef703b6bb15cd2883eb2c5ce27d07911d3 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..b0201d4f27eb 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 (pipe_config->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