aboutsummaryrefslogtreecommitdiff
path: root/arch/arm/mm/dma-mapping.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mm/dma-mapping.c')
-rw-r--r--arch/arm/mm/dma-mapping.c20
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])