Received: by 2002:a05:6358:c692:b0:131:369:b2a3 with SMTP id fe18csp2413543rwb; Thu, 27 Jul 2023 06:59:48 -0700 (PDT) X-Google-Smtp-Source: APBJJlFEjxc1Vq+Uy5fgMpOb8KJcT1T08YaXES0OGh5I62gKHjYkdrccMOWMtpZGiU88zMsOG4Mj X-Received: by 2002:a05:6358:931c:b0:134:c1eb:8744 with SMTP id x28-20020a056358931c00b00134c1eb8744mr3105659rwa.9.1690466387744; Thu, 27 Jul 2023 06:59:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690466387; cv=none; d=google.com; s=arc-20160816; b=dcDLlwTm+OamAaj5qRbVAKfd+mOHNL/a3wMHfiTEc7BS6VZgrJjfOSX9bm8sxQy8F9 FuuqU6SfAVcl2sNy2uBkCcZqJf+cpcffoCEwnG/SD0PGfzG9BsW5iqznwmLV4Pybs0g8 4TTpVxrPlo7lORATAr4aipjWWHc8w69eT9N3+rXSc3KdjsGYovWMckH5LmecGnIE/3xe GvSYNMpZ40BXTyzksDR8ojKj3o+Fm/yJvFkjyV8p2W1P3uPisDMIMpSPUjLbQavsue3J SJOVs9oKOfnDrj4fg6VMo5/vpSsr7xLreaHSfNbQBH+BZNWFSkXMpn2K1Nb9c8KKaULR 7euw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id:dkim-signature; bh=7nmQ/RudgjiyaGVKCTCVY1/Mq24P2iTTInZzHxl1bmU=; fh=i/YRtEmlqI6ywheJnLAOiu3EVUl3w8B2LiBNJdZWMI8=; b=LBsPJoS0I/xXUNcaD8GaOd4q6TcnVNMOhJAh+D+/bM0rHjYtcKN6y+Or3jM7/hys6S /XhudgLVIAqQOHAjv0UH3MYasCH/lB9CvxsPCDVxTv5w648hQkuCbt3HuEWmxlWCj88U 55uhEELRxLWX30Vm9DBMBbuP/UCeO0WzPJEEu8LCq41AGNPHD0E67nivqFwCFKgoBgdC UyduNNn25fY4ttOC3CmtV+ve+QYcgbjTInsY8z8Ws1yq8slrDTh1hcngOrjlcZUMCZ3r GP1SdAGUJB20o8C2WGLA6r7yPc3778rYGlTKrGpmk+zqXyxm01XgII0XuCetWCjX+2gh FoiA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@collabora.com header.s=mail header.b=ZfH3Abay; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=collabora.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id u189-20020a6385c6000000b0052c419dc8d1si1273681pgd.274.2023.07.27.06.59.29; Thu, 27 Jul 2023 06:59:47 -0700 (PDT) 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=@collabora.com header.s=mail header.b=ZfH3Abay; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231276AbjG0NGN (ORCPT + 99 others); Thu, 27 Jul 2023 09:06:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53060 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230154AbjG0NGL (ORCPT ); Thu, 27 Jul 2023 09:06:11 -0400 Received: from madras.collabora.co.uk (madras.collabora.co.uk [IPv6:2a00:1098:0:82:1000:25:2eeb:e5ab]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8E43F2113 for ; Thu, 27 Jul 2023 06:06:09 -0700 (PDT) Received: from [192.168.1.100] (2-237-20-237.ip236.fastwebnet.it [2.237.20.237]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: kholk11) by madras.collabora.co.uk (Postfix) with ESMTPSA id F0577660713C; Thu, 27 Jul 2023 14:06:05 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1690463166; bh=nIcE3OJoErKYJqW3Zt4z41Rw2r69rJ5mBgVnBs2oAAI=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=ZfH3Abayj+SGW0mhS5XHz1ccb4ljxZJTvq6EtkyrcIWZrt+fDguM16ydkFL+ekzpp gBtRCpPXb73ZXo0o41A3S6x+dgdIJx5xp/oIOcxkuLO8tW3HntEuq7Y1leZMvIMQSq P633yZd5qj1cmUyYOk2yRC55Hkimy7DBCcWKmEecj1/NttH0Skjuqg6uZDR6w5wsWT A/wdDIi1rD8OxvJR9hAFmCPcfc6iO4fiF0ZDVibqHiC9Y2RV60PJy/rMVTc1kEmAz+ 4VDJXI58TrlIZkEjdHQxQP8D2ZFX6dMbgyJf+NmYYFwbxfHarqGk8vf4v4/UFHyjKe 7bPagrwjB650g== Message-ID: <8b9769f3-8a7c-3607-ca9a-09443cfbc9d9@collabora.com> Date: Thu, 27 Jul 2023 15:06:03 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 Subject: Re: [PATCH RESEND v6 09/11] drm/mediatek: gamma: Add support for 12-bit LUT and MT8195 Content-Language: en-US To: Alexandre Mergnat , chunkuang.hu@kernel.org Cc: p.zabel@pengutronix.de, airlied@gmail.com, daniel@ffwll.ch, matthias.bgg@gmail.com, dri-devel@lists.freedesktop.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, wenst@chromium.org, kernel@collabora.com, ehristev@collabora.com, "Jason-JH . Lin" References: <20230727094633.22505-1-angelogioacchino.delregno@collabora.com> <20230727094633.22505-10-angelogioacchino.delregno@collabora.com> From: AngeloGioacchino Del Regno In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.2 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,NICE_REPLY_A,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE 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 Il 27/07/23 13:03, Alexandre Mergnat ha scritto: > Hi Angelo ! > > On 27/07/2023 11:46, AngeloGioacchino Del Regno wrote: >> Add support for 12-bit gamma lookup tables and introduce the first >> user for it: MT8195. >> While at it, also reorder the variables in mtk_gamma_set_common() >> and rename `lut_base` to `lut0_base` to improve readability. >> >> Signed-off-by: AngeloGioacchino Del Regno >> Reviewed-by: Jason-JH.Lin >> --- >>   drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 61 ++++++++++++++++++----- >>   1 file changed, 48 insertions(+), 13 deletions(-) >> >> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c >> b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c >> index f1a0b18b6c1a..e0e2d2bdbf59 100644 >> --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c >> +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c >> @@ -27,12 +27,20 @@ >>   #define DISP_GAMMA_SIZE_VSIZE                GENMASK(12, 0) >>   #define DISP_GAMMA_BANK                0x0100 >>   #define DISP_GAMMA_BANK_BANK                GENMASK(1, 0) >> +#define DISP_GAMMA_BANK_DATA_MODE            BIT(2) >>   #define DISP_GAMMA_LUT                0x0700 >> +#define DISP_GAMMA_LUT1                0x0b00 > > Is this offset generic to all MTK SoC which support this driver ? > >> +/* For 10 bit LUT layout, R/G/B are in the same register */ >>   #define DISP_GAMMA_LUT_10BIT_R            GENMASK(29, 20) >>   #define DISP_GAMMA_LUT_10BIT_G            GENMASK(19, 10) >>   #define DISP_GAMMA_LUT_10BIT_B            GENMASK(9, 0) >> +/* For 12 bit LUT layout, R/G are in LUT, B is in LUT1 */ > > As I understood from the application processor registers (v0.4), R/G are in LUT, B > is in LUT1 for 10bit and 12bit for MT8195. Can you check please to be sure ? > That's right, but here I'm implying that 10-bit LUT is only for older SoCs, and all of them have got the same register layout with one LUT register for R, G, B, while all the new SoCs, which have got 12-bits LUT support, have got the new register layout with two LUT registers (and multiple banks). Infact, the MT8195 SoC was added here with 12-bits LUT support only (as the LUT parameters extraction is easily handled by the drm_color_lut_extract() function). The alternative would've been to add two compatibles, like "mediatek,mt8195-disp-gamma-10bits" and "mediatek,mt8195-disp-gamma-12bits", or a boolean property like "mediatek,lut-12bits" which would appear literally everywhere starting from a certain point in time (since there's no reason to use 10-bits LUT on MT8195, that starts now!). Even then, consider the complication in code, where mtk_gamma_set_common() would have to handle: - 10-bits, layout A - 10-bits, layout B -> but fallback to layout A if this is AAL - 12-bits layout is_aal = !(gamma && gamma->data); for_each_bank() { if (num_lut_banks > 1) write_num_bank(); for (i = 0; i < lut_bank_size; i++) { ....... if (!lut_diff || (i % 2 == 0)) { if (lut_bits == 12 || (lut_bits == 10 && layout_b)) { ... setup word[0],[1] ... } else if (layout_b && !is_aal) { ...setup word[0],[1]... } else { ...setup word[0] } } else { ^^^ almost repeat the same ^^^ } writel(word[0], (...)); if (lut_bits == 12 || (lut_bits == 10 && layout_b) && !is_aal) writel(word[i] (....)); } } probe() { if (of_property_read_bool(dev->of_node, "mediatek,lut-12bits") || data->supports_only_12bits) priv->lut_bits = 12; else priv->lut_bits = 10; } ...at least, that's the implementation that I would do to solve your concern, which isn't *too bad*, but still, a big question arises here... Why should we care about supporting *both* 10-bit and 12-bit Gamma LUTs on the *same* SoC? A 12-bit LUT gives us more precision and there's no penalty if we want to convert a 10-bit LUT to a 12-bits one, as we're simply "ignoring" the value of two bits per component (no expensive calculation involved)... Is there anything that I'm underestimating here? Cheers, Angelo >> +#define DISP_GAMMA_LUT_12BIT_R            GENMASK(11, 0) >> +#define DISP_GAMMA_LUT_12BIT_G            GENMASK(23, 12) >> +#define DISP_GAMMA_LUT_12BIT_B            GENMASK(11, 0) >> + >>   #define LUT_10BIT_MASK                0x03ff >>   #define LUT_BITS_DEFAULT            10 >>   #define LUT_SIZE_DEFAULT            512 >> @@ -83,14 +91,15 @@ unsigned int mtk_gamma_get_lut_size(struct device *dev) >>   void mtk_gamma_set_common(struct device *dev, void __iomem *regs, struct >> drm_crtc_state *state) >>   { >>       struct mtk_disp_gamma *gamma = dev_get_drvdata(dev); >> -    unsigned int i; >> +    void __iomem *lut0_base = regs + DISP_GAMMA_LUT; >> +    void __iomem *lut1_base = regs + DISP_GAMMA_LUT1; >> +    u32 cfg_val, data_mode, lbank_val, word[2]; >> +    int cur_bank, num_lut_banks; >> +    u16 lut_bank_size, lut_size; >>       struct drm_color_lut *lut; >> -    void __iomem *lut_base; >> +    unsigned int i; >>       bool lut_diff; >> -    u16 lut_bank_size, lut_size; >>       u8 lut_bits; >> -    u32 cfg_val, lbank_val, word; >> -    int cur_bank, num_lut_banks; >>       /* If there's no gamma lut there's nothing to do here. */ >>       if (!state->gamma_lut) >> @@ -110,14 +119,17 @@ void mtk_gamma_set_common(struct device *dev, void __iomem >> *regs, struct drm_crt >>       num_lut_banks = lut_size / lut_bank_size; >>       cfg_val = readl(regs + DISP_GAMMA_CFG); >> -    lut_base = regs + DISP_GAMMA_LUT; >>       lut = (struct drm_color_lut *)state->gamma_lut->data; >> +    /* Switch to 12 bits data mode if supported */ >> +    data_mode = FIELD_PREP(DISP_GAMMA_BANK_DATA_MODE, !!(lut_bits == 12)); >> + >>       for (cur_bank = 0; cur_bank < num_lut_banks; cur_bank++) { >>           /* Switch gamma bank and set data mode before writing LUT */ >>           if (num_lut_banks > 1) { >>               lbank_val = FIELD_PREP(DISP_GAMMA_BANK_BANK, cur_bank); >> +            lbank_val |= data_mode; >>               writel(lbank_val, regs + DISP_GAMMA_BANK); >>           } >> @@ -130,9 +142,15 @@ void mtk_gamma_set_common(struct device *dev, void __iomem >> *regs, struct drm_crt >>               hwlut.blue = drm_color_lut_extract(lut[n].blue, lut_bits); >>               if (!lut_diff || (i % 2 == 0)) { >> -                word = FIELD_PREP(DISP_GAMMA_LUT_10BIT_R, hwlut.red); >> -                word |= FIELD_PREP(DISP_GAMMA_LUT_10BIT_G, hwlut.green); >> -                word |= FIELD_PREP(DISP_GAMMA_LUT_10BIT_B, hwlut.blue); >> +                if (lut_bits == 12) { >> +                    word[0] = FIELD_PREP(DISP_GAMMA_LUT_12BIT_R, hwlut.red); >> +                    word[0] |= FIELD_PREP(DISP_GAMMA_LUT_12BIT_G, hwlut.green); >> +                    word[1] = FIELD_PREP(DISP_GAMMA_LUT_12BIT_B, hwlut.blue); >> +                } else { >> +                    word[0] = FIELD_PREP(DISP_GAMMA_LUT_10BIT_R, hwlut.red); >> +                    word[0] |= FIELD_PREP(DISP_GAMMA_LUT_10BIT_G, hwlut.green); >> +                    word[0] |= FIELD_PREP(DISP_GAMMA_LUT_10BIT_B, hwlut.blue); >> +                } >>               } else { >>                   diff.red = lut[n].red - lut[n - 1].red; >>                   diff.red = drm_color_lut_extract(diff.red, lut_bits); >> @@ -143,11 +161,19 @@ void mtk_gamma_set_common(struct device *dev, void __iomem >> *regs, struct drm_crt >>                   diff.blue = lut[n].blue - lut[n - 1].blue; >>                   diff.blue = drm_color_lut_extract(diff.blue, lut_bits); >> -                word = FIELD_PREP(DISP_GAMMA_LUT_10BIT_R, diff.red); >> -                word |= FIELD_PREP(DISP_GAMMA_LUT_10BIT_G, diff.green); >> -                word |= FIELD_PREP(DISP_GAMMA_LUT_10BIT_B, diff.blue); >> +                if (lut_bits == 12) { >> +                    word[0] = FIELD_PREP(DISP_GAMMA_LUT_12BIT_R, diff.red); >> +                    word[0] |= FIELD_PREP(DISP_GAMMA_LUT_12BIT_G, diff.green); >> +                    word[1] = FIELD_PREP(DISP_GAMMA_LUT_12BIT_B, diff.blue); >> +                } else { >> +                    word[0] = FIELD_PREP(DISP_GAMMA_LUT_10BIT_R, diff.red); >> +                    word[0] |= FIELD_PREP(DISP_GAMMA_LUT_10BIT_G, diff.green); >> +                    word[0] |= FIELD_PREP(DISP_GAMMA_LUT_10BIT_B, diff.blue); >> +                } >>               } >> -            writel(word, (lut_base + i * 4)); >> +            writel(word[0], (lut0_base + i * 4)); >> +            if (lut_bits == 12) >> +                writel(word[1], (lut1_base + i * 4)); > > ditto > >>           } >>       } >> @@ -271,11 +297,20 @@ static const struct mtk_disp_gamma_data >> mt8183_gamma_driver_data = { >>       .lut_size = 512, >>   }; >> +static const struct mtk_disp_gamma_data mt8195_gamma_driver_data = { >> +    .lut_bank_size = 256, >> +    .lut_bits = 12, > > If I'm right, ".lut_bits = 10" will not work properly. > >> +    .lut_diff = true, >> +    .lut_size = 1024, >> +}; >> + >>   static const struct of_device_id mtk_disp_gamma_driver_dt_match[] = { >>       { .compatible = "mediatek,mt8173-disp-gamma", >>         .data = &mt8173_gamma_driver_data}, >>       { .compatible = "mediatek,mt8183-disp-gamma", >>         .data = &mt8183_gamma_driver_data}, >> +    { .compatible = "mediatek,mt8195-disp-gamma", >> +      .data = &mt8195_gamma_driver_data}, >>       {}, >>   }; >>   MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match); >