xref: /plan9/sys/src/9/teg2/caches.c (revision 3de6a9c0b3d5cf34fc4090d0bf1930d83799a7fd)
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