]> git.ipfire.org Git - thirdparty/kernel/stable.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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 20 Apr 2025 08:15:09 +0000 (10:15 +0200)
[ Upstream commit 99deffc409b69000ac4877486e69ec6516becd53 ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/iommu/exynos-iommu.c

index c666ecab955d210087abeb81af6b9ca3341dc2cf..7465dbb6fa80c8e29afb4d08daf9d0b7a94f5b09 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);
                }