[PATCH v12 1/4] soc: mediatek: mmsys: add CMDQ write register function

CK Hu ck.hu at mediatek.com
Wed Mar 2 23:59:45 PST 2022


Hi, Moudy:

On Tue, 2022-03-01 at 18:02 +0800, Moudy Ho wrote:
> Adding the interface of writing MMSYS register via CMDQ,
> users do not need to parse related dts information.
> 
> Signed-off-by: Moudy Ho <moudy.ho at mediatek.com>
> Reviewed-by: AngeloGioacchino Del Regno <
> angelogioacchino.delregno at collabora.com>
> ---
>  drivers/soc/mediatek/Kconfig           |  1 +
>  drivers/soc/mediatek/mtk-mmsys.c       | 30 ++++++++++++++++
>  drivers/soc/mediatek/mtk-mmsys.h       |  1 +
>  include/linux/soc/mediatek/mtk-mmsys.h | 50
> ++++++++++++++++++++++++++
>  4 files changed, 82 insertions(+)
> 
> diff --git a/drivers/soc/mediatek/Kconfig
> b/drivers/soc/mediatek/Kconfig
> index fdd8bc08569e..172bc7828aca 100644
> --- a/drivers/soc/mediatek/Kconfig
> +++ b/drivers/soc/mediatek/Kconfig
> @@ -69,6 +69,7 @@ config MTK_MMSYS
>  	bool "MediaTek MMSYS Support"
>  	default ARCH_MEDIATEK
>  	depends on HAS_IOMEM
> +	select MTK_CMDQ

In MT8173, mmsys could work without CMDQ, so I think mmsys should not
select CMDQ.

