[v4,06/11] drm/mediatek: gamma: Use bitfield macros

Message ID 20230518104857.124265-7-angelogioacchino.delregno@collabora.com
State New
Headers
Series MediaTek DDP GAMMA - 12-bit LUT support |

Commit Message

AngeloGioacchino Del Regno May 18, 2023, 10:48 a.m. UTC
  Make the code more robust and improve readability by using bitfield
macros instead of open coding bit operations.
While at it, also add a definition for LUT_BITS_DEFAULT.

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Reviewed-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
---
 drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 41 ++++++++++++++---------
 1 file changed, 26 insertions(+), 15 deletions(-)
  

Comments

CK Hu (胡俊光) May 26, 2023, 5:32 a.m. UTC | #1
Hi, Angelo:

On Thu, 2023-05-18 at 12:48 +0200, AngeloGioacchino Del Regno wrote:
> External email : Please do not click links or open attachments until
> you have verified the sender or the content.
> 
> 
> Make the code more robust and improve readability by using bitfield
> macros instead of open coding bit operations.
> While at it, also add a definition for LUT_BITS_DEFAULT.
> 
> Signed-off-by: AngeloGioacchino Del Regno <
> angelogioacchino.delregno@collabora.com>
> Reviewed-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
> ---
>  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 41 ++++++++++++++-------
> --
>  1 file changed, 26 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> index 1592614b6de7..ed2aa1fb0171 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> @@ -3,6 +3,7 @@
>   * Copyright (c) 2021 MediaTek Inc.
>   */
> 
> +#include <linux/bitfield.h>
>  #include <linux/clk.h>
>  #include <linux/component.h>
>  #include <linux/module.h>
> @@ -22,9 +23,16 @@
>  #define GAMMA_LUT_EN                                   BIT(1)
>  #define
> GAMMA_DITHERING                                        BIT(2)
>  #define DISP_GAMMA_SIZE                                0x0030
> +#define DISP_GAMMA_SIZE_HSIZE                          GENMASK(28,
> 16)
> +#define DISP_GAMMA_SIZE_VSIZE                          GENMASK(12,
> 0)
>  #define DISP_GAMMA_LUT                         0x0700
> 
> +#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)
> +
>  #define LUT_10BIT_MASK                         0x03ff
> +#define LUT_BITS_DEFAULT                       10

This is used only for AAL after patch "drm/mediatek: gamma: Support
specifying number of bits per LUT component", so I would like move AAL
definition to AAL driver and pass it to gamma driver.

Regards,
CK

