mbox series

[v6,00/11] Clean up "mediatek,larb"

Message ID 20210714025626.5528-1-yong.wu@mediatek.com
Headers show
Series Clean up "mediatek,larb" | expand

Message

Yong Wu (吴勇) July 14, 2021, 2:56 a.m. UTC
MediaTek IOMMU block diagram always like below:

        M4U
         |
    smi-common
         |
  -------------
  |         |  ...
  |         |
larb1     larb2
  |         |
vdec       venc

All the consumer connect with smi-larb, then connect with smi-common.

When the consumer works, it should enable the smi-larb's power which also
need enable the smi-common's power firstly.

Thus, Firstly, use the device link connect the consumer and the
smi-larbs. then add device link between the smi-larb and smi-common.

After adding the device_link, then "mediatek,larb" property can be removed.
the iommu consumer don't need call the mtk_smi_larb_get/put to enable
the power and clock of smi-larb and smi-common.

About the MM dt-binding/dtsi patches, I guess they should go together, thus
I don't split them for each a MM module and each a SoC.

Base on v5.14-rc1, and a jpeg[1] and mdp[2] patchset.

[1] https://lore.kernel.org/linux-mediatek/20210702102304.3346429-1-hsinyi@chromium.org/
[2] https://lore.kernel.org/linux-mediatek/20210709022324.1607884-1-eizan@chromium.org/

Change notes:
v6: 1) rebase on v5.14-rc1.
    2) Fix the issue commented in v5 from Dafna and Hsin-Yi.
    3) Remove the patches about using pm_runtime_resume_and_get since they have
       already been merged by other patches.

v5: https://lore.kernel.org/linux-mediatek/20210410091128.31823-1-yong.wu@mediatek.com/
    1) Base v5.12-rc2.
    2) Remove changing the mtk-iommu to module_platform_driver patch, It have already been a
    independent patch.

v4: https://lore.kernel.org/linux-mediatek/1590826218-23653-1-git-send-email-yong.wu@mediatek.com/ 
    base on v5.7-rc1.
  1) Move drm PM patch before smi patchs.
  2) Change builtin_platform_driver to module_platform_driver since we may need
     build as module.
  3) Rebase many patchset as above.

v3: https://lore.kernel.org/linux-iommu/1567503456-24725-1-git-send-email-yong.wu@mediatek.com/
    1) rebase on v5.3-rc1 and the latest mt8183 patchset.
    2) Use device_is_bound to check whether the driver is ready from Matthias.    
    3) Add DL_FLAG_STATELESS flag when calling device_link_add and explain the
   reason in the commit message[3/14].
    4) Add a display patch[12/14] into this series. otherwise it may affect
   display HW fastlogo even though it don't happen in mt8183.
   
v2: https://lore.kernel.org/linux-iommu/1560171313-28299-1-git-send-email-yong.wu@mediatek.com/
   1) rebase on v5.2-rc1.
   2) Move adding device_link between the consumer and smi-larb into
iommu_add_device from Robin.
   3) add DL_FLAG_AUTOREMOVE_CONSUMER even though the smi is built-in from Evan.
   4) Remove the shutdown callback in iommu.   

v1: https://lore.kernel.org/linux-iommu/1546318276-18993-1-git-send-email-yong.wu@mediatek.com/

Yong Wu (10):
  dt-binding: mediatek: Get rid of mediatek,larb for multimedia HW
  iommu/mediatek: Add probe_defer for smi-larb
  iommu/mediatek: Add device_link between the consumer and the larb
    devices
  media: mtk-jpeg: Get rid of mtk_smi_larb_get/put
  media: mtk-mdp: Get rid of mtk_smi_larb_get/put
  drm/mediatek: Get rid of mtk_smi_larb_get/put
  media: mtk-vcodec: Get rid of mtk_smi_larb_get/put
  memory: mtk-smi: Get rid of mtk_smi_larb_get/put
  arm: dts: mediatek: Get rid of mediatek,larb for MM nodes
  arm64: dts: mediatek: Get rid of mediatek,larb for MM nodes

Yongqiang Niu (1):
  drm/mediatek: Add pm runtime support for ovl and rdma

 .../display/mediatek/mediatek,disp.txt        |  9 ----
 .../bindings/media/mediatek-jpeg-decoder.yaml |  9 ----
 .../bindings/media/mediatek-jpeg-encoder.yaml |  9 ----
 .../bindings/media/mediatek-mdp.txt           |  8 ----
 .../bindings/media/mediatek-vcodec.txt        |  4 --
 arch/arm/boot/dts/mt2701.dtsi                 |  2 -
 arch/arm/boot/dts/mt7623n.dtsi                |  5 --
 arch/arm64/boot/dts/mediatek/mt8173.dtsi      | 16 -------
 arch/arm64/boot/dts/mediatek/mt8183.dtsi      |  6 ---
 drivers/gpu/drm/mediatek/mtk_disp_ovl.c       |  9 +++-
 drivers/gpu/drm/mediatek/mtk_disp_rdma.c      |  9 +++-
 drivers/gpu/drm/mediatek/mtk_drm_crtc.c       | 19 ++++----
 drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c   | 36 +--------------
 drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h   |  1 -
 drivers/gpu/drm/mediatek/mtk_drm_drv.c        |  5 +-
 drivers/iommu/mtk_iommu.c                     | 24 +++++++++-
 drivers/iommu/mtk_iommu_v1.c                  | 22 ++++++++-
 .../media/platform/mtk-jpeg/mtk_jpeg_core.c   | 45 +-----------------
 .../media/platform/mtk-jpeg/mtk_jpeg_core.h   |  2 -
 drivers/media/platform/mtk-mdp/mtk_mdp_comp.c | 46 +------------------
 drivers/media/platform/mtk-mdp/mtk_mdp_comp.h |  2 -
 drivers/media/platform/mtk-mdp/mtk_mdp_core.c |  1 -
 .../platform/mtk-vcodec/mtk_vcodec_dec_pm.c   | 37 ++-------------
 .../platform/mtk-vcodec/mtk_vcodec_drv.h      |  3 --
 .../platform/mtk-vcodec/mtk_vcodec_enc.c      |  1 -
 .../platform/mtk-vcodec/mtk_vcodec_enc_pm.c   | 44 ++----------------
 drivers/memory/mtk-smi.c                      | 14 ------
 include/soc/mediatek/smi.h                    | 20 --------
 28 files changed, 85 insertions(+), 323 deletions(-)

Comments

Dafna Hirschfeld July 14, 2021, 8:26 a.m. UTC | #1
On 14.07.21 04:56, Yong Wu wrote:
> MediaTek IOMMU-SMI diagram is like below. all the consumer connect with
> smi-larb, then connect with smi-common.
> 
>          M4U
>           |
>      smi-common
>           |
>    -------------
>    |         |    ...
>    |         |
> larb1     larb2
>    |         |
> vdec       venc
> 
> When the consumer works, it should enable the smi-larb's power which
> also need enable the smi-common's power firstly.
> 
> Thus, First of all, use the device link connect the consumer and the
> smi-larbs. then add device link between the smi-larb and smi-common.
> 
> This patch adds device_link between the consumer and the larbs.
> 
> When device_link_add, I add the flag DL_FLAG_STATELESS to avoid calling
> pm_runtime_xx to keep the original status of clocks. It can avoid two
> issues:
> 1) Display HW show fastlogo abnormally reported in [1]. At the beggining,
> all the clocks are enabled before entering kernel, but the clocks for
> display HW(always in larb0) will be gated after clk_enable and clk_disable
> called from device_link_add(->pm_runtime_resume) and rpm_idle. The clock
> operation happened before display driver probe. At that time, the display
> HW will be abnormal.
> 
> 2) A deadlock issue reported in [2]. Use DL_FLAG_STATELESS to skip
> pm_runtime_xx to avoid the deadlock.
> 
> Corresponding, DL_FLAG_AUTOREMOVE_CONSUMER can't be added, then
> device_link_removed should be added explicitly.
> 
> [1] https://lore.kernel.org/linux-mediatek/1564213888.22908.4.camel@mhfsdcap03/
> [2] https://lore.kernel.org/patchwork/patch/1086569/
> 
> Suggested-by: Tomasz Figa <tfiga@chromium.org>
> Signed-off-by: Yong Wu <yong.wu@mediatek.com>
> ---
>   drivers/iommu/mtk_iommu.c    | 22 ++++++++++++++++++++++
>   drivers/iommu/mtk_iommu_v1.c | 20 +++++++++++++++++++-
>   2 files changed, 41 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c
> index a02dde094788..ee742900cf4b 100644
> --- a/drivers/iommu/mtk_iommu.c
> +++ b/drivers/iommu/mtk_iommu.c
> @@ -571,22 +571,44 @@ static struct iommu_device *mtk_iommu_probe_device(struct device *dev)
>   {
>   	struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
>   	struct mtk_iommu_data *data;
> +	struct device_link *link;
> +	struct device *larbdev;
> +	unsigned int larbid;
>   
>   	if (!fwspec || fwspec->ops != &mtk_iommu_ops)
>   		return ERR_PTR(-ENODEV); /* Not a iommu client device */
>   
>   	data = dev_iommu_priv_get(dev);
>   
> +	/*
> +	 * Link the consumer device with the smi-larb device(supplier)
> +	 * The device in each a larb is a independent HW. thus only link
> +	 * one larb here.
> +	 */
> +	larbid = MTK_M4U_TO_LARB(fwspec->ids[0]);
> +	larbdev = data->larb_imu[larbid].dev;
> +	link = device_link_add(dev, larbdev,
> +			       DL_FLAG_PM_RUNTIME | DL_FLAG_STATELESS);
> +	if (!link)
> +		dev_err(dev, "Unable to link %s\n", dev_name(larbdev));
shoudn't ERR_PTR be returned in case of failure?

Thanks,
Dafna

>   	return &data->iommu;
>   }
>   
>   static void mtk_iommu_release_device(struct device *dev)
>   {
>   	struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
> +	struct mtk_iommu_data *data;
> +	struct device *larbdev;
> +	unsigned int larbid;
>   
>   	if (!fwspec || fwspec->ops != &mtk_iommu_ops)
>   		return;
>   
> +	data = dev_iommu_priv_get(dev);
> +	larbid = MTK_M4U_TO_LARB(fwspec->ids[0]);
> +	larbdev = data->larb_imu[larbid].dev;
> +	device_link_remove(dev, larbdev);
> +
>   	iommu_fwspec_free(dev);
>   }
>   
> diff --git a/drivers/iommu/mtk_iommu_v1.c b/drivers/iommu/mtk_iommu_v1.c
> index d9365a3d8dc9..d2a7c66b8239 100644
> --- a/drivers/iommu/mtk_iommu_v1.c
> +++ b/drivers/iommu/mtk_iommu_v1.c
> @@ -424,7 +424,9 @@ static struct iommu_device *mtk_iommu_probe_device(struct device *dev)
>   	struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
>   	struct of_phandle_args iommu_spec;
>   	struct mtk_iommu_data *data;
> -	int err, idx = 0;
> +	int err, idx = 0, larbid;
> +	struct device_link *link;
> +	struct device *larbdev;
>   
>   	while (!of_parse_phandle_with_args(dev->of_node, "iommus",
>   					   "#iommu-cells",
> @@ -445,6 +447,14 @@ static struct iommu_device *mtk_iommu_probe_device(struct device *dev)
>   
>   	data = dev_iommu_priv_get(dev);
>   
> +	/* Link the consumer device with the smi-larb device(supplier) */
> +	larbid = mt2701_m4u_to_larb(fwspec->ids[0]);
> +	larbdev = data->larb_imu[larbid].dev;
> +	link = device_link_add(dev, larbdev,
> +			       DL_FLAG_PM_RUNTIME | DL_FLAG_STATELESS);
> +	if (!link)
> +		dev_err(dev, "Unable to link %s\n", dev_name(larbdev));
> +
>   	return &data->iommu;
>   }
>   
> @@ -465,10 +475,18 @@ static void mtk_iommu_probe_finalize(struct device *dev)
>   static void mtk_iommu_release_device(struct device *dev)
>   {
>   	struct iommu_fwspec *fwspec = dev_iommu_fwspec_get(dev);
> +	struct mtk_iommu_data *data;
> +	struct device *larbdev;
> +	unsigned int larbid;
>   
>   	if (!fwspec || fwspec->ops != &mtk_iommu_ops)
>   		return;
>   
> +	data = dev_iommu_priv_get(dev);
> +	larbid = mt2701_m4u_to_larb(fwspec->ids[0]);
> +	larbdev = data->larb_imu[larbid].dev;
> +	device_link_remove(dev, larbdev);
> +
>   	iommu_fwspec_free(dev);
>   }
>   
>
Dafna Hirschfeld July 14, 2021, 8:29 a.m. UTC | #2
On 14.07.21 04:56, Yong Wu wrote:
> MediaTek IOMMU has already added the device_link between the consumer
> and smi-larb device. If the mdp device call the pm_runtime_get_sync,
> the smi-larb's pm_runtime_get_sync also be called automatically.
> 
> CC: Minghsiu Tsai <minghsiu.tsai@mediatek.com>
> CC: Houlong Wei <houlong.wei@mediatek.com>
> Signed-off-by: Yong Wu <yong.wu@mediatek.com>
> Reviewed-by: Evan Green <evgreen@chromium.org>
> Reviewed-by: Houlong Wei <houlong.wei@mediatek.com>

Reviewed-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>

> ---
>   drivers/media/platform/mtk-mdp/mtk_mdp_comp.c | 46 +------------------
>   drivers/media/platform/mtk-mdp/mtk_mdp_comp.h |  2 -
>   drivers/media/platform/mtk-mdp/mtk_mdp_core.c |  1 -
>   3 files changed, 1 insertion(+), 48 deletions(-)
> 
> diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c
> index de2d425efdd1..5e0ea83a9f7f 100644
> --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c
> +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.c
> @@ -13,7 +13,6 @@
>   #include <linux/of.h>
>   #include <linux/of_irq.h>
>   #include <linux/of_platform.h>
> -#include <soc/mediatek/smi.h>
>   #include <linux/pm_runtime.h>
>   
>   #include "mtk_mdp_comp.h"
> @@ -57,13 +56,6 @@ int mtk_mdp_comp_power_on(struct mtk_mdp_comp *comp)
>   {
>   	int status, err;
>   
> -	if (comp->larb_dev) {
> -		err = mtk_smi_larb_get(comp->larb_dev);
> -		if (err)
> -			dev_err(comp->dev,
> -				"failed to get larb, err %d.\n", err);
> -	}
> -
>   	err = pm_runtime_get_sync(comp->dev);
>   	if (err < 0) {
>   		dev_err(comp->dev, "failed to runtime get, err %d.\n", err);
> @@ -146,9 +138,6 @@ void mtk_mdp_comp_clock_off(struct mtk_mdp_comp *comp)
>   			continue;
>   		clk_disable_unprepare(comp->clk[i]);
>   	}
> -
> -	if (comp->larb_dev)
> -		mtk_smi_larb_put(comp->larb_dev);
>   }
>   
>   /*
> @@ -236,9 +225,6 @@ static const struct component_ops mtk_mdp_component_ops = {
>   
>   int mtk_mdp_comp_init(struct mtk_mdp_comp *comp, struct device *dev)
>   {
> -	struct device_node *larb_node;
> -	struct platform_device *larb_pdev;
> -	int ret;
>   	int i;
>   	struct device_node *node = dev->of_node;
>   	enum mtk_mdp_comp_type comp_type =
> @@ -252,8 +238,7 @@ int mtk_mdp_comp_init(struct mtk_mdp_comp *comp, struct device *dev)
>   		if (IS_ERR(comp->clk[i])) {
>   			if (PTR_ERR(comp->clk[i]) != -EPROBE_DEFER)
>   				dev_err(dev, "Failed to get clock\n");
> -			ret = PTR_ERR(comp->clk[i]);
> -			goto err;
> +			return PTR_ERR(comp->clk[i]);
>   		}
>   
>   		/* Only RDMA needs two clocks */
> @@ -261,36 +246,7 @@ int mtk_mdp_comp_init(struct mtk_mdp_comp *comp, struct device *dev)
>   			break;
>   	}
>   
> -	/* Only DMA capable components need the LARB property */
> -	comp->larb_dev = NULL;
> -	if (comp_type != MTK_MDP_RDMA &&
> -	    comp_type != MTK_MDP_WDMA &&
> -	    comp_type != MTK_MDP_WROT)
> -		return 0;
> -
> -	larb_node = of_parse_phandle(node, "mediatek,larb", 0);
> -	if (!larb_node) {
> -		dev_err(dev,
> -			"Missing mediadek,larb phandle in %pOF node\n", node);
> -		ret = -EINVAL;
> -		goto err;
> -	}
> -
> -	larb_pdev = of_find_device_by_node(larb_node);
> -	if (!larb_pdev) {
> -		dev_warn(dev, "Waiting for larb device %pOF\n", larb_node);
> -		of_node_put(larb_node);
> -		ret = -EPROBE_DEFER;
> -		goto err;
> -	}
> -	of_node_put(larb_node);
> -
> -	comp->larb_dev = &larb_pdev->dev;
> -
>   	return 0;
> -
> -err:
> -	return ret;
>   }
>   
>   static int mtk_mdp_comp_probe(struct platform_device *pdev)
> diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h
> index 5201c47f7baa..2bd229cc7eae 100644
> --- a/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h
> +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_comp.h
> @@ -11,13 +11,11 @@
>    * struct mtk_mdp_comp - the MDP's function component data
>    * @node:	list node to track sibing MDP components
>    * @clk:	clocks required for component
> - * @larb_dev:	SMI device required for component
>    * @dev:	component's device
>    */
>   struct mtk_mdp_comp {
>   	struct list_head	node;
>   	struct clk		*clk[2];
> -	struct device           *larb_dev;
>   	struct device		*dev;
>   };
>   
> diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c
> index e1fb39231248..be7d35b3e3ff 100644
> --- a/drivers/media/platform/mtk-mdp/mtk_mdp_core.c
> +++ b/drivers/media/platform/mtk-mdp/mtk_mdp_core.c
> @@ -18,7 +18,6 @@
>   #include <linux/platform_device.h>
>   #include <linux/pm_runtime.h>
>   #include <linux/workqueue.h>
> -#include <soc/mediatek/smi.h>
>   
>   #include "mtk_mdp_comp.h"
>   #include "mtk_mdp_core.h"
>
Dafna Hirschfeld July 14, 2021, 8:32 a.m. UTC | #3
On 14.07.21 04:56, Yong Wu wrote:
> After adding device_link between the iommu consumer and smi-larb,
> the pm_runtime_get(_sync) of smi-larb and smi-common will be called
> automatically. we can get rid of mtk_smi_larb_get/put.
> 
> CC: Matthias Brugger <matthias.bgg@gmail.com>
> Signed-off-by: Yong Wu <yong.wu@mediatek.com>
> Reviewed-by: Evan Green <evgreen@chromium.org>
> Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
> Acked-by: Matthias Brugger <matthias.bgg@gmail.com>

Reviewed-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>

> ---
>   drivers/memory/mtk-smi.c   | 14 --------------
>   include/soc/mediatek/smi.h | 20 --------------------
>   2 files changed, 34 deletions(-)
> 
> diff --git a/drivers/memory/mtk-smi.c b/drivers/memory/mtk-smi.c
> index c5fb51f73b34..7c61c924e220 100644
> --- a/drivers/memory/mtk-smi.c
> +++ b/drivers/memory/mtk-smi.c
> @@ -134,20 +134,6 @@ static void mtk_smi_clk_disable(const struct mtk_smi *smi)
>   	clk_disable_unprepare(smi->clk_apb);
>   }
>   
> -int mtk_smi_larb_get(struct device *larbdev)
> -{
> -	int ret = pm_runtime_resume_and_get(larbdev);
> -
> -	return (ret < 0) ? ret : 0;
> -}
> -EXPORT_SYMBOL_GPL(mtk_smi_larb_get);
> -
> -void mtk_smi_larb_put(struct device *larbdev)
> -{
> -	pm_runtime_put_sync(larbdev);
> -}
> -EXPORT_SYMBOL_GPL(mtk_smi_larb_put);
> -
>   static int
>   mtk_smi_larb_bind(struct device *dev, struct device *master, void *data)
>   {
> diff --git a/include/soc/mediatek/smi.h b/include/soc/mediatek/smi.h
> index 15e3397cec58..11f7d6b59642 100644
> --- a/include/soc/mediatek/smi.h
> +++ b/include/soc/mediatek/smi.h
> @@ -19,26 +19,6 @@ struct mtk_smi_larb_iommu {
>   	unsigned char  bank[32];
>   };
>   
> -/*
> - * mtk_smi_larb_get: Enable the power domain and clocks for this local arbiter.
> - *                   It also initialize some basic setting(like iommu).
> - * mtk_smi_larb_put: Disable the power domain and clocks for this local arbiter.
> - * Both should be called in non-atomic context.
> - *
> - * Returns 0 if successful, negative on failure.
> - */
> -int mtk_smi_larb_get(struct device *larbdev);
> -void mtk_smi_larb_put(struct device *larbdev);
> -
> -#else
> -
> -static inline int mtk_smi_larb_get(struct device *larbdev)
> -{
> -	return 0;
> -}
> -
> -static inline void mtk_smi_larb_put(struct device *larbdev) { }
> -
>   #endif
>   
>   #endif
>
Dafna Hirschfeld July 14, 2021, 8:49 a.m. UTC | #4
On 14.07.21 10:13, Dafna Hirschfeld wrote:
> Hi,
> thanks for the patch
> 
> On 14.07.21 04:56, Yong Wu wrote:
>> After adding device_link between the consumer with the smi-larbs,
>> if the consumer call its owner pm_runtime_get(_sync), the
>> pm_runtime_get(_sync) of smi-larb and smi-common will be called
>> automatically. Thus, the consumer don't need the property.
>>
>> And IOMMU also know which larb this consumer connects with from
>> iommu id in the "iommus=" property.
>>
>> Signed-off-by: Yong Wu <yong.wu@mediatek.com>
>> Reviewed-by: Rob Herring <robh@kernel.org>
>> Reviewed-by: Evan Green <evgreen@chromium.org>
>> ---
>>   .../bindings/display/mediatek/mediatek,disp.txt          | 9 ---------
>>   .../devicetree/bindings/media/mediatek-jpeg-decoder.yaml | 9 ---------
>>   .../devicetree/bindings/media/mediatek-jpeg-encoder.yaml | 9 ---------
> 
> On which repo are these patches based on ?
> In linux-next the file mediatek-jpeg-encoder.yaml don't exist
> 
> Thanks,
> Dafna

sorry, I see you reference the patch that convert to yaml in the cover letter.

Thanks,
Dafna

> 
>>   Documentation/devicetree/bindings/media/mediatek-mdp.txt | 8 --------
>>   .../devicetree/bindings/media/mediatek-vcodec.txt        | 4 ----
>>   5 files changed, 39 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/display/mediatek/mediatek,disp.txt b/Documentation/devicetree/bindings/display/mediatek/mediatek,disp.txt
>> index fbb59c9ddda6..867bd82e2f03 100644
>> --- a/Documentation/devicetree/bindings/display/mediatek/mediatek,disp.txt
>> +++ b/Documentation/devicetree/bindings/display/mediatek/mediatek,disp.txt
>> @@ -61,8 +61,6 @@ Required properties (DMA function blocks):
>>       "mediatek,<chip>-disp-rdma"
>>       "mediatek,<chip>-disp-wdma"
>>     the supported chips are mt2701, mt8167 and mt8173.
>> -- larb: Should contain a phandle pointing to the local arbiter device as defined
>> -  in Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.yaml
>>   - iommus: Should point to the respective IOMMU block with master port as
>>     argument, see Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
>>     for details.
>> @@ -91,7 +89,6 @@ ovl0: ovl@1400c000 {
>>       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
>>       clocks = <&mmsys CLK_MM_DISP_OVL0>;
>>       iommus = <&iommu M4U_PORT_DISP_OVL0>;
>> -    mediatek,larb = <&larb0>;
>>   };
>>   ovl1: ovl@1400d000 {
>> @@ -101,7 +98,6 @@ ovl1: ovl@1400d000 {
>>       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
>>       clocks = <&mmsys CLK_MM_DISP_OVL1>;
>>       iommus = <&iommu M4U_PORT_DISP_OVL1>;
>> -    mediatek,larb = <&larb4>;
>>   };
>>   rdma0: rdma@1400e000 {
>> @@ -111,7 +107,6 @@ rdma0: rdma@1400e000 {
>>       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
>>       clocks = <&mmsys CLK_MM_DISP_RDMA0>;
>>       iommus = <&iommu M4U_PORT_DISP_RDMA0>;
>> -    mediatek,larb = <&larb0>;
>>       mediatek,rdma-fifosize = <8192>;
>>   };
>> @@ -122,7 +117,6 @@ rdma1: rdma@1400f000 {
>>       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
>>       clocks = <&mmsys CLK_MM_DISP_RDMA1>;
>>       iommus = <&iommu M4U_PORT_DISP_RDMA1>;
>> -    mediatek,larb = <&larb4>;
>>   };
>>   rdma2: rdma@14010000 {
>> @@ -132,7 +126,6 @@ rdma2: rdma@14010000 {
>>       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
>>       clocks = <&mmsys CLK_MM_DISP_RDMA2>;
>>       iommus = <&iommu M4U_PORT_DISP_RDMA2>;
>> -    mediatek,larb = <&larb4>;
>>   };
>>   wdma0: wdma@14011000 {
>> @@ -142,7 +135,6 @@ wdma0: wdma@14011000 {
>>       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
>>       clocks = <&mmsys CLK_MM_DISP_WDMA0>;
>>       iommus = <&iommu M4U_PORT_DISP_WDMA0>;
>> -    mediatek,larb = <&larb0>;
>>   };
>>   wdma1: wdma@14012000 {
>> @@ -152,7 +144,6 @@ wdma1: wdma@14012000 {
>>       power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
>>       clocks = <&mmsys CLK_MM_DISP_WDMA1>;
>>       iommus = <&iommu M4U_PORT_DISP_WDMA1>;
>> -    mediatek,larb = <&larb4>;
>>   };
>>   color0: color@14013000 {
>> diff --git a/Documentation/devicetree/bindings/media/mediatek-jpeg-decoder.yaml b/Documentation/devicetree/bindings/media/mediatek-jpeg-decoder.yaml
>> index 9b87f036f178..052e752157b4 100644
>> --- a/Documentation/devicetree/bindings/media/mediatek-jpeg-decoder.yaml
>> +++ b/Documentation/devicetree/bindings/media/mediatek-jpeg-decoder.yaml
>> @@ -42,13 +42,6 @@ properties:
>>     power-domains:
>>       maxItems: 1
>> -  mediatek,larb:
>> -    $ref: '/schemas/types.yaml#/definitions/phandle'
>> -    description: |
>> -      Must contain the local arbiters in the current Socs, see
>> -      Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.yaml
>> -      for details.
>> -
>>     iommus:
>>       maxItems: 2
>>       description: |
>> @@ -63,7 +56,6 @@ required:
>>     - clocks
>>     - clock-names
>>     - power-domains
>> -  - mediatek,larb
>>     - iommus
>>   additionalProperties: false
>> @@ -83,7 +75,6 @@ examples:
>>         clock-names = "jpgdec-smi",
>>                       "jpgdec";
>>         power-domains = <&scpsys MT2701_POWER_DOMAIN_ISP>;
>> -      mediatek,larb = <&larb2>;
>>         iommus = <&iommu MT2701_M4U_PORT_JPGDEC_WDMA>,
>>                  <&iommu MT2701_M4U_PORT_JPGDEC_BSDMA>;
>>       };
>> diff --git a/Documentation/devicetree/bindings/media/mediatek-jpeg-encoder.yaml b/Documentation/devicetree/bindings/media/mediatek-jpeg-encoder.yaml
>> index fcd9b829e036..8bfdfdfaba59 100644
>> --- a/Documentation/devicetree/bindings/media/mediatek-jpeg-encoder.yaml
>> +++ b/Documentation/devicetree/bindings/media/mediatek-jpeg-encoder.yaml
>> @@ -35,13 +35,6 @@ properties:
>>     power-domains:
>>       maxItems: 1
>> -  mediatek,larb:
>> -    $ref: '/schemas/types.yaml#/definitions/phandle'
>> -    description: |
>> -      Must contain the local arbiters in the current Socs, see
>> -      Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.yaml
>> -      for details.
>> -
>>     iommus:
>>       maxItems: 2
>>       description: |
>> @@ -56,7 +49,6 @@ required:
>>     - clocks
>>     - clock-names
>>     - power-domains
>> -  - mediatek,larb
>>     - iommus
>>   additionalProperties: false
>> @@ -75,7 +67,6 @@ examples:
>>         clocks =  <&imgsys CLK_IMG_VENC>;
>>         clock-names = "jpgenc";
>>         power-domains = <&scpsys MT2701_POWER_DOMAIN_ISP>;
>> -      mediatek,larb = <&larb2>;
>>         iommus = <&iommu MT2701_M4U_PORT_JPGENC_RDMA>,
>>                  <&iommu MT2701_M4U_PORT_JPGENC_BSDMA>;
>>       };
>> diff --git a/Documentation/devicetree/bindings/media/mediatek-mdp.txt b/Documentation/devicetree/bindings/media/mediatek-mdp.txt
>> index caa24943da33..53ef26e2c857 100644
>> --- a/Documentation/devicetree/bindings/media/mediatek-mdp.txt
>> +++ b/Documentation/devicetree/bindings/media/mediatek-mdp.txt
>> @@ -27,9 +27,6 @@ Required properties (DMA function blocks, child node):
>>   - iommus: should point to the respective IOMMU block with master port as
>>     argument, see Documentation/devicetree/bindings/iommu/mediatek,iommu.yaml
>>     for details.
>> -- mediatek,larb: must contain the local arbiters in the current Socs, see
>> -  Documentation/devicetree/bindings/memory-controllers/mediatek,smi-larb.yaml
>> -  for details.
>>   Example:
>>       mdp_rdma0: rdma@14001000 {
>> @@ -40,7 +37,6 @@ Example:
>>                <&mmsys CLK_MM_MUTEX_32K>;
>>           power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
>>           iommus = <&iommu M4U_PORT_MDP_RDMA0>;
>> -        mediatek,larb = <&larb0>;
>>           mediatek,vpu = <&vpu>;
>>       };
>> @@ -51,7 +47,6 @@ Example:
>>                <&mmsys CLK_MM_MUTEX_32K>;
>>           power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
>>           iommus = <&iommu M4U_PORT_MDP_RDMA1>;
>> -        mediatek,larb = <&larb4>;
>>       };
>>       mdp_rsz0: rsz@14003000 {
>> @@ -81,7 +76,6 @@ Example:
>>           clocks = <&mmsys CLK_MM_MDP_WDMA>;
>>           power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
>>           iommus = <&iommu M4U_PORT_MDP_WDMA>;
>> -        mediatek,larb = <&larb0>;
>>       };
>>       mdp_wrot0: wrot@14007000 {
>> @@ -90,7 +84,6 @@ Example:
>>           clocks = <&mmsys CLK_MM_MDP_WROT0>;
>>           power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
>>           iommus = <&iommu M4U_PORT_MDP_WROT0>;
>> -        mediatek,larb = <&larb0>;
>>       };
>>       mdp_wrot1: wrot@14008000 {
>> @@ -99,5 +92,4 @@ Example:
>>           clocks = <&mmsys CLK_MM_MDP_WROT1>;
>>           power-domains = <&scpsys MT8173_POWER_DOMAIN_MM>;
>>           iommus = <&iommu M4U_PORT_MDP_WROT1>;
>> -        mediatek,larb = <&larb4>;
>>       };
>> diff --git a/Documentation/devicetree/bindings/media/mediatek-vcodec.txt b/Documentation/devicetree/bindings/media/mediatek-vcodec.txt
>> index ad1321e5a22d..71237355cc7e 100644
>> --- a/Documentation/devicetree/bindings/media/mediatek-vcodec.txt
>> +++ b/Documentation/devicetree/bindings/media/mediatek-vcodec.txt
>> @@ -13,7 +13,6 @@ Required properties:
>>   - reg : Physical base address of the video codec registers and length of
>>     memory mapped region.
>>   - interrupts : interrupt number to the cpu.
>> -- mediatek,larb : must contain the local arbiters in the current Socs.
>>   - clocks : list of clock specifiers, corresponding to entries in
>>     the clock-names property.
>>   - clock-names: avc encoder must contain "venc_sel", vp8 encoder must
>> @@ -46,7 +45,6 @@ vcodec_dec: vcodec@16000000 {
>>             <0 0x16027800 0 0x800>,   /*VP8_VL*/
>>             <0 0x16028400 0 0x400>;   /*VP9_VD*/
>>       interrupts = <GIC_SPI 204 IRQ_TYPE_LEVEL_LOW>;
>> -    mediatek,larb = <&larb1>;
>>       iommus = <&iommu M4U_PORT_HW_VDEC_MC_EXT>,
>>                <&iommu M4U_PORT_HW_VDEC_PP_EXT>,
>>                <&iommu M4U_PORT_HW_VDEC_AVC_MV_EXT>,
>> @@ -99,7 +97,6 @@ vcodec_enc_avc: vcodec@18002000 {
>>                <&iommu M4U_PORT_VENC_REF_CHROMA>,
>>                <&iommu M4U_PORT_VENC_NBM_RDMA>,
>>                <&iommu M4U_PORT_VENC_NBM_WDMA>;
>> -    mediatek,larb = <&larb3>;
>>       mediatek,vpu = <&vpu>;
>>       clocks = <&topckgen CLK_TOP_VENC_SEL>;
>>       clock-names = "venc_sel";
>> @@ -120,7 +117,6 @@ vcodec_enc_vp8: vcodec@19002000 {
>>                <&iommu M4U_PORT_VENC_CUR_CHROMA_SET2>,
>>                <&iommu M4U_PORT_VENC_REF_LUMA_SET2>,
>>                <&iommu M4U_PORT_VENC_REC_CHROMA_SET2>;
>> -    mediatek,larb = <&larb5>;
>>       mediatek,vpu = <&vpu>;
>>       clocks = <&topckgen CLK_TOP_VENC_LT_SEL>;
>>       clock-names = "venc_lt_sel";
>>
Frank Wunderlich July 14, 2021, 8:59 a.m. UTC | #5
Hi,

sorry this (or the 2 depency-series) cause a NULL Pointer deref in iommu_group_remove_device on mt7623/bpi-r2

i wonder why on bootup a cleanup is run, but have no hint about this.

since "dts: mtk-mdp: remove mediatek, vpu property from primary MDP device" all is good, i guess problem comes up while removing larb with DT

this is backtrace

[    6.274465] PC is at iommu_group_remove_device+0x28/0x148
[    6.279877] LR is at iommu_release_device+0x4c/0x70

[    6.674347] Backtrace:
[    6.676797] [<c0c9c37c>] (iommu_group_remove_device) from [<c06bf028>] (iomm)
[    6.686221]  r7:00000000 r6:c06bf04c r5:c0d7a1ac r4:c21fc010
[    6.691883] [<c06befdc>] (iommu_release_device) from [<c06bf064>] (remove_io)
[    6.700689]  r5:00000000 r4:00000000
[    6.704265] [<c06bf04c>] (remove_iommu_group) from [<c0733434>] (bus_for_eac)
[    6.712725] [<c07333ac>] (bus_for_each_dev) from [<c06bf658>] (bus_set_iommu)
[    6.720753]  r6:c331f440 r5:c1406f58 r4:ffffffea
[    6.725370] [<c06bf5a0>] (bus_set_iommu) from [<c06c1e88>] (mtk_iommu_probe+)
[    6.733484]  r7:c32db0b8 r6:c21f9c00 r5:c331f1c0 r4:00000000
[    6.739145] [<c06c1bfc>] (mtk_iommu_probe) from [<c0738c14>] (platform_probe)
[    6.747176]  r10:c21f9c10 r9:c2496f54 r8:c14623b8 r7:c14623b8 r6:c1405b90 r50
[    6.755012]  r4:00000000
[    6.757544] [<c0738ba8>] (platform_probe) from [<c0735968>] (really_probe.pa)
[    6.766006]  r7:c14623b8 r6:c1405b90 r5:00000000 r4:c21f9c10
[    6.771667] [<c07358a0>] (really_probe.part.0) from [<c0735cec>] (really_pro)
[    6.779866]  r7:c21f9c10 r6:c2549e74 r5:c1405b90 r4:c21f9c10
[    6.785527] [<c0735ca4>] (really_probe) from [<c0735de0>] (__driver_probe_de)
[    6.793984]  r5:c1405b90 r4:c21f9c10
[    6.797560] [<c0735d30>] (__driver_probe_device) from [<c0735fa0>] (driver_p)
[    6.806543]  r9:c2496f54 r8:00000008 r7:c21f9c10 r6:c2549e74 r5:c14c6ec8 r4:4
[    6.814291] [<c0735f5c>] (driver_probe_device) from [<c0736410>] (__device_a)
[    6.823448]  r9:c2496f54 r8:00000000 r7:c21f9c10 r6:c2549e74 r5:c1405b90 r4:1
[    6.831196] [<c073635c>] (__device_attach_driver) from [<c0733540>] (bus_for)
[    6.840007]  r7:c14623b8 r6:c073635c r5:c2549e74 r4:00000000
[    6.845669] [<c07334ac>] (bus_for_each_drv) from [<c07357e8>] (__device_atta)
[    6.854044]  r6:00000001 r5:c21f9c54 r4:c21f9c10
[    6.858662] [<c07356e4>] (__device_attach) from [<c073662c>] (device_initial)
[    6.867207]  r6:c21f9c10 r5:c1406f58 r4:c1406ca0
[    6.871825] [<c0736610>] (device_initial_probe) from [<c07346dc>] (bus_probe)
[    6.880454] [<c0734648>] (bus_probe_device) from [<c0734cc8>] (deferred_prob)


bisect shows this commit as breaking:

Author: Yong Wu <yong.wu@mediatek.com>
Date:   Wed Jul 14 10:56:17 2021 +0800

    iommu/mediatek: Add probe_defer for smi-larb

    Prepare for adding device_link.

regards Frank
Yong Wu (吴勇) July 14, 2021, 11:18 a.m. UTC | #6
On Wed, 2021-07-14 at 10:56 +0200, Dafna Hirschfeld wrote:
> Hi

> 

> Thanks for the patchset.

> 

> I tested it on mt8173 (elm) with chromeos userspace.

> Before that patchset, the test:

> 

> tast -verbose run -build=false 10.42.0.175 video.DecodeAccel.h264

> 

> sometimes passed and sometimes failed with 'context deadline exceeded'.

> With this patchset it seems that the test always passes so I added tested-by:

> 

> Tested-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>


Thanks very much for your quick review and testing:)

> 

> Thanks,

> Dafna

> 

> 

> 

> 

> On 14.07.21 04:56, Yong Wu wrote:

> > MediaTek IOMMU block diagram always like below:

> > 

> >          M4U

> >           |

> >      smi-common

> >           |

> >    -------------

> >    |         |  ...

> >    |         |

> > larb1     larb2

> >    |         |

> > vdec       venc

> > 

> > All the consumer connect with smi-larb, then connect with smi-common.

> > 

> > When the consumer works, it should enable the smi-larb's power which also

> > need enable the smi-common's power firstly.

> > 

> > Thus, Firstly, use the device link connect the consumer and the

> > smi-larbs. then add device link between the smi-larb and smi-common.

> > 

> > After adding the device_link, then "mediatek,larb" property can be removed.

> > the iommu consumer don't need call the mtk_smi_larb_get/put to enable

> > the power and clock of smi-larb and smi-common.

> > 

> > About the MM dt-binding/dtsi patches, I guess they should go together, thus

> > I don't split them for each a MM module and each a SoC.

> > 

> > Base on v5.14-rc1, and a jpeg[1] and mdp[2] patchset.

> > 

> > [1] https://lore.kernel.org/linux-mediatek/20210702102304.3346429-1-hsinyi@chromium.org/

> > [2] https://lore.kernel.org/linux-mediatek/20210709022324.1607884-1-eizan@chromium.org/

> > 

> > Change notes:

> > v6: 1) rebase on v5.14-rc1.

> >      2) Fix the issue commented in v5 from Dafna and Hsin-Yi.

> >      3) Remove the patches about using pm_runtime_resume_and_get since they have

> >         already been merged by other patches.

> > 

> > v5: https://lore.kernel.org/linux-mediatek/20210410091128.31823-1-yong.wu@mediatek.com/

> >      1) Base v5.12-rc2.

> >      2) Remove changing the mtk-iommu to module_platform_driver patch, It have already been a

> >      independent patch.

> > 

> > v4: https://lore.kernel.org/linux-mediatek/1590826218-23653-1-git-send-email-yong.wu@mediatek.com/

> >      base on v5.7-rc1.

> >    1) Move drm PM patch before smi patchs.

> >    2) Change builtin_platform_driver to module_platform_driver since we may need

> >       build as module.

> >    3) Rebase many patchset as above.

> > 

> > v3: https://lore.kernel.org/linux-iommu/1567503456-24725-1-git-send-email-yong.wu@mediatek.com/

> >      1) rebase on v5.3-rc1 and the latest mt8183 patchset.

> >      2) Use device_is_bound to check whether the driver is ready from Matthias.

> >      3) Add DL_FLAG_STATELESS flag when calling device_link_add and explain the

> >     reason in the commit message[3/14].

> >      4) Add a display patch[12/14] into this series. otherwise it may affect

> >     display HW fastlogo even though it don't happen in mt8183.

> >     

> > v2: https://lore.kernel.org/linux-iommu/1560171313-28299-1-git-send-email-yong.wu@mediatek.com/

> >     1) rebase on v5.2-rc1.

> >     2) Move adding device_link between the consumer and smi-larb into

> > iommu_add_device from Robin.

> >     3) add DL_FLAG_AUTOREMOVE_CONSUMER even though the smi is built-in from Evan.

> >     4) Remove the shutdown callback in iommu.

> > 

> > v1: https://lore.kernel.org/linux-iommu/1546318276-18993-1-git-send-email-yong.wu@mediatek.com/

