16bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#ifndef _ASM_SCORE_TLBFLUSH_H
26bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define _ASM_SCORE_TLBFLUSH_H
36bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
46bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#include <linux/mm.h>
56bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
66bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin/*
76bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * TLB flushing:
86bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin *
96bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * - flush_tlb_all() flushes all processes TLB entries
106bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * - flush_tlb_mm(mm) flushes the specified mm context TLB entries
116bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * - flush_tlb_page(vma, vmaddr) flushes one page
126bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * - flush_tlb_range(vma, start, end) flushes a range of pages
136bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin * - flush_tlb_kernel_range(start, end) flushes a range of kernel pages
146bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin */
156bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinextern void local_flush_tlb_all(void);
166bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinextern void local_flush_tlb_mm(struct mm_struct *mm);
176bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinextern void local_flush_tlb_range(struct vm_area_struct *vma,
186bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	unsigned long start, unsigned long end);
196bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinextern void local_flush_tlb_kernel_range(unsigned long start,
206bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	unsigned long end);
216bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinextern void local_flush_tlb_page(struct vm_area_struct *vma,
226bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	unsigned long page);
236bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinextern void local_flush_tlb_one(unsigned long vaddr);
246bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
256bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define flush_tlb_all()			local_flush_tlb_all()
266bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define flush_tlb_mm(mm)		local_flush_tlb_mm(mm)
276bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define flush_tlb_range(vma, vmaddr, end) \
286bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	local_flush_tlb_range(vma, vmaddr, end)
296bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define flush_tlb_kernel_range(vmaddr, end) \
306bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	local_flush_tlb_kernel_range(vmaddr, end)
316bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define flush_tlb_page(vma, page)	local_flush_tlb_page(vma, page)
326bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#define flush_tlb_one(vaddr)		local_flush_tlb_one(vaddr)
336bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
346bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#ifndef __ASSEMBLY__
356bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
366bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline unsigned long pevn_get(void)
376bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{
386bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	unsigned long val;
396bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
406bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	__asm__ __volatile__(
416bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		"mfcr %0, cr11\n"
426bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		"nop\nnop\n"
436bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		: "=r" (val));
446bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
456bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	return val;
466bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin}
476bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
486bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline void pevn_set(unsigned long val)
496bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{
506bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	__asm__ __volatile__(
516bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		"mtcr %0, cr11\n"
526bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		"nop\nnop\nnop\nnop\nnop\n"
536bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	: : "r" (val));
546bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin}
556bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
566bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline void pectx_set(unsigned long val)
576bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{
586bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	__asm__ __volatile__(
596bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		"mtcr %0, cr12\n"
606bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		"nop\nnop\nnop\nnop\nnop\n"
616bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	: : "r" (val));
626bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin}
636bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
646bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline unsigned long pectx_get(void)
656bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{
666bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	unsigned long val;
676bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	__asm__ __volatile__(
686bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		"mfcr %0, cr12\n"
696bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		"nop\nnop\n"
706bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	: "=r" (val));
716bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	return val;
726bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin}
736bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline unsigned long tlblock_get(void)
746bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{
756bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	unsigned long val;
766bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
776bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	__asm__ __volatile__(
786bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		"mfcr %0, cr7\n"
796bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		"nop\nnop\n"
806bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	: "=r" (val));
816bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	return val;
826bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin}
836bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline void tlblock_set(unsigned long val)
846bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{
856bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	__asm__ __volatile__(
866bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		"mtcr %0, cr7\n"
876bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		"nop\nnop\nnop\nnop\nnop\n"
886bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	: : "r" (val));
896bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin}
906bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
916bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline void tlbpt_set(unsigned long val)
926bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{
936bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	__asm__ __volatile__(
946bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		"mtcr %0, cr8\n"
956bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		"nop\nnop\nnop\nnop\nnop\n"
966bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		: : "r" (val));
976bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin}
986bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
996bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline long tlbpt_get(void)
1006bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{
1016bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	long val;
1026bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
1036bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	__asm__ __volatile__(
1046bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		"mfcr %0, cr8\n"
1056bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		"nop\nnop\n"
1066bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		: "=r" (val));
1076bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
1086bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	return val;
1096bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin}
1106bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
1116bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline void peaddr_set(unsigned long val)
1126bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{
1136bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	__asm__ __volatile__(
1146bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		"mtcr %0, cr9\n"
1156bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		"nop\nnop\nnop\nnop\nnop\n"
1166bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin		: : "r" (val));
1176bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin}
1186bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
1196bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin/* TLB operations. */
1206bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline void tlb_probe(void)
1216bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{
1226bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	__asm__ __volatile__("stlb;nop;nop;nop;nop;nop");
1236bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin}
1246bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
1256bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline void tlb_read(void)
1266bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{
1276bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	__asm__ __volatile__("mftlb;nop;nop;nop;nop;nop");
1286bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin}
1296bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
1306bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline void tlb_write_indexed(void)
1316bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{
1326bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	__asm__ __volatile__("mtptlb;nop;nop;nop;nop;nop");
1336bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin}
1346bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
1356bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqinstatic inline void tlb_write_random(void)
1366bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin{
1376bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin	__asm__ __volatile__("mtrtlb;nop;nop;nop;nop;nop");
1386bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin}
1396bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
1406bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#endif /* Not __ASSEMBLY__ */
1416bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin
1426bc9a3966f0395419b09b2ec90f89f7f00341b37Chen Liqin#endif /* _ASM_SCORE_TLBFLUSH_H */
143