>  #define LUT_SIZE_DEFAULT                       512 /* for setting
> gamma lut from AAL */
> 
>  struct mtk_disp_gamma_data {
> @@ -96,33 +104,33 @@ void mtk_gamma_set_common(struct device *dev,
> void __iomem *regs, struct drm_crt
>         for (i = 0; i < lut_size; i++) {
>                 struct drm_color_lut diff, hwlut;
> 
> -               hwlut.red = drm_color_lut_extract(lut[i].red, 10);
> -               hwlut.green = drm_color_lut_extract(lut[i].green,
> 10);
> -               hwlut.blue = drm_color_lut_extract(lut[i].blue, 10);
> +               hwlut.red = drm_color_lut_extract(lut[i].red,
> LUT_BITS_DEFAULT);
> +               hwlut.green = drm_color_lut_extract(lut[i].green,
> LUT_BITS_DEFAULT);
> +               hwlut.blue = drm_color_lut_extract(lut[i].blue,
> LUT_BITS_DEFAULT);
> 
>                 if (!lut_diff || (i % 2 == 0)) {
> -                       word = hwlut.red << 20 +
> -                              hwlut.green << 10 +
> -                              hwlut.red;
> +                       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);
>                 } else {
>                         diff.red = lut[i].red - lut[i - 1].red;
> -                       diff.red = drm_color_lut_extract(diff.red,
> 10);
> +                       diff.red = drm_color_lut_extract(diff.red,
> LUT_BITS_DEFAULT);
> 
>                         diff.green = lut[i].green - lut[i - 1].green;
> -                       diff.green =
> drm_color_lut_extract(diff.green, 10);
> +                       diff.green =
> drm_color_lut_extract(diff.green, LUT_BITS_DEFAULT);
> 
>                         diff.blue = lut[i].blue - lut[i - 1].blue;
> -                       diff.blue = drm_color_lut_extract(diff.blue,
> 10);
> +                       diff.blue = drm_color_lut_extract(diff.blue,
> LUT_BITS_DEFAULT);
> 
> -                       word = diff.blue << 20 +
> -                              diff.green << 10 +
> -                              diff.red;
> +                       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);
>                 }
>                 writel(word, (lut_base + i * 4));
>         }
> 
>         /* Enable the gamma table */
> -       cfg_val = cfg_val | GAMMA_LUT_EN;
> +       cfg_val |= FIELD_PREP(GAMMA_LUT_EN, 1);
> 
>         writel(cfg_val, regs + DISP_GAMMA_CFG);
>  }
> @@ -139,9 +147,12 @@ void mtk_gamma_config(struct device *dev,
> unsigned int w,
>                       unsigned int bpc, struct cmdq_pkt *cmdq_pkt)
>  {
>         struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> +       u32 sz;
> +
> +       sz = FIELD_PREP(DISP_GAMMA_SIZE_HSIZE, w);
> +       sz |= FIELD_PREP(DISP_GAMMA_SIZE_VSIZE, h);
> 
> -       mtk_ddp_write(cmdq_pkt, h << 16 | w, &gamma->cmdq_reg, gamma-
> >regs,
> -                     DISP_GAMMA_SIZE);
> +       mtk_ddp_write(cmdq_pkt, sz, &gamma->cmdq_reg, gamma->regs,
> DISP_GAMMA_SIZE);
>         if (gamma->data && gamma->data->has_dither)
>                 mtk_dither_set_common(gamma->regs, &gamma->cmdq_reg,
> bpc,
>                                       DISP_GAMMA_CFG,
> GAMMA_DITHERING, cmdq_pkt);
> --
> 2.40.1
>
  
AngeloGioacchino Del Regno May 26, 2023, 8:42 a.m. UTC | #2
Il 26/05/23 07:32, CK Hu (胡俊光) ha scritto:
> Hi, Angelo:
> 
> On Thu, 2023-05-18 at 12:48 +0200, AngeloGioacchino Del Regno wrote:
>> External email : Please do not click links or open attachments until
>> you have verified the sender or the content.
>>
>>
>> Make the code more robust and improve readability by using bitfield
>> macros instead of open coding bit operations.
>> While at it, also add a definition for LUT_BITS_DEFAULT.
>>
>> Signed-off-by: AngeloGioacchino Del Regno <
>> angelogioacchino.delregno@collabora.com>
>> Reviewed-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
>> ---
>>   drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 41 ++++++++++++++-------
>> --
>>   1 file changed, 26 insertions(+), 15 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
>> b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
>> index 1592614b6de7..ed2aa1fb0171 100644
>> --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
>> +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
>> @@ -3,6 +3,7 @@
>>    * Copyright (c) 2021 MediaTek Inc.
>>    */
>>
>> +#include <linux/bitfield.h>
>>   #include <linux/clk.h>
>>   #include <linux/component.h>
>>   #include <linux/module.h>
>> @@ -22,9 +23,16 @@
>>   #define GAMMA_LUT_EN                                   BIT(1)
>>   #define
>> GAMMA_DITHERING                                        BIT(2)
>>   #define DISP_GAMMA_SIZE                                0x0030
>> +#define DISP_GAMMA_SIZE_HSIZE                          GENMASK(28,
>> 16)
>> +#define DISP_GAMMA_SIZE_VSIZE                          GENMASK(12,
>> 0)
>>   #define DISP_GAMMA_LUT                         0x0700
>>
>> +#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)
>> +
>>   #define LUT_10BIT_MASK                         0x03ff
>> +#define LUT_BITS_DEFAULT                       10
> 
> This is used only for AAL after patch "drm/mediatek: gamma: Support
> specifying number of bits per LUT component", so I would like move AAL
> definition to AAL driver and pass it to gamma driver.
> 

Like LUT_SIZE_DEFAULT, this definition is not only for AAL but also for
the older gamma lut register layout.

In any case, I'll check if there's any clean way to pass AAL's gamma
size to this driver... it's a different "component", so this may get
complicated.

