1*3de6a9c0SDavid du Colombier /*
2*3de6a9c0SDavid du Colombier * operations on all memory data or unified caches, a no-op cache,
3*3de6a9c0SDavid du Colombier * and an l1-only cache ops cache.
4*3de6a9c0SDavid du Colombier * i-caches are not handled here.
5*3de6a9c0SDavid du Colombier *
6*3de6a9c0SDavid du Colombier * there are only three cache operations that we care about:
7*3de6a9c0SDavid du Colombier * force cache contents to memory (before dma out or shutdown),
8*3de6a9c0SDavid du Colombier * ignore cache contents in favour of memory (initialisation, after dma in),
9*3de6a9c0SDavid du Colombier * both (update page tables and force cpu to read new contents).
10*3de6a9c0SDavid du Colombier */
11*3de6a9c0SDavid du Colombier
12*3de6a9c0SDavid du Colombier #include "u.h"
13*3de6a9c0SDavid du Colombier #include "../port/lib.h"
14*3de6a9c0SDavid du Colombier #include "mem.h"
15*3de6a9c0SDavid du Colombier #include "dat.h"
16*3de6a9c0SDavid du Colombier #include "fns.h"
17*3de6a9c0SDavid du Colombier #include "io.h"
18*3de6a9c0SDavid du Colombier #include "../port/error.h"
19*3de6a9c0SDavid du Colombier
20*3de6a9c0SDavid du Colombier static Cacheimpl allcaches, nullcaches, l1caches;
21*3de6a9c0SDavid du Colombier
22*3de6a9c0SDavid du Colombier void
cachesinfo(Memcache * cp)23*3de6a9c0SDavid du Colombier cachesinfo(Memcache *cp)
24*3de6a9c0SDavid du Colombier {
25*3de6a9c0SDavid du Colombier memset(cp, 0, sizeof *cp);
26*3de6a9c0SDavid du Colombier cp->setsways = Cara | Cawa | Cawt | Cawb;
27*3de6a9c0SDavid du Colombier cp->l1ip = 3<<14; /* PIPT */
28*3de6a9c0SDavid du Colombier cp->log2linelen = log2(CACHELINESZ);
29*3de6a9c0SDavid du Colombier }
30*3de6a9c0SDavid du Colombier
31*3de6a9c0SDavid du Colombier void
allcacheson(void)32*3de6a9c0SDavid du Colombier allcacheson(void)
33*3de6a9c0SDavid du Colombier {
34*3de6a9c0SDavid du Colombier l2pl310init();
35*3de6a9c0SDavid du Colombier allcache = &allcaches;
36*3de6a9c0SDavid du Colombier nocache = &nullcaches;
37*3de6a9c0SDavid du Colombier l1cache = &l1caches;
38*3de6a9c0SDavid du Colombier }
39*3de6a9c0SDavid du Colombier
40*3de6a9c0SDavid du Colombier void
cachesoff(void)41*3de6a9c0SDavid du Colombier cachesoff(void)
42*3de6a9c0SDavid du Colombier {
43*3de6a9c0SDavid du Colombier l2cache->off();
44*3de6a9c0SDavid du Colombier }
45*3de6a9c0SDavid du Colombier
46*3de6a9c0SDavid du Colombier void
cachesinvse(void * va,int bytes)47*3de6a9c0SDavid du Colombier cachesinvse(void *va, int bytes)
48*3de6a9c0SDavid du Colombier {
49*3de6a9c0SDavid du Colombier int s;
50*3de6a9c0SDavid du Colombier
51*3de6a9c0SDavid du Colombier s = splhi();
52*3de6a9c0SDavid du Colombier l2cache->invse(va, bytes);
53*3de6a9c0SDavid du Colombier cachedinvse(va, bytes);
54*3de6a9c0SDavid du Colombier splx(s);
55*3de6a9c0SDavid du Colombier }
56*3de6a9c0SDavid du Colombier
57*3de6a9c0SDavid du Colombier void
cacheswbse(void * va,int bytes)58*3de6a9c0SDavid du Colombier cacheswbse(void *va, int bytes)
59*3de6a9c0SDavid du Colombier {
60*3de6a9c0SDavid du Colombier int s;
61*3de6a9c0SDavid du Colombier
62*3de6a9c0SDavid du Colombier s = splhi();
63*3de6a9c0SDavid du Colombier cachedwbse(va, bytes);
64*3de6a9c0SDavid du Colombier l2cache->wbse(va, bytes);
65*3de6a9c0SDavid du Colombier splx(s);
66*3de6a9c0SDavid du Colombier }
67*3de6a9c0SDavid du Colombier
68*3de6a9c0SDavid du Colombier void
cacheswbinvse(void * va,int bytes)69*3de6a9c0SDavid du Colombier cacheswbinvse(void *va, int bytes)
70*3de6a9c0SDavid du Colombier {
71*3de6a9c0SDavid du Colombier int s;
72*3de6a9c0SDavid du Colombier
73*3de6a9c0SDavid du Colombier s = splhi();
74*3de6a9c0SDavid du Colombier cachedwbse(va, bytes);
75*3de6a9c0SDavid du Colombier l2cache->wbinvse(va, bytes);
76*3de6a9c0SDavid du Colombier cachedwbinvse(va, bytes);
77*3de6a9c0SDavid du Colombier splx(s);
78*3de6a9c0SDavid du Colombier }
79*3de6a9c0SDavid du Colombier
80*3de6a9c0SDavid du Colombier
81*3de6a9c0SDavid du Colombier void
cachesinv(void)82*3de6a9c0SDavid du Colombier cachesinv(void)
83*3de6a9c0SDavid du Colombier {
84*3de6a9c0SDavid du Colombier int s;
85*3de6a9c0SDavid du Colombier
86*3de6a9c0SDavid du Colombier s = splhi();
87*3de6a9c0SDavid du Colombier l2cache->inv();
88*3de6a9c0SDavid du Colombier cachedinv();
89*3de6a9c0SDavid du Colombier splx(s);
90*3de6a9c0SDavid du Colombier }
91*3de6a9c0SDavid du Colombier
92*3de6a9c0SDavid du Colombier void
cacheswb(void)93*3de6a9c0SDavid du Colombier cacheswb(void)
94*3de6a9c0SDavid du Colombier {
95*3de6a9c0SDavid du Colombier int s;
96*3de6a9c0SDavid du Colombier
97*3de6a9c0SDavid du Colombier s = splhi();
98*3de6a9c0SDavid du Colombier cachedwb();
99*3de6a9c0SDavid du Colombier l2cache->wb();
100*3de6a9c0SDavid du Colombier splx(s);
101*3de6a9c0SDavid du Colombier }
102*3de6a9c0SDavid du Colombier
103*3de6a9c0SDavid du Colombier void
cacheswbinv(void)104*3de6a9c0SDavid du Colombier cacheswbinv(void)
105*3de6a9c0SDavid du Colombier {
106*3de6a9c0SDavid du Colombier int s;
107*3de6a9c0SDavid du Colombier
108*3de6a9c0SDavid du Colombier s = splhi();
109*3de6a9c0SDavid du Colombier cachedwb();
110*3de6a9c0SDavid du Colombier l2cache->wbinv();
111*3de6a9c0SDavid du Colombier cachedwbinv();
112*3de6a9c0SDavid du Colombier splx(s);
113*3de6a9c0SDavid du Colombier }
114*3de6a9c0SDavid du Colombier
115*3de6a9c0SDavid du Colombier static Cacheimpl allcaches = {
116*3de6a9c0SDavid du Colombier .info = cachesinfo,
117*3de6a9c0SDavid du Colombier .on = allcacheson,
118*3de6a9c0SDavid du Colombier .off = cachesoff,
119*3de6a9c0SDavid du Colombier
120*3de6a9c0SDavid du Colombier .inv = cachesinv,
121*3de6a9c0SDavid du Colombier .wb = cacheswb,
122*3de6a9c0SDavid du Colombier .wbinv = cacheswbinv,
123*3de6a9c0SDavid du Colombier
124*3de6a9c0SDavid du Colombier .invse = cachesinvse,
125*3de6a9c0SDavid du Colombier .wbse = cacheswbse,
126*3de6a9c0SDavid du Colombier .wbinvse= cacheswbinvse,
127*3de6a9c0SDavid du Colombier };
128*3de6a9c0SDavid du Colombier
129*3de6a9c0SDavid du Colombier
130*3de6a9c0SDavid du Colombier /*
131*3de6a9c0SDavid du Colombier * null cache ops
132*3de6a9c0SDavid du Colombier */
133*3de6a9c0SDavid du Colombier
134*3de6a9c0SDavid du Colombier void
nullinfo(Memcache * cp)135*3de6a9c0SDavid du Colombier nullinfo(Memcache *cp)
136*3de6a9c0SDavid du Colombier {
137*3de6a9c0SDavid du Colombier memset(cp, 0, sizeof *cp);
138*3de6a9c0SDavid du Colombier cp->log2linelen = 2;
139*3de6a9c0SDavid du Colombier }
140*3de6a9c0SDavid du Colombier
141*3de6a9c0SDavid du Colombier void
nullon(void)142*3de6a9c0SDavid du Colombier nullon(void)
143*3de6a9c0SDavid du Colombier {
144*3de6a9c0SDavid du Colombier nocache = &nullcaches;
145*3de6a9c0SDavid du Colombier }
146*3de6a9c0SDavid du Colombier
147*3de6a9c0SDavid du Colombier void
nullop(void)148*3de6a9c0SDavid du Colombier nullop(void)
149*3de6a9c0SDavid du Colombier {
150*3de6a9c0SDavid du Colombier }
151*3de6a9c0SDavid du Colombier
152*3de6a9c0SDavid du Colombier void
nullse(void *,int)153*3de6a9c0SDavid du Colombier nullse(void *, int)
154*3de6a9c0SDavid du Colombier {
155*3de6a9c0SDavid du Colombier }
156*3de6a9c0SDavid du Colombier
157*3de6a9c0SDavid du Colombier static Cacheimpl nullcaches = {
158*3de6a9c0SDavid du Colombier .info = nullinfo,
159*3de6a9c0SDavid du Colombier .on = nullon,
160*3de6a9c0SDavid du Colombier .off = nullop,
161*3de6a9c0SDavid du Colombier
162*3de6a9c0SDavid du Colombier .inv = nullop,
163*3de6a9c0SDavid du Colombier .wb = nullop,
164*3de6a9c0SDavid du Colombier .wbinv = nullop,
165*3de6a9c0SDavid du Colombier
166*3de6a9c0SDavid du Colombier .invse = nullse,
167*3de6a9c0SDavid du Colombier .wbse = nullse,
168*3de6a9c0SDavid du Colombier .wbinvse= nullse,
169*3de6a9c0SDavid du Colombier };
170*3de6a9c0SDavid du Colombier
171*3de6a9c0SDavid du Colombier /*
172*3de6a9c0SDavid du Colombier * l1-only ops
173*3de6a9c0SDavid du Colombier */
174*3de6a9c0SDavid du Colombier
175*3de6a9c0SDavid du Colombier void
l1cachesinfo(Memcache *)176*3de6a9c0SDavid du Colombier l1cachesinfo(Memcache *)
177*3de6a9c0SDavid du Colombier {
178*3de6a9c0SDavid du Colombier }
179*3de6a9c0SDavid du Colombier
180*3de6a9c0SDavid du Colombier void
l1cacheson(void)181*3de6a9c0SDavid du Colombier l1cacheson(void)
182*3de6a9c0SDavid du Colombier {
183*3de6a9c0SDavid du Colombier l1cache = &l1caches;
184*3de6a9c0SDavid du Colombier }
185*3de6a9c0SDavid du Colombier
186*3de6a9c0SDavid du Colombier static Cacheimpl l1caches = {
187*3de6a9c0SDavid du Colombier .info = l1cachesinfo,
188*3de6a9c0SDavid du Colombier .on = l1cacheson,
189*3de6a9c0SDavid du Colombier .off = nullop,
190*3de6a9c0SDavid du Colombier
191*3de6a9c0SDavid du Colombier .inv = cachedinv,
192*3de6a9c0SDavid du Colombier .wb = cachedwb,
193*3de6a9c0SDavid du Colombier .wbinv = cachedwbinv,
194*3de6a9c0SDavid du Colombier
195*3de6a9c0SDavid du Colombier .invse = cachedinvse,
196*3de6a9c0SDavid du Colombier .wbse = cachedwbse,
197*3de6a9c0SDavid du Colombier .wbinvse= cachedwbinvse,
198*3de6a9c0SDavid du Colombier };
199