Linux Audio

Check our new training course

Loading...
v6.2
  1// SPDX-License-Identifier: GPL-2.0-or-later
  2/*
  3 *  Copyright (C) 2001 Ben. Herrenschmidt (benh@kernel.crashing.org)
  4 *
  5 *  Modifications for ppc64:
  6 *      Copyright (C) 2003 Dave Engebretsen <engebret@us.ibm.com>
 
 
 
 
 
  7 */
  8
  9#include <linux/string.h>
 10#include <linux/sched.h>
 11#include <linux/threads.h>
 12#include <linux/init.h>
 13#include <linux/export.h>
 14#include <linux/jump_label.h>
 15#include <linux/of.h>
 16
 
 17#include <asm/cputable.h>
 18#include <asm/mce.h>
 19#include <asm/mmu.h>
 20#include <asm/setup.h>
 21#include <asm/cpu_setup.h>
 22
 23static struct cpu_spec the_cpu_spec __read_mostly;
 24
 25struct cpu_spec* cur_cpu_spec __read_mostly = NULL;
 26EXPORT_SYMBOL(cur_cpu_spec);
 27
 28/* The platform string corresponding to the real PVR */
 29const char *powerpc_base_platform;
 30
 31#include "cpu_specs.h"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 32
 33void __init set_cur_cpu_spec(struct cpu_spec *s)
 34{
 35	struct cpu_spec *t = &the_cpu_spec;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 36
 37	t = PTRRELOC(t);
 38	/*
 39	 * use memcpy() instead of *t = *s so that GCC replaces it
 40	 * by __memcpy() when KASAN is active
 41	 */
 42	memcpy(t, s, sizeof(*t));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 43
 44	*PTRRELOC(&cur_cpu_spec) = &the_cpu_spec;
 45}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 46
 47static struct cpu_spec * __init setup_cpu_spec(unsigned long offset,
 48					       struct cpu_spec *s)
 49{
 50	struct cpu_spec *t = &the_cpu_spec;
 51	struct cpu_spec old;
 52
 53	t = PTRRELOC(t);
 54	old = *t;
 55
 56	/*
 57	 * Copy everything, then do fixups. Use memcpy() instead of *t = *s
 58	 * so that GCC replaces it by __memcpy() when KASAN is active
 59	 */
 60	memcpy(t, s, sizeof(*t));
 61
 62	/*
 63	 * If we are overriding a previous value derived from the real
 64	 * PVR with a new value obtained using a logical PVR value,
 65	 * don't modify the performance monitor fields.
 66	 */
 67	if (old.num_pmcs && !s->num_pmcs) {
 68		t->num_pmcs = old.num_pmcs;
 69		t->pmc_type = old.pmc_type;
 
 
 
 
 70
 71		/*
 72		 * Let's ensure that the
 73		 * fix for the PMAO bug is enabled on compatibility mode.
 
 
 
 
 
 
 
 
 
 74		 */
 75		t->cpu_features |= old.cpu_features & CPU_FTR_PMAO_BUG;
 
 
 
 76	}
 77
 78	*PTRRELOC(&cur_cpu_spec) = &the_cpu_spec;
 79
 80	/*
 81	 * Set the base platform string once; assumes
 82	 * we're called with real pvr first.
 83	 */
 84	if (*PTRRELOC(&powerpc_base_platform) == NULL)
 85		*PTRRELOC(&powerpc_base_platform) = t->platform;
 86
 87#if defined(CONFIG_PPC64) || defined(CONFIG_BOOKE)
 88	/* ppc64 and booke expect identify_cpu to also call setup_cpu for
 89	 * that processor. I will consolidate that at a later time, for now,
 90	 * just use #ifdef. We also don't need to PTRRELOC the function
 91	 * pointer on ppc64 and booke as we are running at 0 in real mode
 92	 * on ppc64 and reloc_offset is always 0 on booke.
 93	 */
 94	if (t->cpu_setup) {
 95		t->cpu_setup(offset, t);
 96	}
 97#endif /* CONFIG_PPC64 || CONFIG_BOOKE */
 98
 99	return t;
100}
101
102struct cpu_spec * __init identify_cpu(unsigned long offset, unsigned int pvr)
103{
104	struct cpu_spec *s = cpu_specs;
105	int i;
106
107	BUILD_BUG_ON(!ARRAY_SIZE(cpu_specs));
108
109	s = PTRRELOC(s);
110
111	for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++) {
112		if ((pvr & s->pvr_mask) == s->pvr_value)
113			return setup_cpu_spec(offset, s);
114	}
115
116	BUG();
117
118	return NULL;
119}
120
121/*
122 * Used by cpufeatures to get the name for CPUs with a PVR table.
123 * If they don't hae a PVR table, cpufeatures gets the name from
124 * cpu device-tree node.
125 */
126void __init identify_cpu_name(unsigned int pvr)
127{
128	struct cpu_spec *s = cpu_specs;
129	struct cpu_spec *t = &the_cpu_spec;
130	int i;
131
132	s = PTRRELOC(s);
133	t = PTRRELOC(t);
134
135	for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++) {
136		if ((pvr & s->pvr_mask) == s->pvr_value) {
137			t->cpu_name = s->cpu_name;
138			return;
139		}
140	}
141}
142
143
144#ifdef CONFIG_JUMP_LABEL_FEATURE_CHECKS
145struct static_key_true cpu_feature_keys[NUM_CPU_FTR_KEYS] = {
146			[0 ... NUM_CPU_FTR_KEYS - 1] = STATIC_KEY_TRUE_INIT
147};
148EXPORT_SYMBOL_GPL(cpu_feature_keys);
149
150void __init cpu_feature_keys_init(void)
151{
152	int i;
153
154	for (i = 0; i < NUM_CPU_FTR_KEYS; i++) {
155		unsigned long f = 1ul << i;
156
157		if (!(cur_cpu_spec->cpu_features & f))
158			static_branch_disable(&cpu_feature_keys[i]);
159	}
160}
161
162struct static_key_true mmu_feature_keys[NUM_MMU_FTR_KEYS] = {
163			[0 ... NUM_MMU_FTR_KEYS - 1] = STATIC_KEY_TRUE_INIT
164};
165EXPORT_SYMBOL(mmu_feature_keys);
166
167void __init mmu_feature_keys_init(void)
168{
169	int i;
170
171	for (i = 0; i < NUM_MMU_FTR_KEYS; i++) {
172		unsigned long f = 1ul << i;
173
174		if (!(cur_cpu_spec->mmu_features & f))
175			static_branch_disable(&mmu_feature_keys[i]);
176	}
177}
178#endif
v3.1
 
   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#include <asm/mmu.h>
 
 
 
 
  23
  24struct cpu_spec* cur_cpu_spec = NULL;
  25EXPORT_SYMBOL(cur_cpu_spec);
  26
  27/* The platform string corresponding to the real PVR */
  28const char *powerpc_base_platform;
  29
  30/* NOTE:
  31 * Unlike ppc32, ppc64 will only call this once for the boot CPU, it's
  32 * the responsibility of the appropriate CPU save/restore functions to
  33 * eventually copy these settings over. Those save/restore aren't yet
  34 * part of the cputable though. That has to be fixed for both ppc32
  35 * and ppc64
  36 */
  37#ifdef CONFIG_PPC32
  38extern void __setup_cpu_e200(unsigned long offset, struct cpu_spec* spec);
  39extern void __setup_cpu_e500v1(unsigned long offset, struct cpu_spec* spec);
  40extern void __setup_cpu_e500v2(unsigned long offset, struct cpu_spec* spec);
  41extern void __setup_cpu_e500mc(unsigned long offset, struct cpu_spec* spec);
  42extern void __setup_cpu_440ep(unsigned long offset, struct cpu_spec* spec);
  43extern void __setup_cpu_440epx(unsigned long offset, struct cpu_spec* spec);
  44extern void __setup_cpu_440gx(unsigned long offset, struct cpu_spec* spec);
  45extern void __setup_cpu_440grx(unsigned long offset, struct cpu_spec* spec);
  46extern void __setup_cpu_440spe(unsigned long offset, struct cpu_spec* spec);
  47extern void __setup_cpu_440x5(unsigned long offset, struct cpu_spec* spec);
  48extern void __setup_cpu_460ex(unsigned long offset, struct cpu_spec* spec);
  49extern void __setup_cpu_460gt(unsigned long offset, struct cpu_spec* spec);
  50extern void __setup_cpu_460sx(unsigned long offset, struct cpu_spec *spec);
  51extern void __setup_cpu_apm821xx(unsigned long offset, struct cpu_spec *spec);
  52extern void __setup_cpu_603(unsigned long offset, struct cpu_spec* spec);
  53extern void __setup_cpu_604(unsigned long offset, struct cpu_spec* spec);
  54extern void __setup_cpu_750(unsigned long offset, struct cpu_spec* spec);
  55extern void __setup_cpu_750cx(unsigned long offset, struct cpu_spec* spec);
  56extern void __setup_cpu_750fx(unsigned long offset, struct cpu_spec* spec);
  57extern void __setup_cpu_7400(unsigned long offset, struct cpu_spec* spec);
  58extern void __setup_cpu_7410(unsigned long offset, struct cpu_spec* spec);
  59extern void __setup_cpu_745x(unsigned long offset, struct cpu_spec* spec);
  60#endif /* CONFIG_PPC32 */
  61#ifdef CONFIG_PPC64
  62extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec);
  63extern void __setup_cpu_ppc970MP(unsigned long offset, struct cpu_spec* spec);
  64extern void __setup_cpu_pa6t(unsigned long offset, struct cpu_spec* spec);
  65extern void __setup_cpu_a2(unsigned long offset, struct cpu_spec* spec);
  66extern void __restore_cpu_pa6t(void);
  67extern void __restore_cpu_ppc970(void);
  68extern void __setup_cpu_power7(unsigned long offset, struct cpu_spec* spec);
  69extern void __restore_cpu_power7(void);
  70extern void __restore_cpu_a2(void);
  71#endif /* CONFIG_PPC64 */
  72#if defined(CONFIG_E500)
  73extern void __setup_cpu_e5500(unsigned long offset, struct cpu_spec* spec);
  74extern void __restore_cpu_e5500(void);
  75#endif /* CONFIG_E500 */
  76
  77/* This table only contains "desktop" CPUs, it need to be filled with embedded
  78 * ones as well...
  79 */
  80#define COMMON_USER		(PPC_FEATURE_32 | PPC_FEATURE_HAS_FPU | \
  81				 PPC_FEATURE_HAS_MMU)
  82#define COMMON_USER_PPC64	(COMMON_USER | PPC_FEATURE_64)
  83#define COMMON_USER_POWER4	(COMMON_USER_PPC64 | PPC_FEATURE_POWER4)
  84#define COMMON_USER_POWER5	(COMMON_USER_PPC64 | PPC_FEATURE_POWER5 |\
  85				 PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP)
  86#define COMMON_USER_POWER5_PLUS	(COMMON_USER_PPC64 | PPC_FEATURE_POWER5_PLUS|\
  87				 PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP)
  88#define COMMON_USER_POWER6	(COMMON_USER_PPC64 | PPC_FEATURE_ARCH_2_05 |\
  89				 PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP | \
  90				 PPC_FEATURE_TRUE_LE | \
  91				 PPC_FEATURE_PSERIES_PERFMON_COMPAT)
  92#define COMMON_USER_POWER7	(COMMON_USER_PPC64 | PPC_FEATURE_ARCH_2_06 |\
  93				 PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP | \
  94				 PPC_FEATURE_TRUE_LE | \
  95				 PPC_FEATURE_PSERIES_PERFMON_COMPAT)
  96#define COMMON_USER_PA6T	(COMMON_USER_PPC64 | PPC_FEATURE_PA6T |\
  97				 PPC_FEATURE_TRUE_LE | \
  98				 PPC_FEATURE_HAS_ALTIVEC_COMP)
  99#ifdef CONFIG_PPC_BOOK3E_64
 100#define COMMON_USER_BOOKE	(COMMON_USER_PPC64 | PPC_FEATURE_BOOKE)
 101#else
 102#define COMMON_USER_BOOKE	(PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | \
 103				 PPC_FEATURE_BOOKE)
 104#endif
 105
 106static struct cpu_spec __initdata cpu_specs[] = {
 107#ifdef CONFIG_PPC_BOOK3S_64
 108	{	/* Power3 */
 109		.pvr_mask		= 0xffff0000,
 110		.pvr_value		= 0x00400000,
 111		.cpu_name		= "POWER3 (630)",
 112		.cpu_features		= CPU_FTRS_POWER3,
 113		.cpu_user_features	= COMMON_USER_PPC64|PPC_FEATURE_PPC_LE,
 114		.mmu_features		= MMU_FTR_HPTE_TABLE,
 115		.icache_bsize		= 128,
 116		.dcache_bsize		= 128,
 117		.num_pmcs		= 8,
 118		.pmc_type		= PPC_PMC_IBM,
 119		.oprofile_cpu_type	= "ppc64/power3",
 120		.oprofile_type		= PPC_OPROFILE_RS64,
 121		.platform		= "power3",
 122	},
 123	{	/* Power3+ */
 124		.pvr_mask		= 0xffff0000,
 125		.pvr_value		= 0x00410000,
 126		.cpu_name		= "POWER3 (630+)",
 127		.cpu_features		= CPU_FTRS_POWER3,
 128		.cpu_user_features	= COMMON_USER_PPC64|PPC_FEATURE_PPC_LE,
 129		.mmu_features		= MMU_FTR_HPTE_TABLE,
 130		.icache_bsize		= 128,
 131		.dcache_bsize		= 128,
 132		.num_pmcs		= 8,
 133		.pmc_type		= PPC_PMC_IBM,
 134		.oprofile_cpu_type	= "ppc64/power3",
 135		.oprofile_type		= PPC_OPROFILE_RS64,
 136		.platform		= "power3",
 137	},
 138	{	/* Northstar */
 139		.pvr_mask		= 0xffff0000,
 140		.pvr_value		= 0x00330000,
 141		.cpu_name		= "RS64-II (northstar)",
 142		.cpu_features		= CPU_FTRS_RS64,
 143		.cpu_user_features	= COMMON_USER_PPC64,
 144		.mmu_features		= MMU_FTR_HPTE_TABLE,
 145		.icache_bsize		= 128,
 146		.dcache_bsize		= 128,
 147		.num_pmcs		= 8,
 148		.pmc_type		= PPC_PMC_IBM,
 149		.oprofile_cpu_type	= "ppc64/rs64",
 150		.oprofile_type		= PPC_OPROFILE_RS64,
 151		.platform		= "rs64",
 152	},
 153	{	/* Pulsar */
 154		.pvr_mask		= 0xffff0000,
 155		.pvr_value		= 0x00340000,
 156		.cpu_name		= "RS64-III (pulsar)",
 157		.cpu_features		= CPU_FTRS_RS64,
 158		.cpu_user_features	= COMMON_USER_PPC64,
 159		.mmu_features		= MMU_FTR_HPTE_TABLE,
 160		.icache_bsize		= 128,
 161		.dcache_bsize		= 128,
 162		.num_pmcs		= 8,
 163		.pmc_type		= PPC_PMC_IBM,
 164		.oprofile_cpu_type	= "ppc64/rs64",
 165		.oprofile_type		= PPC_OPROFILE_RS64,
 166		.platform		= "rs64",
 167	},
 168	{	/* I-star */
 169		.pvr_mask		= 0xffff0000,
 170		.pvr_value		= 0x00360000,
 171		.cpu_name		= "RS64-III (icestar)",
 172		.cpu_features		= CPU_FTRS_RS64,
 173		.cpu_user_features	= COMMON_USER_PPC64,
 174		.mmu_features		= MMU_FTR_HPTE_TABLE,
 175		.icache_bsize		= 128,
 176		.dcache_bsize		= 128,
 177		.num_pmcs		= 8,
 178		.pmc_type		= PPC_PMC_IBM,
 179		.oprofile_cpu_type	= "ppc64/rs64",
 180		.oprofile_type		= PPC_OPROFILE_RS64,
 181		.platform		= "rs64",
 182	},
 183	{	/* S-star */
 184		.pvr_mask		= 0xffff0000,
 185		.pvr_value		= 0x00370000,
 186		.cpu_name		= "RS64-IV (sstar)",
 187		.cpu_features		= CPU_FTRS_RS64,
 188		.cpu_user_features	= COMMON_USER_PPC64,
 189		.mmu_features		= MMU_FTR_HPTE_TABLE,
 190		.icache_bsize		= 128,
 191		.dcache_bsize		= 128,
 192		.num_pmcs		= 8,
 193		.pmc_type		= PPC_PMC_IBM,
 194		.oprofile_cpu_type	= "ppc64/rs64",
 195		.oprofile_type		= PPC_OPROFILE_RS64,
 196		.platform		= "rs64",
 197	},
 198	{	/* Power4 */
 199		.pvr_mask		= 0xffff0000,
 200		.pvr_value		= 0x00350000,
 201		.cpu_name		= "POWER4 (gp)",
 202		.cpu_features		= CPU_FTRS_POWER4,
 203		.cpu_user_features	= COMMON_USER_POWER4,
 204		.mmu_features		= MMU_FTRS_POWER4,
 205		.icache_bsize		= 128,
 206		.dcache_bsize		= 128,
 207		.num_pmcs		= 8,
 208		.pmc_type		= PPC_PMC_IBM,
 209		.oprofile_cpu_type	= "ppc64/power4",
 210		.oprofile_type		= PPC_OPROFILE_POWER4,
 211		.platform		= "power4",
 212	},
 213	{	/* Power4+ */
 214		.pvr_mask		= 0xffff0000,
 215		.pvr_value		= 0x00380000,
 216		.cpu_name		= "POWER4+ (gq)",
 217		.cpu_features		= CPU_FTRS_POWER4,
 218		.cpu_user_features	= COMMON_USER_POWER4,
 219		.mmu_features		= MMU_FTRS_POWER4,
 220		.icache_bsize		= 128,
 221		.dcache_bsize		= 128,
 222		.num_pmcs		= 8,
 223		.pmc_type		= PPC_PMC_IBM,
 224		.oprofile_cpu_type	= "ppc64/power4",
 225		.oprofile_type		= PPC_OPROFILE_POWER4,
 226		.platform		= "power4",
 227	},
 228	{	/* PPC970 */
 229		.pvr_mask		= 0xffff0000,
 230		.pvr_value		= 0x00390000,
 231		.cpu_name		= "PPC970",
 232		.cpu_features		= CPU_FTRS_PPC970,
 233		.cpu_user_features	= COMMON_USER_POWER4 |
 234			PPC_FEATURE_HAS_ALTIVEC_COMP,
 235		.mmu_features		= MMU_FTRS_PPC970,
 236		.icache_bsize		= 128,
 237		.dcache_bsize		= 128,
 238		.num_pmcs		= 8,
 239		.pmc_type		= PPC_PMC_IBM,
 240		.cpu_setup		= __setup_cpu_ppc970,
 241		.cpu_restore		= __restore_cpu_ppc970,
 242		.oprofile_cpu_type	= "ppc64/970",
 243		.oprofile_type		= PPC_OPROFILE_POWER4,
 244		.platform		= "ppc970",
 245	},
 246	{	/* PPC970FX */
 247		.pvr_mask		= 0xffff0000,
 248		.pvr_value		= 0x003c0000,
 249		.cpu_name		= "PPC970FX",
 250		.cpu_features		= CPU_FTRS_PPC970,
 251		.cpu_user_features	= COMMON_USER_POWER4 |
 252			PPC_FEATURE_HAS_ALTIVEC_COMP,
 253		.mmu_features		= MMU_FTRS_PPC970,
 254		.icache_bsize		= 128,
 255		.dcache_bsize		= 128,
 256		.num_pmcs		= 8,
 257		.pmc_type		= PPC_PMC_IBM,
 258		.cpu_setup		= __setup_cpu_ppc970,
 259		.cpu_restore		= __restore_cpu_ppc970,
 260		.oprofile_cpu_type	= "ppc64/970",
 261		.oprofile_type		= PPC_OPROFILE_POWER4,
 262		.platform		= "ppc970",
 263	},
 264	{	/* PPC970MP DD1.0 - no DEEPNAP, use regular 970 init */
 265		.pvr_mask		= 0xffffffff,
 266		.pvr_value		= 0x00440100,
 267		.cpu_name		= "PPC970MP",
 268		.cpu_features		= CPU_FTRS_PPC970,
 269		.cpu_user_features	= COMMON_USER_POWER4 |
 270			PPC_FEATURE_HAS_ALTIVEC_COMP,
 271		.mmu_features		= MMU_FTR_HPTE_TABLE,
 272		.icache_bsize		= 128,
 273		.dcache_bsize		= 128,
 274		.num_pmcs		= 8,
 275		.pmc_type		= PPC_PMC_IBM,
 276		.cpu_setup		= __setup_cpu_ppc970,
 277		.cpu_restore		= __restore_cpu_ppc970,
 278		.oprofile_cpu_type	= "ppc64/970MP",
 279		.oprofile_type		= PPC_OPROFILE_POWER4,
 280		.platform		= "ppc970",
 281	},
 282	{	/* PPC970MP */
 283		.pvr_mask		= 0xffff0000,
 284		.pvr_value		= 0x00440000,
 285		.cpu_name		= "PPC970MP",
 286		.cpu_features		= CPU_FTRS_PPC970,
 287		.cpu_user_features	= COMMON_USER_POWER4 |
 288			PPC_FEATURE_HAS_ALTIVEC_COMP,
 289		.mmu_features		= MMU_FTRS_PPC970,
 290		.icache_bsize		= 128,
 291		.dcache_bsize		= 128,
 292		.num_pmcs		= 8,
 293		.pmc_type		= PPC_PMC_IBM,
 294		.cpu_setup		= __setup_cpu_ppc970MP,
 295		.cpu_restore		= __restore_cpu_ppc970,
 296		.oprofile_cpu_type	= "ppc64/970MP",
 297		.oprofile_type		= PPC_OPROFILE_POWER4,
 298		.platform		= "ppc970",
 299	},
 300	{	/* PPC970GX */
 301		.pvr_mask		= 0xffff0000,
 302		.pvr_value		= 0x00450000,
 303		.cpu_name		= "PPC970GX",
 304		.cpu_features		= CPU_FTRS_PPC970,
 305		.cpu_user_features	= COMMON_USER_POWER4 |
 306			PPC_FEATURE_HAS_ALTIVEC_COMP,
 307		.mmu_features		= MMU_FTRS_PPC970,
 308		.icache_bsize		= 128,
 309		.dcache_bsize		= 128,
 310		.num_pmcs		= 8,
 311		.pmc_type		= PPC_PMC_IBM,
 312		.cpu_setup		= __setup_cpu_ppc970,
 313		.oprofile_cpu_type	= "ppc64/970",
 314		.oprofile_type		= PPC_OPROFILE_POWER4,
 315		.platform		= "ppc970",
 316	},
 317	{	/* Power5 GR */
 318		.pvr_mask		= 0xffff0000,
 319		.pvr_value		= 0x003a0000,
 320		.cpu_name		= "POWER5 (gr)",
 321		.cpu_features		= CPU_FTRS_POWER5,
 322		.cpu_user_features	= COMMON_USER_POWER5,
 323		.mmu_features		= MMU_FTRS_POWER5,
 324		.icache_bsize		= 128,
 325		.dcache_bsize		= 128,
 326		.num_pmcs		= 6,
 327		.pmc_type		= PPC_PMC_IBM,
 328		.oprofile_cpu_type	= "ppc64/power5",
 329		.oprofile_type		= PPC_OPROFILE_POWER4,
 330		/* SIHV / SIPR bits are implemented on POWER4+ (GQ)
 331		 * and above but only works on POWER5 and above
 332		 */
 333		.oprofile_mmcra_sihv	= MMCRA_SIHV,
 334		.oprofile_mmcra_sipr	= MMCRA_SIPR,
 335		.platform		= "power5",
 336	},
 337	{	/* Power5++ */
 338		.pvr_mask		= 0xffffff00,
 339		.pvr_value		= 0x003b0300,
 340		.cpu_name		= "POWER5+ (gs)",
 341		.cpu_features		= CPU_FTRS_POWER5,
 342		.cpu_user_features	= COMMON_USER_POWER5_PLUS,
 343		.mmu_features		= MMU_FTRS_POWER5,
 344		.icache_bsize		= 128,
 345		.dcache_bsize		= 128,
 346		.num_pmcs		= 6,
 347		.oprofile_cpu_type	= "ppc64/power5++",
 348		.oprofile_type		= PPC_OPROFILE_POWER4,
 349		.oprofile_mmcra_sihv	= MMCRA_SIHV,
 350		.oprofile_mmcra_sipr	= MMCRA_SIPR,
 351		.platform		= "power5+",
 352	},
 353	{	/* Power5 GS */
 354		.pvr_mask		= 0xffff0000,
 355		.pvr_value		= 0x003b0000,
 356		.cpu_name		= "POWER5+ (gs)",
 357		.cpu_features		= CPU_FTRS_POWER5,
 358		.cpu_user_features	= COMMON_USER_POWER5_PLUS,
 359		.mmu_features		= MMU_FTRS_POWER5,
 360		.icache_bsize		= 128,
 361		.dcache_bsize		= 128,
 362		.num_pmcs		= 6,
 363		.pmc_type		= PPC_PMC_IBM,
 364		.oprofile_cpu_type	= "ppc64/power5+",
 365		.oprofile_type		= PPC_OPROFILE_POWER4,
 366		.oprofile_mmcra_sihv	= MMCRA_SIHV,
 367		.oprofile_mmcra_sipr	= MMCRA_SIPR,
 368		.platform		= "power5+",
 369	},
 370	{	/* POWER6 in P5+ mode; 2.04-compliant processor */
 371		.pvr_mask		= 0xffffffff,
 372		.pvr_value		= 0x0f000001,
 373		.cpu_name		= "POWER5+",
 374		.cpu_features		= CPU_FTRS_POWER5,
 375		.cpu_user_features	= COMMON_USER_POWER5_PLUS,
 376		.mmu_features		= MMU_FTRS_POWER5,
 377		.icache_bsize		= 128,
 378		.dcache_bsize		= 128,
 379		.oprofile_cpu_type	= "ppc64/ibm-compat-v1",
 380		.oprofile_type		= PPC_OPROFILE_POWER4,
 381		.platform		= "power5+",
 382	},
 383	{	/* Power6 */
 384		.pvr_mask		= 0xffff0000,
 385		.pvr_value		= 0x003e0000,
 386		.cpu_name		= "POWER6 (raw)",
 387		.cpu_features		= CPU_FTRS_POWER6,
 388		.cpu_user_features	= COMMON_USER_POWER6 |
 389			PPC_FEATURE_POWER6_EXT,
 390		.mmu_features		= MMU_FTRS_POWER6,
 391		.icache_bsize		= 128,
 392		.dcache_bsize		= 128,
 393		.num_pmcs		= 6,
 394		.pmc_type		= PPC_PMC_IBM,
 395		.oprofile_cpu_type	= "ppc64/power6",
 396		.oprofile_type		= PPC_OPROFILE_POWER4,
 397		.oprofile_mmcra_sihv	= POWER6_MMCRA_SIHV,
 398		.oprofile_mmcra_sipr	= POWER6_MMCRA_SIPR,
 399		.oprofile_mmcra_clear	= POWER6_MMCRA_THRM |
 400			POWER6_MMCRA_OTHER,
 401		.platform		= "power6x",
 402	},
 403	{	/* 2.05-compliant processor, i.e. Power6 "architected" mode */
 404		.pvr_mask		= 0xffffffff,
 405		.pvr_value		= 0x0f000002,
 406		.cpu_name		= "POWER6 (architected)",
 407		.cpu_features		= CPU_FTRS_POWER6,
 408		.cpu_user_features	= COMMON_USER_POWER6,
 409		.mmu_features		= MMU_FTRS_POWER6,
 410		.icache_bsize		= 128,
 411		.dcache_bsize		= 128,
 412		.oprofile_cpu_type	= "ppc64/ibm-compat-v1",
 413		.oprofile_type		= PPC_OPROFILE_POWER4,
 414		.platform		= "power6",
 415	},
 416	{	/* 2.06-compliant processor, i.e. Power7 "architected" mode */
 417		.pvr_mask		= 0xffffffff,
 418		.pvr_value		= 0x0f000003,
 419		.cpu_name		= "POWER7 (architected)",
 420		.cpu_features		= CPU_FTRS_POWER7,
 421		.cpu_user_features	= COMMON_USER_POWER7,
 422		.mmu_features		= MMU_FTRS_POWER7,
 423		.icache_bsize		= 128,
 424		.dcache_bsize		= 128,
 425		.oprofile_type		= PPC_OPROFILE_POWER4,
 426		.oprofile_cpu_type	= "ppc64/ibm-compat-v1",
 427		.cpu_setup		= __setup_cpu_power7,
 428		.cpu_restore		= __restore_cpu_power7,
 429		.platform		= "power7",
 430	},
 431	{	/* Power7 */
 432		.pvr_mask		= 0xffff0000,
 433		.pvr_value		= 0x003f0000,
 434		.cpu_name		= "POWER7 (raw)",
 435		.cpu_features		= CPU_FTRS_POWER7,
 436		.cpu_user_features	= COMMON_USER_POWER7,
 437		.mmu_features		= MMU_FTRS_POWER7,
 438		.icache_bsize		= 128,
 439		.dcache_bsize		= 128,
 440		.num_pmcs		= 6,
 441		.pmc_type		= PPC_PMC_IBM,
 442		.oprofile_cpu_type	= "ppc64/power7",
 443		.oprofile_type		= PPC_OPROFILE_POWER4,
 444		.cpu_setup		= __setup_cpu_power7,
 445		.cpu_restore		= __restore_cpu_power7,
 446		.platform		= "power7",
 447	},
 448	{	/* Power7+ */
 449		.pvr_mask		= 0xffff0000,
 450		.pvr_value		= 0x004A0000,
 451		.cpu_name		= "POWER7+ (raw)",
 452		.cpu_features		= CPU_FTRS_POWER7,
 453		.cpu_user_features	= COMMON_USER_POWER7,
 454		.mmu_features		= MMU_FTRS_POWER7,
 455		.icache_bsize		= 128,
 456		.dcache_bsize		= 128,
 457		.num_pmcs		= 6,
 458		.pmc_type		= PPC_PMC_IBM,
 459		.oprofile_cpu_type	= "ppc64/power7",
 460		.oprofile_type		= PPC_OPROFILE_POWER4,
 461		.cpu_setup		= __setup_cpu_power7,
 462		.cpu_restore		= __restore_cpu_power7,
 463		.platform		= "power7+",
 464	},
 465	{	/* Cell Broadband Engine */
 466		.pvr_mask		= 0xffff0000,
 467		.pvr_value		= 0x00700000,
 468		.cpu_name		= "Cell Broadband Engine",
 469		.cpu_features		= CPU_FTRS_CELL,
 470		.cpu_user_features	= COMMON_USER_PPC64 |
 471			PPC_FEATURE_CELL | PPC_FEATURE_HAS_ALTIVEC_COMP |
 472			PPC_FEATURE_SMT,
 473		.mmu_features		= MMU_FTRS_CELL,
 474		.icache_bsize		= 128,
 475		.dcache_bsize		= 128,
 476		.num_pmcs		= 4,
 477		.pmc_type		= PPC_PMC_IBM,
 478		.oprofile_cpu_type	= "ppc64/cell-be",
 479		.oprofile_type		= PPC_OPROFILE_CELL,
 480		.platform		= "ppc-cell-be",
 481	},
 482	{	/* PA Semi PA6T */
 483		.pvr_mask		= 0x7fff0000,
 484		.pvr_value		= 0x00900000,
 485		.cpu_name		= "PA6T",
 486		.cpu_features		= CPU_FTRS_PA6T,
 487		.cpu_user_features	= COMMON_USER_PA6T,
 488		.mmu_features		= MMU_FTRS_PA6T,
 489		.icache_bsize		= 64,
 490		.dcache_bsize		= 64,
 491		.num_pmcs		= 6,
 492		.pmc_type		= PPC_PMC_PA6T,
 493		.cpu_setup		= __setup_cpu_pa6t,
 494		.cpu_restore		= __restore_cpu_pa6t,
 495		.oprofile_cpu_type	= "ppc64/pa6t",
 496		.oprofile_type		= PPC_OPROFILE_PA6T,
 497		.platform		= "pa6t",
 498	},
 499	{	/* default match */
 500		.pvr_mask		= 0x00000000,
 501		.pvr_value		= 0x00000000,
 502		.cpu_name		= "POWER4 (compatible)",
 503		.cpu_features		= CPU_FTRS_COMPATIBLE,
 504		.cpu_user_features	= COMMON_USER_PPC64,
 505		.mmu_features		= MMU_FTRS_DEFAULT_HPTE_ARCH_V2,
 506		.icache_bsize		= 128,
 507		.dcache_bsize		= 128,
 508		.num_pmcs		= 6,
 509		.pmc_type		= PPC_PMC_IBM,
 510		.platform		= "power4",
 511	}
 512#endif	/* CONFIG_PPC_BOOK3S_64 */
 513
 514#ifdef CONFIG_PPC32
 515#if CLASSIC_PPC
 516	{	/* 601 */
 517		.pvr_mask		= 0xffff0000,
 518		.pvr_value		= 0x00010000,
 519		.cpu_name		= "601",
 520		.cpu_features		= CPU_FTRS_PPC601,
 521		.cpu_user_features	= COMMON_USER | PPC_FEATURE_601_INSTR |
 522			PPC_FEATURE_UNIFIED_CACHE | PPC_FEATURE_NO_TB,
 523		.mmu_features		= MMU_FTR_HPTE_TABLE,
 524		.icache_bsize		= 32,
 525		.dcache_bsize		= 32,
 526		.machine_check		= machine_check_generic,
 527		.platform		= "ppc601",
 528	},
 529	{	/* 603 */
 530		.pvr_mask		= 0xffff0000,
 531		.pvr_value		= 0x00030000,
 532		.cpu_name		= "603",
 533		.cpu_features		= CPU_FTRS_603,
 534		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 535		.mmu_features		= 0,
 536		.icache_bsize		= 32,
 537		.dcache_bsize		= 32,
 538		.cpu_setup		= __setup_cpu_603,
 539		.machine_check		= machine_check_generic,
 540		.platform		= "ppc603",
 541	},
 542	{	/* 603e */
 543		.pvr_mask		= 0xffff0000,
 544		.pvr_value		= 0x00060000,
 545		.cpu_name		= "603e",
 546		.cpu_features		= CPU_FTRS_603,
 547		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 548		.mmu_features		= 0,
 549		.icache_bsize		= 32,
 550		.dcache_bsize		= 32,
 551		.cpu_setup		= __setup_cpu_603,
 552		.machine_check		= machine_check_generic,
 553		.platform		= "ppc603",
 554	},
 555	{	/* 603ev */
 556		.pvr_mask		= 0xffff0000,
 557		.pvr_value		= 0x00070000,
 558		.cpu_name		= "603ev",
 559		.cpu_features		= CPU_FTRS_603,
 560		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 561		.mmu_features		= 0,
 562		.icache_bsize		= 32,
 563		.dcache_bsize		= 32,
 564		.cpu_setup		= __setup_cpu_603,
 565		.machine_check		= machine_check_generic,
 566		.platform		= "ppc603",
 567	},
 568	{	/* 604 */
 569		.pvr_mask		= 0xffff0000,
 570		.pvr_value		= 0x00040000,
 571		.cpu_name		= "604",
 572		.cpu_features		= CPU_FTRS_604,
 573		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 574		.mmu_features		= MMU_FTR_HPTE_TABLE,
 575		.icache_bsize		= 32,
 576		.dcache_bsize		= 32,
 577		.num_pmcs		= 2,
 578		.cpu_setup		= __setup_cpu_604,
 579		.machine_check		= machine_check_generic,
 580		.platform		= "ppc604",
 581	},
 582	{	/* 604e */
 583		.pvr_mask		= 0xfffff000,
 584		.pvr_value		= 0x00090000,
 585		.cpu_name		= "604e",
 586		.cpu_features		= CPU_FTRS_604,
 587		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 588		.mmu_features		= MMU_FTR_HPTE_TABLE,
 589		.icache_bsize		= 32,
 590		.dcache_bsize		= 32,
 591		.num_pmcs		= 4,
 592		.cpu_setup		= __setup_cpu_604,
 593		.machine_check		= machine_check_generic,
 594		.platform		= "ppc604",
 595	},
 596	{	/* 604r */
 597		.pvr_mask		= 0xffff0000,
 598		.pvr_value		= 0x00090000,
 599		.cpu_name		= "604r",
 600		.cpu_features		= CPU_FTRS_604,
 601		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 602		.mmu_features		= MMU_FTR_HPTE_TABLE,
 603		.icache_bsize		= 32,
 604		.dcache_bsize		= 32,
 605		.num_pmcs		= 4,
 606		.cpu_setup		= __setup_cpu_604,
 607		.machine_check		= machine_check_generic,
 608		.platform		= "ppc604",
 609	},
 610	{	/* 604ev */
 611		.pvr_mask		= 0xffff0000,
 612		.pvr_value		= 0x000a0000,
 613		.cpu_name		= "604ev",
 614		.cpu_features		= CPU_FTRS_604,
 615		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 616		.mmu_features		= MMU_FTR_HPTE_TABLE,
 617		.icache_bsize		= 32,
 618		.dcache_bsize		= 32,
 619		.num_pmcs		= 4,
 620		.cpu_setup		= __setup_cpu_604,
 621		.machine_check		= machine_check_generic,
 622		.platform		= "ppc604",
 623	},
 624	{	/* 740/750 (0x4202, don't support TAU ?) */
 625		.pvr_mask		= 0xffffffff,
 626		.pvr_value		= 0x00084202,
 627		.cpu_name		= "740/750",
 628		.cpu_features		= CPU_FTRS_740_NOTAU,
 629		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 630		.mmu_features		= MMU_FTR_HPTE_TABLE,
 631		.icache_bsize		= 32,
 632		.dcache_bsize		= 32,
 633		.num_pmcs		= 4,
 634		.cpu_setup		= __setup_cpu_750,
 635		.machine_check		= machine_check_generic,
 636		.platform		= "ppc750",
 637	},
 638	{	/* 750CX (80100 and 8010x?) */
 639		.pvr_mask		= 0xfffffff0,
 640		.pvr_value		= 0x00080100,
 641		.cpu_name		= "750CX",
 642		.cpu_features		= CPU_FTRS_750,
 643		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 644		.mmu_features		= MMU_FTR_HPTE_TABLE,
 645		.icache_bsize		= 32,
 646		.dcache_bsize		= 32,
 647		.num_pmcs		= 4,
 648		.cpu_setup		= __setup_cpu_750cx,
 649		.machine_check		= machine_check_generic,
 650		.platform		= "ppc750",
 651	},
 652	{	/* 750CX (82201 and 82202) */
 653		.pvr_mask		= 0xfffffff0,
 654		.pvr_value		= 0x00082200,
 655		.cpu_name		= "750CX",
 656		.cpu_features		= CPU_FTRS_750,
 657		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 658		.mmu_features		= MMU_FTR_HPTE_TABLE,
 659		.icache_bsize		= 32,
 660		.dcache_bsize		= 32,
 661		.num_pmcs		= 4,
 662		.pmc_type		= PPC_PMC_IBM,
 663		.cpu_setup		= __setup_cpu_750cx,
 664		.machine_check		= machine_check_generic,
 665		.platform		= "ppc750",
 666	},
 667	{	/* 750CXe (82214) */
 668		.pvr_mask		= 0xfffffff0,
 669		.pvr_value		= 0x00082210,
 670		.cpu_name		= "750CXe",
 671		.cpu_features		= CPU_FTRS_750,
 672		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 673		.mmu_features		= MMU_FTR_HPTE_TABLE,
 674		.icache_bsize		= 32,
 675		.dcache_bsize		= 32,
 676		.num_pmcs		= 4,
 677		.pmc_type		= PPC_PMC_IBM,
 678		.cpu_setup		= __setup_cpu_750cx,
 679		.machine_check		= machine_check_generic,
 680		.platform		= "ppc750",
 681	},
 682	{	/* 750CXe "Gekko" (83214) */
 683		.pvr_mask		= 0xffffffff,
 684		.pvr_value		= 0x00083214,
 685		.cpu_name		= "750CXe",
 686		.cpu_features		= CPU_FTRS_750,
 687		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 688		.mmu_features		= MMU_FTR_HPTE_TABLE,
 689		.icache_bsize		= 32,
 690		.dcache_bsize		= 32,
 691		.num_pmcs		= 4,
 692		.pmc_type		= PPC_PMC_IBM,
 693		.cpu_setup		= __setup_cpu_750cx,
 694		.machine_check		= machine_check_generic,
 695		.platform		= "ppc750",
 696	},
 697	{	/* 750CL (and "Broadway") */
 698		.pvr_mask		= 0xfffff0e0,
 699		.pvr_value		= 0x00087000,
 700		.cpu_name		= "750CL",
 701		.cpu_features		= CPU_FTRS_750CL,
 702		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 703		.mmu_features		= MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
 704		.icache_bsize		= 32,
 705		.dcache_bsize		= 32,
 706		.num_pmcs		= 4,
 707		.pmc_type		= PPC_PMC_IBM,
 708		.cpu_setup		= __setup_cpu_750,
 709		.machine_check		= machine_check_generic,
 710		.platform		= "ppc750",
 711		.oprofile_cpu_type      = "ppc/750",
 712		.oprofile_type		= PPC_OPROFILE_G4,
 713	},
 714	{	/* 745/755 */
 715		.pvr_mask		= 0xfffff000,
 716		.pvr_value		= 0x00083000,
 717		.cpu_name		= "745/755",
 718		.cpu_features		= CPU_FTRS_750,
 719		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 720		.mmu_features		= MMU_FTR_HPTE_TABLE,
 721		.icache_bsize		= 32,
 722		.dcache_bsize		= 32,
 723		.num_pmcs		= 4,
 724		.pmc_type		= PPC_PMC_IBM,
 725		.cpu_setup		= __setup_cpu_750,
 726		.machine_check		= machine_check_generic,
 727		.platform		= "ppc750",
 728	},
 729	{	/* 750FX rev 1.x */
 730		.pvr_mask		= 0xffffff00,
 731		.pvr_value		= 0x70000100,
 732		.cpu_name		= "750FX",
 733		.cpu_features		= CPU_FTRS_750FX1,
 734		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 735		.mmu_features		= MMU_FTR_HPTE_TABLE,
 736		.icache_bsize		= 32,
 737		.dcache_bsize		= 32,
 738		.num_pmcs		= 4,
 739		.pmc_type		= PPC_PMC_IBM,
 740		.cpu_setup		= __setup_cpu_750,
 741		.machine_check		= machine_check_generic,
 742		.platform		= "ppc750",
 743		.oprofile_cpu_type      = "ppc/750",
 744		.oprofile_type		= PPC_OPROFILE_G4,
 745	},
 746	{	/* 750FX rev 2.0 must disable HID0[DPM] */
 747		.pvr_mask		= 0xffffffff,
 748		.pvr_value		= 0x70000200,
 749		.cpu_name		= "750FX",
 750		.cpu_features		= CPU_FTRS_750FX2,
 751		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 752		.mmu_features		= MMU_FTR_HPTE_TABLE,
 753		.icache_bsize		= 32,
 754		.dcache_bsize		= 32,
 755		.num_pmcs		= 4,
 756		.pmc_type		= PPC_PMC_IBM,
 757		.cpu_setup		= __setup_cpu_750,
 758		.machine_check		= machine_check_generic,
 759		.platform		= "ppc750",
 760		.oprofile_cpu_type      = "ppc/750",
 761		.oprofile_type		= PPC_OPROFILE_G4,
 762	},
 763	{	/* 750FX (All revs except 2.0) */
 764		.pvr_mask		= 0xffff0000,
 765		.pvr_value		= 0x70000000,
 766		.cpu_name		= "750FX",
 767		.cpu_features		= CPU_FTRS_750FX,
 768		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 769		.mmu_features		= MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
 770		.icache_bsize		= 32,
 771		.dcache_bsize		= 32,
 772		.num_pmcs		= 4,
 773		.pmc_type		= PPC_PMC_IBM,
 774		.cpu_setup		= __setup_cpu_750fx,
 775		.machine_check		= machine_check_generic,
 776		.platform		= "ppc750",
 777		.oprofile_cpu_type      = "ppc/750",
 778		.oprofile_type		= PPC_OPROFILE_G4,
 779	},
 780	{	/* 750GX */
 781		.pvr_mask		= 0xffff0000,
 782		.pvr_value		= 0x70020000,
 783		.cpu_name		= "750GX",
 784		.cpu_features		= CPU_FTRS_750GX,
 785		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 786		.mmu_features		= MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
 787		.icache_bsize		= 32,
 788		.dcache_bsize		= 32,
 789		.num_pmcs		= 4,
 790		.pmc_type		= PPC_PMC_IBM,
 791		.cpu_setup		= __setup_cpu_750fx,
 792		.machine_check		= machine_check_generic,
 793		.platform		= "ppc750",
 794		.oprofile_cpu_type      = "ppc/750",
 795		.oprofile_type		= PPC_OPROFILE_G4,
 796	},
 797	{	/* 740/750 (L2CR bit need fixup for 740) */
 798		.pvr_mask		= 0xffff0000,
 799		.pvr_value		= 0x00080000,
 800		.cpu_name		= "740/750",
 801		.cpu_features		= CPU_FTRS_740,
 802		.cpu_user_features	= COMMON_USER | PPC_FEATURE_PPC_LE,
 803		.mmu_features		= MMU_FTR_HPTE_TABLE,
 804		.icache_bsize		= 32,
 805		.dcache_bsize		= 32,
 806		.num_pmcs		= 4,
 807		.pmc_type		= PPC_PMC_IBM,
 808		.cpu_setup		= __setup_cpu_750,
 809		.machine_check		= machine_check_generic,
 810		.platform		= "ppc750",
 811	},
 812	{	/* 7400 rev 1.1 ? (no TAU) */
 813		.pvr_mask		= 0xffffffff,
 814		.pvr_value		= 0x000c1101,
 815		.cpu_name		= "7400 (1.1)",
 816		.cpu_features		= CPU_FTRS_7400_NOTAU,
 817		.cpu_user_features	= COMMON_USER |
 818			PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
 819		.mmu_features		= MMU_FTR_HPTE_TABLE,
 820		.icache_bsize		= 32,
 821		.dcache_bsize		= 32,
 822		.num_pmcs		= 4,
 823		.pmc_type		= PPC_PMC_G4,
 824		.cpu_setup		= __setup_cpu_7400,
 825		.machine_check		= machine_check_generic,
 826		.platform		= "ppc7400",
 827	},
 828	{	/* 7400 */
 829		.pvr_mask		= 0xffff0000,
 830		.pvr_value		= 0x000c0000,
 831		.cpu_name		= "7400",
 832		.cpu_features		= CPU_FTRS_7400,
 833		.cpu_user_features	= COMMON_USER |
 834			PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
 835		.mmu_features		= MMU_FTR_HPTE_TABLE,
 836		.icache_bsize		= 32,
 837		.dcache_bsize		= 32,
 838		.num_pmcs		= 4,
 839		.pmc_type		= PPC_PMC_G4,
 840		.cpu_setup		= __setup_cpu_7400,
 841		.machine_check		= machine_check_generic,
 842		.platform		= "ppc7400",
 843	},
 844	{	/* 7410 */
 845		.pvr_mask		= 0xffff0000,
 846		.pvr_value		= 0x800c0000,
 847		.cpu_name		= "7410",
 848		.cpu_features		= CPU_FTRS_7400,
 849		.cpu_user_features	= COMMON_USER |
 850			PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
 851		.mmu_features		= MMU_FTR_HPTE_TABLE,
 852		.icache_bsize		= 32,
 853		.dcache_bsize		= 32,
 854		.num_pmcs		= 4,
 855		.pmc_type		= PPC_PMC_G4,
 856		.cpu_setup		= __setup_cpu_7410,
 857		.machine_check		= machine_check_generic,
 858		.platform		= "ppc7400",
 859	},
 860	{	/* 7450 2.0 - no doze/nap */
 861		.pvr_mask		= 0xffffffff,
 862		.pvr_value		= 0x80000200,
 863		.cpu_name		= "7450",
 864		.cpu_features		= CPU_FTRS_7450_20,
 865		.cpu_user_features	= COMMON_USER |
 866			PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
 867		.mmu_features		= MMU_FTR_HPTE_TABLE,
 868		.icache_bsize		= 32,
 869		.dcache_bsize		= 32,
 870		.num_pmcs		= 6,
 871		.pmc_type		= PPC_PMC_G4,
 872		.cpu_setup		= __setup_cpu_745x,
 873		.oprofile_cpu_type      = "ppc/7450",
 874		.oprofile_type		= PPC_OPROFILE_G4,
 875		.machine_check		= machine_check_generic,
 876		.platform		= "ppc7450",
 877	},
 878	{	/* 7450 2.1 */
 879		.pvr_mask		= 0xffffffff,
 880		.pvr_value		= 0x80000201,
 881		.cpu_name		= "7450",
 882		.cpu_features		= CPU_FTRS_7450_21,
 883		.cpu_user_features	= COMMON_USER |
 884			PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
 885		.mmu_features		= MMU_FTR_HPTE_TABLE,
 886		.icache_bsize		= 32,
 887		.dcache_bsize		= 32,
 888		.num_pmcs		= 6,
 889		.pmc_type		= PPC_PMC_G4,
 890		.cpu_setup		= __setup_cpu_745x,
 891		.oprofile_cpu_type      = "ppc/7450",
 892		.oprofile_type		= PPC_OPROFILE_G4,
 893		.machine_check		= machine_check_generic,
 894		.platform		= "ppc7450",
 895	},
 896	{	/* 7450 2.3 and newer */
 897		.pvr_mask		= 0xffff0000,
 898		.pvr_value		= 0x80000000,
 899		.cpu_name		= "7450",
 900		.cpu_features		= CPU_FTRS_7450_23,
 901		.cpu_user_features	= COMMON_USER |
 902			PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
 903		.mmu_features		= MMU_FTR_HPTE_TABLE,
 904		.icache_bsize		= 32,
 905		.dcache_bsize		= 32,
 906		.num_pmcs		= 6,
 907		.pmc_type		= PPC_PMC_G4,
 908		.cpu_setup		= __setup_cpu_745x,
 909		.oprofile_cpu_type      = "ppc/7450",
 910		.oprofile_type		= PPC_OPROFILE_G4,
 911		.machine_check		= machine_check_generic,
 912		.platform		= "ppc7450",
 913	},
 914	{	/* 7455 rev 1.x */
 915		.pvr_mask		= 0xffffff00,
 916		.pvr_value		= 0x80010100,
 917		.cpu_name		= "7455",
 918		.cpu_features		= CPU_FTRS_7455_1,
 919		.cpu_user_features	= COMMON_USER |
 920			PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
 921		.mmu_features		= MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
 922		.icache_bsize		= 32,
 923		.dcache_bsize		= 32,
 924		.num_pmcs		= 6,
 925		.pmc_type		= PPC_PMC_G4,
 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	{	/* 7455 rev 2.0 */
 933		.pvr_mask		= 0xffffffff,
 934		.pvr_value		= 0x80010200,
 935		.cpu_name		= "7455",
 936		.cpu_features		= CPU_FTRS_7455_20,
 937		.cpu_user_features	= COMMON_USER |
 938			PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
 939		.mmu_features		= MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
 940		.icache_bsize		= 32,
 941		.dcache_bsize		= 32,
 942		.num_pmcs		= 6,
 943		.pmc_type		= PPC_PMC_G4,
 944		.cpu_setup		= __setup_cpu_745x,
 945		.oprofile_cpu_type      = "ppc/7450",
 946		.oprofile_type		= PPC_OPROFILE_G4,
 947		.machine_check		= machine_check_generic,
 948		.platform		= "ppc7450",
 949	},
 950	{	/* 7455 others */
 951		.pvr_mask		= 0xffff0000,
 952		.pvr_value		= 0x80010000,
 953		.cpu_name		= "7455",
 954		.cpu_features		= CPU_FTRS_7455,
 955		.cpu_user_features	= COMMON_USER |
 956			PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
 957		.mmu_features		= MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
 958		.icache_bsize		= 32,
 959		.dcache_bsize		= 32,
 960		.num_pmcs		= 6,
 961		.pmc_type		= PPC_PMC_G4,
 962		.cpu_setup		= __setup_cpu_745x,
 963		.oprofile_cpu_type      = "ppc/7450",
 964		.oprofile_type		= PPC_OPROFILE_G4,
 965		.machine_check		= machine_check_generic,
 966		.platform		= "ppc7450",
 967	},
 968	{	/* 7447/7457 Rev 1.0 */
 969		.pvr_mask		= 0xffffffff,
 970		.pvr_value		= 0x80020100,
 971		.cpu_name		= "7447/7457",
 972		.cpu_features		= CPU_FTRS_7447_10,
 973		.cpu_user_features	= COMMON_USER |
 974			PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
 975		.mmu_features		= MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
 976		.icache_bsize		= 32,
 977		.dcache_bsize		= 32,
 978		.num_pmcs		= 6,
 979		.pmc_type		= PPC_PMC_G4,
 980		.cpu_setup		= __setup_cpu_745x,
 981		.oprofile_cpu_type      = "ppc/7450",
 982		.oprofile_type		= PPC_OPROFILE_G4,
 983		.machine_check		= machine_check_generic,
 984		.platform		= "ppc7450",
 985	},
 986	{	/* 7447/7457 Rev 1.1 */
 987		.pvr_mask		= 0xffffffff,
 988		.pvr_value		= 0x80020101,
 989		.cpu_name		= "7447/7457",
 990		.cpu_features		= CPU_FTRS_7447_10,
 991		.cpu_user_features	= COMMON_USER |
 992			PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
 993		.mmu_features		= MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
 994		.icache_bsize		= 32,
 995		.dcache_bsize		= 32,
 996		.num_pmcs		= 6,
 997		.pmc_type		= PPC_PMC_G4,
 998		.cpu_setup		= __setup_cpu_745x,
 999		.oprofile_cpu_type      = "ppc/7450",
1000		.oprofile_type		= PPC_OPROFILE_G4,
1001		.machine_check		= machine_check_generic,
1002		.platform		= "ppc7450",
1003	},
1004	{	/* 7447/7457 Rev 1.2 and later */
1005		.pvr_mask		= 0xffff0000,
1006		.pvr_value		= 0x80020000,
1007		.cpu_name		= "7447/7457",
1008		.cpu_features		= CPU_FTRS_7447,
1009		.cpu_user_features	= COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
1010		.mmu_features		= MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
1011		.icache_bsize		= 32,
1012		.dcache_bsize		= 32,
1013		.num_pmcs		= 6,
1014		.pmc_type		= PPC_PMC_G4,
1015		.cpu_setup		= __setup_cpu_745x,
1016		.oprofile_cpu_type      = "ppc/7450",
1017		.oprofile_type		= PPC_OPROFILE_G4,
1018		.machine_check		= machine_check_generic,
1019		.platform		= "ppc7450",
1020	},
1021	{	/* 7447A */
1022		.pvr_mask		= 0xffff0000,
1023		.pvr_value		= 0x80030000,
1024		.cpu_name		= "7447A",
1025		.cpu_features		= CPU_FTRS_7447A,
1026		.cpu_user_features	= COMMON_USER |
1027			PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
1028		.mmu_features		= MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
1029		.icache_bsize		= 32,
1030		.dcache_bsize		= 32,
1031		.num_pmcs		= 6,
1032		.pmc_type		= PPC_PMC_G4,
1033		.cpu_setup		= __setup_cpu_745x,
1034		.oprofile_cpu_type      = "ppc/7450",
1035		.oprofile_type		= PPC_OPROFILE_G4,
1036		.machine_check		= machine_check_generic,
1037		.platform		= "ppc7450",
1038	},
1039	{	/* 7448 */
1040		.pvr_mask		= 0xffff0000,
1041		.pvr_value		= 0x80040000,
1042		.cpu_name		= "7448",
1043		.cpu_features		= CPU_FTRS_7448,
1044		.cpu_user_features	= COMMON_USER |
1045			PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
1046		.mmu_features		= MMU_FTR_HPTE_TABLE | MMU_FTR_USE_HIGH_BATS,
1047		.icache_bsize		= 32,
1048		.dcache_bsize		= 32,
1049		.num_pmcs		= 6,
1050		.pmc_type		= PPC_PMC_G4,
1051		.cpu_setup		= __setup_cpu_745x,
1052		.oprofile_cpu_type      = "ppc/7450",
1053		.oprofile_type		= PPC_OPROFILE_G4,
1054		.machine_check		= machine_check_generic,
1055		.platform		= "ppc7450",
1056	},
1057	{	/* 82xx (8240, 8245, 8260 are all 603e cores) */
1058		.pvr_mask		= 0x7fff0000,
1059		.pvr_value		= 0x00810000,
1060		.cpu_name		= "82xx",
1061		.cpu_features		= CPU_FTRS_82XX,
1062		.cpu_user_features	= COMMON_USER,
1063		.mmu_features		= 0,
1064		.icache_bsize		= 32,
1065		.dcache_bsize		= 32,
1066		.cpu_setup		= __setup_cpu_603,
1067		.machine_check		= machine_check_generic,
1068		.platform		= "ppc603",
1069	},
1070	{	/* All G2_LE (603e core, plus some) have the same pvr */
1071		.pvr_mask		= 0x7fff0000,
1072		.pvr_value		= 0x00820000,
1073		.cpu_name		= "G2_LE",
1074		.cpu_features		= CPU_FTRS_G2_LE,
1075		.cpu_user_features	= COMMON_USER,
1076		.mmu_features		= MMU_FTR_USE_HIGH_BATS,
1077		.icache_bsize		= 32,
1078		.dcache_bsize		= 32,
1079		.cpu_setup		= __setup_cpu_603,
1080		.machine_check		= machine_check_generic,
1081		.platform		= "ppc603",
1082	},
1083	{	/* e300c1 (a 603e core, plus some) on 83xx */
1084		.pvr_mask		= 0x7fff0000,
1085		.pvr_value		= 0x00830000,
1086		.cpu_name		= "e300c1",
1087		.cpu_features		= CPU_FTRS_E300,
1088		.cpu_user_features	= COMMON_USER,
1089		.mmu_features		= MMU_FTR_USE_HIGH_BATS,
1090		.icache_bsize		= 32,
1091		.dcache_bsize		= 32,
1092		.cpu_setup		= __setup_cpu_603,
1093		.machine_check		= machine_check_generic,
1094		.platform		= "ppc603",
1095	},
1096	{	/* e300c2 (an e300c1 core, plus some, minus FPU) on 83xx */
1097		.pvr_mask		= 0x7fff0000,
1098		.pvr_value		= 0x00840000,
1099		.cpu_name		= "e300c2",
1100		.cpu_features		= CPU_FTRS_E300C2,
1101		.cpu_user_features	= PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
1102		.mmu_features		= MMU_FTR_USE_HIGH_BATS |
1103			MMU_FTR_NEED_DTLB_SW_LRU,
1104		.icache_bsize		= 32,
1105		.dcache_bsize		= 32,
1106		.cpu_setup		= __setup_cpu_603,
1107		.machine_check		= machine_check_generic,
1108		.platform		= "ppc603",
1109	},
1110	{	/* e300c3 (e300c1, plus one IU, half cache size) on 83xx */
1111		.pvr_mask		= 0x7fff0000,
1112		.pvr_value		= 0x00850000,
1113		.cpu_name		= "e300c3",
1114		.cpu_features		= CPU_FTRS_E300,
1115		.cpu_user_features	= COMMON_USER,
1116		.mmu_features		= MMU_FTR_USE_HIGH_BATS |
1117			MMU_FTR_NEED_DTLB_SW_LRU,
1118		.icache_bsize		= 32,
1119		.dcache_bsize		= 32,
1120		.cpu_setup		= __setup_cpu_603,
1121		.num_pmcs		= 4,
1122		.oprofile_cpu_type	= "ppc/e300",
1123		.oprofile_type		= PPC_OPROFILE_FSL_EMB,
1124		.platform		= "ppc603",
1125	},
1126	{	/* e300c4 (e300c1, plus one IU) */
1127		.pvr_mask		= 0x7fff0000,
1128		.pvr_value		= 0x00860000,
1129		.cpu_name		= "e300c4",
1130		.cpu_features		= CPU_FTRS_E300,
1131		.cpu_user_features	= COMMON_USER,
1132		.mmu_features		= MMU_FTR_USE_HIGH_BATS |
1133			MMU_FTR_NEED_DTLB_SW_LRU,
1134		.icache_bsize		= 32,
1135		.dcache_bsize		= 32,
1136		.cpu_setup		= __setup_cpu_603,
1137		.machine_check		= machine_check_generic,
1138		.num_pmcs		= 4,
1139		.oprofile_cpu_type	= "ppc/e300",
1140		.oprofile_type		= PPC_OPROFILE_FSL_EMB,
1141		.platform		= "ppc603",
1142	},
1143	{	/* default match, we assume split I/D cache & TB (non-601)... */
1144		.pvr_mask		= 0x00000000,
1145		.pvr_value		= 0x00000000,
1146		.cpu_name		= "(generic PPC)",
1147		.cpu_features		= CPU_FTRS_CLASSIC32,
1148		.cpu_user_features	= COMMON_USER,
1149		.mmu_features		= MMU_FTR_HPTE_TABLE,
1150		.icache_bsize		= 32,
1151		.dcache_bsize		= 32,
1152		.machine_check		= machine_check_generic,
1153		.platform		= "ppc603",
1154	},
1155#endif /* CLASSIC_PPC */
1156#ifdef CONFIG_8xx
1157	{	/* 8xx */
1158		.pvr_mask		= 0xffff0000,
1159		.pvr_value		= 0x00500000,
1160		.cpu_name		= "8xx",
1161		/* CPU_FTR_MAYBE_CAN_DOZE is possible,
1162		 * if the 8xx code is there.... */
1163		.cpu_features		= CPU_FTRS_8XX,
1164		.cpu_user_features	= PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
1165		.mmu_features		= MMU_FTR_TYPE_8xx,
1166		.icache_bsize		= 16,
1167		.dcache_bsize		= 16,
1168		.platform		= "ppc823",
1169	},
1170#endif /* CONFIG_8xx */
1171#ifdef CONFIG_40x
1172	{	/* 403GC */
1173		.pvr_mask		= 0xffffff00,
1174		.pvr_value		= 0x00200200,
1175		.cpu_name		= "403GC",
1176		.cpu_features		= CPU_FTRS_40X,
1177		.cpu_user_features	= PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
1178		.mmu_features		= MMU_FTR_TYPE_40x,
1179		.icache_bsize		= 16,
1180		.dcache_bsize		= 16,
1181		.machine_check		= machine_check_4xx,
1182		.platform		= "ppc403",
1183	},
1184	{	/* 403GCX */
1185		.pvr_mask		= 0xffffff00,
1186		.pvr_value		= 0x00201400,
1187		.cpu_name		= "403GCX",
1188		.cpu_features		= CPU_FTRS_40X,
1189		.cpu_user_features	= PPC_FEATURE_32 |
1190		 	PPC_FEATURE_HAS_MMU | PPC_FEATURE_NO_TB,
1191		.mmu_features		= MMU_FTR_TYPE_40x,
1192		.icache_bsize		= 16,
1193		.dcache_bsize		= 16,
1194		.machine_check		= machine_check_4xx,
1195		.platform		= "ppc403",
1196	},
1197	{	/* 403G ?? */
1198		.pvr_mask		= 0xffff0000,
1199		.pvr_value		= 0x00200000,
1200		.cpu_name		= "403G ??",
1201		.cpu_features		= CPU_FTRS_40X,
1202		.cpu_user_features	= PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
1203		.mmu_features		= MMU_FTR_TYPE_40x,
1204		.icache_bsize		= 16,
1205		.dcache_bsize		= 16,
1206		.machine_check		= machine_check_4xx,
1207		.platform		= "ppc403",
1208	},
1209	{	/* 405GP */
1210		.pvr_mask		= 0xffff0000,
1211		.pvr_value		= 0x40110000,
1212		.cpu_name		= "405GP",
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	{	/* STB 03xxx */
1223		.pvr_mask		= 0xffff0000,
1224		.pvr_value		= 0x40130000,
1225		.cpu_name		= "STB03xxx",
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	{	/* STB 04xxx */
1236		.pvr_mask		= 0xffff0000,
1237		.pvr_value		= 0x41810000,
1238		.cpu_name		= "STB04xxx",
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	{	/* NP405L */
1249		.pvr_mask		= 0xffff0000,
1250		.pvr_value		= 0x41610000,
1251		.cpu_name		= "NP405L",
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	{	/* NP4GS3 */
1262		.pvr_mask		= 0xffff0000,
1263		.pvr_value		= 0x40B10000,
1264		.cpu_name		= "NP4GS3",
1265		.cpu_features		= CPU_FTRS_40X,
1266		.cpu_user_features	= PPC_FEATURE_32 |
1267			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1268		.mmu_features		= MMU_FTR_TYPE_40x,
1269		.icache_bsize		= 32,
1270		.dcache_bsize		= 32,
1271		.machine_check		= machine_check_4xx,
1272		.platform		= "ppc405",
1273	},
1274	{   /* NP405H */
1275		.pvr_mask		= 0xffff0000,
1276		.pvr_value		= 0x41410000,
1277		.cpu_name		= "NP405H",
1278		.cpu_features		= CPU_FTRS_40X,
1279		.cpu_user_features	= PPC_FEATURE_32 |
1280			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1281		.mmu_features		= MMU_FTR_TYPE_40x,
1282		.icache_bsize		= 32,
1283		.dcache_bsize		= 32,
1284		.machine_check		= machine_check_4xx,
1285		.platform		= "ppc405",
1286	},
1287	{	/* 405GPr */
1288		.pvr_mask		= 0xffff0000,
1289		.pvr_value		= 0x50910000,
1290		.cpu_name		= "405GPr",
1291		.cpu_features		= CPU_FTRS_40X,
1292		.cpu_user_features	= PPC_FEATURE_32 |
1293			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1294		.mmu_features		= MMU_FTR_TYPE_40x,
1295		.icache_bsize		= 32,
1296		.dcache_bsize		= 32,
1297		.machine_check		= machine_check_4xx,
1298		.platform		= "ppc405",
1299	},
1300	{   /* STBx25xx */
1301		.pvr_mask		= 0xffff0000,
1302		.pvr_value		= 0x51510000,
1303		.cpu_name		= "STBx25xx",
1304		.cpu_features		= CPU_FTRS_40X,
1305		.cpu_user_features	= PPC_FEATURE_32 |
1306			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1307		.mmu_features		= MMU_FTR_TYPE_40x,
1308		.icache_bsize		= 32,
1309		.dcache_bsize		= 32,
1310		.machine_check		= machine_check_4xx,
1311		.platform		= "ppc405",
1312	},
1313	{	/* 405LP */
1314		.pvr_mask		= 0xffff0000,
1315		.pvr_value		= 0x41F10000,
1316		.cpu_name		= "405LP",
1317		.cpu_features		= CPU_FTRS_40X,
1318		.cpu_user_features	= PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
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	{	/* Xilinx Virtex-II Pro  */
1326		.pvr_mask		= 0xfffff000,
1327		.pvr_value		= 0x20010000,
1328		.cpu_name		= "Virtex-II Pro",
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	{	/* Xilinx Virtex-4 FX */
1339		.pvr_mask		= 0xfffff000,
1340		.pvr_value		= 0x20011000,
1341		.cpu_name		= "Virtex-4 FX",
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	{	/* 405EP */
1352		.pvr_mask		= 0xffff0000,
1353		.pvr_value		= 0x51210000,
1354		.cpu_name		= "405EP",
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	{	/* 405EX Rev. A/B with Security */
1365		.pvr_mask		= 0xffff000f,
1366		.pvr_value		= 0x12910007,
1367		.cpu_name		= "405EX Rev. A/B",
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	{	/* 405EX Rev. C without Security */
1378		.pvr_mask		= 0xffff000f,
1379		.pvr_value		= 0x1291000d,
1380		.cpu_name		= "405EX 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	{	/* 405EX Rev. C with Security */
1391		.pvr_mask		= 0xffff000f,
1392		.pvr_value		= 0x1291000f,
1393		.cpu_name		= "405EX Rev. C",
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	{	/* 405EX Rev. D without Security */
1404		.pvr_mask		= 0xffff000f,
1405		.pvr_value		= 0x12910003,
1406		.cpu_name		= "405EX 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	{	/* 405EX Rev. D with Security */
1417		.pvr_mask		= 0xffff000f,
1418		.pvr_value		= 0x12910005,
1419		.cpu_name		= "405EX Rev. D",
1420		.cpu_features		= CPU_FTRS_40X,
1421		.cpu_user_features	= PPC_FEATURE_32 |
1422			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1423		.mmu_features		= MMU_FTR_TYPE_40x,
1424		.icache_bsize		= 32,
1425		.dcache_bsize		= 32,
1426		.machine_check		= machine_check_4xx,
1427		.platform		= "ppc405",
1428	},
1429	{	/* 405EXr Rev. A/B without Security */
1430		.pvr_mask		= 0xffff000f,
1431		.pvr_value		= 0x12910001,
1432		.cpu_name		= "405EXr Rev. A/B",
1433		.cpu_features		= CPU_FTRS_40X,
1434		.cpu_user_features	= PPC_FEATURE_32 |
1435			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1436		.mmu_features		= MMU_FTR_TYPE_40x,
1437		.icache_bsize		= 32,
1438		.dcache_bsize		= 32,
1439		.machine_check		= machine_check_4xx,
1440		.platform		= "ppc405",
1441	},
1442	{	/* 405EXr Rev. C without Security */
1443		.pvr_mask		= 0xffff000f,
1444		.pvr_value		= 0x12910009,
1445		.cpu_name		= "405EXr Rev. C",
1446		.cpu_features		= CPU_FTRS_40X,
1447		.cpu_user_features	= PPC_FEATURE_32 |
1448			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1449		.mmu_features		= MMU_FTR_TYPE_40x,
1450		.icache_bsize		= 32,
1451		.dcache_bsize		= 32,
1452		.machine_check		= machine_check_4xx,
1453		.platform		= "ppc405",
1454	},
1455	{	/* 405EXr Rev. C with Security */
1456		.pvr_mask		= 0xffff000f,
1457		.pvr_value		= 0x1291000b,
1458		.cpu_name		= "405EXr Rev. C",
1459		.cpu_features		= CPU_FTRS_40X,
1460		.cpu_user_features	= PPC_FEATURE_32 |
1461			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1462		.mmu_features		= MMU_FTR_TYPE_40x,
1463		.icache_bsize		= 32,
1464		.dcache_bsize		= 32,
1465		.machine_check		= machine_check_4xx,
1466		.platform		= "ppc405",
1467	},
1468	{	/* 405EXr Rev. D without Security */
1469		.pvr_mask		= 0xffff000f,
1470		.pvr_value		= 0x12910000,
1471		.cpu_name		= "405EXr Rev. D",
1472		.cpu_features		= CPU_FTRS_40X,
1473		.cpu_user_features	= PPC_FEATURE_32 |
1474			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1475		.mmu_features		= MMU_FTR_TYPE_40x,
1476		.icache_bsize		= 32,
1477		.dcache_bsize		= 32,
1478		.machine_check		= machine_check_4xx,
1479		.platform		= "ppc405",
1480	},
1481	{	/* 405EXr Rev. D with Security */
1482		.pvr_mask		= 0xffff000f,
1483		.pvr_value		= 0x12910002,
1484		.cpu_name		= "405EXr Rev. D",
1485		.cpu_features		= CPU_FTRS_40X,
1486		.cpu_user_features	= PPC_FEATURE_32 |
1487			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1488		.mmu_features		= MMU_FTR_TYPE_40x,
1489		.icache_bsize		= 32,
1490		.dcache_bsize		= 32,
1491		.machine_check		= machine_check_4xx,
1492		.platform		= "ppc405",
1493	},
1494	{
1495		/* 405EZ */
1496		.pvr_mask		= 0xffff0000,
1497		.pvr_value		= 0x41510000,
1498		.cpu_name		= "405EZ",
1499		.cpu_features		= CPU_FTRS_40X,
1500		.cpu_user_features	= PPC_FEATURE_32 |
1501			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1502		.mmu_features		= MMU_FTR_TYPE_40x,
1503		.icache_bsize		= 32,
1504		.dcache_bsize		= 32,
1505		.machine_check		= machine_check_4xx,
1506		.platform		= "ppc405",
1507	},
1508	{	/* default match */
1509		.pvr_mask		= 0x00000000,
1510		.pvr_value		= 0x00000000,
1511		.cpu_name		= "(generic 40x PPC)",
1512		.cpu_features		= CPU_FTRS_40X,
1513		.cpu_user_features	= PPC_FEATURE_32 |
1514			PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
1515		.mmu_features		= MMU_FTR_TYPE_40x,
1516		.icache_bsize		= 32,
1517		.dcache_bsize		= 32,
1518		.machine_check		= machine_check_4xx,
1519		.platform		= "ppc405",
1520	}
1521
1522#endif /* CONFIG_40x */
1523#ifdef CONFIG_44x
1524	{
1525		.pvr_mask		= 0xf0000fff,
1526		.pvr_value		= 0x40000850,
1527		.cpu_name		= "440GR Rev. A",
1528		.cpu_features		= CPU_FTRS_44X,
1529		.cpu_user_features	= COMMON_USER_BOOKE,
1530		.mmu_features		= MMU_FTR_TYPE_44x,
1531		.icache_bsize		= 32,
1532		.dcache_bsize		= 32,
1533		.machine_check		= machine_check_4xx,
1534		.platform		= "ppc440",
1535	},
1536	{ /* Use logical PVR for 440EP (logical pvr = pvr | 0x8) */
1537		.pvr_mask		= 0xf0000fff,
1538		.pvr_value		= 0x40000858,
1539		.cpu_name		= "440EP Rev. A",
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_440ep,
1546		.machine_check		= machine_check_4xx,
1547		.platform		= "ppc440",
1548	},
1549	{
1550		.pvr_mask		= 0xf0000fff,
1551		.pvr_value		= 0x400008d3,
1552		.cpu_name		= "440GR Rev. B",
1553		.cpu_features		= CPU_FTRS_44X,
1554		.cpu_user_features	= COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1555		.mmu_features		= MMU_FTR_TYPE_44x,
1556		.icache_bsize		= 32,
1557		.dcache_bsize		= 32,
1558		.machine_check		= machine_check_4xx,
1559		.platform		= "ppc440",
1560	},
1561	{ /* Matches both physical and logical PVR for 440EP (logical pvr = pvr | 0x8) */
1562		.pvr_mask		= 0xf0000ff7,
1563		.pvr_value		= 0x400008d4,
1564		.cpu_name		= "440EP Rev. C",
1565		.cpu_features		= CPU_FTRS_44X,
1566		.cpu_user_features	= COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1567		.mmu_features		= MMU_FTR_TYPE_44x,
1568		.icache_bsize		= 32,
1569		.dcache_bsize		= 32,
1570		.cpu_setup		= __setup_cpu_440ep,
1571		.machine_check		= machine_check_4xx,
1572		.platform		= "ppc440",
1573	},
1574	{ /* Use logical PVR for 440EP (logical pvr = pvr | 0x8) */
1575		.pvr_mask		= 0xf0000fff,
1576		.pvr_value		= 0x400008db,
1577		.cpu_name		= "440EP Rev. B",
1578		.cpu_features		= CPU_FTRS_44X,
1579		.cpu_user_features	= COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1580		.mmu_features		= MMU_FTR_TYPE_44x,
1581		.icache_bsize		= 32,
1582		.dcache_bsize		= 32,
1583		.cpu_setup		= __setup_cpu_440ep,
1584		.machine_check		= machine_check_4xx,
1585		.platform		= "ppc440",
1586	},
1587	{ /* 440GRX */
1588		.pvr_mask		= 0xf0000ffb,
1589		.pvr_value		= 0x200008D0,
1590		.cpu_name		= "440GRX",
1591		.cpu_features		= CPU_FTRS_44X,
1592		.cpu_user_features	= COMMON_USER_BOOKE,
1593		.mmu_features		= MMU_FTR_TYPE_44x,
1594		.icache_bsize		= 32,
1595		.dcache_bsize		= 32,
1596		.cpu_setup		= __setup_cpu_440grx,
1597		.machine_check		= machine_check_440A,
1598		.platform		= "ppc440",
1599	},
1600	{ /* Use logical PVR for 440EPx (logical pvr = pvr | 0x8) */
1601		.pvr_mask		= 0xf0000ffb,
1602		.pvr_value		= 0x200008D8,
1603		.cpu_name		= "440EPX",
1604		.cpu_features		= CPU_FTRS_44X,
1605		.cpu_user_features	= COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1606		.mmu_features		= MMU_FTR_TYPE_44x,
1607		.icache_bsize		= 32,
1608		.dcache_bsize		= 32,
1609		.cpu_setup		= __setup_cpu_440epx,
1610		.machine_check		= machine_check_440A,
1611		.platform		= "ppc440",
1612	},
1613	{	/* 440GP Rev. B */
1614		.pvr_mask		= 0xf0000fff,
1615		.pvr_value		= 0x40000440,
1616		.cpu_name		= "440GP Rev. B",
1617		.cpu_features		= CPU_FTRS_44X,
1618		.cpu_user_features	= COMMON_USER_BOOKE,
1619		.mmu_features		= MMU_FTR_TYPE_44x,
1620		.icache_bsize		= 32,
1621		.dcache_bsize		= 32,
1622		.machine_check		= machine_check_4xx,
1623		.platform		= "ppc440gp",
1624	},
1625	{	/* 440GP Rev. C */
1626		.pvr_mask		= 0xf0000fff,
1627		.pvr_value		= 0x40000481,
1628		.cpu_name		= "440GP Rev. C",
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		= "ppc440gp",
1636	},
1637	{ /* 440GX Rev. A */
1638		.pvr_mask		= 0xf0000fff,
1639		.pvr_value		= 0x50000850,
1640		.cpu_name		= "440GX 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_440gx,
1647		.machine_check		= machine_check_440A,
1648		.platform		= "ppc440",
1649	},
1650	{ /* 440GX Rev. B */
1651		.pvr_mask		= 0xf0000fff,
1652		.pvr_value		= 0x50000851,
1653		.cpu_name		= "440GX 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_440gx,
1660		.machine_check		= machine_check_440A,
1661		.platform		= "ppc440",
1662	},
1663	{ /* 440GX Rev. C */
1664		.pvr_mask		= 0xf0000fff,
1665		.pvr_value		= 0x50000892,
1666		.cpu_name		= "440GX Rev. C",
1667		.cpu_features		= CPU_FTRS_44X,
1668		.cpu_user_features	= COMMON_USER_BOOKE,
1669		.mmu_features		= MMU_FTR_TYPE_44x,
1670		.icache_bsize		= 32,
1671		.dcache_bsize		= 32,
1672		.cpu_setup		= __setup_cpu_440gx,
1673		.machine_check		= machine_check_440A,
1674		.platform		= "ppc440",
1675	},
1676	{ /* 440GX Rev. F */
1677		.pvr_mask		= 0xf0000fff,
1678		.pvr_value		= 0x50000894,
1679		.cpu_name		= "440GX Rev. F",
1680		.cpu_features		= CPU_FTRS_44X,
1681		.cpu_user_features	= COMMON_USER_BOOKE,
1682		.mmu_features		= MMU_FTR_TYPE_44x,
1683		.icache_bsize		= 32,
1684		.dcache_bsize		= 32,
1685		.cpu_setup		= __setup_cpu_440gx,
1686		.machine_check		= machine_check_440A,
1687		.platform		= "ppc440",
1688	},
1689	{ /* 440SP Rev. A */
1690		.pvr_mask		= 0xfff00fff,
1691		.pvr_value		= 0x53200891,
1692		.cpu_name		= "440SP Rev. A",
1693		.cpu_features		= CPU_FTRS_44X,
1694		.cpu_user_features	= COMMON_USER_BOOKE,
1695		.mmu_features		= MMU_FTR_TYPE_44x,
1696		.icache_bsize		= 32,
1697		.dcache_bsize		= 32,
1698		.machine_check		= machine_check_4xx,
1699		.platform		= "ppc440",
1700	},
1701	{ /* 440SPe Rev. A */
1702		.pvr_mask               = 0xfff00fff,
1703		.pvr_value              = 0x53400890,
1704		.cpu_name               = "440SPe Rev. A",
1705		.cpu_features		= CPU_FTRS_44X,
1706		.cpu_user_features      = COMMON_USER_BOOKE,
1707		.mmu_features		= MMU_FTR_TYPE_44x,
1708		.icache_bsize           = 32,
1709		.dcache_bsize           = 32,
1710		.cpu_setup		= __setup_cpu_440spe,
1711		.machine_check		= machine_check_440A,
1712		.platform               = "ppc440",
1713	},
1714	{ /* 440SPe Rev. B */
1715		.pvr_mask		= 0xfff00fff,
1716		.pvr_value		= 0x53400891,
1717		.cpu_name		= "440SPe Rev. B",
1718		.cpu_features		= CPU_FTRS_44X,
1719		.cpu_user_features	= COMMON_USER_BOOKE,
1720		.mmu_features		= MMU_FTR_TYPE_44x,
1721		.icache_bsize		= 32,
1722		.dcache_bsize		= 32,
1723		.cpu_setup		= __setup_cpu_440spe,
1724		.machine_check		= machine_check_440A,
1725		.platform		= "ppc440",
1726	},
1727	{ /* 440 in Xilinx Virtex-5 FXT */
1728		.pvr_mask		= 0xfffffff0,
1729		.pvr_value		= 0x7ff21910,
1730		.cpu_name		= "440 in Virtex-5 FXT",
1731		.cpu_features		= CPU_FTRS_44X,
1732		.cpu_user_features	= COMMON_USER_BOOKE,
1733		.mmu_features		= MMU_FTR_TYPE_44x,
1734		.icache_bsize		= 32,
1735		.dcache_bsize		= 32,
1736		.cpu_setup		= __setup_cpu_440x5,
1737		.machine_check		= machine_check_440A,
1738		.platform		= "ppc440",
1739	},
1740	{ /* 460EX */
1741		.pvr_mask		= 0xffff0006,
1742		.pvr_value		= 0x13020002,
1743		.cpu_name		= "460EX",
1744		.cpu_features		= CPU_FTRS_440x6,
1745		.cpu_user_features	= COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1746		.mmu_features		= MMU_FTR_TYPE_44x,
1747		.icache_bsize		= 32,
1748		.dcache_bsize		= 32,
1749		.cpu_setup		= __setup_cpu_460ex,
1750		.machine_check		= machine_check_440A,
1751		.platform		= "ppc440",
1752	},
1753	{ /* 460EX Rev B */
1754		.pvr_mask		= 0xffff0007,
1755		.pvr_value		= 0x13020004,
1756		.cpu_name		= "460EX Rev. B",
1757		.cpu_features		= CPU_FTRS_440x6,
1758		.cpu_user_features	= COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1759		.mmu_features		= MMU_FTR_TYPE_44x,
1760		.icache_bsize		= 32,
1761		.dcache_bsize		= 32,
1762		.cpu_setup		= __setup_cpu_460ex,
1763		.machine_check		= machine_check_440A,
1764		.platform		= "ppc440",
1765	},
1766	{ /* 460GT */
1767		.pvr_mask		= 0xffff0006,
1768		.pvr_value		= 0x13020000,
1769		.cpu_name		= "460GT",
1770		.cpu_features		= CPU_FTRS_440x6,
1771		.cpu_user_features	= COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1772		.mmu_features		= MMU_FTR_TYPE_44x,
1773		.icache_bsize		= 32,
1774		.dcache_bsize		= 32,
1775		.cpu_setup		= __setup_cpu_460gt,
1776		.machine_check		= machine_check_440A,
1777		.platform		= "ppc440",
1778	},
1779	{ /* 460GT Rev B */
1780		.pvr_mask		= 0xffff0007,
1781		.pvr_value		= 0x13020005,
1782		.cpu_name		= "460GT Rev. B",
1783		.cpu_features		= CPU_FTRS_440x6,
1784		.cpu_user_features	= COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1785		.mmu_features		= MMU_FTR_TYPE_44x,
1786		.icache_bsize		= 32,
1787		.dcache_bsize		= 32,
1788		.cpu_setup		= __setup_cpu_460gt,
1789		.machine_check		= machine_check_440A,
1790		.platform		= "ppc440",
1791	},
1792	{ /* 460SX */
1793		.pvr_mask		= 0xffffff00,
1794		.pvr_value		= 0x13541800,
1795		.cpu_name		= "460SX",
1796		.cpu_features		= CPU_FTRS_44X,
1797		.cpu_user_features	= COMMON_USER_BOOKE,
1798		.mmu_features		= MMU_FTR_TYPE_44x,
1799		.icache_bsize		= 32,
1800		.dcache_bsize		= 32,
1801		.cpu_setup		= __setup_cpu_460sx,
1802		.machine_check		= machine_check_440A,
1803		.platform		= "ppc440",
1804	},
1805	{ /* 464 in APM821xx */
1806		.pvr_mask		= 0xffffff00,
1807		.pvr_value		= 0x12C41C80,
1808		.cpu_name		= "APM821XX",
1809		.cpu_features		= CPU_FTRS_44X,
1810		.cpu_user_features	= COMMON_USER_BOOKE |
1811			PPC_FEATURE_HAS_FPU,
1812		.mmu_features		= MMU_FTR_TYPE_44x,
1813		.icache_bsize		= 32,
1814		.dcache_bsize		= 32,
1815		.cpu_setup		= __setup_cpu_apm821xx,
1816		.machine_check		= machine_check_440A,
1817		.platform		= "ppc440",
1818	},
1819	{ /* 476 DD2 core */
1820		.pvr_mask		= 0xffffffff,
1821		.pvr_value		= 0x11a52080,
1822		.cpu_name		= "476",
1823		.cpu_features		= CPU_FTRS_47X | CPU_FTR_476_DD2,
1824		.cpu_user_features	= COMMON_USER_BOOKE |
1825			PPC_FEATURE_HAS_FPU,
1826		.mmu_features		= MMU_FTR_TYPE_47x |
1827			MMU_FTR_USE_TLBIVAX_BCAST | MMU_FTR_LOCK_BCAST_INVAL,
1828		.icache_bsize		= 32,
1829		.dcache_bsize		= 128,
1830		.machine_check		= machine_check_47x,
1831		.platform		= "ppc470",
1832	},
1833	{ /* 476 iss */
1834		.pvr_mask		= 0xffff0000,
1835		.pvr_value		= 0x00050000,
1836		.cpu_name		= "476",
1837		.cpu_features		= CPU_FTRS_47X,
1838		.cpu_user_features	= COMMON_USER_BOOKE |
1839			PPC_FEATURE_HAS_FPU,
1840		.mmu_features		= MMU_FTR_TYPE_47x |
1841			MMU_FTR_USE_TLBIVAX_BCAST | MMU_FTR_LOCK_BCAST_INVAL,
1842		.icache_bsize		= 32,
1843		.dcache_bsize		= 128,
1844		.machine_check		= machine_check_47x,
1845		.platform		= "ppc470",
1846	},
1847	{ /* 476 others */
1848		.pvr_mask		= 0xffff0000,
1849		.pvr_value		= 0x11a50000,
1850		.cpu_name		= "476",
1851		.cpu_features		= CPU_FTRS_47X,
1852		.cpu_user_features	= COMMON_USER_BOOKE |
1853			PPC_FEATURE_HAS_FPU,
1854		.mmu_features		= MMU_FTR_TYPE_47x |
1855			MMU_FTR_USE_TLBIVAX_BCAST | MMU_FTR_LOCK_BCAST_INVAL,
1856		.icache_bsize		= 32,
1857		.dcache_bsize		= 128,
1858		.machine_check		= machine_check_47x,
1859		.platform		= "ppc470",
1860	},
1861	{	/* default match */
1862		.pvr_mask		= 0x00000000,
1863		.pvr_value		= 0x00000000,
1864		.cpu_name		= "(generic 44x PPC)",
1865		.cpu_features		= CPU_FTRS_44X,
1866		.cpu_user_features	= COMMON_USER_BOOKE,
1867		.mmu_features		= MMU_FTR_TYPE_44x,
1868		.icache_bsize		= 32,
1869		.dcache_bsize		= 32,
1870		.machine_check		= machine_check_4xx,
1871		.platform		= "ppc440",
1872	}
1873#endif /* CONFIG_44x */
1874#ifdef CONFIG_E200
1875	{	/* e200z5 */
1876		.pvr_mask		= 0xfff00000,
1877		.pvr_value		= 0x81000000,
1878		.cpu_name		= "e200z5",
1879		/* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
1880		.cpu_features		= CPU_FTRS_E200,
1881		.cpu_user_features	= COMMON_USER_BOOKE |
1882			PPC_FEATURE_HAS_EFP_SINGLE |
1883			PPC_FEATURE_UNIFIED_CACHE,
1884		.mmu_features		= MMU_FTR_TYPE_FSL_E,
1885		.dcache_bsize		= 32,
1886		.machine_check		= machine_check_e200,
1887		.platform		= "ppc5554",
1888	},
1889	{	/* e200z6 */
1890		.pvr_mask		= 0xfff00000,
1891		.pvr_value		= 0x81100000,
1892		.cpu_name		= "e200z6",
1893		/* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
1894		.cpu_features		= CPU_FTRS_E200,
1895		.cpu_user_features	= COMMON_USER_BOOKE |
1896			PPC_FEATURE_HAS_SPE_COMP |
1897			PPC_FEATURE_HAS_EFP_SINGLE_COMP |
1898			PPC_FEATURE_UNIFIED_CACHE,
1899		.mmu_features		= MMU_FTR_TYPE_FSL_E,
1900		.dcache_bsize		= 32,
1901		.machine_check		= machine_check_e200,
1902		.platform		= "ppc5554",
1903	},
1904	{	/* default match */
1905		.pvr_mask		= 0x00000000,
1906		.pvr_value		= 0x00000000,
1907		.cpu_name		= "(generic E200 PPC)",
1908		.cpu_features		= CPU_FTRS_E200,
1909		.cpu_user_features	= COMMON_USER_BOOKE |
1910			PPC_FEATURE_HAS_EFP_SINGLE |
1911			PPC_FEATURE_UNIFIED_CACHE,
1912		.mmu_features		= MMU_FTR_TYPE_FSL_E,
1913		.dcache_bsize		= 32,
1914		.cpu_setup		= __setup_cpu_e200,
1915		.machine_check		= machine_check_e200,
1916		.platform		= "ppc5554",
1917	}
1918#endif /* CONFIG_E200 */
1919#endif /* CONFIG_PPC32 */
1920#ifdef CONFIG_E500
1921#ifdef CONFIG_PPC32
1922	{	/* e500 */
1923		.pvr_mask		= 0xffff0000,
1924		.pvr_value		= 0x80200000,
1925		.cpu_name		= "e500",
1926		.cpu_features		= CPU_FTRS_E500,
1927		.cpu_user_features	= COMMON_USER_BOOKE |
1928			PPC_FEATURE_HAS_SPE_COMP |
1929			PPC_FEATURE_HAS_EFP_SINGLE_COMP,
1930		.mmu_features		= MMU_FTR_TYPE_FSL_E,
1931		.icache_bsize		= 32,
1932		.dcache_bsize		= 32,
1933		.num_pmcs		= 4,
1934		.oprofile_cpu_type	= "ppc/e500",
1935		.oprofile_type		= PPC_OPROFILE_FSL_EMB,
1936		.cpu_setup		= __setup_cpu_e500v1,
1937		.machine_check		= machine_check_e500,
1938		.platform		= "ppc8540",
1939	},
1940	{	/* e500v2 */
1941		.pvr_mask		= 0xffff0000,
1942		.pvr_value		= 0x80210000,
1943		.cpu_name		= "e500v2",
1944		.cpu_features		= CPU_FTRS_E500_2,
1945		.cpu_user_features	= COMMON_USER_BOOKE |
1946			PPC_FEATURE_HAS_SPE_COMP |
1947			PPC_FEATURE_HAS_EFP_SINGLE_COMP |
1948			PPC_FEATURE_HAS_EFP_DOUBLE_COMP,
1949		.mmu_features		= MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS,
1950		.icache_bsize		= 32,
1951		.dcache_bsize		= 32,
1952		.num_pmcs		= 4,
1953		.oprofile_cpu_type	= "ppc/e500",
1954		.oprofile_type		= PPC_OPROFILE_FSL_EMB,
1955		.cpu_setup		= __setup_cpu_e500v2,
1956		.machine_check		= machine_check_e500,
1957		.platform		= "ppc8548",
1958	},
1959	{	/* e500mc */
1960		.pvr_mask		= 0xffff0000,
1961		.pvr_value		= 0x80230000,
1962		.cpu_name		= "e500mc",
1963		.cpu_features		= CPU_FTRS_E500MC,
1964		.cpu_user_features	= COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1965		.mmu_features		= MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS |
1966			MMU_FTR_USE_TLBILX,
1967		.icache_bsize		= 64,
1968		.dcache_bsize		= 64,
1969		.num_pmcs		= 4,
1970		.oprofile_cpu_type	= "ppc/e500mc",
1971		.oprofile_type		= PPC_OPROFILE_FSL_EMB,
1972		.cpu_setup		= __setup_cpu_e500mc,
1973		.machine_check		= machine_check_e500mc,
1974		.platform		= "ppce500mc",
1975	},
1976#endif /* CONFIG_PPC32 */
1977	{	/* e5500 */
1978		.pvr_mask		= 0xffff0000,
1979		.pvr_value		= 0x80240000,
1980		.cpu_name		= "e5500",
1981		.cpu_features		= CPU_FTRS_E5500,
1982		.cpu_user_features	= COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1983		.mmu_features		= MMU_FTR_TYPE_FSL_E | MMU_FTR_BIG_PHYS |
1984			MMU_FTR_USE_TLBILX,
1985		.icache_bsize		= 64,
1986		.dcache_bsize		= 64,
1987		.num_pmcs		= 4,
1988		.oprofile_cpu_type	= "ppc/e500mc",
1989		.oprofile_type		= PPC_OPROFILE_FSL_EMB,
1990		.cpu_setup		= __setup_cpu_e5500,
1991		.cpu_restore		= __restore_cpu_e5500,
1992		.machine_check		= machine_check_e500mc,
1993		.platform		= "ppce5500",
1994	},
1995#ifdef CONFIG_PPC32
1996	{	/* default match */
1997		.pvr_mask		= 0x00000000,
1998		.pvr_value		= 0x00000000,
1999		.cpu_name		= "(generic E500 PPC)",
2000		.cpu_features		= CPU_FTRS_E500,
2001		.cpu_user_features	= COMMON_USER_BOOKE |
2002			PPC_FEATURE_HAS_SPE_COMP |
2003			PPC_FEATURE_HAS_EFP_SINGLE_COMP,
2004		.mmu_features		= MMU_FTR_TYPE_FSL_E,
2005		.icache_bsize		= 32,
2006		.dcache_bsize		= 32,
2007		.machine_check		= machine_check_e500,
2008		.platform		= "powerpc",
2009	}
2010#endif /* CONFIG_PPC32 */
2011#endif /* CONFIG_E500 */
2012
2013#ifdef CONFIG_PPC_A2
2014	{	/* Standard A2 (>= DD2) + FPU core */
2015		.pvr_mask		= 0xffff0000,
2016		.pvr_value		= 0x00480000,
2017		.cpu_name		= "A2 (>= DD2)",
2018		.cpu_features		= CPU_FTRS_A2,
2019		.cpu_user_features	= COMMON_USER_PPC64,
2020		.mmu_features		= MMU_FTRS_A2,
2021		.icache_bsize		= 64,
2022		.dcache_bsize		= 64,
2023		.num_pmcs		= 0,
2024		.cpu_setup		= __setup_cpu_a2,
2025		.cpu_restore		= __restore_cpu_a2,
2026		.machine_check		= machine_check_generic,
2027		.platform		= "ppca2",
2028	},
2029	{	/* This is a default entry to get going, to be replaced by
2030		 * a real one at some stage
2031		 */
2032#define CPU_FTRS_BASE_BOOK3E	(CPU_FTR_USE_TB | \
2033	    CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_SMT | \
2034	    CPU_FTR_NODSISRALIGN | CPU_FTR_NOEXECUTE)
2035		.pvr_mask		= 0x00000000,
2036		.pvr_value		= 0x00000000,
2037		.cpu_name		= "Book3E",
2038		.cpu_features		= CPU_FTRS_BASE_BOOK3E,
2039		.cpu_user_features	= COMMON_USER_PPC64,
2040		.mmu_features		= MMU_FTR_TYPE_3E | MMU_FTR_USE_TLBILX |
2041					  MMU_FTR_USE_TLBIVAX_BCAST |
2042					  MMU_FTR_LOCK_BCAST_INVAL,
2043		.icache_bsize		= 64,
2044		.dcache_bsize		= 64,
2045		.num_pmcs		= 0,
2046		.machine_check		= machine_check_generic,
2047		.platform		= "power6",
2048	},
2049#endif /* CONFIG_PPC_A2 */
2050};
2051
2052static struct cpu_spec the_cpu_spec;
2053
2054static struct cpu_spec * __init setup_cpu_spec(unsigned long offset,
2055					       struct cpu_spec *s)
2056{
2057	struct cpu_spec *t = &the_cpu_spec;
2058	struct cpu_spec old;
2059
2060	t = PTRRELOC(t);
2061	old = *t;
2062
2063	/* Copy everything, then do fixups */
2064	*t = *s;
 
 
 
2065
2066	/*
2067	 * If we are overriding a previous value derived from the real
2068	 * PVR with a new value obtained using a logical PVR value,
2069	 * don't modify the performance monitor fields.
2070	 */
2071	if (old.num_pmcs && !s->num_pmcs) {
2072		t->num_pmcs = old.num_pmcs;
2073		t->pmc_type = old.pmc_type;
2074		t->oprofile_type = old.oprofile_type;
2075		t->oprofile_mmcra_sihv = old.oprofile_mmcra_sihv;
2076		t->oprofile_mmcra_sipr = old.oprofile_mmcra_sipr;
2077		t->oprofile_mmcra_clear = old.oprofile_mmcra_clear;
2078
2079		/*
2080		 * If we have passed through this logic once before and
2081		 * have pulled the default case because the real PVR was
2082		 * not found inside cpu_specs[], then we are possibly
2083		 * running in compatibility mode. In that case, let the
2084		 * oprofiler know which set of compatibility counters to
2085		 * pull from by making sure the oprofile_cpu_type string
2086		 * is set to that of compatibility mode. If the
2087		 * oprofile_cpu_type already has a value, then we are
2088		 * possibly overriding a real PVR with a logical one,
2089		 * and, in that case, keep the current value for
2090		 * oprofile_cpu_type.
2091		 */
2092		if (old.oprofile_cpu_type != NULL) {
2093			t->oprofile_cpu_type = old.oprofile_cpu_type;
2094			t->oprofile_type = old.oprofile_type;
2095		}
2096	}
2097
2098	*PTRRELOC(&cur_cpu_spec) = &the_cpu_spec;
2099
2100	/*
2101	 * Set the base platform string once; assumes
2102	 * we're called with real pvr first.
2103	 */
2104	if (*PTRRELOC(&powerpc_base_platform) == NULL)
2105		*PTRRELOC(&powerpc_base_platform) = t->platform;
2106
2107#if defined(CONFIG_PPC64) || defined(CONFIG_BOOKE)
2108	/* ppc64 and booke expect identify_cpu to also call setup_cpu for
2109	 * that processor. I will consolidate that at a later time, for now,
2110	 * just use #ifdef. We also don't need to PTRRELOC the function
2111	 * pointer on ppc64 and booke as we are running at 0 in real mode
2112	 * on ppc64 and reloc_offset is always 0 on booke.
2113	 */
2114	if (t->cpu_setup) {
2115		t->cpu_setup(offset, t);
2116	}
2117#endif /* CONFIG_PPC64 || CONFIG_BOOKE */
2118
2119	return t;
2120}
2121
2122struct cpu_spec * __init identify_cpu(unsigned long offset, unsigned int pvr)
2123{
2124	struct cpu_spec *s = cpu_specs;
2125	int i;
2126
 
 
2127	s = PTRRELOC(s);
2128
2129	for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++) {
2130		if ((pvr & s->pvr_mask) == s->pvr_value)
2131			return setup_cpu_spec(offset, s);
2132	}
2133
2134	BUG();
2135
2136	return NULL;
2137}