devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH v17 07/21] soc: mediatek: mmsys: modify reset controller for MT8195 vdosys1
       [not found] ` <20220416020749.29010-8-nancy.lin@mediatek.com>
@ 2022-04-22 11:37   ` Matthias Brugger
  0 siblings, 0 replies; 8+ messages in thread
From: Matthias Brugger @ 2022-04-22 11:37 UTC (permalink / raw)
  To: Nancy.Lin, Rob Herring, Chun-Kuang Hu, Philipp Zabel, wim,
	AngeloGioacchino Del Regno, linux
  Cc: David Airlie, Daniel Vetter, Nathan Chancellor, Nick Desaulniers,
	jason-jh . lin, Yongqiang Niu, devicetree, linux-kernel,
	linux-arm-kernel, linux-mediatek, dri-devel, llvm, singo.chang,
	srv_heupstream, Project_Global_Chrome_Upstream_Group



On 16/04/2022 04:07, Nancy.Lin wrote:
> MT8195 vdosys1 has more than 32 reset bits and a different reset base
> than other chips. Modify mmsys for support 64 bit and different reset
> base.
> 
> Signed-off-by: Nancy.Lin <nancy.lin@mediatek.com>
> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> ---
>   drivers/soc/mediatek/mt8195-mmsys.h |  1 +
>   drivers/soc/mediatek/mtk-mmsys.c    | 39 ++++++++++++++++++-----------
>   drivers/soc/mediatek/mtk-mmsys.h    |  1 +
>   3 files changed, 27 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/soc/mediatek/mt8195-mmsys.h b/drivers/soc/mediatek/mt8195-mmsys.h
> index 5469073e3073..0a286fa5a824 100644
> --- a/drivers/soc/mediatek/mt8195-mmsys.h
> +++ b/drivers/soc/mediatek/mt8195-mmsys.h
> @@ -139,6 +139,7 @@
>   #define MT8195_VDO1_MIXER_SOUT_SEL_IN				0xf68
>   #define MT8195_MIXER_SOUT_SEL_IN_FROM_DISP_MIXER			0
>   
> +#define MT8195_VDO1_SW0_RST_B		0x1d0
>   #define MT8195_VDO1_MERGE0_ASYNC_CFG_WD	0xe30
>   #define MT8195_VDO1_HDRBE_ASYNC_CFG_WD	0xe70
>   #define MT8195_VDO1_HDR_TOP_CFG		0xd00
> diff --git a/drivers/soc/mediatek/mtk-mmsys.c b/drivers/soc/mediatek/mtk-mmsys.c
> index ea04aa2c3840..d7c806f9e494 100644
> --- a/drivers/soc/mediatek/mtk-mmsys.c
> +++ b/drivers/soc/mediatek/mtk-mmsys.c
> @@ -20,6 +20,8 @@
>   #include "mt8195-mmsys.h"
>   #include "mt8365-mmsys.h"
>   
> +#define MMSYS_SW_RESET_PER_REG 32
> +
>   static const struct mtk_mmsys_driver_data mt2701_mmsys_driver_data = {
>   	.clk_driver = "clk-mt2701-mm",
>   	.routes = mmsys_default_routing_table,
> @@ -86,6 +88,7 @@ static const struct mtk_mmsys_driver_data mt8173_mmsys_driver_data = {
>   	.routes = mmsys_default_routing_table,
>   	.num_routes = ARRAY_SIZE(mmsys_default_routing_table),
>   	.sw0_rst_offset = MT8183_MMSYS_SW0_RST_B,
> +	.num_resets = 32,
>   };
>   
>   static const struct mtk_mmsys_match_data mt8173_mmsys_match_data = {
> @@ -100,6 +103,7 @@ static const struct mtk_mmsys_driver_data mt8183_mmsys_driver_data = {
>   	.routes = mmsys_mt8183_routing_table,
>   	.num_routes = ARRAY_SIZE(mmsys_mt8183_routing_table),
>   	.sw0_rst_offset = MT8183_MMSYS_SW0_RST_B,
> +	.num_resets = 32,
>   };
>   
>   static const struct mtk_mmsys_match_data mt8183_mmsys_match_data = {
> @@ -114,6 +118,7 @@ static const struct mtk_mmsys_driver_data mt8186_mmsys_driver_data = {
>   	.routes = mmsys_mt8186_routing_table,
>   	.num_routes = ARRAY_SIZE(mmsys_mt8186_routing_table),
>   	.sw0_rst_offset = MT8186_MMSYS_SW0_RST_B,
> +	.num_resets = 32,
>   };
>   
>   static const struct mtk_mmsys_match_data mt8186_mmsys_match_data = {
> @@ -148,6 +153,8 @@ static const struct mtk_mmsys_driver_data mt8195_vdosys1_driver_data = {
>   	.clk_driver = "clk-mt8195-vdo1",
>   	.routes = mmsys_mt8195_routing_table,
>   	.num_routes = ARRAY_SIZE(mmsys_mt8195_routing_table),
> +	.sw0_rst_offset = MT8195_VDO1_SW0_RST_B,
> +	.num_resets = 64,
>   };
>   
>   static const struct mtk_mmsys_match_data mt8195_mmsys_match_data = {
> @@ -234,18 +241,22 @@ static int mtk_mmsys_reset_update(struct reset_controller_dev *rcdev, unsigned l
>   {
>   	struct mtk_mmsys *mmsys = container_of(rcdev, struct mtk_mmsys, rcdev);
>   	unsigned long flags;
> +	u32 offset;
>   	u32 reg;
>   
> +	offset = (id / MMSYS_SW_RESET_PER_REG) * sizeof(u32);
> +	id = id % MMSYS_SW_RESET_PER_REG;
> +
>   	spin_lock_irqsave(&mmsys->lock, flags);
>   
> -	reg = readl_relaxed(mmsys->regs + mmsys->data->sw0_rst_offset);
> +	reg = readl_relaxed(mmsys->regs + mmsys->data->sw0_rst_offset + offset);
>   
>   	if (assert)
>   		reg &= ~BIT(id);
>   	else
>   		reg |= BIT(id);
>   
> -	writel_relaxed(reg, mmsys->regs + mmsys->data->sw0_rst_offset);
> +	writel_relaxed(reg, mmsys->regs + mmsys->data->sw0_rst_offset + offset);
>   
>   	spin_unlock_irqrestore(&mmsys->lock, flags);
>   
> @@ -360,18 +371,6 @@ static int mtk_mmsys_probe(struct platform_device *pdev)
>   		return ret;
>   	}
>   
> -	spin_lock_init(&mmsys->lock);
> -
> -	mmsys->rcdev.owner = THIS_MODULE;
> -	mmsys->rcdev.nr_resets = 32;
> -	mmsys->rcdev.ops = &mtk_mmsys_reset_ops;
> -	mmsys->rcdev.of_node = pdev->dev.of_node;
> -	ret = devm_reset_controller_register(&pdev->dev, &mmsys->rcdev);
> -	if (ret) {
> -		dev_err(&pdev->dev, "Couldn't register mmsys reset controller: %d\n", ret);
> -		return ret;
> -	}
> -

I'm not sure why you move that code block. It's not explained in the commit message.

Regards,
Matthias

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v17 06/21] soc: mediatek: add cmdq support of mtk-mmsys config API for mt8195 vdosys1
       [not found] ` <20220416020749.29010-7-nancy.lin@mediatek.com>
@ 2022-04-22 11:37   ` Matthias Brugger
  0 siblings, 0 replies; 8+ messages in thread
From: Matthias Brugger @ 2022-04-22 11:37 UTC (permalink / raw)
  To: Nancy.Lin, Rob Herring, Chun-Kuang Hu, Philipp Zabel, wim,
	AngeloGioacchino Del Regno, linux
  Cc: David Airlie, Daniel Vetter, Nathan Chancellor, Nick Desaulniers,
	jason-jh . lin, Yongqiang Niu, devicetree, linux-kernel,
	linux-arm-kernel, linux-mediatek, dri-devel, llvm, singo.chang,
	srv_heupstream, Project_Global_Chrome_Upstream_Group



On 16/04/2022 04:07, Nancy.Lin wrote:
> Add cmdq support for mtk-mmsys config API.
> The mmsys config register settings need to take effect with the other
> HW settings(like OVL_ADAPTOR...) at the same vblanking time.
> 
> If we use CPU to write the mmsys reg, we can't guarantee all the
> settings can be written in the same vblanking time.
> Cmdq is used for this purpose. We prepare all the related HW settings
> in one cmdq packet. The first command in the packet is "wait stream done",
> and then following with all the HW settings. After the cmdq packet is
> flush to GCE HW. The GCE waits for the "stream done event" to coming
> and then starts flushing all the HW settings. This can guarantee all
> the settings flush in the same vblanking.
> 
> Signed-off-by: Nancy.Lin <nancy.lin@mediatek.com>
> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> ---
>   drivers/soc/mediatek/mtk-mmsys.c       | 50 ++++++++++++++++++--------
>   include/linux/soc/mediatek/mtk-mmsys.h | 15 +++++---
>   2 files changed, 47 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/soc/mediatek/mtk-mmsys.c b/drivers/soc/mediatek/mtk-mmsys.c
> index 7b262cefef85..ea04aa2c3840 100644
> --- a/drivers/soc/mediatek/mtk-mmsys.c
> +++ b/drivers/soc/mediatek/mtk-mmsys.c
> @@ -177,6 +177,7 @@ struct mtk_mmsys {
>   	spinlock_t lock; /* protects mmsys_sw_rst_b reg */
>   	struct reset_controller_dev rcdev;
>   	phys_addr_t io_start;
> +	struct cmdq_client_reg cmdq_base;
>   };
>   
>   static int mtk_mmsys_find_match_drvdata(struct mtk_mmsys *mmsys,
> @@ -280,46 +281,61 @@ static const struct reset_control_ops mtk_mmsys_reset_ops = {
>   	.reset = mtk_mmsys_reset,
>   };
>   
> -static void mtk_mmsys_write_reg(struct device *dev, u32 offset, u32 mask, u32 val)
> +static void mtk_mmsys_write_reg(struct device *dev, u32 offset, u32 mask, u32 val,
> +				struct cmdq_pkt *cmdq_pkt)
>   {
>   	struct mtk_mmsys *mmsys = dev_get_drvdata(dev);
>   	u32 tmp;
>   
> -	tmp = readl(mmsys->regs + offset);
> -	tmp = (tmp & ~mask) | val;
> -	writel(tmp, mmsys->regs + offset);
> +#if IS_REACHABLE(CONFIG_MTK_CMDQ)
> +	if (cmdq_pkt && mmsys->cmdq_base.size) {
> +		cmdq_pkt_write_mask(cmdq_pkt, mmsys->cmdq_base.subsys,
> +				    mmsys->cmdq_base.offset + offset, val,
> +				    mask);
If we put here:

    return;
}
#endif

> +	} else {
> +#endif
> +		tmp = readl(mmsys->regs + offset);
> +		tmp = (tmp & ~mask) | val;
> +		writel(tmp, mmsys->regs + offset);
> +#if IS_REACHABLE(CONFIG_MTK_CMDQ)
> +	}
> +#endif

Then we can get rid of this IS_REACHABLE. Other then that patch looks good.

Matthias

>   }
>   
> -void mtk_mmsys_merge_async_config(struct device *dev, int idx, int width, int height)
> +void mtk_mmsys_merge_async_config(struct device *dev, int idx, int width,
> +				  int height, struct cmdq_pkt *cmdq_pkt)
>   {
>   	mtk_mmsys_write_reg(dev, MT8195_VDO1_MERGE0_ASYNC_CFG_WD + 0x10 * idx,
> -			    ~0, height << 16 | width);
> +			    ~0, height << 16 | width, cmdq_pkt);
>   }
>   EXPORT_SYMBOL_GPL(mtk_mmsys_merge_async_config);
>   
> -void mtk_mmsys_hdr_confing(struct device *dev, int be_width, int be_height)
> +void mtk_mmsys_hdr_confing(struct device *dev, int be_width, int be_height,
> +			   struct cmdq_pkt *cmdq_pkt)
>   {
>   	mtk_mmsys_write_reg(dev, MT8195_VDO1_HDRBE_ASYNC_CFG_WD, ~0,
> -			    be_height << 16 | be_width);
> +			    be_height << 16 | be_width, cmdq_pkt);
>   }
>   EXPORT_SYMBOL_GPL(mtk_mmsys_hdr_confing);
>   
>   void mtk_mmsys_mixer_in_config(struct device *dev, int idx, bool alpha_sel, u16 alpha,
> -			       u8 mode, u32 biwidth)
> +			       u8 mode, u32 biwidth, struct cmdq_pkt *cmdq_pkt)
>   {
>   	mtk_mmsys_write_reg(dev, MT8195_VDO1_MIXER_IN1_ALPHA + (idx - 1) * 4, ~0,
> -			    alpha << 16 | alpha);
> +			    alpha << 16 | alpha, cmdq_pkt);
>   	mtk_mmsys_write_reg(dev, MT8195_VDO1_HDR_TOP_CFG, BIT(19 + idx),
> -			    alpha_sel << (19 + idx));
> +			    alpha_sel << (19 + idx), cmdq_pkt);
>   	mtk_mmsys_write_reg(dev, MT8195_VDO1_MIXER_IN1_PAD + (idx - 1) * 4,
> -			    GENMASK(31, 16) | GENMASK(1, 0), biwidth << 16 | mode);
> +			    GENMASK(31, 16) | GENMASK(1, 0),
> +			    biwidth << 16 | mode, cmdq_pkt);
>   }
>   EXPORT_SYMBOL_GPL(mtk_mmsys_mixer_in_config);
>   
> -void mtk_mmsys_mixer_in_channel_swap(struct device *dev, int idx, bool channel_swap)
> +void mtk_mmsys_mixer_in_channel_swap(struct device *dev, int idx, bool channel_swap,
> +				     struct cmdq_pkt *cmdq_pkt)
>   {
>   	mtk_mmsys_write_reg(dev, MT8195_VDO1_MIXER_IN1_PAD + (idx - 1) * 4, BIT(4),
> -			    channel_swap << 4);
> +			    channel_swap << 4, cmdq_pkt);
>   }
>   EXPORT_SYMBOL_GPL(mtk_mmsys_mixer_in_channel_swap);
>   
> @@ -377,6 +393,12 @@ static int mtk_mmsys_probe(struct platform_device *pdev)
>   		mmsys->data = match_data->drv_data[0];
>   	}
>   
> +#if IS_REACHABLE(CONFIG_MTK_CMDQ)
> +	ret = cmdq_dev_get_client_reg(dev, &mmsys->cmdq_base, 0);
> +	if (ret)
> +		dev_dbg(dev, "No mediatek,gce-client-reg!\n");
> +#endif
> +
>   	platform_set_drvdata(pdev, mmsys);
>   
>   	clks = platform_device_register_data(&pdev->dev, mmsys->data->clk_driver,
> diff --git a/include/linux/soc/mediatek/mtk-mmsys.h b/include/linux/soc/mediatek/mtk-mmsys.h
> index fe620929b0f9..7a73305390ba 100644
> --- a/include/linux/soc/mediatek/mtk-mmsys.h
> +++ b/include/linux/soc/mediatek/mtk-mmsys.h
> @@ -6,6 +6,10 @@
>   #ifndef __MTK_MMSYS_H
>   #define __MTK_MMSYS_H
>   
> +#include <linux/mailbox_controller.h>
> +#include <linux/mailbox/mtk-cmdq-mailbox.h>
> +#include <linux/soc/mediatek/mtk-cmdq.h>
> +
>   enum mtk_ddp_comp_id;
>   struct device;
>   
> @@ -73,13 +77,16 @@ void mtk_mmsys_ddp_disconnect(struct device *dev,
>   			      enum mtk_ddp_comp_id cur,
>   			      enum mtk_ddp_comp_id next);
>   
> -void mtk_mmsys_merge_async_config(struct device *dev, int idx, int width, int height);
> +void mtk_mmsys_merge_async_config(struct device *dev, int idx, int width,
> +				  int height, struct cmdq_pkt *cmdq_pkt);
>   
> -void mtk_mmsys_hdr_confing(struct device *dev, int be_width, int be_height);
> +void mtk_mmsys_hdr_confing(struct device *dev, int be_width, int be_height,
> +			   struct cmdq_pkt *cmdq_pkt);
>   
>   void mtk_mmsys_mixer_in_config(struct device *dev, int idx, bool alpha_sel, u16 alpha,
> -			       u8 mode, u32 biwidth);
> +			       u8 mode, u32 biwidth, struct cmdq_pkt *cmdq_pkt);
>   
> -void mtk_mmsys_mixer_in_channel_swap(struct device *dev, int idx, bool channel_swap);
> +void mtk_mmsys_mixer_in_channel_swap(struct device *dev, int idx, bool channel_swap,
> +				     struct cmdq_pkt *cmdq_pkt);
>   
>   #endif /* __MTK_MMSYS_H */

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v17 11/21] drm/mediatek: add display merge start/stop API for cmdq support
       [not found] ` <20220416020749.29010-12-nancy.lin@mediatek.com>
@ 2022-04-22 11:48   ` Matthias Brugger
  2022-04-25 13:32     ` Chun-Kuang Hu
  0 siblings, 1 reply; 8+ messages in thread
From: Matthias Brugger @ 2022-04-22 11:48 UTC (permalink / raw)
  To: Nancy.Lin, Rob Herring, Chun-Kuang Hu, Philipp Zabel, wim,
	AngeloGioacchino Del Regno, linux
  Cc: David Airlie, Daniel Vetter, Nathan Chancellor, Nick Desaulniers,
	jason-jh . lin, Yongqiang Niu, devicetree, linux-kernel,
	linux-arm-kernel, linux-mediatek, dri-devel, llvm, singo.chang,
	srv_heupstream, Project_Global_Chrome_Upstream_Group



On 16/04/2022 04:07, Nancy.Lin wrote:
> Add merge start/stop API for cmdq support. The ovl_adaptor merges
> are configured with each drm plane update. Need to enable/disable
> merge with cmdq making sure all the settings taken effect in the
> same vblank.
> 
> Signed-off-by: Nancy.Lin <nancy.lin@mediatek.com>
> Reviewed-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> ---
>   drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 ++
>   drivers/gpu/drm/mediatek/mtk_disp_merge.c | 20 +++++++++++++++++---
>   2 files changed, 19 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> index 53aa988dde3b..43a412525b75 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> @@ -66,6 +66,8 @@ void mtk_merge_stop(struct device *dev);
>   void mtk_merge_advance_config(struct device *dev, unsigned int l_w, unsigned int r_w,
>   			      unsigned int h, unsigned int vrefresh, unsigned int bpc,
>   			      struct cmdq_pkt *cmdq_pkt);
> +void mtk_merge_start_cmdq(struct device *dev, struct cmdq_pkt *cmdq_pkt);
> +void mtk_merge_stop_cmdq(struct device *dev, struct cmdq_pkt *cmdq_pkt);
>   
>   void mtk_ovl_bgclr_in_on(struct device *dev);
>   void mtk_ovl_bgclr_in_off(struct device *dev);
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_merge.c b/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> index 40da0555416d..c0d9b43b2a66 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> @@ -67,17 +67,31 @@ struct mtk_disp_merge {
>   };
>   
>   void mtk_merge_start(struct device *dev)

Probably not my call, but wouldn't it make sense to enhance mtk_merge_start to 
pass 'struct cmdq_pkt *cmdq_pkt' directly instead of adding this 'adapter'?

In the end this is up to Chun-Kuang.

Regards,
Matthias

> +{
> +	mtk_merge_start_cmdq(dev, NULL);
> +}
> +
> +void mtk_merge_stop(struct device *dev)
>   {
>   	struct mtk_disp_merge *priv = dev_get_drvdata(dev);
>   
> -	writel(MERGE_EN, priv->regs + DISP_REG_MERGE_CTRL);
> +	mtk_merge_stop_cmdq(dev, NULL);
>   }
>   
> -void mtk_merge_stop(struct device *dev)
> +void mtk_merge_start_cmdq(struct device *dev, struct cmdq_pkt *cmdq_pkt)
> +{
> +	struct mtk_disp_merge *priv = dev_get_drvdata(dev);
> +
> +	mtk_ddp_write(cmdq_pkt, 1, &priv->cmdq_reg, priv->regs,
> +		      DISP_REG_MERGE_CTRL);
> +}
> +
> +void mtk_merge_stop_cmdq(struct device *dev, struct cmdq_pkt *cmdq_pkt)
>   {
>   	struct mtk_disp_merge *priv = dev_get_drvdata(dev);
>   
> -	writel(0x0, priv->regs + DISP_REG_MERGE_CTRL);
> +	mtk_ddp_write(cmdq_pkt, 0, &priv->cmdq_reg, priv->regs,
> +		      DISP_REG_MERGE_CTRL);
>   }
>   
>   static void mtk_merge_fifo_setting(struct mtk_disp_merge *priv,

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v17 03/21] dt-bindings: mediatek: add ethdr definition for mt8195
       [not found] ` <20220416020749.29010-4-nancy.lin@mediatek.com>
