diff for duplicates of <90bd076d82bf2cddeb3ce578be6e7539886cfc2b.camel@mediatek.com> diff --git a/N1/2.bin b/N1/2.bin new file mode 100644 index 0000000..24c7ec6 --- /dev/null +++ b/N1/2.bin @@ -0,0 +1,1252 @@ +<html><body><p> +<pre> +On Wed, 2025-02-12 at 07:09 +0000, CK Hu (胡俊光) wrote: +> Hi, Paul: +>  +> On Fri, 2025-01-10 at 20:34 +0800, paul-pl.chen wrote: +> > From: "Nancy.Lin" <nancy.lin@mediatek.com> +> >  +> > Ovlsys_adaptor is an encapsulated module designed to +> > simplify the DRM control flow. This module is composed +> > of 20 EXDMAs, 20 BLENDERs, and 12 OUTPROCs. +> > Two EXDMAs merge into one layer, allowing the module +> > to support 20 layers for 3 display paths. +> > Ovlsys_adaptor driver is integrated within the +> > mtk_ddp_comp framework. +> >  +> > Signed-off-by: Nancy.Lin <nancy.lin@mediatek.com> +> > Signed-off-by: Paul-pl.Chen <paul-pl.chen@mediatek.com> +> > --- +> >  drivers/gpu/drm/mediatek/Makefile             |   1 + +> >  drivers/gpu/drm/mediatek/mtk_ddp_comp.c       |  25 + +> >  drivers/gpu/drm/mediatek/mtk_ddp_comp.h       |   1 + +> >  drivers/gpu/drm/mediatek/mtk_disp_drv.h       |  31 +- +> >  .../drm/mediatek/mtk_disp_ovlsys_adaptor.c    | 758 +> > ++++++++++++++++++ +> >  drivers/gpu/drm/mediatek/mtk_drm_drv.c        |  61 +- +> >  drivers/gpu/drm/mediatek/mtk_drm_drv.h        |  11 +- +> >  7 files changed, 884 insertions(+), 4 deletions(-) +> >  create mode 100644 +> > drivers/gpu/drm/mediatek/mtk_disp_ovlsys_adaptor.c +> >  +> > diff --git a/drivers/gpu/drm/mediatek/Makefile +> > b/drivers/gpu/drm/mediatek/Makefile +> >  +//snip +> > +#include "mtk_disp_blender.h" +> > +#include "mtk_disp_drv.h" +> > +#include "mtk_crtc.h" +>  +> Alphabetic order. +>  +Ok, I will fix this part. +> > +#include "mtk_ddp_comp.h" +> > +#include "mtk_drm_drv.h" +> > + +> > +enum mtk_ovlsys_adaptor_comp_type { +> > +OVLSYS_ADAPTOR_TYPE_EXDMA = 0, +> > +OVLSYS_ADAPTOR_TYPE_BLENDER, +> > +OVLSYS_ADAPTOR_TYPE_OUTPROC, +> > +OVLSYS_ADAPTOR_TYPE_NUM, +> > +}; +> > + +> > +enum mtk_ovlsys_adaptor_comp_id { +> > +OVLSYS_ADAPTOR_EXDMA0, +> > +OVLSYS_ADAPTOR_EXDMA1, +> > +OVLSYS_ADAPTOR_EXDMA2, +> > +OVLSYS_ADAPTOR_EXDMA3, +> > +OVLSYS_ADAPTOR_EXDMA4, +> > +OVLSYS_ADAPTOR_EXDMA5, +> > +OVLSYS_ADAPTOR_EXDMA6, +> > +OVLSYS_ADAPTOR_EXDMA7, +> > +OVLSYS_ADAPTOR_EXDMA8, +> > +OVLSYS_ADAPTOR_EXDMA9, +> > +OVLSYS_ADAPTOR_EXDMA10, +> > +OVLSYS_ADAPTOR_EXDMA11, +> > +OVLSYS_ADAPTOR_EXDMA12, +> > +OVLSYS_ADAPTOR_EXDMA13, +> > +OVLSYS_ADAPTOR_EXDMA14, +> > +OVLSYS_ADAPTOR_EXDMA15, +> > +OVLSYS_ADAPTOR_EXDMA16, +> > +OVLSYS_ADAPTOR_EXDMA17, +> > +OVLSYS_ADAPTOR_EXDMA18, +> > +OVLSYS_ADAPTOR_EXDMA19, +> > +OVLSYS_ADAPTOR_BLENDER0, +> > +OVLSYS_ADAPTOR_BLENDER1, +> > +OVLSYS_ADAPTOR_BLENDER2, +> > +OVLSYS_ADAPTOR_BLENDER3, +> > +OVLSYS_ADAPTOR_BLENDER4, +> > +OVLSYS_ADAPTOR_BLENDER5, +> > +OVLSYS_ADAPTOR_BLENDER6, +> > +OVLSYS_ADAPTOR_BLENDER7, +> > +OVLSYS_ADAPTOR_BLENDER8, +> > +OVLSYS_ADAPTOR_BLENDER9, +> > +OVLSYS_ADAPTOR_BLENDER10, +> > +OVLSYS_ADAPTOR_BLENDER11, +> > +OVLSYS_ADAPTOR_BLENDER12, +> > +OVLSYS_ADAPTOR_BLENDER13, +> > +OVLSYS_ADAPTOR_BLENDER14, +> > +OVLSYS_ADAPTOR_BLENDER15, +> > +OVLSYS_ADAPTOR_BLENDER16, +> > +OVLSYS_ADAPTOR_BLENDER17, +> > +OVLSYS_ADAPTOR_BLENDER18, +> > +OVLSYS_ADAPTOR_BLENDER19, +> > +OVLSYS_ADAPTOR_OUTPROC0, +> > +OVLSYS_ADAPTOR_OUTPROC1, +> > +OVLSYS_ADAPTOR_OUTPROC2, +> > +OVLSYS_ADAPTOR_OUTPROC3, +> > +OVLSYS_ADAPTOR_OUTPROC4, +> > +OVLSYS_ADAPTOR_OUTPROC5, +> > +OVLSYS_ADAPTOR_OUTPROC6, +> > +OVLSYS_ADAPTOR_OUTPROC7, +> > +OVLSYS_ADAPTOR_OUTPROC8, +> > +OVLSYS_ADAPTOR_OUTPROC9, +> > +OVLSYS_ADAPTOR_OUTPROC10, +> > +OVLSYS_ADAPTOR_OUTPROC11, +> > +OVLSYS_ADAPTOR_ID_MAX +> > +}; +> > + +> > +struct ovlsys_adaptor_comp_match { +> > +enum mtk_ovlsys_adaptor_comp_type type; +> > +int alias_id; +> > +enum mtk_ddp_comp_id comp_id; +> > +}; +> > + +> > +struct mtk_disp_ovlsys_adaptor { +> > +struct device *ovl_adaptor_comp[OVLSYS_ADAPTOR_ID_MAX]; +> > +struct device *mmsys_dev; +> > +const unsigned int *path; +> > +unsigned int path_size; +> > +unsigned int layer_nr; +> > +bool children_bound; +> > +unsigned int max_size; +> > +}; +> > + +> > +static const char * const +> > private_comp_stem[OVLSYS_ADAPTOR_TYPE_NUM] = { +> > +[OVLSYS_ADAPTOR_TYPE_EXDMA]= "exdma", +> > +[OVLSYS_ADAPTOR_TYPE_BLENDER]= "blender", +> > +[OVLSYS_ADAPTOR_TYPE_OUTPROC]= "outproc", +> > +}; +> > + +> > +static const struct ovlsys_adaptor_comp_match +> > comp_matches[OVLSYS_ADAPTOR_ID_MAX] = { +> > +[OVLSYS_ADAPTOR_EXDMA0]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, +> > 0, DDP_COMPONENT_ID_MAX}, +> > +[OVLSYS_ADAPTOR_EXDMA1]  = { +> > OVLSYS_ADAPTOR_TYPE_EXDMA, 1, DDP_COMPONENT_ID_MAX}, +> > +[OVLSYS_ADAPTOR_EXDMA2]  = { +> > OVLSYS_ADAPTOR_TYPE_EXDMA, 2, DDP_COMPONENT_OVL0_EXDMA2}, +> > +[OVLSYS_ADAPTOR_EXDMA3]  = { +> > OVLSYS_ADAPTOR_TYPE_EXDMA, 3, DDP_COMPONENT_OVL0_EXDMA3}, +> > +[OVLSYS_ADAPTOR_EXDMA4]  = { +> > OVLSYS_ADAPTOR_TYPE_EXDMA, 4, DDP_COMPONENT_OVL0_EXDMA4}, +> > +[OVLSYS_ADAPTOR_EXDMA5]  = { +> > OVLSYS_ADAPTOR_TYPE_EXDMA, 5, DDP_COMPONENT_OVL0_EXDMA5}, +> > +[OVLSYS_ADAPTOR_EXDMA6]  = { +> > OVLSYS_ADAPTOR_TYPE_EXDMA, 6, DDP_COMPONENT_OVL0_EXDMA6}, +> > +[OVLSYS_ADAPTOR_EXDMA7]  = { +> > OVLSYS_ADAPTOR_TYPE_EXDMA, 7, DDP_COMPONENT_OVL0_EXDMA7}, +> > +[OVLSYS_ADAPTOR_EXDMA8]  = { +> > OVLSYS_ADAPTOR_TYPE_EXDMA, 8, DDP_COMPONENT_OVL0_EXDMA8}, +> > +[OVLSYS_ADAPTOR_EXDMA9]  = { +> > OVLSYS_ADAPTOR_TYPE_EXDMA, 9, DDP_COMPONENT_OVL0_EXDMA9}, +> > +[OVLSYS_ADAPTOR_EXDMA10]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, +> > 10, DDP_COMPONENT_ID_MAX}, +>  +> EXDMA10 has no component id, so just drop OVLSYS_ADAPTOR_EXDMA10. +>  +OK I will check this part. +> > +[OVLSYS_ADAPTOR_EXDMA11]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, +> > 11, DDP_COMPONENT_ID_MAX}, +>  +> Ditto. +>  +OK I will check this part, too. +> > +[OVLSYS_ADAPTOR_EXDMA12]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, +> > 12, DDP_COMPONENT_OVL1_EXDMA2}, +> > +[OVLSYS_ADAPTOR_EXDMA13]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, +> > 13, DDP_COMPONENT_OVL1_EXDMA3}, +> > +[OVLSYS_ADAPTOR_EXDMA14]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, +> > 14, DDP_COMPONENT_OVL1_EXDMA4}, +> > +[OVLSYS_ADAPTOR_EXDMA15]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, +> > 15, DDP_COMPONENT_OVL1_EXDMA5}, +> > +[OVLSYS_ADAPTOR_EXDMA16]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, +> > 16, DDP_COMPONENT_OVL1_EXDMA6}, +> > +[OVLSYS_ADAPTOR_EXDMA17]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, +> > 17, DDP_COMPONENT_OVL1_EXDMA7}, +> > +[OVLSYS_ADAPTOR_EXDMA18]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, +> > 18, DDP_COMPONENT_OVL1_EXDMA8}, +> > +[OVLSYS_ADAPTOR_EXDMA19]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, +> > 19, DDP_COMPONENT_OVL1_EXDMA9}, +> > +[OVLSYS_ADAPTOR_BLENDER0] = { OVLSYS_ADAPTOR_TYPE_BLENDER, +> > 0, DDP_COMPONENT_ID_MAX}, +>  +> Ditto. +>  +OK I will check this part, too. +> > +[OVLSYS_ADAPTOR_BLENDER1] = { OVLSYS_ADAPTOR_TYPE_BLENDER, +> > 1, DDP_COMPONENT_OVL0_BLENDER1}, +> > +[OVLSYS_ADAPTOR_BLENDER2] = { OVLSYS_ADAPTOR_TYPE_BLENDER, +> > 2, DDP_COMPONENT_OVL0_BLENDER2}, +> > +[OVLSYS_ADAPTOR_BLENDER3] = { OVLSYS_ADAPTOR_TYPE_BLENDER, +> > 3, DDP_COMPONENT_OVL0_BLENDER3}, +> > +[OVLSYS_ADAPTOR_BLENDER4] = { OVLSYS_ADAPTOR_TYPE_BLENDER, +> > 4, DDP_COMPONENT_OVL0_BLENDER4}, +> > +[OVLSYS_ADAPTOR_BLENDER5] = { OVLSYS_ADAPTOR_TYPE_BLENDER, +> > 5, DDP_COMPONENT_OVL0_BLENDER5}, +> > +[OVLSYS_ADAPTOR_BLENDER6] = { OVLSYS_ADAPTOR_TYPE_BLENDER, +> > 6, DDP_COMPONENT_OVL0_BLENDER6}, +> > +[OVLSYS_ADAPTOR_BLENDER7] = { OVLSYS_ADAPTOR_TYPE_BLENDER, +> > 7, DDP_COMPONENT_OVL0_BLENDER7}, +> > +[OVLSYS_ADAPTOR_BLENDER8] = { OVLSYS_ADAPTOR_TYPE_BLENDER, +> > 8, DDP_COMPONENT_OVL0_BLENDER8}, +> > +[OVLSYS_ADAPTOR_BLENDER9] = { OVLSYS_ADAPTOR_TYPE_BLENDER, +> > 9, DDP_COMPONENT_OVL0_BLENDER9}, +> > +[OVLSYS_ADAPTOR_BLENDER10] = { +> > OVLSYS_ADAPTOR_TYPE_BLENDER, 10, DDP_COMPONENT_ID_MAX}, +>  +> Ditto. +>  + +OK I will check this part, too. +> > +[OVLSYS_ADAPTOR_BLENDER11] = { +> > +OVLSYS_ADAPTOR_TYPE_BLENDER, 11, +> > DDP_COMPONENT_OVL1_BLENDER1}, +> > +[OVLSYS_ADAPTOR_BLENDER12] = { +> > +OVLSYS_ADAPTOR_TYPE_BLENDER, 12, +> > DDP_COMPONENT_OVL1_BLENDER2}, +> > +[OVLSYS_ADAPTOR_BLENDER13] = { +> > +OVLSYS_ADAPTOR_TYPE_BLENDER, 13, +> > DDP_COMPONENT_OVL1_BLENDER3}, +> > +[OVLSYS_ADAPTOR_BLENDER14] = { +> > +OVLSYS_ADAPTOR_TYPE_BLENDER, 14, +> > DDP_COMPONENT_OVL1_BLENDER4}, +> > +[OVLSYS_ADAPTOR_BLENDER15] = { +> > +OVLSYS_ADAPTOR_TYPE_BLENDER, 15, +> > DDP_COMPONENT_OVL1_BLENDER5}, +> > +[OVLSYS_ADAPTOR_BLENDER16] = { +> > +OVLSYS_ADAPTOR_TYPE_BLENDER, 16, +> > DDP_COMPONENT_OVL1_BLENDER6}, +> > +[OVLSYS_ADAPTOR_BLENDER17] = { +> > +OVLSYS_ADAPTOR_TYPE_BLENDER, 17, +> > DDP_COMPONENT_OVL1_BLENDER7}, +> > +[OVLSYS_ADAPTOR_BLENDER18] = { +> > +OVLSYS_ADAPTOR_TYPE_BLENDER, 18, +> > DDP_COMPONENT_OVL1_BLENDER8}, +> > +[OVLSYS_ADAPTOR_BLENDER19] = { +> > +OVLSYS_ADAPTOR_TYPE_BLENDER, 19, +> > DDP_COMPONENT_OVL1_BLENDER9}, +> > +[OVLSYS_ADAPTOR_OUTPROC0] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, +> > 0, DDP_COMPONENT_OVL0_OUTPROC0}, +> > +[OVLSYS_ADAPTOR_OUTPROC1] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, +> > 1, DDP_COMPONENT_OVL0_OUTPROC1}, +> > +[OVLSYS_ADAPTOR_OUTPROC2] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, +> > 2, DDP_COMPONENT_ID_MAX}, +> > +[OVLSYS_ADAPTOR_OUTPROC3] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, +> > 3, DDP_COMPONENT_ID_MAX}, +> > +[OVLSYS_ADAPTOR_OUTPROC4] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, +> > 4, DDP_COMPONENT_ID_MAX}, +> > +[OVLSYS_ADAPTOR_OUTPROC5] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, +> > 5, DDP_COMPONENT_ID_MAX}, +>  +> Ditto. +>  + +OK I will check this part, too. +> > +[OVLSYS_ADAPTOR_OUTPROC6] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, +> > 6, DDP_COMPONENT_OVL1_OUTPROC0}, +> > +[OVLSYS_ADAPTOR_OUTPROC7] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, +> > 7, DDP_COMPONENT_ID_MAX}, +> > +[OVLSYS_ADAPTOR_OUTPROC8] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, +> > 8, DDP_COMPONENT_ID_MAX}, +> > +[OVLSYS_ADAPTOR_OUTPROC9] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, +> > 9, DDP_COMPONENT_ID_MAX}, +> > +[OVLSYS_ADAPTOR_OUTPROC10] = { +> > OVLSYS_ADAPTOR_TYPE_OUTPROC, 10, DDP_COMPONENT_ID_MAX}, +> > +[OVLSYS_ADAPTOR_OUTPROC11] = { +> > OVLSYS_ADAPTOR_TYPE_OUTPROC, 11, DDP_COMPONENT_ID_MAX}, +>  +> Ditto. +>  + +OK I will check this part, too. +> > +}; +> > + +> > +static const unsigned int mt8196_mtk_ovl_main[] = { +> > +OVLSYS_ADAPTOR_EXDMA2, +> > +OVLSYS_ADAPTOR_BLENDER1, +> > +OVLSYS_ADAPTOR_EXDMA3, +> > +OVLSYS_ADAPTOR_BLENDER2, +> > +OVLSYS_ADAPTOR_EXDMA4, +> > +OVLSYS_ADAPTOR_BLENDER3, +> > +OVLSYS_ADAPTOR_EXDMA5, +> > +OVLSYS_ADAPTOR_BLENDER4, +> > +OVLSYS_ADAPTOR_OUTPROC0, +> > +}; +> > + +> > +static const unsigned int mt8196_mtk_ovl_ext[] = { +> > +OVLSYS_ADAPTOR_EXDMA6, +> > +OVLSYS_ADAPTOR_BLENDER5, +> > +OVLSYS_ADAPTOR_EXDMA7, +> > +OVLSYS_ADAPTOR_BLENDER6, +> > +OVLSYS_ADAPTOR_EXDMA8, +> > +OVLSYS_ADAPTOR_BLENDER7, +> > +OVLSYS_ADAPTOR_EXDMA9, +> > +OVLSYS_ADAPTOR_BLENDER8, +> > +OVLSYS_ADAPTOR_OUTPROC1, +> > +}; +> > + +> > +static const unsigned int mt8196_mtk_ovl_third[] = { +> > +OVLSYS_ADAPTOR_EXDMA12, +> > +OVLSYS_ADAPTOR_BLENDER11, +> > +OVLSYS_ADAPTOR_EXDMA13, +> > +OVLSYS_ADAPTOR_BLENDER12, +> > +OVLSYS_ADAPTOR_EXDMA14, +> > +OVLSYS_ADAPTOR_BLENDER13, +> > +OVLSYS_ADAPTOR_EXDMA15, +> > +OVLSYS_ADAPTOR_BLENDER14, +> > +OVLSYS_ADAPTOR_OUTPROC6, +> > +}; +> > + +> > +static enum mtk_ovlsys_adaptor_comp_type get_type(enum +> > mtk_ovlsys_adaptor_comp_id id) +> > +{ +> > +return comp_matches[id].type; +> > +} +> > + +> > +static enum mtk_ddp_comp_id get_ddp_comp_id(enum +> > mtk_ovlsys_adaptor_comp_id id) +> > +{ +> > +return comp_matches[id].comp_id; +> > +} +> > + +> > +static struct device *get_comp_by_type_idx(struct device *dev, +> > +   enum +> > mtk_ovlsys_adaptor_comp_type type, +> > +   unsigned int idx) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > +int i; +> > +int count = 0; +> > + +> > +for (i = 0; i < priv->path_size; i++) { +> > +if (get_type(priv->path[i]) == type) { +> > +if (count == idx) +> > +return priv- +> > >ovl_adaptor_comp[priv->path[i]]; +> > +count++; +> > +} +> > +} +> > +return NULL; +> > +} +> > + +> > +void mtk_ovlsys_adaptor_layer_config(struct device *dev, unsigned +> > int idx, +> > +     struct mtk_plane_state +> > *state, +> > +     struct cmdq_pkt *cmdq_pkt) +> > +{ +> > +struct mtk_plane_pending_state *pending = &state->pending; +> > +struct device *exdma; +> > +struct device *blender; +> > +unsigned int align_width = 0; +> > +const struct drm_format_info *fmt_info = +> > drm_format_info(pending->format); +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > + +> > +dev_dbg(dev, "%s+ idx:%d, enable:%d, fmt:0x%x\n", +> > __func__, idx, +> > +pending->enable, pending->format); +> > +dev_dbg(dev, "addr 0x%pad, fb w:%d, {%d,%d,%d,%d}\n", +> > +&pending->addr, (pending->pitch / fmt_info- +> > >cpp[0]), +> > +pending->x, pending->y, pending->width, pending- +> > >height); +> > + +> > +exdma = get_comp_by_type_idx(dev, +> > OVLSYS_ADAPTOR_TYPE_EXDMA, idx); +> > +blender = get_comp_by_type_idx(dev, +> > OVLSYS_ADAPTOR_TYPE_BLENDER, idx); +> > + +> > +/* OVLSYS is in 1T2P domain, width needs to be 2 pixels +> > align */ +> > +align_width = ALIGN_DOWN(pending->width, 2); +>  +> align_width is useless, so drop it. +>  +> > + +> > +if (!pending->enable || pending->height == 0 || +> > align_width == 0 || +> > +    pending->x > priv->max_size || pending->y > priv- +> > >max_size) { +> > +pending->enable = false; +> > +mtk_disp_exdma_stop(exdma, cmdq_pkt); +> > +mtk_disp_blender_layer_config(blender, state, +> > cmdq_pkt); +> > +return; +> > +} +> > + +> > +mtk_disp_exdma_config(exdma, state, cmdq_pkt); +>  +> mtk_disp_exdma_config() does something like mtk_ovl_layer_config(), +> so I would like to rename it to mtk_disp_exdma_layer_config(). +>  +Sure, I will rename the function name. +> > + +> > +mtk_disp_blender_layer_config(blender, state, cmdq_pkt); +> > + +> > +mtk_disp_exdma_start(exdma, cmdq_pkt); +>  +> Why call start in layer config? +> start should be called in start. +>  + +Sure, I will fix the order of setting. +> > +mtk_disp_blender_start(blender, cmdq_pkt); +>  +> Ditto. + +OK I will check this part, too. +>  +> > +} +> > + +> > +void mtk_ovlsys_adaptor_config(struct device *dev, unsigned int w, +> > +       unsigned int h, unsigned int +> > vrefresh, +> > +       unsigned int bpc, struct cmdq_pkt +> > *cmdq_pkt) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > +int i; +> > +int blender_idx = 0; +> > + +> > +for (i = 0; i < priv->path_size; i++) { +> > +enum mtk_disp_blender_layer blender; +> > + +> > +if (get_type(priv->path[i]) == +> > OVLSYS_ADAPTOR_TYPE_BLENDER) { +> > +blender_idx++; +> > +if (priv->layer_nr == 1) +> > +blender = SINGLE_BLENDER; +> > +else if (blender_idx == 1) +> > +blender = FIRST_BLENDER; +> > +else if (blender_idx == priv->layer_nr) +> > +blender = LAST_BLENDER; +> > +else +> > +blender = OTHERS; +> > + +> > +mtk_disp_blender_config(priv- +> > >ovl_adaptor_comp[priv->path[i]], w, h, +> > +vrefresh, bpc, +> > blender, cmdq_pkt); +>  +> mtk_disp_blender_config(priv->ovl_adaptor_comp[priv->path[i]], w, h, +> vrefresh, bpc, blender_idx == 1, blender_idx +> == priv->layer_nr, cmdq_pkt); +>  +> > +} else if (get_type(priv->path[i]) == +> > OVLSYS_ADAPTOR_TYPE_OUTPROC) { +> > +mtk_disp_outproc_config(priv- +> > >ovl_adaptor_comp[priv->path[i]], w, h, +> > +vrefresh, bpc, +> > cmdq_pkt); +> > +} +> > +} +> > +} +> > + +> > +int mtk_ovlsys_adaptor_layer_check(struct device *dev, +> > +   unsigned int idx, +> > +   struct mtk_plane_state +> > *mtk_state) +> > +{ +> > +struct drm_plane_state *state = &mtk_state->base; +> > + +> > +/* Check if any unsupported rotation is set */ +> > +if (state->rotation & ~DRM_MODE_ROTATE_0) +> > +return -EINVAL; +> > + +> > +return 0; +> > +} +> > + +> > +void mtk_ovlsys_adaptor_start(struct device *dev) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > +int i; +> > + +> > +for (i = 0; i < priv->path_size; i++) { +> > +if (get_type(priv->path[i]) == +> > OVLSYS_ADAPTOR_TYPE_EXDMA) +> > +mtk_disp_exdma_start(priv- +> > >ovl_adaptor_comp[priv->path[i]], NULL); +>  +> The start never use cmdq, so remove the cmdq parameter. + +Ok, I will fix this part. +>  +> > +else if (get_type(priv->path[i]) == +> > OVLSYS_ADAPTOR_TYPE_BLENDER) +> > +mtk_disp_blender_start(priv- +> > >ovl_adaptor_comp[priv->path[i]], NULL); +>  +> Ditto. +>  +Ok, I will fix this part.> > +else +> > +mtk_disp_outproc_start(priv- +> > >ovl_adaptor_comp[priv->path[i]]); +> > +} +> > +} +> > + +> > +void mtk_ovlsys_adaptor_stop(struct device *dev) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > +int i; +> > + +> > +for (i = 0; i < priv->path_size; i++) { +> > +if (get_type(priv->path[i]) == +> > OVLSYS_ADAPTOR_TYPE_EXDMA) +> > +mtk_disp_exdma_stop(priv- +> > >ovl_adaptor_comp[priv->path[i]], NULL); +>  +> Ditto. + +Ok, I will fix this part.th. +>  +> > +else if (get_type(priv->path[i]) == +> > OVLSYS_ADAPTOR_TYPE_BLENDER) +> > +mtk_disp_blender_stop(priv- +> > >ovl_adaptor_comp[priv->path[i]], NULL); +>  +> Ditto. + +Ok, I will fix this part. +>  +> > +else +> > +mtk_disp_outproc_stop(priv- +> > >ovl_adaptor_comp[priv->path[i]]); +> > +} +> > +} +> > + +> > +int mtk_ovlsys_adaptor_clk_enable(struct device *dev) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > +struct device *comp; +> > +int ret; +> > +int i; +> > + +> > +for (i = 0; i < OVLSYS_ADAPTOR_ID_MAX; i++) { +> > +comp = priv->ovl_adaptor_comp[i]; +> > + +> > +if (!comp) +> > +continue; +> > + +> > +if (get_type(i) != OVLSYS_ADAPTOR_TYPE_EXDMA) +> > +continue; +> > + +> > +ret = pm_runtime_get_sync(comp); +>  +> Refer to mtk_ovl_adaptor_power_on(). +> This should be done in power_on() callback function. + +Sure, I will align the power sequence with the function +mtk_ovl_adaptor_power_on(). +>  +> > +if (ret < 0) { +> > +dev_err(dev, "Failed to enable power +> > domain %d, err %d\n", i, ret); +> > +goto pwr_err; +> > +} +> > +} +> > + +> > +for (i = 0; i < OVLSYS_ADAPTOR_ID_MAX; i++) { +> > +comp = priv->ovl_adaptor_comp[i]; +> > + +> > +if (!comp) +> > +continue; +> > + +> > +if (get_type(i) == OVLSYS_ADAPTOR_TYPE_EXDMA) +> > +ret = mtk_disp_exdma_clk_enable(comp); +> > +else if (get_type(i) == +> > OVLSYS_ADAPTOR_TYPE_BLENDER) +> > +ret = mtk_disp_blender_clk_enable(comp); +> > +else +> > +ret = mtk_disp_outproc_clk_enable(comp); +> > + +> > +if (ret) { +> > +dev_err(dev, "Failed to enable clock %d, +> > err %d\n", i, ret); +> > +goto clk_err; +> > +} +> > +} +> > + +> > +return ret; +> > + +> > +clk_err: +> > +while (--i >= 0) { +> > +comp = priv->ovl_adaptor_comp[i]; +> > +if (!comp) +> > +continue; +> > +if (get_type(i) == OVLSYS_ADAPTOR_TYPE_EXDMA) +> > +mtk_disp_exdma_clk_disable(comp); +> > +else if (get_type(i) == +> > OVLSYS_ADAPTOR_TYPE_BLENDER) +> > +mtk_disp_blender_clk_disable(comp); +> > +else +> > +mtk_disp_outproc_clk_disable(comp); +> > +} +> > +i = OVLSYS_ADAPTOR_BLENDER0; +> > + +> > +pwr_err: +> > +while (--i >= 0) { +> > +comp = priv->ovl_adaptor_comp[i]; +> > +if (!comp) +> > +continue; +> > +pm_runtime_put(priv->ovl_adaptor_comp[i]); +> > +} +> > + +> > +return ret; +> > +} +> > + +> > +void mtk_ovlsys_adaptor_clk_disable(struct device *dev) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > +struct device *comp; +> > +int i; +> > + +> > +for (i = 0; i < OVLSYS_ADAPTOR_ID_MAX; i++) { +> > +comp = priv->ovl_adaptor_comp[i]; +> > + +> > +if (!comp) +> > +continue; +> > + +> > +if (get_type(i) == OVLSYS_ADAPTOR_TYPE_EXDMA) { +> > +mtk_disp_exdma_clk_disable(comp); +> > +pm_runtime_put(comp); +> > +} else if (get_type(i) == +> > OVLSYS_ADAPTOR_TYPE_BLENDER) { +> > +mtk_disp_blender_clk_disable(comp); +> > +} else { +> > +mtk_disp_outproc_clk_disable(comp); +> > +} +> > +} +> > +} +> > + +> > +unsigned int mtk_ovlsys_adaptor_layer_nr(struct device *dev) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > + +> > +return priv->layer_nr; +> > +} +> > + +> > +struct device *mtk_ovlsys_adaptor_dma_dev_get(struct device *dev) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > + +> > +return priv->ovl_adaptor_comp[priv->path[0]]; +> > +} +> > + +> > +void mtk_ovlsys_adaptor_register_vblank_cb(struct device *dev, +> > void (*vblank_cb)(void *), +> > +   void *vblank_cb_data) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > + +> > +mtk_disp_outproc_register_vblank_cb(priv- +> > >ovl_adaptor_comp[priv->path[priv->path_size - 1]], +> > +    vblank_cb, +> > vblank_cb_data); +> > +} +> > + +> > +void mtk_ovlsys_adaptor_unregister_vblank_cb(struct device *dev) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > +struct device *comp = priv->ovl_adaptor_comp[priv- +> > >path[priv->path_size - 1]]; +> > + +> > +if (!priv->children_bound) +>  +> In ovl adaptor, it does not check this. So remove this checking. + +This is because of the mt8916's new hardwarew design. + +ovlsys adaptor have to find the possible path. +>  +> > +return; +> > + +> > +mtk_disp_outproc_unregister_vblank_cb(comp); +> > +} +> > + +> > +void mtk_ovlsys_adaptor_enable_vblank(struct device *dev) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > + +> > +mtk_disp_outproc_enable_vblank(priv- +> > >ovl_adaptor_comp[priv->path[priv->path_size - 1]]); +> > +} +> > + +> > +void mtk_ovlsys_adaptor_disable_vblank(struct device *dev) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > + +> > +mtk_disp_outproc_disable_vblank(priv- +> > >ovl_adaptor_comp[priv->path[priv->path_size - 1]]); +> > +} +> > + +> > +const u32 *mtk_ovlsys_adaptor_get_formats(struct device *dev) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > + +> > +return mtk_disp_exdma_get_formats(priv- +> > >ovl_adaptor_comp[priv->path[0]]); +> > +} +> > + +> > +size_t mtk_ovlsys_adaptor_get_num_formats(struct device *dev) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > + +> > +return mtk_disp_exdma_get_num_formats(priv- +> > >ovl_adaptor_comp[priv->path[0]]); +> > +} +> > + +> > +void mtk_ovlsys_adaptor_add_comp(struct device *dev, struct +> > mtk_mutex *mutex) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > +int i; +> > + +> > +for (i = 0; i < priv->path_size; i++) +> > +mtk_mutex_add_comp(mutex, get_ddp_comp_id(priv- +> > >path[i])); +> > +} +> > + +> > +void mtk_ovlsys_adaptor_remove_comp(struct device *dev, struct +> > mtk_mutex *mutex) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > +int i; +> > + +> > +for (i = 0; i < priv->path_size; i++) +> > +mtk_mutex_remove_comp(mutex, get_ddp_comp_id(priv- +> > >path[i])); +> > +} +> > + +> > +void mtk_ovlsys_adaptor_connect(struct device *dev, struct device +> > *mmsys_dev, unsigned int next) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > +int i; +> > + +> > +for (i = 0; i < priv->path_size - 1; i++) +> > +mtk_mmsys_ddp_connect(mmsys_dev, +> > get_ddp_comp_id(priv->path[i]), +> > +      get_ddp_comp_id(priv->path[i +> > + 1])); +> > + +> > +mtk_mmsys_ddp_connect(mmsys_dev, get_ddp_comp_id(priv- +> > >path[i]), next); +> > +} +> > + +> > +void mtk_ovlsys_adaptor_disconnect(struct device *dev, struct +> > device *mmsys_dev, unsigned int next) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > +int i; +> > + +> > +for (i = 0; i < priv->path_size - 1; i++) +> > +mtk_mmsys_ddp_disconnect(mmsys_dev, +> > get_ddp_comp_id(priv->path[i]), +> > + get_ddp_comp_id(priv- +> > >path[i + 1])); +> > + +> > +mtk_mmsys_ddp_disconnect(mmsys_dev, get_ddp_comp_id(priv- +> > >path[i]), next); +> > +} +> > + +> > +static int ovlsys_adaptor_comp_get_id(struct device *dev, struct +> > device_node *node, +> > +      enum +> > mtk_ovlsys_adaptor_comp_type type, +> > +      enum mtk_ddp_comp_id +> > *comp_id) +> > +{ +> > +int alias_id = of_alias_get_id(node, +> > private_comp_stem[type]); +> > +int i; +> > + +> > +for (i = 0; i < ARRAY_SIZE(comp_matches); i++) +> > +if (comp_matches[i].type == type && +> > +    comp_matches[i].alias_id == alias_id) { +> > +*comp_id = comp_matches[i].comp_id; +> > +return i; +> > +} +> > +dev_warn(dev, "Failed to get id. type: %d, alias: %d\n", +> > type, alias_id); +> > +return -EINVAL; +> > +} +> > + +> > +static const struct of_device_id mtk_ovlsys_adaptor_comp_dt_ids[] +> > = { +> > +{ +> > +.compatible = "mediatek,mt8196-exdma", +> > +.data = (void *)OVLSYS_ADAPTOR_TYPE_EXDMA, +> > +}, { +> > +.compatible = "mediatek,mt8196-blender", +> > +.data = (void *)OVLSYS_ADAPTOR_TYPE_BLENDER, +> > +}, { +> > +.compatible = "mediatek,mt8196-outproc", +> > +.data = (void *)OVLSYS_ADAPTOR_TYPE_OUTPROC, +> > +}, +> > +{}, +> > +}; +> > + +> > +static int ovlsys_adaptor_comp_init(struct device *dev, struct +> > component_match **match) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > +struct device_node *node, *parent; +> > +struct platform_device *comp_pdev; +> > +int i; +> > + +> > +parent = dev->parent->parent->of_node->parent; +> > + +> > +for_each_child_of_node(parent, node) { +> > +const struct of_device_id *of_id; +> > +enum mtk_ovlsys_adaptor_comp_type type; +> > +enum mtk_ddp_comp_id comp_id; +> > +int id; +> > +bool found = false; +> > + +> > +of_id = +> > of_match_node(mtk_ovlsys_adaptor_comp_dt_ids, node); +> > +if (!of_id) +> > +continue; +> > + +> > +if (!of_device_is_available(node)) { +> > +dev_dbg(dev, "Skipping disabled component +> > %pOF\n", +> > +node); +> > +continue; +> > +} +> > + +> > +type = (enum +> > mtk_ovlsys_adaptor_comp_type)(uintptr_t)of_id->data; +> > +id = ovlsys_adaptor_comp_get_id(dev, node, type, +> > &comp_id); +> > +if (id < 0) { +> > +dev_warn(dev, "Skipping unknown component +> > %pOF\n", +> > + node); +> > +continue; +> > +} +> > + +> > +for (i = 0; i < priv->path_size; i++) +> > +if (priv->path[i] == id) +> > +found = true; +> > + +> > +if (!found) +> > +continue; +>  +> ovl adaptor does not check this, why ovlsys need this? +> If this is removed, this function is similar to the one in ovl +> adaptor, +> would you try to rewrite this function to be almost the same with the +> one in ovl adator? +> Not merging it, just implement almost the same. +This is because of the mt8916's new hardwarew design. + +ovlsys adaptor have to find the possible path. + +>  +> > + +> > +comp_pdev = of_find_device_by_node(node); +> > +if (!comp_pdev) +> > +return -EPROBE_DEFER; +> > + +> > +priv->ovl_adaptor_comp[id] = &comp_pdev->dev; +> > + +> > +drm_of_component_match_add(dev, match, +> > component_compare_of, node); +> > +dev_dbg(dev, "Adding component match for %pOF\n", +> > node); +> > +} +> > + +> > +if (!*match) { +> > +dev_err(dev, "No match device for +> > ovlsys_adaptor\n"); +> > +return -ENODEV; +> > +} +> > + +> > +return 0; +> > +} +> > + +> > +static int mtk_disp_ovlsys_adaptor_comp_bind(struct device *dev, +> > struct device *master, +> > +     void *data) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > + +> > +if (!priv->children_bound) +> > +return -EPROBE_DEFER; +> > + +> > +return 0; +> > +} +> > + +> > +static void mtk_disp_ovlsys_adaptor_comp_unbind(struct device +> > *dev, struct device *master, +> > +void *data) +> > +{ +> > +} +> > + +> > +static const struct component_ops mtk_disp_ovlsys_adaptor_comp_ops +> > = { +> > +.bind= mtk_disp_ovlsys_adaptor_comp_bind, +> > +.unbind = mtk_disp_ovlsys_adaptor_comp_unbind, +> > +}; +> > + +> > +static int mtk_disp_ovlsys_adaptor_master_bind(struct device *dev) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > +int ret, i; +> > +unsigned int layer_nr = 0; +> > + +> > +ret = component_bind_all(dev, priv->mmsys_dev); +> > +if (ret) +> > +return dev_err_probe(dev, ret, "component_bind_all +> > failed!\n"); +> > + +> > +priv->children_bound = true; +> > + +> > +for (i = 0; i < priv->path_size; i++) +> > +if (comp_matches[priv->path[i]].type == +> > OVLSYS_ADAPTOR_TYPE_BLENDER) +> > +layer_nr++; +> > +priv->layer_nr = layer_nr; +> > + +> > +return 0; +> > +} +> > + +> > +static void mtk_disp_ovlsys_adaptor_master_unbind(struct device +> > *dev) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv = +> > dev_get_drvdata(dev); +> > + +> > +priv->children_bound = false; +> > +} +> > + +> > +static const struct component_master_ops +> > mtk_disp_ovlsys_adaptor_master_ops = { +> > +.bind= mtk_disp_ovlsys_adaptor_master_bind, +> > +.unbind= +> > mtk_disp_ovlsys_adaptor_master_unbind, +> > +}; +> > + +> > +static const struct mtk_disp_ovlsys_adaptor +> > mt8196_ovlsys_adaptor_driver_data = { +> > +.max_size = 8191, +>  +> This is the first SoC has ovlsys, so it's not necessary to has driver +> data. +> After other SoC ovlsys is added, then consider to add driver data. +> So, +>  +> #define OVLSYS_MAX_SIZE 8191 +>  +> > +}; +> > + +> > +static int mtk_disp_ovlsys_adaptor_probe(struct platform_device +> > *pdev) +> > +{ +> > +struct mtk_disp_ovlsys_adaptor *priv; +> > +struct device *dev = &pdev->dev; +> > +struct component_match *match = NULL; +> > +struct mtk_drm_ovlsys_private *ovlsys_priv; +> > +int ret; +> > + +> > +priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); +> > +if (!priv) +> > +return -ENOMEM; +> > + +> > +platform_set_drvdata(pdev, priv); +> > + +> > +ovlsys_priv = pdev->dev.platform_data; +> > +priv->mmsys_dev = ovlsys_priv->mmsys_dev; +> > +priv->max_size = +> > mt8196_ovlsys_adaptor_driver_data.max_size; +> > + +> > +if (ovlsys_priv->use_path == 0) { +> > +priv->path = mt8196_mtk_ovl_main; +> > +priv->path_size = ARRAY_SIZE(mt8196_mtk_ovl_main); +> > +} else if (ovlsys_priv->use_path == 1) { +> > +priv->path = mt8196_mtk_ovl_ext; +> > +priv->path_size = ARRAY_SIZE(mt8196_mtk_ovl_ext); +> > +} else { +> > +priv->path = mt8196_mtk_ovl_third; +> > +priv->path_size = +> > ARRAY_SIZE(mt8196_mtk_ovl_third); +> > +} +> > + +> > +ret = ovlsys_adaptor_comp_init(dev, &match); +> > +if (ret < 0) +> > +return ret; +> > + +> > +component_master_add_with_match(dev, +> > &mtk_disp_ovlsys_adaptor_master_ops, match); +> > + +> > +pm_runtime_enable(dev); +> > + +> > +ret = component_add(dev, +> > &mtk_disp_ovlsys_adaptor_comp_ops); +> > +if (ret != 0) { +> > +pm_runtime_disable(dev); +> > +dev_err(dev, "Failed to add component: %d\n", +> > ret); +> > +} +> > + +> > +return ret; +> > +} +> > + +> > +static void mtk_disp_ovlsys_adaptor_remove(struct platform_device +> > *pdev) +> > +{ +> > +component_master_del(&pdev->dev, +> > &mtk_disp_ovlsys_adaptor_master_ops); +> > +pm_runtime_disable(&pdev->dev); +> > +} +> > + +> > +struct platform_driver mtk_disp_ovlsys_adaptor_driver = { +> > +.probe= mtk_disp_ovlsys_adaptor_probe, +> > +.remove= mtk_disp_ovlsys_adaptor_remove, +> > +.driver= { +> > +.name= "mediatek-disp-ovlsys-adaptor", +> > +.owner= THIS_MODULE, +> > +}, +> > +}; +> > + +> > +MODULE_AUTHOR("Nancy Lin <nancy.lin@mediatek.com>"); +> > +MODULE_DESCRIPTION("MediaTek Ovlsys Adaptor Driver"); +> > +MODULE_LICENSE("GPL"); +> > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c +> > b/drivers/gpu/drm/mediatek/mtk_drm_drv.c +> > index 27190057bd8e..7526bc38bcc7 100644 +> > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c +> > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c +> > @@ -448,6 +448,28 @@ static bool mtk_drm_find_mmsys_comp(struct +> > mtk_drm_private *private, int comp_id +> >  return false; +> >  } +> >   +> > +static int mtk_drm_mmsys_comp_in_path(struct mtk_drm_private +> > *private, int comp_id) +> > +{ +> > +const struct mtk_mmsys_driver_data *drv_data = private- +> > >data; +> > +int i; +> > + +> > +if (drv_data->main_path) +> > +for (i = 0; i < drv_data->main_len; i++) +> > +if (drv_data->main_path[i] == comp_id) +> > +return 0; +> > + +> > +if (drv_data->ext_path) +> > +for (i = 0; i < drv_data->ext_len; i++) +> > +if (drv_data->ext_path[i] == comp_id) +> > +return 1; +> > +if (drv_data->third_path) +> > +for (i = 0; i < drv_data->third_len; i++) +> > +if (drv_data->third_path[i] == comp_id) +> > +return 2; +> > + +> > +return -1; +> > +} +> > + +> >  static int mtk_drm_kms_init(struct drm_device *drm) +> >  { +> >  struct mtk_drm_private *private = drm->dev_private; +> > @@ -463,8 +485,8 @@ static int mtk_drm_kms_init(struct drm_device +> > *drm) +> >  if (ret) +> >  goto put_mutex_dev; +> >   +> > -drm->mode_config.min_width = 64; +> > -drm->mode_config.min_height = 64; +> > +drm->mode_config.min_width = 1; +> > +drm->mode_config.min_height = 1; +>  +> You change other SoC setting. +> If 8196 has different setting, query min width/height from ddp +> component and separate this to another patch. +>  + +Ok, I will separate this to another patch. +> >   +> >  /* +> >   * set max width and height as default value(4096x4096). +> > @@ -1107,6 +1129,40 @@ static int mtk_drm_probe(struct +> > platform_device *pdev) +> >  component_match_add(dev, &match, compare_dev, +> > &ovl_adaptor->dev); +> >  } +> >   +> > +if (mtk_drm_find_mmsys_comp(private, +> > DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0)) { +> > +struct mtk_drm_ovlsys_private ovlsys_priv; +> > + +> > +ovlsys_priv.mmsys_dev = private->mmsys_dev; +> > +ovlsys_priv.use_path = +> > +mtk_drm_mmsys_comp_in_path(private, +> > DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0); +> > +ovl_adaptor = +> > +platform_device_register_data(dev, +> > "mediatek-disp-ovlsys-adaptor", +> > +      +> > PLATFORM_DEVID_AUTO, +> > +      (void +> > *)&ovlsys_priv, +> > +      +> > sizeof(struct mtk_drm_ovlsys_private)); +> > +private- +> > >ddp_comp[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0].dev = &ovl_adaptor- +> > >dev; +> > +mtk_ddp_comp_init(NULL, &private- +> > >ddp_comp[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0], +> > +  +> > DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0); +> > +component_match_add(dev, &match, compare_dev, +> > &ovl_adaptor->dev); +> > +} +> > + +> > +if (mtk_drm_find_mmsys_comp(private, +> > DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1)) { +> > +struct mtk_drm_ovlsys_private ovlsys_priv; +> > + +> > +ovlsys_priv.mmsys_dev = private->mmsys_dev; +> > +ovlsys_priv.use_path = +> > +mtk_drm_mmsys_comp_in_path(private, +> > DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1); +> > +ovl_adaptor = +> > +platform_device_register_data(dev, +> > "mediatek-disp-ovlsys-adaptor", +> > +      +> > PLATFORM_DEVID_AUTO, +> > +      (void +> > *)&ovlsys_priv, +> > +      +> > sizeof(struct mtk_drm_ovlsys_private)); +> > +private- +> > >ddp_comp[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1].dev = &ovl_adaptor- +> > >dev; +> > +mtk_ddp_comp_init(NULL, &private- +> > >ddp_comp[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1], +> > +  +> > DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1); +> > +component_match_add(dev, &match, compare_dev, +> > &ovl_adaptor->dev); +> > +} +> > + +> >  /* Iterate over sibling DISP function blocks */ +> >  for_each_child_of_node(phandle->parent, node) { +> >  enum mtk_ddp_comp_type comp_type; +> > @@ -1268,6 +1324,7 @@ static struct platform_driver * const +> > mtk_drm_drivers[] = { +> >  &mtk_disp_outproc_driver, +> >  &mtk_disp_ovl_adaptor_driver, +> >  &mtk_disp_ovl_driver, +> > +&mtk_disp_ovlsys_adaptor_driver, +> >  &mtk_disp_rdma_driver, +> >  &mtk_dpi_driver, +> >  &mtk_drm_platform_driver, +> > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h +> > b/drivers/gpu/drm/mediatek/mtk_drm_drv.h +> > index c4717c37b0f1..aa17e743a1d0 100644 +> > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h +> > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h +> > @@ -11,7 +11,9 @@ +> >   +> >  #define MAX_CONNECTOR2 +> >  #define DDP_COMPONENT_DRM_OVL_ADAPTOR (DDP_COMPONENT_ID_MAX + 1) +> > -#define DDP_COMPONENT_DRM_ID_MAX (DDP_COMPONENT_DRM_OVL_ADAPTOR + +> > 1) +> > +#define DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0 +> > (DDP_COMPONENT_DRM_OVL_ADAPTOR + 1) +> > +#define DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1 +> > (DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0 + 1) +> > +#define DDP_COMPONENT_DRM_ID_MAX +> > (DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1 + 1) +> >   +> >  enum mtk_crtc_path { +> >  CRTC_MAIN, +> > @@ -69,6 +71,12 @@ struct mtk_drm_private { +> >  struct mtk_drm_private **all_drm_private; +> >  }; +> >   +> > +struct mtk_drm_ovlsys_private { +>  +> ovlsys has its own private data structure. +> mtk_ovlsys_platform_data is better. +>  +> Regards, +> CK +>  + +Ok, I will fix this problem. + + +Best, Paul +>  +> > +struct device *mmsys_dev; +> > +struct device *mutex_dev; +> > +unsigned int use_path; +> > +}; +> > + +> >  extern struct platform_driver mtk_disp_aal_driver; +> >  extern struct platform_driver mtk_disp_blender_driver; +> >  extern struct platform_driver mtk_disp_ccorr_driver; +> > @@ -79,6 +87,7 @@ extern struct platform_driver +> > mtk_disp_merge_driver; +> >  extern struct platform_driver mtk_disp_outproc_driver; +> >  extern struct platform_driver mtk_disp_ovl_adaptor_driver; +> >  extern struct platform_driver mtk_disp_ovl_driver; +> > +extern struct platform_driver mtk_disp_ovlsys_adaptor_driver; +> >  extern struct platform_driver mtk_disp_rdma_driver; +> >  extern struct platform_driver mtk_dpi_driver; +> >  extern struct platform_driver mtk_dsi_driver; +>  + + +</pre> +</p></body></html><!--type:text--><!--{--><pre>************* MEDIATEK Confidentiality Notice ******************** +The information contained in this e-mail message (including any +attachments) may be confidential, proprietary, privileged, or otherwise +exempt from disclosure under applicable laws. It is intended to be +conveyed only to the designated recipient(s). Any use, dissemination, +distribution, printing, retaining or copying of this e-mail (including its +attachments) by unintended recipient(s) is strictly prohibited and may +be unlawful. If you are not an intended recipient of this e-mail, or believe +that you have received this e-mail in error, please notify the sender +immediately (by replying to this e-mail), delete any and all copies of +this e-mail (including any attachments) from your system, and do not +disclose the content of this e-mail to any other person. Thank you! +</pre><!--}--> diff --git a/N1/2.hdr b/N1/2.hdr new file mode 100644 index 0000000..da1f671 --- /dev/null +++ b/N1/2.hdr @@ -0,0 +1,3 @@ +Content-Type: text/html; + charset="utf-8" +Content-Transfer-Encoding: base64 diff --git a/a/content_digest b/N1/content_digest index 36e355c..c7d8eb5 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -25,7 +25,7 @@ p.zabel@pengutronix.de <p.zabel@pengutronix.de> " Sirius Wang (\347\216\213\347\232\223\346\230\261) <Sirius.Wang@mediatek.com>" " linux-arm-kernel@lists.infradead.org <linux-arm-kernel@lists.infradead.org>\0" - "\00:1\0" + "\01:1\0" "b\0" "On Wed, 2025-02-12 at 07:09 +0000, CK Hu (\350\203\241\344\277\212\345\205\211) wrote:\n" "> Hi, Paul:\n" @@ -1261,5 +1261,1259 @@ "> > \302\240extern struct platform_driver mtk_dpi_driver;\n" "> > \302\240extern struct platform_driver mtk_dsi_driver;\n" > + "\01:2\0" + "b\0" + "<html><body><p>\r\n" + "<pre>\r\n" + "On Wed, 2025-02-12 at 07:09 +0000, CK Hu (胡俊光) wrote:\r\n" + "> Hi, Paul:\r\n" + "> \r\n" + "> On Fri, 2025-01-10 at 20:34 +0800, paul-pl.chen wrote:\r\n" + "> > From: "Nancy.Lin" <nancy.lin@mediatek.com>\r\n" + "> > \r\n" + "> > Ovlsys_adaptor is an encapsulated module designed to\r\n" + "> > simplify the DRM control flow. This module is composed\r\n" + "> > of 20 EXDMAs, 20 BLENDERs, and 12 OUTPROCs.\r\n" + "> > Two EXDMAs merge into one layer, allowing the module\r\n" + "> > to support 20 layers for 3 display paths.\r\n" + "> > Ovlsys_adaptor driver is integrated within the\r\n" + "> > mtk_ddp_comp framework.\r\n" + "> > \r\n" + "> > Signed-off-by: Nancy.Lin <nancy.lin@mediatek.com>\r\n" + "> > Signed-off-by: Paul-pl.Chen <paul-pl.chen@mediatek.com>\r\n" + "> > ---\r\n" + "> >  drivers/gpu/drm/mediatek/Makefile             |   1 +\r\n" + "> >  drivers/gpu/drm/mediatek/mtk_ddp_comp.c       |  25 +\r\n" + "> >  drivers/gpu/drm/mediatek/mtk_ddp_comp.h       |   1 +\r\n" + "> >  drivers/gpu/drm/mediatek/mtk_disp_drv.h       |  31 +-\r\n" + "> >  .../drm/mediatek/mtk_disp_ovlsys_adaptor.c    | 758\r\n" + "> > ++++++++++++++++++\r\n" + "> >  drivers/gpu/drm/mediatek/mtk_drm_drv.c        |  61 +-\r\n" + "> >  drivers/gpu/drm/mediatek/mtk_drm_drv.h        |  11 +-\r\n" + "> >  7 files changed, 884 insertions(+), 4 deletions(-)\r\n" + "> >  create mode 100644\r\n" + "> > drivers/gpu/drm/mediatek/mtk_disp_ovlsys_adaptor.c\r\n" + "> > \r\n" + "> > diff --git a/drivers/gpu/drm/mediatek/Makefile\r\n" + "> > b/drivers/gpu/drm/mediatek/Makefile\r\n" + "> > \r\n" + "//snip\r\n" + "> > +#include "mtk_disp_blender.h"\r\n" + "> > +#include "mtk_disp_drv.h"\r\n" + "> > +#include "mtk_crtc.h"\r\n" + "> \r\n" + "> Alphabetic order.\r\n" + "> \r\n" + "Ok, I will fix this part.\r\n" + "> > +#include "mtk_ddp_comp.h"\r\n" + "> > +#include "mtk_drm_drv.h"\r\n" + "> > +\r\n" + "> > +enum mtk_ovlsys_adaptor_comp_type {\r\n" + "> > +OVLSYS_ADAPTOR_TYPE_EXDMA = 0,\r\n" + "> > +OVLSYS_ADAPTOR_TYPE_BLENDER,\r\n" + "> > +OVLSYS_ADAPTOR_TYPE_OUTPROC,\r\n" + "> > +OVLSYS_ADAPTOR_TYPE_NUM,\r\n" + "> > +};\r\n" + "> > +\r\n" + "> > +enum mtk_ovlsys_adaptor_comp_id {\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA0,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA1,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA2,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA3,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA4,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA5,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA6,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA7,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA8,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA9,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA10,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA11,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA12,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA13,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA14,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA15,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA16,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA17,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA18,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA19,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER0,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER1,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER2,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER3,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER4,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER5,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER6,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER7,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER8,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER9,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER10,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER11,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER12,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER13,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER14,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER15,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER16,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER17,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER18,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER19,\r\n" + "> > +OVLSYS_ADAPTOR_OUTPROC0,\r\n" + "> > +OVLSYS_ADAPTOR_OUTPROC1,\r\n" + "> > +OVLSYS_ADAPTOR_OUTPROC2,\r\n" + "> > +OVLSYS_ADAPTOR_OUTPROC3,\r\n" + "> > +OVLSYS_ADAPTOR_OUTPROC4,\r\n" + "> > +OVLSYS_ADAPTOR_OUTPROC5,\r\n" + "> > +OVLSYS_ADAPTOR_OUTPROC6,\r\n" + "> > +OVLSYS_ADAPTOR_OUTPROC7,\r\n" + "> > +OVLSYS_ADAPTOR_OUTPROC8,\r\n" + "> > +OVLSYS_ADAPTOR_OUTPROC9,\r\n" + "> > +OVLSYS_ADAPTOR_OUTPROC10,\r\n" + "> > +OVLSYS_ADAPTOR_OUTPROC11,\r\n" + "> > +OVLSYS_ADAPTOR_ID_MAX\r\n" + "> > +};\r\n" + "> > +\r\n" + "> > +struct ovlsys_adaptor_comp_match {\r\n" + "> > +enum mtk_ovlsys_adaptor_comp_type type;\r\n" + "> > +int alias_id;\r\n" + "> > +enum mtk_ddp_comp_id comp_id;\r\n" + "> > +};\r\n" + "> > +\r\n" + "> > +struct mtk_disp_ovlsys_adaptor {\r\n" + "> > +struct device *ovl_adaptor_comp[OVLSYS_ADAPTOR_ID_MAX];\r\n" + "> > +struct device *mmsys_dev;\r\n" + "> > +const unsigned int *path;\r\n" + "> > +unsigned int path_size;\r\n" + "> > +unsigned int layer_nr;\r\n" + "> > +bool children_bound;\r\n" + "> > +unsigned int max_size;\r\n" + "> > +};\r\n" + "> > +\r\n" + "> > +static const char * const\r\n" + "> > private_comp_stem[OVLSYS_ADAPTOR_TYPE_NUM] = {\r\n" + "> > +[OVLSYS_ADAPTOR_TYPE_EXDMA]= "exdma",\r\n" + "> > +[OVLSYS_ADAPTOR_TYPE_BLENDER]= "blender",\r\n" + "> > +[OVLSYS_ADAPTOR_TYPE_OUTPROC]= "outproc",\r\n" + "> > +};\r\n" + "> > +\r\n" + "> > +static const struct ovlsys_adaptor_comp_match\r\n" + "> > comp_matches[OVLSYS_ADAPTOR_ID_MAX] = {\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA0]   = { OVLSYS_ADAPTOR_TYPE_EXDMA,\r\n" + "> > 0, DDP_COMPONENT_ID_MAX},\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA1]  = {\r\n" + "> > OVLSYS_ADAPTOR_TYPE_EXDMA, 1, DDP_COMPONENT_ID_MAX},\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA2]  = {\r\n" + "> > OVLSYS_ADAPTOR_TYPE_EXDMA, 2, DDP_COMPONENT_OVL0_EXDMA2},\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA3]  = {\r\n" + "> > OVLSYS_ADAPTOR_TYPE_EXDMA, 3, DDP_COMPONENT_OVL0_EXDMA3},\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA4]  = {\r\n" + "> > OVLSYS_ADAPTOR_TYPE_EXDMA, 4, DDP_COMPONENT_OVL0_EXDMA4},\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA5]  = {\r\n" + "> > OVLSYS_ADAPTOR_TYPE_EXDMA, 5, DDP_COMPONENT_OVL0_EXDMA5},\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA6]  = {\r\n" + "> > OVLSYS_ADAPTOR_TYPE_EXDMA, 6, DDP_COMPONENT_OVL0_EXDMA6},\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA7]  = {\r\n" + "> > OVLSYS_ADAPTOR_TYPE_EXDMA, 7, DDP_COMPONENT_OVL0_EXDMA7},\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA8]  = {\r\n" + "> > OVLSYS_ADAPTOR_TYPE_EXDMA, 8, DDP_COMPONENT_OVL0_EXDMA8},\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA9]  = {\r\n" + "> > OVLSYS_ADAPTOR_TYPE_EXDMA, 9, DDP_COMPONENT_OVL0_EXDMA9},\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA10]   = { OVLSYS_ADAPTOR_TYPE_EXDMA,\r\n" + "> > 10, DDP_COMPONENT_ID_MAX},\r\n" + "> \r\n" + "> EXDMA10 has no component id, so just drop OVLSYS_ADAPTOR_EXDMA10.\r\n" + "> \r\n" + "OK I will check this part.\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA11]   = { OVLSYS_ADAPTOR_TYPE_EXDMA,\r\n" + "> > 11, DDP_COMPONENT_ID_MAX},\r\n" + "> \r\n" + "> Ditto.\r\n" + "> \r\n" + "OK I will check this part, too.\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA12]   = { OVLSYS_ADAPTOR_TYPE_EXDMA,\r\n" + "> > 12, DDP_COMPONENT_OVL1_EXDMA2},\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA13]   = { OVLSYS_ADAPTOR_TYPE_EXDMA,\r\n" + "> > 13, DDP_COMPONENT_OVL1_EXDMA3},\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA14]   = { OVLSYS_ADAPTOR_TYPE_EXDMA,\r\n" + "> > 14, DDP_COMPONENT_OVL1_EXDMA4},\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA15]   = { OVLSYS_ADAPTOR_TYPE_EXDMA,\r\n" + "> > 15, DDP_COMPONENT_OVL1_EXDMA5},\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA16]   = { OVLSYS_ADAPTOR_TYPE_EXDMA,\r\n" + "> > 16, DDP_COMPONENT_OVL1_EXDMA6},\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA17]   = { OVLSYS_ADAPTOR_TYPE_EXDMA,\r\n" + "> > 17, DDP_COMPONENT_OVL1_EXDMA7},\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA18]   = { OVLSYS_ADAPTOR_TYPE_EXDMA,\r\n" + "> > 18, DDP_COMPONENT_OVL1_EXDMA8},\r\n" + "> > +[OVLSYS_ADAPTOR_EXDMA19]   = { OVLSYS_ADAPTOR_TYPE_EXDMA,\r\n" + "> > 19, DDP_COMPONENT_OVL1_EXDMA9},\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER0] = { OVLSYS_ADAPTOR_TYPE_BLENDER,\r\n" + "> > 0, DDP_COMPONENT_ID_MAX},\r\n" + "> \r\n" + "> Ditto.\r\n" + "> \r\n" + "OK I will check this part, too.\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER1] = { OVLSYS_ADAPTOR_TYPE_BLENDER,\r\n" + "> > 1, DDP_COMPONENT_OVL0_BLENDER1},\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER2] = { OVLSYS_ADAPTOR_TYPE_BLENDER,\r\n" + "> > 2, DDP_COMPONENT_OVL0_BLENDER2},\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER3] = { OVLSYS_ADAPTOR_TYPE_BLENDER,\r\n" + "> > 3, DDP_COMPONENT_OVL0_BLENDER3},\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER4] = { OVLSYS_ADAPTOR_TYPE_BLENDER,\r\n" + "> > 4, DDP_COMPONENT_OVL0_BLENDER4},\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER5] = { OVLSYS_ADAPTOR_TYPE_BLENDER,\r\n" + "> > 5, DDP_COMPONENT_OVL0_BLENDER5},\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER6] = { OVLSYS_ADAPTOR_TYPE_BLENDER,\r\n" + "> > 6, DDP_COMPONENT_OVL0_BLENDER6},\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER7] = { OVLSYS_ADAPTOR_TYPE_BLENDER,\r\n" + "> > 7, DDP_COMPONENT_OVL0_BLENDER7},\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER8] = { OVLSYS_ADAPTOR_TYPE_BLENDER,\r\n" + "> > 8, DDP_COMPONENT_OVL0_BLENDER8},\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER9] = { OVLSYS_ADAPTOR_TYPE_BLENDER,\r\n" + "> > 9, DDP_COMPONENT_OVL0_BLENDER9},\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER10] = {\r\n" + "> > OVLSYS_ADAPTOR_TYPE_BLENDER, 10, DDP_COMPONENT_ID_MAX},\r\n" + "> \r\n" + "> Ditto.\r\n" + "> \r\n" + "\r\n" + "OK I will check this part, too.\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER11] = {\r\n" + "> > +OVLSYS_ADAPTOR_TYPE_BLENDER, 11,\r\n" + "> > DDP_COMPONENT_OVL1_BLENDER1},\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER12] = {\r\n" + "> > +OVLSYS_ADAPTOR_TYPE_BLENDER, 12,\r\n" + "> > DDP_COMPONENT_OVL1_BLENDER2},\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER13] = {\r\n" + "> > +OVLSYS_ADAPTOR_TYPE_BLENDER, 13,\r\n" + "> > DDP_COMPONENT_OVL1_BLENDER3},\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER14] = {\r\n" + "> > +OVLSYS_ADAPTOR_TYPE_BLENDER, 14,\r\n" + "> > DDP_COMPONENT_OVL1_BLENDER4},\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER15] = {\r\n" + "> > +OVLSYS_ADAPTOR_TYPE_BLENDER, 15,\r\n" + "> > DDP_COMPONENT_OVL1_BLENDER5},\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER16] = {\r\n" + "> > +OVLSYS_ADAPTOR_TYPE_BLENDER, 16,\r\n" + "> > DDP_COMPONENT_OVL1_BLENDER6},\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER17] = {\r\n" + "> > +OVLSYS_ADAPTOR_TYPE_BLENDER, 17,\r\n" + "> > DDP_COMPONENT_OVL1_BLENDER7},\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER18] = {\r\n" + "> > +OVLSYS_ADAPTOR_TYPE_BLENDER, 18,\r\n" + "> > DDP_COMPONENT_OVL1_BLENDER8},\r\n" + "> > +[OVLSYS_ADAPTOR_BLENDER19] = {\r\n" + "> > +OVLSYS_ADAPTOR_TYPE_BLENDER, 19,\r\n" + "> > DDP_COMPONENT_OVL1_BLENDER9},\r\n" + "> > +[OVLSYS_ADAPTOR_OUTPROC0] = { OVLSYS_ADAPTOR_TYPE_OUTPROC,\r\n" + "> > 0, DDP_COMPONENT_OVL0_OUTPROC0},\r\n" + "> > +[OVLSYS_ADAPTOR_OUTPROC1] = { OVLSYS_ADAPTOR_TYPE_OUTPROC,\r\n" + "> > 1, DDP_COMPONENT_OVL0_OUTPROC1},\r\n" + "> > +[OVLSYS_ADAPTOR_OUTPROC2] = { OVLSYS_ADAPTOR_TYPE_OUTPROC,\r\n" + "> > 2, DDP_COMPONENT_ID_MAX},\r\n" + "> > +[OVLSYS_ADAPTOR_OUTPROC3] = { OVLSYS_ADAPTOR_TYPE_OUTPROC,\r\n" + "> > 3, DDP_COMPONENT_ID_MAX},\r\n" + "> > +[OVLSYS_ADAPTOR_OUTPROC4] = { OVLSYS_ADAPTOR_TYPE_OUTPROC,\r\n" + "> > 4, DDP_COMPONENT_ID_MAX},\r\n" + "> > +[OVLSYS_ADAPTOR_OUTPROC5] = { OVLSYS_ADAPTOR_TYPE_OUTPROC,\r\n" + "> > 5, DDP_COMPONENT_ID_MAX},\r\n" + "> \r\n" + "> Ditto.\r\n" + "> \r\n" + "\r\n" + "OK I will check this part, too.\r\n" + "> > +[OVLSYS_ADAPTOR_OUTPROC6] = { OVLSYS_ADAPTOR_TYPE_OUTPROC,\r\n" + "> > 6, DDP_COMPONENT_OVL1_OUTPROC0},\r\n" + "> > +[OVLSYS_ADAPTOR_OUTPROC7] = { OVLSYS_ADAPTOR_TYPE_OUTPROC,\r\n" + "> > 7, DDP_COMPONENT_ID_MAX},\r\n" + "> > +[OVLSYS_ADAPTOR_OUTPROC8] = { OVLSYS_ADAPTOR_TYPE_OUTPROC,\r\n" + "> > 8, DDP_COMPONENT_ID_MAX},\r\n" + "> > +[OVLSYS_ADAPTOR_OUTPROC9] = { OVLSYS_ADAPTOR_TYPE_OUTPROC,\r\n" + "> > 9, DDP_COMPONENT_ID_MAX},\r\n" + "> > +[OVLSYS_ADAPTOR_OUTPROC10] = {\r\n" + "> > OVLSYS_ADAPTOR_TYPE_OUTPROC, 10, DDP_COMPONENT_ID_MAX},\r\n" + "> > +[OVLSYS_ADAPTOR_OUTPROC11] = {\r\n" + "> > OVLSYS_ADAPTOR_TYPE_OUTPROC, 11, DDP_COMPONENT_ID_MAX},\r\n" + "> \r\n" + "> Ditto.\r\n" + "> \r\n" + "\r\n" + "OK I will check this part, too.\r\n" + "> > +};\r\n" + "> > +\r\n" + "> > +static const unsigned int mt8196_mtk_ovl_main[] = {\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA2,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER1,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA3,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER2,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA4,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER3,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA5,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER4,\r\n" + "> > +OVLSYS_ADAPTOR_OUTPROC0,\r\n" + "> > +};\r\n" + "> > +\r\n" + "> > +static const unsigned int mt8196_mtk_ovl_ext[] = {\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA6,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER5,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA7,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER6,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA8,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER7,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA9,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER8,\r\n" + "> > +OVLSYS_ADAPTOR_OUTPROC1,\r\n" + "> > +};\r\n" + "> > +\r\n" + "> > +static const unsigned int mt8196_mtk_ovl_third[] = {\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA12,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER11,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA13,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER12,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA14,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER13,\r\n" + "> > +OVLSYS_ADAPTOR_EXDMA15,\r\n" + "> > +OVLSYS_ADAPTOR_BLENDER14,\r\n" + "> > +OVLSYS_ADAPTOR_OUTPROC6,\r\n" + "> > +};\r\n" + "> > +\r\n" + "> > +static enum mtk_ovlsys_adaptor_comp_type get_type(enum\r\n" + "> > mtk_ovlsys_adaptor_comp_id id)\r\n" + "> > +{\r\n" + "> > +return comp_matches[id].type;\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +static enum mtk_ddp_comp_id get_ddp_comp_id(enum\r\n" + "> > mtk_ovlsys_adaptor_comp_id id)\r\n" + "> > +{\r\n" + "> > +return comp_matches[id].comp_id;\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +static struct device *get_comp_by_type_idx(struct device *dev,\r\n" + "> > +   enum\r\n" + "> > mtk_ovlsys_adaptor_comp_type type,\r\n" + "> > +   unsigned int idx)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +int i;\r\n" + "> > +int count = 0;\r\n" + "> > +\r\n" + "> > +for (i = 0; i < priv->path_size; i++) {\r\n" + "> > +if (get_type(priv->path[i]) == type) {\r\n" + "> > +if (count == idx)\r\n" + "> > +return priv-\r\n" + "> > >ovl_adaptor_comp[priv->path[i]];\r\n" + "> > +count++;\r\n" + "> > +}\r\n" + "> > +}\r\n" + "> > +return NULL;\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +void mtk_ovlsys_adaptor_layer_config(struct device *dev, unsigned\r\n" + "> > int idx,\r\n" + "> > +     struct mtk_plane_state\r\n" + "> > *state,\r\n" + "> > +     struct cmdq_pkt *cmdq_pkt)\r\n" + "> > +{\r\n" + "> > +struct mtk_plane_pending_state *pending = &state->pending;\r\n" + "> > +struct device *exdma;\r\n" + "> > +struct device *blender;\r\n" + "> > +unsigned int align_width = 0;\r\n" + "> > +const struct drm_format_info *fmt_info =\r\n" + "> > drm_format_info(pending->format);\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +\r\n" + "> > +dev_dbg(dev, "%s+ idx:%d, enable:%d, fmt:0x%x\n",\r\n" + "> > __func__, idx,\r\n" + "> > +pending->enable, pending->format);\r\n" + "> > +dev_dbg(dev, "addr 0x%pad, fb w:%d, {%d,%d,%d,%d}\n",\r\n" + "> > +&pending->addr, (pending->pitch / fmt_info-\r\n" + "> > >cpp[0]),\r\n" + "> > +pending->x, pending->y, pending->width, pending-\r\n" + "> > >height);\r\n" + "> > +\r\n" + "> > +exdma = get_comp_by_type_idx(dev,\r\n" + "> > OVLSYS_ADAPTOR_TYPE_EXDMA, idx);\r\n" + "> > +blender = get_comp_by_type_idx(dev,\r\n" + "> > OVLSYS_ADAPTOR_TYPE_BLENDER, idx);\r\n" + "> > +\r\n" + "> > +/* OVLSYS is in 1T2P domain, width needs to be 2 pixels\r\n" + "> > align */\r\n" + "> > +align_width = ALIGN_DOWN(pending->width, 2);\r\n" + "> \r\n" + "> align_width is useless, so drop it.\r\n" + "> \r\n" + "> > +\r\n" + "> > +if (!pending->enable || pending->height == 0 ||\r\n" + "> > align_width == 0 ||\r\n" + "> > +    pending->x > priv->max_size || pending->y > priv-\r\n" + "> > >max_size) {\r\n" + "> > +pending->enable = false;\r\n" + "> > +mtk_disp_exdma_stop(exdma, cmdq_pkt);\r\n" + "> > +mtk_disp_blender_layer_config(blender, state,\r\n" + "> > cmdq_pkt);\r\n" + "> > +return;\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +mtk_disp_exdma_config(exdma, state, cmdq_pkt);\r\n" + "> \r\n" + "> mtk_disp_exdma_config() does something like mtk_ovl_layer_config(),\r\n" + "> so I would like to rename it to mtk_disp_exdma_layer_config().\r\n" + "> \r\n" + "Sure, I will rename the function name.\r\n" + "> > +\r\n" + "> > +mtk_disp_blender_layer_config(blender, state, cmdq_pkt);\r\n" + "> > +\r\n" + "> > +mtk_disp_exdma_start(exdma, cmdq_pkt);\r\n" + "> \r\n" + "> Why call start in layer config?\r\n" + "> start should be called in start.\r\n" + "> \r\n" + "\r\n" + "Sure, I will fix the order of setting.\r\n" + "> > +mtk_disp_blender_start(blender, cmdq_pkt);\r\n" + "> \r\n" + "> Ditto.\r\n" + "\r\n" + "OK I will check this part, too.\r\n" + "> \r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +void mtk_ovlsys_adaptor_config(struct device *dev, unsigned int w,\r\n" + "> > +       unsigned int h, unsigned int\r\n" + "> > vrefresh,\r\n" + "> > +       unsigned int bpc, struct cmdq_pkt\r\n" + "> > *cmdq_pkt)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +int i;\r\n" + "> > +int blender_idx = 0;\r\n" + "> > +\r\n" + "> > +for (i = 0; i < priv->path_size; i++) {\r\n" + "> > +enum mtk_disp_blender_layer blender;\r\n" + "> > +\r\n" + "> > +if (get_type(priv->path[i]) ==\r\n" + "> > OVLSYS_ADAPTOR_TYPE_BLENDER) {\r\n" + "> > +blender_idx++;\r\n" + "> > +if (priv->layer_nr == 1)\r\n" + "> > +blender = SINGLE_BLENDER;\r\n" + "> > +else if (blender_idx == 1)\r\n" + "> > +blender = FIRST_BLENDER;\r\n" + "> > +else if (blender_idx == priv->layer_nr)\r\n" + "> > +blender = LAST_BLENDER;\r\n" + "> > +else\r\n" + "> > +blender = OTHERS;\r\n" + "> > +\r\n" + "> > +mtk_disp_blender_config(priv-\r\n" + "> > >ovl_adaptor_comp[priv->path[i]], w, h,\r\n" + "> > +vrefresh, bpc,\r\n" + "> > blender, cmdq_pkt);\r\n" + "> \r\n" + "> mtk_disp_blender_config(priv->ovl_adaptor_comp[priv->path[i]], w, h,\r\n" + "> vrefresh, bpc, blender_idx == 1, blender_idx\r\n" + "> == priv->layer_nr, cmdq_pkt);\r\n" + "> \r\n" + "> > +} else if (get_type(priv->path[i]) ==\r\n" + "> > OVLSYS_ADAPTOR_TYPE_OUTPROC) {\r\n" + "> > +mtk_disp_outproc_config(priv-\r\n" + "> > >ovl_adaptor_comp[priv->path[i]], w, h,\r\n" + "> > +vrefresh, bpc,\r\n" + "> > cmdq_pkt);\r\n" + "> > +}\r\n" + "> > +}\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +int mtk_ovlsys_adaptor_layer_check(struct device *dev,\r\n" + "> > +   unsigned int idx,\r\n" + "> > +   struct mtk_plane_state\r\n" + "> > *mtk_state)\r\n" + "> > +{\r\n" + "> > +struct drm_plane_state *state = &mtk_state->base;\r\n" + "> > +\r\n" + "> > +/* Check if any unsupported rotation is set */\r\n" + "> > +if (state->rotation & ~DRM_MODE_ROTATE_0)\r\n" + "> > +return -EINVAL;\r\n" + "> > +\r\n" + "> > +return 0;\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +void mtk_ovlsys_adaptor_start(struct device *dev)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +int i;\r\n" + "> > +\r\n" + "> > +for (i = 0; i < priv->path_size; i++) {\r\n" + "> > +if (get_type(priv->path[i]) ==\r\n" + "> > OVLSYS_ADAPTOR_TYPE_EXDMA)\r\n" + "> > +mtk_disp_exdma_start(priv-\r\n" + "> > >ovl_adaptor_comp[priv->path[i]], NULL);\r\n" + "> \r\n" + "> The start never use cmdq, so remove the cmdq parameter.\r\n" + "\r\n" + "Ok, I will fix this part.\r\n" + "> \r\n" + "> > +else if (get_type(priv->path[i]) ==\r\n" + "> > OVLSYS_ADAPTOR_TYPE_BLENDER)\r\n" + "> > +mtk_disp_blender_start(priv-\r\n" + "> > >ovl_adaptor_comp[priv->path[i]], NULL);\r\n" + "> \r\n" + "> Ditto.\r\n" + "> \r\n" + "Ok, I will fix this part.> > +else\r\n" + "> > +mtk_disp_outproc_start(priv-\r\n" + "> > >ovl_adaptor_comp[priv->path[i]]);\r\n" + "> > +}\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +void mtk_ovlsys_adaptor_stop(struct device *dev)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +int i;\r\n" + "> > +\r\n" + "> > +for (i = 0; i < priv->path_size; i++) {\r\n" + "> > +if (get_type(priv->path[i]) ==\r\n" + "> > OVLSYS_ADAPTOR_TYPE_EXDMA)\r\n" + "> > +mtk_disp_exdma_stop(priv-\r\n" + "> > >ovl_adaptor_comp[priv->path[i]], NULL);\r\n" + "> \r\n" + "> Ditto.\r\n" + "\r\n" + "Ok, I will fix this part.th.\r\n" + "> \r\n" + "> > +else if (get_type(priv->path[i]) ==\r\n" + "> > OVLSYS_ADAPTOR_TYPE_BLENDER)\r\n" + "> > +mtk_disp_blender_stop(priv-\r\n" + "> > >ovl_adaptor_comp[priv->path[i]], NULL);\r\n" + "> \r\n" + "> Ditto.\r\n" + "\r\n" + "Ok, I will fix this part.\r\n" + "> \r\n" + "> > +else\r\n" + "> > +mtk_disp_outproc_stop(priv-\r\n" + "> > >ovl_adaptor_comp[priv->path[i]]);\r\n" + "> > +}\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +int mtk_ovlsys_adaptor_clk_enable(struct device *dev)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +struct device *comp;\r\n" + "> > +int ret;\r\n" + "> > +int i;\r\n" + "> > +\r\n" + "> > +for (i = 0; i < OVLSYS_ADAPTOR_ID_MAX; i++) {\r\n" + "> > +comp = priv->ovl_adaptor_comp[i];\r\n" + "> > +\r\n" + "> > +if (!comp)\r\n" + "> > +continue;\r\n" + "> > +\r\n" + "> > +if (get_type(i) != OVLSYS_ADAPTOR_TYPE_EXDMA)\r\n" + "> > +continue;\r\n" + "> > +\r\n" + "> > +ret = pm_runtime_get_sync(comp);\r\n" + "> \r\n" + "> Refer to mtk_ovl_adaptor_power_on().\r\n" + "> This should be done in power_on() callback function.\r\n" + "\r\n" + "Sure, I will align the power sequence with the function\r\n" + "mtk_ovl_adaptor_power_on().\r\n" + "> \r\n" + "> > +if (ret < 0) {\r\n" + "> > +dev_err(dev, "Failed to enable power\r\n" + "> > domain %d, err %d\n", i, ret);\r\n" + "> > +goto pwr_err;\r\n" + "> > +}\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +for (i = 0; i < OVLSYS_ADAPTOR_ID_MAX; i++) {\r\n" + "> > +comp = priv->ovl_adaptor_comp[i];\r\n" + "> > +\r\n" + "> > +if (!comp)\r\n" + "> > +continue;\r\n" + "> > +\r\n" + "> > +if (get_type(i) == OVLSYS_ADAPTOR_TYPE_EXDMA)\r\n" + "> > +ret = mtk_disp_exdma_clk_enable(comp);\r\n" + "> > +else if (get_type(i) ==\r\n" + "> > OVLSYS_ADAPTOR_TYPE_BLENDER)\r\n" + "> > +ret = mtk_disp_blender_clk_enable(comp);\r\n" + "> > +else\r\n" + "> > +ret = mtk_disp_outproc_clk_enable(comp);\r\n" + "> > +\r\n" + "> > +if (ret) {\r\n" + "> > +dev_err(dev, "Failed to enable clock %d,\r\n" + "> > err %d\n", i, ret);\r\n" + "> > +goto clk_err;\r\n" + "> > +}\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +return ret;\r\n" + "> > +\r\n" + "> > +clk_err:\r\n" + "> > +while (--i >= 0) {\r\n" + "> > +comp = priv->ovl_adaptor_comp[i];\r\n" + "> > +if (!comp)\r\n" + "> > +continue;\r\n" + "> > +if (get_type(i) == OVLSYS_ADAPTOR_TYPE_EXDMA)\r\n" + "> > +mtk_disp_exdma_clk_disable(comp);\r\n" + "> > +else if (get_type(i) ==\r\n" + "> > OVLSYS_ADAPTOR_TYPE_BLENDER)\r\n" + "> > +mtk_disp_blender_clk_disable(comp);\r\n" + "> > +else\r\n" + "> > +mtk_disp_outproc_clk_disable(comp);\r\n" + "> > +}\r\n" + "> > +i = OVLSYS_ADAPTOR_BLENDER0;\r\n" + "> > +\r\n" + "> > +pwr_err:\r\n" + "> > +while (--i >= 0) {\r\n" + "> > +comp = priv->ovl_adaptor_comp[i];\r\n" + "> > +if (!comp)\r\n" + "> > +continue;\r\n" + "> > +pm_runtime_put(priv->ovl_adaptor_comp[i]);\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +return ret;\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +void mtk_ovlsys_adaptor_clk_disable(struct device *dev)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +struct device *comp;\r\n" + "> > +int i;\r\n" + "> > +\r\n" + "> > +for (i = 0; i < OVLSYS_ADAPTOR_ID_MAX; i++) {\r\n" + "> > +comp = priv->ovl_adaptor_comp[i];\r\n" + "> > +\r\n" + "> > +if (!comp)\r\n" + "> > +continue;\r\n" + "> > +\r\n" + "> > +if (get_type(i) == OVLSYS_ADAPTOR_TYPE_EXDMA) {\r\n" + "> > +mtk_disp_exdma_clk_disable(comp);\r\n" + "> > +pm_runtime_put(comp);\r\n" + "> > +} else if (get_type(i) ==\r\n" + "> > OVLSYS_ADAPTOR_TYPE_BLENDER) {\r\n" + "> > +mtk_disp_blender_clk_disable(comp);\r\n" + "> > +} else {\r\n" + "> > +mtk_disp_outproc_clk_disable(comp);\r\n" + "> > +}\r\n" + "> > +}\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +unsigned int mtk_ovlsys_adaptor_layer_nr(struct device *dev)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +\r\n" + "> > +return priv->layer_nr;\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +struct device *mtk_ovlsys_adaptor_dma_dev_get(struct device *dev)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +\r\n" + "> > +return priv->ovl_adaptor_comp[priv->path[0]];\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +void mtk_ovlsys_adaptor_register_vblank_cb(struct device *dev,\r\n" + "> > void (*vblank_cb)(void *),\r\n" + "> > +   void *vblank_cb_data)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +\r\n" + "> > +mtk_disp_outproc_register_vblank_cb(priv-\r\n" + "> > >ovl_adaptor_comp[priv->path[priv->path_size - 1]],\r\n" + "> > +    vblank_cb,\r\n" + "> > vblank_cb_data);\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +void mtk_ovlsys_adaptor_unregister_vblank_cb(struct device *dev)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +struct device *comp = priv->ovl_adaptor_comp[priv-\r\n" + "> > >path[priv->path_size - 1]];\r\n" + "> > +\r\n" + "> > +if (!priv->children_bound)\r\n" + "> \r\n" + "> In ovl adaptor, it does not check this. So remove this checking.\r\n" + "\r\n" + "This is because of the mt8916's new hardwarew design.\r\n" + "\r\n" + "ovlsys adaptor have to find the possible path.\r\n" + "> \r\n" + "> > +return;\r\n" + "> > +\r\n" + "> > +mtk_disp_outproc_unregister_vblank_cb(comp);\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +void mtk_ovlsys_adaptor_enable_vblank(struct device *dev)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +\r\n" + "> > +mtk_disp_outproc_enable_vblank(priv-\r\n" + "> > >ovl_adaptor_comp[priv->path[priv->path_size - 1]]);\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +void mtk_ovlsys_adaptor_disable_vblank(struct device *dev)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +\r\n" + "> > +mtk_disp_outproc_disable_vblank(priv-\r\n" + "> > >ovl_adaptor_comp[priv->path[priv->path_size - 1]]);\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +const u32 *mtk_ovlsys_adaptor_get_formats(struct device *dev)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +\r\n" + "> > +return mtk_disp_exdma_get_formats(priv-\r\n" + "> > >ovl_adaptor_comp[priv->path[0]]);\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +size_t mtk_ovlsys_adaptor_get_num_formats(struct device *dev)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +\r\n" + "> > +return mtk_disp_exdma_get_num_formats(priv-\r\n" + "> > >ovl_adaptor_comp[priv->path[0]]);\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +void mtk_ovlsys_adaptor_add_comp(struct device *dev, struct\r\n" + "> > mtk_mutex *mutex)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +int i;\r\n" + "> > +\r\n" + "> > +for (i = 0; i < priv->path_size; i++)\r\n" + "> > +mtk_mutex_add_comp(mutex, get_ddp_comp_id(priv-\r\n" + "> > >path[i]));\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +void mtk_ovlsys_adaptor_remove_comp(struct device *dev, struct\r\n" + "> > mtk_mutex *mutex)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +int i;\r\n" + "> > +\r\n" + "> > +for (i = 0; i < priv->path_size; i++)\r\n" + "> > +mtk_mutex_remove_comp(mutex, get_ddp_comp_id(priv-\r\n" + "> > >path[i]));\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +void mtk_ovlsys_adaptor_connect(struct device *dev, struct device\r\n" + "> > *mmsys_dev, unsigned int next)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +int i;\r\n" + "> > +\r\n" + "> > +for (i = 0; i < priv->path_size - 1; i++)\r\n" + "> > +mtk_mmsys_ddp_connect(mmsys_dev,\r\n" + "> > get_ddp_comp_id(priv->path[i]),\r\n" + "> > +      get_ddp_comp_id(priv->path[i\r\n" + "> > + 1]));\r\n" + "> > +\r\n" + "> > +mtk_mmsys_ddp_connect(mmsys_dev, get_ddp_comp_id(priv-\r\n" + "> > >path[i]), next);\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +void mtk_ovlsys_adaptor_disconnect(struct device *dev, struct\r\n" + "> > device *mmsys_dev, unsigned int next)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +int i;\r\n" + "> > +\r\n" + "> > +for (i = 0; i < priv->path_size - 1; i++)\r\n" + "> > +mtk_mmsys_ddp_disconnect(mmsys_dev,\r\n" + "> > get_ddp_comp_id(priv->path[i]),\r\n" + "> > + get_ddp_comp_id(priv-\r\n" + "> > >path[i + 1]));\r\n" + "> > +\r\n" + "> > +mtk_mmsys_ddp_disconnect(mmsys_dev, get_ddp_comp_id(priv-\r\n" + "> > >path[i]), next);\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +static int ovlsys_adaptor_comp_get_id(struct device *dev, struct\r\n" + "> > device_node *node,\r\n" + "> > +      enum\r\n" + "> > mtk_ovlsys_adaptor_comp_type type,\r\n" + "> > +      enum mtk_ddp_comp_id\r\n" + "> > *comp_id)\r\n" + "> > +{\r\n" + "> > +int alias_id = of_alias_get_id(node,\r\n" + "> > private_comp_stem[type]);\r\n" + "> > +int i;\r\n" + "> > +\r\n" + "> > +for (i = 0; i < ARRAY_SIZE(comp_matches); i++)\r\n" + "> > +if (comp_matches[i].type == type &&\r\n" + "> > +    comp_matches[i].alias_id == alias_id) {\r\n" + "> > +*comp_id = comp_matches[i].comp_id;\r\n" + "> > +return i;\r\n" + "> > +}\r\n" + "> > +dev_warn(dev, "Failed to get id. type: %d, alias: %d\n",\r\n" + "> > type, alias_id);\r\n" + "> > +return -EINVAL;\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +static const struct of_device_id mtk_ovlsys_adaptor_comp_dt_ids[]\r\n" + "> > = {\r\n" + "> > +{\r\n" + "> > +.compatible = "mediatek,mt8196-exdma",\r\n" + "> > +.data = (void *)OVLSYS_ADAPTOR_TYPE_EXDMA,\r\n" + "> > +}, {\r\n" + "> > +.compatible = "mediatek,mt8196-blender",\r\n" + "> > +.data = (void *)OVLSYS_ADAPTOR_TYPE_BLENDER,\r\n" + "> > +}, {\r\n" + "> > +.compatible = "mediatek,mt8196-outproc",\r\n" + "> > +.data = (void *)OVLSYS_ADAPTOR_TYPE_OUTPROC,\r\n" + "> > +},\r\n" + "> > +{},\r\n" + "> > +};\r\n" + "> > +\r\n" + "> > +static int ovlsys_adaptor_comp_init(struct device *dev, struct\r\n" + "> > component_match **match)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +struct device_node *node, *parent;\r\n" + "> > +struct platform_device *comp_pdev;\r\n" + "> > +int i;\r\n" + "> > +\r\n" + "> > +parent = dev->parent->parent->of_node->parent;\r\n" + "> > +\r\n" + "> > +for_each_child_of_node(parent, node) {\r\n" + "> > +const struct of_device_id *of_id;\r\n" + "> > +enum mtk_ovlsys_adaptor_comp_type type;\r\n" + "> > +enum mtk_ddp_comp_id comp_id;\r\n" + "> > +int id;\r\n" + "> > +bool found = false;\r\n" + "> > +\r\n" + "> > +of_id =\r\n" + "> > of_match_node(mtk_ovlsys_adaptor_comp_dt_ids, node);\r\n" + "> > +if (!of_id)\r\n" + "> > +continue;\r\n" + "> > +\r\n" + "> > +if (!of_device_is_available(node)) {\r\n" + "> > +dev_dbg(dev, "Skipping disabled component\r\n" + "> > %pOF\n",\r\n" + "> > +node);\r\n" + "> > +continue;\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +type = (enum\r\n" + "> > mtk_ovlsys_adaptor_comp_type)(uintptr_t)of_id->data;\r\n" + "> > +id = ovlsys_adaptor_comp_get_id(dev, node, type,\r\n" + "> > &comp_id);\r\n" + "> > +if (id < 0) {\r\n" + "> > +dev_warn(dev, "Skipping unknown component\r\n" + "> > %pOF\n",\r\n" + "> > + node);\r\n" + "> > +continue;\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +for (i = 0; i < priv->path_size; i++)\r\n" + "> > +if (priv->path[i] == id)\r\n" + "> > +found = true;\r\n" + "> > +\r\n" + "> > +if (!found)\r\n" + "> > +continue;\r\n" + "> \r\n" + "> ovl adaptor does not check this, why ovlsys need this?\r\n" + "> If this is removed, this function is similar to the one in ovl\r\n" + "> adaptor,\r\n" + "> would you try to rewrite this function to be almost the same with the\r\n" + "> one in ovl adator?\r\n" + "> Not merging it, just implement almost the same.\r\n" + "This is because of the mt8916's new hardwarew design.\r\n" + "\r\n" + "ovlsys adaptor have to find the possible path.\r\n" + "\r\n" + "> \r\n" + "> > +\r\n" + "> > +comp_pdev = of_find_device_by_node(node);\r\n" + "> > +if (!comp_pdev)\r\n" + "> > +return -EPROBE_DEFER;\r\n" + "> > +\r\n" + "> > +priv->ovl_adaptor_comp[id] = &comp_pdev->dev;\r\n" + "> > +\r\n" + "> > +drm_of_component_match_add(dev, match,\r\n" + "> > component_compare_of, node);\r\n" + "> > +dev_dbg(dev, "Adding component match for %pOF\n",\r\n" + "> > node);\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +if (!*match) {\r\n" + "> > +dev_err(dev, "No match device for\r\n" + "> > ovlsys_adaptor\n");\r\n" + "> > +return -ENODEV;\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +return 0;\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +static int mtk_disp_ovlsys_adaptor_comp_bind(struct device *dev,\r\n" + "> > struct device *master,\r\n" + "> > +     void *data)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +\r\n" + "> > +if (!priv->children_bound)\r\n" + "> > +return -EPROBE_DEFER;\r\n" + "> > +\r\n" + "> > +return 0;\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +static void mtk_disp_ovlsys_adaptor_comp_unbind(struct device\r\n" + "> > *dev, struct device *master,\r\n" + "> > +void *data)\r\n" + "> > +{\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +static const struct component_ops mtk_disp_ovlsys_adaptor_comp_ops\r\n" + "> > = {\r\n" + "> > +.bind= mtk_disp_ovlsys_adaptor_comp_bind,\r\n" + "> > +.unbind = mtk_disp_ovlsys_adaptor_comp_unbind,\r\n" + "> > +};\r\n" + "> > +\r\n" + "> > +static int mtk_disp_ovlsys_adaptor_master_bind(struct device *dev)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +int ret, i;\r\n" + "> > +unsigned int layer_nr = 0;\r\n" + "> > +\r\n" + "> > +ret = component_bind_all(dev, priv->mmsys_dev);\r\n" + "> > +if (ret)\r\n" + "> > +return dev_err_probe(dev, ret, "component_bind_all\r\n" + "> > failed!\n");\r\n" + "> > +\r\n" + "> > +priv->children_bound = true;\r\n" + "> > +\r\n" + "> > +for (i = 0; i < priv->path_size; i++)\r\n" + "> > +if (comp_matches[priv->path[i]].type ==\r\n" + "> > OVLSYS_ADAPTOR_TYPE_BLENDER)\r\n" + "> > +layer_nr++;\r\n" + "> > +priv->layer_nr = layer_nr;\r\n" + "> > +\r\n" + "> > +return 0;\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +static void mtk_disp_ovlsys_adaptor_master_unbind(struct device\r\n" + "> > *dev)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv =\r\n" + "> > dev_get_drvdata(dev);\r\n" + "> > +\r\n" + "> > +priv->children_bound = false;\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +static const struct component_master_ops\r\n" + "> > mtk_disp_ovlsys_adaptor_master_ops = {\r\n" + "> > +.bind= mtk_disp_ovlsys_adaptor_master_bind,\r\n" + "> > +.unbind=\r\n" + "> > mtk_disp_ovlsys_adaptor_master_unbind,\r\n" + "> > +};\r\n" + "> > +\r\n" + "> > +static const struct mtk_disp_ovlsys_adaptor\r\n" + "> > mt8196_ovlsys_adaptor_driver_data = {\r\n" + "> > +.max_size = 8191,\r\n" + "> \r\n" + "> This is the first SoC has ovlsys, so it's not necessary to has driver\r\n" + "> data.\r\n" + "> After other SoC ovlsys is added, then consider to add driver data.\r\n" + "> So,\r\n" + "> \r\n" + "> #define OVLSYS_MAX_SIZE 8191\r\n" + "> \r\n" + "> > +};\r\n" + "> > +\r\n" + "> > +static int mtk_disp_ovlsys_adaptor_probe(struct platform_device\r\n" + "> > *pdev)\r\n" + "> > +{\r\n" + "> > +struct mtk_disp_ovlsys_adaptor *priv;\r\n" + "> > +struct device *dev = &pdev->dev;\r\n" + "> > +struct component_match *match = NULL;\r\n" + "> > +struct mtk_drm_ovlsys_private *ovlsys_priv;\r\n" + "> > +int ret;\r\n" + "> > +\r\n" + "> > +priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);\r\n" + "> > +if (!priv)\r\n" + "> > +return -ENOMEM;\r\n" + "> > +\r\n" + "> > +platform_set_drvdata(pdev, priv);\r\n" + "> > +\r\n" + "> > +ovlsys_priv = pdev->dev.platform_data;\r\n" + "> > +priv->mmsys_dev = ovlsys_priv->mmsys_dev;\r\n" + "> > +priv->max_size =\r\n" + "> > mt8196_ovlsys_adaptor_driver_data.max_size;\r\n" + "> > +\r\n" + "> > +if (ovlsys_priv->use_path == 0) {\r\n" + "> > +priv->path = mt8196_mtk_ovl_main;\r\n" + "> > +priv->path_size = ARRAY_SIZE(mt8196_mtk_ovl_main);\r\n" + "> > +} else if (ovlsys_priv->use_path == 1) {\r\n" + "> > +priv->path = mt8196_mtk_ovl_ext;\r\n" + "> > +priv->path_size = ARRAY_SIZE(mt8196_mtk_ovl_ext);\r\n" + "> > +} else {\r\n" + "> > +priv->path = mt8196_mtk_ovl_third;\r\n" + "> > +priv->path_size =\r\n" + "> > ARRAY_SIZE(mt8196_mtk_ovl_third);\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +ret = ovlsys_adaptor_comp_init(dev, &match);\r\n" + "> > +if (ret < 0)\r\n" + "> > +return ret;\r\n" + "> > +\r\n" + "> > +component_master_add_with_match(dev,\r\n" + "> > &mtk_disp_ovlsys_adaptor_master_ops, match);\r\n" + "> > +\r\n" + "> > +pm_runtime_enable(dev);\r\n" + "> > +\r\n" + "> > +ret = component_add(dev,\r\n" + "> > &mtk_disp_ovlsys_adaptor_comp_ops);\r\n" + "> > +if (ret != 0) {\r\n" + "> > +pm_runtime_disable(dev);\r\n" + "> > +dev_err(dev, "Failed to add component: %d\n",\r\n" + "> > ret);\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +return ret;\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +static void mtk_disp_ovlsys_adaptor_remove(struct platform_device\r\n" + "> > *pdev)\r\n" + "> > +{\r\n" + "> > +component_master_del(&pdev->dev,\r\n" + "> > &mtk_disp_ovlsys_adaptor_master_ops);\r\n" + "> > +pm_runtime_disable(&pdev->dev);\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +struct platform_driver mtk_disp_ovlsys_adaptor_driver = {\r\n" + "> > +.probe= mtk_disp_ovlsys_adaptor_probe,\r\n" + "> > +.remove= mtk_disp_ovlsys_adaptor_remove,\r\n" + "> > +.driver= {\r\n" + "> > +.name= "mediatek-disp-ovlsys-adaptor",\r\n" + "> > +.owner= THIS_MODULE,\r\n" + "> > +},\r\n" + "> > +};\r\n" + "> > +\r\n" + "> > +MODULE_AUTHOR("Nancy Lin <nancy.lin@mediatek.com>");\r\n" + "> > +MODULE_DESCRIPTION("MediaTek Ovlsys Adaptor Driver");\r\n" + "> > +MODULE_LICENSE("GPL");\r\n" + "> > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c\r\n" + "> > b/drivers/gpu/drm/mediatek/mtk_drm_drv.c\r\n" + "> > index 27190057bd8e..7526bc38bcc7 100644\r\n" + "> > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c\r\n" + "> > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c\r\n" + "> > @@ -448,6 +448,28 @@ static bool mtk_drm_find_mmsys_comp(struct\r\n" + "> > mtk_drm_private *private, int comp_id\r\n" + "> >  return false;\r\n" + "> >  }\r\n" + "> >  \r\n" + "> > +static int mtk_drm_mmsys_comp_in_path(struct mtk_drm_private\r\n" + "> > *private, int comp_id)\r\n" + "> > +{\r\n" + "> > +const struct mtk_mmsys_driver_data *drv_data = private-\r\n" + "> > >data;\r\n" + "> > +int i;\r\n" + "> > +\r\n" + "> > +if (drv_data->main_path)\r\n" + "> > +for (i = 0; i < drv_data->main_len; i++)\r\n" + "> > +if (drv_data->main_path[i] == comp_id)\r\n" + "> > +return 0;\r\n" + "> > +\r\n" + "> > +if (drv_data->ext_path)\r\n" + "> > +for (i = 0; i < drv_data->ext_len; i++)\r\n" + "> > +if (drv_data->ext_path[i] == comp_id)\r\n" + "> > +return 1;\r\n" + "> > +if (drv_data->third_path)\r\n" + "> > +for (i = 0; i < drv_data->third_len; i++)\r\n" + "> > +if (drv_data->third_path[i] == comp_id)\r\n" + "> > +return 2;\r\n" + "> > +\r\n" + "> > +return -1;\r\n" + "> > +}\r\n" + "> > +\r\n" + "> >  static int mtk_drm_kms_init(struct drm_device *drm)\r\n" + "> >  {\r\n" + "> >  struct mtk_drm_private *private = drm->dev_private;\r\n" + "> > @@ -463,8 +485,8 @@ static int mtk_drm_kms_init(struct drm_device\r\n" + "> > *drm)\r\n" + "> >  if (ret)\r\n" + "> >  goto put_mutex_dev;\r\n" + "> >  \r\n" + "> > -drm->mode_config.min_width = 64;\r\n" + "> > -drm->mode_config.min_height = 64;\r\n" + "> > +drm->mode_config.min_width = 1;\r\n" + "> > +drm->mode_config.min_height = 1;\r\n" + "> \r\n" + "> You change other SoC setting.\r\n" + "> If 8196 has different setting, query min width/height from ddp\r\n" + "> component and separate this to another patch.\r\n" + "> \r\n" + "\r\n" + "Ok, I will separate this to another patch.\r\n" + "> >  \r\n" + "> >  /*\r\n" + "> >   * set max width and height as default value(4096x4096).\r\n" + "> > @@ -1107,6 +1129,40 @@ static int mtk_drm_probe(struct\r\n" + "> > platform_device *pdev)\r\n" + "> >  component_match_add(dev, &match, compare_dev,\r\n" + "> > &ovl_adaptor->dev);\r\n" + "> >  }\r\n" + "> >  \r\n" + "> > +if (mtk_drm_find_mmsys_comp(private,\r\n" + "> > DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0)) {\r\n" + "> > +struct mtk_drm_ovlsys_private ovlsys_priv;\r\n" + "> > +\r\n" + "> > +ovlsys_priv.mmsys_dev = private->mmsys_dev;\r\n" + "> > +ovlsys_priv.use_path =\r\n" + "> > +mtk_drm_mmsys_comp_in_path(private,\r\n" + "> > DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0);\r\n" + "> > +ovl_adaptor =\r\n" + "> > +platform_device_register_data(dev,\r\n" + "> > "mediatek-disp-ovlsys-adaptor",\r\n" + "> > +     \r\n" + "> > PLATFORM_DEVID_AUTO,\r\n" + "> > +      (void\r\n" + "> > *)&ovlsys_priv,\r\n" + "> > +     \r\n" + "> > sizeof(struct mtk_drm_ovlsys_private));\r\n" + "> > +private-\r\n" + "> > >ddp_comp[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0].dev = &ovl_adaptor-\r\n" + "> > >dev;\r\n" + "> > +mtk_ddp_comp_init(NULL, &private-\r\n" + "> > >ddp_comp[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0],\r\n" + "> > + \r\n" + "> > DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0);\r\n" + "> > +component_match_add(dev, &match, compare_dev,\r\n" + "> > &ovl_adaptor->dev);\r\n" + "> > +}\r\n" + "> > +\r\n" + "> > +if (mtk_drm_find_mmsys_comp(private,\r\n" + "> > DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1)) {\r\n" + "> > +struct mtk_drm_ovlsys_private ovlsys_priv;\r\n" + "> > +\r\n" + "> > +ovlsys_priv.mmsys_dev = private->mmsys_dev;\r\n" + "> > +ovlsys_priv.use_path =\r\n" + "> > +mtk_drm_mmsys_comp_in_path(private,\r\n" + "> > DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1);\r\n" + "> > +ovl_adaptor =\r\n" + "> > +platform_device_register_data(dev,\r\n" + "> > "mediatek-disp-ovlsys-adaptor",\r\n" + "> > +     \r\n" + "> > PLATFORM_DEVID_AUTO,\r\n" + "> > +      (void\r\n" + "> > *)&ovlsys_priv,\r\n" + "> > +     \r\n" + "> > sizeof(struct mtk_drm_ovlsys_private));\r\n" + "> > +private-\r\n" + "> > >ddp_comp[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1].dev = &ovl_adaptor-\r\n" + "> > >dev;\r\n" + "> > +mtk_ddp_comp_init(NULL, &private-\r\n" + "> > >ddp_comp[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1],\r\n" + "> > + \r\n" + "> > DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1);\r\n" + "> > +component_match_add(dev, &match, compare_dev,\r\n" + "> > &ovl_adaptor->dev);\r\n" + "> > +}\r\n" + "> > +\r\n" + "> >  /* Iterate over sibling DISP function blocks */\r\n" + "> >  for_each_child_of_node(phandle->parent, node) {\r\n" + "> >  enum mtk_ddp_comp_type comp_type;\r\n" + "> > @@ -1268,6 +1324,7 @@ static struct platform_driver * const\r\n" + "> > mtk_drm_drivers[] = {\r\n" + "> >  &mtk_disp_outproc_driver,\r\n" + "> >  &mtk_disp_ovl_adaptor_driver,\r\n" + "> >  &mtk_disp_ovl_driver,\r\n" + "> > +&mtk_disp_ovlsys_adaptor_driver,\r\n" + "> >  &mtk_disp_rdma_driver,\r\n" + "> >  &mtk_dpi_driver,\r\n" + "> >  &mtk_drm_platform_driver,\r\n" + "> > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h\r\n" + "> > b/drivers/gpu/drm/mediatek/mtk_drm_drv.h\r\n" + "> > index c4717c37b0f1..aa17e743a1d0 100644\r\n" + "> > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h\r\n" + "> > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h\r\n" + "> > @@ -11,7 +11,9 @@\r\n" + "> >  \r\n" + "> >  #define MAX_CONNECTOR2\r\n" + "> >  #define DDP_COMPONENT_DRM_OVL_ADAPTOR (DDP_COMPONENT_ID_MAX + 1)\r\n" + "> > -#define DDP_COMPONENT_DRM_ID_MAX (DDP_COMPONENT_DRM_OVL_ADAPTOR +\r\n" + "> > 1)\r\n" + "> > +#define DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0\r\n" + "> > (DDP_COMPONENT_DRM_OVL_ADAPTOR + 1)\r\n" + "> > +#define DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1\r\n" + "> > (DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0 + 1)\r\n" + "> > +#define DDP_COMPONENT_DRM_ID_MAX\r\n" + "> > (DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1 + 1)\r\n" + "> >  \r\n" + "> >  enum mtk_crtc_path {\r\n" + "> >  CRTC_MAIN,\r\n" + "> > @@ -69,6 +71,12 @@ struct mtk_drm_private {\r\n" + "> >  struct mtk_drm_private **all_drm_private;\r\n" + "> >  };\r\n" + "> >  \r\n" + "> > +struct mtk_drm_ovlsys_private {\r\n" + "> \r\n" + "> ovlsys has its own private data structure.\r\n" + "> mtk_ovlsys_platform_data is better.\r\n" + "> \r\n" + "> Regards,\r\n" + "> CK\r\n" + "> \r\n" + "\r\n" + "Ok, I will fix this problem.\r\n" + "\r\n" + "\r\n" + "Best, Paul\r\n" + "> \r\n" + "> > +struct device *mmsys_dev;\r\n" + "> > +struct device *mutex_dev;\r\n" + "> > +unsigned int use_path;\r\n" + "> > +};\r\n" + "> > +\r\n" + "> >  extern struct platform_driver mtk_disp_aal_driver;\r\n" + "> >  extern struct platform_driver mtk_disp_blender_driver;\r\n" + "> >  extern struct platform_driver mtk_disp_ccorr_driver;\r\n" + "> > @@ -79,6 +87,7 @@ extern struct platform_driver\r\n" + "> > mtk_disp_merge_driver;\r\n" + "> >  extern struct platform_driver mtk_disp_outproc_driver;\r\n" + "> >  extern struct platform_driver mtk_disp_ovl_adaptor_driver;\r\n" + "> >  extern struct platform_driver mtk_disp_ovl_driver;\r\n" + "> > +extern struct platform_driver mtk_disp_ovlsys_adaptor_driver;\r\n" + "> >  extern struct platform_driver mtk_disp_rdma_driver;\r\n" + "> >  extern struct platform_driver mtk_dpi_driver;\r\n" + "> >  extern struct platform_driver mtk_dsi_driver;\r\n" + "> \r\n" + "\r\n" + "\r\n" + "</pre>\r\n" + "</p></body></html><!--type:text--><!--{--><pre>************* MEDIATEK Confidentiality Notice ********************\r\n" + "The information contained in this e-mail message (including any \r\n" + "attachments) may be confidential, proprietary, privileged, or otherwise\r\n" + "exempt from disclosure under applicable laws. It is intended to be \r\n" + "conveyed only to the designated recipient(s). Any use, dissemination, \r\n" + "distribution, printing, retaining or copying of this e-mail (including its \r\n" + "attachments) by unintended recipient(s) is strictly prohibited and may \r\n" + "be unlawful. If you are not an intended recipient of this e-mail, or believe \r\n" + "that you have received this e-mail in error, please notify the sender \r\n" + "immediately (by replying to this e-mail), delete any and all copies of \r\n" + "this e-mail (including any attachments) from your system, and do not\r\n" + "disclose the content of this e-mail to any other person. Thank you!\r\n" + </pre><!--}--> -f33a85ca19bbab0dc6a0724483ae712cb83693e9f9abc64d94b40932dc534551 +33566c3cd4ba33f184bd79abd58892e5a74b9a244d95bfde5e5f848e8b190536
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.