>  	help
>  	  Say yes here to add support for the MediaTek Multimedia
>  	  Subsystem (MMSYS).
> diff --git a/drivers/soc/mediatek/mtk-mmsys.c
> b/drivers/soc/mediatek/mtk-mmsys.c
> index 50c797d70ddd..04c0c7de395e 100644
> --- a/drivers/soc/mediatek/mtk-mmsys.c
> +++ b/drivers/soc/mediatek/mtk-mmsys.c
> @@ -8,9 +8,11 @@
>  #include <linux/device.h>
>  #include <linux/io.h>
>  #include <linux/of_device.h>
> +#include <linux/of_address.h>
>  #include <linux/platform_device.h>
>  #include <linux/reset-controller.h>
>  #include <linux/soc/mediatek/mtk-mmsys.h>
> +#include <linux/soc/mediatek/mtk-cmdq.h>
>  
>  #include "mtk-mmsys.h"
>  #include "mt8167-mmsys.h"
> @@ -55,6 +57,7 @@ static const struct mtk_mmsys_driver_data
> mt8183_mmsys_driver_data = {
>  	.clk_driver = "clk-mt8183-mm",
>  	.routes = mmsys_mt8183_routing_table,
>  	.num_routes = ARRAY_SIZE(mmsys_mt8183_routing_table),
> +	.has_gce_client_reg = true,
>  };
>  
>  static const struct mtk_mmsys_driver_data mt8186_mmsys_driver_data =
> {
> @@ -81,6 +84,8 @@ struct mtk_mmsys {
>  	const struct mtk_mmsys_driver_data *data;
>  	spinlock_t lock; /* protects mmsys_sw_rst_b reg */
>  	struct reset_controller_dev rcdev;
> +	struct cmdq_client_reg cmdq_base;
> +	phys_addr_t addr;
>  };
>  
>  void mtk_mmsys_ddp_connect(struct device *dev,
> @@ -120,6 +125,17 @@ void mtk_mmsys_ddp_disconnect(struct device
> *dev,
>  }
>  EXPORT_SYMBOL_GPL(mtk_mmsys_ddp_disconnect);
>  
> +void mtk_mmsys_write_reg_by_cmdq(struct device *dev,
> +				 struct mmsys_cmdq_cmd *cmd,
> +				 u32 offset, u32 value, u32 mask)

I would like mmsys provide high level interface rather than such low
level interface.

> +{
> +	struct mtk_mmsys *mmsys = dev_get_drvdata(dev);
> +
> +	cmdq_pkt_write_mask(cmd->pkt, mmsys->cmdq_base.subsys,
> +			    mmsys->addr + offset, value, mask);
> +}
> +EXPORT_SYMBOL_GPL(mtk_mmsys_write_reg_by_cmdq);
> +
>  static int mtk_mmsys_reset_update(struct reset_controller_dev
> *rcdev, unsigned long id,
>  				  bool assert)
>  {
> @@ -178,6 +194,7 @@ static int mtk_mmsys_probe(struct platform_device
> *pdev)
>  	struct platform_device *clks;
>  	struct platform_device *drm;
>  	struct mtk_mmsys *mmsys;
> +	struct resource res;
>  	int ret;
>  
>  	mmsys = devm_kzalloc(dev, sizeof(*mmsys), GFP_KERNEL);
> @@ -203,6 +220,19 @@ static int mtk_mmsys_probe(struct
> platform_device *pdev)
>  		return ret;
>  	}
>  
> +	if (of_address_to_resource(dev->of_node, 0, &res) < 0)
> +		mmsys->addr = 0L;
> +	else
> +		mmsys->addr = res.start;
> +
> +	if (mmsys->data->has_gce_client_reg) {
> +		ret = cmdq_dev_get_client_reg(dev, &mmsys->cmdq_base,
> 0);

Add gce client reg in mmsys binding document [1].

[1] 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/devicetree/bindings/arm/mediatek/mediatek,mmsys.yaml?h=v5.17-rc6

> +		if (ret) {
> +			dev_err(dev, "No mediatek,gce-client-reg!\n");
> +			return ret;
> +		}
> +	}
> +
>  	mmsys->data = of_device_get_match_data(&pdev->dev);
>  	platform_set_drvdata(pdev, mmsys);
>  
> diff --git a/drivers/soc/mediatek/mtk-mmsys.h
> b/drivers/soc/mediatek/mtk-mmsys.h
> index 8b0ed05117ea..9fce400507d2 100644
> --- a/drivers/soc/mediatek/mtk-mmsys.h
> +++ b/drivers/soc/mediatek/mtk-mmsys.h
> @@ -92,6 +92,7 @@ struct mtk_mmsys_driver_data {
>  	const char *clk_driver;
>  	const struct mtk_mmsys_routes *routes;
>  	const unsigned int num_routes;
> +	bool has_gce_client_reg;
>  };
>  
>  /*
> diff --git a/include/linux/soc/mediatek/mtk-mmsys.h
> b/include/linux/soc/mediatek/mtk-mmsys.h
> index 4bba275e235a..7f8ecc98d023 100644
> --- a/include/linux/soc/mediatek/mtk-mmsys.h
> +++ b/include/linux/soc/mediatek/mtk-mmsys.h
> @@ -7,8 +7,14 @@
>  #define __MTK_MMSYS_H
>  
>  enum mtk_ddp_comp_id;
> +enum mtk_mdp_comp_id;
>  struct device;
>  
> +struct mmsys_cmdq_cmd {
> +	struct cmdq_pkt *pkt;
> +	s32 *event;
> +};
> +
>  enum mtk_ddp_comp_id {
>  	DDP_COMPONENT_AAL0,
>  	DDP_COMPONENT_AAL1,
> @@ -45,6 +51,46 @@ enum mtk_ddp_comp_id {
>  	DDP_COMPONENT_ID_MAX,
>  };
>  
> +enum mtk_mdp_comp_id {
> +	MDP_COMP_NONE = -1,	/* Invalid engine */
> +
> +	/* ISP */
> +	MDP_COMP_WPEI = 0,
> +	MDP_COMP_WPEO,		/* 1 */
> +	MDP_COMP_WPEI2,		/* 2 */
> +	MDP_COMP_WPEO2,		/* 3 */
> +	MDP_COMP_ISP_IMGI,	/* 4 */
> +	MDP_COMP_ISP_IMGO,	/* 5 */
> +	MDP_COMP_ISP_IMG2O,	/* 6 */
> +
> +	/* IPU */
> +	MDP_COMP_IPUI,		/* 7 */
> +	MDP_COMP_IPUO,		/* 8 */
> +
> +	/* MDP */
> +	MDP_COMP_CAMIN,		/* 9 */
> +	MDP_COMP_CAMIN2,	/* 10 */
> +	MDP_COMP_RDMA0,		/* 11 */
> +	MDP_COMP_AAL0,		/* 12 */
> +	MDP_COMP_CCORR0,	/* 13 */
> +	MDP_COMP_RSZ0,		/* 14 */
> +	MDP_COMP_RSZ1,		/* 15 */
> +	MDP_COMP_TDSHP0,	/* 16 */
> +	MDP_COMP_COLOR0,	/* 17 */
> +	MDP_COMP_PATH0_SOUT,	/* 18 */
> +	MDP_COMP_PATH1_SOUT,	/* 19 */
> +	MDP_COMP_WROT0,		/* 20 */
> +	MDP_COMP_WDMA,		/* 21 */
> +
> +	/* Dummy Engine */
> +	MDP_COMP_RDMA1,		/* 22 */
> +	MDP_COMP_RSZ2,		/* 23 */
> +	MDP_COMP_TDSHP1,	/* 24 */
> +	MDP_COMP_WROT1,		/* 25 */
> +
> +	MDP_MAX_COMP_COUNT	/* ALWAYS keep at the end */
> +};

Useless, remove this.

Regards,
CK

> +
>  void mtk_mmsys_ddp_connect(struct device *dev,
>  			   enum mtk_ddp_comp_id cur,
>  			   enum mtk_ddp_comp_id next);
> @@ -53,4 +99,8 @@ void mtk_mmsys_ddp_disconnect(struct device *dev,
>  			      enum mtk_ddp_comp_id cur,
>  			      enum mtk_ddp_comp_id next);
>  
> +void mtk_mmsys_write_reg_by_cmdq(struct device *dev,
> +				 struct mmsys_cmdq_cmd *cmd,
> +				 u32 alias_id, u32 value, u32 mask);
> +
>  #endif /* __MTK_MMSYS_H */




More information about the Linux-mediatek mailing list