All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v1, 0/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-20 13:06 ` Yongqiang Niu
  0 siblings, 0 replies; 28+ messages in thread
From: Yongqiang Niu @ 2022-04-20 13:06 UTC (permalink / raw)
  To: Chun-Kuang Hu
  Cc: Rob Herring, Matthias Brugger, Philipp Zabel, David Airlie,
	Daniel Vetter, Jassi Brar, Yongqiang Niu, Fabien Parent,
	Dennis YC Hsieh, devicetree, linux-arm-kernel, linux-mediatek,
	linux-kernel, dri-devel, Project_Global_Chrome_Upstream_Group,
	Hsin-Yi Wang

base linux v5.17-rc1

v1: add lut diff private data for gamma function

Yongqiang Niu (1):
  drm/mediatek: add lut diff flag for new gamma hardware support

 drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
 drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
 drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++----
 3 files changed, 32 insertions(+), 8 deletions(-)

-- 
2.25.1


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH v1, 0/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-20 13:06 ` Yongqiang Niu
  0 siblings, 0 replies; 28+ messages in thread
From: Yongqiang Niu @ 2022-04-20 13:06 UTC (permalink / raw)
  To: Chun-Kuang Hu
  Cc: devicetree, Project_Global_Chrome_Upstream_Group, David Airlie,
	Jassi Brar, linux-kernel, dri-devel, Yongqiang Niu,
	Dennis YC Hsieh, Fabien Parent, Rob Herring, linux-mediatek,
	Hsin-Yi Wang, Matthias Brugger, linux-arm-kernel

base linux v5.17-rc1

v1: add lut diff private data for gamma function

Yongqiang Niu (1):
  drm/mediatek: add lut diff flag for new gamma hardware support

 drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
 drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
 drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++----
 3 files changed, 32 insertions(+), 8 deletions(-)

-- 
2.25.1


^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH v1, 0/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-20 13:06 ` Yongqiang Niu
  0 siblings, 0 replies; 28+ messages in thread
From: Yongqiang Niu @ 2022-04-20 13:06 UTC (permalink / raw)
  To: Chun-Kuang Hu
  Cc: Rob Herring, Matthias Brugger, Philipp Zabel, David Airlie,
	Daniel Vetter, Jassi Brar, Yongqiang Niu, Fabien Parent,
	Dennis YC Hsieh, devicetree, linux-arm-kernel, linux-mediatek,
	linux-kernel, dri-devel, Project_Global_Chrome_Upstream_Group,
	Hsin-Yi Wang

base linux v5.17-rc1

v1: add lut diff private data for gamma function

Yongqiang Niu (1):
  drm/mediatek: add lut diff flag for new gamma hardware support

 drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
 drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
 drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++----
 3 files changed, 32 insertions(+), 8 deletions(-)

-- 
2.25.1


_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek

^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH v1, 0/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-20 13:06 ` Yongqiang Niu
  0 siblings, 0 replies; 28+ messages in thread
From: Yongqiang Niu @ 2022-04-20 13:06 UTC (permalink / raw)
  To: Chun-Kuang Hu
  Cc: Rob Herring, Matthias Brugger, Philipp Zabel, David Airlie,
	Daniel Vetter, Jassi Brar, Yongqiang Niu, Fabien Parent,
	Dennis YC Hsieh, devicetree, linux-arm-kernel, linux-mediatek,
	linux-kernel, dri-devel, Project_Global_Chrome_Upstream_Group,
	Hsin-Yi Wang

base linux v5.17-rc1

v1: add lut diff private data for gamma function

Yongqiang Niu (1):
  drm/mediatek: add lut diff flag for new gamma hardware support

 drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
 drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
 drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++----
 3 files changed, 32 insertions(+), 8 deletions(-)

-- 
2.25.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 28+ messages in thread

* [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
  2022-04-20 13:06 ` Yongqiang Niu
  (?)
  (?)
@ 2022-04-20 13:06   ` Yongqiang Niu
  -1 siblings, 0 replies; 28+ messages in thread
From: Yongqiang Niu @ 2022-04-20 13:06 UTC (permalink / raw)
  To: Chun-Kuang Hu
  Cc: Rob Herring, Matthias Brugger, Philipp Zabel, David Airlie,
	Daniel Vetter, Jassi Brar, Yongqiang Niu, Fabien Parent,
	Dennis YC Hsieh, devicetree, linux-arm-kernel, linux-mediatek,
	linux-kernel, dri-devel, Project_Global_Chrome_Upstream_Group,
	Hsin-Yi Wang, Yongqiang Niu

From: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com>

mt8183 gamma module usage is different with before soc,
gamma odd(index start from 0) lut value set to hardware
register should be
the difference of current lut value with last lut value.

gamma function support both increase and decrease lut.
chrome os app set increase lut normally.

for increase lut example, chrome os user space set lut
like this(only r chanel for example):
2 4 6 8 10 12.
1) mt8183 gamma driver should set the gamma lut to hardware
register like this:
2 [2] 6 [8] 10 [2]
the value with [] is the difference value
2) gamma hardware will restore the lut when apply gamma
function to display

Signed-off-by: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com>
---
 drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
 drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
 drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++----
 3 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
