From patchwork Mon Mar 6 10:46:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Ripard X-Patchwork-Id: 64596 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:5915:0:0:0:0:0 with SMTP id v21csp1769432wrd; Mon, 6 Mar 2023 02:53:45 -0800 (PST) X-Google-Smtp-Source: AK7set8QCsuaCkvPO0CaLofLLKCMlXHo3FlCZbZWz2+f+AICD8vz61Sc5sRWwLRRXgFJdLjuFxt1 X-Received: by 2002:aa7:c544:0:b0:4ab:cb8c:932b with SMTP id s4-20020aa7c544000000b004abcb8c932bmr8325811edr.40.1678100025374; Mon, 06 Mar 2023 02:53:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1678100025; cv=none; d=google.com; s=arc-20160816; b=kEAqavcea9igje6xYVnDFGo5cIAaZzvqQ3+DUl/Bkrq9+l7KFHW+wyEu41hNtoGKcL y/SW8hOk2itXjoF2XD/tJ5UQTwNag4Qo7F7GJ3sVSLINnVmffhCjVhj+4iEQnxEzP/cB CaPG8cM0u1mfwHr0coam4EYKwZC5CmwAtyrVPwxv3TqYOzjG9vKL9Sr2SmxiebKgQBs8 Gokk+vfFV/so8Cmv28mJ6NVuHryZ2xOEk1OwywXjV0pQHL2d5R5G46Zk2gF+NtjvhSSR 6SXzafNcYIoair5xyOvdviNUPtaHbbsxJF+dy3jnGGABGcfmF0aAI4+nHEJpBiH1JP9R XNdQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:in-reply-to:references:message-id :content-transfer-encoding:mime-version:subject:date:from :feedback-id:dkim-signature:dkim-signature; bh=B/Z+p1AK5jc8n7UUDbdl2pFRQGJ8lrqKYlGLcuSbBV8=; b=rYHP15E2fJrIquLj/h/gmhVuoKLbJC8QxZlMnkLQzUKg5GY8PRrAQxCpPa43V/+Gxx 6FuBZTCmnOP6zlB0Kk7CKX6a7pbZPh/APr2eIFR0HNarifAil6WLBRfGnDLM88PXO1Hc PlNGC6vVfZssEgj26g2O5cGHSytGC9hqc84/PiiKJEhHI6zafusFRlbN5i/b1WeuUAv2 fPTwNMpLJQAFK9WFPPLvvND/5qit8R8kaW/mLRqOm1+G8zoRK9R+8LCD+m94kOG4yAvC 8AGWLjZNZmGxKqumbxXs9RfkPU2cDiir2MsHrAlV8txaz1rkO4hUepQA1IKB1/fV02UB P8/g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@cerno.tech header.s=fm2 header.b=Ql3zfqpm; dkim=pass header.i=@messagingengine.com header.s=fm1 header.b=rLALT+cY; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=cerno.tech Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id e6-20020a170906044600b008d14edd754dsi7610773eja.405.2023.03.06.02.53.21; Mon, 06 Mar 2023 02:53:45 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@cerno.tech header.s=fm2 header.b=Ql3zfqpm; dkim=pass header.i=@messagingengine.com header.s=fm1 header.b=rLALT+cY; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=cerno.tech Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230044AbjCFKuP (ORCPT + 99 others); Mon, 6 Mar 2023 05:50:15 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58136 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229952AbjCFKtz (ORCPT ); Mon, 6 Mar 2023 05:49:55 -0500 Received: from out5-smtp.messagingengine.com (out5-smtp.messagingengine.com [66.111.4.29]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D24CF23312 for ; Mon, 6 Mar 2023 02:49:53 -0800 (PST) Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailout.nyi.internal (Postfix) with ESMTP id 3A8A65C0190; Mon, 6 Mar 2023 05:49:53 -0500 (EST) Received: from mailfrontend1 ([10.202.2.162]) by compute3.internal (MEProxy); Mon, 06 Mar 2023 05:49:53 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cerno.tech; h=cc :cc:content-transfer-encoding:content-type:content-type:date :date:from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:sender:subject:subject:to:to; s=fm2; t= 1678099793; x=1678186193; bh=B/Z+p1AK5jc8n7UUDbdl2pFRQGJ8lrqKYlG LcuSbBV8=; b=Ql3zfqpmtqzU/S6Z7gn7nL4ugeY8xvP5wgGlLbloGmI6bjjNU6/ +0wkoyAZyr3FjeEJrhG2lxpvru6NX5B5KDzAgH44hwnMtYGZHUA+TkfeU2AXaIa6 5W7j8aB+AYrt4fnDibye61N3ByXCH9A7zLQvrTtklm2nN/KsJAGb0eQmW17Pwiqg d+h01d/DJJojBXpc5cveisvG3gGwhRSotuefKWgSmiSUhGJmtsYEshjipx/Fqsdf vrMA7MfIMBmqIbt1m2l0E1MsidJCtBXCBg5P2Quq1CHclDSU7iVsLyeo1kZHD8lv gK6q0V4TSUDHBgy7UQsiO6aXjjlpKrZ+Xcw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:sender:subject:subject:to:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm1; t= 1678099793; x=1678186193; bh=B/Z+p1AK5jc8n7UUDbdl2pFRQGJ8lrqKYlG LcuSbBV8=; b=rLALT+cYPH597oWNX5B7cxkaDtN0Azvft/QrI02KdfwR/42+pt2 Md1LTiZGdtZrOrQ7OaQfXrzW5oIWV0Q0ic4pRi6cZzOMo4/vqxfsqqjO3p+INgI1 c69C9MAwKpeAGVRd/dB9zwY+KJNrhqhEVHoLZjRk3GimCKXqhj3G4YULHQ4SdA8R UooxoSCS2qoWOBrF0xTNYRUMcwu8QCAwq+P1LLPnQj5s6nZg5XXGIqx/KK9u1nkq 9ISO7RIt7pJGscXUupQlJU4hSbf95vEPTEyWg42BZjc/V3IiWrFUqHnkPeQJXomC msErEBHy+RTdU2UOBm3PZmJEZAl7kS6XI/g== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvhedrvddtiedgudelucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertdertdejnecuhfhrohhmpeforgig ihhmvgcutfhiphgrrhguuceomhgrgihimhgvsegtvghrnhhordhtvggthheqnecuggftrf grthhtvghrnhepvedvleeijeegvdekffehkeehieelhfeggfffheetkeeuledvtdeuffeh teeltdffnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomh epmhgrgihimhgvsegtvghrnhhordhtvggthh X-ME-Proxy: Feedback-ID: i8771445c:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 6 Mar 2023 05:49:52 -0500 (EST) From: Maxime Ripard Date: Mon, 06 Mar 2023 11:46:47 +0100 Subject: [PATCH v3 6/9] drm/vc4: hdmi: Rework the CSC matrices organization MIME-Version: 1.0 Message-Id: <20221207-rpi-hdmi-improvements-v3-6-bdd54f66884e@cerno.tech> References: <20221207-rpi-hdmi-improvements-v3-0-bdd54f66884e@cerno.tech> In-Reply-To: <20221207-rpi-hdmi-improvements-v3-0-bdd54f66884e@cerno.tech> To: Emma Anholt , Maxime Ripard , David Airlie , Daniel Vetter Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Dave Stevenson , Hans Verkuil , Maxime Ripard X-Mailer: b4 0.12.1 X-Developer-Signature: v=1; a=openpgp-sha256; l=5801; i=maxime@cerno.tech; h=from:subject:message-id; bh=rxeJvK6JSutlcyZ/g6klgHxw9zXFlnP7Vh4aySwW3nU=; b=owGbwMvMwCX2+D1vfrpE4FHG02pJDCmsR2YExfKEHXE8m63I+XXSBeZniz9ds+z2O7Ho2ov3wlev nyu+11HKwiDGxSArpsgSI2y+JO7UrNedbHzzYOawMoEMYeDiFICJ2Isx/Hd4zD3n50PW3Vy97sfKdV 68Od9gHb/HZZ11UxODXd3dR/8Z/oo09J2NTlc1OTjl3OQjwYtzz4uE5M5uYfun3HOR62rpTQ4A X-Developer-Key: i=maxime@cerno.tech; a=openpgp; fpr=BE5675C37E818C8B5764241C254BCFC56BF6CE8D X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW,SPF_HELO_PASS, SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1759615412579933179?= X-GMAIL-MSGID: =?utf-8?q?1759615412579933179?= From: Dave Stevenson The CSC matrices were stored as separate matrix for each colorspace, and if we wanted a limited or full RGB output. This created some gaps in our support and we would not always pick the relevant matrix. Let's rework our data structure to store one per colorspace, and then a matrix for limited range and one for full range. This makes us add a new matrix to support full range BT709 YUV output. Signed-off-by: Dave Stevenson Signed-off-by: Maxime Ripard --- drivers/gpu/drm/vc4/vc4_hdmi.c | 108 ++++++++++++++++++++++++----------------- 1 file changed, 63 insertions(+), 45 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index f051e501efe6..a3e0bf00e4c6 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -1204,52 +1204,72 @@ static void vc4_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, } /* - * If we need to output Full Range RGB, then use the unity matrix + * Matrices for (internal) RGB to RGB output. * - * [ 1 0 0 0] - * [ 0 1 0 0] - * [ 0 0 1 0] - * - * Matrix is signed 2p13 fixed point, with signed 9p6 offsets + * Matrices are signed 2p13 fixed point, with signed 9p6 offsets */ -static const u16 vc5_hdmi_csc_full_rgb_unity[3][4] = { - { 0x2000, 0x0000, 0x0000, 0x0000 }, - { 0x0000, 0x2000, 0x0000, 0x0000 }, - { 0x0000, 0x0000, 0x2000, 0x0000 }, +static const u16 vc5_hdmi_csc_full_rgb_to_rgb[2][3][4] = { + { + /* + * Full range - unity + * + * [ 1 0 0 0] + * [ 0 1 0 0] + * [ 0 0 1 0] + */ + { 0x2000, 0x0000, 0x0000, 0x0000 }, + { 0x0000, 0x2000, 0x0000, 0x0000 }, + { 0x0000, 0x0000, 0x2000, 0x0000 }, + }, + { + /* + * Limited range + * + * CEA VICs other than #1 require limited range RGB + * output unless overridden by an AVI infoframe. Apply a + * colorspace conversion to squash 0-255 down to 16-235. + * The matrix here is: + * + * [ 0.8594 0 0 16] + * [ 0 0.8594 0 16] + * [ 0 0 0.8594 16] + */ + { 0x1b80, 0x0000, 0x0000, 0x0400 }, + { 0x0000, 0x1b80, 0x0000, 0x0400 }, + { 0x0000, 0x0000, 0x1b80, 0x0400 }, + }, }; /* - * CEA VICs other than #1 require limited range RGB output unless - * overridden by an AVI infoframe. Apply a colorspace conversion to - * squash 0-255 down to 16-235. The matrix here is: - * - * [ 0.8594 0 0 16] - * [ 0 0.8594 0 16] - * [ 0 0 0.8594 16] - * - * Matrix is signed 2p13 fixed point, with signed 9p6 offsets - */ -static const u16 vc5_hdmi_csc_full_rgb_to_limited_rgb[3][4] = { - { 0x1b80, 0x0000, 0x0000, 0x0400 }, - { 0x0000, 0x1b80, 0x0000, 0x0400 }, - { 0x0000, 0x0000, 0x1b80, 0x0400 }, -}; - -/* - * Conversion between Full Range RGB and Limited Range YUV using the - * BT.709 Colorspace - * - * - * [ 0.181906 0.611804 0.061758 16 ] - * [ -0.100268 -0.337232 0.437500 128 ] - * [ 0.437500 -0.397386 -0.040114 128 ] + * Conversion between Full Range RGB and YUV using the BT.709 Colorspace * - * Matrix is signed 2p13 fixed point, with signed 9p6 offsets + * Matrices are signed 2p13 fixed point, with signed 9p6 offsets */ -static const u16 vc5_hdmi_csc_full_rgb_to_limited_bt709[3][4] = { - { 0x05d2, 0x1394, 0x01fa, 0x0400 }, - { 0xfccc, 0xf536, 0x0e00, 0x2000 }, - { 0x0e00, 0xf34a, 0xfeb8, 0x2000 }, +static const u16 vc5_hdmi_csc_full_rgb_to_yuv_bt709[2][3][4] = { + { + /* + * Full Range + * + * [ 0.212600 0.715200 0.072200 0 ] + * [ -0.114572 -0.385428 0.500000 128 ] + * [ 0.500000 -0.454153 -0.045847 128 ] + */ + { 0x06ce, 0x16e3, 0x024f, 0x0000 }, + { 0xfc56, 0xf3ac, 0x1000, 0x2000 }, + { 0x1000, 0xf179, 0xfe89, 0x2000 }, + }, + { + /* + * Limited Range + * + * [ 0.181906 0.611804 0.061758 16 ] + * [ -0.100268 -0.337232 0.437500 128 ] + * [ 0.437500 -0.397386 -0.040114 128 ] + */ + { 0x05d2, 0x1394, 0x01fa, 0x0400 }, + { 0xfccc, 0xf536, 0x0e00, 0x2000 }, + { 0x0e00, 0xf34a, 0xfeb8, 0x2000 }, + }, }; static void vc5_hdmi_set_csc_coeffs(struct vc4_hdmi *vc4_hdmi, @@ -1286,6 +1306,7 @@ static void vc5_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, struct drm_device *drm = vc4_hdmi->connector.dev; struct vc4_hdmi_connector_state *vc4_state = conn_state_to_vc4_hdmi_conn_state(state); + unsigned int lim_range = vc4_hdmi_is_full_range(vc4_hdmi, vc4_state) ? 0 : 1; unsigned long flags; u32 if_cfg = 0; u32 if_xbar = 0x543210; @@ -1302,7 +1323,7 @@ static void vc5_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, switch (vc4_state->output_format) { case VC4_HDMI_OUTPUT_YUV444: vc5_hdmi_set_csc_coeffs_swap(vc4_hdmi, - vc5_hdmi_csc_full_rgb_to_limited_bt709); + vc5_hdmi_csc_full_rgb_to_yuv_bt709[lim_range]); break; case VC4_HDMI_OUTPUT_YUV422: @@ -1317,16 +1338,13 @@ static void vc5_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, if_cfg |= VC4_SET_FIELD(VC5_DVP_HT_VEC_INTERFACE_CFG_SEL_422_FORMAT_422_LEGACY, VC5_DVP_HT_VEC_INTERFACE_CFG_SEL_422); - vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_limited_bt709); + vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_yuv_bt709[lim_range]); break; case VC4_HDMI_OUTPUT_RGB: if_xbar = 0x354021; - if (!vc4_hdmi_is_full_range(vc4_hdmi, vc4_state)) - vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_limited_rgb); - else - vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_unity); + vc5_hdmi_set_csc_coeffs(vc4_hdmi, vc5_hdmi_csc_full_rgb_to_rgb[lim_range]); break; default: