Re: [PATCH v9, 07/11] drm/mediatek: separate gamma module
Hi, Yongqiang: Yongqiang Niu 於 2021年1月7日 週四 上午11:12寫道: > > mt8183 gamma module will different with mt8173 > separate gamma for add private data I've applied series "Decouple Mediatek DRM sub driver" [1] into mediatek-drm-next [2] and this patch would conflict with mediatek-drm-next, so please rebase this series onto mediatek-drm-next. [1] https://patchwork.kernel.org/project/linux-mediatek/list/?series=399915 [2] https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next Regards, Chun-Kuang. > > Signed-off-by: Yongqiang Niu > --- > drivers/gpu/drm/mediatek/Makefile | 1 + > drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 185 > > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 58 + > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 1 + > drivers/gpu/drm/mediatek/mtk_drm_drv.c | 4 +- > drivers/gpu/drm/mediatek/mtk_drm_drv.h | 1 + > 6 files changed, 192 insertions(+), 58 deletions(-) > create mode 100644 drivers/gpu/drm/mediatek/mtk_disp_gamma.c > > diff --git a/drivers/gpu/drm/mediatek/Makefile > b/drivers/gpu/drm/mediatek/Makefile > index a892ede..17a08e2 100644 > --- a/drivers/gpu/drm/mediatek/Makefile > +++ b/drivers/gpu/drm/mediatek/Makefile > @@ -1,6 +1,7 @@ > # SPDX-License-Identifier: GPL-2.0 > > mediatek-drm-y := mtk_disp_color.o \ > + mtk_disp_gamma.o \ > mtk_disp_ovl.o \ > mtk_disp_rdma.o \ > mtk_drm_crtc.o \ > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c > b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c > new file mode 100644 > index 000..8501821 > --- /dev/null > +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c > @@ -0,0 +1,185 @@ > +/* > + * SPDX-License-Identifier: > + * > + * Copyright (c) 2020 MediaTek Inc. > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include "mtk_drm_crtc.h" > +#include "mtk_drm_ddp_comp.h" > + > +#define DISP_GAMMA_EN 0x > +#define GAMMA_EN BIT(0) > +#define DISP_GAMMA_CFG 0x0020 > +#define GAMMA_LUT_EN BIT(1) > +#define DISP_GAMMA_SIZE0x0030 > +#define DISP_GAMMA_LUT 0x0700 > + > +#define LUT_10BIT_MASK 0x03ff > + > +struct mtk_disp_gamma_data { > + u32 reserved; > +}; > + > +/** > + * struct mtk_disp_gamma - DISP_GAMMA driver structure > + * @ddp_comp - structure containing type enum and hardware resources > + * @crtc - associated crtc to report irq events to > + */ > +struct mtk_disp_gamma { > + struct mtk_ddp_comp ddp_comp; > + const struct mtk_disp_gamma_data*data; > +}; > + > +static inline struct mtk_disp_gamma *comp_to_gamma(struct mtk_ddp_comp *comp) > +{ > + return container_of(comp, struct mtk_disp_gamma, ddp_comp); > +} > + > +void mtk_gamma_set(struct mtk_ddp_comp *comp, struct drm_crtc_state *state) > +{ > + unsigned int i, reg; > + struct drm_color_lut *lut; > + void __iomem *lut_base; > + u32 word; > + > + if (state->gamma_lut) { > + reg = readl(comp->regs + DISP_GAMMA_CFG); > + reg = reg | GAMMA_LUT_EN; > + writel(reg, comp->regs + DISP_GAMMA_CFG); > + lut_base = comp->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); > + writel(word, (lut_base + i * 4)); > + } > + } > +} > + > +static void mtk_gamma_config(struct mtk_ddp_comp *comp, unsigned int w, > +unsigned int h, unsigned int vrefresh, > +unsigned int bpc, struct cmdq_pkt *cmdq_pkt) > +{ > + struct mtk_disp_gamma *gamma = comp_to_gamma(comp); > + > + mtk_ddp_write(cmdq_pkt, h << 16 | w, comp, DISP_GAMMA_SIZE); > + > + mtk_dither_set(comp, bpc, DISP_GAMMA_CFG, cmdq_pkt); > +} > + > +static void mtk_gamma_start(struct mtk_ddp_comp *comp) > +{ > + writel(GAMMA_EN, comp->regs + DISP_GAMMA_EN); > +} > + > +static void mtk_gamma_stop(struct mtk_ddp_comp *comp) > +{ > + writel_relaxed(0x0, comp->regs + DISP_GAMMA_EN); > +} > + > +static const struct mtk_ddp_comp_funcs mtk_disp_gamma_funcs = { > + .gamma_set = mtk_gamma_set, > + .config = mtk_gamma_config, > + .start = mtk_gamma_start, > + .stop = mtk_gamma_stop, > +}; > + > +static int mtk_disp_gamma_bind(struct device *dev, struct device *master, > + void *data) > +{
[PATCH v9, 07/11] drm/mediatek: separate gamma module
mt8183 gamma module will different with mt8173 separate gamma for add private data Signed-off-by: Yongqiang Niu --- drivers/gpu/drm/mediatek/Makefile | 1 + drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 185 drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 58 + drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 1 + drivers/gpu/drm/mediatek/mtk_drm_drv.c | 4 +- drivers/gpu/drm/mediatek/mtk_drm_drv.h | 1 + 6 files changed, 192 insertions(+), 58 deletions(-) create mode 100644 drivers/gpu/drm/mediatek/mtk_disp_gamma.c diff --git a/drivers/gpu/drm/mediatek/Makefile b/drivers/gpu/drm/mediatek/Makefile index a892ede..17a08e2 100644 --- a/drivers/gpu/drm/mediatek/Makefile +++ b/drivers/gpu/drm/mediatek/Makefile @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 mediatek-drm-y := mtk_disp_color.o \ + mtk_disp_gamma.o \ mtk_disp_ovl.o \ mtk_disp_rdma.o \ mtk_drm_crtc.o \ diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c new file mode 100644 index 000..8501821 --- /dev/null +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c @@ -0,0 +1,185 @@ +/* + * SPDX-License-Identifier: + * + * Copyright (c) 2020 MediaTek Inc. + */ + +#include +#include +#include +#include +#include +#include + +#include "mtk_drm_crtc.h" +#include "mtk_drm_ddp_comp.h" + +#define DISP_GAMMA_EN 0x +#define GAMMA_EN BIT(0) +#define DISP_GAMMA_CFG 0x0020 +#define GAMMA_LUT_EN BIT(1) +#define DISP_GAMMA_SIZE0x0030 +#define DISP_GAMMA_LUT 0x0700 + +#define LUT_10BIT_MASK 0x03ff + +struct mtk_disp_gamma_data { + u32 reserved; +}; + +/** + * struct mtk_disp_gamma - DISP_GAMMA driver structure + * @ddp_comp - structure containing type enum and hardware resources + * @crtc - associated crtc to report irq events to + */ +struct mtk_disp_gamma { + struct mtk_ddp_comp ddp_comp; + const struct mtk_disp_gamma_data*data; +}; + +static inline struct mtk_disp_gamma *comp_to_gamma(struct mtk_ddp_comp *comp) +{ + return container_of(comp, struct mtk_disp_gamma, ddp_comp); +} + +void mtk_gamma_set(struct mtk_ddp_comp *comp, struct drm_crtc_state *state) +{ + unsigned int i, reg; + struct drm_color_lut *lut; + void __iomem *lut_base; + u32 word; + + if (state->gamma_lut) { + reg = readl(comp->regs + DISP_GAMMA_CFG); + reg = reg | GAMMA_LUT_EN; + writel(reg, comp->regs + DISP_GAMMA_CFG); + lut_base = comp->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); + writel(word, (lut_base + i * 4)); + } + } +} + +static void mtk_gamma_config(struct mtk_ddp_comp *comp, unsigned int w, +unsigned int h, unsigned int vrefresh, +unsigned int bpc, struct cmdq_pkt *cmdq_pkt) +{ + struct mtk_disp_gamma *gamma = comp_to_gamma(comp); + + mtk_ddp_write(cmdq_pkt, h << 16 | w, comp, DISP_GAMMA_SIZE); + + mtk_dither_set(comp, bpc, DISP_GAMMA_CFG, cmdq_pkt); +} + +static void mtk_gamma_start(struct mtk_ddp_comp *comp) +{ + writel(GAMMA_EN, comp->regs + DISP_GAMMA_EN); +} + +static void mtk_gamma_stop(struct mtk_ddp_comp *comp) +{ + writel_relaxed(0x0, comp->regs + DISP_GAMMA_EN); +} + +static const struct mtk_ddp_comp_funcs mtk_disp_gamma_funcs = { + .gamma_set = mtk_gamma_set, + .config = mtk_gamma_config, + .start = mtk_gamma_start, + .stop = mtk_gamma_stop, +}; + +static int mtk_disp_gamma_bind(struct device *dev, struct device *master, + void *data) +{ + struct mtk_disp_gamma *priv = dev_get_drvdata(dev); + struct drm_device *drm_dev = data; + int ret; + + ret = mtk_ddp_comp_register(drm_dev, >ddp_comp); + if (ret < 0) { + dev_err(dev, "Failed to register component %pOF: %d\n", + dev->of_node, ret); + return ret; + } + + return 0; +} + +static void mtk_disp_gamma_unbind(struct device *dev, struct device *master, + void *data) +{ + struct mtk_disp_gamma *priv = dev_get_drvdata(dev); + struct drm_device *drm_dev = data; + + mtk_ddp_comp_unregister(drm_dev, >ddp_comp); +} + +static const struct component_ops