index f46d4ab73d6a..e6378b074a17 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
@@ -23,6 +23,7 @@
 
 struct mtk_disp_aal_data {
 	bool has_gamma;
+	bool lut_diff;
 };
 
 /**
@@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev, struct drm_crtc_state *state)
 	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
 
 	if (aal->data && aal->data->has_gamma)
-		mtk_gamma_set_common(aal->regs, state);
+		mtk_gamma_set_common(aal->regs, state, aal->data->lut_diff);
 }
 
 void mtk_aal_start(struct device *dev)
@@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct platform_device *pdev)
 
 static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
 	.has_gamma = true,
+	.lut_diff = false,
 };
 
 static const struct of_device_id mtk_disp_aal_driver_dt_match[] = {
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
index 86c3068894b1..3380651c6707 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
+++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
@@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev, unsigned int w,
 		      unsigned int h, unsigned int vrefresh,
 		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
 void mtk_gamma_set(struct device *dev, struct drm_crtc_state *state);
-void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state);
+void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state, bool lut_diff);
 void mtk_gamma_start(struct device *dev);
 void mtk_gamma_stop(struct device *dev);
 
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
index 3a5815ab4079..fec2e9a5b60d 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
@@ -27,6 +27,7 @@
 
 struct mtk_disp_gamma_data {
 	bool has_dither;
+	bool lut_diff;
 };
 
 /*
@@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device *dev)
 	clk_disable_unprepare(gamma->clk);
 }
 
-void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state)
+void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state, bool lut_diff)
 {
 	unsigned int i, reg;
 	struct drm_color_lut *lut;
 	void __iomem *lut_base;
 	u32 word;
+	u32 diff[3] = {0};
 
 	if (state->gamma_lut) {
 		reg = readl(regs + DISP_GAMMA_CFG);
@@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state)
 		lut_base = regs + DISP_GAMMA_LUT;
 		lut = (struct drm_color_lut *)state->gamma_lut->data;
 		for (i = 0; i < MTK_LUT_SIZE; i++) {
-			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) << 20) +
-				(((lut[i].green >> 6) & LUT_10BIT_MASK) << 10) +
-				((lut[i].blue >> 6) & LUT_10BIT_MASK);
+
+			if (!lut_diff || (i % 2 == 0)) {
+				word = (((lut[i].red >> 6) & LUT_10BIT_MASK) << 20) +
+					(((lut[i].green >> 6) & LUT_10BIT_MASK) << 10) +
+					((lut[i].blue >> 6) & LUT_10BIT_MASK);
+			} else {
+				diff[0] = abs((lut[i].red >> 6) - (lut[i - 1].red >> 6));
+				diff[1] = abs((lut[i].green >> 6) - (lut[i - 1].green >> 6));
+				diff[2] = abs((lut[i].blue >> 6) - (lut[i - 1].blue >> 6));
+
+				word = ((diff[0] & LUT_10BIT_MASK) << 20) +
+					((diff[1] & LUT_10BIT_MASK) << 10) +
+					(diff[2] & LUT_10BIT_MASK);
+			}
 			writel(word, (lut_base + i * 4));
 		}
 	}
@@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state)
 void mtk_gamma_set(struct device *dev, struct drm_crtc_state *state)
 {
 	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
+	bool lut_diff = false;
+
+	if (gamma->data)
+		lut_diff = gamma->data->lut_diff;
 
-	mtk_gamma_set_common(gamma->regs, state);
+	mtk_gamma_set_common(gamma->regs, state, lut_diff);
 }
 
 void mtk_gamma_config(struct device *dev, unsigned int w,
@@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data mt8173_gamma_driver_data = {
 	.has_dither = true,
 };
 
+static const struct mtk_disp_gamma_data mt8183_gamma_driver_data = {
+	.lut_diff = true,
+};
+
 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"},
+	{ .compatible = "mediatek,mt8183-disp-gamma",
+	  .data = &mt8183_gamma_driver_data},
 	{},
 };
 MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-20 13:06   ` Yongqiang Niu
  0 siblings, 0 replies; 28+ messages in thread
From: Yongqiang Niu @ 2022-04-20 13:06 UTC (permalink / raw)
  To: Chun-Kuang Hu
  Cc: Yongqiang Niu, devicetree, Project_Global_Chrome_Upstream_Group,
	David Airlie, Jassi Brar, linux-kernel, dri-devel, Yongqiang Niu,
	Dennis YC Hsieh, Fabien Parent, Rob Herring, linux-mediatek,
	Hsin-Yi Wang, Matthias Brugger, linux-arm-kernel

From: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com>

mt8183 gamma module usage is different with before soc,
gamma odd(index start from 0) lut value set to hardware
register should be
the difference of current lut value with last lut value.

gamma function support both increase and decrease lut.
chrome os app set increase lut normally.

for increase lut example, chrome os user space set lut
like this(only r chanel for example):
2 4 6 8 10 12.
1) mt8183 gamma driver should set the gamma lut to hardware
register like this:
2 [2] 6 [8] 10 [2]
the value with [] is the difference value
2) gamma hardware will restore the lut when apply gamma
function to display

Signed-off-by: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com>
---
 drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
 drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
 drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++----
 3 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
index f46d4ab73d6a..e6378b074a17 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
@@ -23,6 +23,7 @@
 
 struct mtk_disp_aal_data {
 	bool has_gamma;
+	bool lut_diff;
 };
 
 /**
@@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev, struct drm_crtc_state *state)
 	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
 
 	if (aal->data && aal->data->has_gamma)
-		mtk_gamma_set_common(aal->regs, state);
+		mtk_gamma_set_common(aal->regs, state, aal->data->lut_diff);
 }
 
 void mtk_aal_start(struct device *dev)
@@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct platform_device *pdev)
 
 static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
 	.has_gamma = true,
+	.lut_diff = false,
 };
 
 static const struct of_device_id mtk_disp_aal_driver_dt_match[] = {
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
index 86c3068894b1..3380651c6707 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
+++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
@@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev, unsigned int w,
 		      unsigned int h, unsigned int vrefresh,
 		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
 void mtk_gamma_set(struct device *dev, struct drm_crtc_state *state);
-void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state);
+void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state, bool lut_diff);
 void mtk_gamma_start(struct device *dev);
 void mtk_gamma_stop(struct device *dev);
 
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
index 3a5815ab4079..fec2e9a5b60d 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
@@ -27,6 +27,7 @@
 
 struct mtk_disp_gamma_data {
 	bool has_dither;
+	bool lut_diff;
 };
 
 /*
@@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device *dev)
 	clk_disable_unprepare(gamma->clk);
 }
 
-void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state)
+void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state, bool lut_diff)
 {
 	unsigned int i, reg;
 	struct drm_color_lut *lut;
 	void __iomem *lut_base;
 	u32 word;
+	u32 diff[3] = {0};
 
 	if (state->gamma_lut) {
 		reg = readl(regs + DISP_GAMMA_CFG);
@@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state)
 		lut_base = regs + DISP_GAMMA_LUT;
 		lut = (struct drm_color_lut *)state->gamma_lut->data;
 		for (i = 0; i < MTK_LUT_SIZE; i++) {
-			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) << 20) +
-				(((lut[i].green >> 6) & LUT_10BIT_MASK) << 10) +
-				((lut[i].blue >> 6) & LUT_10BIT_MASK);
+
+			if (!lut_diff || (i % 2 == 0)) {
+				word = (((lut[i].red >> 6) & LUT_10BIT_MASK) << 20) +
+					(((lut[i].green >> 6) & LUT_10BIT_MASK) << 10) +
+					((lut[i].blue >> 6) & LUT_10BIT_MASK);
+			} else {
+				diff[0] = abs((lut[i].red >> 6) - (lut[i - 1].red >> 6));
+				diff[1] = abs((lut[i].green >> 6) - (lut[i - 1].green >> 6));
+				diff[2] = abs((lut[i].blue >> 6) - (lut[i - 1].blue >> 6));
+
+				word = ((diff[0] & LUT_10BIT_MASK) << 20) +
+					((diff[1] & LUT_10BIT_MASK) << 10) +
+					(diff[2] & LUT_10BIT_MASK);
+			}
 			writel(word, (lut_base + i * 4));
 		}
 	}
@@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state)
 void mtk_gamma_set(struct device *dev, struct drm_crtc_state *state)
 {
 	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
+	bool lut_diff = false;
+
+	if (gamma->data)
+		lut_diff = gamma->data->lut_diff;
 
-	mtk_gamma_set_common(gamma->regs, state);
+	mtk_gamma_set_common(gamma->regs, state, lut_diff);
 }
 
 void mtk_gamma_config(struct device *dev, unsigned int w,
@@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data mt8173_gamma_driver_data = {
 	.has_dither = true,
 };
 
+static const struct mtk_disp_gamma_data mt8183_gamma_driver_data = {
+	.lut_diff = true,
+};
+
 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"},
+	{ .compatible = "mediatek,mt8183-disp-gamma",
+	  .data = &mt8183_gamma_driver_data},
 	{},
 };
 MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-20 13:06   ` Yongqiang Niu
  0 siblings, 0 replies; 28+ messages in thread
From: Yongqiang Niu @ 2022-04-20 13:06 UTC (permalink / raw)
  To: Chun-Kuang Hu
  Cc: Rob Herring, Matthias Brugger, Philipp Zabel, David Airlie,
	Daniel Vetter, Jassi Brar, Yongqiang Niu, Fabien Parent,
	Dennis YC Hsieh, devicetree, linux-arm-kernel, linux-mediatek,
	linux-kernel, dri-devel, Project_Global_Chrome_Upstream_Group,
	Hsin-Yi Wang, Yongqiang Niu

From: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com>

mt8183 gamma module usage is different with before soc,
gamma odd(index start from 0) lut value set to hardware
register should be
the difference of current lut value with last lut value.

gamma function support both increase and decrease lut.
chrome os app set increase lut normally.

for increase lut example, chrome os user space set lut
like this(only r chanel for example):
2 4 6 8 10 12.
1) mt8183 gamma driver should set the gamma lut to hardware
register like this:
2 [2] 6 [8] 10 [2]
the value with [] is the difference value
2) gamma hardware will restore the lut when apply gamma
function to display

Signed-off-by: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com>
---
 drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
 drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
 drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++----
 3 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
index f46d4ab73d6a..e6378b074a17 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
@@ -23,6 +23,7 @@
 
 struct mtk_disp_aal_data {
 	bool has_gamma;
+	bool lut_diff;
 };
 
 /**
@@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev, struct drm_crtc_state *state)
 	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
 
 	if (aal->data && aal->data->has_gamma)
-		mtk_gamma_set_common(aal->regs, state);
+		mtk_gamma_set_common(aal->regs, state, aal->data->lut_diff);
 }
 
 void mtk_aal_start(struct device *dev)
@@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct platform_device *pdev)
 
 static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
 	.has_gamma = true,
+	.lut_diff = false,
 };
 
 static const struct of_device_id mtk_disp_aal_driver_dt_match[] = {
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
index 86c3068894b1..3380651c6707 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
+++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
@@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev, unsigned int w,
 		      unsigned int h, unsigned int vrefresh,
 		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
 void mtk_gamma_set(struct device *dev, struct drm_crtc_state *state);
-void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state);
+void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state, bool lut_diff);
 void mtk_gamma_start(struct device *dev);
 void mtk_gamma_stop(struct device *dev);
 
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
index 3a5815ab4079..fec2e9a5b60d 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
@@ -27,6 +27,7 @@
 
 struct mtk_disp_gamma_data {
 	bool has_dither;
+	bool lut_diff;
 };
 
 /*
@@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device *dev)
 	clk_disable_unprepare(gamma->clk);
 }
 
-void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state)
+void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state, bool lut_diff)
 {
 	unsigned int i, reg;
 	struct drm_color_lut *lut;
 	void __iomem *lut_base;
 	u32 word;
+	u32 diff[3] = {0};
 
 	if (state->gamma_lut) {
 		reg = readl(regs + DISP_GAMMA_CFG);
@@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state)
 		lut_base = regs + DISP_GAMMA_LUT;
 		lut = (struct drm_color_lut *)state->gamma_lut->data;
 		for (i = 0; i < MTK_LUT_SIZE; i++) {
-			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) << 20) +
-				(((lut[i].green >> 6) & LUT_10BIT_MASK) << 10) +
-				((lut[i].blue >> 6) & LUT_10BIT_MASK);
+
+			if (!lut_diff || (i % 2 == 0)) {
+				word = (((lut[i].red >> 6) & LUT_10BIT_MASK) << 20) +
+					(((lut[i].green >> 6) & LUT_10BIT_MASK) << 10) +
+					((lut[i].blue >> 6) & LUT_10BIT_MASK);
+			} else {
+				diff[0] = abs((lut[i].red >> 6) - (lut[i - 1].red >> 6));
+				diff[1] = abs((lut[i].green >> 6) - (lut[i - 1].green >> 6));
+				diff[2] = abs((lut[i].blue >> 6) - (lut[i - 1].blue >> 6));
+
+				word = ((diff[0] & LUT_10BIT_MASK) << 20) +
+					((diff[1] & LUT_10BIT_MASK) << 10) +
+					(diff[2] & LUT_10BIT_MASK);
+			}
 			writel(word, (lut_base + i * 4));
 		}
 	}
@@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state)
 void mtk_gamma_set(struct device *dev, struct drm_crtc_state *state)
 {
 	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
+	bool lut_diff = false;
+
+	if (gamma->data)
+		lut_diff = gamma->data->lut_diff;
 
-	mtk_gamma_set_common(gamma->regs, state);
+	mtk_gamma_set_common(gamma->regs, state, lut_diff);
 }
 
 void mtk_gamma_config(struct device *dev, unsigned int w,
@@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data mt8173_gamma_driver_data = {
 	.has_dither = true,
 };
 
+static const struct mtk_disp_gamma_data mt8183_gamma_driver_data = {
+	.lut_diff = true,
+};
+
 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"},
+	{ .compatible = "mediatek,mt8183-disp-gamma",
+	  .data = &mt8183_gamma_driver_data},
 	{},
 };
 MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);
-- 
2.25.1


_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-20 13:06   ` Yongqiang Niu
  0 siblings, 0 replies; 28+ messages in thread
From: Yongqiang Niu @ 2022-04-20 13:06 UTC (permalink / raw)
  To: Chun-Kuang Hu
  Cc: Rob Herring, Matthias Brugger, Philipp Zabel, David Airlie,
	Daniel Vetter, Jassi Brar, Yongqiang Niu, Fabien Parent,
	Dennis YC Hsieh, devicetree, linux-arm-kernel, linux-mediatek,
	linux-kernel, dri-devel, Project_Global_Chrome_Upstream_Group,
	Hsin-Yi Wang, Yongqiang Niu

From: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com>

mt8183 gamma module usage is different with before soc,
gamma odd(index start from 0) lut value set to hardware
register should be
the difference of current lut value with last lut value.

gamma function support both increase and decrease lut.
chrome os app set increase lut normally.

for increase lut example, chrome os user space set lut
like this(only r chanel for example):
2 4 6 8 10 12.
1) mt8183 gamma driver should set the gamma lut to hardware
register like this:
2 [2] 6 [8] 10 [2]
the value with [] is the difference value
2) gamma hardware will restore the lut when apply gamma
function to display

Signed-off-by: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com>
---
 drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
 drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
 drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++----
 3 files changed, 32 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
index f46d4ab73d6a..e6378b074a17 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
@@ -23,6 +23,7 @@
 
 struct mtk_disp_aal_data {
 	bool has_gamma;
+	bool lut_diff;
 };
 
 /**
@@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev, struct drm_crtc_state *state)
 	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
 
 	if (aal->data && aal->data->has_gamma)
-		mtk_gamma_set_common(aal->regs, state);
+		mtk_gamma_set_common(aal->regs, state, aal->data->lut_diff);
 }
 
 void mtk_aal_start(struct device *dev)
@@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct platform_device *pdev)
 
 static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
 	.has_gamma = true,
+	.lut_diff = false,
 };
 
 static const struct of_device_id mtk_disp_aal_driver_dt_match[] = {
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
index 86c3068894b1..3380651c6707 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
+++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
@@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev, unsigned int w,
 		      unsigned int h, unsigned int vrefresh,
 		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
 void mtk_gamma_set(struct device *dev, struct drm_crtc_state *state);
-void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state);
+void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state, bool lut_diff);
 void mtk_gamma_start(struct device *dev);
 void mtk_gamma_stop(struct device *dev);
 
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
index 3a5815ab4079..fec2e9a5b60d 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
@@ -27,6 +27,7 @@
 
 struct mtk_disp_gamma_data {
 	bool has_dither;
+	bool lut_diff;
 };
 
 /*
@@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device *dev)
 	clk_disable_unprepare(gamma->clk);
 }
 
-void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state)
+void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state, bool lut_diff)
 {
 	unsigned int i, reg;
 	struct drm_color_lut *lut;
 	void __iomem *lut_base;
 	u32 word;
+	u32 diff[3] = {0};
 
 	if (state->gamma_lut) {
 		reg = readl(regs + DISP_GAMMA_CFG);
@@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state)
 		lut_base = regs + DISP_GAMMA_LUT;
 		lut = (struct drm_color_lut *)state->gamma_lut->data;
 		for (i = 0; i < MTK_LUT_SIZE; i++) {
-			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) << 20) +
-				(((lut[i].green >> 6) & LUT_10BIT_MASK) << 10) +
-				((lut[i].blue >> 6) & LUT_10BIT_MASK);
+
+			if (!lut_diff || (i % 2 == 0)) {
+				word = (((lut[i].red >> 6) & LUT_10BIT_MASK) << 20) +
+					(((lut[i].green >> 6) & LUT_10BIT_MASK) << 10) +
+					((lut[i].blue >> 6) & LUT_10BIT_MASK);
+			} else {
+				diff[0] = abs((lut[i].red >> 6) - (lut[i - 1].red >> 6));
+				diff[1] = abs((lut[i].green >> 6) - (lut[i - 1].green >> 6));
+				diff[2] = abs((lut[i].blue >> 6) - (lut[i - 1].blue >> 6));
+
+				word = ((diff[0] & LUT_10BIT_MASK) << 20) +
+					((diff[1] & LUT_10BIT_MASK) << 10) +
+					(diff[2] & LUT_10BIT_MASK);
+			}
 			writel(word, (lut_base + i * 4));
 		}
 	}
@@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state *state)
 void mtk_gamma_set(struct device *dev, struct drm_crtc_state *state)
 {
 	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
+	bool lut_diff = false;
+
+	if (gamma->data)
+		lut_diff = gamma->data->lut_diff;
 
-	mtk_gamma_set_common(gamma->regs, state);
+	mtk_gamma_set_common(gamma->regs, state, lut_diff);
 }
 
 void mtk_gamma_config(struct device *dev, unsigned int w,
@@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data mt8173_gamma_driver_data = {
 	.has_dither = true,
 };
 
+static const struct mtk_disp_gamma_data mt8183_gamma_driver_data = {
+	.lut_diff = true,
+};
+
 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"},
+	{ .compatible = "mediatek,mt8183-disp-gamma",
+	  .data = &mt8183_gamma_driver_data},
 	{},
 };
 MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);
-- 
2.25.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
  2022-04-20 13:06   ` Yongqiang Niu
  (?)
  (?)
@ 2022-04-21  2:38     ` Rex-BC Chen
  -1 siblings, 0 replies; 28+ messages in thread
From: Rex-BC Chen @ 2022-04-21  2:38 UTC (permalink / raw)
  To: Yongqiang Niu, Chun-Kuang Hu
  Cc: Rob Herring, Matthias Brugger, Philipp Zabel, David Airlie,
	Daniel Vetter, Jassi Brar, Fabien Parent, Dennis YC Hsieh,
	devicetree, linux-arm-kernel, linux-mediatek, linux-kernel,
	dri-devel, Project_Global_Chrome_Upstream_Group, Hsin-Yi Wang,
	Yongqiang Niu

On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> From: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com>
> 
> mt8183 gamma module usage is different with before soc,
> gamma odd(index start from 0) lut value set to hardware
> register should be
> the difference of current lut value with last lut value.
> 

Hello Yongqiang,

Do you mean for SoCs before 8183 (like 8173) are using original
method(setting without lut diff) and for 8183/8192/8195/8186, we
need to use the method of lut diff?

> gamma function support both increase and decrease lut.
> chrome os app set increase lut normally.
> 
> for increase lut example, chrome os user space set lut
> like this(only r chanel for example):
> 2 4 6 8 10 12.
> 1) mt8183 gamma driver should set the gamma lut to hardware
> register like this:
> 2 [2] 6 [8] 10 [2]

this should be something like this?
2 [2] 6 [2] 10 [2]

> the value with [] is the difference value
> 2) gamma hardware will restore the lut when apply gamma
> function to display
> 
> Signed-off-by: Yongqiang Niu <
> yongqiang.niu@mediatek.corp-partner.google.com>
> ---
>  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
>  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
>  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++
> ----
>  3 files changed, 32 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> index f46d4ab73d6a..e6378b074a17 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> @@ -23,6 +23,7 @@
>  
>  struct mtk_disp_aal_data {
>  	bool has_gamma;
> +	bool lut_diff;
>  };
>  
>  /**
> @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev, struct
> drm_crtc_state *state)
>  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
>  
>  	if (aal->data && aal->data->has_gamma)
> -		mtk_gamma_set_common(aal->regs, state);
> +		mtk_gamma_set_common(aal->regs, state, aal->data-
> >lut_diff);
>  }
>  
>  void mtk_aal_start(struct device *dev)
> @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> platform_device *pdev)
>  
>  static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
>  	.has_gamma = true,
> +	.lut_diff = false,
>  };
>  
>  static const struct of_device_id mtk_disp_aal_driver_dt_match[] = {
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> index 86c3068894b1..3380651c6707 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev, unsigned
> int w,
>  		      unsigned int h, unsigned int vrefresh,
>  		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
>  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> *state);
> -void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state);
> +void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state, bool lut_diff);
>  void mtk_gamma_start(struct device *dev);
>  void mtk_gamma_stop(struct device *dev);
>  
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> index 3a5815ab4079..fec2e9a5b60d 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> @@ -27,6 +27,7 @@
>  
>  struct mtk_disp_gamma_data {
>  	bool has_dither;
> +	bool lut_diff;
>  };
>  
>  /*
> @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device *dev)
>  	clk_disable_unprepare(gamma->clk);
>  }
>  
> -void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state)
> +void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state, bool lut_diff)
>  {
>  	unsigned int i, reg;
>  	struct drm_color_lut *lut;
>  	void __iomem *lut_base;
>  	u32 word;
> +	u32 diff[3] = {0};
>  
>  	if (state->gamma_lut) {
>  		reg = readl(regs + DISP_GAMMA_CFG);
> @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs,
> struct drm_crtc_state *state)
>  		lut_base = regs + DISP_GAMMA_LUT;
>  		lut = (struct drm_color_lut *)state->gamma_lut->data;
>  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> -			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) <<
> 20) +
> -				(((lut[i].green >> 6) & LUT_10BIT_MASK)
> << 10) +
> -				((lut[i].blue >> 6) & LUT_10BIT_MASK);
> +
> +			if (!lut_diff || (i % 2 == 0)) {

if it's not used lut_diff for the MT8173, it is strange for this
condition.

BRs,
Rex

> +				word = (((lut[i].red >> 6) &
> LUT_10BIT_MASK) << 20) +
> +					(((lut[i].green >> 6) &
> LUT_10BIT_MASK) << 10) +
> +					((lut[i].blue >> 6) &
> LUT_10BIT_MASK);
> +			} else {
> +				diff[0] = abs((lut[i].red >> 6) -
> (lut[i - 1].red >> 6));
> +				diff[1] = abs((lut[i].green >> 6) -
> (lut[i - 1].green >> 6));
> +				diff[2] = abs((lut[i].blue >> 6) -
> (lut[i - 1].blue >> 6));
> +
> +				word = ((diff[0] & LUT_10BIT_MASK) <<
> 20) +
> +					((diff[1] & LUT_10BIT_MASK) <<
> 10) +
> +					(diff[2] & LUT_10BIT_MASK);
> +			}
>  			writel(word, (lut_base + i * 4));
>  		}
>  	}
> @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs,
> struct drm_crtc_state *state)
>  void mtk_gamma_set(struct device *dev, struct drm_crtc_state *state)
>  {
>  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> +	bool lut_diff = false;
> +
> +	if (gamma->data)
> +		lut_diff = gamma->data->lut_diff;
>  
> -	mtk_gamma_set_common(gamma->regs, state);
> +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
>  }
>  
>  void mtk_gamma_config(struct device *dev, unsigned int w,
> @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> mt8173_gamma_driver_data = {
>  	.has_dither = true,
>  };
>  
> +static const struct mtk_disp_gamma_data mt8183_gamma_driver_data = {
> +	.lut_diff = true,
> +};
> +
>  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"},
> +	{ .compatible = "mediatek,mt8183-disp-gamma",
> +	  .data = &mt8183_gamma_driver_data},
>  	{},
>  };
>  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-21  2:38     ` Rex-BC Chen
  0 siblings, 0 replies; 28+ messages in thread
From: Rex-BC Chen @ 2022-04-21  2:38 UTC (permalink / raw)
  To: Yongqiang Niu, Chun-Kuang Hu
  Cc: Yongqiang Niu, devicetree, Project_Global_Chrome_Upstream_Group,
	David Airlie, Jassi Brar, linux-kernel, dri-devel,
	Dennis YC Hsieh, Fabien Parent, Rob Herring, linux-mediatek,
	Hsin-Yi Wang, Matthias Brugger, linux-arm-kernel

On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> From: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com>
> 
> mt8183 gamma module usage is different with before soc,
> gamma odd(index start from 0) lut value set to hardware
> register should be
> the difference of current lut value with last lut value.
> 

Hello Yongqiang,

Do you mean for SoCs before 8183 (like 8173) are using original
method(setting without lut diff) and for 8183/8192/8195/8186, we
need to use the method of lut diff?

> gamma function support both increase and decrease lut.
> chrome os app set increase lut normally.
> 
> for increase lut example, chrome os user space set lut
> like this(only r chanel for example):
> 2 4 6 8 10 12.
> 1) mt8183 gamma driver should set the gamma lut to hardware
> register like this:
> 2 [2] 6 [8] 10 [2]

this should be something like this?
2 [2] 6 [2] 10 [2]

> the value with [] is the difference value
> 2) gamma hardware will restore the lut when apply gamma
> function to display
> 
> Signed-off-by: Yongqiang Niu <
> yongqiang.niu@mediatek.corp-partner.google.com>
> ---
>  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
>  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
>  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++
> ----
>  3 files changed, 32 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> index f46d4ab73d6a..e6378b074a17 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> @@ -23,6 +23,7 @@
>  
>  struct mtk_disp_aal_data {
>  	bool has_gamma;
> +	bool lut_diff;
>  };
>  
>  /**
> @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev, struct
> drm_crtc_state *state)
>  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
>  
>  	if (aal->data && aal->data->has_gamma)
> -		mtk_gamma_set_common(aal->regs, state);
> +		mtk_gamma_set_common(aal->regs, state, aal->data-
> >lut_diff);
>  }
>  
>  void mtk_aal_start(struct device *dev)
> @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> platform_device *pdev)
>  
>  static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
>  	.has_gamma = true,
> +	.lut_diff = false,
>  };
>  
>  static const struct of_device_id mtk_disp_aal_driver_dt_match[] = {
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> index 86c3068894b1..3380651c6707 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev, unsigned
> int w,
>  		      unsigned int h, unsigned int vrefresh,
>  		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
>  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> *state);
> -void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state);
> +void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state, bool lut_diff);
>  void mtk_gamma_start(struct device *dev);
>  void mtk_gamma_stop(struct device *dev);
>  
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> index 3a5815ab4079..fec2e9a5b60d 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> @@ -27,6 +27,7 @@
>  
>  struct mtk_disp_gamma_data {
>  	bool has_dither;
> +	bool lut_diff;
>  };
>  
>  /*
> @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device *dev)
>  	clk_disable_unprepare(gamma->clk);
>  }
>  
> -void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state)
> +void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state, bool lut_diff)
>  {
>  	unsigned int i, reg;
>  	struct drm_color_lut *lut;
>  	void __iomem *lut_base;
>  	u32 word;
> +	u32 diff[3] = {0};
>  
>  	if (state->gamma_lut) {
>  		reg = readl(regs + DISP_GAMMA_CFG);
> @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs,
> struct drm_crtc_state *state)
>  		lut_base = regs + DISP_GAMMA_LUT;
>  		lut = (struct drm_color_lut *)state->gamma_lut->data;
>  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> -			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) <<
> 20) +
> -				(((lut[i].green >> 6) & LUT_10BIT_MASK)
> << 10) +
> -				((lut[i].blue >> 6) & LUT_10BIT_MASK);
> +
> +			if (!lut_diff || (i % 2 == 0)) {

if it's not used lut_diff for the MT8173, it is strange for this
condition.

BRs,
Rex

> +				word = (((lut[i].red >> 6) &
> LUT_10BIT_MASK) << 20) +
> +					(((lut[i].green >> 6) &
> LUT_10BIT_MASK) << 10) +
> +					((lut[i].blue >> 6) &
> LUT_10BIT_MASK);
> +			} else {
> +				diff[0] = abs((lut[i].red >> 6) -
> (lut[i - 1].red >> 6));
> +				diff[1] = abs((lut[i].green >> 6) -
> (lut[i - 1].green >> 6));
> +				diff[2] = abs((lut[i].blue >> 6) -
> (lut[i - 1].blue >> 6));
> +
> +				word = ((diff[0] & LUT_10BIT_MASK) <<
> 20) +
> +					((diff[1] & LUT_10BIT_MASK) <<
> 10) +
> +					(diff[2] & LUT_10BIT_MASK);
> +			}
>  			writel(word, (lut_base + i * 4));
>  		}
>  	}
> @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs,
> struct drm_crtc_state *state)
>  void mtk_gamma_set(struct device *dev, struct drm_crtc_state *state)
>  {
>  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> +	bool lut_diff = false;
> +
> +	if (gamma->data)
> +		lut_diff = gamma->data->lut_diff;
>  
> -	mtk_gamma_set_common(gamma->regs, state);
> +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
>  }
>  
>  void mtk_gamma_config(struct device *dev, unsigned int w,
> @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> mt8173_gamma_driver_data = {
>  	.has_dither = true,
>  };
>  
> +static const struct mtk_disp_gamma_data mt8183_gamma_driver_data = {
> +	.lut_diff = true,
> +};
> +
>  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"},
> +	{ .compatible = "mediatek,mt8183-disp-gamma",
> +	  .data = &mt8183_gamma_driver_data},
>  	{},
>  };
>  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-21  2:38     ` Rex-BC Chen
  0 siblings, 0 replies; 28+ messages in thread
From: Rex-BC Chen @ 2022-04-21  2:38 UTC (permalink / raw)
  To: Yongqiang Niu, Chun-Kuang Hu
  Cc: Rob Herring, Matthias Brugger, Philipp Zabel, David Airlie,
	Daniel Vetter, Jassi Brar, Fabien Parent, Dennis YC Hsieh,
	devicetree, linux-arm-kernel, linux-mediatek, linux-kernel,
	dri-devel, Project_Global_Chrome_Upstream_Group, Hsin-Yi Wang,
	Yongqiang Niu

On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> From: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com>
> 
> mt8183 gamma module usage is different with before soc,
> gamma odd(index start from 0) lut value set to hardware
> register should be
> the difference of current lut value with last lut value.
> 

Hello Yongqiang,

Do you mean for SoCs before 8183 (like 8173) are using original
method(setting without lut diff) and for 8183/8192/8195/8186, we
need to use the method of lut diff?

> gamma function support both increase and decrease lut.
> chrome os app set increase lut normally.
> 
> for increase lut example, chrome os user space set lut
> like this(only r chanel for example):
> 2 4 6 8 10 12.
> 1) mt8183 gamma driver should set the gamma lut to hardware
> register like this:
> 2 [2] 6 [8] 10 [2]

this should be something like this?
2 [2] 6 [2] 10 [2]

> the value with [] is the difference value
> 2) gamma hardware will restore the lut when apply gamma
> function to display
> 
> Signed-off-by: Yongqiang Niu <
> yongqiang.niu@mediatek.corp-partner.google.com>
> ---
>  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
>  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
>  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++
> ----
>  3 files changed, 32 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> index f46d4ab73d6a..e6378b074a17 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> @@ -23,6 +23,7 @@
>  
>  struct mtk_disp_aal_data {
>  	bool has_gamma;
> +	bool lut_diff;
>  };
>  
>  /**
> @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev, struct
> drm_crtc_state *state)
>  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
>  
>  	if (aal->data && aal->data->has_gamma)
> -		mtk_gamma_set_common(aal->regs, state);
> +		mtk_gamma_set_common(aal->regs, state, aal->data-
> >lut_diff);
>  }
>  
>  void mtk_aal_start(struct device *dev)
> @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> platform_device *pdev)
>  
>  static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
>  	.has_gamma = true,
> +	.lut_diff = false,
>  };
>  
>  static const struct of_device_id mtk_disp_aal_driver_dt_match[] = {
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> index 86c3068894b1..3380651c6707 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev, unsigned
> int w,
>  		      unsigned int h, unsigned int vrefresh,
>  		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
>  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> *state);
> -void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state);
> +void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state, bool lut_diff);
>  void mtk_gamma_start(struct device *dev);
>  void mtk_gamma_stop(struct device *dev);
>  
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> index 3a5815ab4079..fec2e9a5b60d 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> @@ -27,6 +27,7 @@
>  
>  struct mtk_disp_gamma_data {
>  	bool has_dither;
> +	bool lut_diff;
>  };
>  
>  /*
> @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device *dev)
>  	clk_disable_unprepare(gamma->clk);
>  }
>  
> -void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state)
> +void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state, bool lut_diff)
>  {
>  	unsigned int i, reg;
>  	struct drm_color_lut *lut;
>  	void __iomem *lut_base;
>  	u32 word;
> +	u32 diff[3] = {0};
>  
>  	if (state->gamma_lut) {
>  		reg = readl(regs + DISP_GAMMA_CFG);
> @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs,
> struct drm_crtc_state *state)
>  		lut_base = regs + DISP_GAMMA_LUT;
>  		lut = (struct drm_color_lut *)state->gamma_lut->data;
>  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> -			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) <<
> 20) +
> -				(((lut[i].green >> 6) & LUT_10BIT_MASK)
> << 10) +
> -				((lut[i].blue >> 6) & LUT_10BIT_MASK);
> +
> +			if (!lut_diff || (i % 2 == 0)) {

if it's not used lut_diff for the MT8173, it is strange for this
condition.

BRs,
Rex

> +				word = (((lut[i].red >> 6) &
> LUT_10BIT_MASK) << 20) +
> +					(((lut[i].green >> 6) &
> LUT_10BIT_MASK) << 10) +
> +					((lut[i].blue >> 6) &
> LUT_10BIT_MASK);
> +			} else {
> +				diff[0] = abs((lut[i].red >> 6) -
> (lut[i - 1].red >> 6));
> +				diff[1] = abs((lut[i].green >> 6) -
> (lut[i - 1].green >> 6));
> +				diff[2] = abs((lut[i].blue >> 6) -
> (lut[i - 1].blue >> 6));
> +
> +				word = ((diff[0] & LUT_10BIT_MASK) <<
> 20) +
> +					((diff[1] & LUT_10BIT_MASK) <<
> 10) +
> +					(diff[2] & LUT_10BIT_MASK);
> +			}
>  			writel(word, (lut_base + i * 4));
>  		}
>  	}
> @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs,
> struct drm_crtc_state *state)
>  void mtk_gamma_set(struct device *dev, struct drm_crtc_state *state)
>  {
>  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> +	bool lut_diff = false;
> +
> +	if (gamma->data)
> +		lut_diff = gamma->data->lut_diff;
>  
> -	mtk_gamma_set_common(gamma->regs, state);
> +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
>  }
>  
>  void mtk_gamma_config(struct device *dev, unsigned int w,
> @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> mt8173_gamma_driver_data = {
>  	.has_dither = true,
>  };
>  
> +static const struct mtk_disp_gamma_data mt8183_gamma_driver_data = {
> +	.lut_diff = true,
> +};
> +
>  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"},
> +	{ .compatible = "mediatek,mt8183-disp-gamma",
> +	  .data = &mt8183_gamma_driver_data},
>  	{},
>  };
>  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);


_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-21  2:38     ` Rex-BC Chen
  0 siblings, 0 replies; 28+ messages in thread
From: Rex-BC Chen @ 2022-04-21  2:38 UTC (permalink / raw)
  To: Yongqiang Niu, Chun-Kuang Hu
  Cc: Rob Herring, Matthias Brugger, Philipp Zabel, David Airlie,
	Daniel Vetter, Jassi Brar, Fabien Parent, Dennis YC Hsieh,
	devicetree, linux-arm-kernel, linux-mediatek, linux-kernel,
	dri-devel, Project_Global_Chrome_Upstream_Group, Hsin-Yi Wang,
	Yongqiang Niu

On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> From: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com>
> 
> mt8183 gamma module usage is different with before soc,
> gamma odd(index start from 0) lut value set to hardware
> register should be
> the difference of current lut value with last lut value.
> 

Hello Yongqiang,

Do you mean for SoCs before 8183 (like 8173) are using original
method(setting without lut diff) and for 8183/8192/8195/8186, we
need to use the method of lut diff?

> gamma function support both increase and decrease lut.
> chrome os app set increase lut normally.
> 
> for increase lut example, chrome os user space set lut
> like this(only r chanel for example):
> 2 4 6 8 10 12.
> 1) mt8183 gamma driver should set the gamma lut to hardware
> register like this:
> 2 [2] 6 [8] 10 [2]

this should be something like this?
2 [2] 6 [2] 10 [2]

> the value with [] is the difference value
> 2) gamma hardware will restore the lut when apply gamma
> function to display
> 
> Signed-off-by: Yongqiang Niu <
> yongqiang.niu@mediatek.corp-partner.google.com>
> ---
>  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
>  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
>  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++
> ----
>  3 files changed, 32 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> index f46d4ab73d6a..e6378b074a17 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> @@ -23,6 +23,7 @@
>  
>  struct mtk_disp_aal_data {
>  	bool has_gamma;
> +	bool lut_diff;
>  };
>  
>  /**
> @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev, struct
> drm_crtc_state *state)
>  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
>  
>  	if (aal->data && aal->data->has_gamma)
> -		mtk_gamma_set_common(aal->regs, state);
> +		mtk_gamma_set_common(aal->regs, state, aal->data-
> >lut_diff);
>  }
>  
>  void mtk_aal_start(struct device *dev)
> @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> platform_device *pdev)
>  
>  static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
>  	.has_gamma = true,
> +	.lut_diff = false,
>  };
>  
>  static const struct of_device_id mtk_disp_aal_driver_dt_match[] = {
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> index 86c3068894b1..3380651c6707 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev, unsigned
> int w,
>  		      unsigned int h, unsigned int vrefresh,
>  		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
>  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> *state);
> -void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state);
> +void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state, bool lut_diff);
>  void mtk_gamma_start(struct device *dev);
>  void mtk_gamma_stop(struct device *dev);
>  
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> index 3a5815ab4079..fec2e9a5b60d 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> @@ -27,6 +27,7 @@
>  
>  struct mtk_disp_gamma_data {
>  	bool has_dither;
> +	bool lut_diff;
>  };
>  
>  /*
> @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device *dev)
>  	clk_disable_unprepare(gamma->clk);
>  }
>  
> -void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state)
> +void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state, bool lut_diff)
>  {
>  	unsigned int i, reg;
>  	struct drm_color_lut *lut;
>  	void __iomem *lut_base;
>  	u32 word;
> +	u32 diff[3] = {0};
>  
>  	if (state->gamma_lut) {
>  		reg = readl(regs + DISP_GAMMA_CFG);
> @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs,
> struct drm_crtc_state *state)
>  		lut_base = regs + DISP_GAMMA_LUT;
>  		lut = (struct drm_color_lut *)state->gamma_lut->data;
>  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> -			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) <<
> 20) +
> -				(((lut[i].green >> 6) & LUT_10BIT_MASK)
> << 10) +
> -				((lut[i].blue >> 6) & LUT_10BIT_MASK);
> +
> +			if (!lut_diff || (i % 2 == 0)) {

if it's not used lut_diff for the MT8173, it is strange for this
condition.

BRs,
Rex

> +				word = (((lut[i].red >> 6) &
> LUT_10BIT_MASK) << 20) +
> +					(((lut[i].green >> 6) &
> LUT_10BIT_MASK) << 10) +
> +					((lut[i].blue >> 6) &
> LUT_10BIT_MASK);
> +			} else {
> +				diff[0] = abs((lut[i].red >> 6) -
> (lut[i - 1].red >> 6));
> +				diff[1] = abs((lut[i].green >> 6) -
> (lut[i - 1].green >> 6));
> +				diff[2] = abs((lut[i].blue >> 6) -
> (lut[i - 1].blue >> 6));
> +
> +				word = ((diff[0] & LUT_10BIT_MASK) <<
> 20) +
> +					((diff[1] & LUT_10BIT_MASK) <<
> 10) +
> +					(diff[2] & LUT_10BIT_MASK);
> +			}
>  			writel(word, (lut_base + i * 4));
>  		}
>  	}
> @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs,
> struct drm_crtc_state *state)
>  void mtk_gamma_set(struct device *dev, struct drm_crtc_state *state)
>  {
>  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> +	bool lut_diff = false;
> +
> +	if (gamma->data)
> +		lut_diff = gamma->data->lut_diff;
>  
> -	mtk_gamma_set_common(gamma->regs, state);
> +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
>  }
>  
>  void mtk_gamma_config(struct device *dev, unsigned int w,
> @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> mt8173_gamma_driver_data = {
>  	.has_dither = true,
>  };
>  
> +static const struct mtk_disp_gamma_data mt8183_gamma_driver_data = {
> +	.lut_diff = true,
> +};
> +
>  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"},
> +	{ .compatible = "mediatek,mt8183-disp-gamma",
> +	  .data = &mt8183_gamma_driver_data},
>  	{},
>  };
>  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
  2022-04-21  2:38     ` Rex-BC Chen
  (?)
@ 2022-04-21  8:05       ` yongqiang.niu
  -1 siblings, 0 replies; 28+ messages in thread
From: yongqiang.niu @ 2022-04-21  8:05 UTC (permalink / raw)
  To: Rex-BC Chen, Chun-Kuang Hu
  Cc: Yongqiang Niu, devicetree, Project_Global_Chrome_Upstream_Group,
	David Airlie, Jassi Brar, linux-kernel, dri-devel,
	Dennis YC Hsieh, Fabien Parent, Rob Herring, linux-mediatek,
	Hsin-Yi Wang, Matthias Brugger, linux-arm-kernel

On Thu, 2022-04-21 at 10:38 +0800, Rex-BC Chen wrote:
> On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> > From: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com
> > >
> > 
> > mt8183 gamma module usage is different with before soc,
> > gamma odd(index start from 0) lut value set to hardware
> > register should be
> > the difference of current lut value with last lut value.
> > 
> 
> Hello Yongqiang,
> 
> Do you mean for SoCs before 8183 (like 8173) are using original
> method(setting without lut diff) and for 8183/8192/8195/8186, we
> need to use the method of lut diff?
> 
as i know, 8173 use original lut
for other soc, need module maintainer confirm with hardware designer or
ic verifier, or module maintainer test gamma lut function byself.
i will confirm 8192 and 8186

> > gamma function support both increase and decrease lut.
> > chrome os app set increase lut normally.
> > 
> > for increase lut example, chrome os user space set lut
> > like this(only r chanel for example):
> > 2 4 6 8 10 12.
> > 1) mt8183 gamma driver should set the gamma lut to hardware
> > register like this:
> > 2 [2] 6 [8] 10 [2]
> 
> this should be something like this?
> 2 [2] 6 [2] 10 [2]
> 
this is only a sample, the value with [] means that is diff, but not
original lut value
> > the value with [] is the difference value
> > 2) gamma hardware will restore the lut when apply gamma
> > function to display
> > 
> > Signed-off-by: Yongqiang Niu <
> > yongqiang.niu@mediatek.corp-partner.google.com>
> > ---
> >  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
> >  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
> >  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++
> > ----
> >  3 files changed, 32 insertions(+), 8 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > index f46d4ab73d6a..e6378b074a17 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > @@ -23,6 +23,7 @@
> >  
> >  struct mtk_disp_aal_data {
> >  	bool has_gamma;
> > +	bool lut_diff;
> >  };
> >  
> >  /**
> > @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev, struct
> > drm_crtc_state *state)
> >  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
> >  
> >  	if (aal->data && aal->data->has_gamma)
> > -		mtk_gamma_set_common(aal->regs, state);
> > +		mtk_gamma_set_common(aal->regs, state, aal->data-
> > > lut_diff);
> > 
> >  }
> >  
> >  void mtk_aal_start(struct device *dev)
> > @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> > platform_device *pdev)
> >  
> >  static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
> >  	.has_gamma = true,
> > +	.lut_diff = false,
> >  };
> >  
> >  static const struct of_device_id mtk_disp_aal_driver_dt_match[] =
> > {
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > index 86c3068894b1..3380651c6707 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev,
> > unsigned
> > int w,
> >  		      unsigned int h, unsigned int vrefresh,
> >  		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
> >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > *state);
> > -void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state);
> > +void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state, bool lut_diff);
> >  void mtk_gamma_start(struct device *dev);
> >  void mtk_gamma_stop(struct device *dev);
> >  
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > index 3a5815ab4079..fec2e9a5b60d 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > @@ -27,6 +27,7 @@
> >  
> >  struct mtk_disp_gamma_data {
> >  	bool has_dither;
> > +	bool lut_diff;
> >  };
> >  
> >  /*
> > @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device *dev)
> >  	clk_disable_unprepare(gamma->clk);
> >  }
> >  
> > -void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state)
> > +void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state, bool lut_diff)
> >  {
> >  	unsigned int i, reg;
> >  	struct drm_color_lut *lut;
> >  	void __iomem *lut_base;
> >  	u32 word;
> > +	u32 diff[3] = {0};
> >  
> >  	if (state->gamma_lut) {
> >  		reg = readl(regs + DISP_GAMMA_CFG);
> > @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs,
> > struct drm_crtc_state *state)
> >  		lut_base = regs + DISP_GAMMA_LUT;
> >  		lut = (struct drm_color_lut *)state->gamma_lut->data;
> >  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> > -			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) <<
> > 20) +
> > -				(((lut[i].green >> 6) & LUT_10BIT_MASK)
> > << 10) +
> > -				((lut[i].blue >> 6) & LUT_10BIT_MASK);
> > +
> > +			if (!lut_diff || (i % 2 == 0)) {
> 
> if it's not used lut_diff for the MT8173, it is strange for this
> condition.
> 
for the soc which user original lut, lut_diff is false, all original
lut will be set to hardware register
> BRs,
> Rex
> 
> > +				word = (((lut[i].red >> 6) &
> > LUT_10BIT_MASK) << 20) +
> > +					(((lut[i].green >> 6) &
> > LUT_10BIT_MASK) << 10) +
> > +					((lut[i].blue >> 6) &
> > LUT_10BIT_MASK);
> > +			} else {
> > +				diff[0] = abs((lut[i].red >> 6) -
> > (lut[i - 1].red >> 6));
> > +				diff[1] = abs((lut[i].green >> 6) -
> > (lut[i - 1].green >> 6));
> > +				diff[2] = abs((lut[i].blue >> 6) -
> > (lut[i - 1].blue >> 6));
> > +
> > +				word = ((diff[0] & LUT_10BIT_MASK) <<
> > 20) +
> > +					((diff[1] & LUT_10BIT_MASK) <<
> > 10) +
> > +					(diff[2] & LUT_10BIT_MASK);
> > +			}
> >  			writel(word, (lut_base + i * 4));
> >  		}
> >  	}
> > @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs,
> > struct drm_crtc_state *state)
> >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > *state)
> >  {
> >  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> > +	bool lut_diff = false;
> > +
> > +	if (gamma->data)
> > +		lut_diff = gamma->data->lut_diff;
> >  
> > -	mtk_gamma_set_common(gamma->regs, state);
> > +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
> >  }
> >  
> >  void mtk_gamma_config(struct device *dev, unsigned int w,
> > @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> > mt8173_gamma_driver_data = {
> >  	.has_dither = true,
> >  };
> >  
> > +static const struct mtk_disp_gamma_data mt8183_gamma_driver_data =
> > {
> > +	.lut_diff = true,
> > +};
> > +
> >  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"},
> > +	{ .compatible = "mediatek,mt8183-disp-gamma",
> > +	  .data = &mt8183_gamma_driver_data},
> >  	{},
> >  };
> >  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);
> 
> 


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-21  8:05       ` yongqiang.niu
  0 siblings, 0 replies; 28+ messages in thread
From: yongqiang.niu @ 2022-04-21  8:05 UTC (permalink / raw)
  To: Rex-BC Chen, Chun-Kuang Hu
  Cc: Rob Herring, Matthias Brugger, Philipp Zabel, David Airlie,
	Daniel Vetter, Jassi Brar, Fabien Parent, Dennis YC Hsieh,
	devicetree, linux-arm-kernel, linux-mediatek, linux-kernel,
	dri-devel, Project_Global_Chrome_Upstream_Group, Hsin-Yi Wang,
	Yongqiang Niu

On Thu, 2022-04-21 at 10:38 +0800, Rex-BC Chen wrote:
> On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> > From: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com
> > >
> > 
> > mt8183 gamma module usage is different with before soc,
> > gamma odd(index start from 0) lut value set to hardware
> > register should be
> > the difference of current lut value with last lut value.
> > 
> 
> Hello Yongqiang,
> 
> Do you mean for SoCs before 8183 (like 8173) are using original
> method(setting without lut diff) and for 8183/8192/8195/8186, we
> need to use the method of lut diff?
> 
as i know, 8173 use original lut
for other soc, need module maintainer confirm with hardware designer or
ic verifier, or module maintainer test gamma lut function byself.
i will confirm 8192 and 8186

> > gamma function support both increase and decrease lut.
> > chrome os app set increase lut normally.
> > 
> > for increase lut example, chrome os user space set lut
> > like this(only r chanel for example):
> > 2 4 6 8 10 12.
> > 1) mt8183 gamma driver should set the gamma lut to hardware
> > register like this:
> > 2 [2] 6 [8] 10 [2]
> 
> this should be something like this?
> 2 [2] 6 [2] 10 [2]
> 
this is only a sample, the value with [] means that is diff, but not
original lut value
> > the value with [] is the difference value
> > 2) gamma hardware will restore the lut when apply gamma
> > function to display
> > 
> > Signed-off-by: Yongqiang Niu <
> > yongqiang.niu@mediatek.corp-partner.google.com>
> > ---
> >  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
> >  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
> >  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++
> > ----
> >  3 files changed, 32 insertions(+), 8 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > index f46d4ab73d6a..e6378b074a17 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > @@ -23,6 +23,7 @@
> >  
> >  struct mtk_disp_aal_data {
> >  	bool has_gamma;
> > +	bool lut_diff;
> >  };
> >  
> >  /**
> > @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev, struct
> > drm_crtc_state *state)
> >  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
> >  
> >  	if (aal->data && aal->data->has_gamma)
> > -		mtk_gamma_set_common(aal->regs, state);
> > +		mtk_gamma_set_common(aal->regs, state, aal->data-
> > > lut_diff);
> > 
> >  }
> >  
> >  void mtk_aal_start(struct device *dev)
> > @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> > platform_device *pdev)
> >  
> >  static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
> >  	.has_gamma = true,
> > +	.lut_diff = false,
> >  };
> >  
> >  static const struct of_device_id mtk_disp_aal_driver_dt_match[] =
> > {
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > index 86c3068894b1..3380651c6707 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev,
> > unsigned
> > int w,
> >  		      unsigned int h, unsigned int vrefresh,
> >  		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
> >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > *state);
> > -void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state);
> > +void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state, bool lut_diff);
> >  void mtk_gamma_start(struct device *dev);
> >  void mtk_gamma_stop(struct device *dev);
> >  
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > index 3a5815ab4079..fec2e9a5b60d 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > @@ -27,6 +27,7 @@
> >  
> >  struct mtk_disp_gamma_data {
> >  	bool has_dither;
> > +	bool lut_diff;
> >  };
> >  
> >  /*
> > @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device *dev)
> >  	clk_disable_unprepare(gamma->clk);
> >  }
> >  
> > -void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state)
> > +void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state, bool lut_diff)
> >  {
> >  	unsigned int i, reg;
> >  	struct drm_color_lut *lut;
> >  	void __iomem *lut_base;
> >  	u32 word;
> > +	u32 diff[3] = {0};
> >  
> >  	if (state->gamma_lut) {
> >  		reg = readl(regs + DISP_GAMMA_CFG);
> > @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs,
> > struct drm_crtc_state *state)
> >  		lut_base = regs + DISP_GAMMA_LUT;
> >  		lut = (struct drm_color_lut *)state->gamma_lut->data;
> >  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> > -			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) <<
> > 20) +
> > -				(((lut[i].green >> 6) & LUT_10BIT_MASK)
> > << 10) +
> > -				((lut[i].blue >> 6) & LUT_10BIT_MASK);
> > +
> > +			if (!lut_diff || (i % 2 == 0)) {
> 
> if it's not used lut_diff for the MT8173, it is strange for this
> condition.
> 
for the soc which user original lut, lut_diff is false, all original
lut will be set to hardware register
> BRs,
> Rex
> 
> > +				word = (((lut[i].red >> 6) &
> > LUT_10BIT_MASK) << 20) +
> > +					(((lut[i].green >> 6) &
> > LUT_10BIT_MASK) << 10) +
> > +					((lut[i].blue >> 6) &
> > LUT_10BIT_MASK);
> > +			} else {
> > +				diff[0] = abs((lut[i].red >> 6) -
> > (lut[i - 1].red >> 6));
> > +				diff[1] = abs((lut[i].green >> 6) -
> > (lut[i - 1].green >> 6));
> > +				diff[2] = abs((lut[i].blue >> 6) -
> > (lut[i - 1].blue >> 6));
> > +
> > +				word = ((diff[0] & LUT_10BIT_MASK) <<
> > 20) +
> > +					((diff[1] & LUT_10BIT_MASK) <<
> > 10) +
> > +					(diff[2] & LUT_10BIT_MASK);
> > +			}
> >  			writel(word, (lut_base + i * 4));
> >  		}
> >  	}
> > @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs,
> > struct drm_crtc_state *state)
> >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > *state)
> >  {
> >  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> > +	bool lut_diff = false;
> > +
> > +	if (gamma->data)
> > +		lut_diff = gamma->data->lut_diff;
> >  
> > -	mtk_gamma_set_common(gamma->regs, state);
> > +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
> >  }
> >  
> >  void mtk_gamma_config(struct device *dev, unsigned int w,
> > @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> > mt8173_gamma_driver_data = {
> >  	.has_dither = true,
> >  };
> >  
> > +static const struct mtk_disp_gamma_data mt8183_gamma_driver_data =
> > {
> > +	.lut_diff = true,
> > +};
> > +
> >  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"},
> > +	{ .compatible = "mediatek,mt8183-disp-gamma",
> > +	  .data = &mt8183_gamma_driver_data},
> >  	{},
> >  };
> >  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);
> 
> 
_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-21  8:05       ` yongqiang.niu
  0 siblings, 0 replies; 28+ messages in thread
From: yongqiang.niu @ 2022-04-21  8:05 UTC (permalink / raw)
  To: Rex-BC Chen, Chun-Kuang Hu
  Cc: Rob Herring, Matthias Brugger, Philipp Zabel, David Airlie,
	Daniel Vetter, Jassi Brar, Fabien Parent, Dennis YC Hsieh,
	devicetree, linux-arm-kernel, linux-mediatek, linux-kernel,
	dri-devel, Project_Global_Chrome_Upstream_Group, Hsin-Yi Wang,
	Yongqiang Niu

On Thu, 2022-04-21 at 10:38 +0800, Rex-BC Chen wrote:
> On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> > From: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com
> > >
> > 
> > mt8183 gamma module usage is different with before soc,
> > gamma odd(index start from 0) lut value set to hardware
> > register should be
> > the difference of current lut value with last lut value.
> > 
> 
> Hello Yongqiang,
> 
> Do you mean for SoCs before 8183 (like 8173) are using original
> method(setting without lut diff) and for 8183/8192/8195/8186, we
> need to use the method of lut diff?
> 
as i know, 8173 use original lut
for other soc, need module maintainer confirm with hardware designer or
ic verifier, or module maintainer test gamma lut function byself.
i will confirm 8192 and 8186

> > gamma function support both increase and decrease lut.
> > chrome os app set increase lut normally.
> > 
> > for increase lut example, chrome os user space set lut
> > like this(only r chanel for example):
> > 2 4 6 8 10 12.
> > 1) mt8183 gamma driver should set the gamma lut to hardware
> > register like this:
> > 2 [2] 6 [8] 10 [2]
> 
> this should be something like this?
> 2 [2] 6 [2] 10 [2]
> 
this is only a sample, the value with [] means that is diff, but not
original lut value
> > the value with [] is the difference value
> > 2) gamma hardware will restore the lut when apply gamma
> > function to display
> > 
> > Signed-off-by: Yongqiang Niu <
> > yongqiang.niu@mediatek.corp-partner.google.com>
> > ---
> >  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
> >  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
> >  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++
> > ----
> >  3 files changed, 32 insertions(+), 8 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > index f46d4ab73d6a..e6378b074a17 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > @@ -23,6 +23,7 @@
> >  
> >  struct mtk_disp_aal_data {
> >  	bool has_gamma;
> > +	bool lut_diff;
> >  };
> >  
> >  /**
> > @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev, struct
> > drm_crtc_state *state)
> >  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
> >  
> >  	if (aal->data && aal->data->has_gamma)
> > -		mtk_gamma_set_common(aal->regs, state);
> > +		mtk_gamma_set_common(aal->regs, state, aal->data-
> > > lut_diff);
> > 
> >  }
> >  
> >  void mtk_aal_start(struct device *dev)
> > @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> > platform_device *pdev)
> >  
> >  static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
> >  	.has_gamma = true,
> > +	.lut_diff = false,
> >  };
> >  
> >  static const struct of_device_id mtk_disp_aal_driver_dt_match[] =
> > {
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > index 86c3068894b1..3380651c6707 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev,
> > unsigned
> > int w,
> >  		      unsigned int h, unsigned int vrefresh,
> >  		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
> >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > *state);
> > -void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state);
> > +void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state, bool lut_diff);
> >  void mtk_gamma_start(struct device *dev);
> >  void mtk_gamma_stop(struct device *dev);
> >  
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > index 3a5815ab4079..fec2e9a5b60d 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > @@ -27,6 +27,7 @@
> >  
> >  struct mtk_disp_gamma_data {
> >  	bool has_dither;
> > +	bool lut_diff;
> >  };
> >  
> >  /*
> > @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device *dev)
> >  	clk_disable_unprepare(gamma->clk);
> >  }
> >  
> > -void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state)
> > +void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state, bool lut_diff)
> >  {
> >  	unsigned int i, reg;
> >  	struct drm_color_lut *lut;
> >  	void __iomem *lut_base;
> >  	u32 word;
> > +	u32 diff[3] = {0};
> >  
> >  	if (state->gamma_lut) {
> >  		reg = readl(regs + DISP_GAMMA_CFG);
> > @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs,
> > struct drm_crtc_state *state)
> >  		lut_base = regs + DISP_GAMMA_LUT;
> >  		lut = (struct drm_color_lut *)state->gamma_lut->data;
> >  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> > -			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) <<
> > 20) +
> > -				(((lut[i].green >> 6) & LUT_10BIT_MASK)
> > << 10) +
> > -				((lut[i].blue >> 6) & LUT_10BIT_MASK);
> > +
> > +			if (!lut_diff || (i % 2 == 0)) {
> 
> if it's not used lut_diff for the MT8173, it is strange for this
> condition.
> 
for the soc which user original lut, lut_diff is false, all original
lut will be set to hardware register
> BRs,
> Rex
> 
> > +				word = (((lut[i].red >> 6) &
> > LUT_10BIT_MASK) << 20) +
> > +					(((lut[i].green >> 6) &
> > LUT_10BIT_MASK) << 10) +
> > +					((lut[i].blue >> 6) &
> > LUT_10BIT_MASK);
> > +			} else {
> > +				diff[0] = abs((lut[i].red >> 6) -
> > (lut[i - 1].red >> 6));
> > +				diff[1] = abs((lut[i].green >> 6) -
> > (lut[i - 1].green >> 6));
> > +				diff[2] = abs((lut[i].blue >> 6) -
> > (lut[i - 1].blue >> 6));
> > +
> > +				word = ((diff[0] & LUT_10BIT_MASK) <<
> > 20) +
> > +					((diff[1] & LUT_10BIT_MASK) <<
> > 10) +
> > +					(diff[2] & LUT_10BIT_MASK);
> > +			}
> >  			writel(word, (lut_base + i * 4));
> >  		}
> >  	}
> > @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs,
> > struct drm_crtc_state *state)
> >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > *state)
> >  {
> >  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> > +	bool lut_diff = false;
> > +
> > +	if (gamma->data)
> > +		lut_diff = gamma->data->lut_diff;
> >  
> > -	mtk_gamma_set_common(gamma->regs, state);
> > +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
> >  }
> >  
> >  void mtk_gamma_config(struct device *dev, unsigned int w,
> > @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> > mt8173_gamma_driver_data = {
> >  	.has_dither = true,
> >  };
> >  
> > +static const struct mtk_disp_gamma_data mt8183_gamma_driver_data =
> > {
> > +	.lut_diff = true,
> > +};
> > +
> >  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"},
> > +	{ .compatible = "mediatek,mt8183-disp-gamma",
> > +	  .data = &mt8183_gamma_driver_data},
> >  	{},
> >  };
> >  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);
> 
> 
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
  2022-04-20 13:06   ` Yongqiang Niu
  (?)
  (?)
@ 2022-04-26  1:58     ` CK Hu
  -1 siblings, 0 replies; 28+ messages in thread
From: CK Hu @ 2022-04-26  1:58 UTC (permalink / raw)
  To: Yongqiang Niu, Chun-Kuang Hu
  Cc: Yongqiang Niu, devicetree, Project_Global_Chrome_Upstream_Group,
	David Airlie, Jassi Brar, linux-kernel, dri-devel,
	Dennis YC Hsieh, Fabien Parent, Rob Herring, linux-mediatek,
	Hsin-Yi Wang, Matthias Brugger, linux-arm-kernel

Hi, Yongqiang:

On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> From: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com>
> 
> mt8183 gamma module usage is different with before soc,
> gamma odd(index start from 0) lut value set to hardware
> register should be
> the difference of current lut value with last lut value.
> 
> gamma function support both increase and decrease lut.

How to set decrease lut?

Original lut:
12 10 8 6 4 2

Does diff lut look like this?
12 [2] 8 [2] 4 [2]

How does hardware know that this is increase lut or decrease lut?

> chrome os app set increase lut normally.
> 
> for increase lut example, chrome os user space set lut
> like this(only r chanel for example):
> 2 4 6 8 10 12.
> 1) mt8183 gamma driver should set the gamma lut to hardware
> register like this:
> 2 [2] 6 [8] 10 [2]

2 [2] 6 [2] 10 [2]

> the value with [] is the difference value
> 2) gamma hardware will restore the lut when apply gamma
> function to display

I don't know why do you mention the 'restore', any modification is
related to this?

> 
> Signed-off-by: Yongqiang Niu <
> yongqiang.niu@mediatek.corp-partner.google.com>
> ---
>  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
>  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
>  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++
> ----
>  3 files changed, 32 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> index f46d4ab73d6a..e6378b074a17 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> @@ -23,6 +23,7 @@
>  
>  struct mtk_disp_aal_data {
>  	bool has_gamma;
> +	bool lut_diff;
>  };
>  
>  /**
> @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev, struct
> drm_crtc_state *state)
>  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
>  
>  	if (aal->data && aal->data->has_gamma)
> -		mtk_gamma_set_common(aal->regs, state);
> +		mtk_gamma_set_common(aal->regs, state, aal->data-
> >lut_diff);

gamma in aal does not support diff lut, so this would make things
simple.

mtk_gamma_set_common(aal->regs, state, false);

Regards,
CK

>  }
>  
>  void mtk_aal_start(struct device *dev)
> @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> platform_device *pdev)
>  
>  static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
>  	.has_gamma = true,
> +	.lut_diff = false,
>  };
>  
>  static const struct of_device_id mtk_disp_aal_driver_dt_match[] = {
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> index 86c3068894b1..3380651c6707 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev, unsigned
> int w,
>  		      unsigned int h, unsigned int vrefresh,
>  		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
>  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> *state);
> -void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state);
> +void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state, bool lut_diff);
>  void mtk_gamma_start(struct device *dev);
>  void mtk_gamma_stop(struct device *dev);
>  
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> index 3a5815ab4079..fec2e9a5b60d 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> @@ -27,6 +27,7 @@
>  
>  struct mtk_disp_gamma_data {
>  	bool has_dither;
> +	bool lut_diff;
>  };
>  
>  /*
> @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device *dev)
>  	clk_disable_unprepare(gamma->clk);
>  }
>  
> -void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state)
> +void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state, bool lut_diff)
>  {
>  	unsigned int i, reg;
>  	struct drm_color_lut *lut;
>  	void __iomem *lut_base;
>  	u32 word;
> +	u32 diff[3] = {0};
>  
>  	if (state->gamma_lut) {
>  		reg = readl(regs + DISP_GAMMA_CFG);
> @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs,
> struct drm_crtc_state *state)
>  		lut_base = regs + DISP_GAMMA_LUT;
>  		lut = (struct drm_color_lut *)state->gamma_lut->data;
>  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> -			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) <<
> 20) +
> -				(((lut[i].green >> 6) & LUT_10BIT_MASK)
> << 10) +
> -				((lut[i].blue >> 6) & LUT_10BIT_MASK);
> +
> +			if (!lut_diff || (i % 2 == 0)) {
> +				word = (((lut[i].red >> 6) &
> LUT_10BIT_MASK) << 20) +
> +					(((lut[i].green >> 6) &
> LUT_10BIT_MASK) << 10) +
> +					((lut[i].blue >> 6) &
> LUT_10BIT_MASK);
> +			} else {
> +				diff[0] = abs((lut[i].red >> 6) -
> (lut[i - 1].red >> 6));
> +				diff[1] = abs((lut[i].green >> 6) -
> (lut[i - 1].green >> 6));
> +				diff[2] = abs((lut[i].blue >> 6) -
> (lut[i - 1].blue >> 6));
> +
> +				word = ((diff[0] & LUT_10BIT_MASK) <<
> 20) +
> +					((diff[1] & LUT_10BIT_MASK) <<
> 10) +
> +					(diff[2] & LUT_10BIT_MASK);
> +			}
>  			writel(word, (lut_base + i * 4));
>  		}
>  	}
> @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs,
> struct drm_crtc_state *state)
>  void mtk_gamma_set(struct device *dev, struct drm_crtc_state *state)
>  {
>  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> +	bool lut_diff = false;
> +
> +	if (gamma->data)
> +		lut_diff = gamma->data->lut_diff;
>  
> -	mtk_gamma_set_common(gamma->regs, state);
> +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
>  }
>  
>  void mtk_gamma_config(struct device *dev, unsigned int w,
> @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> mt8173_gamma_driver_data = {
>  	.has_dither = true,
>  };
>  
> +static const struct mtk_disp_gamma_data mt8183_gamma_driver_data = {
> +	.lut_diff = true,
> +};
> +
>  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"},
> +	{ .compatible = "mediatek,mt8183-disp-gamma",
> +	  .data = &mt8183_gamma_driver_data},
>  	{},
>  };
>  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-26  1:58     ` CK Hu
  0 siblings, 0 replies; 28+ messages in thread
From: CK Hu @ 2022-04-26  1:58 UTC (permalink / raw)
  To: Yongqiang Niu, Chun-Kuang Hu
  Cc: Yongqiang Niu, devicetree, David Airlie, Dennis YC Hsieh,
	Jassi Brar, linux-kernel, dri-devel,
	Project_Global_Chrome_Upstream_Group, Fabien Parent, Rob Herring,
	linux-mediatek, Hsin-Yi Wang, Matthias Brugger, linux-arm-kernel

Hi, Yongqiang:

On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> From: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com>
> 
> mt8183 gamma module usage is different with before soc,
> gamma odd(index start from 0) lut value set to hardware
> register should be
> the difference of current lut value with last lut value.
> 
> gamma function support both increase and decrease lut.

How to set decrease lut?

Original lut:
12 10 8 6 4 2

Does diff lut look like this?
12 [2] 8 [2] 4 [2]

How does hardware know that this is increase lut or decrease lut?

> chrome os app set increase lut normally.
> 
> for increase lut example, chrome os user space set lut
> like this(only r chanel for example):
> 2 4 6 8 10 12.
> 1) mt8183 gamma driver should set the gamma lut to hardware
> register like this:
> 2 [2] 6 [8] 10 [2]

2 [2] 6 [2] 10 [2]

> the value with [] is the difference value
> 2) gamma hardware will restore the lut when apply gamma
> function to display

I don't know why do you mention the 'restore', any modification is
related to this?

> 
> Signed-off-by: Yongqiang Niu <
> yongqiang.niu@mediatek.corp-partner.google.com>
> ---
>  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
>  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
>  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++
> ----
>  3 files changed, 32 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> index f46d4ab73d6a..e6378b074a17 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> @@ -23,6 +23,7 @@
>  
>  struct mtk_disp_aal_data {
>  	bool has_gamma;
> +	bool lut_diff;
>  };
>  
>  /**
> @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev, struct
> drm_crtc_state *state)
>  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
>  
>  	if (aal->data && aal->data->has_gamma)
> -		mtk_gamma_set_common(aal->regs, state);
> +		mtk_gamma_set_common(aal->regs, state, aal->data-
> >lut_diff);

gamma in aal does not support diff lut, so this would make things
simple.

mtk_gamma_set_common(aal->regs, state, false);

Regards,
CK

>  }
>  
>  void mtk_aal_start(struct device *dev)
> @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> platform_device *pdev)
>  
>  static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
>  	.has_gamma = true,
> +	.lut_diff = false,
>  };
>  
>  static const struct of_device_id mtk_disp_aal_driver_dt_match[] = {
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> index 86c3068894b1..3380651c6707 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev, unsigned
> int w,
>  		      unsigned int h, unsigned int vrefresh,
>  		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
>  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> *state);
> -void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state);
> +void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state, bool lut_diff);
>  void mtk_gamma_start(struct device *dev);
>  void mtk_gamma_stop(struct device *dev);
>  
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> index 3a5815ab4079..fec2e9a5b60d 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> @@ -27,6 +27,7 @@
>  
>  struct mtk_disp_gamma_data {
>  	bool has_dither;
> +	bool lut_diff;
>  };
>  
>  /*
> @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device *dev)
>  	clk_disable_unprepare(gamma->clk);
>  }
>  
> -void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state)
> +void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state, bool lut_diff)
>  {
>  	unsigned int i, reg;
>  	struct drm_color_lut *lut;
>  	void __iomem *lut_base;
>  	u32 word;
> +	u32 diff[3] = {0};
>  
>  	if (state->gamma_lut) {
>  		reg = readl(regs + DISP_GAMMA_CFG);
> @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs,
> struct drm_crtc_state *state)
>  		lut_base = regs + DISP_GAMMA_LUT;
>  		lut = (struct drm_color_lut *)state->gamma_lut->data;
>  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> -			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) <<
> 20) +
> -				(((lut[i].green >> 6) & LUT_10BIT_MASK)
> << 10) +
> -				((lut[i].blue >> 6) & LUT_10BIT_MASK);
> +
> +			if (!lut_diff || (i % 2 == 0)) {
> +				word = (((lut[i].red >> 6) &
> LUT_10BIT_MASK) << 20) +
> +					(((lut[i].green >> 6) &
> LUT_10BIT_MASK) << 10) +
> +					((lut[i].blue >> 6) &
> LUT_10BIT_MASK);
> +			} else {
> +				diff[0] = abs((lut[i].red >> 6) -
> (lut[i - 1].red >> 6));
> +				diff[1] = abs((lut[i].green >> 6) -
> (lut[i - 1].green >> 6));
> +				diff[2] = abs((lut[i].blue >> 6) -
> (lut[i - 1].blue >> 6));
> +
> +				word = ((diff[0] & LUT_10BIT_MASK) <<
> 20) +
> +					((diff[1] & LUT_10BIT_MASK) <<
> 10) +
> +					(diff[2] & LUT_10BIT_MASK);
> +			}
>  			writel(word, (lut_base + i * 4));
>  		}
>  	}
> @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs,
> struct drm_crtc_state *state)
>  void mtk_gamma_set(struct device *dev, struct drm_crtc_state *state)
>  {
>  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> +	bool lut_diff = false;
> +
> +	if (gamma->data)
> +		lut_diff = gamma->data->lut_diff;
>  
> -	mtk_gamma_set_common(gamma->regs, state);
> +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
>  }
>  
>  void mtk_gamma_config(struct device *dev, unsigned int w,
> @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> mt8173_gamma_driver_data = {
>  	.has_dither = true,
>  };
>  
> +static const struct mtk_disp_gamma_data mt8183_gamma_driver_data = {
> +	.lut_diff = true,
> +};
> +
>  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"},
> +	{ .compatible = "mediatek,mt8183-disp-gamma",
> +	  .data = &mt8183_gamma_driver_data},
>  	{},
>  };
>  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-26  1:58     ` CK Hu
  0 siblings, 0 replies; 28+ messages in thread
From: CK Hu @ 2022-04-26  1:58 UTC (permalink / raw)
  To: Yongqiang Niu, Chun-Kuang Hu
  Cc: Yongqiang Niu, devicetree, Project_Global_Chrome_Upstream_Group,
	David Airlie, Jassi Brar, linux-kernel, dri-devel,
	Dennis YC Hsieh, Fabien Parent, Rob Herring, linux-mediatek,
	Hsin-Yi Wang, Matthias Brugger, linux-arm-kernel

Hi, Yongqiang:

On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> From: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com>
> 
> mt8183 gamma module usage is different with before soc,
> gamma odd(index start from 0) lut value set to hardware
> register should be
> the difference of current lut value with last lut value.
> 
> gamma function support both increase and decrease lut.

How to set decrease lut?

Original lut:
12 10 8 6 4 2

Does diff lut look like this?
12 [2] 8 [2] 4 [2]

How does hardware know that this is increase lut or decrease lut?

> chrome os app set increase lut normally.
> 
> for increase lut example, chrome os user space set lut
> like this(only r chanel for example):
> 2 4 6 8 10 12.
> 1) mt8183 gamma driver should set the gamma lut to hardware
> register like this:
> 2 [2] 6 [8] 10 [2]

2 [2] 6 [2] 10 [2]

> the value with [] is the difference value
> 2) gamma hardware will restore the lut when apply gamma
> function to display

I don't know why do you mention the 'restore', any modification is
related to this?

> 
> Signed-off-by: Yongqiang Niu <
> yongqiang.niu@mediatek.corp-partner.google.com>
> ---
>  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
>  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
>  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++
> ----
>  3 files changed, 32 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> index f46d4ab73d6a..e6378b074a17 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> @@ -23,6 +23,7 @@
>  
>  struct mtk_disp_aal_data {
>  	bool has_gamma;
> +	bool lut_diff;
>  };
>  
>  /**
> @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev, struct
> drm_crtc_state *state)
>  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
>  
>  	if (aal->data && aal->data->has_gamma)
> -		mtk_gamma_set_common(aal->regs, state);
> +		mtk_gamma_set_common(aal->regs, state, aal->data-
> >lut_diff);

gamma in aal does not support diff lut, so this would make things
simple.

mtk_gamma_set_common(aal->regs, state, false);

Regards,
CK

>  }
>  
>  void mtk_aal_start(struct device *dev)
> @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> platform_device *pdev)
>  
>  static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
>  	.has_gamma = true,
> +	.lut_diff = false,
>  };
>  
>  static const struct of_device_id mtk_disp_aal_driver_dt_match[] = {
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> index 86c3068894b1..3380651c6707 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev, unsigned
> int w,
>  		      unsigned int h, unsigned int vrefresh,
>  		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
>  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> *state);
> -void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state);
> +void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state, bool lut_diff);
>  void mtk_gamma_start(struct device *dev);
>  void mtk_gamma_stop(struct device *dev);
>  
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> index 3a5815ab4079..fec2e9a5b60d 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> @@ -27,6 +27,7 @@
>  
>  struct mtk_disp_gamma_data {
>  	bool has_dither;
> +	bool lut_diff;
>  };
>  
>  /*
> @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device *dev)
>  	clk_disable_unprepare(gamma->clk);
>  }
>  
> -void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state)
> +void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state, bool lut_diff)
>  {
>  	unsigned int i, reg;
>  	struct drm_color_lut *lut;
>  	void __iomem *lut_base;
>  	u32 word;
> +	u32 diff[3] = {0};
>  
>  	if (state->gamma_lut) {
>  		reg = readl(regs + DISP_GAMMA_CFG);
> @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs,
> struct drm_crtc_state *state)
>  		lut_base = regs + DISP_GAMMA_LUT;
>  		lut = (struct drm_color_lut *)state->gamma_lut->data;
>  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> -			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) <<
> 20) +
> -				(((lut[i].green >> 6) & LUT_10BIT_MASK)
> << 10) +
> -				((lut[i].blue >> 6) & LUT_10BIT_MASK);
> +
> +			if (!lut_diff || (i % 2 == 0)) {
> +				word = (((lut[i].red >> 6) &
> LUT_10BIT_MASK) << 20) +
> +					(((lut[i].green >> 6) &
> LUT_10BIT_MASK) << 10) +
> +					((lut[i].blue >> 6) &
> LUT_10BIT_MASK);
> +			} else {
> +				diff[0] = abs((lut[i].red >> 6) -
> (lut[i - 1].red >> 6));
> +				diff[1] = abs((lut[i].green >> 6) -
> (lut[i - 1].green >> 6));
> +				diff[2] = abs((lut[i].blue >> 6) -
> (lut[i - 1].blue >> 6));
> +
> +				word = ((diff[0] & LUT_10BIT_MASK) <<
> 20) +
> +					((diff[1] & LUT_10BIT_MASK) <<
> 10) +
> +					(diff[2] & LUT_10BIT_MASK);
> +			}
>  			writel(word, (lut_base + i * 4));
>  		}
>  	}
> @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs,
> struct drm_crtc_state *state)
>  void mtk_gamma_set(struct device *dev, struct drm_crtc_state *state)
>  {
>  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> +	bool lut_diff = false;
> +
> +	if (gamma->data)
> +		lut_diff = gamma->data->lut_diff;
>  
> -	mtk_gamma_set_common(gamma->regs, state);
> +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
>  }
>  
>  void mtk_gamma_config(struct device *dev, unsigned int w,
> @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> mt8173_gamma_driver_data = {
>  	.has_dither = true,
>  };
>  
> +static const struct mtk_disp_gamma_data mt8183_gamma_driver_data = {
> +	.lut_diff = true,
> +};
> +
>  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"},
> +	{ .compatible = "mediatek,mt8183-disp-gamma",
> +	  .data = &mt8183_gamma_driver_data},
>  	{},
>  };
>  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);


_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-26  1:58     ` CK Hu
  0 siblings, 0 replies; 28+ messages in thread
From: CK Hu @ 2022-04-26  1:58 UTC (permalink / raw)
  To: Yongqiang Niu, Chun-Kuang Hu
  Cc: Yongqiang Niu, devicetree, Project_Global_Chrome_Upstream_Group,
	David Airlie, Jassi Brar, linux-kernel, dri-devel,
	Dennis YC Hsieh, Fabien Parent, Rob Herring, linux-mediatek,
	Hsin-Yi Wang, Matthias Brugger, linux-arm-kernel

Hi, Yongqiang:

On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> From: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com>
> 
> mt8183 gamma module usage is different with before soc,
> gamma odd(index start from 0) lut value set to hardware
> register should be
> the difference of current lut value with last lut value.
> 
> gamma function support both increase and decrease lut.

How to set decrease lut?

Original lut:
12 10 8 6 4 2

Does diff lut look like this?
12 [2] 8 [2] 4 [2]

How does hardware know that this is increase lut or decrease lut?

> chrome os app set increase lut normally.
> 
> for increase lut example, chrome os user space set lut
> like this(only r chanel for example):
> 2 4 6 8 10 12.
> 1) mt8183 gamma driver should set the gamma lut to hardware
> register like this:
> 2 [2] 6 [8] 10 [2]

2 [2] 6 [2] 10 [2]

> the value with [] is the difference value
> 2) gamma hardware will restore the lut when apply gamma
> function to display

I don't know why do you mention the 'restore', any modification is
related to this?

> 
> Signed-off-by: Yongqiang Niu <
> yongqiang.niu@mediatek.corp-partner.google.com>
> ---
>  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
>  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
>  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++
> ----
>  3 files changed, 32 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> index f46d4ab73d6a..e6378b074a17 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> @@ -23,6 +23,7 @@
>  
>  struct mtk_disp_aal_data {
>  	bool has_gamma;
> +	bool lut_diff;
>  };
>  
>  /**
> @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev, struct
> drm_crtc_state *state)
>  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
>  
>  	if (aal->data && aal->data->has_gamma)
> -		mtk_gamma_set_common(aal->regs, state);
> +		mtk_gamma_set_common(aal->regs, state, aal->data-
> >lut_diff);

gamma in aal does not support diff lut, so this would make things
simple.

mtk_gamma_set_common(aal->regs, state, false);

Regards,
CK

>  }
>  
>  void mtk_aal_start(struct device *dev)
> @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> platform_device *pdev)
>  
>  static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
>  	.has_gamma = true,
> +	.lut_diff = false,
>  };
>  
>  static const struct of_device_id mtk_disp_aal_driver_dt_match[] = {
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> index 86c3068894b1..3380651c6707 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev, unsigned
> int w,
>  		      unsigned int h, unsigned int vrefresh,
>  		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
>  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> *state);
> -void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state);
> +void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state, bool lut_diff);
>  void mtk_gamma_start(struct device *dev);
>  void mtk_gamma_stop(struct device *dev);
>  
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> index 3a5815ab4079..fec2e9a5b60d 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> @@ -27,6 +27,7 @@
>  
>  struct mtk_disp_gamma_data {
>  	bool has_dither;
> +	bool lut_diff;
>  };
>  
>  /*
> @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device *dev)
>  	clk_disable_unprepare(gamma->clk);
>  }
>  
> -void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state)
> +void mtk_gamma_set_common(void __iomem *regs, struct drm_crtc_state
> *state, bool lut_diff)
>  {
>  	unsigned int i, reg;
>  	struct drm_color_lut *lut;
>  	void __iomem *lut_base;
>  	u32 word;
> +	u32 diff[3] = {0};
>  
>  	if (state->gamma_lut) {
>  		reg = readl(regs + DISP_GAMMA_CFG);
> @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs,
> struct drm_crtc_state *state)
>  		lut_base = regs + DISP_GAMMA_LUT;
>  		lut = (struct drm_color_lut *)state->gamma_lut->data;
>  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> -			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) <<
> 20) +
> -				(((lut[i].green >> 6) & LUT_10BIT_MASK)
> << 10) +
> -				((lut[i].blue >> 6) & LUT_10BIT_MASK);
> +
> +			if (!lut_diff || (i % 2 == 0)) {
> +				word = (((lut[i].red >> 6) &
> LUT_10BIT_MASK) << 20) +
> +					(((lut[i].green >> 6) &
> LUT_10BIT_MASK) << 10) +
> +					((lut[i].blue >> 6) &
> LUT_10BIT_MASK);
> +			} else {
> +				diff[0] = abs((lut[i].red >> 6) -
> (lut[i - 1].red >> 6));
> +				diff[1] = abs((lut[i].green >> 6) -
> (lut[i - 1].green >> 6));
> +				diff[2] = abs((lut[i].blue >> 6) -
> (lut[i - 1].blue >> 6));
> +
> +				word = ((diff[0] & LUT_10BIT_MASK) <<
> 20) +
> +					((diff[1] & LUT_10BIT_MASK) <<
> 10) +
> +					(diff[2] & LUT_10BIT_MASK);
> +			}
>  			writel(word, (lut_base + i * 4));
>  		}
>  	}
> @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs,
> struct drm_crtc_state *state)
>  void mtk_gamma_set(struct device *dev, struct drm_crtc_state *state)
>  {
>  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> +	bool lut_diff = false;
> +
> +	if (gamma->data)
> +		lut_diff = gamma->data->lut_diff;
>  
> -	mtk_gamma_set_common(gamma->regs, state);
> +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
>  }
>  
>  void mtk_gamma_config(struct device *dev, unsigned int w,
> @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> mt8173_gamma_driver_data = {
>  	.has_dither = true,
>  };
>  
> +static const struct mtk_disp_gamma_data mt8183_gamma_driver_data = {
> +	.lut_diff = true,
> +};
> +
>  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"},
> +	{ .compatible = "mediatek,mt8183-disp-gamma",
> +	  .data = &mt8183_gamma_driver_data},
>  	{},
>  };
>  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
  2022-04-26  1:58     ` CK Hu
  (?)
@ 2022-04-26  2:39       ` yongqiang.niu
  -1 siblings, 0 replies; 28+ messages in thread
From: yongqiang.niu @ 2022-04-26  2:39 UTC (permalink / raw)
  To: CK Hu, Chun-Kuang Hu
  Cc: Yongqiang Niu, devicetree, David Airlie, Dennis YC Hsieh,
	Jassi Brar, linux-kernel, dri-devel,
	Project_Global_Chrome_Upstream_Group, Fabien Parent, Rob Herring,
	linux-mediatek, Hsin-Yi Wang, Matthias Brugger, linux-arm-kernel

On Tue, 2022-04-26 at 09:58 +0800, CK Hu wrote:
> Hi, Yongqiang:
> 
> On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> > From: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com
> > >
> > 
> > mt8183 gamma module usage is different with before soc,
> > gamma odd(index start from 0) lut value set to hardware
> > register should be
> > the difference of current lut value with last lut value.
> > 
> > gamma function support both increase and decrease lut.
> 
> How to set decrease lut?
> 
> Original lut:
> 12 10 8 6 4 2
> 
> Does diff lut look like this?
> 12 [2] 8 [2] 4 [2]
> 
yes

> How does hardware know that this is increase lut or decrease lut?

gamma register 0x20 , bit 2, 
if this bit set to 1, hardware will know lut is decrease.
this bit default is 0, that means lut is increase

> 
> > chrome os app set increase lut normally.
> > 
> > for increase lut example, chrome os user space set lut
> > like this(only r chanel for example):
> > 2 4 6 8 10 12.
> > 1) mt8183 gamma driver should set the gamma lut to hardware
> > register like this:
> > 2 [2] 6 [8] 10 [2]
> 
> 2 [2] 6 [2] 10 [2]
> 
> > the value with [] is the difference value
> > 2) gamma hardware will restore the lut when apply gamma
> > function to display
> 
> I don't know why do you mention the 'restore', any modification is
> related to this?
> 
that means gamma
hardware process display data with original lut
> > 
> > Signed-off-by: Yongqiang Niu <
> > yongqiang.niu@mediatek.corp-partner.google.com>
> > ---
> >  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
> >  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
> >  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++
> > ----
> >  3 files changed, 32 insertions(+), 8 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > index f46d4ab73d6a..e6378b074a17 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > @@ -23,6 +23,7 @@
> >  
> >  struct mtk_disp_aal_data {
> >  	bool has_gamma;
> > +	bool lut_diff;
> >  };
> >  
> >  /**
> > @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev, struct
> > drm_crtc_state *state)
> >  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
> >  
> >  	if (aal->data && aal->data->has_gamma)
> > -		mtk_gamma_set_common(aal->regs, state);
> > +		mtk_gamma_set_common(aal->regs, state, aal->data-
> > > lut_diff);
> 
> gamma in aal does not support diff lut, so this would make things
> simple.
> 
> mtk_gamma_set_common(aal->regs, state, false);

fix next version
> 
> Regards,
> CK
> 
> >  }
> >  
> >  void mtk_aal_start(struct device *dev)
> > @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> > platform_device *pdev)
> >  
> >  static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
> >  	.has_gamma = true,
> > +	.lut_diff = false,
> >  };
> >  
> >  static const struct of_device_id mtk_disp_aal_driver_dt_match[] =
> > {
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > index 86c3068894b1..3380651c6707 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev,
> > unsigned
> > int w,
> >  		      unsigned int h, unsigned int vrefresh,
> >  		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
> >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > *state);
> > -void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state);
> > +void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state, bool lut_diff);
> >  void mtk_gamma_start(struct device *dev);
> >  void mtk_gamma_stop(struct device *dev);
> >  
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > index 3a5815ab4079..fec2e9a5b60d 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > @@ -27,6 +27,7 @@
> >  
> >  struct mtk_disp_gamma_data {
> >  	bool has_dither;
> > +	bool lut_diff;
> >  };
> >  
> >  /*
> > @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device *dev)
> >  	clk_disable_unprepare(gamma->clk);
> >  }
> >  
> > -void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state)
> > +void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state, bool lut_diff)
> >  {
> >  	unsigned int i, reg;
> >  	struct drm_color_lut *lut;
> >  	void __iomem *lut_base;
> >  	u32 word;
> > +	u32 diff[3] = {0};
> >  
> >  	if (state->gamma_lut) {
> >  		reg = readl(regs + DISP_GAMMA_CFG);
> > @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs,
> > struct drm_crtc_state *state)
> >  		lut_base = regs + DISP_GAMMA_LUT;
> >  		lut = (struct drm_color_lut *)state->gamma_lut->data;
> >  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> > -			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) <<
> > 20) +
> > -				(((lut[i].green >> 6) & LUT_10BIT_MASK)
> > << 10) +
> > -				((lut[i].blue >> 6) & LUT_10BIT_MASK);
> > +
> > +			if (!lut_diff || (i % 2 == 0)) {
> > +				word = (((lut[i].red >> 6) &
> > LUT_10BIT_MASK) << 20) +
> > +					(((lut[i].green >> 6) &
> > LUT_10BIT_MASK) << 10) +
> > +					((lut[i].blue >> 6) &
> > LUT_10BIT_MASK);
> > +			} else {
> > +				diff[0] = abs((lut[i].red >> 6) -
> > (lut[i - 1].red >> 6));
> > +				diff[1] = abs((lut[i].green >> 6) -
> > (lut[i - 1].green >> 6));
> > +				diff[2] = abs((lut[i].blue >> 6) -
> > (lut[i - 1].blue >> 6));
> > +
> > +				word = ((diff[0] & LUT_10BIT_MASK) <<
> > 20) +
> > +					((diff[1] & LUT_10BIT_MASK) <<
> > 10) +
> > +					(diff[2] & LUT_10BIT_MASK);
> > +			}
> >  			writel(word, (lut_base + i * 4));
> >  		}
> >  	}
> > @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs,
> > struct drm_crtc_state *state)
> >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > *state)
> >  {
> >  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> > +	bool lut_diff = false;
> > +
> > +	if (gamma->data)
> > +		lut_diff = gamma->data->lut_diff;
> >  
> > -	mtk_gamma_set_common(gamma->regs, state);
> > +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
> >  }
> >  
> >  void mtk_gamma_config(struct device *dev, unsigned int w,
> > @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> > mt8173_gamma_driver_data = {
> >  	.has_dither = true,
> >  };
> >  
> > +static const struct mtk_disp_gamma_data mt8183_gamma_driver_data =
> > {
> > +	.lut_diff = true,
> > +};
> > +
> >  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"},
> > +	{ .compatible = "mediatek,mt8183-disp-gamma",
> > +	  .data = &mt8183_gamma_driver_data},
> >  	{},
> >  };
> >  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);
> 
> 


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-26  2:39       ` yongqiang.niu
  0 siblings, 0 replies; 28+ messages in thread
From: yongqiang.niu @ 2022-04-26  2:39 UTC (permalink / raw)
  To: CK Hu, Chun-Kuang Hu
  Cc: Yongqiang Niu, devicetree, Project_Global_Chrome_Upstream_Group,
	David Airlie, Jassi Brar, linux-kernel, dri-devel,
	Dennis YC Hsieh, Fabien Parent, Rob Herring, linux-mediatek,
	Hsin-Yi Wang, Matthias Brugger, linux-arm-kernel

On Tue, 2022-04-26 at 09:58 +0800, CK Hu wrote:
> Hi, Yongqiang:
> 
> On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> > From: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com
> > >
> > 
> > mt8183 gamma module usage is different with before soc,
> > gamma odd(index start from 0) lut value set to hardware
> > register should be
> > the difference of current lut value with last lut value.
> > 
> > gamma function support both increase and decrease lut.
> 
> How to set decrease lut?
> 
> Original lut:
> 12 10 8 6 4 2
> 
> Does diff lut look like this?
> 12 [2] 8 [2] 4 [2]
> 
yes

> How does hardware know that this is increase lut or decrease lut?

gamma register 0x20 , bit 2, 
if this bit set to 1, hardware will know lut is decrease.
this bit default is 0, that means lut is increase

> 
> > chrome os app set increase lut normally.
> > 
> > for increase lut example, chrome os user space set lut
> > like this(only r chanel for example):
> > 2 4 6 8 10 12.
> > 1) mt8183 gamma driver should set the gamma lut to hardware
> > register like this:
> > 2 [2] 6 [8] 10 [2]
> 
> 2 [2] 6 [2] 10 [2]
> 
> > the value with [] is the difference value
> > 2) gamma hardware will restore the lut when apply gamma
> > function to display
> 
> I don't know why do you mention the 'restore', any modification is
> related to this?
> 
that means gamma
hardware process display data with original lut
> > 
> > Signed-off-by: Yongqiang Niu <
> > yongqiang.niu@mediatek.corp-partner.google.com>
> > ---
> >  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
> >  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
> >  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++
> > ----
> >  3 files changed, 32 insertions(+), 8 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > index f46d4ab73d6a..e6378b074a17 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > @@ -23,6 +23,7 @@
> >  
> >  struct mtk_disp_aal_data {
> >  	bool has_gamma;
> > +	bool lut_diff;
> >  };
> >  
> >  /**
> > @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev, struct
> > drm_crtc_state *state)
> >  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
> >  
> >  	if (aal->data && aal->data->has_gamma)
> > -		mtk_gamma_set_common(aal->regs, state);
> > +		mtk_gamma_set_common(aal->regs, state, aal->data-
> > > lut_diff);
> 
> gamma in aal does not support diff lut, so this would make things
> simple.
> 
> mtk_gamma_set_common(aal->regs, state, false);

fix next version
> 
> Regards,
> CK
> 
> >  }
> >  
> >  void mtk_aal_start(struct device *dev)
> > @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> > platform_device *pdev)
> >  
> >  static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
> >  	.has_gamma = true,
> > +	.lut_diff = false,
> >  };
> >  
> >  static const struct of_device_id mtk_disp_aal_driver_dt_match[] =
> > {
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > index 86c3068894b1..3380651c6707 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev,
> > unsigned
> > int w,
> >  		      unsigned int h, unsigned int vrefresh,
> >  		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
> >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > *state);
> > -void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state);
> > +void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state, bool lut_diff);
> >  void mtk_gamma_start(struct device *dev);
> >  void mtk_gamma_stop(struct device *dev);
> >  
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > index 3a5815ab4079..fec2e9a5b60d 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > @@ -27,6 +27,7 @@
> >  
> >  struct mtk_disp_gamma_data {
> >  	bool has_dither;
> > +	bool lut_diff;
> >  };
> >  
> >  /*
> > @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device *dev)
> >  	clk_disable_unprepare(gamma->clk);
> >  }
> >  
> > -void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state)
> > +void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state, bool lut_diff)
> >  {
> >  	unsigned int i, reg;
> >  	struct drm_color_lut *lut;
> >  	void __iomem *lut_base;
> >  	u32 word;
> > +	u32 diff[3] = {0};
> >  
> >  	if (state->gamma_lut) {
> >  		reg = readl(regs + DISP_GAMMA_CFG);
> > @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs,
> > struct drm_crtc_state *state)
> >  		lut_base = regs + DISP_GAMMA_LUT;
> >  		lut = (struct drm_color_lut *)state->gamma_lut->data;
> >  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> > -			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) <<
> > 20) +
> > -				(((lut[i].green >> 6) & LUT_10BIT_MASK)
> > << 10) +
> > -				((lut[i].blue >> 6) & LUT_10BIT_MASK);
> > +
> > +			if (!lut_diff || (i % 2 == 0)) {
> > +				word = (((lut[i].red >> 6) &
> > LUT_10BIT_MASK) << 20) +
> > +					(((lut[i].green >> 6) &
> > LUT_10BIT_MASK) << 10) +
> > +					((lut[i].blue >> 6) &
> > LUT_10BIT_MASK);
> > +			} else {
> > +				diff[0] = abs((lut[i].red >> 6) -
> > (lut[i - 1].red >> 6));
> > +				diff[1] = abs((lut[i].green >> 6) -
> > (lut[i - 1].green >> 6));
> > +				diff[2] = abs((lut[i].blue >> 6) -
> > (lut[i - 1].blue >> 6));
> > +
> > +				word = ((diff[0] & LUT_10BIT_MASK) <<
> > 20) +
> > +					((diff[1] & LUT_10BIT_MASK) <<
> > 10) +
> > +					(diff[2] & LUT_10BIT_MASK);
> > +			}
> >  			writel(word, (lut_base + i * 4));
> >  		}
> >  	}
> > @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs,
> > struct drm_crtc_state *state)
> >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > *state)
> >  {
> >  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> > +	bool lut_diff = false;
> > +
> > +	if (gamma->data)
> > +		lut_diff = gamma->data->lut_diff;
> >  
> > -	mtk_gamma_set_common(gamma->regs, state);
> > +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
> >  }
> >  
> >  void mtk_gamma_config(struct device *dev, unsigned int w,
> > @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> > mt8173_gamma_driver_data = {
> >  	.has_dither = true,
> >  };
> >  
> > +static const struct mtk_disp_gamma_data mt8183_gamma_driver_data =
> > {
> > +	.lut_diff = true,
> > +};
> > +
> >  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"},
> > +	{ .compatible = "mediatek,mt8183-disp-gamma",
> > +	  .data = &mt8183_gamma_driver_data},
> >  	{},
> >  };
> >  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);
> 
> 
_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-26  2:39       ` yongqiang.niu
  0 siblings, 0 replies; 28+ messages in thread
From: yongqiang.niu @ 2022-04-26  2:39 UTC (permalink / raw)
  To: CK Hu, Chun-Kuang Hu
  Cc: Yongqiang Niu, devicetree, Project_Global_Chrome_Upstream_Group,
	David Airlie, Jassi Brar, linux-kernel, dri-devel,
	Dennis YC Hsieh, Fabien Parent, Rob Herring, linux-mediatek,
	Hsin-Yi Wang, Matthias Brugger, linux-arm-kernel

On Tue, 2022-04-26 at 09:58 +0800, CK Hu wrote:
> Hi, Yongqiang:
> 
> On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> > From: Yongqiang Niu <yongqiang.niu@mediatek.corp-partner.google.com
> > >
> > 
> > mt8183 gamma module usage is different with before soc,
> > gamma odd(index start from 0) lut value set to hardware
> > register should be
> > the difference of current lut value with last lut value.
> > 
> > gamma function support both increase and decrease lut.
> 
> How to set decrease lut?
> 
> Original lut:
> 12 10 8 6 4 2
> 
> Does diff lut look like this?
> 12 [2] 8 [2] 4 [2]
> 
yes

> How does hardware know that this is increase lut or decrease lut?

gamma register 0x20 , bit 2, 
if this bit set to 1, hardware will know lut is decrease.
this bit default is 0, that means lut is increase

> 
> > chrome os app set increase lut normally.
> > 
> > for increase lut example, chrome os user space set lut
> > like this(only r chanel for example):
> > 2 4 6 8 10 12.
> > 1) mt8183 gamma driver should set the gamma lut to hardware
> > register like this:
> > 2 [2] 6 [8] 10 [2]
> 
> 2 [2] 6 [2] 10 [2]
> 
> > the value with [] is the difference value
> > 2) gamma hardware will restore the lut when apply gamma
> > function to display
> 
> I don't know why do you mention the 'restore', any modification is
> related to this?
> 
that means gamma
hardware process display data with original lut
> > 
> > Signed-off-by: Yongqiang Niu <
> > yongqiang.niu@mediatek.corp-partner.google.com>
> > ---
> >  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
> >  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
> >  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34 +++++++++++++++++++
> > ----
> >  3 files changed, 32 insertions(+), 8 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > index f46d4ab73d6a..e6378b074a17 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > @@ -23,6 +23,7 @@
> >  
> >  struct mtk_disp_aal_data {
> >  	bool has_gamma;
> > +	bool lut_diff;
> >  };
> >  
> >  /**
> > @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev, struct
> > drm_crtc_state *state)
> >  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
> >  
> >  	if (aal->data && aal->data->has_gamma)
> > -		mtk_gamma_set_common(aal->regs, state);
> > +		mtk_gamma_set_common(aal->regs, state, aal->data-
> > > lut_diff);
> 
> gamma in aal does not support diff lut, so this would make things
> simple.
> 
> mtk_gamma_set_common(aal->regs, state, false);

fix next version
> 
> Regards,
> CK
> 
> >  }
> >  
> >  void mtk_aal_start(struct device *dev)
> > @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> > platform_device *pdev)
> >  
> >  static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
> >  	.has_gamma = true,
> > +	.lut_diff = false,
> >  };
> >  
> >  static const struct of_device_id mtk_disp_aal_driver_dt_match[] =
> > {
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > index 86c3068894b1..3380651c6707 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev,
> > unsigned
> > int w,
> >  		      unsigned int h, unsigned int vrefresh,
> >  		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
> >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > *state);
> > -void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state);
> > +void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state, bool lut_diff);
> >  void mtk_gamma_start(struct device *dev);
> >  void mtk_gamma_stop(struct device *dev);
> >  
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > index 3a5815ab4079..fec2e9a5b60d 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > @@ -27,6 +27,7 @@
> >  
> >  struct mtk_disp_gamma_data {
> >  	bool has_dither;
> > +	bool lut_diff;
> >  };
> >  
> >  /*
> > @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device *dev)
> >  	clk_disable_unprepare(gamma->clk);
> >  }
> >  
> > -void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state)
> > +void mtk_gamma_set_common(void __iomem *regs, struct
> > drm_crtc_state
> > *state, bool lut_diff)
> >  {
> >  	unsigned int i, reg;
> >  	struct drm_color_lut *lut;
> >  	void __iomem *lut_base;
> >  	u32 word;
> > +	u32 diff[3] = {0};
> >  
> >  	if (state->gamma_lut) {
> >  		reg = readl(regs + DISP_GAMMA_CFG);
> > @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs,
> > struct drm_crtc_state *state)
> >  		lut_base = regs + DISP_GAMMA_LUT;
> >  		lut = (struct drm_color_lut *)state->gamma_lut->data;
> >  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> > -			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) <<
> > 20) +
> > -				(((lut[i].green >> 6) & LUT_10BIT_MASK)
> > << 10) +
> > -				((lut[i].blue >> 6) & LUT_10BIT_MASK);
> > +
> > +			if (!lut_diff || (i % 2 == 0)) {
> > +				word = (((lut[i].red >> 6) &
> > LUT_10BIT_MASK) << 20) +
> > +					(((lut[i].green >> 6) &
> > LUT_10BIT_MASK) << 10) +
> > +					((lut[i].blue >> 6) &
> > LUT_10BIT_MASK);
> > +			} else {
> > +				diff[0] = abs((lut[i].red >> 6) -
> > (lut[i - 1].red >> 6));
> > +				diff[1] = abs((lut[i].green >> 6) -
> > (lut[i - 1].green >> 6));
> > +				diff[2] = abs((lut[i].blue >> 6) -
> > (lut[i - 1].blue >> 6));
> > +
> > +				word = ((diff[0] & LUT_10BIT_MASK) <<
> > 20) +
> > +					((diff[1] & LUT_10BIT_MASK) <<
> > 10) +
> > +					(diff[2] & LUT_10BIT_MASK);
> > +			}
> >  			writel(word, (lut_base + i * 4));
> >  		}
> >  	}
> > @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs,
> > struct drm_crtc_state *state)
> >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > *state)
> >  {
> >  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> > +	bool lut_diff = false;
> > +
> > +	if (gamma->data)
> > +		lut_diff = gamma->data->lut_diff;
> >  
> > -	mtk_gamma_set_common(gamma->regs, state);
> > +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
> >  }
> >  
> >  void mtk_gamma_config(struct device *dev, unsigned int w,
> > @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> > mt8173_gamma_driver_data = {
> >  	.has_dither = true,
> >  };
> >  
> > +static const struct mtk_disp_gamma_data mt8183_gamma_driver_data =
> > {
> > +	.lut_diff = true,
> > +};
> > +
> >  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"},
> > +	{ .compatible = "mediatek,mt8183-disp-gamma",
> > +	  .data = &mt8183_gamma_driver_data},
> >  	{},
> >  };
> >  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);
> 
> 
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
  2022-04-26  2:39       ` yongqiang.niu
  (?)
@ 2022-04-26  2:47         ` CK Hu
  -1 siblings, 0 replies; 28+ messages in thread
From: CK Hu @ 2022-04-26  2:47 UTC (permalink / raw)
  To: yongqiang.niu, Chun-Kuang Hu
  Cc: Yongqiang Niu, devicetree, David Airlie, Dennis YC Hsieh,
	Jassi Brar, linux-kernel, dri-devel,
	Project_Global_Chrome_Upstream_Group, Fabien Parent, Rob Herring,
	linux-mediatek, Hsin-Yi Wang, Matthias Brugger, linux-arm-kernel

On Tue, 2022-04-26 at 10:39 +0800, yongqiang.niu wrote:
> On Tue, 2022-04-26 at 09:58 +0800, CK Hu wrote:
> > Hi, Yongqiang:
> > 
> > On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> > > From: Yongqiang Niu <
> > > yongqiang.niu@mediatek.corp-partner.google.com
> > > > 
> > > 
> > > mt8183 gamma module usage is different with before soc,
> > > gamma odd(index start from 0) lut value set to hardware
> > > register should be
> > > the difference of current lut value with last lut value.
> > > 
> > > gamma function support both increase and decrease lut.
> > 
> > How to set decrease lut?
> > 
> > Original lut:
> > 12 10 8 6 4 2
> > 
> > Does diff lut look like this?
> > 12 [2] 8 [2] 4 [2]
> > 
> 
> yes
> 
> > How does hardware know that this is increase lut or decrease lut?
> 
> gamma register 0x20 , bit 2, 
> if this bit set to 1, hardware will know lut is decrease.
> this bit default is 0, that means lut is increase
> 
> > 
> > > chrome os app set increase lut normally.
> > > 
> > > for increase lut example, chrome os user space set lut
> > > like this(only r chanel for example):
> > > 2 4 6 8 10 12.
> > > 1) mt8183 gamma driver should set the gamma lut to hardware
> > > register like this:
> > > 2 [2] 6 [8] 10 [2]
> > 
> > 2 [2] 6 [2] 10 [2]
> > 
> > > the value with [] is the difference value
> > > 2) gamma hardware will restore the lut when apply gamma
> > > function to display
> > 
> > I don't know why do you mention the 'restore', any modification is
> > related to this?
> > 
> 
> that means gamma
> hardware process display data with original lut
> > > 
> > > Signed-off-by: Yongqiang Niu <
> > > yongqiang.niu@mediatek.corp-partner.google.com>
> > > ---
> > >  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
> > >  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
> > >  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34
> > > +++++++++++++++++++
> > > ----
> > >  3 files changed, 32 insertions(+), 8 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > index f46d4ab73d6a..e6378b074a17 100644
> > > --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > @@ -23,6 +23,7 @@
> > >  
> > >  struct mtk_disp_aal_data {
> > >  	bool has_gamma;
> > > +	bool lut_diff;
> > >  };
> > >  
> > >  /**
> > > @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev,
> > > struct
> > > drm_crtc_state *state)
> > >  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
> > >  
> > >  	if (aal->data && aal->data->has_gamma)
> > > -		mtk_gamma_set_common(aal->regs, state);
> > > +		mtk_gamma_set_common(aal->regs, state, aal->data-
> > > > lut_diff);
> > 
> > gamma in aal does not support diff lut, so this would make things
> > simple.
> > 
> > mtk_gamma_set_common(aal->regs, state, false);
> 
> fix next version
> > 
> > Regards,
> > CK
> > 
> > >  }
> > >  
> > >  void mtk_aal_start(struct device *dev)
> > > @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> > > platform_device *pdev)
> > >  
> > >  static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
> > >  	.has_gamma = true,
> > > +	.lut_diff = false,
> > >  };
> > >  
> > >  static const struct of_device_id mtk_disp_aal_driver_dt_match[]
> > > =
> > > {
> > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > index 86c3068894b1..3380651c6707 100644
> > > --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev,
> > > unsigned
> > > int w,
> > >  		      unsigned int h, unsigned int vrefresh,
> > >  		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
> > >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > > *state);
> > > -void mtk_gamma_set_common(void __iomem *regs, struct
> > > drm_crtc_state
> > > *state);
> > > +void mtk_gamma_set_common(void __iomem *regs, struct
> > > drm_crtc_state
> > > *state, bool lut_diff);
> > >  void mtk_gamma_start(struct device *dev);
> > >  void mtk_gamma_stop(struct device *dev);
> > >  
> > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > index 3a5815ab4079..fec2e9a5b60d 100644
> > > --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > @@ -27,6 +27,7 @@
> > >  
> > >  struct mtk_disp_gamma_data {
> > >  	bool has_dither;
> > > +	bool lut_diff;
> > >  };
> > >  
> > >  /*
> > > @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device
> > > *dev)
> > >  	clk_disable_unprepare(gamma->clk);
> > >  }
> > >  
> > > -void mtk_gamma_set_common(void __iomem *regs, struct
> > > drm_crtc_state
> > > *state)
> > > +void mtk_gamma_set_common(void __iomem *regs, struct
> > > drm_crtc_state
> > > *state, bool lut_diff)
> > >  {
> > >  	unsigned int i, reg;
> > >  	struct drm_color_lut *lut;
> > >  	void __iomem *lut_base;
> > >  	u32 word;
> > > +	u32 diff[3] = {0};
> > >  
> > >  	if (state->gamma_lut) {
> > >  		reg = readl(regs + DISP_GAMMA_CFG);
> > > @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs,
> > > struct drm_crtc_state *state)
> > >  		lut_base = regs + DISP_GAMMA_LUT;
> > >  		lut = (struct drm_color_lut *)state->gamma_lut->data;
> > >  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> > > -			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) <<
> > > 20) +
> > > -				(((lut[i].green >> 6) & LUT_10BIT_MASK)
> > > << 10) +
> > > -				((lut[i].blue >> 6) & LUT_10BIT_MASK);
> > > +
> > > +			if (!lut_diff || (i % 2 == 0)) {
> > > +				word = (((lut[i].red >> 6) &
> > > LUT_10BIT_MASK) << 20) +
> > > +					(((lut[i].green >> 6) &
> > > LUT_10BIT_MASK) << 10) +
> > > +					((lut[i].blue >> 6) &
> > > LUT_10BIT_MASK);
> > > +			} else {
> > > +				diff[0] = abs((lut[i].red >> 6) -
> > > (lut[i - 1].red >> 6));

You does not set register 0x20[2], so this patch only support increase
lut and abs() is not necessary.

Regards,
CK

> > > +				diff[1] = abs((lut[i].green >> 6) -
> > > (lut[i - 1].green >> 6));
> > > +				diff[2] = abs((lut[i].blue >> 6) -
> > > (lut[i - 1].blue >> 6));
> > > +
> > > +				word = ((diff[0] & LUT_10BIT_MASK) <<
> > > 20) +
> > > +					((diff[1] & LUT_10BIT_MASK) <<
> > > 10) +
> > > +					(diff[2] & LUT_10BIT_MASK);
> > > +			}
> > >  			writel(word, (lut_base + i * 4));
> > >  		}
> > >  	}
> > > @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs,
> > > struct drm_crtc_state *state)
> > >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > > *state)
> > >  {
> > >  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> > > +	bool lut_diff = false;
> > > +
> > > +	if (gamma->data)
> > > +		lut_diff = gamma->data->lut_diff;
> > >  
> > > -	mtk_gamma_set_common(gamma->regs, state);
> > > +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
> > >  }
> > >  
> > >  void mtk_gamma_config(struct device *dev, unsigned int w,
> > > @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> > > mt8173_gamma_driver_data = {
> > >  	.has_dither = true,
> > >  };
> > >  
> > > +static const struct mtk_disp_gamma_data mt8183_gamma_driver_data
> > > =
> > > {
> > > +	.lut_diff = true,
> > > +};
> > > +
> > >  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"},
> > > +	{ .compatible = "mediatek,mt8183-disp-gamma",
> > > +	  .data = &mt8183_gamma_driver_data},
> > >  	{},
> > >  };
> > >  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);
> > 
> > 
> 
> 


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-26  2:47         ` CK Hu
  0 siblings, 0 replies; 28+ messages in thread
From: CK Hu @ 2022-04-26  2:47 UTC (permalink / raw)
  To: yongqiang.niu, Chun-Kuang Hu
  Cc: Yongqiang Niu, devicetree, Project_Global_Chrome_Upstream_Group,
	David Airlie, Jassi Brar, linux-kernel, dri-devel,
	Dennis YC Hsieh, Fabien Parent, Rob Herring, linux-mediatek,
	Hsin-Yi Wang, Matthias Brugger, linux-arm-kernel

On Tue, 2022-04-26 at 10:39 +0800, yongqiang.niu wrote:
> On Tue, 2022-04-26 at 09:58 +0800, CK Hu wrote:
> > Hi, Yongqiang:
> > 
> > On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> > > From: Yongqiang Niu <
> > > yongqiang.niu@mediatek.corp-partner.google.com
> > > > 
> > > 
> > > mt8183 gamma module usage is different with before soc,
> > > gamma odd(index start from 0) lut value set to hardware
> > > register should be
> > > the difference of current lut value with last lut value.
> > > 
> > > gamma function support both increase and decrease lut.
> > 
> > How to set decrease lut?
> > 
> > Original lut:
> > 12 10 8 6 4 2
> > 
> > Does diff lut look like this?
> > 12 [2] 8 [2] 4 [2]
> > 
> 
> yes
> 
> > How does hardware know that this is increase lut or decrease lut?
> 
> gamma register 0x20 , bit 2, 
> if this bit set to 1, hardware will know lut is decrease.
> this bit default is 0, that means lut is increase
> 
> > 
> > > chrome os app set increase lut normally.
> > > 
> > > for increase lut example, chrome os user space set lut
> > > like this(only r chanel for example):
> > > 2 4 6 8 10 12.
> > > 1) mt8183 gamma driver should set the gamma lut to hardware
> > > register like this:
> > > 2 [2] 6 [8] 10 [2]
> > 
> > 2 [2] 6 [2] 10 [2]
> > 
> > > the value with [] is the difference value
> > > 2) gamma hardware will restore the lut when apply gamma
> > > function to display
> > 
> > I don't know why do you mention the 'restore', any modification is
> > related to this?
> > 
> 
> that means gamma
> hardware process display data with original lut
> > > 
> > > Signed-off-by: Yongqiang Niu <
> > > yongqiang.niu@mediatek.corp-partner.google.com>
> > > ---
> > >  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
> > >  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
> > >  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34
> > > +++++++++++++++++++
> > > ----
> > >  3 files changed, 32 insertions(+), 8 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > index f46d4ab73d6a..e6378b074a17 100644
> > > --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > @@ -23,6 +23,7 @@
> > >  
> > >  struct mtk_disp_aal_data {
> > >  	bool has_gamma;
> > > +	bool lut_diff;
> > >  };
> > >  
> > >  /**
> > > @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev,
> > > struct
> > > drm_crtc_state *state)
> > >  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
> > >  
> > >  	if (aal->data && aal->data->has_gamma)
> > > -		mtk_gamma_set_common(aal->regs, state);
> > > +		mtk_gamma_set_common(aal->regs, state, aal->data-
> > > > lut_diff);
> > 
> > gamma in aal does not support diff lut, so this would make things
> > simple.
> > 
> > mtk_gamma_set_common(aal->regs, state, false);
> 
> fix next version
> > 
> > Regards,
> > CK
> > 
> > >  }
> > >  
> > >  void mtk_aal_start(struct device *dev)
> > > @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> > > platform_device *pdev)
> > >  
> > >  static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
> > >  	.has_gamma = true,
> > > +	.lut_diff = false,
> > >  };
> > >  
> > >  static const struct of_device_id mtk_disp_aal_driver_dt_match[]
> > > =
> > > {
> > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > index 86c3068894b1..3380651c6707 100644
> > > --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev,
> > > unsigned
> > > int w,
> > >  		      unsigned int h, unsigned int vrefresh,
> > >  		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
> > >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > > *state);
> > > -void mtk_gamma_set_common(void __iomem *regs, struct
> > > drm_crtc_state
> > > *state);
> > > +void mtk_gamma_set_common(void __iomem *regs, struct
> > > drm_crtc_state
> > > *state, bool lut_diff);
> > >  void mtk_gamma_start(struct device *dev);
> > >  void mtk_gamma_stop(struct device *dev);
> > >  
> > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > index 3a5815ab4079..fec2e9a5b60d 100644
> > > --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > @@ -27,6 +27,7 @@
> > >  
> > >  struct mtk_disp_gamma_data {
> > >  	bool has_dither;
> > > +	bool lut_diff;
> > >  };
> > >  
> > >  /*
> > > @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device
> > > *dev)
> > >  	clk_disable_unprepare(gamma->clk);
> > >  }
> > >  
> > > -void mtk_gamma_set_common(void __iomem *regs, struct
> > > drm_crtc_state
> > > *state)
> > > +void mtk_gamma_set_common(void __iomem *regs, struct
> > > drm_crtc_state
> > > *state, bool lut_diff)
> > >  {
> > >  	unsigned int i, reg;
> > >  	struct drm_color_lut *lut;
> > >  	void __iomem *lut_base;
> > >  	u32 word;
> > > +	u32 diff[3] = {0};
> > >  
> > >  	if (state->gamma_lut) {
> > >  		reg = readl(regs + DISP_GAMMA_CFG);
> > > @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs,
> > > struct drm_crtc_state *state)
> > >  		lut_base = regs + DISP_GAMMA_LUT;
> > >  		lut = (struct drm_color_lut *)state->gamma_lut->data;
> > >  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> > > -			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) <<
> > > 20) +
> > > -				(((lut[i].green >> 6) & LUT_10BIT_MASK)
> > > << 10) +
> > > -				((lut[i].blue >> 6) & LUT_10BIT_MASK);
> > > +
> > > +			if (!lut_diff || (i % 2 == 0)) {
> > > +				word = (((lut[i].red >> 6) &
> > > LUT_10BIT_MASK) << 20) +
> > > +					(((lut[i].green >> 6) &
> > > LUT_10BIT_MASK) << 10) +
> > > +					((lut[i].blue >> 6) &
> > > LUT_10BIT_MASK);
> > > +			} else {
> > > +				diff[0] = abs((lut[i].red >> 6) -
> > > (lut[i - 1].red >> 6));

You does not set register 0x20[2], so this patch only support increase
lut and abs() is not necessary.

Regards,
CK

> > > +				diff[1] = abs((lut[i].green >> 6) -
> > > (lut[i - 1].green >> 6));
> > > +				diff[2] = abs((lut[i].blue >> 6) -
> > > (lut[i - 1].blue >> 6));
> > > +
> > > +				word = ((diff[0] & LUT_10BIT_MASK) <<
> > > 20) +
> > > +					((diff[1] & LUT_10BIT_MASK) <<
> > > 10) +
> > > +					(diff[2] & LUT_10BIT_MASK);
> > > +			}
> > >  			writel(word, (lut_base + i * 4));
> > >  		}
> > >  	}
> > > @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs,
> > > struct drm_crtc_state *state)
> > >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > > *state)
> > >  {
> > >  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> > > +	bool lut_diff = false;
> > > +
> > > +	if (gamma->data)
> > > +		lut_diff = gamma->data->lut_diff;
> > >  
> > > -	mtk_gamma_set_common(gamma->regs, state);
> > > +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
> > >  }
> > >  
> > >  void mtk_gamma_config(struct device *dev, unsigned int w,
> > > @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> > > mt8173_gamma_driver_data = {
> > >  	.has_dither = true,
> > >  };
> > >  
> > > +static const struct mtk_disp_gamma_data mt8183_gamma_driver_data
> > > =
> > > {
> > > +	.lut_diff = true,
> > > +};
> > > +
> > >  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"},
> > > +	{ .compatible = "mediatek,mt8183-disp-gamma",
> > > +	  .data = &mt8183_gamma_driver_data},
> > >  	{},
> > >  };
> > >  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);
> > 
> > 
> 
> 


_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-26  2:47         ` CK Hu
  0 siblings, 0 replies; 28+ messages in thread
From: CK Hu @ 2022-04-26  2:47 UTC (permalink / raw)
  To: yongqiang.niu, Chun-Kuang Hu
  Cc: Yongqiang Niu, devicetree, Project_Global_Chrome_Upstream_Group,
	David Airlie, Jassi Brar, linux-kernel, dri-devel,
	Dennis YC Hsieh, Fabien Parent, Rob Herring, linux-mediatek,
	Hsin-Yi Wang, Matthias Brugger, linux-arm-kernel

On Tue, 2022-04-26 at 10:39 +0800, yongqiang.niu wrote:
> On Tue, 2022-04-26 at 09:58 +0800, CK Hu wrote:
> > Hi, Yongqiang:
> > 
> > On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> > > From: Yongqiang Niu <
> > > yongqiang.niu@mediatek.corp-partner.google.com
> > > > 
> > > 
> > > mt8183 gamma module usage is different with before soc,
> > > gamma odd(index start from 0) lut value set to hardware
> > > register should be
> > > the difference of current lut value with last lut value.
> > > 
> > > gamma function support both increase and decrease lut.
> > 
> > How to set decrease lut?
> > 
> > Original lut:
> > 12 10 8 6 4 2
> > 
> > Does diff lut look like this?
> > 12 [2] 8 [2] 4 [2]
> > 
> 
> yes
> 
> > How does hardware know that this is increase lut or decrease lut?
> 
> gamma register 0x20 , bit 2, 
> if this bit set to 1, hardware will know lut is decrease.
> this bit default is 0, that means lut is increase
> 
> > 
> > > chrome os app set increase lut normally.
> > > 
> > > for increase lut example, chrome os user space set lut
> > > like this(only r chanel for example):
> > > 2 4 6 8 10 12.
> > > 1) mt8183 gamma driver should set the gamma lut to hardware
> > > register like this:
> > > 2 [2] 6 [8] 10 [2]
> > 
> > 2 [2] 6 [2] 10 [2]
> > 
> > > the value with [] is the difference value
> > > 2) gamma hardware will restore the lut when apply gamma
> > > function to display
> > 
> > I don't know why do you mention the 'restore', any modification is
> > related to this?
> > 
> 
> that means gamma
> hardware process display data with original lut
> > > 
> > > Signed-off-by: Yongqiang Niu <
> > > yongqiang.niu@mediatek.corp-partner.google.com>
> > > ---
> > >  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
> > >  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
> > >  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34
> > > +++++++++++++++++++
> > > ----
> > >  3 files changed, 32 insertions(+), 8 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > index f46d4ab73d6a..e6378b074a17 100644
> > > --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > @@ -23,6 +23,7 @@
> > >  
> > >  struct mtk_disp_aal_data {
> > >  	bool has_gamma;
> > > +	bool lut_diff;
> > >  };
> > >  
> > >  /**
> > > @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev,
> > > struct
> > > drm_crtc_state *state)
> > >  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
> > >  
> > >  	if (aal->data && aal->data->has_gamma)
> > > -		mtk_gamma_set_common(aal->regs, state);
> > > +		mtk_gamma_set_common(aal->regs, state, aal->data-
> > > > lut_diff);
> > 
> > gamma in aal does not support diff lut, so this would make things
> > simple.
> > 
> > mtk_gamma_set_common(aal->regs, state, false);
> 
> fix next version
> > 
> > Regards,
> > CK
> > 
> > >  }
> > >  
> > >  void mtk_aal_start(struct device *dev)
> > > @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> > > platform_device *pdev)
> > >  
> > >  static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
> > >  	.has_gamma = true,
> > > +	.lut_diff = false,
> > >  };
> > >  
> > >  static const struct of_device_id mtk_disp_aal_driver_dt_match[]
> > > =
> > > {
> > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > index 86c3068894b1..3380651c6707 100644
> > > --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev,
> > > unsigned
> > > int w,
> > >  		      unsigned int h, unsigned int vrefresh,
> > >  		      unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
> > >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > > *state);
> > > -void mtk_gamma_set_common(void __iomem *regs, struct
> > > drm_crtc_state
> > > *state);
> > > +void mtk_gamma_set_common(void __iomem *regs, struct
> > > drm_crtc_state
> > > *state, bool lut_diff);
> > >  void mtk_gamma_start(struct device *dev);
> > >  void mtk_gamma_stop(struct device *dev);
> > >  
> > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > index 3a5815ab4079..fec2e9a5b60d 100644
> > > --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > @@ -27,6 +27,7 @@
> > >  
> > >  struct mtk_disp_gamma_data {
> > >  	bool has_dither;
> > > +	bool lut_diff;
> > >  };
> > >  
> > >  /*
> > > @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device
> > > *dev)
> > >  	clk_disable_unprepare(gamma->clk);
> > >  }
> > >  
> > > -void mtk_gamma_set_common(void __iomem *regs, struct
> > > drm_crtc_state
> > > *state)
> > > +void mtk_gamma_set_common(void __iomem *regs, struct
> > > drm_crtc_state
> > > *state, bool lut_diff)
> > >  {
> > >  	unsigned int i, reg;
> > >  	struct drm_color_lut *lut;
> > >  	void __iomem *lut_base;
> > >  	u32 word;
> > > +	u32 diff[3] = {0};
> > >  
> > >  	if (state->gamma_lut) {
> > >  		reg = readl(regs + DISP_GAMMA_CFG);
> > > @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem *regs,
> > > struct drm_crtc_state *state)
> > >  		lut_base = regs + DISP_GAMMA_LUT;
> > >  		lut = (struct drm_color_lut *)state->gamma_lut->data;
> > >  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> > > -			word = (((lut[i].red >> 6) & LUT_10BIT_MASK) <<
> > > 20) +
> > > -				(((lut[i].green >> 6) & LUT_10BIT_MASK)
> > > << 10) +
> > > -				((lut[i].blue >> 6) & LUT_10BIT_MASK);
> > > +
> > > +			if (!lut_diff || (i % 2 == 0)) {
> > > +				word = (((lut[i].red >> 6) &
> > > LUT_10BIT_MASK) << 20) +
> > > +					(((lut[i].green >> 6) &
> > > LUT_10BIT_MASK) << 10) +
> > > +					((lut[i].blue >> 6) &
> > > LUT_10BIT_MASK);
> > > +			} else {
> > > +				diff[0] = abs((lut[i].red >> 6) -
> > > (lut[i - 1].red >> 6));

You does not set register 0x20[2], so this patch only support increase
lut and abs() is not necessary.

Regards,
CK

> > > +				diff[1] = abs((lut[i].green >> 6) -
> > > (lut[i - 1].green >> 6));
> > > +				diff[2] = abs((lut[i].blue >> 6) -
> > > (lut[i - 1].blue >> 6));
> > > +
> > > +				word = ((diff[0] & LUT_10BIT_MASK) <<
> > > 20) +
> > > +					((diff[1] & LUT_10BIT_MASK) <<
> > > 10) +
> > > +					(diff[2] & LUT_10BIT_MASK);
> > > +			}
> > >  			writel(word, (lut_base + i * 4));
> > >  		}
> > >  	}
> > > @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem *regs,
> > > struct drm_crtc_state *state)
> > >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > > *state)
> > >  {
> > >  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> > > +	bool lut_diff = false;
> > > +
> > > +	if (gamma->data)
> > > +		lut_diff = gamma->data->lut_diff;
> > >  
> > > -	mtk_gamma_set_common(gamma->regs, state);
> > > +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
> > >  }
> > >  
> > >  void mtk_gamma_config(struct device *dev, unsigned int w,
> > > @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> > > mt8173_gamma_driver_data = {
> > >  	.has_dither = true,
> > >  };
> > >  
> > > +static const struct mtk_disp_gamma_data mt8183_gamma_driver_data
> > > =
> > > {
> > > +	.lut_diff = true,
> > > +};
> > > +
> > >  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"},
> > > +	{ .compatible = "mediatek,mt8183-disp-gamma",
> > > +	  .data = &mt8183_gamma_driver_data},
> > >  	{},
> > >  };
> > >  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);
> > 
> > 
> 
> 


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
  2022-04-26  2:47         ` CK Hu
  (?)
@ 2022-04-26  2:50           ` yongqiang.niu
  -1 siblings, 0 replies; 28+ messages in thread
From: yongqiang.niu @ 2022-04-26  2:50 UTC (permalink / raw)
  To: CK Hu, Chun-Kuang Hu
  Cc: Yongqiang Niu, devicetree, David Airlie, Dennis YC Hsieh,
	Jassi Brar, linux-kernel, dri-devel,
	Project_Global_Chrome_Upstream_Group, Fabien Parent, Rob Herring,
	linux-mediatek, Hsin-Yi Wang, Matthias Brugger, linux-arm-kernel

On Tue, 2022-04-26 at 10:47 +0800, CK Hu wrote:
> On Tue, 2022-04-26 at 10:39 +0800, yongqiang.niu wrote:
> > On Tue, 2022-04-26 at 09:58 +0800, CK Hu wrote:
> > > Hi, Yongqiang:
> > > 
> > > On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> > > > From: Yongqiang Niu <
> > > > yongqiang.niu@mediatek.corp-partner.google.com
> > > > > 
> > > > 
> > > > mt8183 gamma module usage is different with before soc,
> > > > gamma odd(index start from 0) lut value set to hardware
> > > > register should be
> > > > the difference of current lut value with last lut value.
> > > > 
> > > > gamma function support both increase and decrease lut.
> > > 
> > > How to set decrease lut?
> > > 
> > > Original lut:
> > > 12 10 8 6 4 2
> > > 
> > > Does diff lut look like this?
> > > 12 [2] 8 [2] 4 [2]
> > > 
> > 
> > yes
> > 
> > > How does hardware know that this is increase lut or decrease lut?
> > 
> > gamma register 0x20 , bit 2, 
> > if this bit set to 1, hardware will know lut is decrease.
> > this bit default is 0, that means lut is increase
> > 
> > > 
> > > > chrome os app set increase lut normally.
> > > > 
> > > > for increase lut example, chrome os user space set lut
> > > > like this(only r chanel for example):
> > > > 2 4 6 8 10 12.
> > > > 1) mt8183 gamma driver should set the gamma lut to hardware
> > > > register like this:
> > > > 2 [2] 6 [8] 10 [2]
> > > 
> > > 2 [2] 6 [2] 10 [2]
> > > 
> > > > the value with [] is the difference value
> > > > 2) gamma hardware will restore the lut when apply gamma
> > > > function to display
> > > 
> > > I don't know why do you mention the 'restore', any modification
> > > is
> > > related to this?
> > > 
> > 
> > that means gamma
> > hardware process display data with original lut
> > > > 
> > > > Signed-off-by: Yongqiang Niu <
> > > > yongqiang.niu@mediatek.corp-partner.google.com>
> > > > ---
> > > >  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
> > > >  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
> > > >  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34
> > > > +++++++++++++++++++
> > > > ----
> > > >  3 files changed, 32 insertions(+), 8 deletions(-)
> > > > 
> > > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > > b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > > index f46d4ab73d6a..e6378b074a17 100644
> > > > --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > > @@ -23,6 +23,7 @@
> > > >  
> > > >  struct mtk_disp_aal_data {
> > > >  	bool has_gamma;
> > > > +	bool lut_diff;
> > > >  };
> > > >  
> > > >  /**
> > > > @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev,
> > > > struct
> > > > drm_crtc_state *state)
> > > >  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
> > > >  
> > > >  	if (aal->data && aal->data->has_gamma)
> > > > -		mtk_gamma_set_common(aal->regs, state);
> > > > +		mtk_gamma_set_common(aal->regs, state, aal-
> > > > >data-
> > > > > lut_diff);
> > > 
> > > gamma in aal does not support diff lut, so this would make things
> > > simple.
> > > 
> > > mtk_gamma_set_common(aal->regs, state, false);
> > 
> > fix next version
> > > 
> > > Regards,
> > > CK
> > > 
> > > >  }
> > > >  
> > > >  void mtk_aal_start(struct device *dev)
> > > > @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> > > > platform_device *pdev)
> > > >  
> > > >  static const struct mtk_disp_aal_data mt8173_aal_driver_data =
> > > > {
> > > >  	.has_gamma = true,
> > > > +	.lut_diff = false,
> > > >  };
> > > >  
> > > >  static const struct of_device_id
> > > > mtk_disp_aal_driver_dt_match[]
> > > > =
> > > > {
> > > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > > b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > > index 86c3068894b1..3380651c6707 100644
> > > > --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > > @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev,
> > > > unsigned
> > > > int w,
> > > >  		      unsigned int h, unsigned int vrefresh,
> > > >  		      unsigned int bpc, struct cmdq_pkt
> > > > *cmdq_pkt);
> > > >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > > > *state);
> > > > -void mtk_gamma_set_common(void __iomem *regs, struct
> > > > drm_crtc_state
> > > > *state);
> > > > +void mtk_gamma_set_common(void __iomem *regs, struct
> > > > drm_crtc_state
> > > > *state, bool lut_diff);
> > > >  void mtk_gamma_start(struct device *dev);
> > > >  void mtk_gamma_stop(struct device *dev);
> > > >  
> > > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > > b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > > index 3a5815ab4079..fec2e9a5b60d 100644
> > > > --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > > @@ -27,6 +27,7 @@
> > > >  
> > > >  struct mtk_disp_gamma_data {
> > > >  	bool has_dither;
> > > > +	bool lut_diff;
> > > >  };
> > > >  
> > > >  /*
> > > > @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device
> > > > *dev)
> > > >  	clk_disable_unprepare(gamma->clk);
> > > >  }
> > > >  
> > > > -void mtk_gamma_set_common(void __iomem *regs, struct
> > > > drm_crtc_state
> > > > *state)
> > > > +void mtk_gamma_set_common(void __iomem *regs, struct
> > > > drm_crtc_state
> > > > *state, bool lut_diff)
> > > >  {
> > > >  	unsigned int i, reg;
> > > >  	struct drm_color_lut *lut;
> > > >  	void __iomem *lut_base;
> > > >  	u32 word;
> > > > +	u32 diff[3] = {0};
> > > >  
> > > >  	if (state->gamma_lut) {
> > > >  		reg = readl(regs + DISP_GAMMA_CFG);
> > > > @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem
> > > > *regs,
> > > > struct drm_crtc_state *state)
> > > >  		lut_base = regs + DISP_GAMMA_LUT;
> > > >  		lut = (struct drm_color_lut *)state->gamma_lut-
> > > > >data;
> > > >  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> > > > -			word = (((lut[i].red >> 6) &
> > > > LUT_10BIT_MASK) <<
> > > > 20) +
> > > > -				(((lut[i].green >> 6) &
> > > > LUT_10BIT_MASK)
> > > > << 10) +
> > > > -				((lut[i].blue >> 6) &
> > > > LUT_10BIT_MASK);
> > > > +
> > > > +			if (!lut_diff || (i % 2 == 0)) {
> > > > +				word = (((lut[i].red >> 6) &
> > > > LUT_10BIT_MASK) << 20) +
> > > > +					(((lut[i].green >> 6) &
> > > > LUT_10BIT_MASK) << 10) +
> > > > +					((lut[i].blue >> 6) &
> > > > LUT_10BIT_MASK);
> > > > +			} else {
> > > > +				diff[0] = abs((lut[i].red >> 6)
> > > > -
> > > > (lut[i - 1].red >> 6));
> 
> You does not set register 0x20[2], so this patch only support
> increase
> lut and abs() is not necessary.
> 
> Regards,
> CK

abs will be removed in next version
> 
> > > > +				diff[1] = abs((lut[i].green >>
> > > > 6) -
> > > > (lut[i - 1].green >> 6));
> > > > +				diff[2] = abs((lut[i].blue >>
> > > > 6) -
> > > > (lut[i - 1].blue >> 6));
> > > > +
> > > > +				word = ((diff[0] &
> > > > LUT_10BIT_MASK) <<
> > > > 20) +
> > > > +					((diff[1] &
> > > > LUT_10BIT_MASK) <<
> > > > 10) +
> > > > +					(diff[2] &
> > > > LUT_10BIT_MASK);
> > > > +			}
> > > >  			writel(word, (lut_base + i * 4));
> > > >  		}
> > > >  	}
> > > > @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem
> > > > *regs,
> > > > struct drm_crtc_state *state)
> > > >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > > > *state)
> > > >  {
> > > >  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> > > > +	bool lut_diff = false;
> > > > +
> > > > +	if (gamma->data)
> > > > +		lut_diff = gamma->data->lut_diff;
> > > >  
> > > > -	mtk_gamma_set_common(gamma->regs, state);
> > > > +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
> > > >  }
> > > >  
> > > >  void mtk_gamma_config(struct device *dev, unsigned int w,
> > > > @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> > > > mt8173_gamma_driver_data = {
> > > >  	.has_dither = true,
> > > >  };
> > > >  
> > > > +static const struct mtk_disp_gamma_data
> > > > mt8183_gamma_driver_data
> > > > =
> > > > {
> > > > +	.lut_diff = true,
> > > > +};
> > > > +
> > > >  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"},
> > > > +	{ .compatible = "mediatek,mt8183-disp-gamma",
> > > > +	  .data = &mt8183_gamma_driver_data},
> > > >  	{},
> > > >  };
> > > >  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);
> > > 
> > > 
> > 
> > 
> 
> 


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-26  2:50           ` yongqiang.niu
  0 siblings, 0 replies; 28+ messages in thread
From: yongqiang.niu @ 2022-04-26  2:50 UTC (permalink / raw)
  To: CK Hu, Chun-Kuang Hu
  Cc: Yongqiang Niu, devicetree, Project_Global_Chrome_Upstream_Group,
	David Airlie, Jassi Brar, linux-kernel, dri-devel,
	Dennis YC Hsieh, Fabien Parent, Rob Herring, linux-mediatek,
	Hsin-Yi Wang, Matthias Brugger, linux-arm-kernel

On Tue, 2022-04-26 at 10:47 +0800, CK Hu wrote:
> On Tue, 2022-04-26 at 10:39 +0800, yongqiang.niu wrote:
> > On Tue, 2022-04-26 at 09:58 +0800, CK Hu wrote:
> > > Hi, Yongqiang:
> > > 
> > > On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> > > > From: Yongqiang Niu <
> > > > yongqiang.niu@mediatek.corp-partner.google.com
> > > > > 
> > > > 
> > > > mt8183 gamma module usage is different with before soc,
> > > > gamma odd(index start from 0) lut value set to hardware
> > > > register should be
> > > > the difference of current lut value with last lut value.
> > > > 
> > > > gamma function support both increase and decrease lut.
> > > 
> > > How to set decrease lut?
> > > 
> > > Original lut:
> > > 12 10 8 6 4 2
> > > 
> > > Does diff lut look like this?
> > > 12 [2] 8 [2] 4 [2]
> > > 
> > 
> > yes
> > 
> > > How does hardware know that this is increase lut or decrease lut?
> > 
> > gamma register 0x20 , bit 2, 
> > if this bit set to 1, hardware will know lut is decrease.
> > this bit default is 0, that means lut is increase
> > 
> > > 
> > > > chrome os app set increase lut normally.
> > > > 
> > > > for increase lut example, chrome os user space set lut
> > > > like this(only r chanel for example):
> > > > 2 4 6 8 10 12.
> > > > 1) mt8183 gamma driver should set the gamma lut to hardware
> > > > register like this:
> > > > 2 [2] 6 [8] 10 [2]
> > > 
> > > 2 [2] 6 [2] 10 [2]
> > > 
> > > > the value with [] is the difference value
> > > > 2) gamma hardware will restore the lut when apply gamma
> > > > function to display
> > > 
> > > I don't know why do you mention the 'restore', any modification
> > > is
> > > related to this?
> > > 
> > 
> > that means gamma
> > hardware process display data with original lut
> > > > 
> > > > Signed-off-by: Yongqiang Niu <
> > > > yongqiang.niu@mediatek.corp-partner.google.com>
> > > > ---
> > > >  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
> > > >  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
> > > >  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34
> > > > +++++++++++++++++++
> > > > ----
> > > >  3 files changed, 32 insertions(+), 8 deletions(-)
> > > > 
> > > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > > b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > > index f46d4ab73d6a..e6378b074a17 100644
> > > > --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > > @@ -23,6 +23,7 @@
> > > >  
> > > >  struct mtk_disp_aal_data {
> > > >  	bool has_gamma;
> > > > +	bool lut_diff;
> > > >  };
> > > >  
> > > >  /**
> > > > @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev,
> > > > struct
> > > > drm_crtc_state *state)
> > > >  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
> > > >  
> > > >  	if (aal->data && aal->data->has_gamma)
> > > > -		mtk_gamma_set_common(aal->regs, state);
> > > > +		mtk_gamma_set_common(aal->regs, state, aal-
> > > > >data-
> > > > > lut_diff);
> > > 
> > > gamma in aal does not support diff lut, so this would make things
> > > simple.
> > > 
> > > mtk_gamma_set_common(aal->regs, state, false);
> > 
> > fix next version
> > > 
> > > Regards,
> > > CK
> > > 
> > > >  }
> > > >  
> > > >  void mtk_aal_start(struct device *dev)
> > > > @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> > > > platform_device *pdev)
> > > >  
> > > >  static const struct mtk_disp_aal_data mt8173_aal_driver_data =
> > > > {
> > > >  	.has_gamma = true,
> > > > +	.lut_diff = false,
> > > >  };
> > > >  
> > > >  static const struct of_device_id
> > > > mtk_disp_aal_driver_dt_match[]
> > > > =
> > > > {
> > > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > > b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > > index 86c3068894b1..3380651c6707 100644
> > > > --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > > @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev,
> > > > unsigned
> > > > int w,
> > > >  		      unsigned int h, unsigned int vrefresh,
> > > >  		      unsigned int bpc, struct cmdq_pkt
> > > > *cmdq_pkt);
> > > >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > > > *state);
> > > > -void mtk_gamma_set_common(void __iomem *regs, struct
> > > > drm_crtc_state
> > > > *state);
> > > > +void mtk_gamma_set_common(void __iomem *regs, struct
> > > > drm_crtc_state
> > > > *state, bool lut_diff);
> > > >  void mtk_gamma_start(struct device *dev);
> > > >  void mtk_gamma_stop(struct device *dev);
> > > >  
> > > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > > b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > > index 3a5815ab4079..fec2e9a5b60d 100644
> > > > --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > > @@ -27,6 +27,7 @@
> > > >  
> > > >  struct mtk_disp_gamma_data {
> > > >  	bool has_dither;
> > > > +	bool lut_diff;
> > > >  };
> > > >  
> > > >  /*
> > > > @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device
> > > > *dev)
> > > >  	clk_disable_unprepare(gamma->clk);
> > > >  }
> > > >  
> > > > -void mtk_gamma_set_common(void __iomem *regs, struct
> > > > drm_crtc_state
> > > > *state)
> > > > +void mtk_gamma_set_common(void __iomem *regs, struct
> > > > drm_crtc_state
> > > > *state, bool lut_diff)
> > > >  {
> > > >  	unsigned int i, reg;
> > > >  	struct drm_color_lut *lut;
> > > >  	void __iomem *lut_base;
> > > >  	u32 word;
> > > > +	u32 diff[3] = {0};
> > > >  
> > > >  	if (state->gamma_lut) {
> > > >  		reg = readl(regs + DISP_GAMMA_CFG);
> > > > @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem
> > > > *regs,
> > > > struct drm_crtc_state *state)
> > > >  		lut_base = regs + DISP_GAMMA_LUT;
> > > >  		lut = (struct drm_color_lut *)state->gamma_lut-
> > > > >data;
> > > >  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> > > > -			word = (((lut[i].red >> 6) &
> > > > LUT_10BIT_MASK) <<
> > > > 20) +
> > > > -				(((lut[i].green >> 6) &
> > > > LUT_10BIT_MASK)
> > > > << 10) +
> > > > -				((lut[i].blue >> 6) &
> > > > LUT_10BIT_MASK);
> > > > +
> > > > +			if (!lut_diff || (i % 2 == 0)) {
> > > > +				word = (((lut[i].red >> 6) &
> > > > LUT_10BIT_MASK) << 20) +
> > > > +					(((lut[i].green >> 6) &
> > > > LUT_10BIT_MASK) << 10) +
> > > > +					((lut[i].blue >> 6) &
> > > > LUT_10BIT_MASK);
> > > > +			} else {
> > > > +				diff[0] = abs((lut[i].red >> 6)
> > > > -
> > > > (lut[i - 1].red >> 6));
> 
> You does not set register 0x20[2], so this patch only support
> increase
> lut and abs() is not necessary.
> 
> Regards,
> CK

abs will be removed in next version
> 
> > > > +				diff[1] = abs((lut[i].green >>
> > > > 6) -
> > > > (lut[i - 1].green >> 6));
> > > > +				diff[2] = abs((lut[i].blue >>
> > > > 6) -
> > > > (lut[i - 1].blue >> 6));
> > > > +
> > > > +				word = ((diff[0] &
> > > > LUT_10BIT_MASK) <<
> > > > 20) +
> > > > +					((diff[1] &
> > > > LUT_10BIT_MASK) <<
> > > > 10) +
> > > > +					(diff[2] &
> > > > LUT_10BIT_MASK);
> > > > +			}
> > > >  			writel(word, (lut_base + i * 4));
> > > >  		}
> > > >  	}
> > > > @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem
> > > > *regs,
> > > > struct drm_crtc_state *state)
> > > >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > > > *state)
> > > >  {
> > > >  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> > > > +	bool lut_diff = false;
> > > > +
> > > > +	if (gamma->data)
> > > > +		lut_diff = gamma->data->lut_diff;
> > > >  
> > > > -	mtk_gamma_set_common(gamma->regs, state);
> > > > +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
> > > >  }
> > > >  
> > > >  void mtk_gamma_config(struct device *dev, unsigned int w,
> > > > @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> > > > mt8173_gamma_driver_data = {
> > > >  	.has_dither = true,
> > > >  };
> > > >  
> > > > +static const struct mtk_disp_gamma_data
> > > > mt8183_gamma_driver_data
> > > > =
> > > > {
> > > > +	.lut_diff = true,
> > > > +};
> > > > +
> > > >  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"},
> > > > +	{ .compatible = "mediatek,mt8183-disp-gamma",
> > > > +	  .data = &mt8183_gamma_driver_data},
> > > >  	{},
> > > >  };
> > > >  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);
> > > 
> > > 
> > 
> > 
> 
> 
_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek

^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [PATCH v1, 1/1] drm/mediatek: add lut diff flag for new gamma hardware support
@ 2022-04-26  2:50           ` yongqiang.niu
  0 siblings, 0 replies; 28+ messages in thread
From: yongqiang.niu @ 2022-04-26  2:50 UTC (permalink / raw)
  To: CK Hu, Chun-Kuang Hu
  Cc: Yongqiang Niu, devicetree, Project_Global_Chrome_Upstream_Group,
	David Airlie, Jassi Brar, linux-kernel, dri-devel,
	Dennis YC Hsieh, Fabien Parent, Rob Herring, linux-mediatek,
	Hsin-Yi Wang, Matthias Brugger, linux-arm-kernel

On Tue, 2022-04-26 at 10:47 +0800, CK Hu wrote:
> On Tue, 2022-04-26 at 10:39 +0800, yongqiang.niu wrote:
> > On Tue, 2022-04-26 at 09:58 +0800, CK Hu wrote:
> > > Hi, Yongqiang:
> > > 
> > > On Wed, 2022-04-20 at 21:06 +0800, Yongqiang Niu wrote:
> > > > From: Yongqiang Niu <
> > > > yongqiang.niu@mediatek.corp-partner.google.com
> > > > > 
> > > > 
> > > > mt8183 gamma module usage is different with before soc,
> > > > gamma odd(index start from 0) lut value set to hardware
> > > > register should be
> > > > the difference of current lut value with last lut value.
> > > > 
> > > > gamma function support both increase and decrease lut.
> > > 
> > > How to set decrease lut?
> > > 
> > > Original lut:
> > > 12 10 8 6 4 2
> > > 
> > > Does diff lut look like this?
> > > 12 [2] 8 [2] 4 [2]
> > > 
> > 
> > yes
> > 
> > > How does hardware know that this is increase lut or decrease lut?
> > 
> > gamma register 0x20 , bit 2, 
> > if this bit set to 1, hardware will know lut is decrease.
> > this bit default is 0, that means lut is increase
> > 
> > > 
> > > > chrome os app set increase lut normally.
> > > > 
> > > > for increase lut example, chrome os user space set lut
> > > > like this(only r chanel for example):
> > > > 2 4 6 8 10 12.
> > > > 1) mt8183 gamma driver should set the gamma lut to hardware
> > > > register like this:
> > > > 2 [2] 6 [8] 10 [2]
> > > 
> > > 2 [2] 6 [2] 10 [2]
> > > 
> > > > the value with [] is the difference value
> > > > 2) gamma hardware will restore the lut when apply gamma
> > > > function to display
> > > 
> > > I don't know why do you mention the 'restore', any modification
> > > is
> > > related to this?
> > > 
> > 
> > that means gamma
> > hardware process display data with original lut
> > > > 
> > > > Signed-off-by: Yongqiang Niu <
> > > > yongqiang.niu@mediatek.corp-partner.google.com>
> > > > ---
> > > >  drivers/gpu/drm/mediatek/mtk_disp_aal.c   |  4 ++-
> > > >  drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 +-
> > > >  drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 34
> > > > +++++++++++++++++++
> > > > ----
> > > >  3 files changed, 32 insertions(+), 8 deletions(-)
> > > > 
> > > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > > b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > > index f46d4ab73d6a..e6378b074a17 100644
> > > > --- a/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_aal.c
> > > > @@ -23,6 +23,7 @@
> > > >  
> > > >  struct mtk_disp_aal_data {
> > > >  	bool has_gamma;
> > > > +	bool lut_diff;
> > > >  };
> > > >  
> > > >  /**
> > > > @@ -66,7 +67,7 @@ void mtk_aal_gamma_set(struct device *dev,
> > > > struct
> > > > drm_crtc_state *state)
> > > >  	struct mtk_disp_aal *aal = dev_get_drvdata(dev);
> > > >  
> > > >  	if (aal->data && aal->data->has_gamma)
> > > > -		mtk_gamma_set_common(aal->regs, state);
> > > > +		mtk_gamma_set_common(aal->regs, state, aal-
> > > > >data-
> > > > > lut_diff);
> > > 
> > > gamma in aal does not support diff lut, so this would make things
> > > simple.
> > > 
> > > mtk_gamma_set_common(aal->regs, state, false);
> > 
> > fix next version
> > > 
> > > Regards,
> > > CK
> > > 
> > > >  }
> > > >  
> > > >  void mtk_aal_start(struct device *dev)
> > > > @@ -148,6 +149,7 @@ static int mtk_disp_aal_remove(struct
> > > > platform_device *pdev)
> > > >  
> > > >  static const struct mtk_disp_aal_data mt8173_aal_driver_data =
> > > > {
> > > >  	.has_gamma = true,
> > > > +	.lut_diff = false,
> > > >  };
> > > >  
> > > >  static const struct of_device_id
> > > > mtk_disp_aal_driver_dt_match[]
> > > > =
> > > > {
> > > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > > b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > > index 86c3068894b1..3380651c6707 100644
> > > > --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > > > @@ -51,7 +51,7 @@ void mtk_gamma_config(struct device *dev,
> > > > unsigned
> > > > int w,
> > > >  		      unsigned int h, unsigned int vrefresh,
> > > >  		      unsigned int bpc, struct cmdq_pkt
> > > > *cmdq_pkt);
> > > >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > > > *state);
> > > > -void mtk_gamma_set_common(void __iomem *regs, struct
> > > > drm_crtc_state
> > > > *state);
> > > > +void mtk_gamma_set_common(void __iomem *regs, struct
> > > > drm_crtc_state
> > > > *state, bool lut_diff);
> > > >  void mtk_gamma_start(struct device *dev);
> > > >  void mtk_gamma_stop(struct device *dev);
> > > >  
> > > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > > b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > > index 3a5815ab4079..fec2e9a5b60d 100644
> > > > --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
> > > > @@ -27,6 +27,7 @@
> > > >  
> > > >  struct mtk_disp_gamma_data {
> > > >  	bool has_dither;
> > > > +	bool lut_diff;
> > > >  };
> > > >  
> > > >  /*
> > > > @@ -53,12 +54,13 @@ void mtk_gamma_clk_disable(struct device
> > > > *dev)
> > > >  	clk_disable_unprepare(gamma->clk);
> > > >  }
> > > >  
> > > > -void mtk_gamma_set_common(void __iomem *regs, struct
> > > > drm_crtc_state
> > > > *state)
> > > > +void mtk_gamma_set_common(void __iomem *regs, struct
> > > > drm_crtc_state
> > > > *state, bool lut_diff)
> > > >  {
> > > >  	unsigned int i, reg;
> > > >  	struct drm_color_lut *lut;
> > > >  	void __iomem *lut_base;
> > > >  	u32 word;
> > > > +	u32 diff[3] = {0};
> > > >  
> > > >  	if (state->gamma_lut) {
> > > >  		reg = readl(regs + DISP_GAMMA_CFG);
> > > > @@ -67,9 +69,20 @@ void mtk_gamma_set_common(void __iomem
> > > > *regs,
> > > > struct drm_crtc_state *state)
> > > >  		lut_base = regs + DISP_GAMMA_LUT;
> > > >  		lut = (struct drm_color_lut *)state->gamma_lut-
> > > > >data;
> > > >  		for (i = 0; i < MTK_LUT_SIZE; i++) {
> > > > -			word = (((lut[i].red >> 6) &
> > > > LUT_10BIT_MASK) <<
> > > > 20) +
> > > > -				(((lut[i].green >> 6) &
> > > > LUT_10BIT_MASK)
> > > > << 10) +
> > > > -				((lut[i].blue >> 6) &
> > > > LUT_10BIT_MASK);
> > > > +
> > > > +			if (!lut_diff || (i % 2 == 0)) {
> > > > +				word = (((lut[i].red >> 6) &
> > > > LUT_10BIT_MASK) << 20) +
> > > > +					(((lut[i].green >> 6) &
> > > > LUT_10BIT_MASK) << 10) +
> > > > +					((lut[i].blue >> 6) &
> > > > LUT_10BIT_MASK);
> > > > +			} else {
> > > > +				diff[0] = abs((lut[i].red >> 6)
> > > > -
> > > > (lut[i - 1].red >> 6));
> 
> You does not set register 0x20[2], so this patch only support
> increase
> lut and abs() is not necessary.
> 
> Regards,
> CK

abs will be removed in next version
> 
> > > > +				diff[1] = abs((lut[i].green >>
> > > > 6) -
> > > > (lut[i - 1].green >> 6));
> > > > +				diff[2] = abs((lut[i].blue >>
> > > > 6) -
> > > > (lut[i - 1].blue >> 6));
> > > > +
> > > > +				word = ((diff[0] &
> > > > LUT_10BIT_MASK) <<
> > > > 20) +
> > > > +					((diff[1] &
> > > > LUT_10BIT_MASK) <<
> > > > 10) +
> > > > +					(diff[2] &
> > > > LUT_10BIT_MASK);
> > > > +			}
> > > >  			writel(word, (lut_base + i * 4));
> > > >  		}
> > > >  	}
> > > > @@ -78,8 +91,12 @@ void mtk_gamma_set_common(void __iomem
> > > > *regs,
> > > > struct drm_crtc_state *state)
> > > >  void mtk_gamma_set(struct device *dev, struct drm_crtc_state
> > > > *state)
> > > >  {
> > > >  	struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
> > > > +	bool lut_diff = false;
> > > > +
> > > > +	if (gamma->data)
> > > > +		lut_diff = gamma->data->lut_diff;
> > > >  
> > > > -	mtk_gamma_set_common(gamma->regs, state);
> > > > +	mtk_gamma_set_common(gamma->regs, state, lut_diff);
> > > >  }
> > > >  
> > > >  void mtk_gamma_config(struct device *dev, unsigned int w,
> > > > @@ -176,10 +193,15 @@ static const struct mtk_disp_gamma_data
> > > > mt8173_gamma_driver_data = {
> > > >  	.has_dither = true,
> > > >  };
> > > >  
> > > > +static const struct mtk_disp_gamma_data
> > > > mt8183_gamma_driver_data
> > > > =
> > > > {
> > > > +	.lut_diff = true,
> > > > +};
> > > > +
> > > >  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"},
> > > > +	{ .compatible = "mediatek,mt8183-disp-gamma",
> > > > +	  .data = &mt8183_gamma_driver_data},
> > > >  	{},
> > > >  };
> > > >  MODULE_DEVICE_TABLE(of, mtk_disp_gamma_driver_dt_match);
> > > 
> > > 
> > 
> > 
> 
> 
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 28+ messages in thread

end of thread, other threads:[~2022-04-26  2:54 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-20 13:06 [PATCH v1, 0/1] drm/mediatek: add lut diff flag for new gamma hardware support Yongqiang Niu
2022-04-20 13:06 ` Yongqiang Niu
2022-04-20 13:06 ` Yongqiang Niu
2022-04-20 13:06 ` Yongqiang Niu
2022-04-20 13:06 ` [PATCH v1, 1/1] " Yongqiang Niu
2022-04-20 13:06   ` Yongqiang Niu
2022-04-20 13:06   ` Yongqiang Niu
2022-04-20 13:06   ` Yongqiang Niu
2022-04-21  2:38   ` Rex-BC Chen
2022-04-21  2:38     ` Rex-BC Chen
2022-04-21  2:38     ` Rex-BC Chen
2022-04-21  2:38     ` Rex-BC Chen
2022-04-21  8:05     ` yongqiang.niu
2022-04-21  8:05       ` yongqiang.niu
2022-04-21  8:05       ` yongqiang.niu
2022-04-26  1:58   ` CK Hu
2022-04-26  1:58     ` CK Hu
2022-04-26  1:58     ` CK Hu
2022-04-26  1:58     ` CK Hu
2022-04-26  2:39     ` yongqiang.niu
2022-04-26  2:39       ` yongqiang.niu
2022-04-26  2:39       ` yongqiang.niu
2022-04-26  2:47       ` CK Hu
2022-04-26  2:47         ` CK Hu
2022-04-26  2:47         ` CK Hu
2022-04-26  2:50         ` yongqiang.niu
2022-04-26  2:50           ` yongqiang.niu
2022-04-26  2:50           ` yongqiang.niu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.