diff options
-rw-r--r-- | arch/arm64/mm/dma-mapping.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c index 1d7d5d2881db..0ec1ae933342 100644 --- a/arch/arm64/mm/dma-mapping.c +++ b/arch/arm64/mm/dma-mapping.c | |||
@@ -835,14 +835,21 @@ static bool do_iommu_attach(struct device *dev, const struct iommu_ops *ops, | |||
835 | * then the IOMMU core will have already configured a group for this | 835 | * then the IOMMU core will have already configured a group for this |
836 | * device, and allocated the default domain for that group. | 836 | * device, and allocated the default domain for that group. |
837 | */ | 837 | */ |
838 | if (!domain || iommu_dma_init_domain(domain, dma_base, size, dev)) { | 838 | if (!domain) |
839 | pr_warn("Failed to set up IOMMU for device %s; retaining platform DMA ops\n", | 839 | goto out_err; |
840 | dev_name(dev)); | 840 | |
841 | return false; | 841 | if (domain->type == IOMMU_DOMAIN_DMA) { |
842 | if (iommu_dma_init_domain(domain, dma_base, size, dev)) | ||
843 | goto out_err; | ||
844 | |||
845 | dev->archdata.dma_ops = &iommu_dma_ops; | ||
842 | } | 846 | } |
843 | 847 | ||
844 | dev->archdata.dma_ops = &iommu_dma_ops; | ||
845 | return true; | 848 | return true; |
849 | out_err: | ||
850 | pr_warn("Failed to set up IOMMU for device %s; retaining platform DMA ops\n", | ||
851 | dev_name(dev)); | ||
852 | return false; | ||
846 | } | 853 | } |
847 | 854 | ||
848 | static void queue_iommu_attach(struct device *dev, const struct iommu_ops *ops, | 855 | static void queue_iommu_attach(struct device *dev, const struct iommu_ops *ops, |