Skip to content

Commit 912cc87

Browse files
kvaneeshmpe
authored andcommitted
powerpc/mm/radix: Add LPID based tlb flush helpers
We add a tlb flush variant, to flush LPID mappings. Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
1 parent 83209bc commit 912cc87

File tree

2 files changed

+55
-1
lines changed

2 files changed

+55
-1
lines changed

arch/powerpc/include/asm/book3s/64/tlbflush-radix.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,7 @@ extern void radix__flush_tlb_pwc(struct mmu_gather *tlb, unsigned long addr);
3232
#define radix___flush_tlb_page(mm,addr,p,i) radix___local_flush_tlb_page(mm,addr,p,i)
3333
#define radix__flush_tlb_pwc(tlb, addr) radix__local_flush_tlb_pwc(tlb, addr)
3434
#endif
35-
35+
extern void radix__flush_tlb_lpid_va(unsigned long lpid, unsigned long gpa,
36+
unsigned long page_size);
37+
extern void radix__flush_tlb_lpid(unsigned long lpid);
3638
#endif

arch/powerpc/mm/tlb-radix.c

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,9 +282,61 @@ void radix__flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
282282
}
283283
EXPORT_SYMBOL(radix__flush_tlb_range);
284284

285+
static int radix_get_mmu_psize(int page_size)
286+
{
287+
int psize;
288+
289+
if (page_size == (1UL << mmu_psize_defs[mmu_virtual_psize].shift))
290+
psize = mmu_virtual_psize;
291+
else if (page_size == (1UL << mmu_psize_defs[MMU_PAGE_2M].shift))
292+
psize = MMU_PAGE_2M;
293+
else if (page_size == (1UL << mmu_psize_defs[MMU_PAGE_1G].shift))
294+
psize = MMU_PAGE_1G;
295+
else
296+
return -1;
297+
return psize;
298+
}
285299

286300
void radix__tlb_flush(struct mmu_gather *tlb)
287301
{
288302
struct mm_struct *mm = tlb->mm;
289303
radix__flush_tlb_mm(mm);
290304
}
305+
306+
void radix__flush_tlb_lpid_va(unsigned long lpid, unsigned long gpa,
307+
unsigned long page_size)
308+
{
309+
unsigned long rb,rs,prs,r;
310+
unsigned long ap;
311+
unsigned long ric = RIC_FLUSH_TLB;
312+
313+
ap = mmu_get_ap(radix_get_mmu_psize(page_size));
314+
rb = gpa & ~(PPC_BITMASK(52, 63));
315+
rb |= ap << PPC_BITLSHIFT(58);
316+
rs = lpid & ((1UL << 32) - 1);
317+
prs = 0; /* process scoped */
318+
r = 1; /* raidx format */
319+
320+
asm volatile("ptesync": : :"memory");
321+
asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1)
322+
: : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory");
323+
asm volatile("eieio; tlbsync; ptesync": : :"memory");
324+
}
325+
EXPORT_SYMBOL(radix__flush_tlb_lpid_va);
326+
327+
void radix__flush_tlb_lpid(unsigned long lpid)
328+
{
329+
unsigned long rb,rs,prs,r;
330+
unsigned long ric = RIC_FLUSH_ALL;
331+
332+
rb = 0x2 << PPC_BITLSHIFT(53); /* IS = 2 */
333+
rs = lpid & ((1UL << 32) - 1);
334+
prs = 0; /* partition scoped */
335+
r = 1; /* raidx format */
336+
337+
asm volatile("ptesync": : :"memory");
338+
asm volatile(PPC_TLBIE_5(%0, %4, %3, %2, %1)
339+
: : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory");
340+
asm volatile("eieio; tlbsync; ptesync": : :"memory");
341+
}
342+
EXPORT_SYMBOL(radix__flush_tlb_lpid);

0 commit comments

Comments
 (0)