Let's see what I can come up with in v5...

Thanks,
Angelo
  

Patch

diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
index 1592614b6de7..ed2aa1fb0171 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
@@ -3,6 +3,7 @@ 
  * Copyright (c) 2021 MediaTek Inc.
  */
 
+#include <linux/bitfield.h>
 #include <linux/clk.h>
 #include <linux/component.h>
 #include <linux/module.h>
@@ -22,9 +23,16 @@ 
 #define GAMMA_LUT_EN					BIT(1)
 #define GAMMA_DITHERING					BIT(2)
 #define DISP_GAMMA_SIZE				0x0030
+#define DISP_GAMMA_SIZE_HSIZE				GENMASK(28, 16)
+#define DISP_GAMMA_SIZE_VSIZE				GENMASK(12, 0)
 #define DISP_GAMMA_LUT				0x0700
 
+#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)
+
 #define LUT_10BIT_MASK				0x03ff
+#define LUT_BITS_DEFAULT			10
 #define LUT_SIZE_DEFAULT			512 /* for setting gamma lut from AAL */
 
 struct mtk_disp_gamma_data {
@@ -96,33 +104,33 @@  void mtk_gamma_set_common(struct device *dev, void __iomem *regs, struct drm_crt
 	for (i = 0; i < lut_size; i++) {
 		struct drm_color_lut diff, hwlut;
 
-		hwlut.red = drm_color_lut_extract(lut[i].red, 10);
-		hwlut.green = drm_color_lut_extract(lut[i].green, 10);
-		hwlut.blue = drm_color_lut_extract(lut[i].blue, 10);
+		hwlut.red = drm_color_lut_extract(lut[i].red, LUT_BITS_DEFAULT);
+		hwlut.green = drm_color_lut_extract(lut[i].green, LUT_BITS_DEFAULT);
+		hwlut.blue = drm_color_lut_extract(lut[i].blue, LUT_BITS_DEFAULT);
 
 		if (!lut_diff || (i % 2 == 0)) {
-			word = hwlut.red << 20 +
-			       hwlut.green << 10 +
-			       hwlut.red;
+			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);
 		} else {
 			diff.red = lut[i].red - lut[i - 1].red;
-			diff.red = drm_color_lut_extract(diff.red, 10);
+			diff.red = drm_color_lut_extract(diff.red, LUT_BITS_DEFAULT);
 
 			diff.green = lut[i].green - lut[i - 1].green;
-			diff.green = drm_color_lut_extract(diff.green, 10);
+			diff.green = drm_color_lut_extract(diff.green, LUT_BITS_DEFAULT);
 
 			diff.blue = lut[i].blue - lut[i - 1].blue;
-			diff.blue = drm_color_lut_extract(diff.blue, 10);
+			diff.blue = drm_color_lut_extract(diff.blue, LUT_BITS_DEFAULT);
 
-			word = diff.blue << 20 +
-			       diff.green << 10 +
-			       diff.red;
+			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);
 		}
 		writel(word, (lut_base + i * 4));
 	}
 
 	/* Enable the gamma table */
-	cfg_val = cfg_val | GAMMA_LUT_EN;
+	cfg_val |= FIELD_PREP(GAMMA_LUT_EN, 1);
 
 	writel(cfg_val, regs + DISP_GAMMA_CFG);
 }
@@ -139,9 +147,12 @@  void mtk_gamma_config(struct device *dev, unsigned int w,
 		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt)
 {
 	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
+	u32 sz;
+
+	sz = FIELD_PREP(DISP_GAMMA_SIZE_HSIZE, w);
+	sz |= FIELD_PREP(DISP_GAMMA_SIZE_VSIZE, h);
 
-	mtk_ddp_write(cmdq_pkt, h << 16 | w, &gamma->cmdq_reg, gamma->regs,
-		      DISP_GAMMA_SIZE);
+	mtk_ddp_write(cmdq_pkt, sz, &gamma->cmdq_reg, gamma->regs, DISP_GAMMA_SIZE);
 	if (gamma->data && gamma->data->has_dither)
 		mtk_dither_set_common(gamma->regs, &gamma->cmdq_reg, bpc,
 				      DISP_GAMMA_CFG, GAMMA_DITHERING, cmdq_pkt);