@ 2022-04-25  9:54   ` Philipp Zabel
  0 siblings, 0 replies; 8+ messages in thread
From: Philipp Zabel @ 2022-04-25  9:54 UTC (permalink / raw)
  To: Nancy.Lin, Rob Herring, Matthias Brugger, Chun-Kuang Hu, wim,
	AngeloGioacchino Del Regno, linux
  Cc: David Airlie, Daniel Vetter, Nathan Chancellor, Nick Desaulniers,
	jason-jh . lin, Yongqiang Niu, devicetree, linux-kernel,
	linux-arm-kernel, linux-mediatek, dri-devel, llvm, singo.chang,
	srv_heupstream, Project_Global_Chrome_Upstream_Group

Hi Nancy,

On Sa, 2022-04-16 at 10:07 +0800, Nancy.Lin wrote:
> Add vdosys1 ETHDR definition.
> 
> Signed-off-by: Nancy.Lin <nancy.lin@mediatek.com>
> Reviewed-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> ---
>  .../display/mediatek/mediatek,ethdr.yaml      | 158 ++++++++++++++++++
>  1 file changed, 158 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml
> 
> diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml b/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml
> new file mode 100644
> index 000000000000..e8303c28a361
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,ethdr.yaml
> @@ -0,0 +1,158 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/display/mediatek/mediatek,ethdr.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Mediatek Ethdr Device Tree Bindings
> +
> +maintainers:
> +  - Chun-Kuang Hu <chunkuang.hu@kernel.org>
> +  - Philipp Zabel <p.zabel@pengutronix.de>
> +
> +description: |
> +  ETHDR is designed for HDR video and graphics conversion in the external display path.
> +  It handles multiple HDR input types and performs tone mapping, color space/color
> +  format conversion, and then combine different layers, output the required HDR or
> +  SDR signal to the subsequent display path. This engine is composed of two video
> +  frontends, two graphic frontends, one video backend and a mixer. ETHDR has two
> +  DMA function blocks, DS and ADL. These two function blocks read the pre-programmed
> +  registers from DRAM and set them to HW in the v-blanking period.
> +
> +properties:
> +  compatible:
> +    items:
> +      - const: mediatek,mt8195-disp-ethdr
> +  reg:
> +    maxItems: 7
> +  reg-names:
> +    items:
> +      - const: mixer
> +      - const: vdo_fe0
> +      - const: vdo_fe1
> +      - const: gfx_fe0
> +      - const: gfx_fe1
> +      - const: vdo_be
> +      - const: adl_ds
> +  interrupts:
> +    minItems: 1
> +  iommus:
> +    description: The compatible property is DMA function blocks.
> +      Should point to the respective IOMMU block with master port as argument,
> +      see Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml for
> +      details.
> +    minItems: 1
> +    maxItems: 2
> +  clocks:
> +    items:
> +      - description: mixer clock
> +      - description: video frontend 0 clock
> +      - description: video frontend 1 clock
> +      - description: graphic frontend 0 clock
> +      - description: graphic frontend 1 clock
> +      - description: video backend clock
> +      - description: autodownload and menuload clock
> +      - description: video frontend 0 async clock
> +      - description: video frontend 1 async clock
> +      - description: graphic frontend 0 async clock
> +      - description: graphic frontend 1 async clock
> +      - description: video backend async clock
> +      - description: ethdr top clock
> +  clock-names:
> +    items:
> +      - const: mixer
> +      - const: vdo_fe0
> +      - const: vdo_fe1
> +      - const: gfx_fe0
> +      - const: gfx_fe1
> +      - const: vdo_be
> +      - const: adl_ds
> +      - const: vdo_fe0_async
> +      - const: vdo_fe1_async
> +      - const: gfx_fe0_async
> +      - const: gfx_fe1_async
> +      - const: vdo_be_async
> +      - const: ethdr_top
> +  power-domains:
> +    maxItems: 1
> +  resets:
> +    maxItems: 5

Please add a reset-names property and name these resets.

regards
Philipp

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v17 13/21] drm/mediatek: add display merge async reset control
       [not found] ` <20220416020749.29010-14-nancy.lin@mediatek.com>
