From: Jason-JH Lin <jason-jh.lin@mediatek.com> To: CK Hu <ck.hu@mediatek.com> Cc: <chunkuang.hu@kernel.org>, <matthias.bgg@gmail.com>, <linux-arm-kernel@lists.infradead.org>, <linux-mediatek@lists.infradead.org>, <linux-kernel@vger.kernel.org>, <Project_Global_Chrome_Upstream_Group@mediatek.com>, <fshao@google.com>, <nancy.lin@mediatek.com>, <singo.chang@mediatek.com> Subject: Re: [PATCH v1 16/17] drm/mediatek: add MERGE support for MT8195 Date: Sat, 10 Jul 2021 15:52:02 +0800 [thread overview] Message-ID: <3ff239c9a0174999b2e581b7b72d043a2e706794.camel@mediatek.com> (raw) In-Reply-To: <1625641327.7824.37.camel@mtksdaap41> Hi CK, On Wed, 2021-07-07 at 15:02 +0800, CK Hu wrote: > Hi, Jason: > > On Wed, 2021-07-07 at 12:12 +0800, jason-jh.lin wrote: > > 1. Add MERGE module file. > > 2. Add REG_FLD macro in mtk_dem_crtc header to support > > bitwise register settings. > > > > Signed-off-by: jason-jh.lin <jason-jh.lin@mediatek.com> > > --- > > drivers/gpu/drm/mediatek/Makefile | 1 + > > drivers/gpu/drm/mediatek/mtk_disp_drv.h | 11 + > > drivers/gpu/drm/mediatek/mtk_disp_merge.c | 623 > > ++++++++++++++++++++ > > drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 31 + > > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 16 + > > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 1 + > > drivers/gpu/drm/mediatek/mtk_drm_drv.c | 4 + > > drivers/gpu/drm/mediatek/mtk_drm_drv.h | 1 + > > drivers/soc/mediatek/mtk-mutex.c | 1 + > > include/linux/soc/mediatek/mtk-mmsys.h | 6 + > > 10 files changed, 695 insertions(+) > > create mode 100644 drivers/gpu/drm/mediatek/mtk_disp_merge.c > > > > diff --git a/drivers/gpu/drm/mediatek/Makefile > > b/drivers/gpu/drm/mediatek/Makefile > > index dc54a7a69005..5fd95b9d5aae 100644 > > --- a/drivers/gpu/drm/mediatek/Makefile > > +++ b/drivers/gpu/drm/mediatek/Makefile > > @@ -5,6 +5,7 @@ mediatek-drm-y := mtk_disp_ccorr.o \ > > mtk_disp_gamma.o \ > > mtk_disp_ovl.o \ > > mtk_disp_rdma.o \ > > + mtk_disp_merge.o \ > > mtk_drm_crtc.o \ > > mtk_drm_ddp_comp.o \ > > mtk_drm_drv.o \ > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h > > b/drivers/gpu/drm/mediatek/mtk_disp_drv.h > > index cafd9df2d63b..7fd5260e2a72 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h > > @@ -89,4 +89,15 @@ void mtk_rdma_enable_vblank(struct device *dev, > > void *vblank_cb_data); > > void mtk_rdma_disable_vblank(struct device *dev); > > > > +int mtk_merge_clk_enable(struct device *dev); > > +void mtk_merge_clk_disable(struct device *dev); > > +void mtk_merge_enable_vblank(struct device *dev, > > + void (*vblank_cb)(void *), void *vblank_cb_data); > > +void mtk_merge_disable_vblank(struct device *dev); > > +void mtk_merge_config(struct device *dev, unsigned int width, > > + unsigned int height, unsigned int vrefresh, > > + unsigned int bpc, struct cmdq_pkt *cmdq_pkt); > > +void mtk_merge_start(struct device *dev); > > +void mtk_merge_stop(struct device *dev); > > + > > #endif > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_merge.c > > b/drivers/gpu/drm/mediatek/mtk_disp_merge.c > > new file mode 100644 > > index 000000000000..4867fe3fb93f > > --- /dev/null > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_merge.c > > @@ -0,0 +1,623 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* > > + * Copyright (c) 2019 MediaTek Inc. > > 2021 > OK, I'll fix it. > > + */ > > + > > +#include <linux/clk.h> > > +#include <linux/component.h> > > +#include <linux/of_device.h> > > +#include <linux/of_irq.h> > > +#include <linux/platform_device.h> > > +#include <linux/pm_runtime.h> > > +#include <linux/soc/mediatek/mtk-cmdq.h> > > + > > +#include "mtk_drm_crtc.h" > > +#include "mtk_drm_ddp_comp.h" > > +#include "mtk_drm_drv.h" > > +#include "mtk_disp_drv.h" > > + > > +#define DISP_REG_MERGE_CTRL (0x000) > > +#define FLD_MERGE_EN REG_FLD_MSB_LSB(0, 0) > > #define FLD_MERGE_EN BIT(0) > OK, I'll fix it. > > +#define FLD_MERGE_RST REG_FLD_MSB_LSB(4, 4) > > +#define FLD_MERGE_LR_SWAP REG_FLD_MSB_LSB(8, 8) > > +#define FLD_MERGE_DCM_DIS REG_FLD_MSB_LSB(12, 12) > > + > > +#define DISP_REG_MERGE_WIDTH (0x004) > > +#define FLD_IN_WIDHT_L REG_FLD_MSB_LSB(15, 0) > > #define FLD_IN_WIDHT_L GENMASK(15, 0) > OK, I'll fix it. > > +#define FLD_IN_WIDHT_R REG_FLD_MSB_LSB(31, 16) > > + > > +#define DISP_REG_MERGE_HEIGHT (0x008) > > +#define FLD_IN_HEIGHT REG_FLD_MSB_LSB(15, 0) > > + > > +#define DISP_REG_MERGE_SHADOW_CRTL (0x00c) > > + > > +#define DISP_REG_MERGE_DGB0 (0x010) > > +#define FLD_PIXEL_CNT REG_FLD_MSB_LSB(15, 0) > > +#define FLD_MERGE_STATE REG_FLD_MSB_LSB(17, 16) > > + > > +#define DISP_REG_MERGE_DGB1 (0x014) > > +#define FLD_LINE_CNT REG_FLD_MSB_LSB(15, 0) > > + > > +#define DISP_REG_MERGE_CFG2_0 (0x160) > > + > > +#define DISP_REG_MERGE_CFG2_2 (0x168) > > + > > +#define MT8195_DISP_MERGE_RESET 0x004 > > MT8195_DISP_MERGE_RESET is useless, so remove. > OK, I'll remove it. > > +#define MT8195_DISP_MERGE_CFG_0 0x010 > > +#define MT8195_DISP_MERGE_CFG_1 0x014 > > +#define MT8195_DISP_MERGE_CFG_4 0x020 > > +#define MT8195_DISP_MERGE_CFG_5 0x024 > > +#define MT8195_DISP_MERGE_CFG_8 0x030 > > +#define MT8195_DISP_MERGE_CFG_9 0x034 > > +#define MT8195_DISP_MERGE_CFG_10 0x038 > > +#define MT8195_DISP_MERGE_CFG_11 0x03c > > +#define MT8195_DISP_MERGE_CFG_12 0x040 > > +#define CFG_11_11_1PI_1PO_BYPASS 1 > > +#define CFG_11_11_2PI_2PO_BYPASS 2 > > +#define CFG_10_10_2PI_1PO_BYPASS 3 > > +#define CFG_10_10_2PI_2PO_BYPASS 4 > > +#define CFG_10_10_1PI_1PO_BUF_MODE 5 > > +#define CFG_10_10_1PI_2PO_BUF_MODE 6 > > +#define CFG_10_10_2PI_1PO_BUF_MODE 7 > > +#define CFG_10_10_2PI_2PO_BUF_MODE 8 > > +#define CFG_10_01_1PI_1PO_BUF_MODE 9 > > +#define CFG_10_01_2PI_1PO_BUF_MODE 10 > > +#define CFG_01_10_1PI_1PO_BUF_MODE 11 > > +#define CFG_01_10_1PI_2PO_BUF_MODE 12 > > +#define CFG_01_01_1PI_1PO_BUF_MODE 13 > > +#define CFG_10_11_1PI_1PO_SPLIT 14 > > +#define CFG_10_11_2PI_1PO_SPLIT 15 > > +#define CFG_01_11_1PI_1PO_SPLIT 16 > > +#define CFG_11_10_1PI_1PO_MERGE 17 > > +#define CFG_11_10_1PI_2PO_MERGE 18 > > +#define CFG_10_10_1PI_1PO_TO422 19 > > +#define CFG_10_10_1PI_2PO_TO444 20 > > +#define CFG_10_10_2PI_2PO_TO444 21 > > +#define MT8195_DISP_MERGE_CFG_13 0x044 > > +#define MT8195_DISP_MERGE_CFG_14 0x048 > > +#define MT8195_DISP_MERGE_CFG_15 0x04c > > +#define MT8195_DISP_MERGE_CFG_17 0x054 > > +#define MT8195_DISP_MERGE_CFG_18 0x058 > > +#define MT8195_DISP_MERGE_CFG_19 0x05c > > +#define MT8195_DISP_MERGE_CFG_20 0x060 > > +#define MT8195_DISP_MERGE_CFG_21 0x064 > > +#define MT8195_DISP_MERGE_CFG_22 0x068 > > +#define MT8195_DISP_MERGE_CFG_23 0x06c > > +#define MT8195_DISP_MERGE_CFG_24 0x070 > > +#define MT8195_DISP_MERGE_CFG_25 0x074 > > +#define MT8195_DISP_MERGE_CFG_26 0x078 > > +#define MT8195_DISP_MERGE_CFG_27 0x07c > > +#define MT8195_DISP_MERGE_CFG_28 0x080 > > +#define MT8195_DISP_MERGE_CFG_29 0x084 > > +#define MT8195_DISP_MERGE_CFG_36 0x0a0 > > +#define MT8195_DISP_MERGE_CFG_36_FLD_ULTRA_EN \ > > + REG_FLD(1, 0) > > +#define MT8195_DISP_MERGE_CFG_36_FLD_PREULTRA_EN \ > > + REG_FLD(1, 4) > > +#define MT8195_DISP_MERGE_CFG_36_FLD_HALT_FOR_DVFS_EN \ > > + REG_FLD(1, 8) > > +#define MT8195_DISP_MERGE_CFG_36_VAL_ULTRA_EN(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_36_FLD_ULTRA_EN, val) > > +#define MT8195_DISP_MERGE_CFG_36_VAL_PREULTRA_EN(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_36_FLD_PREULTRA_EN, val) > > +#define MT8195_DISP_MERGE_CFG_36_VAL_HALT_FOR_DVFS_EN(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_36_FLD_HALT_FOR_DVFS_EN, val) > > +#define MT8195_DISP_MERGE_CFG_37 0x0a4 > > +#define MT8195_DISP_MERGE_CFG_37_FLD_BUFFER_MODE \ > > + REG_FLD(2, 0) > > +#define MT8195_DISP_MERGE_CFG_37_VAL_BUFFER_MODE(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_37_FLD_BUFFER_MODE, val) > > +#define MT8195_DISP_MERGE_CFG_38 0x0a8 > > +#define MT8195_DISP_MERGE_CFG_38_FLD_VDE_BLOCK_ULTRA \ > > + REG_FLD(1, 0) > > +#define MT8195_DISP_MERGE_CFG_38_FLD_VALID_TH_BLOCK_ULTRA \ > > + REG_FLD(1, 4) > > +#define MT8195_DISP_MERGE_CFG_38_FLD_ULTRA_FIFO_VALID_TH \ > > + REG_FLD(16, 16) > > +#define MT8195_DISP_MERGE_CFG_38_VAL_VDE_BLOCK_ULTRA(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_38_FLD_VDE_BLOCK_ULTRA, val) > > +#define MT8195_DISP_MERGE_CFG_38_VAL_VALID_TH_BLOCK_ULTRA(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_38_FLD_VALID_TH_BLOCK_ULTRA, > > val) > > +#define MT8195_DISP_MERGE_CFG_38_VAL_ULTRA_FIFO_VALID_TH(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_38_FLD_ULTRA_FIFO_VALID_TH, > > val) > > +#define MT8195_DISP_MERGE_CFG_39 0x0ac > > +#define MT8195_DISP_MERGE_CFG_39_FLD_NVDE_FORCE_PREULTRA \ > > + REG_FLD(1, 8) > > +#define MT8195_DISP_MERGE_CFG_39_FLD_NVALID_TH_FORCE_PREULTRA \ > > + REG_FLD(1, 12) > > +#define MT8195_DISP_MERGE_CFG_39_FLD_PREULTRA_FIFO_VALID_TH \ > > + REG_FLD(16, 16) > > +#define MT8195_DISP_MERGE_CFG_39_VAL_NVDE_FORCE_PREULTRA(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_39_FLD_NVDE_FORCE_PREULTRA, > > val) > > +#define MT8195_DISP_MERGE_CFG_39_VAL_NVALID_TH_FORCE_PREULTRA(val) > > \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_39_FLD_NVALID_TH_FORCE_PREULT > > RA, val) > > +#define MT8195_DISP_MERGE_CFG_39_VAL_PREULTRA_FIFO_VALID_TH(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_39_FLD_PREULTRA_FIFO_VALID_TH > > , val) > > +#define MT8195_DISP_MERGE_CFG_40 0x0b0 > > +#define MT8195_DISP_MERGE_CFG_40_FLD_ULTRA_TH_LOW \ > > + REG_FLD(16, 0) > > +#define MT8195_DISP_MERGE_CFG_40_FLD_ULTRA_TH_HIGH \ > > + REG_FLD(16, 16) > > +#define MT8195_DISP_MERGE_CFG_40_VAL_ULTRA_TH_LOW(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_40_FLD_ULTRA_TH_LOW, (val)) > > +#define MT8195_DISP_MERGE_CFG_40_VAL_ULTRA_TH_HIGH(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_40_FLD_ULTRA_TH_HIGH, val) > > +#define MT8195_DISP_MERGE_CFG_41 0x0b4 > > +#define MT8195_DISP_MERGE_CFG_41_FLD_PREULTRA_TH_LOW \ > > + REG_FLD(16, 0) > > +#define MT8195_DISP_MERGE_CFG_41_FLD_PREULTRA_TH_HIGH \ > > + REG_FLD(16, 16) > > +#define MT8195_DISP_MERGE_CFG_41_VAL_PREULTRA_TH_LOW(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_41_FLD_PREULTRA_TH_LOW, val) > > +#define MT8195_DISP_MERGE_CFG_41_VAL_PREULTRA_TH_HIGH(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_41_FLD_PREULTRA_TH_HIGH, val) > > + > > +struct mtk_disp_merge_data { > > + bool need_golden_setting; > > + enum mtk_ddp_comp_id gs_comp_id; > > +}; > > Now only support mt8195-merge, so remove mtk_disp_merge_data. > OK, I'll remove it. > > + > > +struct mtk_merge_config_struct { > > + unsigned short width_right; > > + unsigned short width_left; > > + unsigned int height; > > + unsigned int fmt; > > + unsigned int mode; > > + unsigned int swap; > > Could you explain this parameter? > The swap parameter is for the MERGE output swapping. Each value in the register MT8195_DISP_MERGE_CFG_10 is decribed below: 5'h01 : RG swap, {R,G,B} -> {G,R,B} 5'h02 : GB swap, {R,G,B} -> {R,B,G} 5'h04 : BR swap, {R,G,B} -> {B,G,R} 5'h08 : RG-GB swap, {R,G,B} -> {B,R,G} 5'h10 : RB-GB swap, {R,G,B} -> {G,B,R} else : No swap > > +}; > > + > > +struct mtk_disp_merge { > > + struct mtk_ddp_comp ddp_comp; > > + struct drm_crtc *crtc; > > I think sub driver should get rid of ddp_comp and crtc. > OK, I'll remove it. > > + struct clk *clk; > > + struct clk *async_clk; > > + void __iomem *regs; > > + struct cmdq_client_reg cmdq_reg; > > + int irq; > > + void (*vblank_cb)(void *data); > > Why implement vblank_cb? For the first patch of one driver, just keep > the basic function. OK, I'll remove it. > > > + void *vblank_cb_data; > > + const struct mtk_disp_merge_data *data; > > +}; > > + > > +static struct mtk_ddp_comp *merge_5_comp; > > Useless, so remove. > OK, I'll remove it. > > + > > +static inline struct mtk_disp_merge *comp_to_merge(struct > > mtk_ddp_comp *comp) > > +{ > > + return container_of(comp, struct mtk_disp_merge, ddp_comp); > > +} > > Useless, so remove. > OK, I'll remove it. > > + > > +void mtk_merge_start(struct device *dev) > > +{ > > + struct mtk_disp_merge *priv = dev_get_drvdata(dev); > > + > > + mtk_ddp_write_mask(NULL, 0x1, &priv->cmdq_reg, priv->regs, > > + DISP_REG_MERGE_CTRL, ~0); > > Your mask is 0xffffffff, use mtk_ddp_write(). > OK, I'll fix it. > > +} > > + > > +void mtk_merge_stop(struct device *dev) > > +{ > > + struct mtk_disp_merge *priv = dev_get_drvdata(dev); > > + > > + mtk_ddp_write_mask(NULL, 0x0, &priv->cmdq_reg, priv->regs, > > + DISP_REG_MERGE_CTRL, ~0); > > Your mask is 0xffffffff, use mtk_ddp_write(). > OK, I'll fix it. > > +} > > + > > +static int mtk_merge_check_params(struct mtk_merge_config_struct > > *merge_config) > > +{ > > + if (!merge_config->height || > > + !merge_config->width_left || !merge_config- > > >width_right) { > > + pr_err("%s:merge input width l(%u) w(%u) h(%u)\n", > > + __func__, merge_config->width_left, > > + merge_config->width_right, merge_config- > > >height); > > + return -EINVAL; > > + } > > + pr_debug("%s:merge input width l(%u) r(%u) height(%u)\n", > > + __func__, merge_config->width_left, > > + merge_config->width_right, merge_config- > > >height); > > + return 0; > > +} > > + > > +static int mtk_merge_golden_setting(struct mtk_disp_merge *priv, > > + struct cmdq_pkt *handle) > > +{ > > + int ultra_en = 1; > > + int preultra_en = 1; > > + int halt_for_dvfs_en = 0; > > + int buffer_mode = 3; > > + int vde_block_ultra = 0; > > + int valid_th_block_ultra = 0; > > + int ultra_fifo_valid_th = 0; > > + int nvde_force_preultra = 0; > > + int nvalid_th_force_preultra = 0; > > + int preultra_fifo_valid_th = 0; > > + int ultra_th_low = 0xe10; > > + int ultra_th_high = 0x12c0; > > + int preultra_th_low = 0x12c0; > > + int preultra_th_high = 0x1518; > > + > > + mtk_ddp_write_mask(handle, > > + MT8195_DISP_MERGE_CFG_36_VAL_ULTRA_EN(ultra_en) | > > + MT8195_DISP_MERGE_CFG_36_VAL_PREULTRA_EN(preultra_en) | > > + MT8195_DISP_MERGE_CFG_36_VAL_HALT_FOR_DVFS_EN(halt_for_ > > dvfs_en), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_36, > > + REG_FLD_MASK(MT8195_DISP_MERGE_CFG_36_FLD_ULTRA_EN) | > > + REG_FLD_MASK(MT8195_DISP_MERGE_CFG_36_FLD_PREULTRA_EN) > > | > > + REG_FLD_MASK(MT8195_DISP_MERGE_CFG_36_FLD_HALT_FOR_DVFS > > _EN)); > > + > > + mtk_ddp_write_mask(handle, > > + MT8195_DISP_MERGE_CFG_37_VAL_BUFFER_MODE(buffer_mode), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_37, > > + REG_FLD_MASK(MT8195_DISP_MERGE_CFG_37_FLD_BUFFER_MODE)) > > ; > > + > > + mtk_ddp_write_mask(handle, > > + MT8195_DISP_MERGE_CFG_38_VAL_VDE_BLOCK_ULTRA > > + (vde_block_ultra) | > > + MT8195_DISP_MERGE_CFG_38_VAL_VALID_TH_BLOCK_ULTRA > > + (valid_th_block_ultra) | > > + MT8195_DISP_MERGE_CFG_38_VAL_ULTRA_FIFO_VALID_TH > > + (ultra_fifo_valid_th), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_38, > > + REG_FLD_MASK > > + (MT8195_DISP_MERGE_CFG_38_FLD_VDE_BLOCK_ULTRA) | > > + REG_FLD_MASK > > + (MT8195_DISP_MERGE_CFG_38_FLD_VALID_TH_BLOCK_ULTRA) | > > + REG_FLD_MASK > > + (MT8195_DISP_MERGE_CFG_38_FLD_ULTRA_FIFO_VALID_TH)); > > + > > + mtk_ddp_write_mask(handle, > > + MT8195_DISP_MERGE_CFG_39_VAL_NVDE_FORCE_PREULTRA > > + (nvde_force_preultra) | > > + MT8195_DISP_MERGE_CFG_39_VAL_NVALID_TH_FORCE_PREULTRA > > + (nvalid_th_force_preultra) | > > + MT8195_DISP_MERGE_CFG_39_VAL_PREULTRA_FIFO_VALID_TH > > + (preultra_fifo_valid_th), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_39, > > + REG_FLD_MASK > > + (MT8195_DISP_MERGE_CFG_39_FLD_NVDE_FORCE_PREULTRA) | > > + REG_FLD_MASK > > + (MT8195_DISP_MERGE_CFG_39_FLD_NVALID_TH_FORCE_PREULTRA) > > | > > + REG_FLD_MASK > > + (MT8195_DISP_MERGE_CFG_39_FLD_PREULTRA_FIFO_VALID_TH)); > > + > > + mtk_ddp_write_mask(handle, > > + MT8195_DISP_MERGE_CFG_40_VAL_ULTRA_TH_LOW(ultra_th_low) > > | > > + MT8195_DISP_MERGE_CFG_40_VAL_ULTRA_TH_HIGH(ultra_th_hig > > h), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_40, > > + REG_FLD_MASK(MT8195_DISP_MERGE_CFG_40_FLD_ULTRA_TH_LOW) > > | > > + REG_FLD_MASK(MT8195_DISP_MERGE_CFG_40_FLD_ULTRA_TH_HIGH > > )); > > + > > + mtk_ddp_write_mask(handle, > > + MT8195_DISP_MERGE_CFG_41_VAL_PREULTRA_TH_LOW(preultra_t > > h_low) | > > + MT8195_DISP_MERGE_CFG_41_VAL_PREULTRA_TH_HIGH(preultra_ > > th_high), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_41, > > + REG_FLD_MASK(MT8195_DISP_MERGE_CFG_41_FLD_PREULTRA_TH_L > > OW) | > > + REG_FLD_MASK(MT8195_DISP_MERGE_CFG_41_FLD_PREULTRA_TH_H > > IGH)); > > + > > + return 0; > > +} > > + > > +void mtk_merge_config(struct device *dev, unsigned int w, > > + unsigned int h, unsigned int > > vrefresh, > > + unsigned int bpc, struct cmdq_pkt > > *handle) > > +{ > > + struct mtk_merge_config_struct merge_config; > > + struct mtk_disp_merge *priv = dev_get_drvdata(dev); > > + struct mtk_ddp_comp *comp = &priv->ddp_comp; > > + > > + /*golden setting*/ > > + if (priv->data) { > > + if (priv->data->need_golden_setting && > > + priv->data->gs_comp_id == comp->id) > > + mtk_merge_golden_setting(priv, handle); > > + } > > + > > + switch (comp->id) { > > + case DDP_COMPONENT_MERGE0: > > + merge_config.mode = CFG_10_10_1PI_2PO_BUF_MODE; > > + merge_config.width_left = w; > > + merge_config.width_right = w; > > + merge_config.height = h; > > + merge_config.swap = 0; > > + break; > > + case DDP_COMPONENT_MERGE5: > > + merge_config.mode = CFG_10_10_2PI_2PO_BUF_MODE; > > + merge_config.width_left = w; > > + merge_config.width_right = w; > > + merge_config.height = h; > > + merge_config.swap = 0; > > + break; > > + default: > > + pr_err("No find component merge %d\n", comp->id); > > + return; > > + } > > + > > + mtk_merge_check_params(&merge_config); > > + > > + switch (merge_config.mode) { > > + case CFG_10_10_1PI_1PO_BUF_MODE: > > CFG_10_10_1PI_1PO_BUF_MODE is useless, so remove. OK, I'll remove it. > > > + case CFG_10_10_1PI_2PO_BUF_MODE: > > + case CFG_10_10_2PI_2PO_BUF_MODE: > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_left), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_0, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_left), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_4, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_left), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_24, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_left), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_25, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + merge_config.swap, > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_10, 0x1f); > > + break; > > + case CFG_11_10_1PI_2PO_MERGE: > > CFG_11_10_1PI_2PO_MERGE is useless, so remove. > OK, I'll remove it. > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_left), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_0, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_right), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_1, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | w), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_4, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_left), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_24, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_right), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_25, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_left), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_26, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_right), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_27, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + merge_config.swap, > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_10, 0x1f); > > + break; > > + default: > > + break; > > + } > > + mtk_ddp_write_mask(handle, merge_config.mode, > > + &priv->cmdq_reg, priv->regs, MT8195_DISP_MERGE_CFG_12, > > 0x1f); > > + mtk_ddp_write_mask(handle, 0x1, > > + &priv->cmdq_reg, priv->regs, DISP_REG_MERGE_CTRL, 0x1); > > +} > > + > > +int mtk_merge_clk_enable(struct device *dev) > > +{ > > + int ret = 0; > > + struct mtk_disp_merge *priv = dev_get_drvdata(dev); > > + > > + ret = pm_runtime_get_sync(dev); > > + > > + if (priv->clk) { > > + ret = clk_prepare_enable(priv->clk); > > + if (ret) > > + pr_err("merge clk prepare enable failed\n"); > > + } > > + > > + if (priv->async_clk) { > > + ret = clk_prepare_enable(priv->async_clk); > > + if (ret) > > + pr_err("async clk prepare enable failed\n"); > > + } > > + > > + return ret; > > +} > > + > > +void mtk_merge_clk_disable(struct device *dev) > > +{ > > + struct mtk_disp_merge *priv = dev_get_drvdata(dev); > > + > > + if (priv->async_clk) > > + clk_disable_unprepare(priv->async_clk); > > + > > + if (priv->clk) > > + clk_disable_unprepare(priv->clk); > > + > > + pm_runtime_put_sync(dev); > > +} > > + > > +void mtk_merge_enable_vblank(struct device *dev, > > + void (*vblank_cb)(void *), > > + void *vblank_cb_data) > > +{ > > + struct mtk_disp_merge *priv = dev_get_drvdata(dev); > > + int irq_frame_done_en = BIT(16); > > + > > + priv->vblank_cb = vblank_cb; > > + priv->vblank_cb_data = vblank_cb_data; > > + > > + writel(irq_frame_done_en, priv->regs + DISP_REG_MERGE_CFG2_0); > > +} > > Useless, so remove. > OK, I'll remove it. > > + > > +void mtk_merge_disable_vblank(struct device *dev) > > +{ > > + struct mtk_disp_merge *priv = dev_get_drvdata(dev); > > + > > + priv->vblank_cb = NULL; > > + priv->vblank_cb_data = NULL; > > + > > + writel(0x0, priv->regs + DISP_REG_MERGE_CFG2_0); > > +} > > Useless, so remove. > OK, I'll remove it. > > + > > +static int mtk_disp_merge_bind(struct device *dev, struct device > > *master, > > + void *data) > > +{ > > + return 0; > > +} > > + > > +static void mtk_disp_merge_unbind(struct device *dev, struct > > device *master, > > + void *data) > > +{ > > +} > > + > > +static irqreturn_t mtk_disp_merge_irq_handler(int irq, void > > *dev_id) > > +{ > > + struct mtk_disp_merge *priv = dev_id; > > + > > + /* Clear frame completion interrupt */ > > + writel(0x1, priv->regs + DISP_REG_MERGE_CFG2_2); > > + writel(0x0, priv->regs + DISP_REG_MERGE_CFG2_2); > > + > > + if (!priv->vblank_cb) > > + return IRQ_NONE; > > + > > + priv->vblank_cb(priv->vblank_cb_data); > > + > > + return IRQ_HANDLED; > > +} > > Useless, so remove. OK, I'll remove it. > > > + > > +static const struct component_ops mtk_disp_merge_component_ops = { > > + .bind = mtk_disp_merge_bind, > > + .unbind = mtk_disp_merge_unbind, > > +}; > > + > > +static int mtk_disp_merge_probe(struct platform_device *pdev) > > +{ > > + struct device *dev = &pdev->dev; > > + struct resource *res; > > + struct mtk_disp_merge *priv; > > + enum mtk_ddp_comp_id comp_id; > > + int ret; > > + > > + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); > > + if (!priv) > > + return -ENOMEM; > > + > > + comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DISP_MERGE); > > + if ((int)comp_id < 0) { > > + dev_err(dev, "Failed to identify by alias: %d\n", > > comp_id); > > + return comp_id; > > + } > > + > > + priv->ddp_comp.id = comp_id; > > + > > + if (comp_id == DDP_COMPONENT_MERGE5) > > + merge_5_comp = &priv->ddp_comp; > > + > > + priv->clk = devm_clk_get(dev, NULL); > > + if (IS_ERR(priv->clk)) { > > + dev_err(dev, "failed to get merge clk\n"); > > + return PTR_ERR(priv->clk); > > + } > > + > > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > + priv->regs = devm_ioremap_resource(dev, res); > > + if (IS_ERR(priv->regs)) { > > + dev_err(dev, "failed to ioremap merge\n"); > > + return PTR_ERR(priv->regs); > > + } > > + > > +#if IS_REACHABLE(CONFIG_MTK_CMDQ) > > + ret = cmdq_dev_get_client_reg(dev, &priv->cmdq_reg, 0); > > + if (ret) > > + dev_dbg(dev, "get mediatek,gce-client-reg fail!\n"); > > +#endif > > + > > + priv->irq = platform_get_irq(pdev, 0); > > + if (priv->irq < 0) > > + priv->irq = 0; > > + > > + priv->async_clk = of_clk_get(dev->of_node, 1); > > From binding document and device tree, there is no async clk, would > you > modify binding document? > > Regards, > CK > The display binding document is no decription for the MERGE module currently. I'll separate it from the display document if it is neccessary. Regards, Jason-JH.Lin > > + if (IS_ERR(priv->async_clk)) { > > + ret = PTR_ERR(priv->async_clk); > > + dev_dbg(dev, "No merge async clock: %d\n", ret); > > + priv->async_clk = NULL; > > + } > > + > > + priv->data = of_device_get_match_data(dev); > > + > > + if (priv->irq) { > > + ret = devm_request_irq(dev, priv->irq, > > + mtk_disp_merge_irq_handler, > > + IRQF_TRIGGER_NONE, > > dev_name(dev), priv); > > + if (ret < 0) { > > + dev_err(dev, "Failed to request irq %d: %d\n", > > + priv->irq, ret); > > + return ret; > > + } > > + } > > + > > + platform_set_drvdata(pdev, priv); > > + > > + pm_runtime_enable(dev); > > + > > + ret = component_add(dev, &mtk_disp_merge_component_ops); > > + if (ret != 0) { > > + dev_err(dev, "Failed to add component: %d\n", ret); > > + pm_runtime_disable(dev); > > + } > > + > > + return ret; > > +} > > + > > +static int mtk_disp_merge_remove(struct platform_device *pdev) > > +{ > > + component_del(&pdev->dev, &mtk_disp_merge_component_ops); > > + > > + pm_runtime_disable(&pdev->dev); > > + > > + return 0; > > +} > > + > > +static const struct mtk_disp_merge_data mt8195_merge_driver_data = > > { > > + .need_golden_setting = true, > > + .gs_comp_id = DDP_COMPONENT_MERGE5, > > +}; > > + > > +static const struct of_device_id mtk_disp_merge_driver_dt_match[] > > = { > > + { > > + .compatible = "mediatek,mt8195-disp-merge", > > + .data = &mt8195_merge_driver_data > > + }, > > + {}, > > +}; > > + > > +MODULE_DEVICE_TABLE(of, mtk_disp_merge_driver_dt_match); > > + > > +struct platform_driver mtk_disp_merge_driver = { > > + .probe = mtk_disp_merge_probe, > > + .remove = mtk_disp_merge_remove, > > + .driver = { > > + .name = "mediatek-disp-merge", > > + .owner = THIS_MODULE, > > + .of_match_table = mtk_disp_merge_driver_dt_match, > > + }, > > +}; > > + > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h > > b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h > > index cb9a36c48d4f..7419cd0fb424 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h > > @@ -14,6 +14,37 @@ > > #define MTK_MAX_BPC 10 > > #define MTK_MIN_BPC 3 > > > > +#define _MASK_SHIFT(val, width, shift) \ > > + (((val) >> (shift)) & ((1 << (width)) - 1)) > > + > > +#define REG_FLD(width, shift) \ > > + ((unsigned int)((((width) & 0xff) << 16) | ((shift) & 0xff))) > > + > > +#define REG_FLD_MSB_LSB(msb, lsb) REG_FLD((msb) - (lsb) + 1, > > (lsb)) > > + > > +#define REG_FLD_WIDTH(field) ((unsigned int)(((field) >> 16) & > > 0xff)) > > + > > +#define REG_FLD_SHIFT(field) ((unsigned int)((field) & 0xff)) > > + > > +#define REG_FLD_MASK(field) \ > > + ((unsigned int)((1ULL << REG_FLD_WIDTH(field)) - 1) \ > > + << REG_FLD_SHIFT(field)) > > + > > +#define REG_FLD_VAL(field, val) \ > > + (((val) << REG_FLD_SHIFT(field)) & REG_FLD_MASK(field)) > > + > > +#define REG_FLD_VAL_GET(field, regval) \ > > + (((regval) & REG_FLD_MASK(field)) >> REG_FLD_SHIFT(field)) > > + > > +#define DISP_REG_GET_FIELD(field, reg32) \ > > + REG_FLD_VAL_GET(field, __raw_readl((unsigned long *)(reg32))) > > + > > +#define SET_VAL_MASK(o_val, o_mask, i_val, i_fld) \ > > + do { \ > > + (o_val) |= ((i_val) << REG_FLD_SHIFT(i_fld)); \ > > + (o_mask) |= (REG_FLD_MASK(i_fld)); \ > > + } while (0) > > + > > void mtk_drm_crtc_commit(struct drm_crtc *crtc); > > int mtk_drm_crtc_create(struct drm_device *drm_dev, > > const enum mtk_ddp_comp_id *path, > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > > b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > > index f154f7c0cd11..2ccf3db1950d 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > > @@ -339,6 +339,14 @@ static const struct mtk_ddp_comp_funcs > > ddp_rdma = { > > .layer_config = mtk_rdma_layer_config, > > }; > > > > +static const struct mtk_ddp_comp_funcs ddp_merge = { > > + .clk_enable = mtk_merge_clk_enable, > > + .clk_disable = mtk_merge_clk_disable, > > + .start = mtk_merge_start, > > + .stop = mtk_merge_stop, > > + .config = mtk_merge_config, > > +}; > > + > > static const struct mtk_ddp_comp_funcs ddp_ufoe = { > > .clk_enable = mtk_ddp_clk_enable, > > .clk_disable = mtk_ddp_clk_disable, > > @@ -362,6 +370,7 @@ static const char * const > > mtk_ddp_comp_stem[MTK_DDP_COMP_TYPE_MAX] = { > > [MTK_DISP_MUTEX] = "mutex", > > [MTK_DISP_OD] = "od", > > [MTK_DISP_BLS] = "bls", > > + [MTK_DISP_MERGE] = "merge", > > }; > > > > struct mtk_ddp_comp_match { > > @@ -397,6 +406,12 @@ static const struct mtk_ddp_comp_match > > mtk_ddp_matches[DDP_COMPONENT_ID_MAX] = { > > [DDP_COMPONENT_RDMA0] = { MTK_DISP_RDMA, 0, > > &ddp_rdma }, > > [DDP_COMPONENT_RDMA1] = { MTK_DISP_RDMA, 1, > > &ddp_rdma }, > > [DDP_COMPONENT_RDMA2] = { MTK_DISP_RDMA, 2, > > &ddp_rdma }, > > + [DDP_COMPONENT_MERGE0] = { MTK_DISP_MERGE, 0, > > &ddp_merge }, > > + [DDP_COMPONENT_MERGE1] = { MTK_DISP_MERGE, 1, > > &ddp_merge }, > > + [DDP_COMPONENT_MERGE2] = { MTK_DISP_MERGE, 2, > > &ddp_merge }, > > + [DDP_COMPONENT_MERGE3] = { MTK_DISP_MERGE, 3, > > &ddp_merge }, > > + [DDP_COMPONENT_MERGE4] = { MTK_DISP_MERGE, 4, > > &ddp_merge }, > > + [DDP_COMPONENT_MERGE5] = { MTK_DISP_MERGE, 5, > > &ddp_merge }, > > [DDP_COMPONENT_UFOE] = { MTK_DISP_UFOE, 0, > > &ddp_ufoe }, > > [DDP_COMPONENT_WDMA0] = { MTK_DISP_WDMA, 0, NULL }, > > [DDP_COMPONENT_WDMA1] = { MTK_DISP_WDMA, 1, NULL }, > > @@ -515,6 +530,7 @@ int mtk_ddp_comp_init(struct device_node *node, > > struct mtk_ddp_comp *comp, > > type == MTK_DISP_CCORR || > > type == MTK_DISP_COLOR || > > type == MTK_DISP_GAMMA || > > + type == MTK_DISP_MERGE || > > type == MTK_DPI || > > type == MTK_DSI || > > type == MTK_DISP_OVL || > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h > > b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h > > index bb914d976cf5..038775b4531b 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h > > @@ -34,6 +34,7 @@ enum mtk_ddp_comp_type { > > MTK_DISP_MUTEX, > > MTK_DISP_OD, > > MTK_DISP_BLS, > > + MTK_DISP_MERGE, > > MTK_DDP_COMP_TYPE_MAX, > > }; > > > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c > > b/drivers/gpu/drm/mediatek/mtk_drm_drv.c > > index 635cebf9ff0f..f891316008aa 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c > > @@ -462,6 +462,8 @@ static const struct of_device_id > > mtk_ddp_comp_dt_ids[] = { > > .data = (void *)MTK_DISP_DITHER }, > > { .compatible = "mediatek,mt8195-disp-dither", > > .data = (void *)MTK_DISP_DITHER }, > > + { .compatible = "mediatek,mt8195-disp-merge", > > + .data = (void *)MTK_DISP_MERGE }, > > { .compatible = "mediatek,mt8173-disp-ufoe", > > .data = (void *)MTK_DISP_UFOE }, > > { .compatible = "mediatek,mt2701-dsi", > > @@ -579,6 +581,7 @@ static int mtk_drm_probe(struct platform_device > > *pdev) > > if (comp_type == MTK_DISP_CCORR || > > comp_type == MTK_DISP_COLOR || > > comp_type == MTK_DISP_GAMMA || > > + comp_type == MTK_DISP_MERGE || > > comp_type == MTK_DISP_OVL || > > comp_type == MTK_DISP_OVL_2L || > > comp_type == MTK_DISP_RDMA || > > @@ -683,6 +686,7 @@ static struct platform_driver * const > > mtk_drm_drivers[] = { > > &mtk_disp_rdma_driver, > > &mtk_dpi_driver, > > &mtk_drm_platform_driver, > > + &mtk_disp_merge_driver, > > &mtk_dsi_driver, > > }; > > > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h > > b/drivers/gpu/drm/mediatek/mtk_drm_drv.h > > index 637f5669e895..18548a373626 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h > > @@ -51,6 +51,7 @@ extern struct platform_driver > > mtk_disp_color_driver; > > extern struct platform_driver mtk_disp_gamma_driver; > > extern struct platform_driver mtk_disp_ovl_driver; > > extern struct platform_driver mtk_disp_rdma_driver; > > +extern struct platform_driver mtk_disp_merge_driver; > > extern struct platform_driver mtk_dpi_driver; > > extern struct platform_driver mtk_dsi_driver; > > > > diff --git a/drivers/soc/mediatek/mtk-mutex.c > > b/drivers/soc/mediatek/mtk-mutex.c > > index 080bdabfb024..84ece5486902 100644 > > --- a/drivers/soc/mediatek/mtk-mutex.c > > +++ b/drivers/soc/mediatek/mtk-mutex.c > > @@ -284,6 +284,7 @@ static const unsigned int > > mt8195_mutex_mod[DDP_COMPONENT_ID_MAX] = { > > [DDP_COMPONENT_AAL0] = MT8195_MUTEX_MOD_DISP_AAL0, > > [DDP_COMPONENT_GAMMA] = MT8195_MUTEX_MOD_DISP_GAMMA0, > > [DDP_COMPONENT_DITHER] = MT8195_MUTEX_MOD_DISP_DITHER0, > > + [DDP_COMPONENT_MERGE0] = MT8195_MUTEX_MOD_DISP_VPP_MERGE, > > [DDP_COMPONENT_DSI0] = MT8195_MUTEX_MOD_DISP_DSI0, > > [DDP_COMPONENT_PWM0] = MT8195_MUTEX_MOD_DISP_PWM0, > > }; > > diff --git a/include/linux/soc/mediatek/mtk-mmsys.h > > b/include/linux/soc/mediatek/mtk-mmsys.h > > index 2228bf6133da..3135ce82a7f7 100644 > > --- a/include/linux/soc/mediatek/mtk-mmsys.h > > +++ b/include/linux/soc/mediatek/mtk-mmsys.h > > @@ -39,6 +39,12 @@ enum mtk_ddp_comp_id { > > DDP_COMPONENT_UFOE, > > DDP_COMPONENT_WDMA0, > > DDP_COMPONENT_WDMA1, > > + DDP_COMPONENT_MERGE0, > > + DDP_COMPONENT_MERGE1, > > + DDP_COMPONENT_MERGE2, > > + DDP_COMPONENT_MERGE3, > > + DDP_COMPONENT_MERGE4, > > + DDP_COMPONENT_MERGE5, > > DDP_COMPONENT_ID_MAX, > > }; > > > > _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek
WARNING: multiple messages have this Message-ID (diff)
From: Jason-JH Lin <jason-jh.lin@mediatek.com> To: CK Hu <ck.hu@mediatek.com> Cc: <chunkuang.hu@kernel.org>, <matthias.bgg@gmail.com>, <linux-arm-kernel@lists.infradead.org>, <linux-mediatek@lists.infradead.org>, <linux-kernel@vger.kernel.org>, <Project_Global_Chrome_Upstream_Group@mediatek.com>, <fshao@google.com>, <nancy.lin@mediatek.com>, <singo.chang@mediatek.com> Subject: Re: [PATCH v1 16/17] drm/mediatek: add MERGE support for MT8195 Date: Sat, 10 Jul 2021 15:52:02 +0800 [thread overview] Message-ID: <3ff239c9a0174999b2e581b7b72d043a2e706794.camel@mediatek.com> (raw) In-Reply-To: <1625641327.7824.37.camel@mtksdaap41> Hi CK, On Wed, 2021-07-07 at 15:02 +0800, CK Hu wrote: > Hi, Jason: > > On Wed, 2021-07-07 at 12:12 +0800, jason-jh.lin wrote: > > 1. Add MERGE module file. > > 2. Add REG_FLD macro in mtk_dem_crtc header to support > > bitwise register settings. > > > > Signed-off-by: jason-jh.lin <jason-jh.lin@mediatek.com> > > --- > > drivers/gpu/drm/mediatek/Makefile | 1 + > > drivers/gpu/drm/mediatek/mtk_disp_drv.h | 11 + > > drivers/gpu/drm/mediatek/mtk_disp_merge.c | 623 > > ++++++++++++++++++++ > > drivers/gpu/drm/mediatek/mtk_drm_crtc.h | 31 + > > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 16 + > > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 1 + > > drivers/gpu/drm/mediatek/mtk_drm_drv.c | 4 + > > drivers/gpu/drm/mediatek/mtk_drm_drv.h | 1 + > > drivers/soc/mediatek/mtk-mutex.c | 1 + > > include/linux/soc/mediatek/mtk-mmsys.h | 6 + > > 10 files changed, 695 insertions(+) > > create mode 100644 drivers/gpu/drm/mediatek/mtk_disp_merge.c > > > > diff --git a/drivers/gpu/drm/mediatek/Makefile > > b/drivers/gpu/drm/mediatek/Makefile > > index dc54a7a69005..5fd95b9d5aae 100644 > > --- a/drivers/gpu/drm/mediatek/Makefile > > +++ b/drivers/gpu/drm/mediatek/Makefile > > @@ -5,6 +5,7 @@ mediatek-drm-y := mtk_disp_ccorr.o \ > > mtk_disp_gamma.o \ > > mtk_disp_ovl.o \ > > mtk_disp_rdma.o \ > > + mtk_disp_merge.o \ > > mtk_drm_crtc.o \ > > mtk_drm_ddp_comp.o \ > > mtk_drm_drv.o \ > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h > > b/drivers/gpu/drm/mediatek/mtk_disp_drv.h > > index cafd9df2d63b..7fd5260e2a72 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h > > @@ -89,4 +89,15 @@ void mtk_rdma_enable_vblank(struct device *dev, > > void *vblank_cb_data); > > void mtk_rdma_disable_vblank(struct device *dev); > > > > +int mtk_merge_clk_enable(struct device *dev); > > +void mtk_merge_clk_disable(struct device *dev); > > +void mtk_merge_enable_vblank(struct device *dev, > > + void (*vblank_cb)(void *), void *vblank_cb_data); > > +void mtk_merge_disable_vblank(struct device *dev); > > +void mtk_merge_config(struct device *dev, unsigned int width, > > + unsigned int height, unsigned int vrefresh, > > + unsigned int bpc, struct cmdq_pkt *cmdq_pkt); > > +void mtk_merge_start(struct device *dev); > > +void mtk_merge_stop(struct device *dev); > > + > > #endif > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_merge.c > > b/drivers/gpu/drm/mediatek/mtk_disp_merge.c > > new file mode 100644 > > index 000000000000..4867fe3fb93f > > --- /dev/null > > +++ b/drivers/gpu/drm/mediatek/mtk_disp_merge.c > > @@ -0,0 +1,623 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* > > + * Copyright (c) 2019 MediaTek Inc. > > 2021 > OK, I'll fix it. > > + */ > > + > > +#include <linux/clk.h> > > +#include <linux/component.h> > > +#include <linux/of_device.h> > > +#include <linux/of_irq.h> > > +#include <linux/platform_device.h> > > +#include <linux/pm_runtime.h> > > +#include <linux/soc/mediatek/mtk-cmdq.h> > > + > > +#include "mtk_drm_crtc.h" > > +#include "mtk_drm_ddp_comp.h" > > +#include "mtk_drm_drv.h" > > +#include "mtk_disp_drv.h" > > + > > +#define DISP_REG_MERGE_CTRL (0x000) > > +#define FLD_MERGE_EN REG_FLD_MSB_LSB(0, 0) > > #define FLD_MERGE_EN BIT(0) > OK, I'll fix it. > > +#define FLD_MERGE_RST REG_FLD_MSB_LSB(4, 4) > > +#define FLD_MERGE_LR_SWAP REG_FLD_MSB_LSB(8, 8) > > +#define FLD_MERGE_DCM_DIS REG_FLD_MSB_LSB(12, 12) > > + > > +#define DISP_REG_MERGE_WIDTH (0x004) > > +#define FLD_IN_WIDHT_L REG_FLD_MSB_LSB(15, 0) > > #define FLD_IN_WIDHT_L GENMASK(15, 0) > OK, I'll fix it. > > +#define FLD_IN_WIDHT_R REG_FLD_MSB_LSB(31, 16) > > + > > +#define DISP_REG_MERGE_HEIGHT (0x008) > > +#define FLD_IN_HEIGHT REG_FLD_MSB_LSB(15, 0) > > + > > +#define DISP_REG_MERGE_SHADOW_CRTL (0x00c) > > + > > +#define DISP_REG_MERGE_DGB0 (0x010) > > +#define FLD_PIXEL_CNT REG_FLD_MSB_LSB(15, 0) > > +#define FLD_MERGE_STATE REG_FLD_MSB_LSB(17, 16) > > + > > +#define DISP_REG_MERGE_DGB1 (0x014) > > +#define FLD_LINE_CNT REG_FLD_MSB_LSB(15, 0) > > + > > +#define DISP_REG_MERGE_CFG2_0 (0x160) > > + > > +#define DISP_REG_MERGE_CFG2_2 (0x168) > > + > > +#define MT8195_DISP_MERGE_RESET 0x004 > > MT8195_DISP_MERGE_RESET is useless, so remove. > OK, I'll remove it. > > +#define MT8195_DISP_MERGE_CFG_0 0x010 > > +#define MT8195_DISP_MERGE_CFG_1 0x014 > > +#define MT8195_DISP_MERGE_CFG_4 0x020 > > +#define MT8195_DISP_MERGE_CFG_5 0x024 > > +#define MT8195_DISP_MERGE_CFG_8 0x030 > > +#define MT8195_DISP_MERGE_CFG_9 0x034 > > +#define MT8195_DISP_MERGE_CFG_10 0x038 > > +#define MT8195_DISP_MERGE_CFG_11 0x03c > > +#define MT8195_DISP_MERGE_CFG_12 0x040 > > +#define CFG_11_11_1PI_1PO_BYPASS 1 > > +#define CFG_11_11_2PI_2PO_BYPASS 2 > > +#define CFG_10_10_2PI_1PO_BYPASS 3 > > +#define CFG_10_10_2PI_2PO_BYPASS 4 > > +#define CFG_10_10_1PI_1PO_BUF_MODE 5 > > +#define CFG_10_10_1PI_2PO_BUF_MODE 6 > > +#define CFG_10_10_2PI_1PO_BUF_MODE 7 > > +#define CFG_10_10_2PI_2PO_BUF_MODE 8 > > +#define CFG_10_01_1PI_1PO_BUF_MODE 9 > > +#define CFG_10_01_2PI_1PO_BUF_MODE 10 > > +#define CFG_01_10_1PI_1PO_BUF_MODE 11 > > +#define CFG_01_10_1PI_2PO_BUF_MODE 12 > > +#define CFG_01_01_1PI_1PO_BUF_MODE 13 > > +#define CFG_10_11_1PI_1PO_SPLIT 14 > > +#define CFG_10_11_2PI_1PO_SPLIT 15 > > +#define CFG_01_11_1PI_1PO_SPLIT 16 > > +#define CFG_11_10_1PI_1PO_MERGE 17 > > +#define CFG_11_10_1PI_2PO_MERGE 18 > > +#define CFG_10_10_1PI_1PO_TO422 19 > > +#define CFG_10_10_1PI_2PO_TO444 20 > > +#define CFG_10_10_2PI_2PO_TO444 21 > > +#define MT8195_DISP_MERGE_CFG_13 0x044 > > +#define MT8195_DISP_MERGE_CFG_14 0x048 > > +#define MT8195_DISP_MERGE_CFG_15 0x04c > > +#define MT8195_DISP_MERGE_CFG_17 0x054 > > +#define MT8195_DISP_MERGE_CFG_18 0x058 > > +#define MT8195_DISP_MERGE_CFG_19 0x05c > > +#define MT8195_DISP_MERGE_CFG_20 0x060 > > +#define MT8195_DISP_MERGE_CFG_21 0x064 > > +#define MT8195_DISP_MERGE_CFG_22 0x068 > > +#define MT8195_DISP_MERGE_CFG_23 0x06c > > +#define MT8195_DISP_MERGE_CFG_24 0x070 > > +#define MT8195_DISP_MERGE_CFG_25 0x074 > > +#define MT8195_DISP_MERGE_CFG_26 0x078 > > +#define MT8195_DISP_MERGE_CFG_27 0x07c > > +#define MT8195_DISP_MERGE_CFG_28 0x080 > > +#define MT8195_DISP_MERGE_CFG_29 0x084 > > +#define MT8195_DISP_MERGE_CFG_36 0x0a0 > > +#define MT8195_DISP_MERGE_CFG_36_FLD_ULTRA_EN \ > > + REG_FLD(1, 0) > > +#define MT8195_DISP_MERGE_CFG_36_FLD_PREULTRA_EN \ > > + REG_FLD(1, 4) > > +#define MT8195_DISP_MERGE_CFG_36_FLD_HALT_FOR_DVFS_EN \ > > + REG_FLD(1, 8) > > +#define MT8195_DISP_MERGE_CFG_36_VAL_ULTRA_EN(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_36_FLD_ULTRA_EN, val) > > +#define MT8195_DISP_MERGE_CFG_36_VAL_PREULTRA_EN(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_36_FLD_PREULTRA_EN, val) > > +#define MT8195_DISP_MERGE_CFG_36_VAL_HALT_FOR_DVFS_EN(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_36_FLD_HALT_FOR_DVFS_EN, val) > > +#define MT8195_DISP_MERGE_CFG_37 0x0a4 > > +#define MT8195_DISP_MERGE_CFG_37_FLD_BUFFER_MODE \ > > + REG_FLD(2, 0) > > +#define MT8195_DISP_MERGE_CFG_37_VAL_BUFFER_MODE(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_37_FLD_BUFFER_MODE, val) > > +#define MT8195_DISP_MERGE_CFG_38 0x0a8 > > +#define MT8195_DISP_MERGE_CFG_38_FLD_VDE_BLOCK_ULTRA \ > > + REG_FLD(1, 0) > > +#define MT8195_DISP_MERGE_CFG_38_FLD_VALID_TH_BLOCK_ULTRA \ > > + REG_FLD(1, 4) > > +#define MT8195_DISP_MERGE_CFG_38_FLD_ULTRA_FIFO_VALID_TH \ > > + REG_FLD(16, 16) > > +#define MT8195_DISP_MERGE_CFG_38_VAL_VDE_BLOCK_ULTRA(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_38_FLD_VDE_BLOCK_ULTRA, val) > > +#define MT8195_DISP_MERGE_CFG_38_VAL_VALID_TH_BLOCK_ULTRA(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_38_FLD_VALID_TH_BLOCK_ULTRA, > > val) > > +#define MT8195_DISP_MERGE_CFG_38_VAL_ULTRA_FIFO_VALID_TH(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_38_FLD_ULTRA_FIFO_VALID_TH, > > val) > > +#define MT8195_DISP_MERGE_CFG_39 0x0ac > > +#define MT8195_DISP_MERGE_CFG_39_FLD_NVDE_FORCE_PREULTRA \ > > + REG_FLD(1, 8) > > +#define MT8195_DISP_MERGE_CFG_39_FLD_NVALID_TH_FORCE_PREULTRA \ > > + REG_FLD(1, 12) > > +#define MT8195_DISP_MERGE_CFG_39_FLD_PREULTRA_FIFO_VALID_TH \ > > + REG_FLD(16, 16) > > +#define MT8195_DISP_MERGE_CFG_39_VAL_NVDE_FORCE_PREULTRA(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_39_FLD_NVDE_FORCE_PREULTRA, > > val) > > +#define MT8195_DISP_MERGE_CFG_39_VAL_NVALID_TH_FORCE_PREULTRA(val) > > \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_39_FLD_NVALID_TH_FORCE_PREULT > > RA, val) > > +#define MT8195_DISP_MERGE_CFG_39_VAL_PREULTRA_FIFO_VALID_TH(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_39_FLD_PREULTRA_FIFO_VALID_TH > > , val) > > +#define MT8195_DISP_MERGE_CFG_40 0x0b0 > > +#define MT8195_DISP_MERGE_CFG_40_FLD_ULTRA_TH_LOW \ > > + REG_FLD(16, 0) > > +#define MT8195_DISP_MERGE_CFG_40_FLD_ULTRA_TH_HIGH \ > > + REG_FLD(16, 16) > > +#define MT8195_DISP_MERGE_CFG_40_VAL_ULTRA_TH_LOW(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_40_FLD_ULTRA_TH_LOW, (val)) > > +#define MT8195_DISP_MERGE_CFG_40_VAL_ULTRA_TH_HIGH(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_40_FLD_ULTRA_TH_HIGH, val) > > +#define MT8195_DISP_MERGE_CFG_41 0x0b4 > > +#define MT8195_DISP_MERGE_CFG_41_FLD_PREULTRA_TH_LOW \ > > + REG_FLD(16, 0) > > +#define MT8195_DISP_MERGE_CFG_41_FLD_PREULTRA_TH_HIGH \ > > + REG_FLD(16, 16) > > +#define MT8195_DISP_MERGE_CFG_41_VAL_PREULTRA_TH_LOW(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_41_FLD_PREULTRA_TH_LOW, val) > > +#define MT8195_DISP_MERGE_CFG_41_VAL_PREULTRA_TH_HIGH(val) \ > > + REG_FLD_VAL(MT8195_DISP_MERGE_CFG_41_FLD_PREULTRA_TH_HIGH, val) > > + > > +struct mtk_disp_merge_data { > > + bool need_golden_setting; > > + enum mtk_ddp_comp_id gs_comp_id; > > +}; > > Now only support mt8195-merge, so remove mtk_disp_merge_data. > OK, I'll remove it. > > + > > +struct mtk_merge_config_struct { > > + unsigned short width_right; > > + unsigned short width_left; > > + unsigned int height; > > + unsigned int fmt; > > + unsigned int mode; > > + unsigned int swap; > > Could you explain this parameter? > The swap parameter is for the MERGE output swapping. Each value in the register MT8195_DISP_MERGE_CFG_10 is decribed below: 5'h01 : RG swap, {R,G,B} -> {G,R,B} 5'h02 : GB swap, {R,G,B} -> {R,B,G} 5'h04 : BR swap, {R,G,B} -> {B,G,R} 5'h08 : RG-GB swap, {R,G,B} -> {B,R,G} 5'h10 : RB-GB swap, {R,G,B} -> {G,B,R} else : No swap > > +}; > > + > > +struct mtk_disp_merge { > > + struct mtk_ddp_comp ddp_comp; > > + struct drm_crtc *crtc; > > I think sub driver should get rid of ddp_comp and crtc. > OK, I'll remove it. > > + struct clk *clk; > > + struct clk *async_clk; > > + void __iomem *regs; > > + struct cmdq_client_reg cmdq_reg; > > + int irq; > > + void (*vblank_cb)(void *data); > > Why implement vblank_cb? For the first patch of one driver, just keep > the basic function. OK, I'll remove it. > > > + void *vblank_cb_data; > > + const struct mtk_disp_merge_data *data; > > +}; > > + > > +static struct mtk_ddp_comp *merge_5_comp; > > Useless, so remove. > OK, I'll remove it. > > + > > +static inline struct mtk_disp_merge *comp_to_merge(struct > > mtk_ddp_comp *comp) > > +{ > > + return container_of(comp, struct mtk_disp_merge, ddp_comp); > > +} > > Useless, so remove. > OK, I'll remove it. > > + > > +void mtk_merge_start(struct device *dev) > > +{ > > + struct mtk_disp_merge *priv = dev_get_drvdata(dev); > > + > > + mtk_ddp_write_mask(NULL, 0x1, &priv->cmdq_reg, priv->regs, > > + DISP_REG_MERGE_CTRL, ~0); > > Your mask is 0xffffffff, use mtk_ddp_write(). > OK, I'll fix it. > > +} > > + > > +void mtk_merge_stop(struct device *dev) > > +{ > > + struct mtk_disp_merge *priv = dev_get_drvdata(dev); > > + > > + mtk_ddp_write_mask(NULL, 0x0, &priv->cmdq_reg, priv->regs, > > + DISP_REG_MERGE_CTRL, ~0); > > Your mask is 0xffffffff, use mtk_ddp_write(). > OK, I'll fix it. > > +} > > + > > +static int mtk_merge_check_params(struct mtk_merge_config_struct > > *merge_config) > > +{ > > + if (!merge_config->height || > > + !merge_config->width_left || !merge_config- > > >width_right) { > > + pr_err("%s:merge input width l(%u) w(%u) h(%u)\n", > > + __func__, merge_config->width_left, > > + merge_config->width_right, merge_config- > > >height); > > + return -EINVAL; > > + } > > + pr_debug("%s:merge input width l(%u) r(%u) height(%u)\n", > > + __func__, merge_config->width_left, > > + merge_config->width_right, merge_config- > > >height); > > + return 0; > > +} > > + > > +static int mtk_merge_golden_setting(struct mtk_disp_merge *priv, > > + struct cmdq_pkt *handle) > > +{ > > + int ultra_en = 1; > > + int preultra_en = 1; > > + int halt_for_dvfs_en = 0; > > + int buffer_mode = 3; > > + int vde_block_ultra = 0; > > + int valid_th_block_ultra = 0; > > + int ultra_fifo_valid_th = 0; > > + int nvde_force_preultra = 0; > > + int nvalid_th_force_preultra = 0; > > + int preultra_fifo_valid_th = 0; > > + int ultra_th_low = 0xe10; > > + int ultra_th_high = 0x12c0; > > + int preultra_th_low = 0x12c0; > > + int preultra_th_high = 0x1518; > > + > > + mtk_ddp_write_mask(handle, > > + MT8195_DISP_MERGE_CFG_36_VAL_ULTRA_EN(ultra_en) | > > + MT8195_DISP_MERGE_CFG_36_VAL_PREULTRA_EN(preultra_en) | > > + MT8195_DISP_MERGE_CFG_36_VAL_HALT_FOR_DVFS_EN(halt_for_ > > dvfs_en), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_36, > > + REG_FLD_MASK(MT8195_DISP_MERGE_CFG_36_FLD_ULTRA_EN) | > > + REG_FLD_MASK(MT8195_DISP_MERGE_CFG_36_FLD_PREULTRA_EN) > > | > > + REG_FLD_MASK(MT8195_DISP_MERGE_CFG_36_FLD_HALT_FOR_DVFS > > _EN)); > > + > > + mtk_ddp_write_mask(handle, > > + MT8195_DISP_MERGE_CFG_37_VAL_BUFFER_MODE(buffer_mode), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_37, > > + REG_FLD_MASK(MT8195_DISP_MERGE_CFG_37_FLD_BUFFER_MODE)) > > ; > > + > > + mtk_ddp_write_mask(handle, > > + MT8195_DISP_MERGE_CFG_38_VAL_VDE_BLOCK_ULTRA > > + (vde_block_ultra) | > > + MT8195_DISP_MERGE_CFG_38_VAL_VALID_TH_BLOCK_ULTRA > > + (valid_th_block_ultra) | > > + MT8195_DISP_MERGE_CFG_38_VAL_ULTRA_FIFO_VALID_TH > > + (ultra_fifo_valid_th), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_38, > > + REG_FLD_MASK > > + (MT8195_DISP_MERGE_CFG_38_FLD_VDE_BLOCK_ULTRA) | > > + REG_FLD_MASK > > + (MT8195_DISP_MERGE_CFG_38_FLD_VALID_TH_BLOCK_ULTRA) | > > + REG_FLD_MASK > > + (MT8195_DISP_MERGE_CFG_38_FLD_ULTRA_FIFO_VALID_TH)); > > + > > + mtk_ddp_write_mask(handle, > > + MT8195_DISP_MERGE_CFG_39_VAL_NVDE_FORCE_PREULTRA > > + (nvde_force_preultra) | > > + MT8195_DISP_MERGE_CFG_39_VAL_NVALID_TH_FORCE_PREULTRA > > + (nvalid_th_force_preultra) | > > + MT8195_DISP_MERGE_CFG_39_VAL_PREULTRA_FIFO_VALID_TH > > + (preultra_fifo_valid_th), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_39, > > + REG_FLD_MASK > > + (MT8195_DISP_MERGE_CFG_39_FLD_NVDE_FORCE_PREULTRA) | > > + REG_FLD_MASK > > + (MT8195_DISP_MERGE_CFG_39_FLD_NVALID_TH_FORCE_PREULTRA) > > | > > + REG_FLD_MASK > > + (MT8195_DISP_MERGE_CFG_39_FLD_PREULTRA_FIFO_VALID_TH)); > > + > > + mtk_ddp_write_mask(handle, > > + MT8195_DISP_MERGE_CFG_40_VAL_ULTRA_TH_LOW(ultra_th_low) > > | > > + MT8195_DISP_MERGE_CFG_40_VAL_ULTRA_TH_HIGH(ultra_th_hig > > h), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_40, > > + REG_FLD_MASK(MT8195_DISP_MERGE_CFG_40_FLD_ULTRA_TH_LOW) > > | > > + REG_FLD_MASK(MT8195_DISP_MERGE_CFG_40_FLD_ULTRA_TH_HIGH > > )); > > + > > + mtk_ddp_write_mask(handle, > > + MT8195_DISP_MERGE_CFG_41_VAL_PREULTRA_TH_LOW(preultra_t > > h_low) | > > + MT8195_DISP_MERGE_CFG_41_VAL_PREULTRA_TH_HIGH(preultra_ > > th_high), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_41, > > + REG_FLD_MASK(MT8195_DISP_MERGE_CFG_41_FLD_PREULTRA_TH_L > > OW) | > > + REG_FLD_MASK(MT8195_DISP_MERGE_CFG_41_FLD_PREULTRA_TH_H > > IGH)); > > + > > + return 0; > > +} > > + > > +void mtk_merge_config(struct device *dev, unsigned int w, > > + unsigned int h, unsigned int > > vrefresh, > > + unsigned int bpc, struct cmdq_pkt > > *handle) > > +{ > > + struct mtk_merge_config_struct merge_config; > > + struct mtk_disp_merge *priv = dev_get_drvdata(dev); > > + struct mtk_ddp_comp *comp = &priv->ddp_comp; > > + > > + /*golden setting*/ > > + if (priv->data) { > > + if (priv->data->need_golden_setting && > > + priv->data->gs_comp_id == comp->id) > > + mtk_merge_golden_setting(priv, handle); > > + } > > + > > + switch (comp->id) { > > + case DDP_COMPONENT_MERGE0: > > + merge_config.mode = CFG_10_10_1PI_2PO_BUF_MODE; > > + merge_config.width_left = w; > > + merge_config.width_right = w; > > + merge_config.height = h; > > + merge_config.swap = 0; > > + break; > > + case DDP_COMPONENT_MERGE5: > > + merge_config.mode = CFG_10_10_2PI_2PO_BUF_MODE; > > + merge_config.width_left = w; > > + merge_config.width_right = w; > > + merge_config.height = h; > > + merge_config.swap = 0; > > + break; > > + default: > > + pr_err("No find component merge %d\n", comp->id); > > + return; > > + } > > + > > + mtk_merge_check_params(&merge_config); > > + > > + switch (merge_config.mode) { > > + case CFG_10_10_1PI_1PO_BUF_MODE: > > CFG_10_10_1PI_1PO_BUF_MODE is useless, so remove. OK, I'll remove it. > > > + case CFG_10_10_1PI_2PO_BUF_MODE: > > + case CFG_10_10_2PI_2PO_BUF_MODE: > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_left), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_0, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_left), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_4, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_left), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_24, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_left), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_25, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + merge_config.swap, > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_10, 0x1f); > > + break; > > + case CFG_11_10_1PI_2PO_MERGE: > > CFG_11_10_1PI_2PO_MERGE is useless, so remove. > OK, I'll remove it. > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_left), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_0, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_right), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_1, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | w), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_4, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_left), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_24, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_right), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_25, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_left), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_26, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + (merge_config.height << 16 | > > merge_config.width_right), > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_27, ~0); > > + > > + mtk_ddp_write_mask(handle, > > + merge_config.swap, > > + &priv->cmdq_reg, priv->regs, > > + MT8195_DISP_MERGE_CFG_10, 0x1f); > > + break; > > + default: > > + break; > > + } > > + mtk_ddp_write_mask(handle, merge_config.mode, > > + &priv->cmdq_reg, priv->regs, MT8195_DISP_MERGE_CFG_12, > > 0x1f); > > + mtk_ddp_write_mask(handle, 0x1, > > + &priv->cmdq_reg, priv->regs, DISP_REG_MERGE_CTRL, 0x1); > > +} > > + > > +int mtk_merge_clk_enable(struct device *dev) > > +{ > > + int ret = 0; > > + struct mtk_disp_merge *priv = dev_get_drvdata(dev); > > + > > + ret = pm_runtime_get_sync(dev); > > + > > + if (priv->clk) { > > + ret = clk_prepare_enable(priv->clk); > > + if (ret) > > + pr_err("merge clk prepare enable failed\n"); > > + } > > + > > + if (priv->async_clk) { > > + ret = clk_prepare_enable(priv->async_clk); > > + if (ret) > > + pr_err("async clk prepare enable failed\n"); > > + } > > + > > + return ret; > > +} > > + > > +void mtk_merge_clk_disable(struct device *dev) > > +{ > > + struct mtk_disp_merge *priv = dev_get_drvdata(dev); > > + > > + if (priv->async_clk) > > + clk_disable_unprepare(priv->async_clk); > > + > > + if (priv->clk) > > + clk_disable_unprepare(priv->clk); > > + > > + pm_runtime_put_sync(dev); > > +} > > + > > +void mtk_merge_enable_vblank(struct device *dev, > > + void (*vblank_cb)(void *), > > + void *vblank_cb_data) > > +{ > > + struct mtk_disp_merge *priv = dev_get_drvdata(dev); > > + int irq_frame_done_en = BIT(16); > > + > > + priv->vblank_cb = vblank_cb; > > + priv->vblank_cb_data = vblank_cb_data; > > + > > + writel(irq_frame_done_en, priv->regs + DISP_REG_MERGE_CFG2_0); > > +} > > Useless, so remove. > OK, I'll remove it. > > + > > +void mtk_merge_disable_vblank(struct device *dev) > > +{ > > + struct mtk_disp_merge *priv = dev_get_drvdata(dev); > > + > > + priv->vblank_cb = NULL; > > + priv->vblank_cb_data = NULL; > > + > > + writel(0x0, priv->regs + DISP_REG_MERGE_CFG2_0); > > +} > > Useless, so remove. > OK, I'll remove it. > > + > > +static int mtk_disp_merge_bind(struct device *dev, struct device > > *master, > > + void *data) > > +{ > > + return 0; > > +} > > + > > +static void mtk_disp_merge_unbind(struct device *dev, struct > > device *master, > > + void *data) > > +{ > > +} > > + > > +static irqreturn_t mtk_disp_merge_irq_handler(int irq, void > > *dev_id) > > +{ > > + struct mtk_disp_merge *priv = dev_id; > > + > > + /* Clear frame completion interrupt */ > > + writel(0x1, priv->regs + DISP_REG_MERGE_CFG2_2); > > + writel(0x0, priv->regs + DISP_REG_MERGE_CFG2_2); > > + > > + if (!priv->vblank_cb) > > + return IRQ_NONE; > > + > > + priv->vblank_cb(priv->vblank_cb_data); > > + > > + return IRQ_HANDLED; > > +} > > Useless, so remove. OK, I'll remove it. > > > + > > +static const struct component_ops mtk_disp_merge_component_ops = { > > + .bind = mtk_disp_merge_bind, > > + .unbind = mtk_disp_merge_unbind, > > +}; > > + > > +static int mtk_disp_merge_probe(struct platform_device *pdev) > > +{ > > + struct device *dev = &pdev->dev; > > + struct resource *res; > > + struct mtk_disp_merge *priv; > > + enum mtk_ddp_comp_id comp_id; > > + int ret; > > + > > + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); > > + if (!priv) > > + return -ENOMEM; > > + > > + comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DISP_MERGE); > > + if ((int)comp_id < 0) { > > + dev_err(dev, "Failed to identify by alias: %d\n", > > comp_id); > > + return comp_id; > > + } > > + > > + priv->ddp_comp.id = comp_id; > > + > > + if (comp_id == DDP_COMPONENT_MERGE5) > > + merge_5_comp = &priv->ddp_comp; > > + > > + priv->clk = devm_clk_get(dev, NULL); > > + if (IS_ERR(priv->clk)) { > > + dev_err(dev, "failed to get merge clk\n"); > > + return PTR_ERR(priv->clk); > > + } > > + > > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > + priv->regs = devm_ioremap_resource(dev, res); > > + if (IS_ERR(priv->regs)) { > > + dev_err(dev, "failed to ioremap merge\n"); > > + return PTR_ERR(priv->regs); > > + } > > + > > +#if IS_REACHABLE(CONFIG_MTK_CMDQ) > > + ret = cmdq_dev_get_client_reg(dev, &priv->cmdq_reg, 0); > > + if (ret) > > + dev_dbg(dev, "get mediatek,gce-client-reg fail!\n"); > > +#endif > > + > > + priv->irq = platform_get_irq(pdev, 0); > > + if (priv->irq < 0) > > + priv->irq = 0; > > + > > + priv->async_clk = of_clk_get(dev->of_node, 1); > > From binding document and device tree, there is no async clk, would > you > modify binding document? > > Regards, > CK > The display binding document is no decription for the MERGE module currently. I'll separate it from the display document if it is neccessary. Regards, Jason-JH.Lin > > + if (IS_ERR(priv->async_clk)) { > > + ret = PTR_ERR(priv->async_clk); > > + dev_dbg(dev, "No merge async clock: %d\n", ret); > > + priv->async_clk = NULL; > > + } > > + > > + priv->data = of_device_get_match_data(dev); > > + > > + if (priv->irq) { > > + ret = devm_request_irq(dev, priv->irq, > > + mtk_disp_merge_irq_handler, > > + IRQF_TRIGGER_NONE, > > dev_name(dev), priv); > > + if (ret < 0) { > > + dev_err(dev, "Failed to request irq %d: %d\n", > > + priv->irq, ret); > > + return ret; > > + } > > + } > > + > > + platform_set_drvdata(pdev, priv); > > + > > + pm_runtime_enable(dev); > > + > > + ret = component_add(dev, &mtk_disp_merge_component_ops); > > + if (ret != 0) { > > + dev_err(dev, "Failed to add component: %d\n", ret); > > + pm_runtime_disable(dev); > > + } > > + > > + return ret; > > +} > > + > > +static int mtk_disp_merge_remove(struct platform_device *pdev) > > +{ > > + component_del(&pdev->dev, &mtk_disp_merge_component_ops); > > + > > + pm_runtime_disable(&pdev->dev); > > + > > + return 0; > > +} > > + > > +static const struct mtk_disp_merge_data mt8195_merge_driver_data = > > { > > + .need_golden_setting = true, > > + .gs_comp_id = DDP_COMPONENT_MERGE5, > > +}; > > + > > +static const struct of_device_id mtk_disp_merge_driver_dt_match[] > > = { > > + { > > + .compatible = "mediatek,mt8195-disp-merge", > > + .data = &mt8195_merge_driver_data > > + }, > > + {}, > > +}; > > + > > +MODULE_DEVICE_TABLE(of, mtk_disp_merge_driver_dt_match); > > + > > +struct platform_driver mtk_disp_merge_driver = { > > + .probe = mtk_disp_merge_probe, > > + .remove = mtk_disp_merge_remove, > > + .driver = { > > + .name = "mediatek-disp-merge", > > + .owner = THIS_MODULE, > > + .of_match_table = mtk_disp_merge_driver_dt_match, > > + }, > > +}; > > + > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h > > b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h > > index cb9a36c48d4f..7419cd0fb424 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.h > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.h > > @@ -14,6 +14,37 @@ > > #define MTK_MAX_BPC 10 > > #define MTK_MIN_BPC 3 > > > > +#define _MASK_SHIFT(val, width, shift) \ > > + (((val) >> (shift)) & ((1 << (width)) - 1)) > > + > > +#define REG_FLD(width, shift) \ > > + ((unsigned int)((((width) & 0xff) << 16) | ((shift) & 0xff))) > > + > > +#define REG_FLD_MSB_LSB(msb, lsb) REG_FLD((msb) - (lsb) + 1, > > (lsb)) > > + > > +#define REG_FLD_WIDTH(field) ((unsigned int)(((field) >> 16) & > > 0xff)) > > + > > +#define REG_FLD_SHIFT(field) ((unsigned int)((field) & 0xff)) > > + > > +#define REG_FLD_MASK(field) \ > > + ((unsigned int)((1ULL << REG_FLD_WIDTH(field)) - 1) \ > > + << REG_FLD_SHIFT(field)) > > + > > +#define REG_FLD_VAL(field, val) \ > > + (((val) << REG_FLD_SHIFT(field)) & REG_FLD_MASK(field)) > > + > > +#define REG_FLD_VAL_GET(field, regval) \ > > + (((regval) & REG_FLD_MASK(field)) >> REG_FLD_SHIFT(field)) > > + > > +#define DISP_REG_GET_FIELD(field, reg32) \ > > + REG_FLD_VAL_GET(field, __raw_readl((unsigned long *)(reg32))) > > + > > +#define SET_VAL_MASK(o_val, o_mask, i_val, i_fld) \ > > + do { \ > > + (o_val) |= ((i_val) << REG_FLD_SHIFT(i_fld)); \ > > + (o_mask) |= (REG_FLD_MASK(i_fld)); \ > > + } while (0) > > + > > void mtk_drm_crtc_commit(struct drm_crtc *crtc); > > int mtk_drm_crtc_create(struct drm_device *drm_dev, > > const enum mtk_ddp_comp_id *path, > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > > b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > > index f154f7c0cd11..2ccf3db1950d 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > > @@ -339,6 +339,14 @@ static const struct mtk_ddp_comp_funcs > > ddp_rdma = { > > .layer_config = mtk_rdma_layer_config, > > }; > > > > +static const struct mtk_ddp_comp_funcs ddp_merge = { > > + .clk_enable = mtk_merge_clk_enable, > > + .clk_disable = mtk_merge_clk_disable, > > + .start = mtk_merge_start, > > + .stop = mtk_merge_stop, > > + .config = mtk_merge_config, > > +}; > > + > > static const struct mtk_ddp_comp_funcs ddp_ufoe = { > > .clk_enable = mtk_ddp_clk_enable, > > .clk_disable = mtk_ddp_clk_disable, > > @@ -362,6 +370,7 @@ static const char * const > > mtk_ddp_comp_stem[MTK_DDP_COMP_TYPE_MAX] = { > > [MTK_DISP_MUTEX] = "mutex", > > [MTK_DISP_OD] = "od", > > [MTK_DISP_BLS] = "bls", > > + [MTK_DISP_MERGE] = "merge", > > }; > > > > struct mtk_ddp_comp_match { > > @@ -397,6 +406,12 @@ static const struct mtk_ddp_comp_match > > mtk_ddp_matches[DDP_COMPONENT_ID_MAX] = { > > [DDP_COMPONENT_RDMA0] = { MTK_DISP_RDMA, 0, > > &ddp_rdma }, > > [DDP_COMPONENT_RDMA1] = { MTK_DISP_RDMA, 1, > > &ddp_rdma }, > > [DDP_COMPONENT_RDMA2] = { MTK_DISP_RDMA, 2, > > &ddp_rdma }, > > + [DDP_COMPONENT_MERGE0] = { MTK_DISP_MERGE, 0, > > &ddp_merge }, > > + [DDP_COMPONENT_MERGE1] = { MTK_DISP_MERGE, 1, > > &ddp_merge }, > > + [DDP_COMPONENT_MERGE2] = { MTK_DISP_MERGE, 2, > > &ddp_merge }, > > + [DDP_COMPONENT_MERGE3] = { MTK_DISP_MERGE, 3, > > &ddp_merge }, > > + [DDP_COMPONENT_MERGE4] = { MTK_DISP_MERGE, 4, > > &ddp_merge }, > > + [DDP_COMPONENT_MERGE5] = { MTK_DISP_MERGE, 5, > > &ddp_merge }, > > [DDP_COMPONENT_UFOE] = { MTK_DISP_UFOE, 0, > > &ddp_ufoe }, > > [DDP_COMPONENT_WDMA0] = { MTK_DISP_WDMA, 0, NULL }, > > [DDP_COMPONENT_WDMA1] = { MTK_DISP_WDMA, 1, NULL }, > > @@ -515,6 +530,7 @@ int mtk_ddp_comp_init(struct device_node *node, > > struct mtk_ddp_comp *comp, > > type == MTK_DISP_CCORR || > > type == MTK_DISP_COLOR || > > type == MTK_DISP_GAMMA || > > + type == MTK_DISP_MERGE || > > type == MTK_DPI || > > type == MTK_DSI || > > type == MTK_DISP_OVL || > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h > > b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h > > index bb914d976cf5..038775b4531b 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h > > @@ -34,6 +34,7 @@ enum mtk_ddp_comp_type { > > MTK_DISP_MUTEX, > > MTK_DISP_OD, > > MTK_DISP_BLS, > > + MTK_DISP_MERGE, > > MTK_DDP_COMP_TYPE_MAX, > > }; > > > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c > > b/drivers/gpu/drm/mediatek/mtk_drm_drv.c > > index 635cebf9ff0f..f891316008aa 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c > > @@ -462,6 +462,8 @@ static const struct of_device_id > > mtk_ddp_comp_dt_ids[] = { > > .data = (void *)MTK_DISP_DITHER }, > > { .compatible = "mediatek,mt8195-disp-dither", > > .data = (void *)MTK_DISP_DITHER }, > > + { .compatible = "mediatek,mt8195-disp-merge", > > + .data = (void *)MTK_DISP_MERGE }, > > { .compatible = "mediatek,mt8173-disp-ufoe", > > .data = (void *)MTK_DISP_UFOE }, > > { .compatible = "mediatek,mt2701-dsi", > > @@ -579,6 +581,7 @@ static int mtk_drm_probe(struct platform_device > > *pdev) > > if (comp_type == MTK_DISP_CCORR || > > comp_type == MTK_DISP_COLOR || > > comp_type == MTK_DISP_GAMMA || > > + comp_type == MTK_DISP_MERGE || > > comp_type == MTK_DISP_OVL || > > comp_type == MTK_DISP_OVL_2L || > > comp_type == MTK_DISP_RDMA || > > @@ -683,6 +686,7 @@ static struct platform_driver * const > > mtk_drm_drivers[] = { > > &mtk_disp_rdma_driver, > > &mtk_dpi_driver, > > &mtk_drm_platform_driver, > > + &mtk_disp_merge_driver, > > &mtk_dsi_driver, > > }; > > > > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h > > b/drivers/gpu/drm/mediatek/mtk_drm_drv.h > > index 637f5669e895..18548a373626 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h > > +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h > > @@ -51,6 +51,7 @@ extern struct platform_driver > > mtk_disp_color_driver; > > extern struct platform_driver mtk_disp_gamma_driver; > > extern struct platform_driver mtk_disp_ovl_driver; > > extern struct platform_driver mtk_disp_rdma_driver; > > +extern struct platform_driver mtk_disp_merge_driver; > > extern struct platform_driver mtk_dpi_driver; > > extern struct platform_driver mtk_dsi_driver; > > > > diff --git a/drivers/soc/mediatek/mtk-mutex.c > > b/drivers/soc/mediatek/mtk-mutex.c > > index 080bdabfb024..84ece5486902 100644 > > --- a/drivers/soc/mediatek/mtk-mutex.c > > +++ b/drivers/soc/mediatek/mtk-mutex.c > > @@ -284,6 +284,7 @@ static const unsigned int > > mt8195_mutex_mod[DDP_COMPONENT_ID_MAX] = { > > [DDP_COMPONENT_AAL0] = MT8195_MUTEX_MOD_DISP_AAL0, > > [DDP_COMPONENT_GAMMA] = MT8195_MUTEX_MOD_DISP_GAMMA0, > > [DDP_COMPONENT_DITHER] = MT8195_MUTEX_MOD_DISP_DITHER0, > > + [DDP_COMPONENT_MERGE0] = MT8195_MUTEX_MOD_DISP_VPP_MERGE, > > [DDP_COMPONENT_DSI0] = MT8195_MUTEX_MOD_DISP_DSI0, > > [DDP_COMPONENT_PWM0] = MT8195_MUTEX_MOD_DISP_PWM0, > > }; > > diff --git a/include/linux/soc/mediatek/mtk-mmsys.h > > b/include/linux/soc/mediatek/mtk-mmsys.h > > index 2228bf6133da..3135ce82a7f7 100644 > > --- a/include/linux/soc/mediatek/mtk-mmsys.h > > +++ b/include/linux/soc/mediatek/mtk-mmsys.h > > @@ -39,6 +39,12 @@ enum mtk_ddp_comp_id { > > DDP_COMPONENT_UFOE, > > DDP_COMPONENT_WDMA0, > > DDP_COMPONENT_WDMA1, > > + DDP_COMPONENT_MERGE0, > > + DDP_COMPONENT_MERGE1, > > + DDP_COMPONENT_MERGE2, > > + DDP_COMPONENT_MERGE3, > > + DDP_COMPONENT_MERGE4, > > + DDP_COMPONENT_MERGE5, > > DDP_COMPONENT_ID_MAX, > > }; > > > > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2021-07-10 8:03 UTC|newest] Thread overview: 90+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-07-07 4:12 [PATCH v1 00/17] Add MediaTek SoC DRM (vdosys0) support for mt8195 jason-jh.lin 2021-07-07 4:12 ` jason-jh.lin 2021-07-07 4:12 ` [PATCH v1 01/17] dt-bindings: mediatek: add definition for mt8195 display jason-jh.lin 2021-07-07 4:12 ` jason-jh.lin 2021-07-07 4:33 ` CK Hu 2021-07-07 4:33 ` CK Hu 2021-07-10 6:57 ` Jason-JH Lin 2021-07-10 6:57 ` Jason-JH Lin 2021-07-07 4:12 ` [PATCH v1 02/17] dt-bindings: arm: mediatek: add definition for mt8195 mmsys jason-jh.lin 2021-07-07 4:12 ` jason-jh.lin 2021-07-07 4:12 ` [PATCH v1 03/17] arm64: dts: mt8195: add display node for vdosys0 jason-jh.lin 2021-07-07 4:12 ` jason-jh.lin 2021-07-07 4:12 ` [PATCH v1 04/17] soc: mediatek: add mtk-mmsys support for mt8195 vdosys0 jason-jh.lin 2021-07-07 4:12 ` jason-jh.lin 2021-07-07 4:44 ` CK Hu 2021-07-07 4:44 ` CK Hu 2021-07-10 6:58 ` Jason-JH Lin 2021-07-10 6:58 ` Jason-JH Lin 2021-07-07 4:12 ` [PATCH v1 05/17] drm/mediatek: add mediatek-drm of vdosys0 support for MT8195 jason-jh.lin 2021-07-07 4:12 ` jason-jh.lin 2021-07-07 4:48 ` CK Hu 2021-07-07 4:48 ` CK Hu 2021-07-10 6:59 ` Jason-JH Lin 2021-07-10 6:59 ` Jason-JH Lin 2021-07-10 6:59 ` Jason-JH Lin 2021-07-07 4:12 ` [PATCH v1 06/17] soc: mediatek: add mtk-mutex support for mt8195 jason-jh.lin 2021-07-07 4:12 ` jason-jh.lin 2021-07-07 4:52 ` CK Hu 2021-07-07 4:52 ` CK Hu 2021-07-10 7:01 ` Jason-JH Lin 2021-07-10 7:01 ` Jason-JH Lin 2021-07-07 4:12 ` [PATCH v1 07/17] drm/mediatek: add OVL support for MT8195 jason-jh.lin 2021-07-07 4:12 ` jason-jh.lin 2021-07-07 5:03 ` CK Hu 2021-07-07 5:03 ` CK Hu 2021-07-10 7:05 ` Jason-JH Lin 2021-07-10 7:05 ` Jason-JH Lin 2021-07-10 7:05 ` Jason-JH Lin 2021-07-07 4:12 ` [PATCH v1 08/17] drm/mediatek: Add component_del in OVL remove function jason-jh.lin 2021-07-07 4:12 ` jason-jh.lin 2021-07-07 5:12 ` CK Hu 2021-07-07 5:12 ` CK Hu 2021-07-10 7:06 ` Jason-JH Lin 2021-07-10 7:06 ` Jason-JH Lin 2021-07-10 7:06 ` Jason-JH Lin 2021-07-07 4:12 ` [PATCH v1 09/17] drm/mediatek: add OVL support multi-layer jason-jh.lin 2021-07-07 4:12 ` jason-jh.lin 2021-07-07 5:43 ` CK Hu 2021-07-07 5:43 ` CK Hu 2021-07-10 7:17 ` Jason-JH Lin 2021-07-10 7:17 ` Jason-JH Lin 2021-07-10 7:17 ` Jason-JH Lin 2021-07-07 4:12 ` [PATCH v1 10/17] drm/mediatek: add RDMA support for MT8195 jason-jh.lin 2021-07-07 4:12 ` jason-jh.lin 2021-07-07 4:12 ` [PATCH v1 11/17] drm/mediatek: add COLOR " jason-jh.lin 2021-07-07 4:12 ` jason-jh.lin 2021-07-07 6:01 ` CK Hu 2021-07-07 6:01 ` CK Hu 2021-07-10 7:21 ` Jason-JH Lin 2021-07-10 7:21 ` Jason-JH Lin 2021-07-10 7:21 ` Jason-JH Lin 2021-07-07 4:12 ` [PATCH v1 12/17] drm/mediatek: add CCORR " jason-jh.lin 2021-07-07 4:12 ` jason-jh.lin 2021-07-07 6:02 ` CK Hu 2021-07-07 6:02 ` CK Hu 2021-07-10 7:22 ` Jason-JH Lin 2021-07-10 7:22 ` Jason-JH Lin 2021-07-10 7:22 ` Jason-JH Lin 2021-07-07 4:12 ` [PATCH v1 13/17] drm/mediatek: Add AAL " jason-jh.lin 2021-07-07 4:12 ` jason-jh.lin 2021-07-07 6:14 ` CK Hu 2021-07-07 6:14 ` CK Hu 2021-07-10 7:35 ` Jason-JH Lin 2021-07-10 7:35 ` Jason-JH Lin 2021-07-07 4:12 ` [PATCH v1 14/17] drm/mediatek: add GAMMA " jason-jh.lin 2021-07-07 4:12 ` jason-jh.lin 2021-07-07 4:12 ` [PATCH v1 15/17] drm/mediatek: add DITHER " jason-jh.lin 2021-07-07 4:12 ` jason-jh.lin 2021-07-07 4:12 ` [PATCH v1 16/17] drm/mediatek: add MERGE " jason-jh.lin 2021-07-07 4:12 ` jason-jh.lin 2021-07-07 7:02 ` CK Hu 2021-07-07 7:02 ` CK Hu 2021-07-10 7:52 ` Jason-JH Lin [this message] 2021-07-10 7:52 ` Jason-JH Lin 2021-07-07 4:12 ` [PATCH v1 17/17] drm/mediatek: add DSC " jason-jh.lin 2021-07-07 4:12 ` jason-jh.lin 2021-07-07 7:35 ` CK Hu 2021-07-07 7:35 ` CK Hu 2021-07-10 7:55 ` Jason-JH Lin 2021-07-10 7:55 ` Jason-JH Lin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=3ff239c9a0174999b2e581b7b72d043a2e706794.camel@mediatek.com \ --to=jason-jh.lin@mediatek.com \ --cc=Project_Global_Chrome_Upstream_Group@mediatek.com \ --cc=chunkuang.hu@kernel.org \ --cc=ck.hu@mediatek.com \ --cc=fshao@google.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mediatek@lists.infradead.org \ --cc=matthias.bgg@gmail.com \ --cc=nancy.lin@mediatek.com \ --cc=singo.chang@mediatek.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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.