|
@@ -1372,16 +1372,17 @@ static int arm_iommu_mmap_attrs(struct device *dev, struct vm_area_struct *vma,
|
|
|
void arm_iommu_free_attrs(struct device *dev, size_t size, void *cpu_addr,
|
|
|
dma_addr_t handle, struct dma_attrs *attrs)
|
|
|
{
|
|
|
- struct page **pages = __iommu_get_pages(cpu_addr, attrs);
|
|
|
+ struct page **pages;
|
|
|
size = PAGE_ALIGN(size);
|
|
|
|
|
|
- if (!pages) {
|
|
|
- WARN(1, "trying to free invalid coherent area: %p\n", cpu_addr);
|
|
|
+ if (__in_atomic_pool(cpu_addr, size)) {
|
|
|
+ __iommu_free_atomic(dev, cpu_addr, handle, size);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (__in_atomic_pool(cpu_addr, size)) {
|
|
|
- __iommu_free_atomic(dev, cpu_addr, handle, size);
|
|
|
+ pages = __iommu_get_pages(cpu_addr, attrs);
|
|
|
+ if (!pages) {
|
|
|
+ WARN(1, "trying to free invalid coherent area: %p\n", cpu_addr);
|
|
|
return;
|
|
|
}
|
|
|
|