Message ID | 20221110154407.26531-1-m.szyprowski@samsung.com (mailing list archive) |
---|---|
State | Accepted |
Commit | bbc4d205d93f52ee18dfa7858d51489c0506547f |
Headers | show |
Series | [v2] iommu/exynos: Fix driver initialization sequence | expand |
On Thu, 10 Nov 2022 at 16:44, Marek Szyprowski <m.szyprowski@samsung.com> wrote: > > Registering a SYSMMU platform driver might directly trigger initializing > IOMMU domains and performing the initial mappings. Also the IOMMU core > might use the IOMMU hardware once it has been registered with > iommu_device_register() function. Ensure that all driver resources are > allocated and initialized before the driver advertise its presence to the > platform bus and the IOMMU subsystem. > > Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> > --- Reviewed-by: Sam Protsenko <semen.protsenko@linaro.org> > drivers/iommu/exynos-iommu.c | 26 ++++++++++++-------------- > 1 file changed, 12 insertions(+), 14 deletions(-) > > diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c > index 45fd4850bacb..b0cde2211987 100644 > --- a/drivers/iommu/exynos-iommu.c > +++ b/drivers/iommu/exynos-iommu.c > @@ -708,10 +708,6 @@ static int exynos_sysmmu_probe(struct platform_device *pdev) > if (ret) > return ret; > > - ret = iommu_device_register(&data->iommu, &exynos_iommu_ops, dev); > - if (ret) > - goto err_iommu_register; > - > platform_set_drvdata(pdev, data); > > if (PG_ENT_SHIFT < 0) { > @@ -743,11 +739,13 @@ static int exynos_sysmmu_probe(struct platform_device *pdev) > > pm_runtime_enable(dev); > > + ret = iommu_device_register(&data->iommu, &exynos_iommu_ops, dev); > + if (ret) > + goto err_dma_set_mask; > + > return 0; > > err_dma_set_mask: > - iommu_device_unregister(&data->iommu); > -err_iommu_register: > iommu_device_sysfs_remove(&data->iommu); > return ret; > } > @@ -1432,12 +1430,6 @@ static int __init exynos_iommu_init(void) > return -ENOMEM; > } > > - ret = platform_driver_register(&exynos_sysmmu_driver); > - if (ret) { > - pr_err("%s: Failed to register driver\n", __func__); > - goto err_reg_driver; > - } > - > zero_lv2_table = kmem_cache_zalloc(lv2table_kmem_cache, GFP_KERNEL); > if (zero_lv2_table == NULL) { > pr_err("%s: Failed to allocate zero level2 page table\n", > @@ -1446,10 +1438,16 @@ static int __init exynos_iommu_init(void) > goto err_zero_lv2; > } > > + ret = platform_driver_register(&exynos_sysmmu_driver); > + if (ret) { > + pr_err("%s: Failed to register driver\n", __func__); > + goto err_reg_driver; > + } > + > return 0; > -err_zero_lv2: > - platform_driver_unregister(&exynos_sysmmu_driver); > err_reg_driver: > + platform_driver_unregister(&exynos_sysmmu_driver); > +err_zero_lv2: > kmem_cache_destroy(lv2table_kmem_cache); > return ret; > } > -- > 2.17.1 >
On Thu, Nov 10, 2022 at 04:44:07PM +0100, Marek Szyprowski wrote: > Registering a SYSMMU platform driver might directly trigger initializing > IOMMU domains and performing the initial mappings. Also the IOMMU core > might use the IOMMU hardware once it has been registered with > iommu_device_register() function. Ensure that all driver resources are > allocated and initialized before the driver advertise its presence to the > platform bus and the IOMMU subsystem. > > Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> > --- > drivers/iommu/exynos-iommu.c | 26 ++++++++++++-------------- > 1 file changed, 12 insertions(+), 14 deletions(-) Removed v1 and applied this instead, thanks.
diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c index 45fd4850bacb..b0cde2211987 100644 --- a/drivers/iommu/exynos-iommu.c +++ b/drivers/iommu/exynos-iommu.c @@ -708,10 +708,6 @@ static int exynos_sysmmu_probe(struct platform_device *pdev) if (ret) return ret; - ret = iommu_device_register(&data->iommu, &exynos_iommu_ops, dev); - if (ret) - goto err_iommu_register; - platform_set_drvdata(pdev, data); if (PG_ENT_SHIFT < 0) { @@ -743,11 +739,13 @@ static int exynos_sysmmu_probe(struct platform_device *pdev) pm_runtime_enable(dev); + ret = iommu_device_register(&data->iommu, &exynos_iommu_ops, dev); + if (ret) + goto err_dma_set_mask; + return 0; err_dma_set_mask: - iommu_device_unregister(&data->iommu); -err_iommu_register: iommu_device_sysfs_remove(&data->iommu); return ret; } @@ -1432,12 +1430,6 @@ static int __init exynos_iommu_init(void) return -ENOMEM; } - ret = platform_driver_register(&exynos_sysmmu_driver); - if (ret) { - pr_err("%s: Failed to register driver\n", __func__); - goto err_reg_driver; - } - zero_lv2_table = kmem_cache_zalloc(lv2table_kmem_cache, GFP_KERNEL); if (zero_lv2_table == NULL) { pr_err("%s: Failed to allocate zero level2 page table\n", @@ -1446,10 +1438,16 @@ static int __init exynos_iommu_init(void) goto err_zero_lv2; } + ret = platform_driver_register(&exynos_sysmmu_driver); + if (ret) { + pr_err("%s: Failed to register driver\n", __func__); + goto err_reg_driver; + } + return 0; -err_zero_lv2: - platform_driver_unregister(&exynos_sysmmu_driver); err_reg_driver: + platform_driver_unregister(&exynos_sysmmu_driver); +err_zero_lv2: kmem_cache_destroy(lv2table_kmem_cache); return ret; }
Registering a SYSMMU platform driver might directly trigger initializing IOMMU domains and performing the initial mappings. Also the IOMMU core might use the IOMMU hardware once it has been registered with iommu_device_register() function. Ensure that all driver resources are allocated and initialized before the driver advertise its presence to the platform bus and the IOMMU subsystem. Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> --- drivers/iommu/exynos-iommu.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-)