From bc28191b165bb07f2817219da1b8c20246d022f6 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Thu, 15 May 2014 12:40:45 +0200 Subject: iommu/ipmmu-vmsa: Define driver-specific page directory sizes The PTRS_PER_(PUD|PGD|PMD|PTE) macros evaluate to different values depending on whether LPAE is enabled. The IPMMU driver uses a long descriptor format regardless of LPAE, making those macros mismatch the IPMMU configuration on non-LPAE systems. Replace the macros by driver-specific versions that always evaluate to the right value. Signed-off-by: Laurent Pinchart Signed-off-by: Joerg Roedel --- drivers/iommu/ipmmu-vmsa.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) (limited to 'drivers/iommu/ipmmu-vmsa.c') diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c index 0fd322dcb4eb..f8f5b194a360 100644 --- a/drivers/iommu/ipmmu-vmsa.c +++ b/drivers/iommu/ipmmu-vmsa.c @@ -209,6 +209,11 @@ static LIST_HEAD(ipmmu_devices); #define ARM_VMSA_PTE_MEMATTR_NC (((pteval_t)0x5) << 2) #define ARM_VMSA_PTE_MEMATTR_DEV (((pteval_t)0x1) << 2) +#define IPMMU_PTRS_PER_PTE 512 +#define IPMMU_PTRS_PER_PMD 512 +#define IPMMU_PTRS_PER_PGD 4 +#define IPMMU_PTRS_PER_PUD 1 + /* ----------------------------------------------------------------------------- * Read/Write Access */ @@ -327,7 +332,7 @@ static int ipmmu_domain_init_context(struct ipmmu_vmsa_domain *domain) /* TTBR0 */ ipmmu_flush_pgtable(domain->mmu, domain->pgd, - PTRS_PER_PGD * sizeof(*domain->pgd)); + IPMMU_PTRS_PER_PGD * sizeof(*domain->pgd)); ttbr = __pa(domain->pgd); ipmmu_ctx_write(domain, IMTTLBR0, ttbr); ipmmu_ctx_write(domain, IMTTUBR0, ttbr >> 32); @@ -469,7 +474,7 @@ static void ipmmu_free_pmds(pud_t *pud) unsigned int i; pmd = pmd_base; - for (i = 0; i < PTRS_PER_PMD; ++i) { + for (i = 0; i < IPMMU_PTRS_PER_PMD; ++i) { if (pmd_none(*pmd)) continue; @@ -486,7 +491,7 @@ static void ipmmu_free_puds(pgd_t *pgd) unsigned int i; pud = pud_base; - for (i = 0; i < PTRS_PER_PUD; ++i) { + for (i = 0; i < IPMMU_PTRS_PER_PUD; ++i) { if (pud_none(*pud)) continue; @@ -509,7 +514,7 @@ static void ipmmu_free_pgtables(struct ipmmu_vmsa_domain *domain) * tables. */ pgd = pgd_base; - for (i = 0; i < PTRS_PER_PGD; ++i) { + for (i = 0; i < IPMMU_PTRS_PER_PGD; ++i) { if (pgd_none(*pgd)) continue; ipmmu_free_puds(pgd); @@ -694,7 +699,7 @@ static int ipmmu_domain_init(struct iommu_domain *io_domain) spin_lock_init(&domain->lock); - domain->pgd = kzalloc(PTRS_PER_PGD * sizeof(pgd_t), GFP_KERNEL); + domain->pgd = kzalloc(IPMMU_PTRS_PER_PGD * sizeof(pgd_t), GFP_KERNEL); if (!domain->pgd) { kfree(domain); return -ENOMEM; -- cgit v1.2.3