Skip to content

Commit bbc4d20

Browse files
mszyprowjoergroedel
authored andcommitted
iommu/exynos: Fix driver initialization sequence
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 <[email protected]> Reviewed-by: Sam Protsenko <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Joerg Roedel <[email protected]>
1 parent 30a0b95 commit bbc4d20

File tree

1 file changed

+12
-14
lines changed

1 file changed

+12
-14
lines changed

drivers/iommu/exynos-iommu.c

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -708,10 +708,6 @@ static int exynos_sysmmu_probe(struct platform_device *pdev)
708708
if (ret)
709709
return ret;
710710

711-
ret = iommu_device_register(&data->iommu, &exynos_iommu_ops, dev);
712-
if (ret)
713-
goto err_iommu_register;
714-
715711
platform_set_drvdata(pdev, data);
716712

717713
if (PG_ENT_SHIFT < 0) {
@@ -743,11 +739,13 @@ static int exynos_sysmmu_probe(struct platform_device *pdev)
743739

744740
pm_runtime_enable(dev);
745741

742+
ret = iommu_device_register(&data->iommu, &exynos_iommu_ops, dev);
743+
if (ret)
744+
goto err_dma_set_mask;
745+
746746
return 0;
747747

748748
err_dma_set_mask:
749-
iommu_device_unregister(&data->iommu);
750-
err_iommu_register:
751749
iommu_device_sysfs_remove(&data->iommu);
752750
return ret;
753751
}
@@ -1432,12 +1430,6 @@ static int __init exynos_iommu_init(void)
14321430
return -ENOMEM;
14331431
}
14341432

1435-
ret = platform_driver_register(&exynos_sysmmu_driver);
1436-
if (ret) {
1437-
pr_err("%s: Failed to register driver\n", __func__);
1438-
goto err_reg_driver;
1439-
}
1440-
14411433
zero_lv2_table = kmem_cache_zalloc(lv2table_kmem_cache, GFP_KERNEL);
14421434
if (zero_lv2_table == NULL) {
14431435
pr_err("%s: Failed to allocate zero level2 page table\n",
@@ -1446,10 +1438,16 @@ static int __init exynos_iommu_init(void)
14461438
goto err_zero_lv2;
14471439
}
14481440

1441+
ret = platform_driver_register(&exynos_sysmmu_driver);
1442+
if (ret) {
1443+
pr_err("%s: Failed to register driver\n", __func__);
1444+
goto err_reg_driver;
1445+
}
1446+
14491447
return 0;
1450-
err_zero_lv2:
1451-
platform_driver_unregister(&exynos_sysmmu_driver);
14521448
err_reg_driver:
1449+
platform_driver_unregister(&exynos_sysmmu_driver);
1450+
err_zero_lv2:
14531451
kmem_cache_destroy(lv2table_kmem_cache);
14541452
return ret;
14551453
}

0 commit comments

Comments
 (0)