diff options
author | Marek Szyprowski <m.szyprowski@samsung.com> | 2017-01-09 13:03:56 +0100 |
---|---|---|
committer | Joerg Roedel <jroedel@suse.de> | 2017-01-10 15:01:21 +0100 |
commit | fff2fd1a9e4be3267f8ace2b4d7d80da13d1f0d9 (patch) | |
tree | 2b88e03ed29de10cba573c2733e3b1efe3da0391 /drivers/iommu/exynos-iommu.c | |
parent | 0bd5a0c77ad49ce5cf631bbe5616b6625ff50d96 (diff) |
iommu/exynos: Properly release device from the default domain in ->remove
IOMMU core doesn't detach device from the default domain before calling
->iommu_remove_device, so check that and do the proper cleanup or
warn if device is still attached to non-default domain.
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Diffstat (limited to 'drivers/iommu/exynos-iommu.c')
-rw-r--r-- | drivers/iommu/exynos-iommu.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c index 91f78272167c..fa529c2125f5 100644 --- a/drivers/iommu/exynos-iommu.c +++ b/drivers/iommu/exynos-iommu.c @@ -1242,9 +1242,21 @@ static int exynos_iommu_add_device(struct device *dev) static void exynos_iommu_remove_device(struct device *dev) { + struct exynos_iommu_owner *owner = dev->archdata.iommu; + if (!has_sysmmu(dev)) return; + if (owner->domain) { + struct iommu_group *group = iommu_group_get(dev); + + if (group) { + WARN_ON(owner->domain != + iommu_group_default_domain(group)); + exynos_iommu_detach_device(owner->domain, dev); + iommu_group_put(group); + } + } iommu_group_remove_device(dev); } |