diff options
Diffstat (limited to 'arch/powerpc/mm/pgtable.c')
| -rw-r--r-- | arch/powerpc/mm/pgtable.c | 31 | 
1 files changed, 31 insertions, 0 deletions
| diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c index 294775c793ab..6498454959f3 100644 --- a/arch/powerpc/mm/pgtable.c +++ b/arch/powerpc/mm/pgtable.c @@ -331,6 +331,37 @@ void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep,  		__set_huge_pte_at(pmdp, ptep, pte_val(pte));  	}  } +#elif defined(CONFIG_PPC_E500) +void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, +		     pte_t pte, unsigned long sz) +{ +	unsigned long pdsize; +	int i; + +	pte = set_pte_filter(pte, addr); + +	/* +	 * Make sure hardware valid bit is not set. We don't do +	 * tlb flush for this update. +	 */ +	VM_WARN_ON(pte_hw_valid(*ptep) && !pte_protnone(*ptep)); + +	if (sz < PMD_SIZE) +		pdsize = PAGE_SIZE; +	else if (sz < PUD_SIZE) +		pdsize = PMD_SIZE; +	else if (sz < P4D_SIZE) +		pdsize = PUD_SIZE; +	else if (sz < PGDIR_SIZE) +		pdsize = P4D_SIZE; +	else +		pdsize = PGDIR_SIZE; + +	for (i = 0; i < sz / pdsize; i++, ptep++, addr += pdsize) { +		__set_pte_at(mm, addr, ptep, pte, 0); +		pte = __pte(pte_val(pte) + ((unsigned long long)pdsize / PAGE_SIZE << PFN_PTE_SHIFT)); +	} +}  #endif  #endif /* CONFIG_HUGETLB_PAGE */ | 