> > 

> > Yong Wu (10):

> >    dt-binding: mediatek: Get rid of mediatek,larb for multimedia HW

> >    iommu/mediatek: Add probe_defer for smi-larb

> >    iommu/mediatek: Add device_link between the consumer and the larb

> >      devices

> >    media: mtk-jpeg: Get rid of mtk_smi_larb_get/put

> >    media: mtk-mdp: Get rid of mtk_smi_larb_get/put

> >    drm/mediatek: Get rid of mtk_smi_larb_get/put

> >    media: mtk-vcodec: Get rid of mtk_smi_larb_get/put

> >    memory: mtk-smi: Get rid of mtk_smi_larb_get/put

> >    arm: dts: mediatek: Get rid of mediatek,larb for MM nodes

> >    arm64: dts: mediatek: Get rid of mediatek,larb for MM nodes

> > 

> > Yongqiang Niu (1):

> >    drm/mediatek: Add pm runtime support for ovl and rdma

> > 

> >   .../display/mediatek/mediatek,disp.txt        |  9 ----

> >   .../bindings/media/mediatek-jpeg-decoder.yaml |  9 ----

> >   .../bindings/media/mediatek-jpeg-encoder.yaml |  9 ----

> >   .../bindings/media/mediatek-mdp.txt           |  8 ----