@ 2022-04-25  9:58   ` Philipp Zabel
  0 siblings, 0 replies; 8+ messages in thread
From: Philipp Zabel @ 2022-04-25  9:58 UTC (permalink / raw)
  To: Nancy.Lin, Rob Herring, Matthias Brugger, Chun-Kuang Hu, wim,
	AngeloGioacchino Del Regno, linux
  Cc: David Airlie, Daniel Vetter, Nathan Chancellor, Nick Desaulniers,
	jason-jh . lin, Yongqiang Niu, devicetree, linux-kernel,
	linux-arm-kernel, linux-mediatek, dri-devel, llvm, singo.chang,
	srv_heupstream, Project_Global_Chrome_Upstream_Group

On Sa, 2022-04-16 at 10:07 +0800, Nancy.Lin wrote:
> Add merge async reset control in mtk_merge_stop. Async hw doesn't do self
> reset on each sof signal(start of frame), so need to reset the async to
> clear the hw status for the next merge start.
> 
> Signed-off-by: Nancy.Lin <nancy.lin@mediatek.com>
> Reviewed-by: CK Hu <ck.hu@mediatek.com>
> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> ---
>  drivers/gpu/drm/mediatek/mtk_disp_merge.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_merge.c b/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> index 9dca145cfb71..177473fa8160 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> @@ -8,6 +8,7 @@
>  #include <linux/of_device.h>
>  #include <linux/of_irq.h>
>  #include <linux/platform_device.h>
> +#include <linux/reset.h>
>  #include <linux/soc/mediatek/mtk-cmdq.h>
>  
> 
> 
> 
>  #include "mtk_drm_ddp_comp.h"
> @@ -79,6 +80,9 @@ void mtk_merge_stop(struct device *dev)
>  	struct mtk_disp_merge *priv = dev_get_drvdata(dev);
>  
> 
> 
> 
>  	mtk_merge_stop_cmdq(dev, NULL);
> +
> +	if (priv->async_clk)
> +		device_reset_optional(dev);

To avoid the overhead of looking up the reset control in the device
tree every time, it would be better to request a reset control during
probe using devm_reset_control_get_optional_exclusive(). Here you'd
just call reset_control_reset().

regards
Philipp

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v17 14/21] drm/mediatek: add ETHDR support for MT8195
       [not found] ` <20220416020749.29010-15-nancy.lin@mediatek.com>
