Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/mediatek: Fix CCORR mtk_ctm_s31_32_to_s1_n function issue

if matrixbit is 11,
The range of color matrix is from 0 to (BIT(12) - 1).
Values from 0 to (BIT(11) - 1) represent positive numbers,
values from BIT(11) to (BIT(12) - 1) represent negative numbers.
For example, -1 need converted to 8191.
so convert S31.32 to HW Q2.11 format by drm_color_ctm_s31_32_to_qm_n,
and set int_bits to 2.

Fixes: 738ed4156fba ("drm/mediatek: Add matrix_bits private data for ccorr")
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Jay Liu <jay.liu@mediatek.com>
Link: https://patchwork.kernel.org/project/dri-devel/patch/20250921055416.25588-2-jay.liu@mediatek.com/
Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>

authored by

Jay Liu and committed by
Chun-Kuang Hu
20ac36b7 e0f44f74

+1 -22
+1 -22
drivers/gpu/drm/mediatek/mtk_disp_ccorr.c
··· 80 80 writel_relaxed(0x0, ccorr->regs + DISP_CCORR_EN); 81 81 } 82 82 83 - /* Converts a DRM S31.32 value to the HW S1.n format. */ 84 - static u16 mtk_ctm_s31_32_to_s1_n(u64 in, u32 n) 85 - { 86 - u16 r; 87 - 88 - /* Sign bit. */ 89 - r = in & BIT_ULL(63) ? BIT(n + 1) : 0; 90 - 91 - if ((in & GENMASK_ULL(62, 33)) > 0) { 92 - /* identity value 0x100000000 -> 0x400(mt8183), */ 93 - /* identity value 0x100000000 -> 0x800(mt8192), */ 94 - /* if bigger this, set it to max 0x7ff. */ 95 - r |= GENMASK(n, 0); 96 - } else { 97 - /* take the n+1 most important bits. */ 98 - r |= (in >> (32 - n)) & GENMASK(n, 0); 99 - } 100 - 101 - return r; 102 - } 103 - 104 83 void mtk_ccorr_ctm_set(struct device *dev, struct drm_crtc_state *state) 105 84 { 106 85 struct mtk_disp_ccorr *ccorr = dev_get_drvdata(dev); ··· 98 119 input = ctm->matrix; 99 120 100 121 for (i = 0; i < ARRAY_SIZE(coeffs); i++) 101 - coeffs[i] = mtk_ctm_s31_32_to_s1_n(input[i], matrix_bits); 122 + coeffs[i] = drm_color_ctm_s31_32_to_qm_n(input[i], 2, matrix_bits); 102 123 103 124 mtk_ddp_write(cmdq_pkt, coeffs[0] << 16 | coeffs[1], 104 125 &ccorr->cmdq_reg, ccorr->regs, DISP_CCORR_COEF_0);