Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bbead78c authored by Scott Wood's avatar Scott Wood
Browse files

powerpc/fsl-book3e-64: Use paca for hugetlb TLB1 entry selection



This keeps usage coordinated for hugetlb and indirect entries, which
should make entry selection more predictable and probably improve overall
performance when mixing the two.

Signed-off-by: default avatarScott Wood <scottwood@freescale.com>
parent 28efc35f
Loading
Loading
Loading
Loading
+41 −10
Original line number Diff line number Diff line
@@ -8,6 +8,44 @@
#include <linux/mm.h>
#include <linux/hugetlb.h>

#ifdef CONFIG_PPC_FSL_BOOK3E
#ifdef CONFIG_PPC64
static inline int tlb1_next(void)
{
	struct paca_struct *paca = get_paca();
	struct tlb_core_data *tcd;
	int this, next;

	tcd = paca->tcd_ptr;
	this = tcd->esel_next;

	next = this + 1;
	if (next >= tcd->esel_max)
		next = tcd->esel_first;

	tcd->esel_next = next;
	return this;
}
#else
static inline int tlb1_next(void)
{
	int index, ncams;

	ncams = mfspr(SPRN_TLB1CFG) & TLBnCFG_N_ENTRY;

	index = __get_cpu_var(next_tlbcam_idx);

	/* Just round-robin the entries and wrap when we hit the end */
	if (unlikely(index == ncams - 1))
		__get_cpu_var(next_tlbcam_idx) = tlbcam_index;
	else
		__get_cpu_var(next_tlbcam_idx)++;

	return index;
}
#endif /* !PPC64 */
#endif /* FSL */

static inline int mmu_get_tsize(int psize)
{
	return mmu_psize_defs[psize].enc;
@@ -47,7 +85,7 @@ void book3e_hugetlb_preload(struct vm_area_struct *vma, unsigned long ea,
	struct mm_struct *mm;

#ifdef CONFIG_PPC_FSL_BOOK3E
	int index, ncams;
	int index;
#endif

	if (unlikely(is_kernel_addr(ea)))
@@ -77,18 +115,11 @@ void book3e_hugetlb_preload(struct vm_area_struct *vma, unsigned long ea,
	}

#ifdef CONFIG_PPC_FSL_BOOK3E
	ncams = mfspr(SPRN_TLB1CFG) & TLBnCFG_N_ENTRY;

	/* We have to use the CAM(TLB1) on FSL parts for hugepages */
	index = __get_cpu_var(next_tlbcam_idx);
	index = tlb1_next();
	mtspr(SPRN_MAS0, MAS0_ESEL(index) | MAS0_TLBSEL(1));

	/* Just round-robin the entries and wrap when we hit the end */
	if (unlikely(index == ncams - 1))
		__get_cpu_var(next_tlbcam_idx) = tlbcam_index;
	else
		__get_cpu_var(next_tlbcam_idx)++;
#endif

	mas1 = MAS1_VALID | MAS1_TID(mm->context.id) | MAS1_TSIZE(tsize);
	mas2 = ea & ~((1UL << shift) - 1);
	mas2 |= (pte_val(pte) >> PTE_WIMGE_SHIFT) & MAS2_WIMGE_MASK;