@ 2022-04-25 10:00   ` Philipp Zabel
  0 siblings, 0 replies; 8+ messages in thread
From: Philipp Zabel @ 2022-04-25 10:00 UTC (permalink / raw)
  To: Nancy.Lin, Rob Herring, Matthias Brugger, Chun-Kuang Hu, wim,
	AngeloGioacchino Del Regno, linux
  Cc: David Airlie, Daniel Vetter, Nathan Chancellor, Nick Desaulniers,
	jason-jh . lin, Yongqiang Niu, devicetree, linux-kernel,
	linux-arm-kernel, linux-mediatek, dri-devel, llvm, singo.chang,
	srv_heupstream, Project_Global_Chrome_Upstream_Group

On Sa, 2022-04-16 at 10:07 +0800, Nancy.Lin wrote:
> ETHDR is a part of ovl_adaptor.
> ETHDR is designed for HDR video and graphics conversion in the external
> display path. It handles multiple HDR input types and performs tone
> mapping, color space/color format conversion, and then combine
> different layers, output the required HDR or SDR signal to the
> subsequent display path.
> 
> Signed-off-by: Nancy.Lin <nancy.lin@mediatek.com>
> Reviewed-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> ---
[...]
> +static int mtk_ethdr_probe(struct platform_device *pdev)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct mtk_ethdr *priv;
> +	int ret;
> +	int i;
> +
> +	dev_info(dev, "%s+\n", __func__);

Left-over debug statements?

> +
> +	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
> +	if (!priv)
> +		return -ENOMEM;
> +
> +	for (i = 0; i < ETHDR_ID_MAX; i++) {
> +		priv->ethdr_comp[i].dev = dev;
> +		priv->ethdr_comp[i].regs = of_iomap(dev->of_node, i);
> +#if IS_REACHABLE(CONFIG_MTK_CMDQ)
> +		ret = cmdq_dev_get_client_reg(dev,
> +					      &priv->ethdr_comp[i].cmdq_base, i);
> +		if (ret)
> +			dev_dbg(dev, "get mediatek,gce-client-reg fail!\n");
> +#endif
> +		dev_dbg(dev, "[DRM]regs:0x%p, node:%d\n", priv->ethdr_comp[i].regs, i);
> +	}
> +
> +	for (i = 0; i < ETHDR_CLK_NUM; i++)
> +		priv->ethdr_clk[i].id = ethdr_clk_str[i];
> +	ret = devm_clk_bulk_get_optional(dev, ETHDR_CLK_NUM, priv->ethdr_clk);
> +	if (ret)
> +		return ret;
> +
> +	priv->irq = platform_get_irq(pdev, 0);
> +	if (priv->irq < 0)
> +		priv->irq = 0;
> +
> +	if (priv->irq) {
> +		ret = devm_request_irq(dev, priv->irq, mtk_ethdr_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;
> +		}
> +	}
> +
> +	priv->reset_ctl = devm_reset_control_array_get_optional_exclusive(dev);

This is missing error handling. You could use dev_err_probe() here.

regards
Philipp

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v17 11/21] drm/mediatek: add display merge start/stop API for cmdq support
  2022-04-22 11:48   ` [PATCH v17 11/21] drm/mediatek: add display merge start/stop API for cmdq support Matthias Brugger
