Re: [PATCH 11/12] drm/mediatek: add ovlsys_adaptor support for MT8196

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxxxx>
> > 
> > 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@xxxxxxxxxxxx>
> > Signed-off-by: Paul-pl.Chen <paul-pl.chen@xxxxxxxxxxxx>
> > ---
> >  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@xxxxxxxxxxxx>");
> > +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_CONNECTOR	2
> >  #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;
> 





[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux