arm64: Hook up IOMMU dma_ops
With iommu_dma_ops in place, hook them up to the configuration code, so IOMMU-fronted devices will get them automatically. Acked-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Robin Murphy <robin.murphy@arm.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
		
							parent
							
								
									13b8629f65
								
							
						
					
					
						commit
						876945dbf6
					
				| @ -75,6 +75,7 @@ config ARM64 | |||||||
| 	select HAVE_PERF_USER_STACK_DUMP | 	select HAVE_PERF_USER_STACK_DUMP | ||||||
| 	select HAVE_RCU_TABLE_FREE | 	select HAVE_RCU_TABLE_FREE | ||||||
| 	select HAVE_SYSCALL_TRACEPOINTS | 	select HAVE_SYSCALL_TRACEPOINTS | ||||||
|  | 	select IOMMU_DMA if IOMMU_SUPPORT | ||||||
| 	select IRQ_DOMAIN | 	select IRQ_DOMAIN | ||||||
| 	select IRQ_FORCED_THREADING | 	select IRQ_FORCED_THREADING | ||||||
| 	select MODULES_USE_ELF_RELA | 	select MODULES_USE_ELF_RELA | ||||||
|  | |||||||
| @ -54,16 +54,15 @@ static inline struct dma_map_ops *get_dma_ops(struct device *dev) | |||||||
| 		return __generic_dma_ops(dev); | 		return __generic_dma_ops(dev); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static inline void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size, | void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size, | ||||||
| 				      struct iommu_ops *iommu, bool coherent) | 			struct iommu_ops *iommu, bool coherent); | ||||||
| { |  | ||||||
| 	if (!acpi_disabled && !dev->archdata.dma_ops) |  | ||||||
| 		dev->archdata.dma_ops = dma_ops; |  | ||||||
| 
 |  | ||||||
| 	dev->archdata.dma_coherent = coherent; |  | ||||||
| } |  | ||||||
| #define arch_setup_dma_ops	arch_setup_dma_ops | #define arch_setup_dma_ops	arch_setup_dma_ops | ||||||
| 
 | 
 | ||||||
|  | #ifdef CONFIG_IOMMU_DMA | ||||||
|  | void arch_teardown_dma_ops(struct device *dev); | ||||||
|  | #define arch_teardown_dma_ops	arch_teardown_dma_ops | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| /* do not use this function in a driver */ | /* do not use this function in a driver */ | ||||||
| static inline bool is_device_dma_coherent(struct device *dev) | static inline bool is_device_dma_coherent(struct device *dev) | ||||||
| { | { | ||||||
|  | |||||||
| @ -960,6 +960,19 @@ static void __iommu_setup_dma_ops(struct device *dev, u64 dma_base, u64 size, | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void arch_teardown_dma_ops(struct device *dev) | ||||||
|  | { | ||||||
|  | 	struct iommu_domain *domain = iommu_get_domain_for_dev(dev); | ||||||
|  | 
 | ||||||
|  | 	if (domain) { | ||||||
|  | 		iommu_detach_device(domain, dev); | ||||||
|  | 		if (domain->type & __IOMMU_DOMAIN_FAKE_DEFAULT) | ||||||
|  | 			iommu_domain_free(domain); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	dev->archdata.dma_ops = NULL; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #else | #else | ||||||
| 
 | 
 | ||||||
| static void __iommu_setup_dma_ops(struct device *dev, u64 dma_base, u64 size, | static void __iommu_setup_dma_ops(struct device *dev, u64 dma_base, u64 size, | ||||||
| @ -968,3 +981,12 @@ static void __iommu_setup_dma_ops(struct device *dev, u64 dma_base, u64 size, | |||||||
| 
 | 
 | ||||||
| #endif  /* CONFIG_IOMMU_DMA */ | #endif  /* CONFIG_IOMMU_DMA */ | ||||||
| 
 | 
 | ||||||
|  | void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size, | ||||||
|  | 			struct iommu_ops *iommu, bool coherent) | ||||||
|  | { | ||||||
|  | 	if (!acpi_disabled && !dev->archdata.dma_ops) | ||||||
|  | 		dev->archdata.dma_ops = dma_ops; | ||||||
|  | 
 | ||||||
|  | 	dev->archdata.dma_coherent = coherent; | ||||||
|  | 	__iommu_setup_dma_ops(dev, dma_base, size, iommu); | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user