@ 2022-04-25 13:32     ` Chun-Kuang Hu
  2022-04-25 15:27       ` Matthias Brugger
  0 siblings, 1 reply; 8+ messages in thread
From: Chun-Kuang Hu @ 2022-04-25 13:32 UTC (permalink / raw)
  To: Matthias Brugger
  Cc: Nancy.Lin, Rob Herring, Chun-Kuang Hu, Philipp Zabel, wim,
	AngeloGioacchino Del Regno, linux, David Airlie, Daniel Vetter,
	Nathan Chancellor, Nick Desaulniers, jason-jh . lin,
	Yongqiang Niu, DTML, linux-kernel, Linux ARM,
	moderated list:ARM/Mediatek SoC support, DRI Development, llvm,
	singo.chang, srv_heupstream, Project_Global_Chrome_Upstream_Group

Hi, Matthias:

Matthias Brugger <matthias.bgg@gmail.com> 於 2022年4月22日 週五 下午7:48寫道:
>
>
>
> On 16/04/2022 04:07, Nancy.Lin wrote:
> > Add merge start/stop API for cmdq support. The ovl_adaptor merges
> > are configured with each drm plane update. Need to enable/disable
> > merge with cmdq making sure all the settings taken effect in the
> > same vblank.
> >
> > Signed-off-by: Nancy.Lin <nancy.lin@mediatek.com>
> > Reviewed-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
> > Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> > ---
> >   drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 ++
> >   drivers/gpu/drm/mediatek/mtk_disp_merge.c | 20 +++++++++++++++++---
> >   2 files changed, 19 insertions(+), 3 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > index 53aa988dde3b..43a412525b75 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> > @@ -66,6 +66,8 @@ void mtk_merge_stop(struct device *dev);
> >   void mtk_merge_advance_config(struct device *dev, unsigned int l_w, unsigned int r_w,
> >                             unsigned int h, unsigned int vrefresh, unsigned int bpc,
> >                             struct cmdq_pkt *cmdq_pkt);
> > +void mtk_merge_start_cmdq(struct device *dev, struct cmdq_pkt *cmdq_pkt);
> > +void mtk_merge_stop_cmdq(struct device *dev, struct cmdq_pkt *cmdq_pkt);
> >
> >   void mtk_ovl_bgclr_in_on(struct device *dev);
> >   void mtk_ovl_bgclr_in_off(struct device *dev);
> > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_merge.c b/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> > index 40da0555416d..c0d9b43b2a66 100644
> > --- a/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> > +++ b/drivers/gpu/drm/mediatek/mtk_disp_merge.c
> > @@ -67,17 +67,31 @@ struct mtk_disp_merge {
> >   };
> >
> >   void mtk_merge_start(struct device *dev)
>
> Probably not my call, but wouldn't it make sense to enhance mtk_merge_start to
> pass 'struct cmdq_pkt *cmdq_pkt' directly instead of adding this 'adapter'?

