Hi, Jay: Jay Liu <[email protected]> 於 2025年9月21日 週日 上午5:55寫道: > > 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") > Change-Id: Icb2aae1dee21d9ea34f263a54850fee26d97d455
With some fixed up, applied to mediatek-drm-next [1], thanks. [1] https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next Regards, Chun-Kuang. > Reviewed-by: AngeloGioacchino Del Regno > <[email protected]> > Signed-off-by: Jay Liu <[email protected]> > --- > drivers/gpu/drm/mediatek/mtk_disp_ccorr.c | 26 +++-------------------- > 1 file changed, 3 insertions(+), 23 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ccorr.c > b/drivers/gpu/drm/mediatek/mtk_disp_ccorr.c > index 10d60d2c2a56..634b31346921 100644 > --- a/drivers/gpu/drm/mediatek/mtk_disp_ccorr.c > +++ b/drivers/gpu/drm/mediatek/mtk_disp_ccorr.c > @@ -80,28 +80,7 @@ void mtk_ccorr_stop(struct device *dev) > writel_relaxed(0x0, ccorr->regs + DISP_CCORR_EN); > } > > -/* Converts a DRM S31.32 value to the HW S1.n format. */ > -static u16 mtk_ctm_s31_32_to_s1_n(u64 in, u32 n) > -{ > - u16 r; > - > - /* Sign bit. */ > - r = in & BIT_ULL(63) ? BIT(n + 1) : 0; > - > - if ((in & GENMASK_ULL(62, 33)) > 0) { > - /* identity value 0x100000000 -> 0x400(mt8183), */ > - /* identity value 0x100000000 -> 0x800(mt8192), */ > - /* if bigger this, set it to max 0x7ff. */ > - r |= GENMASK(n, 0); > - } else { > - /* take the n+1 most important bits. */ > - r |= (in >> (32 - n)) & GENMASK(n, 0); > - } > - > - return r; > -} > - > -void mtk_ccorr_ctm_set(struct device *dev, struct drm_crtc_state *state) > +bool mtk_ccorr_ctm_set(struct device *dev, struct drm_crtc_state *state) > { > struct mtk_disp_ccorr *ccorr = dev_get_drvdata(dev); > struct drm_property_blob *blob = state->ctm; > @@ -109,6 +88,7 @@ void mtk_ccorr_ctm_set(struct device *dev, struct > drm_crtc_state *state) > const u64 *input; > uint16_t coeffs[9] = { 0 }; > int i; > + int int_bits = 2; > struct cmdq_pkt *cmdq_pkt = NULL; > u32 matrix_bits = ccorr->data->matrix_bits; > > @@ -119,7 +99,7 @@ void mtk_ccorr_ctm_set(struct device *dev, struct > drm_crtc_state *state) > input = ctm->matrix; > > for (i = 0; i < ARRAY_SIZE(coeffs); i++) > - coeffs[i] = mtk_ctm_s31_32_to_s1_n(input[i], matrix_bits); > + coeffs[i] = drm_color_ctm_s31_32_to_qm_n(input[i], int_bits, > matrix_bits); > > mtk_ddp_write(cmdq_pkt, coeffs[0] << 16 | coeffs[1], > &ccorr->cmdq_reg, ccorr->regs, DISP_CCORR_COEF_0); > -- > 2.46.0 >
