lkml.org 
[lkml]   [2023]   [May]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [PATCH v4 03/11] drm/mediatek: gamma: Support SoC specific LUT size
    Date
    Hi, Angelo:

    On Thu, 2023-05-18 at 12:48 +0200, AngeloGioacchino Del Regno wrote:
    > External email : Please do not click links or open attachments until
    > you have verified the sender or the content.
    >
    >
    > Newer SoCs support a bigger Gamma LUT table: wire up a callback
    > to retrieve the correct LUT size for each different Gamma IP.
    >
    > Co-developed-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
    > Signed-off-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
    > [Angelo: Rewritten commit message/description + porting]
    > Signed-off-by: AngeloGioacchino Del Regno <
    > angelogioacchino.delregno@collabora.com>
    > Reviewed-by: Jason-JH.Lin <jason-jh.lin@mediatek.com>
    > ---
    > drivers/gpu/drm/mediatek/mtk_disp_drv.h | 1 +
    > drivers/gpu/drm/mediatek/mtk_disp_gamma.c | 25 ++++++++++++++++++-
    > --
    > drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 4 ++--
    > drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 1 -
    > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 1 +
    > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 9 ++++++++
    > 6 files changed, 35 insertions(+), 6 deletions(-)
    >
    > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
    > b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
    > index 75045932353e..e554b19f4830 100644
    > --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
    > +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
    > @@ -53,6 +53,7 @@ void mtk_gamma_clk_disable(struct device *dev);
    > void mtk_gamma_config(struct device *dev, unsigned int w,
    > unsigned int h, unsigned int vrefresh,
    > unsigned int bpc, struct cmdq_pkt *cmdq_pkt);
    > +unsigned int mtk_gamma_get_lut_size(struct device *dev);
    > void mtk_gamma_set(struct device *dev, struct drm_crtc_state
    > *state);
    > void mtk_gamma_set_common(struct device *dev, void __iomem *regs,
    > struct drm_crtc_state *state);
    > void mtk_gamma_start(struct device *dev);
    > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
    > b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
    > index ce6f2499b891..d194d9bc2e2b 100644
    > --- a/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
    > +++ b/drivers/gpu/drm/mediatek/mtk_disp_gamma.c
    > @@ -25,10 +25,12 @@
    > #define DISP_GAMMA_LUT 0x0700
    >
    > #define LUT_10BIT_MASK 0x03ff
    > +#define LUT_SIZE_DEFAULT 512 /* for setting
    > gamma lut from AAL */

    I would like to place AAL definition in AAL driver and pass it to gamma
    driver.

    Regards,
    CK

    >
    > struct mtk_disp_gamma_data {
    > bool has_dither;
    > bool lut_diff;
    > + u16 lut_size;
    > };
    >
    > /*
    > @@ -55,6 +57,17 @@ void mtk_gamma_clk_disable(struct device *dev)
    > clk_disable_unprepare(gamma->clk);
    > }
    >
    > +unsigned int mtk_gamma_get_lut_size(struct device *dev)
    > +{
    > + struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
    > + unsigned int lut_size = LUT_SIZE_DEFAULT;
    > +
    > + if (gamma && gamma->data)
    > + lut_size = gamma->data->lut_size;
    > +
    > + return lut_size;
    > +}
    > +
    > void mtk_gamma_set_common(struct device *dev, void __iomem *regs,
    > struct drm_crtc_state *state)
    > {
    > struct mtk_disp_gamma *gamma = dev_get_drvdata(dev);
    > @@ -62,6 +75,7 @@ void mtk_gamma_set_common(struct device *dev, void
    > __iomem *regs, struct drm_crt
    > struct drm_color_lut *lut;
    > void __iomem *lut_base;
    > bool lut_diff;
    > + u16 lut_size;
    > u32 word;
    > u32 diff[3] = {0};
    >
    > @@ -69,17 +83,20 @@ void mtk_gamma_set_common(struct device *dev,
    > void __iomem *regs, struct drm_crt
    > if (!state->gamma_lut)
    > return;
    >
    > - if (gamma && gamma->data)
    > + if (gamma && gamma->data) {
    > lut_diff = gamma->data->lut_diff;
    > - else
    > + lut_size = gamma->data->lut_size;
    > + } else {
    > lut_diff = false;
    > + lut_size = LUT_SIZE_DEFAULT;
    > + }
    >
    > reg = readl(regs + DISP_GAMMA_CFG);
    > reg = reg | GAMMA_LUT_EN;
    > writel(reg, regs + DISP_GAMMA_CFG);
    > lut_base = regs + DISP_GAMMA_LUT;
    > lut = (struct drm_color_lut *)state->gamma_lut->data;
    > - for (i = 0; i < MTK_LUT_SIZE; i++) {
    > + for (i = 0; i < lut_size; i++) {
    > if (!lut_diff || (i % 2 == 0)) {
    > word = (((lut[i].red >> 6) & LUT_10BIT_MASK)
    > << 20) +
    > (((lut[i].green >> 6) &
    > LUT_10BIT_MASK) << 10) +
    > @@ -196,10 +213,12 @@ static int mtk_disp_gamma_remove(struct
    > platform_device *pdev)
    >
    > static const struct mtk_disp_gamma_data mt8173_gamma_driver_data = {
    > .has_dither = true,
    > + .lut_size = 512,
    > };
    >
    > static const struct mtk_disp_gamma_data mt8183_gamma_driver_data = {
    > .lut_diff = true,
    > + .lut_size = 512,
    > };
    >
    > static const struct of_device_id mtk_disp_gamma_driver_dt_match[] =
    > {
    > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
    > b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
    > index d40142842f85..0df62b076f49 100644
    > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
    > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c
    > @@ -958,8 +958,8 @@ int mtk_drm_crtc_create(struct drm_device
    > *drm_dev,
    > mtk_crtc->ddp_comp[i] = comp;
    >
    > if (comp->funcs) {
    > - if (comp->funcs->gamma_set)
    > - gamma_lut_size = MTK_LUT_SIZE;
    > + if (comp->funcs->gamma_set && comp->funcs-
    > >gamma_get_lut_size)
    > + gamma_lut_size =
    > mtk_ddp_gamma_get_lut_size(comp);
    >
    > if (comp->funcs->ctm_set)
    > has_ctm = true;
    > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
    > b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
    > index 3e9046993d09..b2e50292e57d 100644
    > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
    > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h
    > @@ -10,7 +10,6 @@
    > #include "mtk_drm_ddp_comp.h"
    > #include "mtk_drm_plane.h"
    >
    > -#define MTK_LUT_SIZE 512
    > #define MTK_MAX_BPC 10
    > #define MTK_MIN_BPC 3
    >
    > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
    > b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
    > index f114da4d36a9..c77af2e4000f 100644
    > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
    > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
    > @@ -322,6 +322,7 @@ static const struct mtk_ddp_comp_funcs ddp_dsi =
    > {
    > static const struct mtk_ddp_comp_funcs ddp_gamma = {
    > .clk_enable = mtk_gamma_clk_enable,
    > .clk_disable = mtk_gamma_clk_disable,
    > + .gamma_get_lut_size = mtk_gamma_get_lut_size,
    > .gamma_set = mtk_gamma_set,
    > .config = mtk_gamma_config,
    > .start = mtk_gamma_start,
    > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
    > b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
    > index febcaeef16a1..c1355960e195 100644
    > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
    > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
    > @@ -67,6 +67,7 @@ struct mtk_ddp_comp_funcs {
    > void (*layer_config)(struct device *dev, unsigned int idx,
    > struct mtk_plane_state *state,
    > struct cmdq_pkt *cmdq_pkt);
    > + unsigned int (*gamma_get_lut_size)(struct device *dev);
    > void (*gamma_set)(struct device *dev,
    > struct drm_crtc_state *state);
    > void (*bgclr_in_on)(struct device *dev);
    > @@ -186,6 +187,14 @@ static inline void
    > mtk_ddp_comp_layer_config(struct mtk_ddp_comp *comp,
    > comp->funcs->layer_config(comp->dev, idx, state,
    > cmdq_pkt);
    > }
    >
    > +static inline unsigned int mtk_ddp_gamma_get_lut_size(struct
    > mtk_ddp_comp *comp)
    > +{
    > + if (comp->funcs && comp->funcs->gamma_get_lut_size)
    > + return comp->funcs->gamma_get_lut_size(comp->dev);
    > +
    > + return 0;
    > +}
    > +
    > static inline void mtk_ddp_gamma_set(struct mtk_ddp_comp *comp,
    > struct drm_crtc_state *state)
    > {
    > --
    > 2.40.1
    >
    \
     
     \ /
      Last update: 2023-05-26 07:21    [W:5.256 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site