diff options
Diffstat (limited to 'arch/arm/mm/dma-mapping.c')
| -rw-r--r-- | arch/arm/mm/dma-mapping.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 66df085b715..9a428a1a33f 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -580,13 +580,16 @@ static void *__alloc_from_contiguous(struct device *dev, size_t size, { unsigned long order = get_order(size); size_t count = size >> PAGE_SHIFT; + unsigned long pfn; struct page *page; void *ptr; - page = dma_alloc_from_contiguous(dev, count, order); - if (!page) + pfn = dma_alloc_from_contiguous(dev, count, order); + if (!pfn) return NULL; + page = pfn_to_page(pfn); + __dma_clear_buffer(page, size); if (PageHighMem(page)) { @@ -601,7 +604,7 @@ static void *__alloc_from_contiguous(struct device *dev, size_t size, ptr = __dma_alloc_remap(page, size, GFP_KERNEL, prot, caller); if (!ptr) { - dma_release_from_contiguous(dev, page, count); + dma_release_from_contiguous(dev, pfn, count); return NULL; } } @@ -620,7 +623,7 @@ static void __free_from_contiguous(struct device *dev, struct page *page, __dma_free_remap(cpu_addr, size, true); else __dma_remap(page, size, pgprot_kernel, false); - dma_release_from_contiguous(dev, page, size >> PAGE_SHIFT); + dma_release_from_contiguous(dev, page_to_pfn(page), size >> PAGE_SHIFT); } static inline pgprot_t __get_dma_pgprot(struct dma_attrs *attrs, pgprot_t prot) @@ -1127,11 +1130,14 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, { unsigned long order = get_order(size); struct page *page; + unsigned long pfn; - page = dma_alloc_from_contiguous(dev, count, order); - if (!page) + pfn = dma_alloc_from_contiguous(dev, count, order); + if (!pfn) goto error; + pfn = pfn_to_page(pfn); + __dma_clear_buffer(page, size); for (i = 0; i < count; i++) @@ -1186,7 +1192,7 @@ static int __iommu_free_buffer(struct device *dev, struct page **pages, int i; if (dma_get_attr(DMA_ATTR_FORCE_CONTIGUOUS, attrs)) { - dma_release_from_contiguous(dev, pages[0], count); + dma_release_from_contiguous(dev, page_to_pfn(pages[0]), count); } else { for (i = 0; i < count; i++) if (pages[i]) |
