Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  *  Copyright (C) 2001 Ben. Herrenschmidt (benh@kernel.crashing.org)
0004  *
0005  *  Modifications for ppc64:
0006  *      Copyright (C) 2003 Dave Engebretsen <engebret@us.ibm.com>
0007  */
0008 
0009 #include <linux/string.h>
0010 #include <linux/sched.h>
0011 #include <linux/threads.h>
0012 #include <linux/init.h>
0013 #include <linux/export.h>
0014 #include <linux/jump_label.h>
0015 #include <linux/of.h>
0016 
0017 #include <asm/cputable.h>
0018 #include <asm/mce.h>
0019 #include <asm/mmu.h>
0020 #include <asm/setup.h>
0021 
0022 static struct cpu_spec the_cpu_spec __read_mostly;
0023 
0024 struct cpu_spec* cur_cpu_spec __read_mostly = NULL;
0025 EXPORT_SYMBOL(cur_cpu_spec);
0026 
0027 /* The platform string corresponding to the real PVR */
0028 const char *powerpc_base_platform;
0029 
0030 /* NOTE:
0031  * Unlike ppc32, ppc64 will only call this once for the boot CPU, it's
0032  * the responsibility of the appropriate CPU save/restore functions to
0033  * eventually copy these settings over. Those save/restore aren't yet
0034  * part of the cputable though. That has to be fixed for both ppc32
0035  * and ppc64
0036  */
0037 #ifdef CONFIG_PPC32
0038 extern void __setup_cpu_e500v1(unsigned long offset, struct cpu_spec* spec);
0039 extern void __setup_cpu_e500v2(unsigned long offset, struct cpu_spec* spec);
0040 extern void __setup_cpu_e500mc(unsigned long offset, struct cpu_spec* spec);
0041 extern void __setup_cpu_440ep(unsigned long offset, struct cpu_spec* spec);
0042 extern void __setup_cpu_440epx(unsigned long offset, struct cpu_spec* spec);
0043 extern void __setup_cpu_440gx(unsigned long offset, struct cpu_spec* spec);
0044 extern void __setup_cpu_440grx(unsigned long offset, struct cpu_spec* spec);
0045 extern void __setup_cpu_440spe(unsigned long offset, struct cpu_spec* spec);
0046 extern void __setup_cpu_440x5(unsigned long offset, struct cpu_spec* spec);
0047 extern void __setup_cpu_460ex(unsigned long offset, struct cpu_spec* spec);
0048 extern void __setup_cpu_460gt(unsigned long offset, struct cpu_spec* spec);
0049 extern void __setup_cpu_460sx(unsigned long offset, struct cpu_spec *spec);
0050 extern void __setup_cpu_apm821xx(unsigned long offset, struct cpu_spec *spec);
0051 extern void __setup_cpu_603(unsigned long offset, struct cpu_spec* spec);
0052 extern void __setup_cpu_604(unsigned long offset, struct cpu_spec* spec);
0053 extern void __setup_cpu_750(unsigned long offset, struct cpu_spec* spec);
0054 extern void __setup_cpu_750cx(unsigned long offset, struct cpu_spec* spec);
0055 extern void __setup_cpu_750fx(unsigned long offset, struct cpu_spec* spec);
0056 extern void __setup_cpu_7400(unsigned long offset, struct cpu_spec* spec);
0057 extern void __setup_cpu_7410(unsigned long offset, struct cpu_spec* spec);
0058 extern void __setup_cpu_745x(unsigned long offset, struct cpu_spec* spec);
0059 #endif /* CONFIG_PPC32 */
0060 #ifdef CONFIG_PPC64
0061 #include <asm/cpu_setup_power.h>
0062 extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec);
0063 extern void __setup_cpu_ppc970MP(unsigned long offset, struct cpu_spec* spec);
0064 extern void __setup_cpu_pa6t(unsigned long offset, struct cpu_spec* spec);
0065 extern void __restore_cpu_pa6t(void);
0066 extern void __restore_cpu_ppc970(void);
0067 extern long __machine_check_early_realmode_p7(struct pt_regs *regs);
0068 extern long __machine_check_early_realmode_p8(struct pt_regs *regs);
0069 extern long __machine_check_early_realmode_p9(struct pt_regs *regs);
0070 #endif /* CONFIG_PPC64 */
0071 #if defined(CONFIG_E500)
0072 extern void __setup_cpu_e5500(unsigned long offset, struct cpu_spec* spec);
0073 extern void __setup_cpu_e6500(unsigned long offset, struct cpu_spec* spec);
0074 extern void __restore_cpu_e5500(void);
0075 extern void __restore_cpu_e6500(void);
0076 #endif /* CONFIG_E500 */
0077 
0078 /* This table only contains "desktop" CPUs, it need to be filled with embedded
0079  * ones as well...
0080  */
0081 #define COMMON_USER     (PPC_FEATURE_32 | PPC_FEATURE_HAS_FPU | \
0082                  PPC_FEATURE_HAS_MMU)
0083 #define COMMON_USER_PPC64   (COMMON_USER | PPC_FEATURE_64)
0084 #define COMMON_USER_POWER4  (COMMON_USER_PPC64 | PPC_FEATURE_POWER4)
0085 #define COMMON_USER_POWER5  (COMMON_USER_PPC64 | PPC_FEATURE_POWER5 |\
0086                  PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP)
0087 #define COMMON_USER_POWER5_PLUS (COMMON_USER_PPC64 | PPC_FEATURE_POWER5_PLUS|\
0088                  PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP)
0089 #define COMMON_USER_POWER6  (COMMON_USER_PPC64 | PPC_FEATURE_ARCH_2_05 |\
0090                  PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP | \
0091                  PPC_FEATURE_TRUE_LE | \
0092                  PPC_FEATURE_PSERIES_PERFMON_COMPAT)
0093 #define COMMON_USER_POWER7  (COMMON_USER_PPC64 | PPC_FEATURE_ARCH_2_06 |\
0094                  PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP | \
0095                  PPC_FEATURE_TRUE_LE | \
0096                  PPC_FEATURE_PSERIES_PERFMON_COMPAT)
0097 #define COMMON_USER2_POWER7 (PPC_FEATURE2_DSCR)
0098 #define COMMON_USER_POWER8  (COMMON_USER_PPC64 | PPC_FEATURE_ARCH_2_06 |\
0099                  PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP | \
0100                  PPC_FEATURE_TRUE_LE | \
0101                  PPC_FEATURE_PSERIES_PERFMON_COMPAT)
0102 #define COMMON_USER2_POWER8 (PPC_FEATURE2_ARCH_2_07 | \
0103                  PPC_FEATURE2_HTM_COMP | \
0104                  PPC_FEATURE2_HTM_NOSC_COMP | \
0105                  PPC_FEATURE2_DSCR | \
0106                  PPC_FEATURE2_ISEL | PPC_FEATURE2_TAR | \
0107                  PPC_FEATURE2_VEC_CRYPTO)
0108 #define COMMON_USER_PA6T    (COMMON_USER_PPC64 | PPC_FEATURE_PA6T |\
0109                  PPC_FEATURE_TRUE_LE | \
0110                  PPC_FEATURE_HAS_ALTIVEC_COMP)
0111 #define COMMON_USER_POWER9  COMMON_USER_POWER8
0112 #define COMMON_USER2_POWER9 (COMMON_USER2_POWER8 | \
0113                  PPC_FEATURE2_ARCH_3_00 | \
0114                  PPC_FEATURE2_HAS_IEEE128 | \
0115                  PPC_FEATURE2_DARN | \
0116                  PPC_FEATURE2_SCV)
0117 #define COMMON_USER_POWER10 COMMON_USER_POWER9
0118 #define COMMON_USER2_POWER10    (PPC_FEATURE2_ARCH_3_1 | \
0119                  PPC_FEATURE2_MMA | \
0120                  PPC_FEATURE2_ARCH_3_00 | \
0121                  PPC_FEATURE2_HAS_IEEE128 | \
0122                  PPC_FEATURE2_DARN | \
0123                  PPC_FEATURE2_SCV | \
0124                  PPC_FEATURE2_ARCH_2_07 | \
0125                  PPC_FEATURE2_DSCR | \
0126                  PPC_FEATURE2_ISEL | PPC_FEATURE2_TAR | \
0127                  PPC_FEATURE2_VEC_CRYPTO)
0128 
0129 #ifdef CONFIG_PPC_BOOK3E_64
0130 #define COMMON_USER_BOOKE   (COMMON_USER_PPC64 | PPC_FEATURE_BOOKE)
0131 #else
0132 #define COMMON_USER_BOOKE   (PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | \
0133                  PPC_FEATURE_BOOKE)
0134 #endif
0135 
0136 static struct cpu_spec __initdata cpu_specs[] = {
0137 #ifdef CONFIG_PPC_BOOK3S_64
0138     {   /* PPC970 */
0139         .pvr_mask       = 0xffff0000,
0140         .pvr_value      = 0x00390000,
0141         .cpu_name       = "PPC970",
0142         .cpu_features       = CPU_FTRS_PPC970,
0143         .cpu_user_features  = COMMON_USER_POWER4 |
0144             PPC_FEATURE_HAS_ALTIVEC_COMP,
0145         .mmu_features       = MMU_FTRS_PPC970,
0146         .icache_bsize       = 128,
0147         .dcache_bsize       = 128,
0148         .num_pmcs       = 8,
0149         .pmc_type       = PPC_PMC_IBM,
0150         .cpu_setup      = __setup_cpu_ppc970,
0151         .cpu_restore        = __restore_cpu_ppc970,
0152         .platform       = "ppc970",
0153     },
0154     {   /* PPC970FX */
0155         .pvr_mask       = 0xffff0000,
0156         .pvr_value      = 0x003c0000,
0157         .cpu_name       = "PPC970FX",
0158         .cpu_features       = CPU_FTRS_PPC970,
0159         .cpu_user_features  = COMMON_USER_POWER4 |
0160             PPC_FEATURE_HAS_ALTIVEC_COMP,
0161         .mmu_features       = MMU_FTRS_PPC970,
0162         .icache_bsize       = 128,
0163         .dcache_bsize       = 128,
0164         .num_pmcs       = 8,
0165         .pmc_type       = PPC_PMC_IBM,
0166         .cpu_setup      = __setup_cpu_ppc970,
0167         .cpu_restore        = __restore_cpu_ppc970,
0168         .platform       = "ppc970",
0169     },
0170     {   /* PPC970MP DD1.0 - no DEEPNAP, use regular 970 init */
0171         .pvr_mask       = 0xffffffff,
0172         .pvr_value      = 0x00440100,
0173         .cpu_name       = "PPC970MP",
0174         .cpu_features       = CPU_FTRS_PPC970,
0175         .cpu_user_features  = COMMON_USER_POWER4 |
0176             PPC_FEATURE_HAS_ALTIVEC_COMP,
0177         .mmu_features       = MMU_FTRS_PPC970,
0178         .icache_bsize       = 128,
0179         .dcache_bsize       = 128,
0180         .num_pmcs       = 8,
0181         .pmc_type       = PPC_PMC_IBM,
0182         .cpu_setup      = __setup_cpu_ppc970,
0183         .cpu_restore        = __restore_cpu_ppc970,
0184         .platform       = "ppc970",
0185     },
0186     {   /* PPC970MP */
0187         .pvr_mask       = 0xffff0000,
0188         .pvr_value      = 0x00440000,
0189         .cpu_name       = "PPC970MP",
0190         .cpu_features       = CPU_FTRS_PPC970,
0191         .cpu_user_features  = COMMON_USER_POWER4 |
0192             PPC_FEATURE_HAS_ALTIVEC_COMP,
0193         .mmu_features       = MMU_FTRS_PPC970,
0194         .icache_bsize       = 128,
0195         .dcache_bsize       = 128,
0196         .num_pmcs       = 8,
0197         .pmc_type       = PPC_PMC_IBM,
0198         .cpu_setup      = __setup_cpu_ppc970MP,
0199         .cpu_restore        = __restore_cpu_ppc970,
0200         .platform       = "ppc970",
0201     },
0202     {   /* PPC970GX */
0203         .pvr_mask       = 0xffff0000,
0204         .pvr_value      = 0x00450000,
0205         .cpu_name       = "PPC970GX",
0206         .cpu_features       = CPU_FTRS_PPC970,
0207         .cpu_user_features  = COMMON_USER_POWER4 |
0208             PPC_FEATURE_HAS_ALTIVEC_COMP,
0209         .mmu_features       = MMU_FTRS_PPC970,
0210         .icache_bsize       = 128,
0211         .dcache_bsize       = 128,
0212         .num_pmcs       = 8,
0213         .pmc_type       = PPC_PMC_IBM,
0214         .cpu_setup      = __setup_cpu_ppc970,
0215         .platform       = "ppc970",
0216     },
0217     {   /* Power5 GR */
0218         .pvr_mask       = 0xffff0000,
0219         .pvr_value      = 0x003a0000,
0220         .cpu_name       = "POWER5 (gr)",
0221         .cpu_features       = CPU_FTRS_POWER5,
0222         .cpu_user_features  = COMMON_USER_POWER5,
0223         .mmu_features       = MMU_FTRS_POWER5,
0224         .icache_bsize       = 128,
0225         .dcache_bsize       = 128,
0226         .num_pmcs       = 6,
0227         .pmc_type       = PPC_PMC_IBM,
0228         .platform       = "power5",
0229     },
0230     {   /* Power5++ */
0231         .pvr_mask       = 0xffffff00,
0232         .pvr_value      = 0x003b0300,
0233         .cpu_name       = "POWER5+ (gs)",
0234         .cpu_features       = CPU_FTRS_POWER5,
0235         .cpu_user_features  = COMMON_USER_POWER5_PLUS,
0236         .mmu_features       = MMU_FTRS_POWER5,
0237         .icache_bsize       = 128,
0238         .dcache_bsize       = 128,
0239         .num_pmcs       = 6,
0240         .platform       = "power5+",
0241     },
0242     {   /* Power5 GS */
0243         .pvr_mask       = 0xffff0000,
0244         .pvr_value      = 0x003b0000,
0245         .cpu_name       = "POWER5+ (gs)",
0246         .cpu_features       = CPU_FTRS_POWER5,
0247         .cpu_user_features  = COMMON_USER_POWER5_PLUS,
0248         .mmu_features       = MMU_FTRS_POWER5,
0249         .icache_bsize       = 128,
0250         .dcache_bsize       = 128,
0251         .num_pmcs       = 6,
0252         .pmc_type       = PPC_PMC_IBM,
0253         .platform       = "power5+",
0254     },
0255     {   /* POWER6 in P5+ mode; 2.04-compliant processor */
0256         .pvr_mask       = 0xffffffff,
0257         .pvr_value      = 0x0f000001,
0258         .cpu_name       = "POWER5+",
0259         .cpu_features       = CPU_FTRS_POWER5,
0260         .cpu_user_features  = COMMON_USER_POWER5_PLUS,
0261         .mmu_features       = MMU_FTRS_POWER5,
0262         .icache_bsize       = 128,
0263         .dcache_bsize       = 128,
0264         .platform       = "power5+",
0265     },
0266     {   /* Power6 */
0267         .pvr_mask       = 0xffff0000,
0268         .pvr_value      = 0x003e0000,
0269         .cpu_name       = "POWER6 (raw)",
0270         .cpu_features       = CPU_FTRS_POWER6,
0271         .cpu_user_features  = COMMON_USER_POWER6 |
0272             PPC_FEATURE_POWER6_EXT,
0273         .mmu_features       = MMU_FTRS_POWER6,
0274         .icache_bsize       = 128,
0275         .dcache_bsize       = 128,
0276         .num_pmcs       = 6,
0277         .pmc_type       = PPC_PMC_IBM,
0278         .platform       = "power6x",
0279     },
0280     {   /* 2.05-compliant processor, i.e. Power6 "architected" mode */
0281         .pvr_mask       = 0xffffffff,
0282         .pvr_value      = 0x0f000002,
0283         .cpu_name       = "POWER6 (architected)",
0284         .cpu_features       = CPU_FTRS_POWER6,
0285         .cpu_user_features  = COMMON_USER_POWER6,
0286         .mmu_features       = MMU_FTRS_POWER6,
0287         .icache_bsize       = 128,
0288         .dcache_bsize       = 128,
0289         .platform       = "power6",
0290     },
0291     {   /* 2.06-compliant processor, i.e. Power7 "architected" mode */
0292         .pvr_mask       = 0xffffffff,
0293         .pvr_value      = 0x0f000003,
0294         .cpu_name       = "POWER7 (architected)",
0295         .cpu_features       = CPU_FTRS_POWER7,
0296         .cpu_user_features  = COMMON_USER_POWER7,
0297         .cpu_user_features2 = COMMON_USER2_POWER7,
0298         .mmu_features       = MMU_FTRS_POWER7,
0299         .icache_bsize       = 128,
0300         .dcache_bsize       = 128,
0301         .cpu_setup      = __setup_cpu_power7,
0302         .cpu_restore        = __restore_cpu_power7,
0303         .machine_check_early    = __machine_check_early_realmode_p7,
0304         .platform       = "power7",
0305     },
0306     {   /* 2.07-compliant processor, i.e. Power8 "architected" mode */
0307         .pvr_mask       = 0xffffffff,
0308         .pvr_value      = 0x0f000004,
0309         .cpu_name       = "POWER8 (architected)",
0310         .cpu_features       = CPU_FTRS_POWER8,
0311         .cpu_user_features  = COMMON_USER_POWER8,
0312         .cpu_user_features2 = COMMON_USER2_POWER8,
0313         .mmu_features       = MMU_FTRS_POWER8,
0314         .icache_bsize       = 128,
0315         .dcache_bsize       = 128,
0316         .cpu_setup      = __setup_cpu_power8,
0317         .cpu_restore        = __restore_cpu_power8,
0318         .machine_check_early    = __machine_check_early_realmode_p8,
0319         .platform       = "power8",
0320     },
0321     {   /* 3.00-compliant processor, i.e. Power9 "architected" mode */
0322         .pvr_mask       = 0xffffffff,
0323         .pvr_value      = 0x0f000005,
0324         .cpu_name       = "POWER9 (architected)",
0325         .cpu_features       = CPU_FTRS_POWER9,
0326         .cpu_user_features  = COMMON_USER_POWER9,
0327         .cpu_user_features2 = COMMON_USER2_POWER9,
0328         .mmu_features       = MMU_FTRS_POWER9,
0329         .icache_bsize       = 128,
0330         .dcache_bsize       = 128,
0331         .cpu_setup      = __setup_cpu_power9,
0332         .cpu_restore        = __restore_cpu_power9,
0333         .platform       = "power9",
0334     },
0335     {   /* 3.1-compliant processor, i.e. Power10 "architected" mode */
0336         .pvr_mask       = 0xffffffff,
0337         .pvr_value      = 0x0f000006,
0338         .cpu_name       = "POWER10 (architected)",
0339         .cpu_features       = CPU_FTRS_POWER10,
0340         .cpu_user_features  = COMMON_USER_POWER10,
0341         .cpu_user_features2 = COMMON_USER2_POWER10,
0342         .mmu_features       = MMU_FTRS_POWER10,
0343         .icache_bsize       = 128,
0344         .dcache_bsize       = 128,
0345         .cpu_setup      = __setup_cpu_power10,
0346         .cpu_restore        = __restore_cpu_power10,
0347         .platform       = "power10",
0348     },
0349     {   /* Power7 */
0350         .pvr_mask       = 0xffff0000,
0351         .pvr_value      = 0x003f0000,
0352         .cpu_name       = "POWER7 (raw)",
0353         .cpu_features       = CPU_FTRS_POWER7,
0354         .cpu_user_features  = COMMON_USER_POWER7,
0355         .cpu_user_features2 = COMMON_USER2_POWER7,
0356         .mmu_features       = MMU_FTRS_POWER7,
0357         .icache_bsize       = 128,
0358         .dcache_bsize       = 128,
0359         .num_pmcs       = 6,
0360         .pmc_type       = PPC_PMC_IBM,
0361         .cpu_setup      = __setup_cpu_power7,
0362         .cpu_restore        = __restore_cpu_power7,
0363         .machine_check_early    = __machine_check_early_realmode_p7,
0364         .platform       = "power7",
0365     },
0366     {   /* Power7+ */
0367         .pvr_mask       = 0xffff0000,
0368         .pvr_value      = 0x004A0000,
0369         .cpu_name       = "POWER7+ (raw)",
0370         .cpu_features       = CPU_FTRS_POWER7,
0371         .cpu_user_features  = COMMON_USER_POWER7,
0372         .cpu_user_features2 = COMMON_USER2_POWER7,
0373         .mmu_features       = MMU_FTRS_POWER7,
0374         .icache_bsize       = 128,
0375         .dcache_bsize       = 128,
0376         .num_pmcs       = 6,
0377         .pmc_type       = PPC_PMC_IBM,
0378         .cpu_setup      = __setup_cpu_power7,
0379         .cpu_restore        = __restore_cpu_power7,
0380         .machine_check_early    = __machine_check_early_realmode_p7,
0381         .platform       = "power7+",
0382     },
0383     {   /* Power8E */
0384         .pvr_mask       = 0xffff0000,
0385         .pvr_value      = 0x004b0000,
0386         .cpu_name       = "POWER8E (raw)",
0387         .cpu_features       = CPU_FTRS_POWER8E,
0388         .cpu_user_features  = COMMON_USER_POWER8,
0389         .cpu_user_features2 = COMMON_USER2_POWER8,
0390         .mmu_features       = MMU_FTRS_POWER8,
0391         .icache_bsize       = 128,
0392         .dcache_bsize       = 128,
0393         .num_pmcs       = 6,
0394         .pmc_type       = PPC_PMC_IBM,
0395         .cpu_setup      = __setup_cpu_power8,
0396         .cpu_restore        = __restore_cpu_power8,
0397         .machine_check_early    = __machine_check_early_realmode_p8,
0398         .platform       = "power8",
0399     },
0400     {   /* Power8NVL */
0401         .pvr_mask       = 0xffff0000,
0402         .pvr_value      = 0x004c0000,
0403         .cpu_name       = "POWER8NVL (raw)",
0404         .cpu_features       = CPU_FTRS_POWER8,
0405         .cpu_user_features  = COMMON_USER_POWER8,
0406         .cpu_user_features2 = COMMON_USER2_POWER8,
0407         .mmu_features       = MMU_FTRS_POWER8,
0408         .icache_bsize       = 128,
0409         .dcache_bsize       = 128,
0410         .num_pmcs       = 6,
0411         .pmc_type       = PPC_PMC_IBM,
0412         .cpu_setup      = __setup_cpu_power8,
0413         .cpu_restore        = __restore_cpu_power8,
0414         .machine_check_early    = __machine_check_early_realmode_p8,
0415         .platform       = "power8",
0416     },
0417     {   /* Power8 */
0418         .pvr_mask       = 0xffff0000,
0419         .pvr_value      = 0x004d0000,
0420         .cpu_name       = "POWER8 (raw)",
0421         .cpu_features       = CPU_FTRS_POWER8,
0422         .cpu_user_features  = COMMON_USER_POWER8,
0423         .cpu_user_features2 = COMMON_USER2_POWER8,
0424         .mmu_features       = MMU_FTRS_POWER8,
0425         .icache_bsize       = 128,
0426         .dcache_bsize       = 128,
0427         .num_pmcs       = 6,
0428         .pmc_type       = PPC_PMC_IBM,
0429         .cpu_setup      = __setup_cpu_power8,
0430         .cpu_restore        = __restore_cpu_power8,
0431         .machine_check_early    = __machine_check_early_realmode_p8,
0432         .platform       = "power8",
0433     },
0434     {   /* Power9 DD2.0 */
0435         .pvr_mask       = 0xffffefff,
0436         .pvr_value      = 0x004e0200,
0437         .cpu_name       = "POWER9 (raw)",
0438         .cpu_features       = CPU_FTRS_POWER9_DD2_0,
0439         .cpu_user_features  = COMMON_USER_POWER9,
0440         .cpu_user_features2 = COMMON_USER2_POWER9,
0441         .mmu_features       = MMU_FTRS_POWER9,
0442         .icache_bsize       = 128,
0443         .dcache_bsize       = 128,
0444         .num_pmcs       = 6,
0445         .pmc_type       = PPC_PMC_IBM,
0446         .cpu_setup      = __setup_cpu_power9,
0447         .cpu_restore        = __restore_cpu_power9,
0448         .machine_check_early    = __machine_check_early_realmode_p9,
0449         .platform       = "power9",
0450     },
0451     {   /* Power9 DD 2.1 */
0452         .pvr_mask       = 0xffffefff,
0453         .pvr_value      = 0x004e0201,
0454         .cpu_name       = "POWER9 (raw)",
0455         .cpu_features       = CPU_FTRS_POWER9_DD2_1,
0456         .cpu_user_features  = COMMON_USER_POWER9,
0457         .cpu_user_features2 = COMMON_USER2_POWER9,
0458         .mmu_features       = MMU_FTRS_POWER9,
0459         .icache_bsize       = 128,
0460         .dcache_bsize       = 128,
0461         .num_pmcs       = 6,
0462         .pmc_type       = PPC_PMC_IBM,
0463         .cpu_setup      = __setup_cpu_power9,
0464         .cpu_restore        = __restore_cpu_power9,
0465         .machine_check_early    = __machine_check_early_realmode_p9,
0466         .platform       = "power9",
0467     },
0468     {   /* Power9 DD2.2 */
0469         .pvr_mask       = 0xffffefff,
0470         .pvr_value      = 0x004e0202,
0471         .cpu_name       = "POWER9 (raw)",
0472         .cpu_features       = CPU_FTRS_POWER9_DD2_2,
0473         .cpu_user_features  = COMMON_USER_POWER9,
0474         .cpu_user_features2 = COMMON_USER2_POWER9,
0475         .mmu_features       = MMU_FTRS_POWER9,
0476         .icache_bsize       = 128,
0477         .dcache_bsize       = 128,
0478         .num_pmcs       = 6,
0479         .pmc_type       = PPC_PMC_IBM,
0480         .cpu_setup      = __setup_cpu_power9,
0481         .cpu_restore        = __restore_cpu_power9,
0482         .machine_check_early    = __machine_check_early_realmode_p9,
0483         .platform       = "power9",
0484     },
0485     {   /* Power9 DD2.3 or later */
0486         .pvr_mask       = 0xffff0000,
0487         .pvr_value      = 0x004e0000,
0488         .cpu_name       = "POWER9 (raw)",
0489         .cpu_features       = CPU_FTRS_POWER9_DD2_3,
0490         .cpu_user_features  = COMMON_USER_POWER9,
0491         .cpu_user_features2 = COMMON_USER2_POWER9,
0492         .mmu_features       = MMU_FTRS_POWER9,
0493         .icache_bsize       = 128,
0494         .dcache_bsize       = 128,
0495         .num_pmcs       = 6,
0496         .pmc_type       = PPC_PMC_IBM,
0497         .cpu_setup      = __setup_cpu_power9,
0498         .cpu_restore        = __restore_cpu_power9,
0499         .machine_check_early    = __machine_check_early_realmode_p9,
0500         .platform       = "power9",
0501     },
0502     {   /* Power10 */
0503         .pvr_mask       = 0xffff0000,
0504         .pvr_value      = 0x00800000,
0505         .cpu_name       = "POWER10 (raw)",
0506         .cpu_features       = CPU_FTRS_POWER10,
0507         .cpu_user_features  = COMMON_USER_POWER10,
0508         .cpu_user_features2 = COMMON_USER2_POWER10,
0509         .mmu_features       = MMU_FTRS_POWER10,
0510         .icache_bsize       = 128,
0511         .dcache_bsize       = 128,
0512         .num_pmcs       = 6,
0513         .pmc_type       = PPC_PMC_IBM,
0514         .cpu_setup      = __setup_cpu_power10,
0515         .cpu_restore        = __restore_cpu_power10,
0516         .machine_check_early    = __machine_check_early_realmode_p10,
0517         .platform       = "power10",
0518     },
0519     {   /* Cell Broadband Engine */
0520         .pvr_mask       = 0xffff0000,
0521         .pvr_value      = 0x00700000,
0522         .cpu_name       = "Cell Broadband Engine",
0523         .cpu_features       = CPU_FTRS_CELL,
0524         .cpu_user_features  = COMMON_USER_PPC64 |
0525             PPC_FEATURE_CELL | PPC_FEATURE_HAS_ALTIVEC_COMP |
0526             PPC_FEATURE_SMT,
0527         .mmu_features       = MMU_FTRS_CELL,
0528         .icache_bsize       = 128,
0529         .dcache_bsize       = 128,
0530         .num_pmcs       = 4,
0531         .pmc_type       = PPC_PMC_IBM,
0532         .platform       = "ppc-cell-be",
0533     },
0534     {   /* PA Semi PA6T */
0535         .pvr_mask       = 0x7fff0000,
0536         .pvr_value      = 0x00900000,
0537         .cpu_name       = "PA6T",
0538         .cpu_features       = CPU_FTRS_PA6T,
0539         .cpu_user_features  = COMMON_USER_PA6T,
0540         .mmu_features       = MMU_FTRS_PA6T,
0541         .icache_bsize       = 64,
0542         .dcache_bsize       = 64,
0543         .num_pmcs       = 6,
0544         .pmc_type       = PPC_PMC_PA6T,
0545         .cpu_setup      = __setup_cpu_pa6t,
0546         .cpu_restore        = __restore_cpu_pa6t,
0547         .platform       = "pa6t",
0548     },
0549     {   /* default match */
0550         .pvr_mask       = 0x00000000,
0551         .pvr_value      = 0x00000000,
0552         .cpu_name       = "POWER5 (compatible)",
0553         .cpu_features       = CPU_FTRS_COMPATIBLE,
0554         .cpu_user_features  = COMMON_USER_PPC64,
0555         .mmu_features       = MMU_FTRS_POWER,
0556         .icache_bsize       = 128,
0557         .dcache_bsize       = 128,
0558         .num_pmcs       = 6,
0559         .pmc_type       = PPC_PMC_IBM,
0560         .platform       = "power5",
0561     }
0562 #endif  /* CONFIG_PPC_BOOK3S_64 */
0563 
0564 #ifdef CONFIG_PPC32
0565 #ifdef CONFIG_PPC_BOOK3S_32
0566 #ifdef CONFIG_PPC_BOOK3S_604
0567     {   /* 604 */
0568         .pvr_mask       = 0xffff0000,
0569         .pvr_value      = 0x00040000,
0570         .cpu_name       = "604",
0571         .cpu_features       = CPU_FTRS_604,
0572         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
0573         .mmu_features       = MMU_FTR_HPTE_TABLE,
0574         .icache_bsize       = 32,
0575         .dcache_bsize       = 32,
0576         .num_pmcs       = 2,
0577         .cpu_setup      = __setup_cpu_604,
0578         .machine_check      = machine_check_generic,
0579         .platform       = "ppc604",
0580     },
0581     {   /* 604e */
0582         .pvr_mask       = 0xfffff000,
0583         .pvr_value      = 0x00090000,
0584         .cpu_name       = "604e",
0585         .cpu_features       = CPU_FTRS_604,
0586         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
0587         .mmu_features       = MMU_FTR_HPTE_TABLE,
0588         .icache_bsize       = 32,
0589         .dcache_bsize       = 32,
0590         .num_pmcs       = 4,
0591         .cpu_setup      = __setup_cpu_604,
0592         .machine_check      = machine_check_generic,
0593         .platform       = "ppc604",
0594     },
0595     {   /* 604r */
0596         .pvr_mask       = 0xffff0000,
0597         .pvr_value      = 0x00090000,
0598         .cpu_name       = "604r",
0599         .cpu_features       = CPU_FTRS_604,
0600         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
0601         .mmu_features       = MMU_FTR_HPTE_TABLE,
0602         .icache_bsize       = 32,
0603         .dcache_bsize       = 32,
0604         .num_pmcs       = 4,
0605         .cpu_setup      = __setup_cpu_604,
0606         .machine_check      = machine_check_generic,
0607         .platform       = "ppc604",
0608     },
0609     {   /* 604ev */
0610         .pvr_mask       = 0xffff0000,
0611         .pvr_value      = 0x000a0000,
0612         .cpu_name       = "604ev",
0613         .cpu_features       = CPU_FTRS_604,
0614         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
0615         .mmu_features       = MMU_FTR_HPTE_TABLE,
0616         .icache_bsize       = 32,
0617         .dcache_bsize       = 32,
0618         .num_pmcs       = 4,
0619         .cpu_setup      = __setup_cpu_604,
0620         .machine_check      = machine_check_generic,
0621         .platform       = "ppc604",
0622     },
0623     {   /* 740/750 (0x4202, don't support TAU ?) */
0624         .pvr_mask       = 0xffffffff,
0625         .pvr_value      = 0x00084202,
0626         .cpu_name       = "740/750",
0627         .cpu_features       = CPU_FTRS_740_NOTAU,
0628         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
0629         .mmu_features       = MMU_FTR_HPTE_TABLE,
0630         .icache_bsize       = 32,
0631         .dcache_bsize       = 32,
0632         .num_pmcs       = 4,
0633         .cpu_setup      = __setup_cpu_750,
0634         .machine_check      = machine_check_generic,
0635         .platform       = "ppc750",
0636     },
0637     {   /* 750CX (80100 and 8010x?) */
0638         .pvr_mask       = 0xfffffff0,
0639         .pvr_value      = 0x00080100,
0640         .cpu_name       = "750CX",
0641         .cpu_features       = CPU_FTRS_750,
0642         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
0643         .mmu_features       = MMU_FTR_HPTE_TABLE,
0644         .icache_bsize       = 32,
0645         .dcache_bsize       = 32,
0646         .num_pmcs       = 4,
0647         .cpu_setup      = __setup_cpu_750cx,
0648         .machine_check      = machine_check_generic,
0649         .platform       = "ppc750",
0650     },
0651     {   /* 750CX (82201 and 82202) */
0652         .pvr_mask       = 0xfffffff0,
0653         .pvr_value      = 0x00082200,
0654         .cpu_name       = "750CX",
0655         .cpu_features       = CPU_FTRS_750,
0656         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
0657         .mmu_features       = MMU_FTR_HPTE_TABLE,
0658         .icache_bsize       = 32,
0659         .dcache_bsize       = 32,
0660         .num_pmcs       = 4,
0661         .pmc_type       = PPC_PMC_IBM,
0662         .cpu_setup      = __setup_cpu_750cx,
0663         .machine_check      = machine_check_generic,
0664         .platform       = "ppc750",
0665     },
0666     {   /* 750CXe (82214) */
0667         .pvr_mask       = 0xfffffff0,
0668         .pvr_value      = 0x00082210,
0669         .cpu_name       = "750CXe",
0670         .cpu_features       = CPU_FTRS_750,
0671         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
0672         .mmu_features       = MMU_FTR_HPTE_TABLE,
0673         .icache_bsize       = 32,
0674         .dcache_bsize       = 32,
0675         .num_pmcs       = 4,
0676         .pmc_type       = PPC_PMC_IBM,
0677         .cpu_setup      = __setup_cpu_750cx,
0678         .machine_check      = machine_check_generic,
0679         .platform       = "ppc750",
0680     },
0681     {   /* 750CXe "Gekko" (83214) */
0682         .pvr_mask       = 0xffffffff,
0683         .pvr_value      = 0x00083214,
0684         .cpu_name       = "750CXe",
0685         .cpu_features       = CPU_FTRS_750,
0686         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
0687         .mmu_features       = MMU_FTR_HPTE_TABLE,
0688         .icache_bsize       = 32,
0689         .dcache_bsize       = 32,
0690         .num_pmcs       = 4,
0691         .pmc_type       = PPC_PMC_IBM,
0692         .cpu_setup      = __setup_cpu_750cx,
0693         .machine_check      = machine_check_generic,
0694         .platform       = "ppc750",
0695     },
0696     {   /* 750CL (and "Broadway") */
0697         .pvr_mask       = 0xfffff0e0,
0698         .pvr_value      = 0x00087000,
0699         .cpu_name       = "750CL",
0700         .cpu_features       = CPU_FTRS_750CL,
0701         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
0702         .mmu_features       = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
0703         .icache_bsize       = 32,
0704         .dcache_bsize       = 32,
0705         .num_pmcs       = 4,
0706         .pmc_type       = PPC_PMC_IBM,
0707         .cpu_setup      = __setup_cpu_750,
0708         .machine_check      = machine_check_generic,
0709         .platform       = "ppc750",
0710     },
0711     {   /* 745/755 */
0712         .pvr_mask       = 0xfffff000,
0713         .pvr_value      = 0x00083000,
0714         .cpu_name       = "745/755",
0715         .cpu_features       = CPU_FTRS_750,
0716         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
0717         .mmu_features       = MMU_FTR_HPTE_TABLE,
0718         .icache_bsize       = 32,
0719         .dcache_bsize       = 32,
0720         .num_pmcs       = 4,
0721         .pmc_type       = PPC_PMC_IBM,
0722         .cpu_setup      = __setup_cpu_750,
0723         .machine_check      = machine_check_generic,
0724         .platform       = "ppc750",
0725     },
0726     {   /* 750FX rev 1.x */
0727         .pvr_mask       = 0xffffff00,
0728         .pvr_value      = 0x70000100,
0729         .cpu_name       = "750FX",
0730         .cpu_features       = CPU_FTRS_750FX1,
0731         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
0732         .mmu_features       = MMU_FTR_HPTE_TABLE,
0733         .icache_bsize       = 32,
0734         .dcache_bsize       = 32,
0735         .num_pmcs       = 4,
0736         .pmc_type       = PPC_PMC_IBM,
0737         .cpu_setup      = __setup_cpu_750,
0738         .machine_check      = machine_check_generic,
0739         .platform       = "ppc750",
0740     },
0741     {   /* 750FX rev 2.0 must disable HID0[DPM] */
0742         .pvr_mask       = 0xffffffff,
0743         .pvr_value      = 0x70000200,
0744         .cpu_name       = "750FX",
0745         .cpu_features       = CPU_FTRS_750FX2,
0746         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
0747         .mmu_features       = MMU_FTR_HPTE_TABLE,
0748         .icache_bsize       = 32,
0749         .dcache_bsize       = 32,
0750         .num_pmcs       = 4,
0751         .pmc_type       = PPC_PMC_IBM,
0752         .cpu_setup      = __setup_cpu_750,
0753         .machine_check      = machine_check_generic,
0754         .platform       = "ppc750",
0755     },
0756     {   /* 750FX (All revs except 2.0) */
0757         .pvr_mask       = 0xffff0000,
0758         .pvr_value      = 0x70000000,
0759         .cpu_name       = "750FX",
0760         .cpu_features       = CPU_FTRS_750FX,
0761         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
0762         .mmu_features       = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
0763         .icache_bsize       = 32,
0764         .dcache_bsize       = 32,
0765         .num_pmcs       = 4,
0766         .pmc_type       = PPC_PMC_IBM,
0767         .cpu_setup      = __setup_cpu_750fx,
0768         .machine_check      = machine_check_generic,
0769         .platform       = "ppc750",
0770     },
0771     {   /* 750GX */
0772         .pvr_mask       = 0xffff0000,
0773         .pvr_value      = 0x70020000,
0774         .cpu_name       = "750GX",
0775         .cpu_features       = CPU_FTRS_750GX,
0776         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
0777         .mmu_features       = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
0778         .icache_bsize       = 32,
0779         .dcache_bsize       = 32,
0780         .num_pmcs       = 4,
0781         .pmc_type       = PPC_PMC_IBM,
0782         .cpu_setup      = __setup_cpu_750fx,
0783         .machine_check      = machine_check_generic,
0784         .platform       = "ppc750",
0785     },
0786     {   /* 740/750 (L2CR bit need fixup for 740) */
0787         .pvr_mask       = 0xffff0000,
0788         .pvr_value      = 0x00080000,
0789         .cpu_name       = "740/750",
0790         .cpu_features       = CPU_FTRS_740,
0791         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
0792         .mmu_features       = MMU_FTR_HPTE_TABLE,
0793         .icache_bsize       = 32,
0794         .dcache_bsize       = 32,
0795         .num_pmcs       = 4,
0796         .pmc_type       = PPC_PMC_IBM,
0797         .cpu_setup      = __setup_cpu_750,
0798         .machine_check      = machine_check_generic,
0799         .platform       = "ppc750",
0800     },
0801     {   /* 7400 rev 1.1 ? (no TAU) */
0802         .pvr_mask       = 0xffffffff,
0803         .pvr_value      = 0x000c1101,
0804         .cpu_name       = "7400 (1.1)",
0805         .cpu_features       = CPU_FTRS_7400_NOTAU,
0806         .cpu_user_features  = COMMON_USER |
0807             PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
0808         .mmu_features       = MMU_FTR_HPTE_TABLE,
0809         .icache_bsize       = 32,
0810         .dcache_bsize       = 32,
0811         .num_pmcs       = 4,
0812         .pmc_type       = PPC_PMC_G4,
0813         .cpu_setup      = __setup_cpu_7400,
0814         .machine_check      = machine_check_generic,
0815         .platform       = "ppc7400",
0816     },
0817     {   /* 7400 */
0818         .pvr_mask       = 0xffff0000,
0819         .pvr_value      = 0x000c0000,
0820         .cpu_name       = "7400",
0821         .cpu_features       = CPU_FTRS_7400,
0822         .cpu_user_features  = COMMON_USER |
0823             PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
0824         .mmu_features       = MMU_FTR_HPTE_TABLE,
0825         .icache_bsize       = 32,
0826         .dcache_bsize       = 32,
0827         .num_pmcs       = 4,
0828         .pmc_type       = PPC_PMC_G4,
0829         .cpu_setup      = __setup_cpu_7400,
0830         .machine_check      = machine_check_generic,
0831         .platform       = "ppc7400",
0832     },
0833     {   /* 7410 */
0834         .pvr_mask       = 0xffff0000,
0835         .pvr_value      = 0x800c0000,
0836         .cpu_name       = "7410",
0837         .cpu_features       = CPU_FTRS_7400,
0838         .cpu_user_features  = COMMON_USER |
0839             PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
0840         .mmu_features       = MMU_FTR_HPTE_TABLE,
0841         .icache_bsize       = 32,
0842         .dcache_bsize       = 32,
0843         .num_pmcs       = 4,
0844         .pmc_type       = PPC_PMC_G4,
0845         .cpu_setup      = __setup_cpu_7410,
0846         .machine_check      = machine_check_generic,
0847         .platform       = "ppc7400",
0848     },
0849     {   /* 7450 2.0 - no doze/nap */
0850         .pvr_mask       = 0xffffffff,
0851         .pvr_value      = 0x80000200,
0852         .cpu_name       = "7450",
0853         .cpu_features       = CPU_FTRS_7450_20,
0854         .cpu_user_features  = COMMON_USER |
0855             PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
0856         .mmu_features       = MMU_FTR_HPTE_TABLE,
0857         .icache_bsize       = 32,
0858         .dcache_bsize       = 32,
0859         .num_pmcs       = 6,
0860         .pmc_type       = PPC_PMC_G4,
0861         .cpu_setup      = __setup_cpu_745x,
0862         .machine_check      = machine_check_generic,
0863         .platform       = "ppc7450",
0864     },
0865     {   /* 7450 2.1 */
0866         .pvr_mask       = 0xffffffff,
0867         .pvr_value      = 0x80000201,
0868         .cpu_name       = "7450",
0869         .cpu_features       = CPU_FTRS_7450_21,
0870         .cpu_user_features  = COMMON_USER |
0871             PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
0872         .mmu_features       = MMU_FTR_HPTE_TABLE,
0873         .icache_bsize       = 32,
0874         .dcache_bsize       = 32,
0875         .num_pmcs       = 6,
0876         .pmc_type       = PPC_PMC_G4,
0877         .cpu_setup      = __setup_cpu_745x,
0878         .machine_check      = machine_check_generic,
0879         .platform       = "ppc7450",
0880     },
0881     {   /* 7450 2.3 and newer */
0882         .pvr_mask       = 0xffff0000,
0883         .pvr_value      = 0x80000000,
0884         .cpu_name       = "7450",
0885         .cpu_features       = CPU_FTRS_7450_23,
0886         .cpu_user_features  = COMMON_USER |
0887             PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
0888         .mmu_features       = MMU_FTR_HPTE_TABLE,
0889         .icache_bsize       = 32,
0890         .dcache_bsize       = 32,
0891         .num_pmcs       = 6,
0892         .pmc_type       = PPC_PMC_G4,
0893         .cpu_setup      = __setup_cpu_745x,
0894         .machine_check      = machine_check_generic,
0895         .platform       = "ppc7450",
0896     },
0897     {   /* 7455 rev 1.x */
0898         .pvr_mask       = 0xffffff00,
0899         .pvr_value      = 0x80010100,
0900         .cpu_name       = "7455",
0901         .cpu_features       = CPU_FTRS_7455_1,
0902         .cpu_user_features  = COMMON_USER |
0903             PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
0904         .mmu_features       = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
0905         .icache_bsize       = 32,
0906         .dcache_bsize       = 32,
0907         .num_pmcs       = 6,
0908         .pmc_type       = PPC_PMC_G4,
0909         .cpu_setup      = __setup_cpu_745x,
0910         .machine_check      = machine_check_generic,
0911         .platform       = "ppc7450",
0912     },
0913     {   /* 7455 rev 2.0 */
0914         .pvr_mask       = 0xffffffff,
0915         .pvr_value      = 0x80010200,
0916         .cpu_name       = "7455",
0917         .cpu_features       = CPU_FTRS_7455_20,
0918         .cpu_user_features  = COMMON_USER |
0919             PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
0920         .mmu_features       = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
0921         .icache_bsize       = 32,
0922         .dcache_bsize       = 32,
0923         .num_pmcs       = 6,
0924         .pmc_type       = PPC_PMC_G4,
0925         .cpu_setup      = __setup_cpu_745x,
0926         .machine_check      = machine_check_generic,
0927         .platform       = "ppc7450",
0928     },
0929     {   /* 7455 others */
0930         .pvr_mask       = 0xffff0000,
0931         .pvr_value      = 0x80010000,
0932         .cpu_name       = "7455",
0933         .cpu_features       = CPU_FTRS_7455,
0934         .cpu_user_features  = COMMON_USER |
0935             PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
0936         .mmu_features       = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
0937         .icache_bsize       = 32,
0938         .dcache_bsize       = 32,
0939         .num_pmcs       = 6,
0940         .pmc_type       = PPC_PMC_G4,
0941         .cpu_setup      = __setup_cpu_745x,
0942         .machine_check      = machine_check_generic,
0943         .platform       = "ppc7450",
0944     },
0945     {   /* 7447/7457 Rev 1.0 */
0946         .pvr_mask       = 0xffffffff,
0947         .pvr_value      = 0x80020100,
0948         .cpu_name       = "7447/7457",
0949         .cpu_features       = CPU_FTRS_7447_10,
0950         .cpu_user_features  = COMMON_USER |
0951             PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
0952         .mmu_features       = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
0953         .icache_bsize       = 32,
0954         .dcache_bsize       = 32,
0955         .num_pmcs       = 6,
0956         .pmc_type       = PPC_PMC_G4,
0957         .cpu_setup      = __setup_cpu_745x,
0958         .machine_check      = machine_check_generic,
0959         .platform       = "ppc7450",
0960     },
0961     {   /* 7447/7457 Rev 1.1 */
0962         .pvr_mask       = 0xffffffff,
0963         .pvr_value      = 0x80020101,
0964         .cpu_name       = "7447/7457",
0965         .cpu_features       = CPU_FTRS_7447_10,
0966         .cpu_user_features  = COMMON_USER |
0967             PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
0968         .mmu_features       = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
0969         .icache_bsize       = 32,
0970         .dcache_bsize       = 32,
0971         .num_pmcs       = 6,
0972         .pmc_type       = PPC_PMC_G4,
0973         .cpu_setup      = __setup_cpu_745x,
0974         .machine_check      = machine_check_generic,
0975         .platform       = "ppc7450",
0976     },
0977     {   /* 7447/7457 Rev 1.2 and later */
0978         .pvr_mask       = 0xffff0000,
0979         .pvr_value      = 0x80020000,
0980         .cpu_name       = "7447/7457",
0981         .cpu_features       = CPU_FTRS_7447,
0982         .cpu_user_features  = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
0983         .mmu_features       = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
0984         .icache_bsize       = 32,
0985         .dcache_bsize       = 32,
0986         .num_pmcs       = 6,
0987         .pmc_type       = PPC_PMC_G4,
0988         .cpu_setup      = __setup_cpu_745x,
0989         .machine_check      = machine_check_generic,
0990         .platform       = "ppc7450",
0991     },
0992     {   /* 7447A */
0993         .pvr_mask       = 0xffff0000,
0994         .pvr_value      = 0x80030000,
0995         .cpu_name       = "7447A",
0996         .cpu_features       = CPU_FTRS_7447A,
0997         .cpu_user_features  = COMMON_USER |
0998             PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
0999         .mmu_features       = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
1000         .icache_bsize       = 32,
1001         .dcache_bsize       = 32,
1002         .num_pmcs       = 6,
1003         .pmc_type       = PPC_PMC_G4,
1004         .cpu_setup      = __setup_cpu_745x,
1005         .machine_check      = machine_check_generic,
1006         .platform       = "ppc7450",
1007     },
1008     {   /* 7448 */
1009         .pvr_mask       = 0xffff0000,
1010         .pvr_value      = 0x80040000,
1011         .cpu_name       = "7448",
1012         .cpu_features       = CPU_FTRS_7448,
1013         .cpu_user_features  = COMMON_USER |
1014             PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
1015         .mmu_features       = MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
1016         .icache_bsize       = 32,
1017         .dcache_bsize       = 32,
1018         .num_pmcs       = 6,
1019         .pmc_type       = PPC_PMC_G4,
1020         .cpu_setup      = __setup_cpu_745x,
1021         .machine_check      = machine_check_generic,
1022         .platform       = "ppc7450",
1023     },
1024 #endif /* CONFIG_PPC_BOOK3S_604 */
1025 #ifdef CONFIG_PPC_BOOK3S_603
1026     {   /* 603 */
1027         .pvr_mask       = 0xffff0000,
1028         .pvr_value      = 0x00030000,
1029         .cpu_name       = "603",
1030         .cpu_features       = CPU_FTRS_603,
1031         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
1032         .mmu_features       = 0,
1033         .icache_bsize       = 32,
1034         .dcache_bsize       = 32,
1035         .cpu_setup      = __setup_cpu_603,
1036         .machine_check      = machine_check_generic,
1037         .platform       = "ppc603",
1038     },
1039     {   /* 603e */
1040         .pvr_mask       = 0xffff0000,
1041         .pvr_value      = 0x00060000,
1042         .cpu_name       = "603e",
1043         .cpu_features       = CPU_FTRS_603,
1044         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
1045         .mmu_features       = 0,
1046         .icache_bsize       = 32,
1047         .dcache_bsize       = 32,
1048         .cpu_setup      = __setup_cpu_603,
1049         .machine_check      = machine_check_generic,
1050         .platform       = "ppc603",
1051     },
1052     {   /* 603ev */
1053         .pvr_mask       = 0xffff0000,
1054         .pvr_value      = 0x00070000,
1055         .cpu_name       = "603ev",
1056         .cpu_features       = CPU_FTRS_603,
1057         .cpu_user_features  = COMMON_USER | PPC_FEATURE_PPC_LE,
1058         .mmu_features       = 0,
1059         .icache_bsize       = 32,
1060         .dcache_bsize       = 32,
1061         .cpu_setup      = __setup_cpu_603,
1062         .machine_check      = machine_check_generic,
1063         .platform       = "ppc603",
1064     },
1065     {   /* 82xx (8240, 8245, 8260 are all 603e cores) */
1066         .pvr_mask       = 0x7fff0000,
1067         .pvr_value      = 0x00810000,
1068         .cpu_name       = "82xx",
1069         .cpu_features       = CPU_FTRS_82XX,
1070         .cpu_user_features  = COMMON_USER,
1071         .mmu_features       = 0,
1072         .icache_bsize       = 32,
1073         .dcache_bsize       = 32,
1074         .cpu_setup      = __setup_cpu_603,
1075         .machine_check      = machine_check_generic,
1076         .platform       = "ppc603",
1077     },
1078     {   /* All G2_LE (603e core, plus some) have the same pvr */
1079         .pvr_mask       = 0x7fff0000,
1080         .pvr_value      = 0x00820000,
1081         .cpu_name       = "G2_LE",
1082         .cpu_features       = CPU_FTRS_G2_LE,
1083         .cpu_user_features  = COMMON_USER,
1084         .mmu_features       = MMU_FTR_USE_HIGH_BATS,
1085         .icache_bsize       = 32,
1086         .dcache_bsize       = 32,
1087         .cpu_setup      = __setup_cpu_603,
1088         .machine_check      = machine_check_generic,
1089         .platform       = "ppc603",
1090     },
1091 #ifdef CONFIG_PPC_83xx
1092     {   /* e300c1 (a 603e core, plus some) on 83xx */
1093         .pvr_mask       = 0x7fff0000,
1094         .pvr_value      = 0x00830000,
1095         .cpu_name       = "e300c1",
1096         .cpu_features       = CPU_FTRS_E300,
1097         .cpu_user_features  = COMMON_USER,
1098         .mmu_features       = MMU_FTR_USE_HIGH_BATS,
1099         .icache_bsize       = 32,
1100         .dcache_bsize       = 32,
1101         .cpu_setup      = __setup_cpu_603,
1102         .machine_check      = machine_check_83xx,
1103         .platform       = "ppc603",
1104     },
1105     {   /* e300c2 (an e300c1 core, plus some, minus FPU) on 83xx */
1106         .pvr_mask       = 0x7fff0000,
1107         .pvr_value      = 0x00840000,
1108         .cpu_name       = "e300c2",
1109         .cpu_features       = CPU_FTRS_E300C2,
1110         .cpu_user_features  = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
1111         .mmu_features       = MMU_FTR_USE_HIGH_BATS |
1112             MMU_FTR_NEED_DTLB_SW_LRU,
1113         .icache_bsize       = 32,
1114         .dcache_bsize       = 32,
1115         .cpu_setup      = __setup_cpu_603,
1116         .machine_check      = machine_check_83xx,
1117         .platform       = "ppc603",
1118     },
1119     {   /* e300c3 (e300c1, plus one IU, half cache size) on 83xx */
1120         .pvr_mask       = 0x7fff0000,
1121         .pvr_value      = 0x00850000,
1122         .cpu_name       = "e300c3",
1123         .cpu_features       = CPU_FTRS_E300,
1124         .cpu_user_features  = COMMON_USER,
1125         .mmu_features       = MMU_FTR_USE_HIGH_BATS |
1126             MMU_FTR_NEED_DTLB_SW_LRU,
1127         .icache_bsize       = 32,
1128         .dcache_bsize       = 32,
1129         .cpu_setup      = __setup_cpu_603,
1130         .machine_check      = machine_check_83xx,
1131         .num_pmcs       = 4,
1132         .platform       = "ppc603",
1133     },
1134     {   /* e300c4 (e300c1, plus one IU) */
1135         .pvr_mask       = 0x7fff0000,
1136         .pvr_value      = 0x00860000,
1137         .cpu_name       = "e300c4",
1138         .cpu_features       = CPU_FTRS_E300,
1139         .cpu_user_features  = COMMON_USER,
1140         .mmu_features       = MMU_FTR_USE_HIGH_BATS |
1141             MMU_FTR_NEED_DTLB_SW_LRU,
1142         .icache_bsize       = 32,
1143         .dcache_bsize       = 32,
1144         .cpu_setup      = __setup_cpu_603,
1145         .machine_check      = machine_check_83xx,
1146         .num_pmcs       = 4,
1147         .platform       = "ppc603",
1148     },
1149 #endif
1150 #endif /* CONFIG_PPC_BOOK3S_603 */
1151 #ifdef CONFIG_PPC_BOOK3S_604
1152     {   /* default match, we assume split I/D cache & TB (non-601)... */
1153         .pvr_mask       = 0x00000000,
1154         .pvr_value      = 0x00000000,
1155         .cpu_name       = "(generic PPC)",
1156         .cpu_features       = CPU_FTRS_CLASSIC32,
1157         .cpu_user_features  = COMMON_USER,
1158         .mmu_features       = MMU_FTR_HPTE_TABLE,
1159         .icache_bsize       = 32,
1160         .dcache_bsize       = 32,
1161         .machine_check      = machine_check_generic,
1162         .platform       = "ppc603",
1163     },
1164 #endif /* CONFIG_PPC_BOOK3S_604 */
1165 #endif /* CONFIG_PPC_BOOK3S_32 */
1166 #ifdef CONFIG_PPC_8xx
1167     {   /* 8xx */
1168         .pvr_mask       = 0xffff0000,
1169         .pvr_value      = PVR_8xx,
1170         .cpu_name       = "8xx",
1171         /* CPU_FTR_MAYBE_CAN_DOZE is possible,
1172          * if the 8xx code is there.... */
1173         .cpu_features       = CPU_FTRS_8XX,
1174         .cpu_user_features  = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
1175         .mmu_features       = MMU_FTR_TYPE_8xx,
1176         .icache_bsize       = 16,
1177         .dcache_bsize       = 16,
1178         .machine_check      = machine_check_8xx,
1179         .platform       = "ppc823",
1180     },
1181 #endif /* CONFIG_PPC_8xx */
1182 #ifdef CONFIG_40x
1183     {   /* STB 04xxx */
1184         .pvr_mask       = 0xffff0000,
1185         .pvr_value      = 0x41810000,
1186         .cpu_name       = "STB04xxx",
1187         .cpu_features       = CPU_FTRS_40X,
1188         .cpu_user_features  = PPC_FEATURE_32 |
1189             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1190         .mmu_features       = MMU_FTR_TYPE_40x,
1191         .icache_bsize       = 32,
1192         .dcache_bsize       = 32,
1193         .machine_check      = machine_check_4xx,
1194         .platform       = "ppc405",
1195     },
1196     {   /* NP405L */
1197         .pvr_mask       = 0xffff0000,
1198         .pvr_value      = 0x41610000,
1199         .cpu_name       = "NP405L",
1200         .cpu_features       = CPU_FTRS_40X,
1201         .cpu_user_features  = PPC_FEATURE_32 |
1202             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1203         .mmu_features       = MMU_FTR_TYPE_40x,
1204         .icache_bsize       = 32,
1205         .dcache_bsize       = 32,
1206         .machine_check      = machine_check_4xx,
1207         .platform       = "ppc405",
1208     },
1209     {   /* NP4GS3 */
1210         .pvr_mask       = 0xffff0000,
1211         .pvr_value      = 0x40B10000,
1212         .cpu_name       = "NP4GS3",
1213         .cpu_features       = CPU_FTRS_40X,
1214         .cpu_user_features  = PPC_FEATURE_32 |
1215             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1216         .mmu_features       = MMU_FTR_TYPE_40x,
1217         .icache_bsize       = 32,
1218         .dcache_bsize       = 32,
1219         .machine_check      = machine_check_4xx,
1220         .platform       = "ppc405",
1221     },
1222     {   /* NP405H */
1223         .pvr_mask       = 0xffff0000,
1224         .pvr_value      = 0x41410000,
1225         .cpu_name       = "NP405H",
1226         .cpu_features       = CPU_FTRS_40X,
1227         .cpu_user_features  = PPC_FEATURE_32 |
1228             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1229         .mmu_features       = MMU_FTR_TYPE_40x,
1230         .icache_bsize       = 32,
1231         .dcache_bsize       = 32,
1232         .machine_check      = machine_check_4xx,
1233         .platform       = "ppc405",
1234     },
1235     {   /* 405GPr */
1236         .pvr_mask       = 0xffff0000,
1237         .pvr_value      = 0x50910000,
1238         .cpu_name       = "405GPr",
1239         .cpu_features       = CPU_FTRS_40X,
1240         .cpu_user_features  = PPC_FEATURE_32 |
1241             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1242         .mmu_features       = MMU_FTR_TYPE_40x,
1243         .icache_bsize       = 32,
1244         .dcache_bsize       = 32,
1245         .machine_check      = machine_check_4xx,
1246         .platform       = "ppc405",
1247     },
1248     {   /* STBx25xx */
1249         .pvr_mask       = 0xffff0000,
1250         .pvr_value      = 0x51510000,
1251         .cpu_name       = "STBx25xx",
1252         .cpu_features       = CPU_FTRS_40X,
1253         .cpu_user_features  = PPC_FEATURE_32 |
1254             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1255         .mmu_features       = MMU_FTR_TYPE_40x,
1256         .icache_bsize       = 32,
1257         .dcache_bsize       = 32,
1258         .machine_check      = machine_check_4xx,
1259         .platform       = "ppc405",
1260     },
1261     {   /* 405LP */
1262         .pvr_mask       = 0xffff0000,
1263         .pvr_value      = 0x41F10000,
1264         .cpu_name       = "405LP",
1265         .cpu_features       = CPU_FTRS_40X,
1266         .cpu_user_features  = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
1267         .mmu_features       = MMU_FTR_TYPE_40x,
1268         .icache_bsize       = 32,
1269         .dcache_bsize       = 32,
1270         .machine_check      = machine_check_4xx,
1271         .platform       = "ppc405",
1272     },
1273     {   /* 405EP */
1274         .pvr_mask       = 0xffff0000,
1275         .pvr_value      = 0x51210000,
1276         .cpu_name       = "405EP",
1277         .cpu_features       = CPU_FTRS_40X,
1278         .cpu_user_features  = PPC_FEATURE_32 |
1279             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1280         .mmu_features       = MMU_FTR_TYPE_40x,
1281         .icache_bsize       = 32,
1282         .dcache_bsize       = 32,
1283         .machine_check      = machine_check_4xx,
1284         .platform       = "ppc405",
1285     },
1286     {   /* 405EX Rev. A/B with Security */
1287         .pvr_mask       = 0xffff000f,
1288         .pvr_value      = 0x12910007,
1289         .cpu_name       = "405EX Rev. A/B",
1290         .cpu_features       = CPU_FTRS_40X,
1291         .cpu_user_features  = PPC_FEATURE_32 |
1292             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1293         .mmu_features       = MMU_FTR_TYPE_40x,
1294         .icache_bsize       = 32,
1295         .dcache_bsize       = 32,
1296         .machine_check      = machine_check_4xx,
1297         .platform       = "ppc405",
1298     },
1299     {   /* 405EX Rev. C without Security */
1300         .pvr_mask       = 0xffff000f,
1301         .pvr_value      = 0x1291000d,
1302         .cpu_name       = "405EX Rev. C",
1303         .cpu_features       = CPU_FTRS_40X,
1304         .cpu_user_features  = PPC_FEATURE_32 |
1305             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1306         .mmu_features       = MMU_FTR_TYPE_40x,
1307         .icache_bsize       = 32,
1308         .dcache_bsize       = 32,
1309         .machine_check      = machine_check_4xx,
1310         .platform       = "ppc405",
1311     },
1312     {   /* 405EX Rev. C with Security */
1313         .pvr_mask       = 0xffff000f,
1314         .pvr_value      = 0x1291000f,
1315         .cpu_name       = "405EX Rev. C",
1316         .cpu_features       = CPU_FTRS_40X,
1317         .cpu_user_features  = PPC_FEATURE_32 |
1318             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1319         .mmu_features       = MMU_FTR_TYPE_40x,
1320         .icache_bsize       = 32,
1321         .dcache_bsize       = 32,
1322         .machine_check      = machine_check_4xx,
1323         .platform       = "ppc405",
1324     },
1325     {   /* 405EX Rev. D without Security */
1326         .pvr_mask       = 0xffff000f,
1327         .pvr_value      = 0x12910003,
1328         .cpu_name       = "405EX Rev. D",
1329         .cpu_features       = CPU_FTRS_40X,
1330         .cpu_user_features  = PPC_FEATURE_32 |
1331             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1332         .mmu_features       = MMU_FTR_TYPE_40x,
1333         .icache_bsize       = 32,
1334         .dcache_bsize       = 32,
1335         .machine_check      = machine_check_4xx,
1336         .platform       = "ppc405",
1337     },
1338     {   /* 405EX Rev. D with Security */
1339         .pvr_mask       = 0xffff000f,
1340         .pvr_value      = 0x12910005,
1341         .cpu_name       = "405EX Rev. D",
1342         .cpu_features       = CPU_FTRS_40X,
1343         .cpu_user_features  = PPC_FEATURE_32 |
1344             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1345         .mmu_features       = MMU_FTR_TYPE_40x,
1346         .icache_bsize       = 32,
1347         .dcache_bsize       = 32,
1348         .machine_check      = machine_check_4xx,
1349         .platform       = "ppc405",
1350     },
1351     {   /* 405EXr Rev. A/B without Security */
1352         .pvr_mask       = 0xffff000f,
1353         .pvr_value      = 0x12910001,
1354         .cpu_name       = "405EXr Rev. A/B",
1355         .cpu_features       = CPU_FTRS_40X,
1356         .cpu_user_features  = PPC_FEATURE_32 |
1357             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1358         .mmu_features       = MMU_FTR_TYPE_40x,
1359         .icache_bsize       = 32,
1360         .dcache_bsize       = 32,
1361         .machine_check      = machine_check_4xx,
1362         .platform       = "ppc405",
1363     },
1364     {   /* 405EXr Rev. C without Security */
1365         .pvr_mask       = 0xffff000f,
1366         .pvr_value      = 0x12910009,
1367         .cpu_name       = "405EXr Rev. C",
1368         .cpu_features       = CPU_FTRS_40X,
1369         .cpu_user_features  = PPC_FEATURE_32 |
1370             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1371         .mmu_features       = MMU_FTR_TYPE_40x,
1372         .icache_bsize       = 32,
1373         .dcache_bsize       = 32,
1374         .machine_check      = machine_check_4xx,
1375         .platform       = "ppc405",
1376     },
1377     {   /* 405EXr Rev. C with Security */
1378         .pvr_mask       = 0xffff000f,
1379         .pvr_value      = 0x1291000b,
1380         .cpu_name       = "405EXr Rev. C",
1381         .cpu_features       = CPU_FTRS_40X,
1382         .cpu_user_features  = PPC_FEATURE_32 |
1383             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1384         .mmu_features       = MMU_FTR_TYPE_40x,
1385         .icache_bsize       = 32,
1386         .dcache_bsize       = 32,
1387         .machine_check      = machine_check_4xx,
1388         .platform       = "ppc405",
1389     },
1390     {   /* 405EXr Rev. D without Security */
1391         .pvr_mask       = 0xffff000f,
1392         .pvr_value      = 0x12910000,
1393         .cpu_name       = "405EXr Rev. D",
1394         .cpu_features       = CPU_FTRS_40X,
1395         .cpu_user_features  = PPC_FEATURE_32 |
1396             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1397         .mmu_features       = MMU_FTR_TYPE_40x,
1398         .icache_bsize       = 32,
1399         .dcache_bsize       = 32,
1400         .machine_check      = machine_check_4xx,
1401         .platform       = "ppc405",
1402     },
1403     {   /* 405EXr Rev. D with Security */
1404         .pvr_mask       = 0xffff000f,
1405         .pvr_value      = 0x12910002,
1406         .cpu_name       = "405EXr Rev. D",
1407         .cpu_features       = CPU_FTRS_40X,
1408         .cpu_user_features  = PPC_FEATURE_32 |
1409             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1410         .mmu_features       = MMU_FTR_TYPE_40x,
1411         .icache_bsize       = 32,
1412         .dcache_bsize       = 32,
1413         .machine_check      = machine_check_4xx,
1414         .platform       = "ppc405",
1415     },
1416     {
1417         /* 405EZ */
1418         .pvr_mask       = 0xffff0000,
1419         .pvr_value      = 0x41510000,
1420         .cpu_name       = "405EZ",
1421         .cpu_features       = CPU_FTRS_40X,
1422         .cpu_user_features  = PPC_FEATURE_32 |
1423             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1424         .mmu_features       = MMU_FTR_TYPE_40x,
1425         .icache_bsize       = 32,
1426         .dcache_bsize       = 32,
1427         .machine_check      = machine_check_4xx,
1428         .platform       = "ppc405",
1429     },
1430     {   /* APM8018X */
1431         .pvr_mask       = 0xffff0000,
1432         .pvr_value      = 0x7ff11432,
1433         .cpu_name       = "APM8018X",
1434         .cpu_features       = CPU_FTRS_40X,
1435         .cpu_user_features  = PPC_FEATURE_32 |
1436             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1437         .mmu_features       = MMU_FTR_TYPE_40x,
1438         .icache_bsize       = 32,
1439         .dcache_bsize       = 32,
1440         .machine_check      = machine_check_4xx,
1441         .platform       = "ppc405",
1442     },
1443     {   /* default match */
1444         .pvr_mask       = 0x00000000,
1445         .pvr_value      = 0x00000000,
1446         .cpu_name       = "(generic 40x PPC)",
1447         .cpu_features       = CPU_FTRS_40X,
1448         .cpu_user_features  = PPC_FEATURE_32 |
1449             PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1450         .mmu_features       = MMU_FTR_TYPE_40x,
1451         .icache_bsize       = 32,
1452         .dcache_bsize       = 32,
1453         .machine_check      = machine_check_4xx,
1454         .platform       = "ppc405",
1455     }
1456 
1457 #endif /* CONFIG_40x */
1458 #ifdef CONFIG_44x
1459 #ifndef CONFIG_PPC_47x
1460     {
1461         .pvr_mask       = 0xf0000fff,
1462         .pvr_value      = 0x40000850,
1463         .cpu_name       = "440GR Rev. A",
1464         .cpu_features       = CPU_FTRS_44X,
1465         .cpu_user_features  = COMMON_USER_BOOKE,
1466         .mmu_features       = MMU_FTR_TYPE_44x,
1467         .icache_bsize       = 32,
1468         .dcache_bsize       = 32,
1469         .machine_check      = machine_check_4xx,
1470         .platform       = "ppc440",
1471     },
1472     { /* Use logical PVR for 440EP (logical pvr = pvr | 0x8) */
1473         .pvr_mask       = 0xf0000fff,
1474         .pvr_value      = 0x40000858,
1475         .cpu_name       = "440EP Rev. A",
1476         .cpu_features       = CPU_FTRS_44X,
1477         .cpu_user_features  = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1478         .mmu_features       = MMU_FTR_TYPE_44x,
1479         .icache_bsize       = 32,
1480         .dcache_bsize       = 32,
1481         .cpu_setup      = __setup_cpu_440ep,
1482         .machine_check      = machine_check_4xx,
1483         .platform       = "ppc440",
1484     },
1485     {
1486         .pvr_mask       = 0xf0000fff,
1487         .pvr_value      = 0x400008d3,
1488         .cpu_name       = "440GR Rev. B",
1489         .cpu_features       = CPU_FTRS_44X,
1490         .cpu_user_features  = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1491         .mmu_features       = MMU_FTR_TYPE_44x,
1492         .icache_bsize       = 32,
1493         .dcache_bsize       = 32,
1494         .machine_check      = machine_check_4xx,
1495         .platform       = "ppc440",
1496     },
1497     { /* Matches both physical and logical PVR for 440EP (logical pvr = pvr | 0x8) */
1498         .pvr_mask       = 0xf0000ff7,
1499         .pvr_value      = 0x400008d4,
1500         .cpu_name       = "440EP Rev. C",
1501         .cpu_features       = CPU_FTRS_44X,
1502         .cpu_user_features  = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1503         .mmu_features       = MMU_FTR_TYPE_44x,
1504         .icache_bsize       = 32,
1505         .dcache_bsize       = 32,
1506         .cpu_setup      = __setup_cpu_440ep,
1507         .machine_check      = machine_check_4xx,
1508         .platform       = "ppc440",
1509     },
1510     { /* Use logical PVR for 440EP (logical pvr = pvr | 0x8) */
1511         .pvr_mask       = 0xf0000fff,
1512         .pvr_value      = 0x400008db,
1513         .cpu_name       = "440EP Rev. B",
1514         .cpu_features       = CPU_FTRS_44X,
1515         .cpu_user_features  = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1516         .mmu_features       = MMU_FTR_TYPE_44x,
1517         .icache_bsize       = 32,
1518         .dcache_bsize       = 32,
1519         .cpu_setup      = __setup_cpu_440ep,
1520         .machine_check      = machine_check_4xx,
1521         .platform       = "ppc440",
1522     },
1523     { /* 440GRX */
1524         .pvr_mask       = 0xf0000ffb,
1525         .pvr_value      = 0x200008D0,
1526         .cpu_name       = "440GRX",
1527         .cpu_features       = CPU_FTRS_44X,
1528         .cpu_user_features  = COMMON_USER_BOOKE,
1529         .mmu_features       = MMU_FTR_TYPE_44x,
1530         .icache_bsize       = 32,
1531         .dcache_bsize       = 32,
1532         .cpu_setup      = __setup_cpu_440grx,
1533         .machine_check      = machine_check_440A,
1534         .platform       = "ppc440",
1535     },
1536     { /* Use logical PVR for 440EPx (logical pvr = pvr | 0x8) */
1537         .pvr_mask       = 0xf0000ffb,
1538         .pvr_value      = 0x200008D8,
1539         .cpu_name       = "440EPX",
1540         .cpu_features       = CPU_FTRS_44X,
1541         .cpu_user_features  = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1542         .mmu_features       = MMU_FTR_TYPE_44x,
1543         .icache_bsize       = 32,
1544         .dcache_bsize       = 32,
1545         .cpu_setup      = __setup_cpu_440epx,
1546         .machine_check      = machine_check_440A,
1547         .platform       = "ppc440",
1548     },
1549     {   /* 440GP Rev. B */
1550         .pvr_mask       = 0xf0000fff,
1551         .pvr_value      = 0x40000440,
1552         .cpu_name       = "440GP Rev. B",
1553         .cpu_features       = CPU_FTRS_44X,
1554         .cpu_user_features  = COMMON_USER_BOOKE,
1555         .mmu_features       = MMU_FTR_TYPE_44x,
1556         .icache_bsize       = 32,
1557         .dcache_bsize       = 32,
1558         .machine_check      = machine_check_4xx,
1559         .platform       = "ppc440gp",
1560     },
1561     {   /* 440GP Rev. C */
1562         .pvr_mask       = 0xf0000fff,
1563         .pvr_value      = 0x40000481,
1564         .cpu_name       = "440GP Rev. C",
1565         .cpu_features       = CPU_FTRS_44X,
1566         .cpu_user_features  = COMMON_USER_BOOKE,
1567         .mmu_features       = MMU_FTR_TYPE_44x,
1568         .icache_bsize       = 32,
1569         .dcache_bsize       = 32,
1570         .machine_check      = machine_check_4xx,
1571         .platform       = "ppc440gp",
1572     },
1573     { /* 440GX Rev. A */
1574         .pvr_mask       = 0xf0000fff,
1575         .pvr_value      = 0x50000850,
1576         .cpu_name       = "440GX Rev. A",
1577         .cpu_features       = CPU_FTRS_44X,
1578         .cpu_user_features  = COMMON_USER_BOOKE,
1579         .mmu_features       = MMU_FTR_TYPE_44x,
1580         .icache_bsize       = 32,
1581         .dcache_bsize       = 32,
1582         .cpu_setup      = __setup_cpu_440gx,
1583         .machine_check      = machine_check_440A,
1584         .platform       = "ppc440",
1585     },
1586     { /* 440GX Rev. B */
1587         .pvr_mask       = 0xf0000fff,
1588         .pvr_value      = 0x50000851,
1589         .cpu_name       = "440GX Rev. B",
1590         .cpu_features       = CPU_FTRS_44X,
1591         .cpu_user_features  = COMMON_USER_BOOKE,
1592         .mmu_features       = MMU_FTR_TYPE_44x,
1593         .icache_bsize       = 32,
1594         .dcache_bsize       = 32,
1595         .cpu_setup      = __setup_cpu_440gx,
1596         .machine_check      = machine_check_440A,
1597         .platform       = "ppc440",
1598     },
1599     { /* 440GX Rev. C */
1600         .pvr_mask       = 0xf0000fff,
1601         .pvr_value      = 0x50000892,
1602         .cpu_name       = "440GX Rev. C",
1603         .cpu_features       = CPU_FTRS_44X,
1604         .cpu_user_features  = COMMON_USER_BOOKE,
1605         .mmu_features       = MMU_FTR_TYPE_44x,
1606         .icache_bsize       = 32,
1607         .dcache_bsize       = 32,
1608         .cpu_setup      = __setup_cpu_440gx,
1609         .machine_check      = machine_check_440A,
1610         .platform       = "ppc440",
1611     },
1612     { /* 440GX Rev. F */
1613         .pvr_mask       = 0xf0000fff,
1614         .pvr_value      = 0x50000894,
1615         .cpu_name       = "440GX Rev. F",
1616         .cpu_features       = CPU_FTRS_44X,
1617         .cpu_user_features  = COMMON_USER_BOOKE,
1618         .mmu_features       = MMU_FTR_TYPE_44x,
1619         .icache_bsize       = 32,
1620         .dcache_bsize       = 32,
1621         .cpu_setup      = __setup_cpu_440gx,
1622         .machine_check      = machine_check_440A,
1623         .platform       = "ppc440",
1624     },
1625     { /* 440SP Rev. A */
1626         .pvr_mask       = 0xfff00fff,
1627         .pvr_value      = 0x53200891,
1628         .cpu_name       = "440SP Rev. A",
1629         .cpu_features       = CPU_FTRS_44X,
1630         .cpu_user_features  = COMMON_USER_BOOKE,
1631         .mmu_features       = MMU_FTR_TYPE_44x,
1632         .icache_bsize       = 32,
1633         .dcache_bsize       = 32,
1634         .machine_check      = machine_check_4xx,
1635         .platform       = "ppc440",
1636     },
1637     { /* 440SPe Rev. A */
1638         .pvr_mask               = 0xfff00fff,
1639         .pvr_value              = 0x53400890,
1640         .cpu_name               = "440SPe Rev. A",
1641         .cpu_features       = CPU_FTRS_44X,
1642         .cpu_user_features      = COMMON_USER_BOOKE,
1643         .mmu_features       = MMU_FTR_TYPE_44x,
1644         .icache_bsize           = 32,
1645         .dcache_bsize           = 32,
1646         .cpu_setup      = __setup_cpu_440spe,
1647         .machine_check      = machine_check_440A,
1648         .platform               = "ppc440",
1649     },
1650     { /* 440SPe Rev. B */
1651         .pvr_mask       = 0xfff00fff,
1652         .pvr_value      = 0x53400891,
1653         .cpu_name       = "440SPe Rev. B",
1654         .cpu_features       = CPU_FTRS_44X,
1655         .cpu_user_features  = COMMON_USER_BOOKE,
1656         .mmu_features       = MMU_FTR_TYPE_44x,
1657         .icache_bsize       = 32,
1658         .dcache_bsize       = 32,
1659         .cpu_setup      = __setup_cpu_440spe,
1660         .machine_check      = machine_check_440A,
1661         .platform       = "ppc440",
1662     },
1663     { /* 460EX */
1664         .pvr_mask       = 0xffff0006,
1665         .pvr_value      = 0x13020002,
1666         .cpu_name       = "460EX",
1667         .cpu_features       = CPU_FTRS_440x6,
1668         .cpu_user_features  = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1669         .mmu_features       = MMU_FTR_TYPE_44x,
1670         .icache_bsize       = 32,
1671         .dcache_bsize       = 32,
1672         .cpu_setup      = __setup_cpu_460ex,
1673         .machine_check      = machine_check_440A,
1674         .platform       = "ppc440",
1675     },
1676     { /* 460EX Rev B */
1677         .pvr_mask       = 0xffff0007,
1678         .pvr_value      = 0x13020004,
1679         .cpu_name       = "460EX Rev. B",
1680         .cpu_features       = CPU_FTRS_440x6,
1681         .cpu_user_features  = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1682         .mmu_features       = MMU_FTR_TYPE_44x,
1683         .icache_bsize       = 32,
1684         .dcache_bsize       = 32,
1685         .cpu_setup      = __setup_cpu_460ex,
1686         .machine_check      = machine_check_440A,
1687         .platform       = "ppc440",
1688     },
1689     { /* 460GT */
1690         .pvr_mask       = 0xffff0006,
1691         .pvr_value      = 0x13020000,
1692         .cpu_name       = "460GT",
1693         .cpu_features       = CPU_FTRS_440x6,
1694         .cpu_user_features  = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1695         .mmu_features       = MMU_FTR_TYPE_44x,
1696         .icache_bsize       = 32,
1697         .dcache_bsize       = 32,
1698         .cpu_setup      = __setup_cpu_460gt,
1699         .machine_check      = machine_check_440A,
1700         .platform       = "ppc440",
1701     },
1702     { /* 460GT Rev B */
1703         .pvr_mask       = 0xffff0007,
1704         .pvr_value      = 0x13020005,
1705         .cpu_name       = "460GT Rev. B",
1706         .cpu_features       = CPU_FTRS_440x6,
1707         .cpu_user_features  = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1708         .mmu_features       = MMU_FTR_TYPE_44x,
1709         .icache_bsize       = 32,
1710         .dcache_bsize       = 32,
1711         .cpu_setup      = __setup_cpu_460gt,
1712         .machine_check      = machine_check_440A,
1713         .platform       = "ppc440",
1714     },
1715     { /* 460SX */
1716         .pvr_mask       = 0xffffff00,
1717         .pvr_value      = 0x13541800,
1718         .cpu_name       = "460SX",
1719         .cpu_features       = CPU_FTRS_44X,
1720         .cpu_user_features  = COMMON_USER_BOOKE,
1721         .mmu_features       = MMU_FTR_TYPE_44x,
1722         .icache_bsize       = 32,
1723         .dcache_bsize       = 32,
1724         .cpu_setup      = __setup_cpu_460sx,
1725         .machine_check      = machine_check_440A,
1726         .platform       = "ppc440",
1727     },
1728     { /* 464 in APM821xx */
1729         .pvr_mask       = 0xfffffff0,
1730         .pvr_value      = 0x12C41C80,
1731         .cpu_name       = "APM821XX",
1732         .cpu_features       = CPU_FTRS_44X,
1733         .cpu_user_features  = COMMON_USER_BOOKE |
1734             PPC_FEATURE_HAS_FPU,
1735         .mmu_features       = MMU_FTR_TYPE_44x,
1736         .icache_bsize       = 32,
1737         .dcache_bsize       = 32,
1738         .cpu_setup      = __setup_cpu_apm821xx,
1739         .machine_check      = machine_check_440A,
1740         .platform       = "ppc440",
1741     },
1742     {   /* default match */
1743         .pvr_mask       = 0x00000000,
1744         .pvr_value      = 0x00000000,
1745         .cpu_name       = "(generic 44x PPC)",
1746         .cpu_features       = CPU_FTRS_44X,
1747         .cpu_user_features  = COMMON_USER_BOOKE,
1748         .mmu_features       = MMU_FTR_TYPE_44x,
1749         .icache_bsize       = 32,
1750         .dcache_bsize       = 32,
1751         .machine_check      = machine_check_4xx,
1752         .platform       = "ppc440",
1753     }
1754 #else /* CONFIG_PPC_47x */
1755     { /* 476 DD2 core */
1756         .pvr_mask       = 0xffffffff,
1757         .pvr_value      = 0x11a52080,
1758         .cpu_name       = "476",
1759         .cpu_features       = CPU_FTRS_47X | CPU_FTR_476_DD2,
1760         .cpu_user_features  = COMMON_USER_BOOKE |
1761             PPC_FEATURE_HAS_FPU,
1762         .mmu_features       = MMU_FTR_TYPE_47x |
1763             MMU_FTR_USE_TLBIVAX_BCAST | MMU_FTR_LOCK_BCAST_INVAL,
1764         .icache_bsize       = 32,
1765         .dcache_bsize       = 128,
1766         .machine_check      = machine_check_47x,
1767         .platform       = "ppc470",
1768     },
1769     { /* 476fpe */
1770         .pvr_mask       = 0xffff0000,
1771         .pvr_value      = 0x7ff50000,
1772         .cpu_name       = "476fpe",
1773         .cpu_features       = CPU_FTRS_47X | CPU_FTR_476_DD2,
1774         .cpu_user_features  = COMMON_USER_BOOKE |
1775             PPC_FEATURE_HAS_FPU,
1776         .mmu_features       = MMU_FTR_TYPE_47x |
1777             MMU_FTR_USE_TLBIVAX_BCAST | MMU_FTR_LOCK_BCAST_INVAL,
1778         .icache_bsize       = 32,
1779         .dcache_bsize       = 128,
1780         .machine_check      = machine_check_47x,
1781         .platform       = "ppc470",
1782     },
1783     { /* 476 iss */
1784         .pvr_mask       = 0xffff0000,
1785         .pvr_value      = 0x00050000,
1786         .cpu_name       = "476",
1787         .cpu_features       = CPU_FTRS_47X,
1788         .cpu_user_features  = COMMON_USER_BOOKE |
1789             PPC_FEATURE_HAS_FPU,
1790         .mmu_features       = MMU_FTR_TYPE_47x |
1791             MMU_FTR_USE_TLBIVAX_BCAST | MMU_FTR_LOCK_BCAST_INVAL,
1792         .icache_bsize       = 32,
1793         .dcache_bsize       = 128,
1794         .machine_check      = machine_check_47x,
1795         .platform       = "ppc470",
1796     },
1797     { /* 476 others */
1798         .pvr_mask       = 0xffff0000,
1799         .pvr_value      = 0x11a50000,
1800         .cpu_name       = "476",
1801         .cpu_features       = CPU_FTRS_47X,
1802         .cpu_user_features  = COMMON_USER_BOOKE |
1803             PPC_FEATURE_HAS_FPU,
1804         .mmu_features       = MMU_FTR_TYPE_47x |
1805             MMU_FTR_USE_TLBIVAX_BCAST | MMU_FTR_LOCK_BCAST_INVAL,
1806         .icache_bsize       = 32,
1807         .dcache_bsize       = 128,
1808         .machine_check      = machine_check_47x,
1809         .platform       = "ppc470",
1810     },
1811     {   /* default match */
1812         .pvr_mask       = 0x00000000,
1813         .pvr_value      = 0x00000000,
1814         .cpu_name       = "(generic 47x PPC)",
1815         .cpu_features       = CPU_FTRS_47X,
1816         .cpu_user_features  = COMMON_USER_BOOKE,
1817         .mmu_features       = MMU_FTR_TYPE_47x,
1818         .icache_bsize       = 32,
1819         .dcache_bsize       = 128,
1820         .machine_check      = machine_check_47x,
1821         .platform       = "ppc470",
1822     }
1823 #endif /* CONFIG_PPC_47x */
1824 #endif /* CONFIG_44x */
1825 #endif /* CONFIG_PPC32 */
1826 #ifdef CONFIG_E500
1827 #ifdef CONFIG_PPC32
1828 #ifndef CONFIG_PPC_E500MC
1829     {   /* e500 */
1830         .pvr_mask       = 0xffff0000,
1831         .pvr_value      = 0x80200000,
1832         .cpu_name       = "e500",
1833         .cpu_features       = CPU_FTRS_E500,
1834         .cpu_user_features  = COMMON_USER_BOOKE |
1835             PPC_FEATURE_HAS_SPE_COMP |
1836             PPC_FEATURE_HAS_EFP_SINGLE_COMP,
1837         .cpu_user_features2 = PPC_FEATURE2_ISEL,
1838         .mmu_features       = MMU_FTR_TYPE_FSL_E,
1839         .icache_bsize       = 32,
1840         .dcache_bsize       = 32,
1841         .num_pmcs       = 4,
1842         .cpu_setup      = __setup_cpu_e500v1,
1843         .machine_check      = machine_check_e500,
1844         .platform       = "ppc8540",
1845     },
1846     {   /* e500v2 */
1847         .pvr_mask       = 0xffff0000,
1848         .pvr_value      = 0x80210000,
1849         .cpu_name       = "e500v2",
1850         .cpu_features       = CPU_FTRS_E500_2,
1851         .cpu_user_features  = COMMON_USER_BOOKE |
1852             PPC_FEATURE_HAS_SPE_COMP |
1853             PPC_FEATURE_HAS_EFP_SINGLE_COMP |
1854             PPC_FEATURE_HAS_EFP_DOUBLE_COMP,
1855         .cpu_user_features2 = PPC_FEATURE2_ISEL,
1856         .mmu_features       = MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS,
1857         .icache_bsize       = 32,
1858         .dcache_bsize       = 32,
1859         .num_pmcs       = 4,
1860         .cpu_setup      = __setup_cpu_e500v2,
1861         .machine_check      = machine_check_e500,
1862         .platform       = "ppc8548",
1863         .cpu_down_flush     = cpu_down_flush_e500v2,
1864     },
1865 #else
1866     {   /* e500mc */
1867         .pvr_mask       = 0xffff0000,
1868         .pvr_value      = 0x80230000,
1869         .cpu_name       = "e500mc",
1870         .cpu_features       = CPU_FTRS_E500MC,
1871         .cpu_user_features  = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1872         .cpu_user_features2 = PPC_FEATURE2_ISEL,
1873         .mmu_features       = MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS |
1874             MMU_FTR_USE_TLBILX,
1875         .icache_bsize       = 64,
1876         .dcache_bsize       = 64,
1877         .num_pmcs       = 4,
1878         .cpu_setup      = __setup_cpu_e500mc,
1879         .machine_check      = machine_check_e500mc,
1880         .platform       = "ppce500mc",
1881         .cpu_down_flush     = cpu_down_flush_e500mc,
1882     },
1883 #endif /* CONFIG_PPC_E500MC */
1884 #endif /* CONFIG_PPC32 */
1885 #ifdef CONFIG_PPC_E500MC
1886     {   /* e5500 */
1887         .pvr_mask       = 0xffff0000,
1888         .pvr_value      = 0x80240000,
1889         .cpu_name       = "e5500",
1890         .cpu_features       = CPU_FTRS_E5500,
1891         .cpu_user_features  = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1892         .cpu_user_features2 = PPC_FEATURE2_ISEL,
1893         .mmu_features       = MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS |
1894             MMU_FTR_USE_TLBILX,
1895         .icache_bsize       = 64,
1896         .dcache_bsize       = 64,
1897         .num_pmcs       = 4,
1898         .cpu_setup      = __setup_cpu_e5500,
1899 #ifndef CONFIG_PPC32
1900         .cpu_restore        = __restore_cpu_e5500,
1901 #endif
1902         .machine_check      = machine_check_e500mc,
1903         .platform       = "ppce5500",
1904         .cpu_down_flush     = cpu_down_flush_e5500,
1905     },
1906     {   /* e6500 */
1907         .pvr_mask       = 0xffff0000,
1908         .pvr_value      = 0x80400000,
1909         .cpu_name       = "e6500",
1910         .cpu_features       = CPU_FTRS_E6500,
1911         .cpu_user_features  = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU |
1912             PPC_FEATURE_HAS_ALTIVEC_COMP,
1913         .cpu_user_features2 = PPC_FEATURE2_ISEL,
1914         .mmu_features       = MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS |
1915             MMU_FTR_USE_TLBILX,
1916         .icache_bsize       = 64,
1917         .dcache_bsize       = 64,
1918         .num_pmcs       = 6,
1919         .cpu_setup      = __setup_cpu_e6500,
1920 #ifndef CONFIG_PPC32
1921         .cpu_restore        = __restore_cpu_e6500,
1922 #endif
1923         .machine_check      = machine_check_e500mc,
1924         .platform       = "ppce6500",
1925         .cpu_down_flush     = cpu_down_flush_e6500,
1926     },
1927 #endif /* CONFIG_PPC_E500MC */
1928 #ifdef CONFIG_PPC32
1929     {   /* default match */
1930         .pvr_mask       = 0x00000000,
1931         .pvr_value      = 0x00000000,
1932         .cpu_name       = "(generic E500 PPC)",
1933         .cpu_features       = CPU_FTRS_E500,
1934         .cpu_user_features  = COMMON_USER_BOOKE |
1935             PPC_FEATURE_HAS_SPE_COMP |
1936             PPC_FEATURE_HAS_EFP_SINGLE_COMP,
1937         .mmu_features       = MMU_FTR_TYPE_FSL_E,
1938         .icache_bsize       = 32,
1939         .dcache_bsize       = 32,
1940         .machine_check      = machine_check_e500,
1941         .platform       = "powerpc",
1942     }
1943 #endif /* CONFIG_PPC32 */
1944 #endif /* CONFIG_E500 */
1945 };
1946 
1947 void __init set_cur_cpu_spec(struct cpu_spec *s)
1948 {
1949     struct cpu_spec *t = &the_cpu_spec;
1950 
1951     t = PTRRELOC(t);
1952     /*
1953      * use memcpy() instead of *t = *s so that GCC replaces it
1954      * by __memcpy() when KASAN is active
1955      */
1956     memcpy(t, s, sizeof(*t));
1957 
1958     *PTRRELOC(&cur_cpu_spec) = &the_cpu_spec;
1959 }
1960 
1961 static struct cpu_spec * __init setup_cpu_spec(unsigned long offset,
1962                            struct cpu_spec *s)
1963 {
1964     struct cpu_spec *t = &the_cpu_spec;
1965     struct cpu_spec old;
1966 
1967     t = PTRRELOC(t);
1968     old = *t;
1969 
1970     /*
1971      * Copy everything, then do fixups. Use memcpy() instead of *t = *s
1972      * so that GCC replaces it by __memcpy() when KASAN is active
1973      */
1974     memcpy(t, s, sizeof(*t));
1975 
1976     /*
1977      * If we are overriding a previous value derived from the real
1978      * PVR with a new value obtained using a logical PVR value,
1979      * don't modify the performance monitor fields.
1980      */
1981     if (old.num_pmcs && !s->num_pmcs) {
1982         t->num_pmcs = old.num_pmcs;
1983         t->pmc_type = old.pmc_type;
1984 
1985         /*
1986          * Let's ensure that the
1987          * fix for the PMAO bug is enabled on compatibility mode.
1988          */
1989         t->cpu_features |= old.cpu_features & CPU_FTR_PMAO_BUG;
1990     }
1991 
1992     *PTRRELOC(&cur_cpu_spec) = &the_cpu_spec;
1993 
1994     /*
1995      * Set the base platform string once; assumes
1996      * we're called with real pvr first.
1997      */
1998     if (*PTRRELOC(&powerpc_base_platform) == NULL)
1999         *PTRRELOC(&powerpc_base_platform) = t->platform;
2000 
2001 #if defined(CONFIG_PPC64) || defined(CONFIG_BOOKE)
2002     /* ppc64 and booke expect identify_cpu to also call setup_cpu for
2003      * that processor. I will consolidate that at a later time, for now,
2004      * just use #ifdef. We also don't need to PTRRELOC the function
2005      * pointer on ppc64 and booke as we are running at 0 in real mode
2006      * on ppc64 and reloc_offset is always 0 on booke.
2007      */
2008     if (t->cpu_setup) {
2009         t->cpu_setup(offset, t);
2010     }
2011 #endif /* CONFIG_PPC64 || CONFIG_BOOKE */
2012 
2013     return t;
2014 }
2015 
2016 struct cpu_spec * __init identify_cpu(unsigned long offset, unsigned int pvr)
2017 {
2018     struct cpu_spec *s = cpu_specs;
2019     int i;
2020 
2021     s = PTRRELOC(s);
2022 
2023     for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++) {
2024         if ((pvr & s->pvr_mask) == s->pvr_value)
2025             return setup_cpu_spec(offset, s);
2026     }
2027 
2028     BUG();
2029 
2030     return NULL;
2031 }
2032 
2033 /*
2034  * Used by cpufeatures to get the name for CPUs with a PVR table.
2035  * If they don't hae a PVR table, cpufeatures gets the name from
2036  * cpu device-tree node.
2037  */
2038 void __init identify_cpu_name(unsigned int pvr)
2039 {
2040     struct cpu_spec *s = cpu_specs;
2041     struct cpu_spec *t = &the_cpu_spec;
2042     int i;
2043 
2044     s = PTRRELOC(s);
2045     t = PTRRELOC(t);
2046 
2047     for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++) {
2048         if ((pvr & s->pvr_mask) == s->pvr_value) {
2049             t->cpu_name = s->cpu_name;
2050             return;
2051         }
2052     }
2053 }
2054 
2055 
2056 #ifdef CONFIG_JUMP_LABEL_FEATURE_CHECKS
2057 struct static_key_true cpu_feature_keys[NUM_CPU_FTR_KEYS] = {
2058             [0 ... NUM_CPU_FTR_KEYS - 1] = STATIC_KEY_TRUE_INIT
2059 };
2060 EXPORT_SYMBOL_GPL(cpu_feature_keys);
2061 
2062 void __init cpu_feature_keys_init(void)
2063 {
2064     int i;
2065 
2066     for (i = 0; i < NUM_CPU_FTR_KEYS; i++) {
2067         unsigned long f = 1ul << i;
2068 
2069         if (!(cur_cpu_spec->cpu_features & f))
2070             static_branch_disable(&cpu_feature_keys[i]);
2071     }
2072 }
2073 
2074 struct static_key_true mmu_feature_keys[NUM_MMU_FTR_KEYS] = {
2075             [0 ... NUM_MMU_FTR_KEYS - 1] = STATIC_KEY_TRUE_INIT
2076 };
2077 EXPORT_SYMBOL(mmu_feature_keys);
2078 
2079 void __init mmu_feature_keys_init(void)
2080 {
2081     int i;
2082 
2083     for (i = 0; i < NUM_MMU_FTR_KEYS; i++) {
2084         unsigned long f = 1ul << i;
2085 
2086         if (!(cur_cpu_spec->mmu_features & f))
2087             static_branch_disable(&mmu_feature_keys[i]);
2088     }
2089 }
2090 #endif