cacheops_60.h revision 1.14 1 1.14 tsutsui /* $NetBSD: cacheops_60.h,v 1.14 2023/09/26 14:33:55 tsutsui Exp $ */
2 1.1 leo
3 1.1 leo /*-
4 1.1 leo * Copyright (c) 1997 The NetBSD Foundation, Inc.
5 1.1 leo * All rights reserved.
6 1.1 leo *
7 1.1 leo * This code is derived from software contributed to The NetBSD Foundation
8 1.1 leo * by Leo Weppelman
9 1.1 leo *
10 1.1 leo * Redistribution and use in source and binary forms, with or without
11 1.1 leo * modification, are permitted provided that the following conditions
12 1.1 leo * are met:
13 1.1 leo * 1. Redistributions of source code must retain the above copyright
14 1.1 leo * notice, this list of conditions and the following disclaimer.
15 1.1 leo * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 leo * notice, this list of conditions and the following disclaimer in the
17 1.1 leo * documentation and/or other materials provided with the distribution.
18 1.1 leo *
19 1.1 leo * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.1 leo * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.1 leo * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.1 leo * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.1 leo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.1 leo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.1 leo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 leo * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.1 leo * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.1 leo * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.1 leo * POSSIBILITY OF SUCH DAMAGE.
30 1.1 leo */
31 1.1 leo
32 1.1 leo /*
33 1.1 leo * Invalidate entire TLB.
34 1.1 leo */
35 1.7 perry static __inline void __attribute__((__unused__))
36 1.5 chs TBIA_60(void)
37 1.1 leo {
38 1.6 perry __asm volatile (" .word 0xf518" ); /* pflusha */
39 1.1 leo }
40 1.1 leo
41 1.1 leo /*
42 1.1 leo * Invalidate any TLB entry for given VA (TB Invalidate Single)
43 1.1 leo */
44 1.7 perry static __inline void __attribute__((__unused__))
45 1.5 chs TBIS_60(vaddr_t va)
46 1.1 leo {
47 1.9 tsutsui register uint8_t *r_va __asm("%a0") = (void *)va;
48 1.1 leo int tmp;
49 1.1 leo
50 1.6 perry __asm volatile (" movc %1, %%dfc;" /* select supervisor */
51 1.4 thorpej " .word 0xf508;" /* pflush %a0@ */
52 1.1 leo " moveq %3, %1;" /* select user */
53 1.4 thorpej " movc %1, %%dfc;"
54 1.4 thorpej " .word 0xf508;" /* pflush %a0@ */
55 1.4 thorpej " movc %%cacr,%1;"
56 1.1 leo " orl %4,%1;"
57 1.4 thorpej " movc %1,%%cacr" : "=d" (tmp) :
58 1.1 leo "0" (FC_SUPERD), "a" (r_va), "i" (FC_USERD),
59 1.1 leo "i" (IC60_CABC));
60 1.1 leo }
61 1.1 leo
62 1.1 leo /*
63 1.1 leo * Invalidate supervisor side of TLB
64 1.1 leo */
65 1.7 perry static __inline void __attribute__((__unused__))
66 1.5 chs TBIAS_60(void)
67 1.1 leo {
68 1.1 leo int tmp;
69 1.5 chs
70 1.1 leo /*
71 1.1 leo * Cannot specify supervisor/user on pflusha, so we flush all
72 1.1 leo */
73 1.6 perry __asm volatile (" .word 0xf518;"
74 1.4 thorpej " movc %%cacr,%0;"
75 1.1 leo " orl %1,%0;"
76 1.4 thorpej " movc %0,%%cacr" /* clear all branch cache
77 1.14 tsutsui entries */
78 1.1 leo : "=d" (tmp) : "i" (IC60_CABC) );
79 1.1 leo }
80 1.1 leo
81 1.1 leo /*
82 1.1 leo * Invalidate user side of TLB
83 1.1 leo */
84 1.7 perry static __inline void __attribute__((__unused__))
85 1.5 chs TBIAU_60(void)
86 1.1 leo {
87 1.1 leo int tmp;
88 1.5 chs
89 1.1 leo /*
90 1.1 leo * Cannot specify supervisor/user on pflusha, so we flush all
91 1.1 leo */
92 1.6 perry __asm volatile (" .word 0xf518;"
93 1.4 thorpej " movc %%cacr,%0;"
94 1.1 leo " orl %1,%0;"
95 1.4 thorpej " movc %0,%%cacr" /* clear all branch cache
96 1.14 tsutsui entries */
97 1.1 leo : "=d" (tmp) : "i" (IC60_CUBC) );
98 1.1 leo }
99 1.1 leo
100 1.1 leo /*
101 1.1 leo * Invalidate instruction cache
102 1.1 leo */
103 1.7 perry static __inline void __attribute__((__unused__))
104 1.5 chs ICIA_60(void)
105 1.1 leo {
106 1.1 leo /* inva ic (also clears branch cache) */
107 1.6 perry __asm volatile (" .word 0xf498;");
108 1.1 leo }
109 1.1 leo
110 1.7 perry static __inline void __attribute__((__unused__))
111 1.5 chs ICPA_60(void)
112 1.1 leo {
113 1.1 leo /* inva ic (also clears branch cache) */
114 1.6 perry __asm volatile (" .word 0xf498;");
115 1.1 leo }
116 1.1 leo
117 1.1 leo /*
118 1.1 leo * Invalidate data cache.
119 1.1 leo */
120 1.7 perry static __inline void __attribute__((__unused__))
121 1.5 chs DCIA_60(void)
122 1.1 leo {
123 1.6 perry __asm volatile (" .word 0xf478;"); /* cpusha dc */
124 1.1 leo }
125 1.1 leo
126 1.7 perry static __inline void __attribute__((__unused__))
127 1.5 chs DCIS_60(void)
128 1.1 leo {
129 1.6 perry __asm volatile (" .word 0xf478;"); /* cpusha dc */
130 1.1 leo }
131 1.1 leo
132 1.7 perry static __inline void __attribute__((__unused__))
133 1.5 chs DCIU_60(void)
134 1.1 leo {
135 1.6 perry __asm volatile (" .word 0xf478;"); /* cpusha dc */
136 1.1 leo }
137 1.1 leo
138 1.7 perry static __inline void __attribute__((__unused__))
139 1.5 chs DCIAS_60(paddr_t pa)
140 1.1 leo {
141 1.9 tsutsui register uint8_t *r_pa __asm("%a0") = (void *)pa;
142 1.1 leo
143 1.6 perry __asm volatile (" .word 0xf468;" : : "a" (r_pa)); /* cpushl dc,%a0@ */
144 1.1 leo }
145 1.1 leo
146 1.7 perry static __inline void __attribute__((__unused__))
147 1.5 chs PCIA_60(void)
148 1.1 leo {
149 1.6 perry __asm volatile (" .word 0xf478;"); /* cpusha dc */
150 1.1 leo }
151 1.11 he
152 1.11 he #define DCFA_60() DCFA_40()
153 1.11 he #define DCPA_60() DCPA_40()
154 1.11 he #define ICPL_60(pa) ICPL_40(pa)
155 1.11 he #define ICPP_60(pa) ICPP_40(pa)
156 1.11 he #define DCPL_60(pa) DCPL_40(pa)
157 1.11 he #define DCPP_60(pa) DCPP_40(pa)
158 1.11 he #define DCFL_60(pa) DCFL_40(pa)
159 1.11 he #define DCFP_60(pa) DCFP_40(pa)
160