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

2023-05-26 Thread AngeloGioacchino Del Regno

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.delre...@collabora.com>
Reviewed-by: Jason-JH.Lin 
---
  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 
  #include 
  #include 
  #include 
@@ -22,9 +23,16 @@
  #define GAMMA_LUT_EN   BIT(1)
  #define
GAMMA_DITHERINGBIT(2)
  #define DISP_GAMMA_SIZE0x0030
+#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



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

2023-05-25 Thread 胡俊光


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

2023-05-18 Thread AngeloGioacchino Del Regno
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 

Reviewed-by: Jason-JH.Lin 
---
 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 
 #include 
 #include 
 #include 
@@ -22,9 +23,16 @@
 #define GAMMA_LUT_EN   BIT(1)
 #define GAMMA_DITHERINGBIT(2)
 #define DISP_GAMMA_SIZE0x0030
+#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, >cmdq_reg, gamma->regs,
- DISP_GAMMA_SIZE);
+   mtk_ddp_write(cmdq_pkt, sz, >cmdq_reg, gamma->regs, 
DISP_GAMMA_SIZE);
if (gamma->data && gamma->data->has_dither)
mtk_dither_set_common(gamma->regs, >cmdq_reg, bpc,
  DISP_GAMMA_CFG, GAMMA_DITHERING, 
cmdq_pkt);
-- 
2.40.1