From 312a952287328cb7801a2bca1684cb9c4555ca23 Mon Sep 17 00:00:00 2001 From: Peng Fan Date: Wed, 28 Jun 2017 10:46:03 +0800 Subject: [PATCH] MLK-15007-1 iommu: arm: pgtable: alloc pagetable in DMA area Normally the iommu pagetable could be in 64bit address space, but we have one patch to address PCIE driver, 'commit 9e03e5076269 ("MLK-15064-2 ARM64: DMA: limit the dma mask to be 32bit")' The patch restrict swiotlb and iommu dma to be in 32bit address. So if we allocate pages in highmem, then dma_map_single will return a 32bit address. Then, we will get "Cannot accommodate DMA translation for IOMMU page tables", because `dma != virt_to_phys(pages)`. So we strict the lpae iommu pgtable in DMA area to fix this issue. Signed-off-by: Peng Fan --- drivers/iommu/io-pgtable-arm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/io-pgtable-arm.c b/drivers/iommu/io-pgtable-arm.c index e8018a308868..3ef96c2957ad 100644 --- a/drivers/iommu/io-pgtable-arm.c +++ b/drivers/iommu/io-pgtable-arm.c @@ -14,6 +14,7 @@ * along with this program. If not, see . * * Copyright (C) 2014 ARM Limited + * Copyright 2017 NXP * * Author: Will Deacon */ @@ -215,7 +216,7 @@ static void *__arm_lpae_alloc_pages(size_t size, gfp_t gfp, { struct device *dev = cfg->iommu_dev; dma_addr_t dma; - void *pages = alloc_pages_exact(size, gfp | __GFP_ZERO); + void *pages = alloc_pages_exact(size, gfp | __GFP_ZERO | __GFP_DMA); if (!pages) return NULL;