1 /* 2 * Copyright (C) 2001 Ben. Herrenschmidt (benh@kernel.crashing.org) 3 * 4 * Modifications for ppc64: 5 * Copyright (C) 2003 Dave Engebretsen <engebret@us.ibm.com> 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; either version 10 * 2 of the License, or (at your option) any later version. 11 */ 12 13 #include <linux/string.h> 14 #include <linux/sched.h> 15 #include <linux/threads.h> 16 #include <linux/init.h> 17 #include <linux/module.h> 18 19 #include <asm/oprofile_impl.h> 20 #include <asm/cputable.h> 21 #include <asm/prom.h> /* for PTRRELOC on ARCH=ppc */ 22 23 struct cpu_spec* cur_cpu_spec = NULL; 24 EXPORT_SYMBOL(cur_cpu_spec); 25 26 /* NOTE: 27 * Unlike ppc32, ppc64 will only call this once for the boot CPU, it's 28 * the responsibility of the appropriate CPU save/restore functions to 29 * eventually copy these settings over. Those save/restore aren't yet 30 * part of the cputable though. That has to be fixed for both ppc32 31 * and ppc64 32 */ 33 #ifdef CONFIG_PPC32 34 extern void __setup_cpu_440ep(unsigned long offset, struct cpu_spec* spec); 35 extern void __setup_cpu_440epx(unsigned long offset, struct cpu_spec* spec); 36 extern void __setup_cpu_440gx(unsigned long offset, struct cpu_spec* spec); 37 extern void __setup_cpu_440grx(unsigned long offset, struct cpu_spec* spec); 38 extern void __setup_cpu_440spe(unsigned long offset, struct cpu_spec* spec); 39 extern void __setup_cpu_460ex(unsigned long offset, struct cpu_spec* spec); 40 extern void __setup_cpu_460gt(unsigned long offset, struct cpu_spec* spec); 41 extern void __setup_cpu_603(unsigned long offset, struct cpu_spec* spec); 42 extern void __setup_cpu_604(unsigned long offset, struct cpu_spec* spec); 43 extern void __setup_cpu_750(unsigned long offset, struct cpu_spec* spec); 44 extern void __setup_cpu_750cx(unsigned long offset, struct cpu_spec* spec); 45 extern void __setup_cpu_750fx(unsigned long offset, struct cpu_spec* spec); 46 extern void __setup_cpu_7400(unsigned long offset, struct cpu_spec* spec); 47 extern void __setup_cpu_7410(unsigned long offset, struct cpu_spec* spec); 48 extern void __setup_cpu_745x(unsigned long offset, struct cpu_spec* spec); 49 #endif /* CONFIG_PPC32 */ 50 #ifdef CONFIG_PPC64 51 extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec); 52 extern void __setup_cpu_ppc970MP(unsigned long offset, struct cpu_spec* spec); 53 extern void __setup_cpu_pa6t(unsigned long offset, struct cpu_spec* spec); 54 extern void __restore_cpu_pa6t(void); 55 extern void __restore_cpu_ppc970(void); 56 extern void __setup_cpu_power7(unsigned long offset, struct cpu_spec* spec); 57 extern void __restore_cpu_power7(void); 58 #endif /* CONFIG_PPC64 */ 59 60 /* This table only contains "desktop" CPUs, it need to be filled with embedded 61 * ones as well... 62 */ 63 #define COMMON_USER (PPC_FEATURE_32 | PPC_FEATURE_HAS_FPU | \ 64 PPC_FEATURE_HAS_MMU) 65 #define COMMON_USER_PPC64 (COMMON_USER | PPC_FEATURE_64) 66 #define COMMON_USER_POWER4 (COMMON_USER_PPC64 | PPC_FEATURE_POWER4) 67 #define COMMON_USER_POWER5 (COMMON_USER_PPC64 | PPC_FEATURE_POWER5 |\ 68 PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP) 69 #define COMMON_USER_POWER5_PLUS (COMMON_USER_PPC64 | PPC_FEATURE_POWER5_PLUS|\ 70 PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP) 71 #define COMMON_USER_POWER6 (COMMON_USER_PPC64 | PPC_FEATURE_ARCH_2_05 |\ 72 PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP | \ 73 PPC_FEATURE_TRUE_LE | \ 74 PPC_FEATURE_PSERIES_PERFMON_COMPAT) 75 #define COMMON_USER_POWER7 (COMMON_USER_PPC64 | PPC_FEATURE_ARCH_2_06 |\ 76 PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP | \ 77 PPC_FEATURE_TRUE_LE | \ 78 PPC_FEATURE_PSERIES_PERFMON_COMPAT) 79 #define COMMON_USER_PA6T (COMMON_USER_PPC64 | PPC_FEATURE_PA6T |\ 80 PPC_FEATURE_TRUE_LE | \ 81 PPC_FEATURE_HAS_ALTIVEC_COMP) 82 #define COMMON_USER_BOOKE (PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | \ 83 PPC_FEATURE_BOOKE) 84 85 static struct cpu_spec __initdata cpu_specs[] = { 86 #ifdef CONFIG_PPC64 87 { /* Power3 */ 88 .pvr_mask = 0xffff0000, 89 .pvr_value = 0x00400000, 90 .cpu_name = "POWER3 (630)", 91 .cpu_features = CPU_FTRS_POWER3, 92 .cpu_user_features = COMMON_USER_PPC64|PPC_FEATURE_PPC_LE, 93 .icache_bsize = 128, 94 .dcache_bsize = 128, 95 .num_pmcs = 8, 96 .pmc_type = PPC_PMC_IBM, 97 .oprofile_cpu_type = "ppc64/power3", 98 .oprofile_type = PPC_OPROFILE_RS64, 99 .machine_check = machine_check_generic, 100 .platform = "power3", 101 }, 102 { /* Power3+ */ 103 .pvr_mask = 0xffff0000, 104 .pvr_value = 0x00410000, 105 .cpu_name = "POWER3 (630+)", 106 .cpu_features = CPU_FTRS_POWER3, 107 .cpu_user_features = COMMON_USER_PPC64|PPC_FEATURE_PPC_LE, 108 .icache_bsize = 128, 109 .dcache_bsize = 128, 110 .num_pmcs = 8, 111 .pmc_type = PPC_PMC_IBM, 112 .oprofile_cpu_type = "ppc64/power3", 113 .oprofile_type = PPC_OPROFILE_RS64, 114 .machine_check = machine_check_generic, 115 .platform = "power3", 116 }, 117 { /* Northstar */ 118 .pvr_mask = 0xffff0000, 119 .pvr_value = 0x00330000, 120 .cpu_name = "RS64-II (northstar)", 121 .cpu_features = CPU_FTRS_RS64, 122 .cpu_user_features = COMMON_USER_PPC64, 123 .icache_bsize = 128, 124 .dcache_bsize = 128, 125 .num_pmcs = 8, 126 .pmc_type = PPC_PMC_IBM, 127 .oprofile_cpu_type = "ppc64/rs64", 128 .oprofile_type = PPC_OPROFILE_RS64, 129 .machine_check = machine_check_generic, 130 .platform = "rs64", 131 }, 132 { /* Pulsar */ 133 .pvr_mask = 0xffff0000, 134 .pvr_value = 0x00340000, 135 .cpu_name = "RS64-III (pulsar)", 136 .cpu_features = CPU_FTRS_RS64, 137 .cpu_user_features = COMMON_USER_PPC64, 138 .icache_bsize = 128, 139 .dcache_bsize = 128, 140 .num_pmcs = 8, 141 .pmc_type = PPC_PMC_IBM, 142 .oprofile_cpu_type = "ppc64/rs64", 143 .oprofile_type = PPC_OPROFILE_RS64, 144 .machine_check = machine_check_generic, 145 .platform = "rs64", 146 }, 147 { /* I-star */ 148 .pvr_mask = 0xffff0000, 149 .pvr_value = 0x00360000, 150 .cpu_name = "RS64-III (icestar)", 151 .cpu_features = CPU_FTRS_RS64, 152 .cpu_user_features = COMMON_USER_PPC64, 153 .icache_bsize = 128, 154 .dcache_bsize = 128, 155 .num_pmcs = 8, 156 .pmc_type = PPC_PMC_IBM, 157 .oprofile_cpu_type = "ppc64/rs64", 158 .oprofile_type = PPC_OPROFILE_RS64, 159 .machine_check = machine_check_generic, 160 .platform = "rs64", 161 }, 162 { /* S-star */ 163 .pvr_mask = 0xffff0000, 164 .pvr_value = 0x00370000, 165 .cpu_name = "RS64-IV (sstar)", 166 .cpu_features = CPU_FTRS_RS64, 167 .cpu_user_features = COMMON_USER_PPC64, 168 .icache_bsize = 128, 169 .dcache_bsize = 128, 170 .num_pmcs = 8, 171 .pmc_type = PPC_PMC_IBM, 172 .oprofile_cpu_type = "ppc64/rs64", 173 .oprofile_type = PPC_OPROFILE_RS64, 174 .machine_check = machine_check_generic, 175 .platform = "rs64", 176 }, 177 { /* Power4 */ 178 .pvr_mask = 0xffff0000, 179 .pvr_value = 0x00350000, 180 .cpu_name = "POWER4 (gp)", 181 .cpu_features = CPU_FTRS_POWER4, 182 .cpu_user_features = COMMON_USER_POWER4, 183 .icache_bsize = 128, 184 .dcache_bsize = 128, 185 .num_pmcs = 8, 186 .pmc_type = PPC_PMC_IBM, 187 .oprofile_cpu_type = "ppc64/power4", 188 .oprofile_type = PPC_OPROFILE_POWER4, 189 .machine_check = machine_check_generic, 190 .platform = "power4", 191 }, 192 { /* Power4+ */ 193 .pvr_mask = 0xffff0000, 194 .pvr_value = 0x00380000, 195 .cpu_name = "POWER4+ (gq)", 196 .cpu_features = CPU_FTRS_POWER4, 197 .cpu_user_features = COMMON_USER_POWER4, 198 .icache_bsize = 128, 199 .dcache_bsize = 128, 200 .num_pmcs = 8, 201 .pmc_type = PPC_PMC_IBM, 202 .oprofile_cpu_type = "ppc64/power4", 203 .oprofile_type = PPC_OPROFILE_POWER4, 204 .machine_check = machine_check_generic, 205 .platform = "power4", 206 }, 207 { /* PPC970 */ 208 .pvr_mask = 0xffff0000, 209 .pvr_value = 0x00390000, 210 .cpu_name = "PPC970", 211 .cpu_features = CPU_FTRS_PPC970, 212 .cpu_user_features = COMMON_USER_POWER4 | 213 PPC_FEATURE_HAS_ALTIVEC_COMP, 214 .icache_bsize = 128, 215 .dcache_bsize = 128, 216 .num_pmcs = 8, 217 .pmc_type = PPC_PMC_IBM, 218 .cpu_setup = __setup_cpu_ppc970, 219 .cpu_restore = __restore_cpu_ppc970, 220 .oprofile_cpu_type = "ppc64/970", 221 .oprofile_type = PPC_OPROFILE_POWER4, 222 .machine_check = machine_check_generic, 223 .platform = "ppc970", 224 }, 225 { /* PPC970FX */ 226 .pvr_mask = 0xffff0000, 227 .pvr_value = 0x003c0000, 228 .cpu_name = "PPC970FX", 229 .cpu_features = CPU_FTRS_PPC970, 230 .cpu_user_features = COMMON_USER_POWER4 | 231 PPC_FEATURE_HAS_ALTIVEC_COMP, 232 .icache_bsize = 128, 233 .dcache_bsize = 128, 234 .num_pmcs = 8, 235 .pmc_type = PPC_PMC_IBM, 236 .cpu_setup = __setup_cpu_ppc970, 237 .cpu_restore = __restore_cpu_ppc970, 238 .oprofile_cpu_type = "ppc64/970", 239 .oprofile_type = PPC_OPROFILE_POWER4, 240 .machine_check = machine_check_generic, 241 .platform = "ppc970", 242 }, 243 { /* PPC970MP DD1.0 - no DEEPNAP, use regular 970 init */ 244 .pvr_mask = 0xffffffff, 245 .pvr_value = 0x00440100, 246 .cpu_name = "PPC970MP", 247 .cpu_features = CPU_FTRS_PPC970, 248 .cpu_user_features = COMMON_USER_POWER4 | 249 PPC_FEATURE_HAS_ALTIVEC_COMP, 250 .icache_bsize = 128, 251 .dcache_bsize = 128, 252 .num_pmcs = 8, 253 .pmc_type = PPC_PMC_IBM, 254 .cpu_setup = __setup_cpu_ppc970, 255 .cpu_restore = __restore_cpu_ppc970, 256 .oprofile_cpu_type = "ppc64/970MP", 257 .oprofile_type = PPC_OPROFILE_POWER4, 258 .machine_check = machine_check_generic, 259 .platform = "ppc970", 260 }, 261 { /* PPC970MP */ 262 .pvr_mask = 0xffff0000, 263 .pvr_value = 0x00440000, 264 .cpu_name = "PPC970MP", 265 .cpu_features = CPU_FTRS_PPC970, 266 .cpu_user_features = COMMON_USER_POWER4 | 267 PPC_FEATURE_HAS_ALTIVEC_COMP, 268 .icache_bsize = 128, 269 .dcache_bsize = 128, 270 .num_pmcs = 8, 271 .pmc_type = PPC_PMC_IBM, 272 .cpu_setup = __setup_cpu_ppc970MP, 273 .cpu_restore = __restore_cpu_ppc970, 274 .oprofile_cpu_type = "ppc64/970MP", 275 .oprofile_type = PPC_OPROFILE_POWER4, 276 .machine_check = machine_check_generic, 277 .platform = "ppc970", 278 }, 279 { /* PPC970GX */ 280 .pvr_mask = 0xffff0000, 281 .pvr_value = 0x00450000, 282 .cpu_name = "PPC970GX", 283 .cpu_features = CPU_FTRS_PPC970, 284 .cpu_user_features = COMMON_USER_POWER4 | 285 PPC_FEATURE_HAS_ALTIVEC_COMP, 286 .icache_bsize = 128, 287 .dcache_bsize = 128, 288 .num_pmcs = 8, 289 .pmc_type = PPC_PMC_IBM, 290 .cpu_setup = __setup_cpu_ppc970, 291 .oprofile_cpu_type = "ppc64/970", 292 .oprofile_type = PPC_OPROFILE_POWER4, 293 .machine_check = machine_check_generic, 294 .platform = "ppc970", 295 }, 296 { /* Power5 GR */ 297 .pvr_mask = 0xffff0000, 298 .pvr_value = 0x003a0000, 299 .cpu_name = "POWER5 (gr)", 300 .cpu_features = CPU_FTRS_POWER5, 301 .cpu_user_features = COMMON_USER_POWER5, 302 .icache_bsize = 128, 303 .dcache_bsize = 128, 304 .num_pmcs = 6, 305 .pmc_type = PPC_PMC_IBM, 306 .oprofile_cpu_type = "ppc64/power5", 307 .oprofile_type = PPC_OPROFILE_POWER4, 308 /* SIHV / SIPR bits are implemented on POWER4+ (GQ) 309 * and above but only works on POWER5 and above 310 */ 311 .oprofile_mmcra_sihv = MMCRA_SIHV, 312 .oprofile_mmcra_sipr = MMCRA_SIPR, 313 .machine_check = machine_check_generic, 314 .platform = "power5", 315 }, 316 { /* Power5++ */ 317 .pvr_mask = 0xffffff00, 318 .pvr_value = 0x003b0300, 319 .cpu_name = "POWER5+ (gs)", 320 .cpu_features = CPU_FTRS_POWER5, 321 .cpu_user_features = COMMON_USER_POWER5_PLUS, 322 .icache_bsize = 128, 323 .dcache_bsize = 128, 324 .num_pmcs = 6, 325 .oprofile_cpu_type = "ppc64/power5++", 326 .oprofile_type = PPC_OPROFILE_POWER4, 327 .oprofile_mmcra_sihv = MMCRA_SIHV, 328 .oprofile_mmcra_sipr = MMCRA_SIPR, 329 .machine_check = machine_check_generic, 330 .platform = "power5+", 331 }, 332 { /* Power5 GS */ 333 .pvr_mask = 0xffff0000, 334 .pvr_value = 0x003b0000, 335 .cpu_name = "POWER5+ (gs)", 336 .cpu_features = CPU_FTRS_POWER5, 337 .cpu_user_features = COMMON_USER_POWER5_PLUS, 338 .icache_bsize = 128, 339 .dcache_bsize = 128, 340 .num_pmcs = 6, 341 .pmc_type = PPC_PMC_IBM, 342 .oprofile_cpu_type = "ppc64/power5+", 343 .oprofile_type = PPC_OPROFILE_POWER4, 344 .oprofile_mmcra_sihv = MMCRA_SIHV, 345 .oprofile_mmcra_sipr = MMCRA_SIPR, 346 .machine_check = machine_check_generic, 347 .platform = "power5+", 348 }, 349 { /* POWER6 in P5+ mode; 2.04-compliant processor */ 350 .pvr_mask = 0xffffffff, 351 .pvr_value = 0x0f000001, 352 .cpu_name = "POWER5+", 353 .cpu_features = CPU_FTRS_POWER5, 354 .cpu_user_features = COMMON_USER_POWER5_PLUS, 355 .icache_bsize = 128, 356 .dcache_bsize = 128, 357 .machine_check = machine_check_generic, 358 .oprofile_cpu_type = "ppc64/compat-power5+", 359 .platform = "power5+", 360 }, 361 { /* Power6 */ 362 .pvr_mask = 0xffff0000, 363 .pvr_value = 0x003e0000, 364 .cpu_name = "POWER6 (raw)", 365 .cpu_features = CPU_FTRS_POWER6, 366 .cpu_user_features = COMMON_USER_POWER6 | 367 PPC_FEATURE_POWER6_EXT, 368 .icache_bsize = 128, 369 .dcache_bsize = 128, 370 .num_pmcs = 6, 371 .pmc_type = PPC_PMC_IBM, 372 .oprofile_cpu_type = "ppc64/power6", 373 .oprofile_type = PPC_OPROFILE_POWER4, 374 .oprofile_mmcra_sihv = POWER6_MMCRA_SIHV, 375 .oprofile_mmcra_sipr = POWER6_MMCRA_SIPR, 376 .oprofile_mmcra_clear = POWER6_MMCRA_THRM | 377 POWER6_MMCRA_OTHER, 378 .machine_check = machine_check_generic, 379 .platform = "power6x", 380 }, 381 { /* 2.05-compliant processor, i.e. Power6 "architected" mode */ 382 .pvr_mask = 0xffffffff, 383 .pvr_value = 0x0f000002, 384 .cpu_name = "POWER6 (architected)", 385 .cpu_features = CPU_FTRS_POWER6, 386 .cpu_user_features = COMMON_USER_POWER6, 387 .icache_bsize = 128, 388 .dcache_bsize = 128, 389 .machine_check = machine_check_generic, 390 .oprofile_cpu_type = "ppc64/compat-power6", 391 .platform = "power6", 392 }, 393 { /* 2.06-compliant processor, i.e. Power7 "architected" mode */ 394 .pvr_mask = 0xffffffff, 395 .pvr_value = 0x0f000003, 396 .cpu_name = "POWER7 (architected)", 397 .cpu_features = CPU_FTRS_POWER7, 398 .cpu_user_features = COMMON_USER_POWER7, 399 .icache_bsize = 128, 400 .dcache_bsize = 128, 401 .machine_check = machine_check_generic, 402 .oprofile_cpu_type = "ppc64/compat-power7", 403 .platform = "power7", 404 }, 405 { /* Power7 */ 406 .pvr_mask = 0xffff0000, 407 .pvr_value = 0x003f0000, 408 .cpu_name = "POWER7 (raw)", 409 .cpu_features = CPU_FTRS_POWER7, 410 .cpu_user_features = COMMON_USER_POWER7, 411 .icache_bsize = 128, 412 .dcache_bsize = 128, 413 .num_pmcs = 6, 414 .pmc_type = PPC_PMC_IBM, 415 .cpu_setup = __setup_cpu_power7, 416 .cpu_restore = __restore_cpu_power7, 417 .oprofile_cpu_type = "ppc64/power7", 418 .oprofile_type = PPC_OPROFILE_POWER4, 419 .oprofile_mmcra_sihv = POWER6_MMCRA_SIHV, 420 .oprofile_mmcra_sipr = POWER6_MMCRA_SIPR, 421 .oprofile_mmcra_clear = POWER6_MMCRA_THRM | 422 POWER6_MMCRA_OTHER, 423 .platform = "power7", 424 }, 425 { /* Cell Broadband Engine */ 426 .pvr_mask = 0xffff0000, 427 .pvr_value = 0x00700000, 428 .cpu_name = "Cell Broadband Engine", 429 .cpu_features = CPU_FTRS_CELL, 430 .cpu_user_features = COMMON_USER_PPC64 | 431 PPC_FEATURE_CELL | PPC_FEATURE_HAS_ALTIVEC_COMP | 432 PPC_FEATURE_SMT, 433 .icache_bsize = 128, 434 .dcache_bsize = 128, 435 .num_pmcs = 4, 436 .pmc_type = PPC_PMC_IBM, 437 .oprofile_cpu_type = "ppc64/cell-be", 438 .oprofile_type = PPC_OPROFILE_CELL, 439 .machine_check = machine_check_generic, 440 .platform = "ppc-cell-be", 441 }, 442 { /* PA Semi PA6T */ 443 .pvr_mask = 0x7fff0000, 444 .pvr_value = 0x00900000, 445 .cpu_name = "PA6T", 446 .cpu_features = CPU_FTRS_PA6T, 447 .cpu_user_features = COMMON_USER_PA6T, 448 .icache_bsize = 64, 449 .dcache_bsize = 64, 450 .num_pmcs = 6, 451 .pmc_type = PPC_PMC_PA6T, 452 .cpu_setup = __setup_cpu_pa6t, 453 .cpu_restore = __restore_cpu_pa6t, 454 .oprofile_cpu_type = "ppc64/pa6t", 455 .oprofile_type = PPC_OPROFILE_PA6T, 456 .machine_check = machine_check_generic, 457 .platform = "pa6t", 458 }, 459 { /* default match */ 460 .pvr_mask = 0x00000000, 461 .pvr_value = 0x00000000, 462 .cpu_name = "POWER4 (compatible)", 463 .cpu_features = CPU_FTRS_COMPATIBLE, 464 .cpu_user_features = COMMON_USER_PPC64, 465 .icache_bsize = 128, 466 .dcache_bsize = 128, 467 .num_pmcs = 6, 468 .pmc_type = PPC_PMC_IBM, 469 .machine_check = machine_check_generic, 470 .platform = "power4", 471 } 472 #endif /* CONFIG_PPC64 */ 473 #ifdef CONFIG_PPC32 474 #if CLASSIC_PPC 475 { /* 601 */ 476 .pvr_mask = 0xffff0000, 477 .pvr_value = 0x00010000, 478 .cpu_name = "601", 479 .cpu_features = CPU_FTRS_PPC601, 480 .cpu_user_features = COMMON_USER | PPC_FEATURE_601_INSTR | 481 PPC_FEATURE_UNIFIED_CACHE | PPC_FEATURE_NO_TB, 482 .icache_bsize = 32, 483 .dcache_bsize = 32, 484 .machine_check = machine_check_generic, 485 .platform = "ppc601", 486 }, 487 { /* 603 */ 488 .pvr_mask = 0xffff0000, 489 .pvr_value = 0x00030000, 490 .cpu_name = "603", 491 .cpu_features = CPU_FTRS_603, 492 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 493 .icache_bsize = 32, 494 .dcache_bsize = 32, 495 .cpu_setup = __setup_cpu_603, 496 .machine_check = machine_check_generic, 497 .platform = "ppc603", 498 }, 499 { /* 603e */ 500 .pvr_mask = 0xffff0000, 501 .pvr_value = 0x00060000, 502 .cpu_name = "603e", 503 .cpu_features = CPU_FTRS_603, 504 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 505 .icache_bsize = 32, 506 .dcache_bsize = 32, 507 .cpu_setup = __setup_cpu_603, 508 .machine_check = machine_check_generic, 509 .platform = "ppc603", 510 }, 511 { /* 603ev */ 512 .pvr_mask = 0xffff0000, 513 .pvr_value = 0x00070000, 514 .cpu_name = "603ev", 515 .cpu_features = CPU_FTRS_603, 516 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 517 .icache_bsize = 32, 518 .dcache_bsize = 32, 519 .cpu_setup = __setup_cpu_603, 520 .machine_check = machine_check_generic, 521 .platform = "ppc603", 522 }, 523 { /* 604 */ 524 .pvr_mask = 0xffff0000, 525 .pvr_value = 0x00040000, 526 .cpu_name = "604", 527 .cpu_features = CPU_FTRS_604, 528 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 529 .icache_bsize = 32, 530 .dcache_bsize = 32, 531 .num_pmcs = 2, 532 .cpu_setup = __setup_cpu_604, 533 .machine_check = machine_check_generic, 534 .platform = "ppc604", 535 }, 536 { /* 604e */ 537 .pvr_mask = 0xfffff000, 538 .pvr_value = 0x00090000, 539 .cpu_name = "604e", 540 .cpu_features = CPU_FTRS_604, 541 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 542 .icache_bsize = 32, 543 .dcache_bsize = 32, 544 .num_pmcs = 4, 545 .cpu_setup = __setup_cpu_604, 546 .machine_check = machine_check_generic, 547 .platform = "ppc604", 548 }, 549 { /* 604r */ 550 .pvr_mask = 0xffff0000, 551 .pvr_value = 0x00090000, 552 .cpu_name = "604r", 553 .cpu_features = CPU_FTRS_604, 554 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 555 .icache_bsize = 32, 556 .dcache_bsize = 32, 557 .num_pmcs = 4, 558 .cpu_setup = __setup_cpu_604, 559 .machine_check = machine_check_generic, 560 .platform = "ppc604", 561 }, 562 { /* 604ev */ 563 .pvr_mask = 0xffff0000, 564 .pvr_value = 0x000a0000, 565 .cpu_name = "604ev", 566 .cpu_features = CPU_FTRS_604, 567 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 568 .icache_bsize = 32, 569 .dcache_bsize = 32, 570 .num_pmcs = 4, 571 .cpu_setup = __setup_cpu_604, 572 .machine_check = machine_check_generic, 573 .platform = "ppc604", 574 }, 575 { /* 740/750 (0x4202, don't support TAU ?) */ 576 .pvr_mask = 0xffffffff, 577 .pvr_value = 0x00084202, 578 .cpu_name = "740/750", 579 .cpu_features = CPU_FTRS_740_NOTAU, 580 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 581 .icache_bsize = 32, 582 .dcache_bsize = 32, 583 .num_pmcs = 4, 584 .cpu_setup = __setup_cpu_750, 585 .machine_check = machine_check_generic, 586 .platform = "ppc750", 587 }, 588 { /* 750CX (80100 and 8010x?) */ 589 .pvr_mask = 0xfffffff0, 590 .pvr_value = 0x00080100, 591 .cpu_name = "750CX", 592 .cpu_features = CPU_FTRS_750, 593 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 594 .icache_bsize = 32, 595 .dcache_bsize = 32, 596 .num_pmcs = 4, 597 .cpu_setup = __setup_cpu_750cx, 598 .machine_check = machine_check_generic, 599 .platform = "ppc750", 600 }, 601 { /* 750CX (82201 and 82202) */ 602 .pvr_mask = 0xfffffff0, 603 .pvr_value = 0x00082200, 604 .cpu_name = "750CX", 605 .cpu_features = CPU_FTRS_750, 606 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 607 .icache_bsize = 32, 608 .dcache_bsize = 32, 609 .num_pmcs = 4, 610 .cpu_setup = __setup_cpu_750cx, 611 .machine_check = machine_check_generic, 612 .platform = "ppc750", 613 }, 614 { /* 750CXe (82214) */ 615 .pvr_mask = 0xfffffff0, 616 .pvr_value = 0x00082210, 617 .cpu_name = "750CXe", 618 .cpu_features = CPU_FTRS_750, 619 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 620 .icache_bsize = 32, 621 .dcache_bsize = 32, 622 .num_pmcs = 4, 623 .cpu_setup = __setup_cpu_750cx, 624 .machine_check = machine_check_generic, 625 .platform = "ppc750", 626 }, 627 { /* 750CXe "Gekko" (83214) */ 628 .pvr_mask = 0xffffffff, 629 .pvr_value = 0x00083214, 630 .cpu_name = "750CXe", 631 .cpu_features = CPU_FTRS_750, 632 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 633 .icache_bsize = 32, 634 .dcache_bsize = 32, 635 .num_pmcs = 4, 636 .cpu_setup = __setup_cpu_750cx, 637 .machine_check = machine_check_generic, 638 .platform = "ppc750", 639 }, 640 { /* 750CL */ 641 .pvr_mask = 0xfffff0f0, 642 .pvr_value = 0x00087010, 643 .cpu_name = "750CL", 644 .cpu_features = CPU_FTRS_750CL, 645 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 646 .icache_bsize = 32, 647 .dcache_bsize = 32, 648 .num_pmcs = 4, 649 .cpu_setup = __setup_cpu_750, 650 .machine_check = machine_check_generic, 651 .platform = "ppc750", 652 }, 653 { /* 745/755 */ 654 .pvr_mask = 0xfffff000, 655 .pvr_value = 0x00083000, 656 .cpu_name = "745/755", 657 .cpu_features = CPU_FTRS_750, 658 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 659 .icache_bsize = 32, 660 .dcache_bsize = 32, 661 .num_pmcs = 4, 662 .cpu_setup = __setup_cpu_750, 663 .machine_check = machine_check_generic, 664 .platform = "ppc750", 665 }, 666 { /* 750FX rev 1.x */ 667 .pvr_mask = 0xffffff00, 668 .pvr_value = 0x70000100, 669 .cpu_name = "750FX", 670 .cpu_features = CPU_FTRS_750FX1, 671 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 672 .icache_bsize = 32, 673 .dcache_bsize = 32, 674 .num_pmcs = 4, 675 .cpu_setup = __setup_cpu_750, 676 .machine_check = machine_check_generic, 677 .platform = "ppc750", 678 }, 679 { /* 750FX rev 2.0 must disable HID0[DPM] */ 680 .pvr_mask = 0xffffffff, 681 .pvr_value = 0x70000200, 682 .cpu_name = "750FX", 683 .cpu_features = CPU_FTRS_750FX2, 684 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 685 .icache_bsize = 32, 686 .dcache_bsize = 32, 687 .num_pmcs = 4, 688 .cpu_setup = __setup_cpu_750, 689 .machine_check = machine_check_generic, 690 .platform = "ppc750", 691 }, 692 { /* 750FX (All revs except 2.0) */ 693 .pvr_mask = 0xffff0000, 694 .pvr_value = 0x70000000, 695 .cpu_name = "750FX", 696 .cpu_features = CPU_FTRS_750FX, 697 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 698 .icache_bsize = 32, 699 .dcache_bsize = 32, 700 .num_pmcs = 4, 701 .cpu_setup = __setup_cpu_750fx, 702 .machine_check = machine_check_generic, 703 .platform = "ppc750", 704 }, 705 { /* 750GX */ 706 .pvr_mask = 0xffff0000, 707 .pvr_value = 0x70020000, 708 .cpu_name = "750GX", 709 .cpu_features = CPU_FTRS_750GX, 710 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 711 .icache_bsize = 32, 712 .dcache_bsize = 32, 713 .num_pmcs = 4, 714 .cpu_setup = __setup_cpu_750fx, 715 .machine_check = machine_check_generic, 716 .platform = "ppc750", 717 }, 718 { /* 740/750 (L2CR bit need fixup for 740) */ 719 .pvr_mask = 0xffff0000, 720 .pvr_value = 0x00080000, 721 .cpu_name = "740/750", 722 .cpu_features = CPU_FTRS_740, 723 .cpu_user_features = COMMON_USER | PPC_FEATURE_PPC_LE, 724 .icache_bsize = 32, 725 .dcache_bsize = 32, 726 .num_pmcs = 4, 727 .cpu_setup = __setup_cpu_750, 728 .machine_check = machine_check_generic, 729 .platform = "ppc750", 730 }, 731 { /* 7400 rev 1.1 ? (no TAU) */ 732 .pvr_mask = 0xffffffff, 733 .pvr_value = 0x000c1101, 734 .cpu_name = "7400 (1.1)", 735 .cpu_features = CPU_FTRS_7400_NOTAU, 736 .cpu_user_features = COMMON_USER | 737 PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, 738 .icache_bsize = 32, 739 .dcache_bsize = 32, 740 .num_pmcs = 4, 741 .cpu_setup = __setup_cpu_7400, 742 .machine_check = machine_check_generic, 743 .platform = "ppc7400", 744 }, 745 { /* 7400 */ 746 .pvr_mask = 0xffff0000, 747 .pvr_value = 0x000c0000, 748 .cpu_name = "7400", 749 .cpu_features = CPU_FTRS_7400, 750 .cpu_user_features = COMMON_USER | 751 PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, 752 .icache_bsize = 32, 753 .dcache_bsize = 32, 754 .num_pmcs = 4, 755 .cpu_setup = __setup_cpu_7400, 756 .machine_check = machine_check_generic, 757 .platform = "ppc7400", 758 }, 759 { /* 7410 */ 760 .pvr_mask = 0xffff0000, 761 .pvr_value = 0x800c0000, 762 .cpu_name = "7410", 763 .cpu_features = CPU_FTRS_7400, 764 .cpu_user_features = COMMON_USER | 765 PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, 766 .icache_bsize = 32, 767 .dcache_bsize = 32, 768 .num_pmcs = 4, 769 .cpu_setup = __setup_cpu_7410, 770 .machine_check = machine_check_generic, 771 .platform = "ppc7400", 772 }, 773 { /* 7450 2.0 - no doze/nap */ 774 .pvr_mask = 0xffffffff, 775 .pvr_value = 0x80000200, 776 .cpu_name = "7450", 777 .cpu_features = CPU_FTRS_7450_20, 778 .cpu_user_features = COMMON_USER | 779 PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, 780 .icache_bsize = 32, 781 .dcache_bsize = 32, 782 .num_pmcs = 6, 783 .cpu_setup = __setup_cpu_745x, 784 .oprofile_cpu_type = "ppc/7450", 785 .oprofile_type = PPC_OPROFILE_G4, 786 .machine_check = machine_check_generic, 787 .platform = "ppc7450", 788 }, 789 { /* 7450 2.1 */ 790 .pvr_mask = 0xffffffff, 791 .pvr_value = 0x80000201, 792 .cpu_name = "7450", 793 .cpu_features = CPU_FTRS_7450_21, 794 .cpu_user_features = COMMON_USER | 795 PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, 796 .icache_bsize = 32, 797 .dcache_bsize = 32, 798 .num_pmcs = 6, 799 .cpu_setup = __setup_cpu_745x, 800 .oprofile_cpu_type = "ppc/7450", 801 .oprofile_type = PPC_OPROFILE_G4, 802 .machine_check = machine_check_generic, 803 .platform = "ppc7450", 804 }, 805 { /* 7450 2.3 and newer */ 806 .pvr_mask = 0xffff0000, 807 .pvr_value = 0x80000000, 808 .cpu_name = "7450", 809 .cpu_features = CPU_FTRS_7450_23, 810 .cpu_user_features = COMMON_USER | 811 PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, 812 .icache_bsize = 32, 813 .dcache_bsize = 32, 814 .num_pmcs = 6, 815 .cpu_setup = __setup_cpu_745x, 816 .oprofile_cpu_type = "ppc/7450", 817 .oprofile_type = PPC_OPROFILE_G4, 818 .machine_check = machine_check_generic, 819 .platform = "ppc7450", 820 }, 821 { /* 7455 rev 1.x */ 822 .pvr_mask = 0xffffff00, 823 .pvr_value = 0x80010100, 824 .cpu_name = "7455", 825 .cpu_features = CPU_FTRS_7455_1, 826 .cpu_user_features = COMMON_USER | 827 PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, 828 .icache_bsize = 32, 829 .dcache_bsize = 32, 830 .num_pmcs = 6, 831 .cpu_setup = __setup_cpu_745x, 832 .oprofile_cpu_type = "ppc/7450", 833 .oprofile_type = PPC_OPROFILE_G4, 834 .machine_check = machine_check_generic, 835 .platform = "ppc7450", 836 }, 837 { /* 7455 rev 2.0 */ 838 .pvr_mask = 0xffffffff, 839 .pvr_value = 0x80010200, 840 .cpu_name = "7455", 841 .cpu_features = CPU_FTRS_7455_20, 842 .cpu_user_features = COMMON_USER | 843 PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, 844 .icache_bsize = 32, 845 .dcache_bsize = 32, 846 .num_pmcs = 6, 847 .cpu_setup = __setup_cpu_745x, 848 .oprofile_cpu_type = "ppc/7450", 849 .oprofile_type = PPC_OPROFILE_G4, 850 .machine_check = machine_check_generic, 851 .platform = "ppc7450", 852 }, 853 { /* 7455 others */ 854 .pvr_mask = 0xffff0000, 855 .pvr_value = 0x80010000, 856 .cpu_name = "7455", 857 .cpu_features = CPU_FTRS_7455, 858 .cpu_user_features = COMMON_USER | 859 PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, 860 .icache_bsize = 32, 861 .dcache_bsize = 32, 862 .num_pmcs = 6, 863 .cpu_setup = __setup_cpu_745x, 864 .oprofile_cpu_type = "ppc/7450", 865 .oprofile_type = PPC_OPROFILE_G4, 866 .machine_check = machine_check_generic, 867 .platform = "ppc7450", 868 }, 869 { /* 7447/7457 Rev 1.0 */ 870 .pvr_mask = 0xffffffff, 871 .pvr_value = 0x80020100, 872 .cpu_name = "7447/7457", 873 .cpu_features = CPU_FTRS_7447_10, 874 .cpu_user_features = COMMON_USER | 875 PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, 876 .icache_bsize = 32, 877 .dcache_bsize = 32, 878 .num_pmcs = 6, 879 .cpu_setup = __setup_cpu_745x, 880 .oprofile_cpu_type = "ppc/7450", 881 .oprofile_type = PPC_OPROFILE_G4, 882 .machine_check = machine_check_generic, 883 .platform = "ppc7450", 884 }, 885 { /* 7447/7457 Rev 1.1 */ 886 .pvr_mask = 0xffffffff, 887 .pvr_value = 0x80020101, 888 .cpu_name = "7447/7457", 889 .cpu_features = CPU_FTRS_7447_10, 890 .cpu_user_features = COMMON_USER | 891 PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, 892 .icache_bsize = 32, 893 .dcache_bsize = 32, 894 .num_pmcs = 6, 895 .cpu_setup = __setup_cpu_745x, 896 .oprofile_cpu_type = "ppc/7450", 897 .oprofile_type = PPC_OPROFILE_G4, 898 .machine_check = machine_check_generic, 899 .platform = "ppc7450", 900 }, 901 { /* 7447/7457 Rev 1.2 and later */ 902 .pvr_mask = 0xffff0000, 903 .pvr_value = 0x80020000, 904 .cpu_name = "7447/7457", 905 .cpu_features = CPU_FTRS_7447, 906 .cpu_user_features = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, 907 .icache_bsize = 32, 908 .dcache_bsize = 32, 909 .num_pmcs = 6, 910 .cpu_setup = __setup_cpu_745x, 911 .oprofile_cpu_type = "ppc/7450", 912 .oprofile_type = PPC_OPROFILE_G4, 913 .machine_check = machine_check_generic, 914 .platform = "ppc7450", 915 }, 916 { /* 7447A */ 917 .pvr_mask = 0xffff0000, 918 .pvr_value = 0x80030000, 919 .cpu_name = "7447A", 920 .cpu_features = CPU_FTRS_7447A, 921 .cpu_user_features = COMMON_USER | 922 PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, 923 .icache_bsize = 32, 924 .dcache_bsize = 32, 925 .num_pmcs = 6, 926 .cpu_setup = __setup_cpu_745x, 927 .oprofile_cpu_type = "ppc/7450", 928 .oprofile_type = PPC_OPROFILE_G4, 929 .machine_check = machine_check_generic, 930 .platform = "ppc7450", 931 }, 932 { /* 7448 */ 933 .pvr_mask = 0xffff0000, 934 .pvr_value = 0x80040000, 935 .cpu_name = "7448", 936 .cpu_features = CPU_FTRS_7448, 937 .cpu_user_features = COMMON_USER | 938 PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE, 939 .icache_bsize = 32, 940 .dcache_bsize = 32, 941 .num_pmcs = 6, 942 .cpu_setup = __setup_cpu_745x, 943 .oprofile_cpu_type = "ppc/7450", 944 .oprofile_type = PPC_OPROFILE_G4, 945 .machine_check = machine_check_generic, 946 .platform = "ppc7450", 947 }, 948 { /* 82xx (8240, 8245, 8260 are all 603e cores) */ 949 .pvr_mask = 0x7fff0000, 950 .pvr_value = 0x00810000, 951 .cpu_name = "82xx", 952 .cpu_features = CPU_FTRS_82XX, 953 .cpu_user_features = COMMON_USER, 954 .icache_bsize = 32, 955 .dcache_bsize = 32, 956 .cpu_setup = __setup_cpu_603, 957 .machine_check = machine_check_generic, 958 .platform = "ppc603", 959 }, 960 { /* All G2_LE (603e core, plus some) have the same pvr */ 961 .pvr_mask = 0x7fff0000, 962 .pvr_value = 0x00820000, 963 .cpu_name = "G2_LE", 964 .cpu_features = CPU_FTRS_G2_LE, 965 .cpu_user_features = COMMON_USER, 966 .icache_bsize = 32, 967 .dcache_bsize = 32, 968 .cpu_setup = __setup_cpu_603, 969 .machine_check = machine_check_generic, 970 .platform = "ppc603", 971 }, 972 { /* e300c1 (a 603e core, plus some) on 83xx */ 973 .pvr_mask = 0x7fff0000, 974 .pvr_value = 0x00830000, 975 .cpu_name = "e300c1", 976 .cpu_features = CPU_FTRS_E300, 977 .cpu_user_features = COMMON_USER, 978 .icache_bsize = 32, 979 .dcache_bsize = 32, 980 .cpu_setup = __setup_cpu_603, 981 .machine_check = machine_check_generic, 982 .platform = "ppc603", 983 }, 984 { /* e300c2 (an e300c1 core, plus some, minus FPU) on 83xx */ 985 .pvr_mask = 0x7fff0000, 986 .pvr_value = 0x00840000, 987 .cpu_name = "e300c2", 988 .cpu_features = CPU_FTRS_E300C2, 989 .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, 990 .icache_bsize = 32, 991 .dcache_bsize = 32, 992 .cpu_setup = __setup_cpu_603, 993 .machine_check = machine_check_generic, 994 .platform = "ppc603", 995 }, 996 { /* e300c3 (e300c1, plus one IU, half cache size) on 83xx */ 997 .pvr_mask = 0x7fff0000, 998 .pvr_value = 0x00850000, 999 .cpu_name = "e300c3", 1000 .cpu_features = CPU_FTRS_E300, 1001 .cpu_user_features = COMMON_USER, 1002 .icache_bsize = 32, 1003 .dcache_bsize = 32, 1004 .cpu_setup = __setup_cpu_603, 1005 .num_pmcs = 4, 1006 .oprofile_cpu_type = "ppc/e300", 1007 .oprofile_type = PPC_OPROFILE_FSL_EMB, 1008 .platform = "ppc603", 1009 }, 1010 { /* e300c4 (e300c1, plus one IU) */ 1011 .pvr_mask = 0x7fff0000, 1012 .pvr_value = 0x00860000, 1013 .cpu_name = "e300c4", 1014 .cpu_features = CPU_FTRS_E300, 1015 .cpu_user_features = COMMON_USER, 1016 .icache_bsize = 32, 1017 .dcache_bsize = 32, 1018 .cpu_setup = __setup_cpu_603, 1019 .machine_check = machine_check_generic, 1020 .num_pmcs = 4, 1021 .oprofile_cpu_type = "ppc/e300", 1022 .oprofile_type = PPC_OPROFILE_FSL_EMB, 1023 .platform = "ppc603", 1024 }, 1025 { /* default match, we assume split I/D cache & TB (non-601)... */ 1026 .pvr_mask = 0x00000000, 1027 .pvr_value = 0x00000000, 1028 .cpu_name = "(generic PPC)", 1029 .cpu_features = CPU_FTRS_CLASSIC32, 1030 .cpu_user_features = COMMON_USER, 1031 .icache_bsize = 32, 1032 .dcache_bsize = 32, 1033 .machine_check = machine_check_generic, 1034 .platform = "ppc603", 1035 }, 1036 #endif /* CLASSIC_PPC */ 1037 #ifdef CONFIG_8xx 1038 { /* 8xx */ 1039 .pvr_mask = 0xffff0000, 1040 .pvr_value = 0x00500000, 1041 .cpu_name = "8xx", 1042 /* CPU_FTR_MAYBE_CAN_DOZE is possible, 1043 * if the 8xx code is there.... */ 1044 .cpu_features = CPU_FTRS_8XX, 1045 .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, 1046 .icache_bsize = 16, 1047 .dcache_bsize = 16, 1048 .platform = "ppc823", 1049 }, 1050 #endif /* CONFIG_8xx */ 1051 #ifdef CONFIG_40x 1052 { /* 403GC */ 1053 .pvr_mask = 0xffffff00, 1054 .pvr_value = 0x00200200, 1055 .cpu_name = "403GC", 1056 .cpu_features = CPU_FTRS_40X, 1057 .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, 1058 .icache_bsize = 16, 1059 .dcache_bsize = 16, 1060 .machine_check = machine_check_4xx, 1061 .platform = "ppc403", 1062 }, 1063 { /* 403GCX */ 1064 .pvr_mask = 0xffffff00, 1065 .pvr_value = 0x00201400, 1066 .cpu_name = "403GCX", 1067 .cpu_features = CPU_FTRS_40X, 1068 .cpu_user_features = PPC_FEATURE_32 | 1069 PPC_FEATURE_HAS_MMU | PPC_FEATURE_NO_TB, 1070 .icache_bsize = 16, 1071 .dcache_bsize = 16, 1072 .machine_check = machine_check_4xx, 1073 .platform = "ppc403", 1074 }, 1075 { /* 403G ?? */ 1076 .pvr_mask = 0xffff0000, 1077 .pvr_value = 0x00200000, 1078 .cpu_name = "403G ??", 1079 .cpu_features = CPU_FTRS_40X, 1080 .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, 1081 .icache_bsize = 16, 1082 .dcache_bsize = 16, 1083 .machine_check = machine_check_4xx, 1084 .platform = "ppc403", 1085 }, 1086 { /* 405GP */ 1087 .pvr_mask = 0xffff0000, 1088 .pvr_value = 0x40110000, 1089 .cpu_name = "405GP", 1090 .cpu_features = CPU_FTRS_40X, 1091 .cpu_user_features = PPC_FEATURE_32 | 1092 PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, 1093 .icache_bsize = 32, 1094 .dcache_bsize = 32, 1095 .machine_check = machine_check_4xx, 1096 .platform = "ppc405", 1097 }, 1098 { /* STB 03xxx */ 1099 .pvr_mask = 0xffff0000, 1100 .pvr_value = 0x40130000, 1101 .cpu_name = "STB03xxx", 1102 .cpu_features = CPU_FTRS_40X, 1103 .cpu_user_features = PPC_FEATURE_32 | 1104 PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, 1105 .icache_bsize = 32, 1106 .dcache_bsize = 32, 1107 .machine_check = machine_check_4xx, 1108 .platform = "ppc405", 1109 }, 1110 { /* STB 04xxx */ 1111 .pvr_mask = 0xffff0000, 1112 .pvr_value = 0x41810000, 1113 .cpu_name = "STB04xxx", 1114 .cpu_features = CPU_FTRS_40X, 1115 .cpu_user_features = PPC_FEATURE_32 | 1116 PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, 1117 .icache_bsize = 32, 1118 .dcache_bsize = 32, 1119 .machine_check = machine_check_4xx, 1120 .platform = "ppc405", 1121 }, 1122 { /* NP405L */ 1123 .pvr_mask = 0xffff0000, 1124 .pvr_value = 0x41610000, 1125 .cpu_name = "NP405L", 1126 .cpu_features = CPU_FTRS_40X, 1127 .cpu_user_features = PPC_FEATURE_32 | 1128 PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, 1129 .icache_bsize = 32, 1130 .dcache_bsize = 32, 1131 .machine_check = machine_check_4xx, 1132 .platform = "ppc405", 1133 }, 1134 { /* NP4GS3 */ 1135 .pvr_mask = 0xffff0000, 1136 .pvr_value = 0x40B10000, 1137 .cpu_name = "NP4GS3", 1138 .cpu_features = CPU_FTRS_40X, 1139 .cpu_user_features = PPC_FEATURE_32 | 1140 PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, 1141 .icache_bsize = 32, 1142 .dcache_bsize = 32, 1143 .machine_check = machine_check_4xx, 1144 .platform = "ppc405", 1145 }, 1146 { /* NP405H */ 1147 .pvr_mask = 0xffff0000, 1148 .pvr_value = 0x41410000, 1149 .cpu_name = "NP405H", 1150 .cpu_features = CPU_FTRS_40X, 1151 .cpu_user_features = PPC_FEATURE_32 | 1152 PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, 1153 .icache_bsize = 32, 1154 .dcache_bsize = 32, 1155 .machine_check = machine_check_4xx, 1156 .platform = "ppc405", 1157 }, 1158 { /* 405GPr */ 1159 .pvr_mask = 0xffff0000, 1160 .pvr_value = 0x50910000, 1161 .cpu_name = "405GPr", 1162 .cpu_features = CPU_FTRS_40X, 1163 .cpu_user_features = PPC_FEATURE_32 | 1164 PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, 1165 .icache_bsize = 32, 1166 .dcache_bsize = 32, 1167 .machine_check = machine_check_4xx, 1168 .platform = "ppc405", 1169 }, 1170 { /* STBx25xx */ 1171 .pvr_mask = 0xffff0000, 1172 .pvr_value = 0x51510000, 1173 .cpu_name = "STBx25xx", 1174 .cpu_features = CPU_FTRS_40X, 1175 .cpu_user_features = PPC_FEATURE_32 | 1176 PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, 1177 .icache_bsize = 32, 1178 .dcache_bsize = 32, 1179 .machine_check = machine_check_4xx, 1180 .platform = "ppc405", 1181 }, 1182 { /* 405LP */ 1183 .pvr_mask = 0xffff0000, 1184 .pvr_value = 0x41F10000, 1185 .cpu_name = "405LP", 1186 .cpu_features = CPU_FTRS_40X, 1187 .cpu_user_features = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU, 1188 .icache_bsize = 32, 1189 .dcache_bsize = 32, 1190 .machine_check = machine_check_4xx, 1191 .platform = "ppc405", 1192 }, 1193 { /* Xilinx Virtex-II Pro */ 1194 .pvr_mask = 0xfffff000, 1195 .pvr_value = 0x20010000, 1196 .cpu_name = "Virtex-II Pro", 1197 .cpu_features = CPU_FTRS_40X, 1198 .cpu_user_features = PPC_FEATURE_32 | 1199 PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, 1200 .icache_bsize = 32, 1201 .dcache_bsize = 32, 1202 .machine_check = machine_check_4xx, 1203 .platform = "ppc405", 1204 }, 1205 { /* Xilinx Virtex-4 FX */ 1206 .pvr_mask = 0xfffff000, 1207 .pvr_value = 0x20011000, 1208 .cpu_name = "Virtex-4 FX", 1209 .cpu_features = CPU_FTRS_40X, 1210 .cpu_user_features = PPC_FEATURE_32 | 1211 PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, 1212 .icache_bsize = 32, 1213 .dcache_bsize = 32, 1214 .machine_check = machine_check_4xx, 1215 .platform = "ppc405", 1216 }, 1217 { /* 405EP */ 1218 .pvr_mask = 0xffff0000, 1219 .pvr_value = 0x51210000, 1220 .cpu_name = "405EP", 1221 .cpu_features = CPU_FTRS_40X, 1222 .cpu_user_features = PPC_FEATURE_32 | 1223 PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, 1224 .icache_bsize = 32, 1225 .dcache_bsize = 32, 1226 .machine_check = machine_check_4xx, 1227 .platform = "ppc405", 1228 }, 1229 { /* 405EX */ 1230 .pvr_mask = 0xffff0004, 1231 .pvr_value = 0x12910004, 1232 .cpu_name = "405EX", 1233 .cpu_features = CPU_FTRS_40X, 1234 .cpu_user_features = PPC_FEATURE_32 | 1235 PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, 1236 .icache_bsize = 32, 1237 .dcache_bsize = 32, 1238 .machine_check = machine_check_4xx, 1239 .platform = "ppc405", 1240 }, 1241 { /* 405EXr */ 1242 .pvr_mask = 0xffff0004, 1243 .pvr_value = 0x12910000, 1244 .cpu_name = "405EXr", 1245 .cpu_features = CPU_FTRS_40X, 1246 .cpu_user_features = PPC_FEATURE_32 | 1247 PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, 1248 .icache_bsize = 32, 1249 .dcache_bsize = 32, 1250 .machine_check = machine_check_4xx, 1251 .platform = "ppc405", 1252 }, 1253 { /* default match */ 1254 .pvr_mask = 0x00000000, 1255 .pvr_value = 0x00000000, 1256 .cpu_name = "(generic 40x PPC)", 1257 .cpu_features = CPU_FTRS_40X, 1258 .cpu_user_features = PPC_FEATURE_32 | 1259 PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, 1260 .icache_bsize = 32, 1261 .dcache_bsize = 32, 1262 .machine_check = machine_check_4xx, 1263 .platform = "ppc405", 1264 } 1265 1266 #endif /* CONFIG_40x */ 1267 #ifdef CONFIG_44x 1268 { 1269 .pvr_mask = 0xf0000fff, 1270 .pvr_value = 0x40000850, 1271 .cpu_name = "440GR Rev. A", 1272 .cpu_features = CPU_FTRS_44X, 1273 .cpu_user_features = COMMON_USER_BOOKE, 1274 .icache_bsize = 32, 1275 .dcache_bsize = 32, 1276 .machine_check = machine_check_4xx, 1277 .platform = "ppc440", 1278 }, 1279 { /* Use logical PVR for 440EP (logical pvr = pvr | 0x8) */ 1280 .pvr_mask = 0xf0000fff, 1281 .pvr_value = 0x40000858, 1282 .cpu_name = "440EP Rev. A", 1283 .cpu_features = CPU_FTRS_44X, 1284 .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU, 1285 .icache_bsize = 32, 1286 .dcache_bsize = 32, 1287 .cpu_setup = __setup_cpu_440ep, 1288 .machine_check = machine_check_4xx, 1289 .platform = "ppc440", 1290 }, 1291 { 1292 .pvr_mask = 0xf0000fff, 1293 .pvr_value = 0x400008d3, 1294 .cpu_name = "440GR Rev. B", 1295 .cpu_features = CPU_FTRS_44X, 1296 .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU, 1297 .icache_bsize = 32, 1298 .dcache_bsize = 32, 1299 .machine_check = machine_check_4xx, 1300 .platform = "ppc440", 1301 }, 1302 { /* Matches both physical and logical PVR for 440EP (logical pvr = pvr | 0x8) */ 1303 .pvr_mask = 0xf0000ff7, 1304 .pvr_value = 0x400008d4, 1305 .cpu_name = "440EP Rev. C", 1306 .cpu_features = CPU_FTRS_44X, 1307 .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU, 1308 .icache_bsize = 32, 1309 .dcache_bsize = 32, 1310 .cpu_setup = __setup_cpu_440ep, 1311 .machine_check = machine_check_4xx, 1312 .platform = "ppc440", 1313 }, 1314 { /* Use logical PVR for 440EP (logical pvr = pvr | 0x8) */ 1315 .pvr_mask = 0xf0000fff, 1316 .pvr_value = 0x400008db, 1317 .cpu_name = "440EP Rev. B", 1318 .cpu_features = CPU_FTRS_44X, 1319 .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU, 1320 .icache_bsize = 32, 1321 .dcache_bsize = 32, 1322 .cpu_setup = __setup_cpu_440ep, 1323 .machine_check = machine_check_4xx, 1324 .platform = "ppc440", 1325 }, 1326 { /* 440GRX */ 1327 .pvr_mask = 0xf0000ffb, 1328 .pvr_value = 0x200008D0, 1329 .cpu_name = "440GRX", 1330 .cpu_features = CPU_FTRS_44X, 1331 .cpu_user_features = COMMON_USER_BOOKE, 1332 .icache_bsize = 32, 1333 .dcache_bsize = 32, 1334 .cpu_setup = __setup_cpu_440grx, 1335 .machine_check = machine_check_440A, 1336 .platform = "ppc440", 1337 }, 1338 { /* Use logical PVR for 440EPx (logical pvr = pvr | 0x8) */ 1339 .pvr_mask = 0xf0000ffb, 1340 .pvr_value = 0x200008D8, 1341 .cpu_name = "440EPX", 1342 .cpu_features = CPU_FTRS_44X, 1343 .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU, 1344 .icache_bsize = 32, 1345 .dcache_bsize = 32, 1346 .cpu_setup = __setup_cpu_440epx, 1347 .machine_check = machine_check_440A, 1348 .platform = "ppc440", 1349 }, 1350 { /* 440GP Rev. B */ 1351 .pvr_mask = 0xf0000fff, 1352 .pvr_value = 0x40000440, 1353 .cpu_name = "440GP Rev. B", 1354 .cpu_features = CPU_FTRS_44X, 1355 .cpu_user_features = COMMON_USER_BOOKE, 1356 .icache_bsize = 32, 1357 .dcache_bsize = 32, 1358 .machine_check = machine_check_4xx, 1359 .platform = "ppc440gp", 1360 }, 1361 { /* 440GP Rev. C */ 1362 .pvr_mask = 0xf0000fff, 1363 .pvr_value = 0x40000481, 1364 .cpu_name = "440GP Rev. C", 1365 .cpu_features = CPU_FTRS_44X, 1366 .cpu_user_features = COMMON_USER_BOOKE, 1367 .icache_bsize = 32, 1368 .dcache_bsize = 32, 1369 .machine_check = machine_check_4xx, 1370 .platform = "ppc440gp", 1371 }, 1372 { /* 440GX Rev. A */ 1373 .pvr_mask = 0xf0000fff, 1374 .pvr_value = 0x50000850, 1375 .cpu_name = "440GX Rev. A", 1376 .cpu_features = CPU_FTRS_44X, 1377 .cpu_user_features = COMMON_USER_BOOKE, 1378 .icache_bsize = 32, 1379 .dcache_bsize = 32, 1380 .cpu_setup = __setup_cpu_440gx, 1381 .machine_check = machine_check_440A, 1382 .platform = "ppc440", 1383 }, 1384 { /* 440GX Rev. B */ 1385 .pvr_mask = 0xf0000fff, 1386 .pvr_value = 0x50000851, 1387 .cpu_name = "440GX Rev. B", 1388 .cpu_features = CPU_FTRS_44X, 1389 .cpu_user_features = COMMON_USER_BOOKE, 1390 .icache_bsize = 32, 1391 .dcache_bsize = 32, 1392 .cpu_setup = __setup_cpu_440gx, 1393 .machine_check = machine_check_440A, 1394 .platform = "ppc440", 1395 }, 1396 { /* 440GX Rev. C */ 1397 .pvr_mask = 0xf0000fff, 1398 .pvr_value = 0x50000892, 1399 .cpu_name = "440GX Rev. C", 1400 .cpu_features = CPU_FTRS_44X, 1401 .cpu_user_features = COMMON_USER_BOOKE, 1402 .icache_bsize = 32, 1403 .dcache_bsize = 32, 1404 .cpu_setup = __setup_cpu_440gx, 1405 .machine_check = machine_check_440A, 1406 .platform = "ppc440", 1407 }, 1408 { /* 440GX Rev. F */ 1409 .pvr_mask = 0xf0000fff, 1410 .pvr_value = 0x50000894, 1411 .cpu_name = "440GX Rev. F", 1412 .cpu_features = CPU_FTRS_44X, 1413 .cpu_user_features = COMMON_USER_BOOKE, 1414 .icache_bsize = 32, 1415 .dcache_bsize = 32, 1416 .cpu_setup = __setup_cpu_440gx, 1417 .machine_check = machine_check_440A, 1418 .platform = "ppc440", 1419 }, 1420 { /* 440SP Rev. A */ 1421 .pvr_mask = 0xfff00fff, 1422 .pvr_value = 0x53200891, 1423 .cpu_name = "440SP Rev. A", 1424 .cpu_features = CPU_FTRS_44X, 1425 .cpu_user_features = COMMON_USER_BOOKE, 1426 .icache_bsize = 32, 1427 .dcache_bsize = 32, 1428 .machine_check = machine_check_4xx, 1429 .platform = "ppc440", 1430 }, 1431 { /* 440SPe Rev. A */ 1432 .pvr_mask = 0xfff00fff, 1433 .pvr_value = 0x53400890, 1434 .cpu_name = "440SPe Rev. A", 1435 .cpu_features = CPU_FTRS_44X, 1436 .cpu_user_features = COMMON_USER_BOOKE, 1437 .icache_bsize = 32, 1438 .dcache_bsize = 32, 1439 .cpu_setup = __setup_cpu_440spe, 1440 .machine_check = machine_check_440A, 1441 .platform = "ppc440", 1442 }, 1443 { /* 440SPe Rev. B */ 1444 .pvr_mask = 0xfff00fff, 1445 .pvr_value = 0x53400891, 1446 .cpu_name = "440SPe Rev. B", 1447 .cpu_features = CPU_FTRS_44X, 1448 .cpu_user_features = COMMON_USER_BOOKE, 1449 .icache_bsize = 32, 1450 .dcache_bsize = 32, 1451 .cpu_setup = __setup_cpu_440spe, 1452 .machine_check = machine_check_440A, 1453 .platform = "ppc440", 1454 }, 1455 { /* 440 in Xilinx Virtex-5 FXT */ 1456 .pvr_mask = 0xfffffff0, 1457 .pvr_value = 0x7ff21910, 1458 .cpu_name = "440 in Virtex-5 FXT", 1459 .cpu_features = CPU_FTRS_44X, 1460 .cpu_user_features = COMMON_USER_BOOKE, 1461 .icache_bsize = 32, 1462 .dcache_bsize = 32, 1463 .platform = "ppc440", 1464 }, 1465 { /* 460EX */ 1466 .pvr_mask = 0xffff0002, 1467 .pvr_value = 0x13020002, 1468 .cpu_name = "460EX", 1469 .cpu_features = CPU_FTRS_44X, 1470 .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU, 1471 .icache_bsize = 32, 1472 .dcache_bsize = 32, 1473 .cpu_setup = __setup_cpu_460ex, 1474 .machine_check = machine_check_440A, 1475 .platform = "ppc440", 1476 }, 1477 { /* 460GT */ 1478 .pvr_mask = 0xffff0002, 1479 .pvr_value = 0x13020000, 1480 .cpu_name = "460GT", 1481 .cpu_features = CPU_FTRS_44X, 1482 .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU, 1483 .icache_bsize = 32, 1484 .dcache_bsize = 32, 1485 .cpu_setup = __setup_cpu_460gt, 1486 .machine_check = machine_check_440A, 1487 .platform = "ppc440", 1488 }, 1489 { /* default match */ 1490 .pvr_mask = 0x00000000, 1491 .pvr_value = 0x00000000, 1492 .cpu_name = "(generic 44x PPC)", 1493 .cpu_features = CPU_FTRS_44X, 1494 .cpu_user_features = COMMON_USER_BOOKE, 1495 .icache_bsize = 32, 1496 .dcache_bsize = 32, 1497 .machine_check = machine_check_4xx, 1498 .platform = "ppc440", 1499 } 1500 #endif /* CONFIG_44x */ 1501 #ifdef CONFIG_E200 1502 { /* e200z5 */ 1503 .pvr_mask = 0xfff00000, 1504 .pvr_value = 0x81000000, 1505 .cpu_name = "e200z5", 1506 /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */ 1507 .cpu_features = CPU_FTRS_E200, 1508 .cpu_user_features = COMMON_USER_BOOKE | 1509 PPC_FEATURE_HAS_EFP_SINGLE | 1510 PPC_FEATURE_UNIFIED_CACHE, 1511 .dcache_bsize = 32, 1512 .machine_check = machine_check_e200, 1513 .platform = "ppc5554", 1514 }, 1515 { /* e200z6 */ 1516 .pvr_mask = 0xfff00000, 1517 .pvr_value = 0x81100000, 1518 .cpu_name = "e200z6", 1519 /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */ 1520 .cpu_features = CPU_FTRS_E200, 1521 .cpu_user_features = COMMON_USER_BOOKE | 1522 PPC_FEATURE_HAS_SPE_COMP | 1523 PPC_FEATURE_HAS_EFP_SINGLE_COMP | 1524 PPC_FEATURE_UNIFIED_CACHE, 1525 .dcache_bsize = 32, 1526 .machine_check = machine_check_e200, 1527 .platform = "ppc5554", 1528 }, 1529 { /* default match */ 1530 .pvr_mask = 0x00000000, 1531 .pvr_value = 0x00000000, 1532 .cpu_name = "(generic E200 PPC)", 1533 .cpu_features = CPU_FTRS_E200, 1534 .cpu_user_features = COMMON_USER_BOOKE | 1535 PPC_FEATURE_HAS_EFP_SINGLE | 1536 PPC_FEATURE_UNIFIED_CACHE, 1537 .dcache_bsize = 32, 1538 .machine_check = machine_check_e200, 1539 .platform = "ppc5554", 1540 } 1541 #endif /* CONFIG_E200 */ 1542 #ifdef CONFIG_E500 1543 { /* e500 */ 1544 .pvr_mask = 0xffff0000, 1545 .pvr_value = 0x80200000, 1546 .cpu_name = "e500", 1547 .cpu_features = CPU_FTRS_E500, 1548 .cpu_user_features = COMMON_USER_BOOKE | 1549 PPC_FEATURE_HAS_SPE_COMP | 1550 PPC_FEATURE_HAS_EFP_SINGLE_COMP, 1551 .icache_bsize = 32, 1552 .dcache_bsize = 32, 1553 .num_pmcs = 4, 1554 .oprofile_cpu_type = "ppc/e500", 1555 .oprofile_type = PPC_OPROFILE_FSL_EMB, 1556 .machine_check = machine_check_e500, 1557 .platform = "ppc8540", 1558 }, 1559 { /* e500v2 */ 1560 .pvr_mask = 0xffff0000, 1561 .pvr_value = 0x80210000, 1562 .cpu_name = "e500v2", 1563 .cpu_features = CPU_FTRS_E500_2, 1564 .cpu_user_features = COMMON_USER_BOOKE | 1565 PPC_FEATURE_HAS_SPE_COMP | 1566 PPC_FEATURE_HAS_EFP_SINGLE_COMP | 1567 PPC_FEATURE_HAS_EFP_DOUBLE_COMP, 1568 .icache_bsize = 32, 1569 .dcache_bsize = 32, 1570 .num_pmcs = 4, 1571 .oprofile_cpu_type = "ppc/e500", 1572 .oprofile_type = PPC_OPROFILE_FSL_EMB, 1573 .machine_check = machine_check_e500, 1574 .platform = "ppc8548", 1575 }, 1576 { /* e500mc */ 1577 .pvr_mask = 0xffff0000, 1578 .pvr_value = 0x80230000, 1579 .cpu_name = "e500mc", 1580 .cpu_features = CPU_FTRS_E500MC, 1581 .cpu_user_features = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU, 1582 .icache_bsize = 64, 1583 .dcache_bsize = 64, 1584 .num_pmcs = 4, 1585 .oprofile_cpu_type = "ppc/e500", /* xxx - galak, e500mc? */ 1586 .oprofile_type = PPC_OPROFILE_FSL_EMB, 1587 .machine_check = machine_check_e500, 1588 .platform = "ppce500mc", 1589 }, 1590 { /* default match */ 1591 .pvr_mask = 0x00000000, 1592 .pvr_value = 0x00000000, 1593 .cpu_name = "(generic E500 PPC)", 1594 .cpu_features = CPU_FTRS_E500, 1595 .cpu_user_features = COMMON_USER_BOOKE | 1596 PPC_FEATURE_HAS_SPE_COMP | 1597 PPC_FEATURE_HAS_EFP_SINGLE_COMP, 1598 .icache_bsize = 32, 1599 .dcache_bsize = 32, 1600 .machine_check = machine_check_e500, 1601 .platform = "powerpc", 1602 } 1603 #endif /* CONFIG_E500 */ 1604 #endif /* CONFIG_PPC32 */ 1605 }; 1606 1607 static struct cpu_spec the_cpu_spec; 1608 1609 struct cpu_spec * __init identify_cpu(unsigned long offset, unsigned int pvr) 1610 { 1611 struct cpu_spec *s = cpu_specs; 1612 struct cpu_spec *t = &the_cpu_spec; 1613 int i; 1614 1615 s = PTRRELOC(s); 1616 t = PTRRELOC(t); 1617 1618 for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++) 1619 if ((pvr & s->pvr_mask) == s->pvr_value) { 1620 /* 1621 * If we are overriding a previous value derived 1622 * from the real PVR with a new value obtained 1623 * using a logical PVR value, don't modify the 1624 * performance monitor fields. 1625 */ 1626 if (t->num_pmcs && !s->num_pmcs) { 1627 t->cpu_name = s->cpu_name; 1628 t->cpu_features = s->cpu_features; 1629 t->cpu_user_features = s->cpu_user_features; 1630 t->icache_bsize = s->icache_bsize; 1631 t->dcache_bsize = s->dcache_bsize; 1632 t->cpu_setup = s->cpu_setup; 1633 t->cpu_restore = s->cpu_restore; 1634 t->platform = s->platform; 1635 /* 1636 * If we have passed through this logic once 1637 * before and have pulled the default case 1638 * because the real PVR was not found inside 1639 * cpu_specs[], then we are possibly running in 1640 * compatibility mode. In that case, let the 1641 * oprofiler know which set of compatibility 1642 * counters to pull from by making sure the 1643 * oprofile_cpu_type string is set to that of 1644 * compatibility mode. If the oprofile_cpu_type 1645 * already has a value, then we are possibly 1646 * overriding a real PVR with a logical one, and, 1647 * in that case, keep the current value for 1648 * oprofile_cpu_type. 1649 */ 1650 if (t->oprofile_cpu_type == NULL) 1651 t->oprofile_cpu_type = s->oprofile_cpu_type; 1652 } else 1653 *t = *s; 1654 *PTRRELOC(&cur_cpu_spec) = &the_cpu_spec; 1655 #if defined(CONFIG_PPC64) || defined(CONFIG_BOOKE) 1656 /* ppc64 and booke expect identify_cpu to also call 1657 * setup_cpu for that processor. I will consolidate 1658 * that at a later time, for now, just use #ifdef. 1659 * we also don't need to PTRRELOC the function pointer 1660 * on ppc64 and booke as we are running at 0 in real 1661 * mode on ppc64 and reloc_offset is always 0 on booke. 1662 */ 1663 if (s->cpu_setup) { 1664 s->cpu_setup(offset, s); 1665 } 1666 #endif /* CONFIG_PPC64 || CONFIG_BOOKE */ 1667 return s; 1668 } 1669 BUG(); 1670 return NULL; 1671 } 1672