diff for duplicates of <59aa3e03300ada8f47c0b5ae3a9c173eab45af7e.camel@mediatek.com> diff --git a/N1/2.bin b/N1/2.bin new file mode 100644 index 0000000..ae8c7bd --- /dev/null +++ b/N1/2.bin @@ -0,0 +1,1145 @@ +<html><body><p> +<pre> +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 +> index 9546bc6b7b2e..dedf50860d3f 100644 +> --- a/drivers/gpu/drm/mediatek/Makefile +> +++ b/drivers/gpu/drm/mediatek/Makefile +> @@ -9,6 +9,7 @@ mediatek-drm-y := mtk_crtc.o \ +>    mtk_disp_exdma.o \ +>    mtk_disp_gamma.o \ +>    mtk_disp_merge.o \ +> +  mtk_disp_ovlsys_adaptor.o \ +>    mtk_disp_ovl.o \ +>    mtk_disp_outproc.o \ +>    mtk_disp_ovl_adaptor.o \ +> diff --git a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c +> index cc780744f060..492b8d965309 100644 +> --- a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c +> +++ b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c +> @@ -368,6 +368,28 @@ static const struct mtk_ddp_comp_funcs ddp_ovl = { +>  .get_num_formats = mtk_ovl_get_num_formats, +>  }; +>   +> +static const struct mtk_ddp_comp_funcs ddp_ovlsys_adaptor = { +> +.clk_enable = mtk_ovlsys_adaptor_clk_enable, +> +.clk_disable = mtk_ovlsys_adaptor_clk_disable, +> +.config = mtk_ovlsys_adaptor_config, +> +.start = mtk_ovlsys_adaptor_start, +> +.stop = mtk_ovlsys_adaptor_stop, +> +.layer_check = mtk_ovlsys_adaptor_layer_check, +> +.layer_nr = mtk_ovlsys_adaptor_layer_nr, +> +.layer_config = mtk_ovlsys_adaptor_layer_config, +> +.register_vblank_cb = mtk_ovlsys_adaptor_register_vblank_cb, +> +.unregister_vblank_cb = mtk_ovlsys_adaptor_unregister_vblank_cb, +> +.enable_vblank = mtk_ovlsys_adaptor_enable_vblank, +> +.disable_vblank = mtk_ovlsys_adaptor_disable_vblank, +> +.dma_dev_get = mtk_ovlsys_adaptor_dma_dev_get, +> +.connect = mtk_ovlsys_adaptor_connect, +> +.disconnect = mtk_ovlsys_adaptor_disconnect, +> +.add = mtk_ovlsys_adaptor_add_comp, +> +.remove = mtk_ovlsys_adaptor_remove_comp, +> +.get_formats = mtk_ovlsys_adaptor_get_formats, +> +.get_num_formats = mtk_ovlsys_adaptor_get_num_formats, +> +}; +> + +>  static const struct mtk_ddp_comp_funcs ddp_postmask = { +>  .clk_enable = mtk_ddp_clk_enable, +>  .clk_disable = mtk_ddp_clk_disable, +> @@ -437,6 +459,7 @@ static const char * const mtk_ddp_comp_stem[MTK_DDP_COMP_TYPE_MAX] = { +>  [MTK_DISP_OVL] = "ovl", +>  [MTK_DISP_OVL_2L] = "ovl-2l", +>  [MTK_DISP_OVL_ADAPTOR] = "ovl_adaptor", +> +[MTK_DISP_OVLSYS_ADAPTOR] = "ovlsys_adaptor", +>  [MTK_DISP_POSTMASK] = "postmask", +>  [MTK_DISP_PWM] = "pwm", +>  [MTK_DISP_RDMA] = "rdma", +> @@ -469,6 +492,8 @@ static const struct mtk_ddp_comp_match mtk_ddp_matches[DDP_COMPONENT_DRM_ID_MAX] +>  [DDP_COMPONENT_DPI0]= { MTK_DPI,0, &ddp_dpi }, +>  [DDP_COMPONENT_DPI1]= { MTK_DPI,1, &ddp_dpi }, +>  [DDP_COMPONENT_DRM_OVL_ADAPTOR]= { MTK_DISP_OVL_ADAPTOR,0, &ddp_ovl_adaptor }, +> +[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0] = { MTK_DISP_OVLSYS_ADAPTOR, 0, &ddp_ovlsys_adaptor}, +> +[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1] = { MTK_DISP_OVLSYS_ADAPTOR, 1, &ddp_ovlsys_adaptor}, +>  [DDP_COMPONENT_DSC0]= { MTK_DISP_DSC,0, &ddp_dsc }, +>  [DDP_COMPONENT_DSC1]= { MTK_DISP_DSC,1, &ddp_dsc }, +>  [DDP_COMPONENT_DSI0]= { MTK_DSI,0, &ddp_dsi }, +> diff --git a/drivers/gpu/drm/mediatek/mtk_ddp_comp.h b/drivers/gpu/drm/mediatek/mtk_ddp_comp.h +> index b33d3289b8b6..ef64ce7a071f 100644 +> --- a/drivers/gpu/drm/mediatek/mtk_ddp_comp.h +> +++ b/drivers/gpu/drm/mediatek/mtk_ddp_comp.h +> @@ -33,6 +33,7 @@ enum mtk_ddp_comp_type { +>  MTK_DISP_MUTEX, +>  MTK_DISP_OD, +>  MTK_DISP_OVL, +> +MTK_DISP_OVLSYS_ADAPTOR, +>  MTK_DISP_OVL_2L, +>  MTK_DISP_OVL_ADAPTOR, +>  MTK_DISP_POSTMASK, +> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h +> index 44d2cbe919dc..67f6da59d0de 100644 +> --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h +> +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h +> @@ -140,8 +140,8 @@ void mtk_ovl_enable_vblank(struct device *dev); +>  void mtk_ovl_disable_vblank(struct device *dev); +>  u32 mtk_ovl_get_blend_modes(struct device *dev); +>  const u32 *mtk_ovl_get_formats(struct device *dev); +> -size_t mtk_ovl_get_num_formats(struct device *dev); +>   +> +size_t mtk_ovl_get_num_formats(struct device *dev); +>  void mtk_ovl_adaptor_add_comp(struct device *dev, struct mtk_mutex *mutex); +>  void mtk_ovl_adaptor_remove_comp(struct device *dev, struct mtk_mutex *mutex); +>  bool mtk_ovl_adaptor_is_comp_present(struct device_node *node); +> @@ -174,6 +174,35 @@ size_t mtk_ovl_adaptor_get_num_formats(struct device *dev); +>  enum drm_mode_status mtk_ovl_adaptor_mode_valid(struct device *dev, +>  const struct drm_display_mode *mode); +>   +> +void mtk_ovlsys_adaptor_add_comp(struct device *dev, struct mtk_mutex *mutex); +> +void mtk_ovlsys_adaptor_remove_comp(struct device *dev, struct mtk_mutex *mutex); +> +void mtk_ovlsys_adaptor_connect(struct device *dev, struct device *mmsys_dev, +> +unsigned int next); +> +void mtk_ovlsys_adaptor_disconnect(struct device *dev, struct device *mmsys_dev, +> +   unsigned int next); +> +int mtk_ovlsys_adaptor_clk_enable(struct device *dev); +> +void mtk_ovlsys_adaptor_clk_disable(struct device *dev); +> +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); +> +void mtk_ovlsys_adaptor_layer_config(struct device *dev, unsigned int idx, +> +     struct mtk_plane_state *state, +> +     struct cmdq_pkt *cmdq_pkt); +> +int mtk_ovlsys_adaptor_layer_check(struct device *dev, +> +   unsigned int idx, +> +   struct mtk_plane_state *mtk_state); +> +void mtk_ovlsys_adaptor_register_vblank_cb(struct device *dev, void (*vblank_cb)(void *), +> +   void *vblank_cb_data); +> +void mtk_ovlsys_adaptor_unregister_vblank_cb(struct device *dev); +> +void mtk_ovlsys_adaptor_enable_vblank(struct device *dev); +> +void mtk_ovlsys_adaptor_disable_vblank(struct device *dev); +> +void mtk_ovlsys_adaptor_start(struct device *dev); +> +void mtk_ovlsys_adaptor_stop(struct device *dev); +> +unsigned int mtk_ovlsys_adaptor_layer_nr(struct device *dev); +> +struct device *mtk_ovlsys_adaptor_dma_dev_get(struct device *dev); +> +const u32 *mtk_ovlsys_adaptor_get_formats(struct device *dev); +> +size_t mtk_ovlsys_adaptor_get_num_formats(struct device *dev); +> + +>  void mtk_rdma_bypass_shadow(struct device *dev); +>  int mtk_rdma_clk_enable(struct device *dev); +>  void mtk_rdma_clk_disable(struct device *dev); +> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovlsys_adaptor.c b/drivers/gpu/drm/mediatek/mtk_disp_ovlsys_adaptor.c +> new file mode 100644 +> index 000000000000..7bce2b7143cb +> --- /dev/null +> +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovlsys_adaptor.c +> @@ -0,0 +1,758 @@ +> +// SPDX-License-Identifier: GPL-2.0-only +> +/* +> + * Copyright (c) 2021 MediaTek Inc. +> + */ +> + +> +#include <drm/drm_fourcc.h> +> +#include <drm/drm_of.h> +> +#include <linux/clk.h> +> +#include <linux/component.h> +> +#include <linux/of_platform.h> +> +#include <linux/of_device.h> +> +#include <linux/of_address.h> +> +#include <linux/platform_device.h> +> +#include <linux/pm_runtime.h> +> +#include <linux/reset.h> +> +#include <linux/soc/mediatek/mtk-cmdq.h> +> +#include <linux/soc/mediatek/mtk-mmsys.h> +> +#include <linux/soc/mediatek/mtk-mutex.h> +> + +> +#include "mtk_disp_blender.h" +> +#include "mtk_disp_drv.h" +> +#include "mtk_crtc.h" + +Alphabetic order. + +> +#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. + +> +[OVLSYS_ADAPTOR_EXDMA11]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, 11, DDP_COMPONENT_ID_MAX}, + +Ditto. + +> +[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. + +> +[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. + +> +[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. + +> +[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. + +> +}; +> + +> +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(). + +> + +> +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. + +> +mtk_disp_blender_start(blender, cmdq_pkt); + +Ditto. + +> +} +> + +> +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. + +> +else if (get_type(priv->path[i]) == OVLSYS_ADAPTOR_TYPE_BLENDER) +> +mtk_disp_blender_start(priv->ovl_adaptor_comp[priv->path[i]], NULL); + +Ditto. + +> +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. + +> +else if (get_type(priv->path[i]) == OVLSYS_ADAPTOR_TYPE_BLENDER) +> +mtk_disp_blender_stop(priv->ovl_adaptor_comp[priv->path[i]], NULL); + +Ditto. + +> +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. + +> +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. + +> +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. + +> + +> +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. + +>   +>  /* +>   * 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 + + +> +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 2eea4cb..944c2bf 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -24,7 +24,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" "Hi, Paul:\n" "\n" @@ -1151,5 +1151,1152 @@ "> extern struct platform_driver mtk_disp_rdma_driver;\n" "> extern struct platform_driver mtk_dpi_driver;\n" > extern struct platform_driver mtk_dsi_driver; + "\01:2\0" + "b\0" + "<html><body><p>\r\n" + "<pre>\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" + ">  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 drivers/gpu/drm/mediatek/mtk_disp_ovlsys_adaptor.c\r\n" + "> \r\n" + "> diff --git a/drivers/gpu/drm/mediatek/Makefile b/drivers/gpu/drm/mediatek/Makefile\r\n" + "> index 9546bc6b7b2e..dedf50860d3f 100644\r\n" + "> --- a/drivers/gpu/drm/mediatek/Makefile\r\n" + "> +++ b/drivers/gpu/drm/mediatek/Makefile\r\n" + "> @@ -9,6 +9,7 @@ mediatek-drm-y := mtk_crtc.o \\r\n" + ">    mtk_disp_exdma.o \\r\n" + ">    mtk_disp_gamma.o \\r\n" + ">    mtk_disp_merge.o \\r\n" + "> +  mtk_disp_ovlsys_adaptor.o \\r\n" + ">    mtk_disp_ovl.o \\r\n" + ">    mtk_disp_outproc.o \\r\n" + ">    mtk_disp_ovl_adaptor.o \\r\n" + "> diff --git a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c\r\n" + "> index cc780744f060..492b8d965309 100644\r\n" + "> --- a/drivers/gpu/drm/mediatek/mtk_ddp_comp.c\r\n" + "> +++ b/drivers/gpu/drm/mediatek/mtk_ddp_comp.c\r\n" + "> @@ -368,6 +368,28 @@ static const struct mtk_ddp_comp_funcs ddp_ovl = {\r\n" + ">  .get_num_formats = mtk_ovl_get_num_formats,\r\n" + ">  };\r\n" + ">  \r\n" + "> +static const struct mtk_ddp_comp_funcs ddp_ovlsys_adaptor = {\r\n" + "> +.clk_enable = mtk_ovlsys_adaptor_clk_enable,\r\n" + "> +.clk_disable = mtk_ovlsys_adaptor_clk_disable,\r\n" + "> +.config = mtk_ovlsys_adaptor_config,\r\n" + "> +.start = mtk_ovlsys_adaptor_start,\r\n" + "> +.stop = mtk_ovlsys_adaptor_stop,\r\n" + "> +.layer_check = mtk_ovlsys_adaptor_layer_check,\r\n" + "> +.layer_nr = mtk_ovlsys_adaptor_layer_nr,\r\n" + "> +.layer_config = mtk_ovlsys_adaptor_layer_config,\r\n" + "> +.register_vblank_cb = mtk_ovlsys_adaptor_register_vblank_cb,\r\n" + "> +.unregister_vblank_cb = mtk_ovlsys_adaptor_unregister_vblank_cb,\r\n" + "> +.enable_vblank = mtk_ovlsys_adaptor_enable_vblank,\r\n" + "> +.disable_vblank = mtk_ovlsys_adaptor_disable_vblank,\r\n" + "> +.dma_dev_get = mtk_ovlsys_adaptor_dma_dev_get,\r\n" + "> +.connect = mtk_ovlsys_adaptor_connect,\r\n" + "> +.disconnect = mtk_ovlsys_adaptor_disconnect,\r\n" + "> +.add = mtk_ovlsys_adaptor_add_comp,\r\n" + "> +.remove = mtk_ovlsys_adaptor_remove_comp,\r\n" + "> +.get_formats = mtk_ovlsys_adaptor_get_formats,\r\n" + "> +.get_num_formats = mtk_ovlsys_adaptor_get_num_formats,\r\n" + "> +};\r\n" + "> +\r\n" + ">  static const struct mtk_ddp_comp_funcs ddp_postmask = {\r\n" + ">  .clk_enable = mtk_ddp_clk_enable,\r\n" + ">  .clk_disable = mtk_ddp_clk_disable,\r\n" + "> @@ -437,6 +459,7 @@ static const char * const mtk_ddp_comp_stem[MTK_DDP_COMP_TYPE_MAX] = {\r\n" + ">  [MTK_DISP_OVL] = "ovl",\r\n" + ">  [MTK_DISP_OVL_2L] = "ovl-2l",\r\n" + ">  [MTK_DISP_OVL_ADAPTOR] = "ovl_adaptor",\r\n" + "> +[MTK_DISP_OVLSYS_ADAPTOR] = "ovlsys_adaptor",\r\n" + ">  [MTK_DISP_POSTMASK] = "postmask",\r\n" + ">  [MTK_DISP_PWM] = "pwm",\r\n" + ">  [MTK_DISP_RDMA] = "rdma",\r\n" + "> @@ -469,6 +492,8 @@ static const struct mtk_ddp_comp_match mtk_ddp_matches[DDP_COMPONENT_DRM_ID_MAX]\r\n" + ">  [DDP_COMPONENT_DPI0]= { MTK_DPI,0, &ddp_dpi },\r\n" + ">  [DDP_COMPONENT_DPI1]= { MTK_DPI,1, &ddp_dpi },\r\n" + ">  [DDP_COMPONENT_DRM_OVL_ADAPTOR]= { MTK_DISP_OVL_ADAPTOR,0, &ddp_ovl_adaptor },\r\n" + "> +[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0] = { MTK_DISP_OVLSYS_ADAPTOR, 0, &ddp_ovlsys_adaptor},\r\n" + "> +[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1] = { MTK_DISP_OVLSYS_ADAPTOR, 1, &ddp_ovlsys_adaptor},\r\n" + ">  [DDP_COMPONENT_DSC0]= { MTK_DISP_DSC,0, &ddp_dsc },\r\n" + ">  [DDP_COMPONENT_DSC1]= { MTK_DISP_DSC,1, &ddp_dsc },\r\n" + ">  [DDP_COMPONENT_DSI0]= { MTK_DSI,0, &ddp_dsi },\r\n" + "> diff --git a/drivers/gpu/drm/mediatek/mtk_ddp_comp.h b/drivers/gpu/drm/mediatek/mtk_ddp_comp.h\r\n" + "> index b33d3289b8b6..ef64ce7a071f 100644\r\n" + "> --- a/drivers/gpu/drm/mediatek/mtk_ddp_comp.h\r\n" + "> +++ b/drivers/gpu/drm/mediatek/mtk_ddp_comp.h\r\n" + "> @@ -33,6 +33,7 @@ enum mtk_ddp_comp_type {\r\n" + ">  MTK_DISP_MUTEX,\r\n" + ">  MTK_DISP_OD,\r\n" + ">  MTK_DISP_OVL,\r\n" + "> +MTK_DISP_OVLSYS_ADAPTOR,\r\n" + ">  MTK_DISP_OVL_2L,\r\n" + ">  MTK_DISP_OVL_ADAPTOR,\r\n" + ">  MTK_DISP_POSTMASK,\r\n" + "> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h\r\n" + "> index 44d2cbe919dc..67f6da59d0de 100644\r\n" + "> --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h\r\n" + "> +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h\r\n" + "> @@ -140,8 +140,8 @@ void mtk_ovl_enable_vblank(struct device *dev);\r\n" + ">  void mtk_ovl_disable_vblank(struct device *dev);\r\n" + ">  u32 mtk_ovl_get_blend_modes(struct device *dev);\r\n" + ">  const u32 *mtk_ovl_get_formats(struct device *dev);\r\n" + "> -size_t mtk_ovl_get_num_formats(struct device *dev);\r\n" + ">  \r\n" + "> +size_t mtk_ovl_get_num_formats(struct device *dev);\r\n" + ">  void mtk_ovl_adaptor_add_comp(struct device *dev, struct mtk_mutex *mutex);\r\n" + ">  void mtk_ovl_adaptor_remove_comp(struct device *dev, struct mtk_mutex *mutex);\r\n" + ">  bool mtk_ovl_adaptor_is_comp_present(struct device_node *node);\r\n" + "> @@ -174,6 +174,35 @@ size_t mtk_ovl_adaptor_get_num_formats(struct device *dev);\r\n" + ">  enum drm_mode_status mtk_ovl_adaptor_mode_valid(struct device *dev,\r\n" + ">  const struct drm_display_mode *mode);\r\n" + ">  \r\n" + "> +void mtk_ovlsys_adaptor_add_comp(struct device *dev, struct mtk_mutex *mutex);\r\n" + "> +void mtk_ovlsys_adaptor_remove_comp(struct device *dev, struct mtk_mutex *mutex);\r\n" + "> +void mtk_ovlsys_adaptor_connect(struct device *dev, struct device *mmsys_dev,\r\n" + "> +unsigned int next);\r\n" + "> +void mtk_ovlsys_adaptor_disconnect(struct device *dev, struct device *mmsys_dev,\r\n" + "> +   unsigned int next);\r\n" + "> +int mtk_ovlsys_adaptor_clk_enable(struct device *dev);\r\n" + "> +void mtk_ovlsys_adaptor_clk_disable(struct device *dev);\r\n" + "> +void mtk_ovlsys_adaptor_config(struct device *dev, unsigned int w,\r\n" + "> +       unsigned int h, unsigned int vrefresh,\r\n" + "> +       unsigned int bpc, struct cmdq_pkt *cmdq_pkt);\r\n" + "> +void mtk_ovlsys_adaptor_layer_config(struct device *dev, unsigned int idx,\r\n" + "> +     struct mtk_plane_state *state,\r\n" + "> +     struct cmdq_pkt *cmdq_pkt);\r\n" + "> +int mtk_ovlsys_adaptor_layer_check(struct device *dev,\r\n" + "> +   unsigned int idx,\r\n" + "> +   struct mtk_plane_state *mtk_state);\r\n" + "> +void mtk_ovlsys_adaptor_register_vblank_cb(struct device *dev, void (*vblank_cb)(void *),\r\n" + "> +   void *vblank_cb_data);\r\n" + "> +void mtk_ovlsys_adaptor_unregister_vblank_cb(struct device *dev);\r\n" + "> +void mtk_ovlsys_adaptor_enable_vblank(struct device *dev);\r\n" + "> +void mtk_ovlsys_adaptor_disable_vblank(struct device *dev);\r\n" + "> +void mtk_ovlsys_adaptor_start(struct device *dev);\r\n" + "> +void mtk_ovlsys_adaptor_stop(struct device *dev);\r\n" + "> +unsigned int mtk_ovlsys_adaptor_layer_nr(struct device *dev);\r\n" + "> +struct device *mtk_ovlsys_adaptor_dma_dev_get(struct device *dev);\r\n" + "> +const u32 *mtk_ovlsys_adaptor_get_formats(struct device *dev);\r\n" + "> +size_t mtk_ovlsys_adaptor_get_num_formats(struct device *dev);\r\n" + "> +\r\n" + ">  void mtk_rdma_bypass_shadow(struct device *dev);\r\n" + ">  int mtk_rdma_clk_enable(struct device *dev);\r\n" + ">  void mtk_rdma_clk_disable(struct device *dev);\r\n" + "> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovlsys_adaptor.c b/drivers/gpu/drm/mediatek/mtk_disp_ovlsys_adaptor.c\r\n" + "> new file mode 100644\r\n" + "> index 000000000000..7bce2b7143cb\r\n" + "> --- /dev/null\r\n" + "> +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovlsys_adaptor.c\r\n" + "> @@ -0,0 +1,758 @@\r\n" + "> +// SPDX-License-Identifier: GPL-2.0-only\r\n" + "> +/*\r\n" + "> + * Copyright (c) 2021 MediaTek Inc.\r\n" + "> + */\r\n" + "> +\r\n" + "> +#include <drm/drm_fourcc.h>\r\n" + "> +#include <drm/drm_of.h>\r\n" + "> +#include <linux/clk.h>\r\n" + "> +#include <linux/component.h>\r\n" + "> +#include <linux/of_platform.h>\r\n" + "> +#include <linux/of_device.h>\r\n" + "> +#include <linux/of_address.h>\r\n" + "> +#include <linux/platform_device.h>\r\n" + "> +#include <linux/pm_runtime.h>\r\n" + "> +#include <linux/reset.h>\r\n" + "> +#include <linux/soc/mediatek/mtk-cmdq.h>\r\n" + "> +#include <linux/soc/mediatek/mtk-mmsys.h>\r\n" + "> +#include <linux/soc/mediatek/mtk-mutex.h>\r\n" + "> +\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" + "> +#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 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 comp_matches[OVLSYS_ADAPTOR_ID_MAX] = {\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA0]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, 0, DDP_COMPONENT_ID_MAX},\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA1]  = { OVLSYS_ADAPTOR_TYPE_EXDMA, 1, DDP_COMPONENT_ID_MAX},\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA2]  = { OVLSYS_ADAPTOR_TYPE_EXDMA, 2, DDP_COMPONENT_OVL0_EXDMA2},\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA3]  = { OVLSYS_ADAPTOR_TYPE_EXDMA, 3, DDP_COMPONENT_OVL0_EXDMA3},\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA4]  = { OVLSYS_ADAPTOR_TYPE_EXDMA, 4, DDP_COMPONENT_OVL0_EXDMA4},\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA5]  = { OVLSYS_ADAPTOR_TYPE_EXDMA, 5, DDP_COMPONENT_OVL0_EXDMA5},\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA6]  = { OVLSYS_ADAPTOR_TYPE_EXDMA, 6, DDP_COMPONENT_OVL0_EXDMA6},\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA7]  = { OVLSYS_ADAPTOR_TYPE_EXDMA, 7, DDP_COMPONENT_OVL0_EXDMA7},\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA8]  = { OVLSYS_ADAPTOR_TYPE_EXDMA, 8, DDP_COMPONENT_OVL0_EXDMA8},\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA9]  = { OVLSYS_ADAPTOR_TYPE_EXDMA, 9, DDP_COMPONENT_OVL0_EXDMA9},\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA10]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, 10, DDP_COMPONENT_ID_MAX},\r\n" + "\r\n" + "EXDMA10 has no component id, so just drop OVLSYS_ADAPTOR_EXDMA10.\r\n" + "\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA11]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, 11, DDP_COMPONENT_ID_MAX},\r\n" + "\r\n" + "Ditto.\r\n" + "\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA12]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, 12, DDP_COMPONENT_OVL1_EXDMA2},\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA13]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, 13, DDP_COMPONENT_OVL1_EXDMA3},\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA14]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, 14, DDP_COMPONENT_OVL1_EXDMA4},\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA15]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, 15, DDP_COMPONENT_OVL1_EXDMA5},\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA16]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, 16, DDP_COMPONENT_OVL1_EXDMA6},\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA17]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, 17, DDP_COMPONENT_OVL1_EXDMA7},\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA18]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, 18, DDP_COMPONENT_OVL1_EXDMA8},\r\n" + "> +[OVLSYS_ADAPTOR_EXDMA19]   = { OVLSYS_ADAPTOR_TYPE_EXDMA, 19, DDP_COMPONENT_OVL1_EXDMA9},\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER0] = { OVLSYS_ADAPTOR_TYPE_BLENDER, 0, DDP_COMPONENT_ID_MAX},\r\n" + "\r\n" + "Ditto.\r\n" + "\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER1] = { OVLSYS_ADAPTOR_TYPE_BLENDER, 1, DDP_COMPONENT_OVL0_BLENDER1},\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER2] = { OVLSYS_ADAPTOR_TYPE_BLENDER, 2, DDP_COMPONENT_OVL0_BLENDER2},\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER3] = { OVLSYS_ADAPTOR_TYPE_BLENDER, 3, DDP_COMPONENT_OVL0_BLENDER3},\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER4] = { OVLSYS_ADAPTOR_TYPE_BLENDER, 4, DDP_COMPONENT_OVL0_BLENDER4},\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER5] = { OVLSYS_ADAPTOR_TYPE_BLENDER, 5, DDP_COMPONENT_OVL0_BLENDER5},\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER6] = { OVLSYS_ADAPTOR_TYPE_BLENDER, 6, DDP_COMPONENT_OVL0_BLENDER6},\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER7] = { OVLSYS_ADAPTOR_TYPE_BLENDER, 7, DDP_COMPONENT_OVL0_BLENDER7},\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER8] = { OVLSYS_ADAPTOR_TYPE_BLENDER, 8, DDP_COMPONENT_OVL0_BLENDER8},\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER9] = { OVLSYS_ADAPTOR_TYPE_BLENDER, 9, DDP_COMPONENT_OVL0_BLENDER9},\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER10] = { OVLSYS_ADAPTOR_TYPE_BLENDER, 10, DDP_COMPONENT_ID_MAX},\r\n" + "\r\n" + "Ditto.\r\n" + "\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER11] = {\r\n" + "> +OVLSYS_ADAPTOR_TYPE_BLENDER, 11, DDP_COMPONENT_OVL1_BLENDER1},\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER12] = {\r\n" + "> +OVLSYS_ADAPTOR_TYPE_BLENDER, 12, DDP_COMPONENT_OVL1_BLENDER2},\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER13] = {\r\n" + "> +OVLSYS_ADAPTOR_TYPE_BLENDER, 13, DDP_COMPONENT_OVL1_BLENDER3},\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER14] = {\r\n" + "> +OVLSYS_ADAPTOR_TYPE_BLENDER, 14, DDP_COMPONENT_OVL1_BLENDER4},\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER15] = {\r\n" + "> +OVLSYS_ADAPTOR_TYPE_BLENDER, 15, DDP_COMPONENT_OVL1_BLENDER5},\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER16] = {\r\n" + "> +OVLSYS_ADAPTOR_TYPE_BLENDER, 16, DDP_COMPONENT_OVL1_BLENDER6},\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER17] = {\r\n" + "> +OVLSYS_ADAPTOR_TYPE_BLENDER, 17, DDP_COMPONENT_OVL1_BLENDER7},\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER18] = {\r\n" + "> +OVLSYS_ADAPTOR_TYPE_BLENDER, 18, DDP_COMPONENT_OVL1_BLENDER8},\r\n" + "> +[OVLSYS_ADAPTOR_BLENDER19] = {\r\n" + "> +OVLSYS_ADAPTOR_TYPE_BLENDER, 19, DDP_COMPONENT_OVL1_BLENDER9},\r\n" + "> +[OVLSYS_ADAPTOR_OUTPROC0] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, 0, DDP_COMPONENT_OVL0_OUTPROC0},\r\n" + "> +[OVLSYS_ADAPTOR_OUTPROC1] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, 1, DDP_COMPONENT_OVL0_OUTPROC1},\r\n" + "> +[OVLSYS_ADAPTOR_OUTPROC2] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, 2, DDP_COMPONENT_ID_MAX},\r\n" + "> +[OVLSYS_ADAPTOR_OUTPROC3] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, 3, DDP_COMPONENT_ID_MAX},\r\n" + "> +[OVLSYS_ADAPTOR_OUTPROC4] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, 4, DDP_COMPONENT_ID_MAX},\r\n" + "> +[OVLSYS_ADAPTOR_OUTPROC5] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, 5, DDP_COMPONENT_ID_MAX},\r\n" + "\r\n" + "Ditto.\r\n" + "\r\n" + "> +[OVLSYS_ADAPTOR_OUTPROC6] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, 6, DDP_COMPONENT_OVL1_OUTPROC0},\r\n" + "> +[OVLSYS_ADAPTOR_OUTPROC7] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, 7, DDP_COMPONENT_ID_MAX},\r\n" + "> +[OVLSYS_ADAPTOR_OUTPROC8] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, 8, DDP_COMPONENT_ID_MAX},\r\n" + "> +[OVLSYS_ADAPTOR_OUTPROC9] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, 9, DDP_COMPONENT_ID_MAX},\r\n" + "> +[OVLSYS_ADAPTOR_OUTPROC10] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, 10, DDP_COMPONENT_ID_MAX},\r\n" + "> +[OVLSYS_ADAPTOR_OUTPROC11] = { OVLSYS_ADAPTOR_TYPE_OUTPROC, 11, DDP_COMPONENT_ID_MAX},\r\n" + "\r\n" + "Ditto.\r\n" + "\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 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 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 mtk_ovlsys_adaptor_comp_type type,\r\n" + "> +   unsigned int idx)\r\n" + "> +{\r\n" + "> +struct mtk_disp_ovlsys_adaptor *priv = 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->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 int idx,\r\n" + "> +     struct mtk_plane_state *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 = drm_format_info(pending->format);\r\n" + "> +struct mtk_disp_ovlsys_adaptor *priv = dev_get_drvdata(dev);\r\n" + "> +\r\n" + "> +dev_dbg(dev, "%s+ idx:%d, enable:%d, fmt:0x%x\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->cpp[0]),\r\n" + "> +pending->x, pending->y, pending->width, pending->height);\r\n" + "> +\r\n" + "> +exdma = get_comp_by_type_idx(dev, OVLSYS_ADAPTOR_TYPE_EXDMA, idx);\r\n" + "> +blender = get_comp_by_type_idx(dev, OVLSYS_ADAPTOR_TYPE_BLENDER, idx);\r\n" + "> +\r\n" + "> +/* OVLSYS is in 1T2P domain, width needs to be 2 pixels 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 || align_width == 0 ||\r\n" + "> +    pending->x > priv->max_size || pending->y > priv->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, 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(), so I would like to rename it to mtk_disp_exdma_layer_config().\r\n" + "\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" + "> +mtk_disp_blender_start(blender, cmdq_pkt);\r\n" + "\r\n" + "Ditto.\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 vrefresh,\r\n" + "> +       unsigned int bpc, struct cmdq_pkt *cmdq_pkt)\r\n" + "> +{\r\n" + "> +struct mtk_disp_ovlsys_adaptor *priv = 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]) == 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->ovl_adaptor_comp[priv->path[i]], w, h,\r\n" + "> +vrefresh, bpc, 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 == priv->layer_nr, cmdq_pkt);\r\n" + "\r\n" + "> +} else if (get_type(priv->path[i]) == OVLSYS_ADAPTOR_TYPE_OUTPROC) {\r\n" + "> +mtk_disp_outproc_config(priv->ovl_adaptor_comp[priv->path[i]], w, h,\r\n" + "> +vrefresh, bpc, 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 *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 = 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]) == OVLSYS_ADAPTOR_TYPE_EXDMA)\r\n" + "> +mtk_disp_exdma_start(priv->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" + "> +else if (get_type(priv->path[i]) == OVLSYS_ADAPTOR_TYPE_BLENDER)\r\n" + "> +mtk_disp_blender_start(priv->ovl_adaptor_comp[priv->path[i]], NULL);\r\n" + "\r\n" + "Ditto.\r\n" + "\r\n" + "> +else\r\n" + "> +mtk_disp_outproc_start(priv->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 = 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]) == OVLSYS_ADAPTOR_TYPE_EXDMA)\r\n" + "> +mtk_disp_exdma_stop(priv->ovl_adaptor_comp[priv->path[i]], NULL);\r\n" + "\r\n" + "Ditto.\r\n" + "\r\n" + "> +else if (get_type(priv->path[i]) == OVLSYS_ADAPTOR_TYPE_BLENDER)\r\n" + "> +mtk_disp_blender_stop(priv->ovl_adaptor_comp[priv->path[i]], NULL);\r\n" + "\r\n" + "Ditto.\r\n" + "\r\n" + "> +else\r\n" + "> +mtk_disp_outproc_stop(priv->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 = 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" + "> +if (ret < 0) {\r\n" + "> +dev_err(dev, "Failed to enable power 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) == 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, 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) == 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 = 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) == 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 = 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 = 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, void (*vblank_cb)(void *),\r\n" + "> +   void *vblank_cb_data)\r\n" + "> +{\r\n" + "> +struct mtk_disp_ovlsys_adaptor *priv = dev_get_drvdata(dev);\r\n" + "> +\r\n" + "> +mtk_disp_outproc_register_vblank_cb(priv->ovl_adaptor_comp[priv->path[priv->path_size - 1]],\r\n" + "> +    vblank_cb, 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 = dev_get_drvdata(dev);\r\n" + "> +struct device *comp = priv->ovl_adaptor_comp[priv->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" + "> +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 = dev_get_drvdata(dev);\r\n" + "> +\r\n" + "> +mtk_disp_outproc_enable_vblank(priv->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 = dev_get_drvdata(dev);\r\n" + "> +\r\n" + "> +mtk_disp_outproc_disable_vblank(priv->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 = dev_get_drvdata(dev);\r\n" + "> +\r\n" + "> +return mtk_disp_exdma_get_formats(priv->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 = dev_get_drvdata(dev);\r\n" + "> +\r\n" + "> +return mtk_disp_exdma_get_num_formats(priv->ovl_adaptor_comp[priv->path[0]]);\r\n" + "> +}\r\n" + "> +\r\n" + "> +void mtk_ovlsys_adaptor_add_comp(struct device *dev, struct mtk_mutex *mutex)\r\n" + "> +{\r\n" + "> +struct mtk_disp_ovlsys_adaptor *priv = 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->path[i]));\r\n" + "> +}\r\n" + "> +\r\n" + "> +void mtk_ovlsys_adaptor_remove_comp(struct device *dev, struct mtk_mutex *mutex)\r\n" + "> +{\r\n" + "> +struct mtk_disp_ovlsys_adaptor *priv = 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->path[i]));\r\n" + "> +}\r\n" + "> +\r\n" + "> +void mtk_ovlsys_adaptor_connect(struct device *dev, struct device *mmsys_dev, unsigned int next)\r\n" + "> +{\r\n" + "> +struct mtk_disp_ovlsys_adaptor *priv = 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, get_ddp_comp_id(priv->path[i]),\r\n" + "> +      get_ddp_comp_id(priv->path[i + 1]));\r\n" + "> +\r\n" + "> +mtk_mmsys_ddp_connect(mmsys_dev, get_ddp_comp_id(priv->path[i]), next);\r\n" + "> +}\r\n" + "> +\r\n" + "> +void mtk_ovlsys_adaptor_disconnect(struct device *dev, struct device *mmsys_dev, unsigned int next)\r\n" + "> +{\r\n" + "> +struct mtk_disp_ovlsys_adaptor *priv = 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, get_ddp_comp_id(priv->path[i]),\r\n" + "> + get_ddp_comp_id(priv->path[i + 1]));\r\n" + "> +\r\n" + "> +mtk_mmsys_ddp_disconnect(mmsys_dev, get_ddp_comp_id(priv->path[i]), next);\r\n" + "> +}\r\n" + "> +\r\n" + "> +static int ovlsys_adaptor_comp_get_id(struct device *dev, struct device_node *node,\r\n" + "> +      enum mtk_ovlsys_adaptor_comp_type type,\r\n" + "> +      enum mtk_ddp_comp_id *comp_id)\r\n" + "> +{\r\n" + "> +int alias_id = of_alias_get_id(node, 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", 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" + "> +.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 component_match **match)\r\n" + "> +{\r\n" + "> +struct mtk_disp_ovlsys_adaptor *priv = 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 = 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 %pOF\n",\r\n" + "> +node);\r\n" + "> +continue;\r\n" + "> +}\r\n" + "> +\r\n" + "> +type = (enum mtk_ovlsys_adaptor_comp_type)(uintptr_t)of_id->data;\r\n" + "> +id = ovlsys_adaptor_comp_get_id(dev, node, type, &comp_id);\r\n" + "> +if (id < 0) {\r\n" + "> +dev_warn(dev, "Skipping unknown component %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 adaptor,\r\n" + "would you try to rewrite this function to be almost the same with the one in ovl adator?\r\n" + "Not merging it, just implement almost the same.\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, component_compare_of, node);\r\n" + "> +dev_dbg(dev, "Adding component match for %pOF\n", node);\r\n" + "> +}\r\n" + "> +\r\n" + "> +if (!*match) {\r\n" + "> +dev_err(dev, "No match device for 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, struct device *master,\r\n" + "> +     void *data)\r\n" + "> +{\r\n" + "> +struct mtk_disp_ovlsys_adaptor *priv = 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 *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" + "> +.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 = 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 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 == 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 *dev)\r\n" + "> +{\r\n" + "> +struct mtk_disp_ovlsys_adaptor *priv = dev_get_drvdata(dev);\r\n" + "> +\r\n" + "> +priv->children_bound = false;\r\n" + "> +}\r\n" + "> +\r\n" + "> +static const struct component_master_ops mtk_disp_ovlsys_adaptor_master_ops = {\r\n" + "> +.bind= mtk_disp_ovlsys_adaptor_master_bind,\r\n" + "> +.unbind= mtk_disp_ovlsys_adaptor_master_unbind,\r\n" + "> +};\r\n" + "> +\r\n" + "> +static const struct mtk_disp_ovlsys_adaptor 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 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 *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 = 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 = 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, &mtk_disp_ovlsys_adaptor_master_ops, match);\r\n" + "> +\r\n" + "> +pm_runtime_enable(dev);\r\n" + "> +\r\n" + "> +ret = component_add(dev, &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", 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 *pdev)\r\n" + "> +{\r\n" + "> +component_master_del(&pdev->dev, &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 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 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 *private, int comp_id)\r\n" + "> +{\r\n" + "> +const struct mtk_mmsys_driver_data *drv_data = private->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 *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 component and separate this to another patch.\r\n" + "\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 platform_device *pdev)\r\n" + ">  component_match_add(dev, &match, compare_dev, &ovl_adaptor->dev);\r\n" + ">  }\r\n" + ">  \r\n" + "> +if (mtk_drm_find_mmsys_comp(private, 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, DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0);\r\n" + "> +ovl_adaptor =\r\n" + "> +platform_device_register_data(dev, "mediatek-disp-ovlsys-adaptor",\r\n" + "> +      PLATFORM_DEVID_AUTO,\r\n" + "> +      (void *)&ovlsys_priv,\r\n" + "> +      sizeof(struct mtk_drm_ovlsys_private));\r\n" + "> +private->ddp_comp[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0].dev = &ovl_adaptor->dev;\r\n" + "> +mtk_ddp_comp_init(NULL, &private->ddp_comp[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0],\r\n" + "> +  DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0);\r\n" + "> +component_match_add(dev, &match, compare_dev, &ovl_adaptor->dev);\r\n" + "> +}\r\n" + "> +\r\n" + "> +if (mtk_drm_find_mmsys_comp(private, 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, DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1);\r\n" + "> +ovl_adaptor =\r\n" + "> +platform_device_register_data(dev, "mediatek-disp-ovlsys-adaptor",\r\n" + "> +      PLATFORM_DEVID_AUTO,\r\n" + "> +      (void *)&ovlsys_priv,\r\n" + "> +      sizeof(struct mtk_drm_ovlsys_private));\r\n" + "> +private->ddp_comp[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1].dev = &ovl_adaptor->dev;\r\n" + "> +mtk_ddp_comp_init(NULL, &private->ddp_comp[DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1],\r\n" + "> +  DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1);\r\n" + "> +component_match_add(dev, &match, compare_dev, &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 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 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 + 1)\r\n" + "> +#define DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0 (DDP_COMPONENT_DRM_OVL_ADAPTOR + 1)\r\n" + "> +#define DDP_COMPONENT_DRM_OVLSYS_ADAPTOR1 (DDP_COMPONENT_DRM_OVLSYS_ADAPTOR0 + 1)\r\n" + "> +#define DDP_COMPONENT_DRM_ID_MAX (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" + "> +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 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" + "</pre>\r\n" + "</p></body></html><!--type:text--><!--{--><pre>************* MEDIATEK Confidentiality Notice\r\n" + " ********************\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" + " \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><!--}--> -d1526ced8493853d14c9622c584e81132c4a710b3a74535ecd0874b5ef2dc8c1 +0ae66f1c2474df620a3d9b0fc54e50d5c8ad0b0c71f6c8c5020d199b35f4d869
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.