diff options
| -rw-r--r-- | arch/arm64/mm/dma-mapping.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c index c2819df04b3f..6b151d483f5c 100644 --- a/arch/arm64/mm/dma-mapping.c +++ b/arch/arm64/mm/dma-mapping.c @@ -2114,12 +2114,19 @@ int arm_iommu_attach_device(struct device *dev, { int err; int s1_bypass = 0, is_fast = 0; + struct iommu_group *group; iommu_domain_get_attr(mapping->domain, DOMAIN_ATTR_FAST, &is_fast); if (is_fast) return fast_smmu_attach_device(dev, mapping); - err = iommu_attach_device(mapping->domain, dev); + group = iommu_group_get(dev); + if (!group) { + dev_err(dev, "Couldn't get group\n"); + return -ENODEV; + } + + err = iommu_attach_group(mapping->domain, group); if (err) return err; @@ -2147,6 +2154,7 @@ void arm_iommu_detach_device(struct device *dev) { struct dma_iommu_mapping *mapping; int is_fast; + struct iommu_group *group; mapping = to_dma_iommu_mapping(dev); if (!mapping) { @@ -2160,7 +2168,13 @@ void arm_iommu_detach_device(struct device *dev) return; } - iommu_detach_device(mapping->domain, dev); + group = iommu_group_get(dev); + if (!group) { + dev_err(dev, "Couldn't get group\n"); + return; + } + + iommu_detach_group(mapping->domain, group); kref_put(&mapping->kref, release_iommu_mapping); dev->archdata.mapping = NULL; set_dma_ops(dev, NULL); |