In [1], mtk_merge_start() should match the function prototype of
mtk_ddp_comp_funcs.start, so keep the non-cmdq interface.

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,
};

[1] https://patchwork.kernel.org/project/linux-mediatek/patch/20220419094143.9561-5-jason-jh.lin@mediatek.com/

Regards,
Chun-Kuang.

>
> In the end this is up to Chun-Kuang.
>
> Regards,
> Matthias
>
> > +{
> > +     mtk_merge_start_cmdq(dev, NULL);
> > +}
> > +
> > +void mtk_merge_stop(struct device *dev)
> >   {
> >       struct mtk_disp_merge *priv = dev_get_drvdata(dev);
> >
> > -     writel(MERGE_EN, priv->regs + DISP_REG_MERGE_CTRL);
> > +     mtk_merge_stop_cmdq(dev, NULL);
> >   }
> >
> > -void mtk_merge_stop(struct device *dev)
> > +void mtk_merge_start_cmdq(struct device *dev, struct cmdq_pkt *cmdq_pkt)
> > +{
> > +     struct mtk_disp_merge *priv = dev_get_drvdata(dev);
> > +
> > +     mtk_ddp_write(cmdq_pkt, 1, &priv->cmdq_reg, priv->regs,
> > +                   DISP_REG_MERGE_CTRL);
> > +}
> > +
> > +void mtk_merge_stop_cmdq(struct device *dev, struct cmdq_pkt *cmdq_pkt)
> >   {
> >       struct mtk_disp_merge *priv = dev_get_drvdata(dev);
> >
> > -     writel(0x0, priv->regs + DISP_REG_MERGE_CTRL);
> > +     mtk_ddp_write(cmdq_pkt, 0, &priv->cmdq_reg, priv->regs,
> > +                   DISP_REG_MERGE_CTRL);
> >   }
> >
> >   static void mtk_merge_fifo_setting(struct mtk_disp_merge *priv,

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v17 11/21] drm/mediatek: add display merge start/stop API for cmdq support
  2022-04-25 13:32     ` Chun-Kuang Hu
@ 2022-04-25 15:27       ` Matthias Brugger
  0 siblings, 0 replies; 8+ messages in thread
