iommu/msm: Claim bus ops on probe
Subsystems (6)
Robin Murphy
reviewerPATCH v2 1/3 iommu/msm: Claim bus ops on probe
Since the MSM IOMMU driver now probes via DT exclusively rather than platform data, dependent masters should be deferred until the IOMMU itself is ready. Thus we can do away with the early initialisation hook to unconditionally claim the bus ops, and instead do that only once an IOMMU is actually probed. Furthermore, this should also make the driver safe for multiplatform kernels on non-MSM SoCs.
---
v2: Rebase to 4.15-rc, add tags
drivers/iommu/msm_iommu.c | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-)
drivers/iommu/msm_iommu.c +3 -13
@@ -823,6 +823,8 @@ static int msm_iommu_probe(struct platform_device *pdev) goto fail; } +bus_set_iommu (&platform_bus_type, &msm_iommu_ops); +pr_info ("device mapped at %p, irq %d with %d ctx banks\n" , iommu->base, iommu->irq, iommu->ncb);
@@ -875,19 +877,7 @@ static void __exit msm_iommu_driver_exit(void)subsys_initcall (msm_iommu_driver_init);module_exit (msm_iommu_driver_exit); -static int __init msm_iommu_init (void ) -{ -bus_set_iommu (&platform_bus_type, &msm_iommu_ops); -return 0 ; -} - -static int __init msm_iommu_of_setup (struct device_node *np) -{ -msm_iommu_init (); -return 0 ; -} - -IOMMU_OF_DECLARE (msm_iommu_of,"qcom,apq8064-iommu" , msm_iommu_of_setup); +IOMMU_OF_DECLARE (msm_iommu_of,"qcom,apq8064-iommu" ,NULL );MODULE_LICENSE ("GPL v2" );MODULE_AUTHOR ("Stepan Moskovchenko <[email protected]>" );
Signature · 1 line
2.13.4.dirty
Robin Murphy
reviewerPATCH v2 2/3 iommu/ipmmu-vmsa: Remove redundant of_iommu_init_fn hook
Having of_iommu_init() call ipmmu_init() via ipmmu_vmsa_iommu_of_setup() does nothing that the subsys_initcall wouldn't do slightly later anyway, since probe-deferral of masters means it is no longer critical to register the driver super-early. Clean it up.
---
v2: New (somehow v1 was based on 4.14-rc3 so missed this...)
drivers/iommu/ipmmu-vmsa.c | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-)
drivers/iommu/ipmmu-vmsa.c +2 -12
@@ -1108,18 +1108,8 @@ static void __exit ipmmu_exit(void)subsys_initcall (ipmmu_init);module_exit (ipmmu_exit); -#ifdef CONFIG_IOMMU_DMA -static int __init ipmmu_vmsa_iommu_of_setup (struct device_node *np) -{ -ipmmu_init (); -return 0 ; -} - -IOMMU_OF_DECLARE (ipmmu_vmsa_iommu_of,"renesas,ipmmu-vmsa" , - ipmmu_vmsa_iommu_of_setup); -IOMMU_OF_DECLARE (ipmmu_r8a7795_iommu_of,"renesas,ipmmu-r8a7795" , - ipmmu_vmsa_iommu_of_setup); -#endif +IOMMU_OF_DECLARE (ipmmu_vmsa_iommu_of,"renesas,ipmmu-vmsa" ,NULL ); +IOMMU_OF_DECLARE (ipmmu_r8a7795_iommu_of,"renesas,ipmmu-r8a7795" ,NULL );MODULE_DESCRIPTION ("IOMMU API for Renesas VMSA-compatible IPMMU" );MODULE_AUTHOR ("Laurent Pinchart <[email protected]>" );
Signature · 1 line
2.13.4.dirty
PATCH v2 2/3 iommu/ipmmu-vmsa: Remove redundant of_iommu_init_fn hook
Quoted 7 lines · Robin Murphy
Having
of_iommu_init()callipmmu_init()viaipmmu_vmsa_iommu_of_setup()does nothing that thesubsys_initcallwouldn't do slightly later anyway, since probe-deferral of masters means it is no longer critical to register the driver super-early. Clean it up.Signed-off-by Robin Murphy <[email protected]>---
Applied this one, thanks.
The other two are already applied now from your first post.
Robin Murphy
reviewerPATCH v2 3/3 iommu: Clean up of_iommu_init_fn
In reply to Robin MurphyNow that no more drivers rely on arbitrary early initialisation via an of_iommu_init_fn hook, let's clean up the redundant remnants. The IOMMU_OF_DECLARE() macro needs to remain for now, as the probe-deferral mechanism has no other nice way to detect built-in drivers before they have registered themselves, such that it can make the right decision.
---
v2: Rebase to 4.15-rc, add tags
drivers/iommu/arm-smmu-v3.c | 2 +- drivers/iommu/arm-smmu.c | 12 ++++++------ drivers/iommu/exynos-iommu.c | 2 +- drivers/iommu/ipmmu-vmsa.c | 4 ++-- drivers/iommu/msm_iommu.c | 2 +- drivers/iommu/of_iommu.c | 16 ---------------- drivers/iommu/qcom_iommu.c | 2 +- include/linux/of_iommu.h | 5 +---- 8 files changed, 13 insertions(+), 32 deletions(-)
drivers/iommu/arm-smmu-v3.c +1 -1
@@ -2962,7 +2962,7 @@ static struct platform_driver arm_smmu_driver = { };module_platform_driver (arm_smmu_driver); -IOMMU_OF_DECLARE (arm_smmuv3,"arm,smmu-v3" ,NULL ); +IOMMU_OF_DECLARE (arm_smmuv3,"arm,smmu-v3" );MODULE_DESCRIPTION ("IOMMU API for ARM architected SMMUv3 implementations" );MODULE_AUTHOR ("Will Deacon <[email protected]>" );
drivers/iommu/arm-smmu.c +6 -6
@@ -2211,12 +2211,12 @@ static struct platform_driver arm_smmu_driver = { };module_platform_driver (arm_smmu_driver); -IOMMU_OF_DECLARE (arm_smmuv1,"arm,smmu-v1" ,NULL ); -IOMMU_OF_DECLARE (arm_smmuv2,"arm,smmu-v2" ,NULL ); -IOMMU_OF_DECLARE (arm_mmu400,"arm,mmu-400" ,NULL ); -IOMMU_OF_DECLARE (arm_mmu401,"arm,mmu-401" ,NULL ); -IOMMU_OF_DECLARE (arm_mmu500,"arm,mmu-500" ,NULL ); -IOMMU_OF_DECLARE (cavium_smmuv2,"cavium,smmu-v2" ,NULL ); +IOMMU_OF_DECLARE (arm_smmuv1,"arm,smmu-v1" ); +IOMMU_OF_DECLARE (arm_smmuv2,"arm,smmu-v2" ); +IOMMU_OF_DECLARE (arm_mmu400,"arm,mmu-400" ); +IOMMU_OF_DECLARE (arm_mmu401,"arm,mmu-401" ); +IOMMU_OF_DECLARE (arm_mmu500,"arm,mmu-500" ); +IOMMU_OF_DECLARE (cavium_smmuv2,"cavium,smmu-v2" );MODULE_DESCRIPTION ("IOMMU API for ARM architected SMMU implementations" );MODULE_AUTHOR ("Will Deacon <[email protected]>" );
drivers/iommu/exynos-iommu.c +1 -1
@@ -1401,4 +1401,4 @@ static int __init exynos_iommu_init(void) }core_initcall (exynos_iommu_init); -IOMMU_OF_DECLARE (exynos_iommu_of,"samsung,exynos-sysmmu" ,NULL ); +IOMMU_OF_DECLARE (exynos_iommu_of,"samsung,exynos-sysmmu" );
drivers/iommu/ipmmu-vmsa.c +2 -2
@@ -1108,8 +1108,8 @@ static void __exit ipmmu_exit(void)subsys_initcall (ipmmu_init);module_exit (ipmmu_exit); -IOMMU_OF_DECLARE (ipmmu_vmsa_iommu_of,"renesas,ipmmu-vmsa" ,NULL ); -IOMMU_OF_DECLARE (ipmmu_r8a7795_iommu_of,"renesas,ipmmu-r8a7795" ,NULL ); +IOMMU_OF_DECLARE (ipmmu_vmsa_iommu_of,"renesas,ipmmu-vmsa" ); +IOMMU_OF_DECLARE (ipmmu_r8a7795_iommu_of,"renesas,ipmmu-r8a7795" );MODULE_DESCRIPTION ("IOMMU API for Renesas VMSA-compatible IPMMU" );MODULE_AUTHOR ("Laurent Pinchart <[email protected]>" );
drivers/iommu/msm_iommu.c +1 -1
@@ -877,7 +877,7 @@ static void __exit msm_iommu_driver_exit(void)subsys_initcall (msm_iommu_driver_init);module_exit (msm_iommu_driver_exit); -IOMMU_OF_DECLARE (msm_iommu_of,"qcom,apq8064-iommu" ,NULL ); +IOMMU_OF_DECLARE (msm_iommu_of,"qcom,apq8064-iommu" );MODULE_LICENSE ("GPL v2" );MODULE_AUTHOR ("Stepan Moskovchenko <[email protected]>" );
drivers/iommu/of_iommu.c +0 -16
@@ -231,19 +231,3 @@ const struct iommu_ops *of_iommu_configure(struct device *dev,return ops; } - -static int __init of_iommu_init (void ) -{ -struct device_node *np; -const struct of_device_id *match, *matches = &__iommu_of_table; - -for_each_matching_node_and_match (np, matches, &match) { -const of_iommu_init_fn init_fn = match->data; - -if (init_fn &&init_fn (np)) -pr_err ("Failed to initialise IOMMU %pOF\n" , np); - } - -return 0 ; -} -postcore_initcall_sync (of_iommu_init);
drivers/iommu/qcom_iommu.c +1 -1
@@ -947,7 +947,7 @@ static void __exit qcom_iommu_exit(void)module_init (qcom_iommu_init);module_exit (qcom_iommu_exit); -IOMMU_OF_DECLARE (qcom_iommu_dev,"qcom,msm-iommu-v1" ,NULL ); +IOMMU_OF_DECLARE (qcom_iommu_dev,"qcom,msm-iommu-v1" );MODULE_DESCRIPTION ("IOMMU API for QCOM IOMMU v1 implementations" );MODULE_LICENSE ("GPL v2" );
include/linux/of_iommu.h +1 -4
@@ -34,9 +34,6 @@ static inline const struct iommu_ops *of_iommu_configure(struct device *dev,extern struct of_device_id __iommu_of_table; -typedef int (*of_iommu_init_fn )(struct device_node *); - -#define IOMMU_OF_DECLARE (name, compat, fn) \ - _OF_DECLARE(iommu, name, compat, fn, of_iommu_init_fn) +#define IOMMU_OF_DECLARE (name, compat) OF_DECLARE_1(iommu, name, compat, NULL)#endif /* __OF_IOMMU_H */
Signature · 1 line
2.13.4.dirty