Message ID | 20210714025626.5528-1-yong.wu@mediatek.com |
---|---|
Headers | show |
Series | Clean up "mediatek,larb" | expand |
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); > } > >
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" >
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 >
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"; >>
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
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(-) > >
> 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