> >   .../bindings/media/mediatek-vcodec.txt        |  4 --

> >   arch/arm/boot/dts/mt2701.dtsi                 |  2 -

> >   arch/arm/boot/dts/mt7623n.dtsi                |  5 --

> >   arch/arm64/boot/dts/mediatek/mt8173.dtsi      | 16 -------

> >   arch/arm64/boot/dts/mediatek/mt8183.dtsi      |  6 ---

> >   drivers/gpu/drm/mediatek/mtk_disp_ovl.c       |  9 +++-

> >   drivers/gpu/drm/mediatek/mtk_disp_rdma.c      |  9 +++-

> >   drivers/gpu/drm/mediatek/mtk_drm_crtc.c       | 19 ++++----

> >   drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c   | 36 +--------------

> >   drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h   |  1 -

> >   drivers/gpu/drm/mediatek/mtk_drm_drv.c        |  5 +-

> >   drivers/iommu/mtk_iommu.c                     | 24 +++++++++-

> >   drivers/iommu/mtk_iommu_v1.c                  | 22 ++++++++-

> >   .../media/platform/mtk-jpeg/mtk_jpeg_core.c   | 45 +-----------------

> >   .../media/platform/mtk-jpeg/mtk_jpeg_core.h   |  2 -

> >   drivers/media/platform/mtk-mdp/mtk_mdp_comp.c | 46 +------------------