From: Matthias Brugger @ 2022-04-25 15:27 UTC (permalink / raw)
  To: Chun-Kuang Hu
  Cc: Nancy.Lin, Rob Herring, Philipp Zabel, wim,
	AngeloGioacchino Del Regno, linux, David Airlie, Daniel Vetter,
	Nathan Chancellor, Nick Desaulniers, jason-jh . lin,
	Yongqiang Niu, DTML, linux-kernel, Linux ARM,
	moderated list:ARM/Mediatek SoC support, DRI Development, llvm,
	singo.chang, srv_heupstream, Project_Global_Chrome_Upstream_Group



On 25/04/2022 15:32, Chun-Kuang Hu wrote:
> Hi, Matthias:
> 
> Matthias Brugger <matthias.bgg@gmail.com> 於 2022年4月22日 週五 下午7:48寫道:
>>
>>
>>
>> On 16/04/2022 04:07, Nancy.Lin wrote:
>>> Add merge start/stop API for cmdq support. The ovl_adaptor merges
>>> are configured with each drm plane update. Need to enable/disable
>>> merge with cmdq making sure all the settings taken effect in the
>>> same vblank.
>>>
>>> Signed-off-by: Nancy.Lin <nancy.lin@mediatek.com>
>>> Reviewed-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
>>> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
>>> ---
>>>    drivers/gpu/drm/mediatek/mtk_disp_drv.h   |  2 ++
>>>    drivers/gpu/drm/mediatek/mtk_disp_merge.c | 20 +++++++++++++++++---
>>>    2 files changed, 19 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
>>> index 53aa988dde3b..43a412525b75 100644
>>> --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
>>> +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
>>> @@ -66,6 +66,8 @@ void mtk_merge_stop(struct device *dev);
>>>    void mtk_merge_advance_config(struct device *dev, unsigned int l_w, unsigned int r_w,
>>>                              unsigned int h, unsigned int vrefresh, unsigned int bpc,
>>>                              struct cmdq_pkt *cmdq_pkt);
>>> +void mtk_merge_start_cmdq(struct device *dev, struct cmdq_pkt *cmdq_pkt);
>>> +void mtk_merge_stop_cmdq(struct device *dev, struct cmdq_pkt *cmdq_pkt);
>>>
>>>    void mtk_ovl_bgclr_in_on(struct device *dev);
>>>    void mtk_ovl_bgclr_in_off(struct device *dev);
>>> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_merge.c b/drivers/gpu/drm/mediatek/mtk_disp_merge.c
>>> index 40da0555416d..c0d9b43b2a66 100644
>>> --- a/drivers/gpu/drm/mediatek/mtk_disp_merge.c
>>> +++ b/drivers/gpu/drm/mediatek/mtk_disp_merge.c
>>> @@ -67,17 +67,31 @@ struct mtk_disp_merge {
>>>    };
>>>
>>>    void mtk_merge_start(struct device *dev)
>>
>> Probably not my call, but wouldn't it make sense to enhance mtk_merge_start to
>> pass 'struct cmdq_pkt *cmdq_pkt' directly instead of adding this 'adapter'?
> 
> In [1], mtk_merge_start() should match the function prototype of
> mtk_ddp_comp_funcs.start, so keep the non-cmdq interface.

