This source file includes following definitions.
- cpu_probe
1
2
3
4
5
6
7
8
9
10 #include <linux/init.h>
11 #include <linux/io.h>
12 #include <asm/processor.h>
13 #include <asm/cache.h>
14
15 void cpu_probe(void)
16 {
17 unsigned long pvr, prr, cvr;
18 unsigned long size;
19
20 static unsigned long sizes[16] = {
21 [1] = (1 << 12),
22 [2] = (1 << 13),
23 [4] = (1 << 14),
24 [8] = (1 << 15),
25 [9] = (1 << 16)
26 };
27
28 pvr = (__raw_readl(CCN_PVR) >> 8) & 0xffffff;
29 prr = (__raw_readl(CCN_PRR) >> 4) & 0xff;
30 cvr = (__raw_readl(CCN_CVR));
31
32
33
34
35 boot_cpu_data.icache.way_incr = (1 << 13);
36 boot_cpu_data.icache.entry_shift = 5;
37 boot_cpu_data.icache.sets = 256;
38 boot_cpu_data.icache.ways = 1;
39 boot_cpu_data.icache.linesz = L1_CACHE_BYTES;
40
41
42
43
44 boot_cpu_data.dcache.way_incr = (1 << 14);
45 boot_cpu_data.dcache.entry_shift = 5;
46 boot_cpu_data.dcache.sets = 512;
47 boot_cpu_data.dcache.ways = 1;
48 boot_cpu_data.dcache.linesz = L1_CACHE_BYTES;
49
50
51 boot_cpu_data.cut_major = boot_cpu_data.cut_minor = -1;
52
53
54
55
56 if (((pvr >> 16) & 0xff) == 0x10) {
57 boot_cpu_data.family = CPU_FAMILY_SH4A;
58
59 if ((cvr & 0x10000000) == 0) {
60 boot_cpu_data.flags |= CPU_HAS_DSP;
61 boot_cpu_data.family = CPU_FAMILY_SH4AL_DSP;
62 }
63
64 boot_cpu_data.flags |= CPU_HAS_LLSC | CPU_HAS_PERF_COUNTER;
65 boot_cpu_data.cut_major = pvr & 0x7f;
66
67 boot_cpu_data.icache.ways = 4;
68 boot_cpu_data.dcache.ways = 4;
69 } else {
70
71 boot_cpu_data.flags |= CPU_HAS_PTEA | CPU_HAS_FPU;
72 boot_cpu_data.family = CPU_FAMILY_SH4;
73 }
74
75
76 if ((cvr & 0x20000000))
77 boot_cpu_data.flags |= CPU_HAS_FPU;
78
79
80 pvr &= 0xffff;
81
82
83
84
85
86 switch (pvr) {
87 case 0x205:
88 boot_cpu_data.type = CPU_SH7750;
89 boot_cpu_data.flags |= CPU_HAS_P2_FLUSH_BUG |
90 CPU_HAS_PERF_COUNTER;
91 break;
92 case 0x206:
93 boot_cpu_data.type = CPU_SH7750S;
94 boot_cpu_data.flags |= CPU_HAS_P2_FLUSH_BUG |
95 CPU_HAS_PERF_COUNTER;
96 break;
97 case 0x1100:
98 boot_cpu_data.type = CPU_SH7751;
99 break;
100 case 0x2001:
101 case 0x2004:
102 boot_cpu_data.type = CPU_SH7770;
103 break;
104 case 0x2006:
105 case 0x200A:
106 if (prr == 0x61)
107 boot_cpu_data.type = CPU_SH7781;
108 else if (prr == 0xa1)
109 boot_cpu_data.type = CPU_SH7763;
110 else
111 boot_cpu_data.type = CPU_SH7780;
112
113 break;
114 case 0x3000:
115 case 0x3003:
116 case 0x3009:
117 boot_cpu_data.type = CPU_SH7343;
118 break;
119 case 0x3004:
120 case 0x3007:
121 boot_cpu_data.type = CPU_SH7785;
122 break;
123 case 0x4004:
124 case 0x4005:
125 boot_cpu_data.type = CPU_SH7786;
126 boot_cpu_data.flags |= CPU_HAS_PTEAEX | CPU_HAS_L2_CACHE;
127 break;
128 case 0x3008:
129 switch (prr) {
130 case 0x50:
131 case 0x51:
132 boot_cpu_data.type = CPU_SH7723;
133 boot_cpu_data.flags |= CPU_HAS_L2_CACHE;
134 break;
135 case 0x70:
136 boot_cpu_data.type = CPU_SH7366;
137 break;
138 case 0xa0:
139 case 0xa1:
140 boot_cpu_data.type = CPU_SH7722;
141 break;
142 }
143 break;
144 case 0x300b:
145 switch (prr) {
146 case 0x20:
147 boot_cpu_data.type = CPU_SH7724;
148 boot_cpu_data.flags |= CPU_HAS_L2_CACHE;
149 break;
150 case 0x10:
151 case 0x11:
152 boot_cpu_data.type = CPU_SH7757;
153 break;
154 case 0xd0:
155 case 0x40:
156 boot_cpu_data.type = CPU_SH7372;
157 break;
158 case 0xE0:
159 boot_cpu_data.type = CPU_SH7734;
160 break;
161
162 }
163 break;
164 case 0x4000:
165 case 0x4001:
166 boot_cpu_data.type = CPU_SHX3;
167 break;
168 case 0x700:
169 boot_cpu_data.type = CPU_SH4_501;
170 boot_cpu_data.flags &= ~CPU_HAS_FPU;
171 boot_cpu_data.icache.ways = 2;
172 boot_cpu_data.dcache.ways = 2;
173 break;
174 case 0x600:
175 boot_cpu_data.type = CPU_SH4_202;
176 boot_cpu_data.icache.ways = 2;
177 boot_cpu_data.dcache.ways = 2;
178 break;
179 case 0x500 ... 0x501:
180 switch (prr) {
181 case 0x10:
182 boot_cpu_data.type = CPU_SH7750R;
183 break;
184 case 0x11:
185 boot_cpu_data.type = CPU_SH7751R;
186 break;
187 case 0x50 ... 0x5f:
188 boot_cpu_data.type = CPU_SH7760;
189 break;
190 }
191
192 boot_cpu_data.icache.ways = 2;
193 boot_cpu_data.dcache.ways = 2;
194
195 break;
196 }
197
198
199
200
201
202 if (boot_cpu_data.icache.ways > 1) {
203 size = sizes[(cvr >> 20) & 0xf];
204 boot_cpu_data.icache.way_incr = (size >> 1);
205 boot_cpu_data.icache.sets = (size >> 6);
206
207 }
208
209
210 if (boot_cpu_data.dcache.ways > 1) {
211 size = sizes[(cvr >> 16) & 0xf];
212 boot_cpu_data.dcache.way_incr = (size >> 1);
213 boot_cpu_data.dcache.sets = (size >> 6);
214 }
215
216
217
218
219 if (boot_cpu_data.flags & CPU_HAS_L2_CACHE) {
220
221
222
223
224
225 if ((cvr & 0xf) == 0)
226 boot_cpu_data.flags &= ~CPU_HAS_L2_CACHE;
227 else {
228
229
230
231
232 cvr ^= 0xf;
233
234
235
236
237
238
239
240 size = (cvr & 0xf) << 17;
241
242 boot_cpu_data.scache.way_incr = (1 << 16);
243 boot_cpu_data.scache.entry_shift = 5;
244 boot_cpu_data.scache.ways = 4;
245 boot_cpu_data.scache.linesz = L1_CACHE_BYTES;
246
247 boot_cpu_data.scache.entry_mask =
248 (boot_cpu_data.scache.way_incr -
249 boot_cpu_data.scache.linesz);
250
251 boot_cpu_data.scache.sets = size /
252 (boot_cpu_data.scache.linesz *
253 boot_cpu_data.scache.ways);
254
255 boot_cpu_data.scache.way_size =
256 (boot_cpu_data.scache.sets *
257 boot_cpu_data.scache.linesz);
258 }
259 }
260 }