> >   drivers/media/platform/mtk-mdp/mtk_mdp_comp.h |  2 -

> >   drivers/media/platform/mtk-mdp/mtk_mdp_core.c |  1 -

> >   .../platform/mtk-vcodec/mtk_vcodec_dec_pm.c   | 37 ++-------------

> >   .../platform/mtk-vcodec/mtk_vcodec_drv.h      |  3 --

> >   .../platform/mtk-vcodec/mtk_vcodec_enc.c      |  1 -

> >   .../platform/mtk-vcodec/mtk_vcodec_enc_pm.c   | 44 ++----------------

> >   drivers/memory/mtk-smi.c                      | 14 ------

> >   include/soc/mediatek/smi.h                    | 20 --------

> >   28 files changed, 85 insertions(+), 323 deletions(-)

> >
Frank Wunderlich July 14, 2021, 11:23 a.m. UTC | #7
> Gesendet: Mittwoch, 14. Juli 2021 um 13:18 Uhr
> Von: "Yong Wu" <yong.wu@mediatek.com>
> Hi Frank,
>
> Thanks for your report. mt7623 use mtk_iommu_v1.c.
>
> I will try to reproduce this locally.

Hi,

as far as i have debugged it dev->iommu_group is NULL, so it crashes on first access (dev_info)

drivers/iommu/iommu.c:

 923 void iommu_group_remove_device(struct device *dev)
 924 {
 925 printk(KERN_ALERT "DEBUG: Passed %s %d \n",__FUNCTION__,__LINE__);
 926     struct iommu_group *group = dev->iommu_group;
 927     struct group_device *tmp_device, *device = NULL;
 928
 929 printk(KERN_ALERT "DEBUG: Passed %s %d 0x%08x\n",__FUNCTION__,__LINE__,(unsigned int)group);
 930     dev_info(dev, "Removing from iommu group %d\n", group->id);


regards Frank