]> www.infradead.org Git - users/hch/misc.git/commitdiff
iommu/exynos: Fix suspend/resume with IDENTITY domain
authorMarek Szyprowski <m.szyprowski@samsung.com>
Tue, 1 Apr 2025 20:27:31 +0000 (22:27 +0200)
committerJoerg Roedel <jroedel@suse.de>
Fri, 11 Apr 2025 10:40:41 +0000 (12:40 +0200)
Commit bcb81ac6ae3c ("iommu: Get DT/ACPI parsing into the proper probe
path") changed the sequence of probing the SYSMMU controller devices and
calls to arm_iommu_attach_device(), what results in resuming SYSMMU
controller earlier, when it is still set to IDENTITY mapping. Such change
revealed the bug in IDENTITY handling in the exynos-iommu driver. When
SYSMMU controller is set to IDENTITY mapping, data->domain is NULL, so
adjust checks in suspend & resume callbacks to handle this case
correctly.

Fixes: b3d14960e629 ("iommu/exynos: Implement an IDENTITY domain")
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Link: https://lore.kernel.org/r/20250401202731.2810474-1-m.szyprowski@samsung.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/exynos-iommu.c

index 69e23e017d9e5f04d1bfe600ddb79f19ac924f32..317266aca6e28e945479701940561ce8813be90e 100644 (file)
@@ -832,7 +832,7 @@ static int __maybe_unused exynos_sysmmu_suspend(struct device *dev)
                struct exynos_iommu_owner *owner = dev_iommu_priv_get(master);
 
                mutex_lock(&owner->rpm_lock);
-               if (&data->domain->domain != &exynos_identity_domain) {
+               if (data->domain) {
                        dev_dbg(data->sysmmu, "saving state\n");
                        __sysmmu_disable(data);
                }
@@ -850,7 +850,7 @@ static int __maybe_unused exynos_sysmmu_resume(struct device *dev)
                struct exynos_iommu_owner *owner = dev_iommu_priv_get(master);
 
                mutex_lock(&owner->rpm_lock);
-               if (&data->domain->domain != &exynos_identity_domain) {
+               if (data->domain) {
                        dev_dbg(data->sysmmu, "restoring state\n");
                        __sysmmu_enable(data);
                }