From nobody Thu Oct 2 11:50:24 2025 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B23BC22538F for ; Thu, 18 Sep 2025 00:45:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758156307; cv=none; b=B3+B5PCnyl8d5BqJfpK7LYhcIplnIorYr4QMTgcGP5Tlrkt7vd+fHiTSLfQzrlqH124wbFf97M1CAix9d7QVLjthi6Ri0ncYAWwt37eDQkLdI35uFWwIm22uNW5mlrNAP9C1qTPj4kOoITfAowpPUMSv4Hb2RnDsAfUXN1FUTIU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758156307; c=relaxed/simple; bh=j3U9J/2Ej2pHU8qyUmtkJPRuO6ci5vYx0VpT+YfnlzY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ubSPltQzpn75VVAa8DRLXEp3qkFmx/jHwZPI6VfvTo1t2c+VGjn4HG4Ss8Z6A68s5jqWVr5ZZe+xKGu/rZK67UPeaSJ3Ynb5nbBGN55i2hw+lJiVUxq9XDwtH7OO1mBGPuKuTToJsQdnsdUujLX6KFAzULuMYlthYHjsfwZI1q4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=pyLmeSd+; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="pyLmeSd+" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1758156304; bh=j3U9J/2Ej2pHU8qyUmtkJPRuO6ci5vYx0VpT+YfnlzY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=pyLmeSd+ckdVSyW2+dyAKmPcEdWN0Fi0UEWOX3+lSXNPk6K6WmtpkWuTCrp7YA79+ 3Vd/+PckVqxIlhmz+mvTZVltDNqSSDucknPHbWJ5nl8sayOiT8AfhHIkuxOHxgBX48 V8aGj3/PMGhyl1Y18HSRhqB5smuNW7GiBx4e17LICz1VmOH+24sOBx+gvaZDPcjlrj X//dRPAOMXMvH2RIR/dVkvfIdQI2xRjCNgBdRgIF508KY+OkATVSRt4o1IckRV+QSy ZHCxtYmhii7FXJjHyDumpoVJzuEQIvQecYXYayI+iNcCvNwuol4gd8k7Ep2YGDgbMN CdV1AMLzAWzwA== Received: from [127.0.1.1] (unknown [IPv6:2600:4041:5b1a:9400:62f0:406e:ac79:4a96]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: nfraprado) by bali.collaboradmins.com (Postfix) with ESMTPSA id 02D7217E0DC2; Thu, 18 Sep 2025 02:44:57 +0200 (CEST) From: =?utf-8?q?N=C3=ADcolas_F=2E_R=2E_A=2E_Prado?= Date: Wed, 17 Sep 2025 20:43:23 -0400 Subject: [PATCH RFC v2 14/20] drm/mediatek: ccorr: Support post-blend color pipeline API Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250917-mtk-post-blend-color-pipeline-v2-14-ac4471b44758@collabora.com> References: <20250917-mtk-post-blend-color-pipeline-v2-0-ac4471b44758@collabora.com> In-Reply-To: <20250917-mtk-post-blend-color-pipeline-v2-0-ac4471b44758@collabora.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Chun-Kuang Hu , Philipp Zabel , Matthias Brugger , AngeloGioacchino Del Regno , Haneen Mohammed , Melissa Wen Cc: Alex Hung , wayland-devel@lists.freedesktop.org, harry.wentland@amd.com, leo.liu@amd.com, ville.syrjala@linux.intel.com, pekka.paalanen@collabora.com, contact@emersion.fr, mwen@igalia.com, jadahl@redhat.com, sebastian.wick@redhat.com, shashank.sharma@amd.com, agoins@nvidia.com, joshua@froggi.es, mdaenzer@redhat.com, aleixpol@kde.org, xaver.hugl@gmail.com, victoria@system76.com, uma.shankar@intel.com, quic_naseer@quicinc.com, quic_cbraga@quicinc.com, quic_abhinavk@quicinc.com, marcan@marcan.st, Liviu.Dudau@arm.com, sashamcintosh@google.com, chaitanya.kumar.borah@intel.com, louis.chauvet@bootlin.com, mcanal@igalia.com, kernel@collabora.com, daniels@collabora.com, leandro.ribeiro@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org, linux-arm-kernel@lists.infradead.org, =?utf-8?q?N=C3=ADcolas_F=2E_R=2E_A=2E_Prado?= , Simona Vetter X-Mailer: b4 0.14.2 Implement the ctm_set_color_pipeline DDP component function to allow configuring the CTM through the color pipeline API. The color pipeline API only defines a 3x4 matrix, while the driver currently only supports setting the coefficients for a 3x3 matrix. However the underlying hardware does support setting the offset coefficients that make up a 3x4 matrix, so implement support for setting them so the 3x4 matrix structure for the API can be used as is. Also make sure to enable or disable the CTM function depending on whether the block should be bypassed or not. Signed-off-by: N=C3=ADcolas F. R. A. Prado --- drivers/gpu/drm/mediatek/mtk_ddp_comp.c | 3 +- drivers/gpu/drm/mediatek/mtk_disp_ccorr.c | 100 ++++++++++++++++++++++++++= ---- drivers/gpu/drm/mediatek/mtk_disp_drv.h | 3 +- 3 files changed, 93 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c b/drivers/gpu/drm/medi= atek/mtk_ddp_comp.c index ac6620e10262e3b9a4a82093f13c3101f79520de..c873b527423f51733058cbc3d0a= d2a719e26bfe1 100644 --- a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c +++ b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c @@ -284,7 +284,8 @@ static const struct mtk_ddp_comp_funcs ddp_ccorr =3D { .config =3D mtk_ccorr_config, .start =3D mtk_ccorr_start, .stop =3D mtk_ccorr_stop, - .ctm_set =3D mtk_ccorr_ctm_set, + .ctm_set =3D mtk_ccorr_ctm_set_legacy, + .ctm_set_color_pipeline =3D mtk_ccorr_ctm_set_color_pipeline, }; =20 static const struct mtk_ddp_comp_funcs ddp_color =3D { diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ccorr.c b/drivers/gpu/drm/me= diatek/mtk_disp_ccorr.c index 10d60d2c2a568ebbe09f90e8f42a73e4c2366662..f69a7d8b97f741f0c5461e8cd6f= 38f70b0690e7e 100644 --- a/drivers/gpu/drm/mediatek/mtk_disp_ccorr.c +++ b/drivers/gpu/drm/mediatek/mtk_disp_ccorr.c @@ -28,6 +28,11 @@ #define DISP_CCORR_COEF_2 0x0088 #define DISP_CCORR_COEF_3 0x008C #define DISP_CCORR_COEF_4 0x0090 +#define DISP_CCORR_OFFSET_0 0x0100 +#define CCORR_OFFSET_EN BIT(31) +#define DISP_CCORR_OFFSET_1 0x0104 +#define DISP_CCORR_OFFSET_2 0x0108 +#define DISP_CCORR_OFFSET_MASK GENMASK(26, 14) =20 struct mtk_disp_ccorr_data { u32 matrix_bits; @@ -101,25 +106,48 @@ static u16 mtk_ctm_s31_32_to_s1_n(u64 in, u32 n) return r; } =20 -void mtk_ccorr_ctm_set(struct device *dev, struct drm_crtc_state *state) +static void mtk_ccorr_ctm_set(struct device *dev, struct cmdq_pkt *cmdq_pk= t, + void *ctm, bool ctm_3x4) { struct mtk_disp_ccorr *ccorr =3D dev_get_drvdata(dev); - struct drm_property_blob *blob =3D state->ctm; - struct drm_color_ctm *ctm; - const u64 *input; + u64 coeffs_in[9]; + u64 coeffs_offset_in[3]; uint16_t coeffs[9] =3D { 0 }; + uint16_t coeffs_offset[3]; int i; - struct cmdq_pkt *cmdq_pkt =3D NULL; u32 matrix_bits =3D ccorr->data->matrix_bits; + u32 val; + + if (ctm_3x4) { + struct drm_color_ctm_3x4 *ctm_3x4 =3D (struct drm_color_ctm_3x4 *)ctm; + + coeffs_in[0] =3D ctm_3x4->matrix[0]; + coeffs_in[1] =3D ctm_3x4->matrix[1]; + coeffs_in[2] =3D ctm_3x4->matrix[2]; + coeffs_in[3] =3D ctm_3x4->matrix[4]; + coeffs_in[4] =3D ctm_3x4->matrix[5]; + coeffs_in[5] =3D ctm_3x4->matrix[6]; + coeffs_in[6] =3D ctm_3x4->matrix[8]; + coeffs_in[7] =3D ctm_3x4->matrix[9]; + coeffs_in[8] =3D ctm_3x4->matrix[10]; + + coeffs_offset_in[0] =3D ctm_3x4->matrix[3]; + coeffs_offset_in[1] =3D ctm_3x4->matrix[7]; + coeffs_offset_in[2] =3D ctm_3x4->matrix[11]; + } else { + struct drm_color_ctm *ctm_3x3 =3D (struct drm_color_ctm *)ctm; =20 - if (!blob) - return; - - ctm =3D (struct drm_color_ctm *)blob->data; - input =3D ctm->matrix; + for (i =3D 0; i < ARRAY_SIZE(coeffs_in); i++) + coeffs_in[i] =3D ctm_3x3->matrix[i]; + } =20 for (i =3D 0; i < ARRAY_SIZE(coeffs); i++) - coeffs[i] =3D mtk_ctm_s31_32_to_s1_n(input[i], matrix_bits); + coeffs[i] =3D mtk_ctm_s31_32_to_s1_n(coeffs_in[i], matrix_bits); + + if (ctm_3x4) { + for (i =3D 0; i < ARRAY_SIZE(coeffs_offset); i++) + coeffs_offset[i] =3D mtk_ctm_s31_32_to_s1_n(coeffs_offset_in[i], matrix= _bits); + } =20 mtk_ddp_write(cmdq_pkt, coeffs[0] << 16 | coeffs[1], &ccorr->cmdq_reg, ccorr->regs, DISP_CCORR_COEF_0); @@ -131,6 +159,56 @@ void mtk_ccorr_ctm_set(struct device *dev, struct drm_= crtc_state *state) &ccorr->cmdq_reg, ccorr->regs, DISP_CCORR_COEF_3); mtk_ddp_write(cmdq_pkt, coeffs[8] << 16, &ccorr->cmdq_reg, ccorr->regs, DISP_CCORR_COEF_4); + + if (ctm_3x4) { + val =3D CCORR_OFFSET_EN; + val |=3D FIELD_PREP(DISP_CCORR_OFFSET_MASK, coeffs_offset[0]); + mtk_ddp_write(cmdq_pkt, val, &ccorr->cmdq_reg, + ccorr->regs, DISP_CCORR_OFFSET_0); + val =3D FIELD_PREP(DISP_CCORR_OFFSET_MASK, coeffs_offset[1]); + mtk_ddp_write(cmdq_pkt, val, &ccorr->cmdq_reg, + ccorr->regs, DISP_CCORR_OFFSET_1); + val =3D FIELD_PREP(DISP_CCORR_OFFSET_MASK, coeffs_offset[2]); + mtk_ddp_write(cmdq_pkt, val, &ccorr->cmdq_reg, + ccorr->regs, DISP_CCORR_OFFSET_2); + } else { + mtk_ddp_write_mask(cmdq_pkt, 0, &ccorr->cmdq_reg, + ccorr->regs, DISP_CCORR_OFFSET_0, + CCORR_OFFSET_EN); + } + + mtk_ddp_write(cmdq_pkt, CCORR_ENGINE_EN, &ccorr->cmdq_reg, + ccorr->regs, DISP_CCORR_CFG); +} + +void mtk_ccorr_ctm_set_legacy(struct device *dev, struct drm_crtc_state *s= tate) +{ + struct drm_property_blob *blob =3D state->ctm; + struct cmdq_pkt *cmdq_pkt =3D NULL; + struct drm_color_ctm *ctm; + + if (!blob) + return; + + ctm =3D (struct drm_color_ctm *)blob->data; + + mtk_ccorr_ctm_set(dev, cmdq_pkt, ctm, false); +} + +void mtk_ccorr_ctm_set_color_pipeline(struct device *dev, struct drm_color= _ctm_3x4 *ctm) +{ + struct mtk_disp_ccorr *ccorr =3D dev_get_drvdata(dev); + struct cmdq_pkt *cmdq_pkt =3D NULL; + + /* Configure block to be bypassed */ + if (!ctm) { + mtk_ddp_write_mask(cmdq_pkt, CCORR_RELAY_MODE, &ccorr->cmdq_reg, + ccorr->regs, DISP_CCORR_CFG, + CCORR_RELAY_MODE | CCORR_ENGINE_EN); + return; + } + + mtk_ccorr_ctm_set(dev, cmdq_pkt, ctm, true); } =20 static int mtk_disp_ccorr_bind(struct device *dev, struct device *master, diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/medi= atek/mtk_disp_drv.h index 679d413bf10be1e2fc4804a60a3fbe5d734614f6..ac84cf579150fd0535c79f43ad5= 942f8d412d450 100644 --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h @@ -22,7 +22,8 @@ void mtk_aal_gamma_set(struct device *dev, struct drm_crt= c_state *state); void mtk_aal_start(struct device *dev); void mtk_aal_stop(struct device *dev); =20 -void mtk_ccorr_ctm_set(struct device *dev, struct drm_crtc_state *state); +void mtk_ccorr_ctm_set_legacy(struct device *dev, struct drm_crtc_state *s= tate); +void mtk_ccorr_ctm_set_color_pipeline(struct device *dev, struct drm_color= _ctm_3x4 *ctm); int mtk_ccorr_clk_enable(struct device *dev); void mtk_ccorr_clk_disable(struct device *dev); void mtk_ccorr_config(struct device *dev, unsigned int w, --=20 2.50.1