Well other callbacks, namely config hass cmdq_pkt. So we could change the 
callback in a similar way is was done in
d0afe37f5209 ("drm/mediatek: support CMDQ interface in ddp component")


But as i said it's up to you. You are the maintainer.

Regards,
Matthias

> 
> 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,
> };
> 
> [1] https://patchwork.kernel.org/project/linux-mediatek/patch/20220419094143.9561-5-jason-jh.lin@mediatek.com/
> 
> Regards,
> Chun-Kuang.
> 
>>
>> In the end this is up to Chun-Kuang.
>>
>> Regards,
>> Matthias
>>
>>> +{
>>> +     mtk_merge_start_cmdq(dev, NULL);
>>> +}
>>> +
>>> +void mtk_merge_stop(struct device *dev)
>>>    {
>>>        struct mtk_disp_merge *priv = dev_get_drvdata(dev);
>>>
>>> -     writel(MERGE_EN, priv->regs + DISP_REG_MERGE_CTRL);
>>> +     mtk_merge_stop_cmdq(dev, NULL);
>>>    }
>>>
>>> -void mtk_merge_stop(struct device *dev)
>>> +void mtk_merge_start_cmdq(struct device *dev, struct cmdq_pkt *cmdq_pkt)
>>> +{
>>> +     struct mtk_disp_merge *priv = dev_get_drvdata(dev);
>>> +
>>> +     mtk_ddp_write(cmdq_pkt, 1, &priv->cmdq_reg, priv->regs,
>>> +                   DISP_REG_MERGE_CTRL);
>>> +}
>>> +
>>> +void mtk_merge_stop_cmdq(struct device *dev, struct cmdq_pkt *cmdq_pkt)
>>>    {
>>>        struct mtk_disp_merge *priv = dev_get_drvdata(dev);
>>>
>>> -     writel(0x0, priv->regs + DISP_REG_MERGE_CTRL);
>>> +     mtk_ddp_write(cmdq_pkt, 0, &priv->cmdq_reg, priv->regs,
>>> +                   DISP_REG_MERGE_CTRL);
>>>    }
>>>
>>>    static void mtk_merge_fifo_setting(struct mtk_disp_merge *priv,

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2022-04-25 15:27 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20220416020749.29010-1-nancy.lin@mediatek.com>
     [not found] ` <20220416020749.29010-8-nancy.lin@mediatek.com>
2022-04-22 11:37   ` [PATCH v17 07/21] soc: mediatek: mmsys: modify reset controller for MT8195 vdosys1 Matthias Brugger
     [not found] ` <20220416020749.29010-7-nancy.lin@mediatek.com>
2022-04-22 11:37   ` [PATCH v17 06/21] soc: mediatek: add cmdq support of mtk-mmsys config API for mt8195 vdosys1 Matthias Brugger
     [not found] ` <20220416020749.29010-12-nancy.lin@mediatek.com>
2022-04-22 11:48   ` [PATCH v17 11/21] drm/mediatek: add display merge start/stop API for cmdq support Matthias Brugger
2022-04-25 13:32     ` Chun-Kuang Hu
2022-04-25 15:27       ` Matthias Brugger
     [not found] ` <20220416020749.29010-4-nancy.lin@mediatek.com>
2022-04-25  9:54   ` [PATCH v17 03/21] dt-bindings: mediatek: add ethdr definition for mt8195 Philipp Zabel
     [not found] ` <20220416020749.29010-14-nancy.lin@mediatek.com>
2022-04-25  9:58   ` [PATCH v17 13/21] drm/mediatek: add display merge async reset control Philipp Zabel
     [not found] ` <20220416020749.29010-15-nancy.lin@mediatek.com>
2022-04-25 10:00   ` [PATCH v17 14/21] drm/mediatek: add ETHDR support for MT8195 Philipp Zabel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).