1 /* SPDX-License-Identifier: GPL-2.0-or-later */
5 * Modifications for ppc64:
10 * Unlike ppc32, ppc64 will only call cpu_setup() for the boot CPU, it's
11 * the responsibility of the appropriate CPU save/restore functions to
12 * eventually copy these settings over. Those save/restore aren't yet
13 * part of the cputable though. That has to be fixed for both ppc32
16 #define COMMON_USER_PPC64 (PPC_FEATURE_32 | PPC_FEATURE_HAS_FPU | \
17 PPC_FEATURE_HAS_MMU | PPC_FEATURE_64)
18 #define COMMON_USER_POWER4 (COMMON_USER_PPC64 | PPC_FEATURE_POWER4)
19 #define COMMON_USER_POWER5 (COMMON_USER_PPC64 | PPC_FEATURE_POWER5 |\
20 PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP)
21 #define COMMON_USER_POWER5_PLUS (COMMON_USER_PPC64 | PPC_FEATURE_POWER5_PLUS|\
22 PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP)
23 #define COMMON_USER_POWER6 (COMMON_USER_PPC64 | PPC_FEATURE_ARCH_2_05 |\
24 PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP | \
25 PPC_FEATURE_TRUE_LE | \
26 PPC_FEATURE_PSERIES_PERFMON_COMPAT)
27 #define COMMON_USER_POWER7 (COMMON_USER_PPC64 | PPC_FEATURE_ARCH_2_06 |\
28 PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP | \
29 PPC_FEATURE_TRUE_LE | \
30 PPC_FEATURE_PSERIES_PERFMON_COMPAT)
31 #define COMMON_USER2_POWER7 (PPC_FEATURE2_DSCR)
32 #define COMMON_USER_POWER8 (COMMON_USER_PPC64 | PPC_FEATURE_ARCH_2_06 |\
33 PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP | \
34 PPC_FEATURE_TRUE_LE | \
35 PPC_FEATURE_PSERIES_PERFMON_COMPAT)
36 #define COMMON_USER2_POWER8 (PPC_FEATURE2_ARCH_2_07 | \
37 PPC_FEATURE2_HTM_COMP | \
38 PPC_FEATURE2_HTM_NOSC_COMP | \
40 PPC_FEATURE2_ISEL | PPC_FEATURE2_TAR | \
41 PPC_FEATURE2_VEC_CRYPTO)
42 #define COMMON_USER_PA6T (COMMON_USER_PPC64 | PPC_FEATURE_PA6T |\
43 PPC_FEATURE_TRUE_LE | \
44 PPC_FEATURE_HAS_ALTIVEC_COMP)
45 #define COMMON_USER_POWER9 COMMON_USER_POWER8
46 #define COMMON_USER2_POWER9 (COMMON_USER2_POWER8 | \
47 PPC_FEATURE2_ARCH_3_00 | \
48 PPC_FEATURE2_HAS_IEEE128 | \
51 #define COMMON_USER_POWER10 COMMON_USER_POWER9
52 #define COMMON_USER2_POWER10 (PPC_FEATURE2_ARCH_3_1 | \
54 PPC_FEATURE2_ARCH_3_00 | \
55 PPC_FEATURE2_HAS_IEEE128 | \
58 PPC_FEATURE2_ARCH_2_07 | \
60 PPC_FEATURE2_ISEL | PPC_FEATURE2_TAR | \
61 PPC_FEATURE2_VEC_CRYPTO)
63 static struct cpu_spec cpu_specs[] __initdata = {
65 .pvr_mask = 0xffff0000,
66 .pvr_value = 0x00390000,
68 .cpu_features = CPU_FTRS_PPC970,
69 .cpu_user_features = COMMON_USER_POWER4 | PPC_FEATURE_HAS_ALTIVEC_COMP,
70 .mmu_features = MMU_FTRS_PPC970,
74 .pmc_type = PPC_PMC_IBM,
75 .cpu_setup = __setup_cpu_ppc970,
76 .cpu_restore = __restore_cpu_ppc970,
80 .pvr_mask = 0xffff0000,
81 .pvr_value = 0x003c0000,
82 .cpu_name = "PPC970FX",
83 .cpu_features = CPU_FTRS_PPC970,
84 .cpu_user_features = COMMON_USER_POWER4 | PPC_FEATURE_HAS_ALTIVEC_COMP,
85 .mmu_features = MMU_FTRS_PPC970,
89 .pmc_type = PPC_PMC_IBM,
90 .cpu_setup = __setup_cpu_ppc970,
91 .cpu_restore = __restore_cpu_ppc970,
94 { /* PPC970MP DD1.0 - no DEEPNAP, use regular 970 init */
95 .pvr_mask = 0xffffffff,
96 .pvr_value = 0x00440100,
97 .cpu_name = "PPC970MP",
98 .cpu_features = CPU_FTRS_PPC970,
99 .cpu_user_features = COMMON_USER_POWER4 | PPC_FEATURE_HAS_ALTIVEC_COMP,
100 .mmu_features = MMU_FTRS_PPC970,
104 .pmc_type = PPC_PMC_IBM,
105 .cpu_setup = __setup_cpu_ppc970,
106 .cpu_restore = __restore_cpu_ppc970,
107 .platform = "ppc970",
110 .pvr_mask = 0xffff0000,
111 .pvr_value = 0x00440000,
112 .cpu_name = "PPC970MP",
113 .cpu_features = CPU_FTRS_PPC970,
114 .cpu_user_features = COMMON_USER_POWER4 | PPC_FEATURE_HAS_ALTIVEC_COMP,
115 .mmu_features = MMU_FTRS_PPC970,
119 .pmc_type = PPC_PMC_IBM,
120 .cpu_setup = __setup_cpu_ppc970MP,
121 .cpu_restore = __restore_cpu_ppc970,
122 .platform = "ppc970",
125 .pvr_mask = 0xffff0000,
126 .pvr_value = 0x00450000,
127 .cpu_name = "PPC970GX",
128 .cpu_features = CPU_FTRS_PPC970,
129 .cpu_user_features = COMMON_USER_POWER4 | PPC_FEATURE_HAS_ALTIVEC_COMP,
130 .mmu_features = MMU_FTRS_PPC970,
134 .pmc_type = PPC_PMC_IBM,
135 .cpu_setup = __setup_cpu_ppc970,
136 .platform = "ppc970",
139 .pvr_mask = 0xffff0000,
140 .pvr_value = 0x003a0000,
141 .cpu_name = "POWER5 (gr)",
142 .cpu_features = CPU_FTRS_POWER5,
143 .cpu_user_features = COMMON_USER_POWER5,
144 .mmu_features = MMU_FTRS_POWER5,
148 .pmc_type = PPC_PMC_IBM,
149 .platform = "power5",
152 .pvr_mask = 0xffffff00,
153 .pvr_value = 0x003b0300,
154 .cpu_name = "POWER5+ (gs)",
155 .cpu_features = CPU_FTRS_POWER5,
156 .cpu_user_features = COMMON_USER_POWER5_PLUS,
157 .mmu_features = MMU_FTRS_POWER5,
161 .platform = "power5+",
164 .pvr_mask = 0xffff0000,
165 .pvr_value = 0x003b0000,
166 .cpu_name = "POWER5+ (gs)",
167 .cpu_features = CPU_FTRS_POWER5,
168 .cpu_user_features = COMMON_USER_POWER5_PLUS,
169 .mmu_features = MMU_FTRS_POWER5,
173 .pmc_type = PPC_PMC_IBM,
174 .platform = "power5+",
176 { /* POWER6 in P5+ mode; 2.04-compliant processor */
177 .pvr_mask = 0xffffffff,
178 .pvr_value = 0x0f000001,
179 .cpu_name = "POWER5+",
180 .cpu_features = CPU_FTRS_POWER5,
181 .cpu_user_features = COMMON_USER_POWER5_PLUS,
182 .mmu_features = MMU_FTRS_POWER5,
185 .platform = "power5+",
188 .pvr_mask = 0xffff0000,
189 .pvr_value = 0x003e0000,
190 .cpu_name = "POWER6 (raw)",
191 .cpu_features = CPU_FTRS_POWER6,
192 .cpu_user_features = COMMON_USER_POWER6 | PPC_FEATURE_POWER6_EXT,
193 .mmu_features = MMU_FTRS_POWER6,
197 .pmc_type = PPC_PMC_IBM,
198 .platform = "power6x",
200 { /* 2.05-compliant processor, i.e. Power6 "architected" mode */
201 .pvr_mask = 0xffffffff,
202 .pvr_value = 0x0f000002,
203 .cpu_name = "POWER6 (architected)",
204 .cpu_features = CPU_FTRS_POWER6,
205 .cpu_user_features = COMMON_USER_POWER6,
206 .mmu_features = MMU_FTRS_POWER6,
209 .platform = "power6",
211 { /* 2.06-compliant processor, i.e. Power7 "architected" mode */
212 .pvr_mask = 0xffffffff,
213 .pvr_value = 0x0f000003,
214 .cpu_name = "POWER7 (architected)",
215 .cpu_features = CPU_FTRS_POWER7,
216 .cpu_user_features = COMMON_USER_POWER7,
217 .cpu_user_features2 = COMMON_USER2_POWER7,
218 .mmu_features = MMU_FTRS_POWER7,
221 .cpu_setup = __setup_cpu_power7,
222 .cpu_restore = __restore_cpu_power7,
223 .machine_check_early = __machine_check_early_realmode_p7,
224 .platform = "power7",
226 { /* 2.07-compliant processor, i.e. Power8 "architected" mode */
227 .pvr_mask = 0xffffffff,
228 .pvr_value = 0x0f000004,
229 .cpu_name = "POWER8 (architected)",
230 .cpu_features = CPU_FTRS_POWER8,
231 .cpu_user_features = COMMON_USER_POWER8,
232 .cpu_user_features2 = COMMON_USER2_POWER8,
233 .mmu_features = MMU_FTRS_POWER8,
236 .cpu_setup = __setup_cpu_power8,
237 .cpu_restore = __restore_cpu_power8,
238 .machine_check_early = __machine_check_early_realmode_p8,
239 .platform = "power8",
241 { /* 3.00-compliant processor, i.e. Power9 "architected" mode */
242 .pvr_mask = 0xffffffff,
243 .pvr_value = 0x0f000005,
244 .cpu_name = "POWER9 (architected)",
245 .cpu_features = CPU_FTRS_POWER9,
246 .cpu_user_features = COMMON_USER_POWER9,
247 .cpu_user_features2 = COMMON_USER2_POWER9,
248 .mmu_features = MMU_FTRS_POWER9,
251 .cpu_setup = __setup_cpu_power9,
252 .cpu_restore = __restore_cpu_power9,
253 .platform = "power9",
255 { /* 3.1-compliant processor, i.e. Power10 "architected" mode */
256 .pvr_mask = 0xffffffff,
257 .pvr_value = 0x0f000006,
258 .cpu_name = "POWER10 (architected)",
259 .cpu_features = CPU_FTRS_POWER10,
260 .cpu_user_features = COMMON_USER_POWER10,
261 .cpu_user_features2 = COMMON_USER2_POWER10,
262 .mmu_features = MMU_FTRS_POWER10,
265 .cpu_setup = __setup_cpu_power10,
266 .cpu_restore = __restore_cpu_power10,
267 .platform = "power10",
270 .pvr_mask = 0xffff0000,
271 .pvr_value = 0x003f0000,
272 .cpu_name = "POWER7 (raw)",
273 .cpu_features = CPU_FTRS_POWER7,
274 .cpu_user_features = COMMON_USER_POWER7,
275 .cpu_user_features2 = COMMON_USER2_POWER7,
276 .mmu_features = MMU_FTRS_POWER7,
280 .pmc_type = PPC_PMC_IBM,
281 .cpu_setup = __setup_cpu_power7,
282 .cpu_restore = __restore_cpu_power7,
283 .machine_check_early = __machine_check_early_realmode_p7,
284 .platform = "power7",
287 .pvr_mask = 0xffff0000,
288 .pvr_value = 0x004A0000,
289 .cpu_name = "POWER7+ (raw)",
290 .cpu_features = CPU_FTRS_POWER7,
291 .cpu_user_features = COMMON_USER_POWER7,
292 .cpu_user_features2 = COMMON_USER2_POWER7,
293 .mmu_features = MMU_FTRS_POWER7,
297 .pmc_type = PPC_PMC_IBM,
298 .cpu_setup = __setup_cpu_power7,
299 .cpu_restore = __restore_cpu_power7,
300 .machine_check_early = __machine_check_early_realmode_p7,
301 .platform = "power7+",
304 .pvr_mask = 0xffff0000,
305 .pvr_value = 0x004b0000,
306 .cpu_name = "POWER8E (raw)",
307 .cpu_features = CPU_FTRS_POWER8E,
308 .cpu_user_features = COMMON_USER_POWER8,
309 .cpu_user_features2 = COMMON_USER2_POWER8,
310 .mmu_features = MMU_FTRS_POWER8,
314 .pmc_type = PPC_PMC_IBM,
315 .cpu_setup = __setup_cpu_power8,
316 .cpu_restore = __restore_cpu_power8,
317 .machine_check_early = __machine_check_early_realmode_p8,
318 .platform = "power8",
321 .pvr_mask = 0xffff0000,
322 .pvr_value = 0x004c0000,
323 .cpu_name = "POWER8NVL (raw)",
324 .cpu_features = CPU_FTRS_POWER8,
325 .cpu_user_features = COMMON_USER_POWER8,
326 .cpu_user_features2 = COMMON_USER2_POWER8,
327 .mmu_features = MMU_FTRS_POWER8,
331 .pmc_type = PPC_PMC_IBM,
332 .cpu_setup = __setup_cpu_power8,
333 .cpu_restore = __restore_cpu_power8,
334 .machine_check_early = __machine_check_early_realmode_p8,
335 .platform = "power8",
338 .pvr_mask = 0xffff0000,
339 .pvr_value = 0x004d0000,
340 .cpu_name = "POWER8 (raw)",
341 .cpu_features = CPU_FTRS_POWER8,
342 .cpu_user_features = COMMON_USER_POWER8,
343 .cpu_user_features2 = COMMON_USER2_POWER8,
344 .mmu_features = MMU_FTRS_POWER8,
348 .pmc_type = PPC_PMC_IBM,
349 .cpu_setup = __setup_cpu_power8,
350 .cpu_restore = __restore_cpu_power8,
351 .machine_check_early = __machine_check_early_realmode_p8,
352 .platform = "power8",
355 .pvr_mask = 0xffffefff,
356 .pvr_value = 0x004e0200,
357 .cpu_name = "POWER9 (raw)",
358 .cpu_features = CPU_FTRS_POWER9_DD2_0,
359 .cpu_user_features = COMMON_USER_POWER9,
360 .cpu_user_features2 = COMMON_USER2_POWER9,
361 .mmu_features = MMU_FTRS_POWER9,
365 .pmc_type = PPC_PMC_IBM,
366 .cpu_setup = __setup_cpu_power9,
367 .cpu_restore = __restore_cpu_power9,
368 .machine_check_early = __machine_check_early_realmode_p9,
369 .platform = "power9",
371 { /* Power9 DD 2.1 */
372 .pvr_mask = 0xffffefff,
373 .pvr_value = 0x004e0201,
374 .cpu_name = "POWER9 (raw)",
375 .cpu_features = CPU_FTRS_POWER9_DD2_1,
376 .cpu_user_features = COMMON_USER_POWER9,
377 .cpu_user_features2 = COMMON_USER2_POWER9,
378 .mmu_features = MMU_FTRS_POWER9,
382 .pmc_type = PPC_PMC_IBM,
383 .cpu_setup = __setup_cpu_power9,
384 .cpu_restore = __restore_cpu_power9,
385 .machine_check_early = __machine_check_early_realmode_p9,
386 .platform = "power9",
389 .pvr_mask = 0xffffefff,
390 .pvr_value = 0x004e0202,
391 .cpu_name = "POWER9 (raw)",
392 .cpu_features = CPU_FTRS_POWER9_DD2_2,
393 .cpu_user_features = COMMON_USER_POWER9,
394 .cpu_user_features2 = COMMON_USER2_POWER9,
395 .mmu_features = MMU_FTRS_POWER9,
399 .pmc_type = PPC_PMC_IBM,
400 .cpu_setup = __setup_cpu_power9,
401 .cpu_restore = __restore_cpu_power9,
402 .machine_check_early = __machine_check_early_realmode_p9,
403 .platform = "power9",
405 { /* Power9 DD2.3 or later */
406 .pvr_mask = 0xffff0000,
407 .pvr_value = 0x004e0000,
408 .cpu_name = "POWER9 (raw)",
409 .cpu_features = CPU_FTRS_POWER9_DD2_3,
410 .cpu_user_features = COMMON_USER_POWER9,
411 .cpu_user_features2 = COMMON_USER2_POWER9,
412 .mmu_features = MMU_FTRS_POWER9,
416 .pmc_type = PPC_PMC_IBM,
417 .cpu_setup = __setup_cpu_power9,
418 .cpu_restore = __restore_cpu_power9,
419 .machine_check_early = __machine_check_early_realmode_p9,
420 .platform = "power9",
423 .pvr_mask = 0xffff0000,
424 .pvr_value = 0x00800000,
425 .cpu_name = "POWER10 (raw)",
426 .cpu_features = CPU_FTRS_POWER10,
427 .cpu_user_features = COMMON_USER_POWER10,
428 .cpu_user_features2 = COMMON_USER2_POWER10,
429 .mmu_features = MMU_FTRS_POWER10,
433 .pmc_type = PPC_PMC_IBM,
434 .cpu_setup = __setup_cpu_power10,
435 .cpu_restore = __restore_cpu_power10,
436 .machine_check_early = __machine_check_early_realmode_p10,
437 .platform = "power10",
439 { /* Cell Broadband Engine */
440 .pvr_mask = 0xffff0000,
441 .pvr_value = 0x00700000,
442 .cpu_name = "Cell Broadband Engine",
443 .cpu_features = CPU_FTRS_CELL,
444 .cpu_user_features = COMMON_USER_PPC64 | PPC_FEATURE_CELL |
445 PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_SMT,
446 .mmu_features = MMU_FTRS_CELL,
450 .pmc_type = PPC_PMC_IBM,
451 .platform = "ppc-cell-be",
454 .pvr_mask = 0x7fff0000,
455 .pvr_value = 0x00900000,
457 .cpu_features = CPU_FTRS_PA6T,
458 .cpu_user_features = COMMON_USER_PA6T,
459 .mmu_features = MMU_FTRS_PA6T,
463 .pmc_type = PPC_PMC_PA6T,
464 .cpu_setup = __setup_cpu_pa6t,
465 .cpu_restore = __restore_cpu_pa6t,
468 { /* default match */
469 .pvr_mask = 0x00000000,
470 .pvr_value = 0x00000000,
471 .cpu_name = "POWER5 (compatible)",
472 .cpu_features = CPU_FTRS_COMPATIBLE,
473 .cpu_user_features = COMMON_USER_PPC64,
474 .mmu_features = MMU_FTRS_POWER,
478 .pmc_type = PPC_PMC_IBM,
479 .platform = "power5",