1da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer#ifndef _M68K_TLBFLUSH_H
2da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer#define _M68K_TLBFLUSH_H
3da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
4da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer#ifdef CONFIG_MMU
5da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer#ifndef CONFIG_SUN3
6da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
7da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer#include <asm/current.h>
8b852de4e7f7d6f4373901e3a880f6f29a65e7937Greg Ungerer#include <asm/mcfmmu.h>
9da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
10da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void flush_tlb_kernel_page(void *addr)
11da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
12b852de4e7f7d6f4373901e3a880f6f29a65e7937Greg Ungerer	if (CPU_IS_COLDFIRE) {
13b852de4e7f7d6f4373901e3a880f6f29a65e7937Greg Ungerer		mmu_write(MMUOR, MMUOR_CNL);
14b852de4e7f7d6f4373901e3a880f6f29a65e7937Greg Ungerer	} else if (CPU_IS_040_OR_060) {
15da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		mm_segment_t old_fs = get_fs();
16da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		set_fs(KERNEL_DS);
17da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		__asm__ __volatile__(".chip 68040\n\t"
18da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer				     "pflush (%0)\n\t"
19da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer				     ".chip 68k"
20da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer				     : : "a" (addr));
21da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		set_fs(old_fs);
22da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	} else if (CPU_IS_020_OR_030)
23da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		__asm__ __volatile__("pflush #4,#4,(%0)" : : "a" (addr));
24da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
25da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
26da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer/*
27da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer * flush all user-space atc entries.
28da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer */
29da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void __flush_tlb(void)
30da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
31b852de4e7f7d6f4373901e3a880f6f29a65e7937Greg Ungerer	if (CPU_IS_COLDFIRE) {
32b852de4e7f7d6f4373901e3a880f6f29a65e7937Greg Ungerer		mmu_write(MMUOR, MMUOR_CNL);
33b852de4e7f7d6f4373901e3a880f6f29a65e7937Greg Ungerer	} else if (CPU_IS_040_OR_060) {
34da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		__asm__ __volatile__(".chip 68040\n\t"
35da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer				     "pflushan\n\t"
36da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer				     ".chip 68k");
37b852de4e7f7d6f4373901e3a880f6f29a65e7937Greg Ungerer	} else if (CPU_IS_020_OR_030) {
38da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		__asm__ __volatile__("pflush #0,#4");
39b852de4e7f7d6f4373901e3a880f6f29a65e7937Greg Ungerer	}
40da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
41da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
42da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void __flush_tlb040_one(unsigned long addr)
43da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
44da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	__asm__ __volatile__(".chip 68040\n\t"
45da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer			     "pflush (%0)\n\t"
46da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer			     ".chip 68k"
47da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer			     : : "a" (addr));
48da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
49da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
50da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void __flush_tlb_one(unsigned long addr)
51da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
52b852de4e7f7d6f4373901e3a880f6f29a65e7937Greg Ungerer	if (CPU_IS_COLDFIRE)
53b852de4e7f7d6f4373901e3a880f6f29a65e7937Greg Ungerer		mmu_write(MMUOR, MMUOR_CNL);
54b852de4e7f7d6f4373901e3a880f6f29a65e7937Greg Ungerer	else if (CPU_IS_040_OR_060)
55da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		__flush_tlb040_one(addr);
56da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	else if (CPU_IS_020_OR_030)
57da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		__asm__ __volatile__("pflush #0,#4,(%0)" : : "a" (addr));
58da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
59da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
60da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer#define flush_tlb() __flush_tlb()
61da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
62da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer/*
63da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer * flush all atc entries (both kernel and user-space entries).
64da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer */
65da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void flush_tlb_all(void)
66da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
67b852de4e7f7d6f4373901e3a880f6f29a65e7937Greg Ungerer	if (CPU_IS_COLDFIRE) {
68b852de4e7f7d6f4373901e3a880f6f29a65e7937Greg Ungerer		mmu_write(MMUOR, MMUOR_CNL);
69b852de4e7f7d6f4373901e3a880f6f29a65e7937Greg Ungerer	} else if (CPU_IS_040_OR_060) {
70da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		__asm__ __volatile__(".chip 68040\n\t"
71da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer				     "pflusha\n\t"
72da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer				     ".chip 68k");
73b852de4e7f7d6f4373901e3a880f6f29a65e7937Greg Ungerer	} else if (CPU_IS_020_OR_030) {
74da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		__asm__ __volatile__("pflusha");
75b852de4e7f7d6f4373901e3a880f6f29a65e7937Greg Ungerer	}
76da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
77da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
78da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void flush_tlb_mm(struct mm_struct *mm)
79da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
80da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	if (mm == current->active_mm)
81da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		__flush_tlb();
82da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
83da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
84da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void flush_tlb_page(struct vm_area_struct *vma, unsigned long addr)
85da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
86da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	if (vma->vm_mm == current->active_mm) {
87da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		mm_segment_t old_fs = get_fs();
88da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		set_fs(USER_DS);
89da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		__flush_tlb_one(addr);
90da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		set_fs(old_fs);
91da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	}
92da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
93da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
94da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void flush_tlb_range(struct vm_area_struct *vma,
95da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer				   unsigned long start, unsigned long end)
96da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
97da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	if (vma->vm_mm == current->active_mm)
98da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		__flush_tlb();
99da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
100da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
101da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void flush_tlb_kernel_range(unsigned long start, unsigned long end)
102da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
103da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	flush_tlb_all();
104da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
105da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
10649148020bcb6910ce71417bd990a5ce7017f9bd3Sam Ravnborg#else
107da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
108da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
109da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer/* Reserved PMEGs. */
110da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererextern char sun3_reserved_pmeg[SUN3_PMEGS_NUM];
111da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererextern unsigned long pmeg_vaddr[SUN3_PMEGS_NUM];
112da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererextern unsigned char pmeg_alloc[SUN3_PMEGS_NUM];
113da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererextern unsigned char pmeg_ctx[SUN3_PMEGS_NUM];
114da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
115da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer/* Flush all userspace mappings one by one...  (why no flush command,
116da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer   sun?) */
117da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void flush_tlb_all(void)
118da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
119da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer       unsigned long addr;
120da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer       unsigned char ctx, oldctx;
121da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
122da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer       oldctx = sun3_get_context();
123da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer       for(addr = 0x00000000; addr < TASK_SIZE; addr += SUN3_PMEG_SIZE) {
124da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	       for(ctx = 0; ctx < 8; ctx++) {
125da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		       sun3_put_context(ctx);
126da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		       sun3_put_segmap(addr, SUN3_INVALID_PMEG);
127da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	       }
128da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer       }
129da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
130da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer       sun3_put_context(oldctx);
131da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer       /* erase all of the userspace pmeg maps, we've clobbered them
132da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	  all anyway */
133da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer       for(addr = 0; addr < SUN3_INVALID_PMEG; addr++) {
134da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	       if(pmeg_alloc[addr] == 1) {
135da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		       pmeg_alloc[addr] = 0;
136da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		       pmeg_ctx[addr] = 0;
137da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		       pmeg_vaddr[addr] = 0;
138da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	       }
139da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer       }
140da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
141da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
142da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
143da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer/* Clear user TLB entries within the context named in mm */
144da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void flush_tlb_mm (struct mm_struct *mm)
145da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
146da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer     unsigned char oldctx;
147da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer     unsigned char seg;
148da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer     unsigned long i;
149da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
150da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer     oldctx = sun3_get_context();
151da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer     sun3_put_context(mm->context);
152da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
153da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer     for(i = 0; i < TASK_SIZE; i += SUN3_PMEG_SIZE) {
154da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	     seg = sun3_get_segmap(i);
155da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	     if(seg == SUN3_INVALID_PMEG)
156da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		     continue;
157da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
158da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	     sun3_put_segmap(i, SUN3_INVALID_PMEG);
159da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	     pmeg_alloc[seg] = 0;
160da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	     pmeg_ctx[seg] = 0;
161da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	     pmeg_vaddr[seg] = 0;
162da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer     }
163da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
164da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer     sun3_put_context(oldctx);
165da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
166da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
167da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
168da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer/* Flush a single TLB page. In this case, we're limited to flushing a
169da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer   single PMEG */
170da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void flush_tlb_page (struct vm_area_struct *vma,
171da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer				   unsigned long addr)
172da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
173da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	unsigned char oldctx;
174da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	unsigned char i;
175da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
176da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	oldctx = sun3_get_context();
177da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	sun3_put_context(vma->vm_mm->context);
178da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	addr &= ~SUN3_PMEG_MASK;
179da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	if((i = sun3_get_segmap(addr)) != SUN3_INVALID_PMEG)
180da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	{
181da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		pmeg_alloc[i] = 0;
182da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		pmeg_ctx[i] = 0;
183da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		pmeg_vaddr[i] = 0;
184da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		sun3_put_segmap (addr,  SUN3_INVALID_PMEG);
185da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	}
186da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	sun3_put_context(oldctx);
187da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
188da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
189da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer/* Flush a range of pages from TLB. */
190da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
191da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void flush_tlb_range (struct vm_area_struct *vma,
192da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		      unsigned long start, unsigned long end)
193da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
194da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	struct mm_struct *mm = vma->vm_mm;
195da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	unsigned char seg, oldctx;
196da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
197da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	start &= ~SUN3_PMEG_MASK;
198da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
199da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	oldctx = sun3_get_context();
200da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	sun3_put_context(mm->context);
201da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
202da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	while(start < end)
203da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	{
204da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		if((seg = sun3_get_segmap(start)) == SUN3_INVALID_PMEG)
205da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		     goto next;
206da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		if(pmeg_ctx[seg] == mm->context) {
207da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer			pmeg_alloc[seg] = 0;
208da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer			pmeg_ctx[seg] = 0;
209da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer			pmeg_vaddr[seg] = 0;
210da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		}
211da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		sun3_put_segmap(start, SUN3_INVALID_PMEG);
212da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	next:
213da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer		start += SUN3_PMEG_SIZE;
214da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	}
215da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
216da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
217da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void flush_tlb_kernel_range(unsigned long start, unsigned long end)
218da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
219da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	flush_tlb_all();
220da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
221da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
222da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer/* Flush kernel page from TLB. */
223da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void flush_tlb_kernel_page (unsigned long addr)
224da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
225da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	sun3_put_segmap (addr & ~(SUN3_PMEG_SIZE - 1), SUN3_INVALID_PMEG);
226da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
227da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
22849148020bcb6910ce71417bd990a5ce7017f9bd3Sam Ravnborg#endif
229da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
230da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer#else /* !CONFIG_MMU */
231da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
232da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer/*
233da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer * flush all user-space atc entries.
234da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer */
235da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void __flush_tlb(void)
236da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
237da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	BUG();
238da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
239da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
240da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void __flush_tlb_one(unsigned long addr)
241da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
242da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	BUG();
243da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
244da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
245da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer#define flush_tlb() __flush_tlb()
246da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
247da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer/*
248da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer * flush all atc entries (both kernel and user-space entries).
249da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer */
250da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void flush_tlb_all(void)
251da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
252da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	BUG();
253da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
254da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
255da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void flush_tlb_mm(struct mm_struct *mm)
256da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
257da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	BUG();
258da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
259da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
260da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void flush_tlb_page(struct vm_area_struct *vma, unsigned long addr)
261da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
262da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	BUG();
263da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
264da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
265da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void flush_tlb_range(struct mm_struct *mm,
266da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer				   unsigned long start, unsigned long end)
267da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
268da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	BUG();
269da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
270da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
271da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungererstatic inline void flush_tlb_kernel_page(unsigned long addr)
272da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer{
273da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer	BUG();
274da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer}
275da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
276da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer#endif /* CONFIG_MMU */
277da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer
278da4f4a02abebb8b6f49e1585acbb23921a5da410Greg Ungerer#endif /* _M68K_TLBFLUSH_H */
279