diff options
Diffstat (limited to 'arch/powerpc/kernel/cputable.c')
-rw-r--r-- | arch/powerpc/kernel/cputable.c | 62 |
1 files changed, 54 insertions, 8 deletions
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index bfd499ee3753..9d1614c3ce67 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
@@ -42,6 +42,7 @@ extern void __setup_cpu_745x(unsigned long offset, struct cpu_spec* spec); | |||
42 | #endif /* CONFIG_PPC32 */ | 42 | #endif /* CONFIG_PPC32 */ |
43 | #ifdef CONFIG_PPC64 | 43 | #ifdef CONFIG_PPC64 |
44 | extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec); | 44 | extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec); |
45 | extern void __setup_cpu_ppc970MP(unsigned long offset, struct cpu_spec* spec); | ||
45 | extern void __restore_cpu_ppc970(void); | 46 | extern void __restore_cpu_ppc970(void); |
46 | #endif /* CONFIG_PPC64 */ | 47 | #endif /* CONFIG_PPC64 */ |
47 | 48 | ||
@@ -222,9 +223,9 @@ static struct cpu_spec cpu_specs[] = { | |||
222 | .icache_bsize = 128, | 223 | .icache_bsize = 128, |
223 | .dcache_bsize = 128, | 224 | .dcache_bsize = 128, |
224 | .num_pmcs = 8, | 225 | .num_pmcs = 8, |
225 | .cpu_setup = __setup_cpu_ppc970, | 226 | .cpu_setup = __setup_cpu_ppc970MP, |
226 | .cpu_restore = __restore_cpu_ppc970, | 227 | .cpu_restore = __restore_cpu_ppc970, |
227 | .oprofile_cpu_type = "ppc64/970", | 228 | .oprofile_cpu_type = "ppc64/970MP", |
228 | .oprofile_type = PPC_OPROFILE_POWER4, | 229 | .oprofile_type = PPC_OPROFILE_POWER4, |
229 | .platform = "ppc970", | 230 | .platform = "ppc970", |
230 | }, | 231 | }, |
@@ -276,10 +277,45 @@ static struct cpu_spec cpu_specs[] = { | |||
276 | .oprofile_mmcra_sipr = MMCRA_SIPR, | 277 | .oprofile_mmcra_sipr = MMCRA_SIPR, |
277 | .platform = "power5+", | 278 | .platform = "power5+", |
278 | }, | 279 | }, |
280 | { /* POWER6 in P5+ mode; 2.04-compliant processor */ | ||
281 | .pvr_mask = 0xffffffff, | ||
282 | .pvr_value = 0x0f000001, | ||
283 | .cpu_name = "POWER5+", | ||
284 | .cpu_features = CPU_FTRS_POWER5, | ||
285 | .cpu_user_features = COMMON_USER_POWER5_PLUS, | ||
286 | .icache_bsize = 128, | ||
287 | .dcache_bsize = 128, | ||
288 | .num_pmcs = 6, | ||
289 | .oprofile_cpu_type = "ppc64/power6", | ||
290 | .oprofile_type = PPC_OPROFILE_POWER4, | ||
291 | .oprofile_mmcra_sihv = POWER6_MMCRA_SIHV, | ||
292 | .oprofile_mmcra_sipr = POWER6_MMCRA_SIPR, | ||
293 | .oprofile_mmcra_clear = POWER6_MMCRA_THRM | | ||
294 | POWER6_MMCRA_OTHER, | ||
295 | .platform = "power5+", | ||
296 | }, | ||
279 | { /* Power6 */ | 297 | { /* Power6 */ |
280 | .pvr_mask = 0xffff0000, | 298 | .pvr_mask = 0xffff0000, |
281 | .pvr_value = 0x003e0000, | 299 | .pvr_value = 0x003e0000, |
282 | .cpu_name = "POWER6", | 300 | .cpu_name = "POWER6 (raw)", |
301 | .cpu_features = CPU_FTRS_POWER6, | ||
302 | .cpu_user_features = COMMON_USER_POWER6 | | ||
303 | PPC_FEATURE_POWER6_EXT, | ||
304 | .icache_bsize = 128, | ||
305 | .dcache_bsize = 128, | ||
306 | .num_pmcs = 6, | ||
307 | .oprofile_cpu_type = "ppc64/power6", | ||
308 | .oprofile_type = PPC_OPROFILE_POWER4, | ||
309 | .oprofile_mmcra_sihv = POWER6_MMCRA_SIHV, | ||
310 | .oprofile_mmcra_sipr = POWER6_MMCRA_SIPR, | ||
311 | .oprofile_mmcra_clear = POWER6_MMCRA_THRM | | ||
312 | POWER6_MMCRA_OTHER, | ||
313 | .platform = "power6x", | ||
314 | }, | ||
315 | { /* 2.05-compliant processor, i.e. Power6 "architected" mode */ | ||
316 | .pvr_mask = 0xffffffff, | ||
317 | .pvr_value = 0x0f000002, | ||
318 | .cpu_name = "POWER6 (architected)", | ||
283 | .cpu_features = CPU_FTRS_POWER6, | 319 | .cpu_features = CPU_FTRS_POWER6, |
284 | .cpu_user_features = COMMON_USER_POWER6, | 320 | .cpu_user_features = COMMON_USER_POWER6, |
285 | .icache_bsize = 128, | 321 | .icache_bsize = 128, |
@@ -303,6 +339,9 @@ static struct cpu_spec cpu_specs[] = { | |||
303 | PPC_FEATURE_SMT, | 339 | PPC_FEATURE_SMT, |
304 | .icache_bsize = 128, | 340 | .icache_bsize = 128, |
305 | .dcache_bsize = 128, | 341 | .dcache_bsize = 128, |
342 | .num_pmcs = 4, | ||
343 | .oprofile_cpu_type = "ppc64/cell-be", | ||
344 | .oprofile_type = PPC_OPROFILE_CELL, | ||
306 | .platform = "ppc-cell-be", | 345 | .platform = "ppc-cell-be", |
307 | }, | 346 | }, |
308 | { /* PA Semi PA6T */ | 347 | { /* PA Semi PA6T */ |
@@ -801,6 +840,17 @@ static struct cpu_spec cpu_specs[] = { | |||
801 | .cpu_setup = __setup_cpu_603, | 840 | .cpu_setup = __setup_cpu_603, |
802 | .platform = "ppc603", | 841 | .platform = "ppc603", |
803 | }, | 842 | }, |
843 | { /* e300c3 on 83xx */ | ||
844 | .pvr_mask = 0x7fff0000, | ||
845 | .pvr_value = 0x00850000, | ||
846 | .cpu_name = "e300c3", | ||
847 | .cpu_features = CPU_FTRS_E300, | ||
848 | .cpu_user_features = COMMON_USER, | ||
849 | .icache_bsize = 32, | ||
850 | .dcache_bsize = 32, | ||
851 | .cpu_setup = __setup_cpu_603, | ||
852 | .platform = "ppc603", | ||
853 | }, | ||
804 | { /* default match, we assume split I/D cache & TB (non-601)... */ | 854 | { /* default match, we assume split I/D cache & TB (non-601)... */ |
805 | .pvr_mask = 0x00000000, | 855 | .pvr_mask = 0x00000000, |
806 | .pvr_value = 0x00000000, | 856 | .pvr_value = 0x00000000, |
@@ -1169,19 +1219,15 @@ static struct cpu_spec cpu_specs[] = { | |||
1169 | #endif /* CONFIG_PPC32 */ | 1219 | #endif /* CONFIG_PPC32 */ |
1170 | }; | 1220 | }; |
1171 | 1221 | ||
1172 | struct cpu_spec *identify_cpu(unsigned long offset) | 1222 | struct cpu_spec *identify_cpu(unsigned long offset, unsigned int pvr) |
1173 | { | 1223 | { |
1174 | struct cpu_spec *s = cpu_specs; | 1224 | struct cpu_spec *s = cpu_specs; |
1175 | struct cpu_spec **cur = &cur_cpu_spec; | 1225 | struct cpu_spec **cur = &cur_cpu_spec; |
1176 | unsigned int pvr = mfspr(SPRN_PVR); | ||
1177 | int i; | 1226 | int i; |
1178 | 1227 | ||
1179 | s = PTRRELOC(s); | 1228 | s = PTRRELOC(s); |
1180 | cur = PTRRELOC(cur); | 1229 | cur = PTRRELOC(cur); |
1181 | 1230 | ||
1182 | if (*cur != NULL) | ||
1183 | return PTRRELOC(*cur); | ||
1184 | |||
1185 | for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++) | 1231 | for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++) |
1186 | if ((pvr & s->pvr_mask) == s->pvr_value) { | 1232 | if ((pvr & s->pvr_mask) == s->pvr_value) { |
1187 | *cur = cpu_specs + i; | 1233 | *cur = cpu_specs + i; |