[POWERPC] cell: Add oprofile support
[pandora-kernel.git] / arch / powerpc / kernel / cputable.c
1 /*
2  *  Copyright (C) 2001 Ben. Herrenschmidt (benh@kernel.crashing.org)
3  *
4  *  Modifications for ppc64:
5  *      Copyright (C) 2003 Dave Engebretsen <engebret@us.ibm.com>
6  *
7  *  This program is free software; you can redistribute it and/or
8  *  modify it under the terms of the GNU General Public License
9  *  as published by the Free Software Foundation; either version
10  *  2 of the License, or (at your option) any later version.
11  */
12
13 #include <linux/string.h>
14 #include <linux/sched.h>
15 #include <linux/threads.h>
16 #include <linux/init.h>
17 #include <linux/module.h>
18
19 #include <asm/oprofile_impl.h>
20 #include <asm/cputable.h>
21 #include <asm/prom.h>           /* for PTRRELOC on ARCH=ppc */
22
23 struct cpu_spec* cur_cpu_spec = NULL;
24 EXPORT_SYMBOL(cur_cpu_spec);
25
26 /* NOTE:
27  * Unlike ppc32, ppc64 will only call this once for the boot CPU, it's
28  * the responsibility of the appropriate CPU save/restore functions to
29  * eventually copy these settings over. Those save/restore aren't yet
30  * part of the cputable though. That has to be fixed for both ppc32
31  * and ppc64
32  */
33 #ifdef CONFIG_PPC32
34 extern void __setup_cpu_603(unsigned long offset, struct cpu_spec* spec);
35 extern void __setup_cpu_604(unsigned long offset, struct cpu_spec* spec);
36 extern void __setup_cpu_750(unsigned long offset, struct cpu_spec* spec);
37 extern void __setup_cpu_750cx(unsigned long offset, struct cpu_spec* spec);
38 extern void __setup_cpu_750fx(unsigned long offset, struct cpu_spec* spec);
39 extern void __setup_cpu_7400(unsigned long offset, struct cpu_spec* spec);
40 extern void __setup_cpu_7410(unsigned long offset, struct cpu_spec* spec);
41 extern void __setup_cpu_745x(unsigned long offset, struct cpu_spec* spec);
42 #endif /* CONFIG_PPC32 */
43 #ifdef CONFIG_PPC64
44 extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec);
45 extern void __setup_cpu_ppc970MP(unsigned long offset, struct cpu_spec* spec);
46 extern void __restore_cpu_ppc970(void);
47 #endif /* CONFIG_PPC64 */
48
49 /* This table only contains "desktop" CPUs, it need to be filled with embedded
50  * ones as well...
51  */
52 #define COMMON_USER             (PPC_FEATURE_32 | PPC_FEATURE_HAS_FPU | \
53                                  PPC_FEATURE_HAS_MMU)
54 #define COMMON_USER_PPC64       (COMMON_USER | PPC_FEATURE_64)
55 #define COMMON_USER_POWER4      (COMMON_USER_PPC64 | PPC_FEATURE_POWER4)
56 #define COMMON_USER_POWER5      (COMMON_USER_PPC64 | PPC_FEATURE_POWER5 |\
57                                  PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP)
58 #define COMMON_USER_POWER5_PLUS (COMMON_USER_PPC64 | PPC_FEATURE_POWER5_PLUS|\
59                                  PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP)
60 #define COMMON_USER_POWER6      (COMMON_USER_PPC64 | PPC_FEATURE_ARCH_2_05 |\
61                                  PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP | \
62                                  PPC_FEATURE_TRUE_LE)
63 #define COMMON_USER_PA6T        (COMMON_USER_PPC64 | PPC_FEATURE_PA6T |\
64                                  PPC_FEATURE_TRUE_LE | \
65                                  PPC_FEATURE_HAS_ALTIVEC_COMP)
66 #define COMMON_USER_BOOKE       (PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | \
67                                  PPC_FEATURE_BOOKE)
68
69 /* We only set the spe features if the kernel was compiled with
70  * spe support
71  */
72 #ifdef CONFIG_SPE
73 #define PPC_FEATURE_SPE_COMP    PPC_FEATURE_HAS_SPE
74 #else
75 #define PPC_FEATURE_SPE_COMP    0
76 #endif
77
78 static struct cpu_spec cpu_specs[] = {
79 #ifdef CONFIG_PPC64
80         {       /* Power3 */
81                 .pvr_mask               = 0xffff0000,
82                 .pvr_value              = 0x00400000,
83                 .cpu_name               = "POWER3 (630)",
84                 .cpu_features           = CPU_FTRS_POWER3,
85                 .cpu_user_features      = COMMON_USER_PPC64|PPC_FEATURE_PPC_LE,
86                 .icache_bsize           = 128,
87                 .dcache_bsize           = 128,
88                 .num_pmcs               = 8,
89                 .oprofile_cpu_type      = "ppc64/power3",
90                 .oprofile_type          = PPC_OPROFILE_RS64,
91                 .platform               = "power3",
92         },
93         {       /* Power3+ */
94                 .pvr_mask               = 0xffff0000,
95                 .pvr_value              = 0x00410000,
96                 .cpu_name               = "POWER3 (630+)",
97                 .cpu_features           = CPU_FTRS_POWER3,
98                 .cpu_user_features      = COMMON_USER_PPC64|PPC_FEATURE_PPC_LE,
99                 .icache_bsize           = 128,
100                 .dcache_bsize           = 128,
101                 .num_pmcs               = 8,
102                 .oprofile_cpu_type      = "ppc64/power3",
103                 .oprofile_type          = PPC_OPROFILE_RS64,
104                 .platform               = "power3",
105         },
106         {       /* Northstar */
107                 .pvr_mask               = 0xffff0000,
108                 .pvr_value              = 0x00330000,
109                 .cpu_name               = "RS64-II (northstar)",
110                 .cpu_features           = CPU_FTRS_RS64,
111                 .cpu_user_features      = COMMON_USER_PPC64,
112                 .icache_bsize           = 128,
113                 .dcache_bsize           = 128,
114                 .num_pmcs               = 8,
115                 .oprofile_cpu_type      = "ppc64/rs64",
116                 .oprofile_type          = PPC_OPROFILE_RS64,
117                 .platform               = "rs64",
118         },
119         {       /* Pulsar */
120                 .pvr_mask               = 0xffff0000,
121                 .pvr_value              = 0x00340000,
122                 .cpu_name               = "RS64-III (pulsar)",
123                 .cpu_features           = CPU_FTRS_RS64,
124                 .cpu_user_features      = COMMON_USER_PPC64,
125                 .icache_bsize           = 128,
126                 .dcache_bsize           = 128,
127                 .num_pmcs               = 8,
128                 .oprofile_cpu_type      = "ppc64/rs64",
129                 .oprofile_type          = PPC_OPROFILE_RS64,
130                 .platform               = "rs64",
131         },
132         {       /* I-star */
133                 .pvr_mask               = 0xffff0000,
134                 .pvr_value              = 0x00360000,
135                 .cpu_name               = "RS64-III (icestar)",
136                 .cpu_features           = CPU_FTRS_RS64,
137                 .cpu_user_features      = COMMON_USER_PPC64,
138                 .icache_bsize           = 128,
139                 .dcache_bsize           = 128,
140                 .num_pmcs               = 8,
141                 .oprofile_cpu_type      = "ppc64/rs64",
142                 .oprofile_type          = PPC_OPROFILE_RS64,
143                 .platform               = "rs64",
144         },
145         {       /* S-star */
146                 .pvr_mask               = 0xffff0000,
147                 .pvr_value              = 0x00370000,
148                 .cpu_name               = "RS64-IV (sstar)",
149                 .cpu_features           = CPU_FTRS_RS64,
150                 .cpu_user_features      = COMMON_USER_PPC64,
151                 .icache_bsize           = 128,
152                 .dcache_bsize           = 128,
153                 .num_pmcs               = 8,
154                 .oprofile_cpu_type      = "ppc64/rs64",
155                 .oprofile_type          = PPC_OPROFILE_RS64,
156                 .platform               = "rs64",
157         },
158         {       /* Power4 */
159                 .pvr_mask               = 0xffff0000,
160                 .pvr_value              = 0x00350000,
161                 .cpu_name               = "POWER4 (gp)",
162                 .cpu_features           = CPU_FTRS_POWER4,
163                 .cpu_user_features      = COMMON_USER_POWER4,
164                 .icache_bsize           = 128,
165                 .dcache_bsize           = 128,
166                 .num_pmcs               = 8,
167                 .oprofile_cpu_type      = "ppc64/power4",
168                 .oprofile_type          = PPC_OPROFILE_POWER4,
169                 .platform               = "power4",
170         },
171         {       /* Power4+ */
172                 .pvr_mask               = 0xffff0000,
173                 .pvr_value              = 0x00380000,
174                 .cpu_name               = "POWER4+ (gq)",
175                 .cpu_features           = CPU_FTRS_POWER4,
176                 .cpu_user_features      = COMMON_USER_POWER4,
177                 .icache_bsize           = 128,
178                 .dcache_bsize           = 128,
179                 .num_pmcs               = 8,
180                 .oprofile_cpu_type      = "ppc64/power4",
181                 .oprofile_type          = PPC_OPROFILE_POWER4,
182                 .platform               = "power4",
183         },
184         {       /* PPC970 */
185                 .pvr_mask               = 0xffff0000,
186                 .pvr_value              = 0x00390000,
187                 .cpu_name               = "PPC970",
188                 .cpu_features           = CPU_FTRS_PPC970,
189                 .cpu_user_features      = COMMON_USER_POWER4 |
190                         PPC_FEATURE_HAS_ALTIVEC_COMP,
191                 .icache_bsize           = 128,
192                 .dcache_bsize           = 128,
193                 .num_pmcs               = 8,
194                 .cpu_setup              = __setup_cpu_ppc970,
195                 .cpu_restore            = __restore_cpu_ppc970,
196                 .oprofile_cpu_type      = "ppc64/970",
197                 .oprofile_type          = PPC_OPROFILE_POWER4,
198                 .platform               = "ppc970",
199         },
200         {       /* PPC970FX */
201                 .pvr_mask               = 0xffff0000,
202                 .pvr_value              = 0x003c0000,
203                 .cpu_name               = "PPC970FX",
204                 .cpu_features           = CPU_FTRS_PPC970,
205                 .cpu_user_features      = COMMON_USER_POWER4 |
206                         PPC_FEATURE_HAS_ALTIVEC_COMP,
207                 .icache_bsize           = 128,
208                 .dcache_bsize           = 128,
209                 .num_pmcs               = 8,
210                 .cpu_setup              = __setup_cpu_ppc970,
211                 .cpu_restore            = __restore_cpu_ppc970,
212                 .oprofile_cpu_type      = "ppc64/970",
213                 .oprofile_type          = PPC_OPROFILE_POWER4,
214                 .platform               = "ppc970",
215         },
216         {       /* PPC970MP */
217                 .pvr_mask               = 0xffff0000,
218                 .pvr_value              = 0x00440000,
219                 .cpu_name               = "PPC970MP",
220                 .cpu_features           = CPU_FTRS_PPC970,
221                 .cpu_user_features      = COMMON_USER_POWER4 |
222                         PPC_FEATURE_HAS_ALTIVEC_COMP,
223                 .icache_bsize           = 128,
224                 .dcache_bsize           = 128,
225                 .num_pmcs               = 8,
226                 .cpu_setup              = __setup_cpu_ppc970MP,
227                 .cpu_restore            = __restore_cpu_ppc970,
228                 .oprofile_cpu_type      = "ppc64/970",
229                 .oprofile_type          = PPC_OPROFILE_POWER4,
230                 .platform               = "ppc970",
231         },
232         {       /* PPC970GX */
233                 .pvr_mask               = 0xffff0000,
234                 .pvr_value              = 0x00450000,
235                 .cpu_name               = "PPC970GX",
236                 .cpu_features           = CPU_FTRS_PPC970,
237                 .cpu_user_features      = COMMON_USER_POWER4 |
238                         PPC_FEATURE_HAS_ALTIVEC_COMP,
239                 .icache_bsize           = 128,
240                 .dcache_bsize           = 128,
241                 .num_pmcs               = 8,
242                 .cpu_setup              = __setup_cpu_ppc970,
243                 .oprofile_cpu_type      = "ppc64/970",
244                 .oprofile_type          = PPC_OPROFILE_POWER4,
245                 .platform               = "ppc970",
246         },
247         {       /* Power5 GR */
248                 .pvr_mask               = 0xffff0000,
249                 .pvr_value              = 0x003a0000,
250                 .cpu_name               = "POWER5 (gr)",
251                 .cpu_features           = CPU_FTRS_POWER5,
252                 .cpu_user_features      = COMMON_USER_POWER5,
253                 .icache_bsize           = 128,
254                 .dcache_bsize           = 128,
255                 .num_pmcs               = 6,
256                 .oprofile_cpu_type      = "ppc64/power5",
257                 .oprofile_type          = PPC_OPROFILE_POWER4,
258                 /* SIHV / SIPR bits are implemented on POWER4+ (GQ)
259                  * and above but only works on POWER5 and above
260                  */
261                 .oprofile_mmcra_sihv    = MMCRA_SIHV,
262                 .oprofile_mmcra_sipr    = MMCRA_SIPR,
263                 .platform               = "power5",
264         },
265         {       /* Power5 GS */
266                 .pvr_mask               = 0xffff0000,
267                 .pvr_value              = 0x003b0000,
268                 .cpu_name               = "POWER5+ (gs)",
269                 .cpu_features           = CPU_FTRS_POWER5,
270                 .cpu_user_features      = COMMON_USER_POWER5_PLUS,
271                 .icache_bsize           = 128,
272                 .dcache_bsize           = 128,
273                 .num_pmcs               = 6,
274                 .oprofile_cpu_type      = "ppc64/power5+",
275                 .oprofile_type          = PPC_OPROFILE_POWER4,
276                 .oprofile_mmcra_sihv    = MMCRA_SIHV,
277                 .oprofile_mmcra_sipr    = MMCRA_SIPR,
278                 .platform               = "power5+",
279         },
280         {       /* Power6 */
281                 .pvr_mask               = 0xffff0000,
282                 .pvr_value              = 0x003e0000,
283                 .cpu_name               = "POWER6",
284                 .cpu_features           = CPU_FTRS_POWER6,
285                 .cpu_user_features      = COMMON_USER_POWER6,
286                 .icache_bsize           = 128,
287                 .dcache_bsize           = 128,
288                 .num_pmcs               = 6,
289                 .oprofile_cpu_type      = "ppc64/power6",
290                 .oprofile_type          = PPC_OPROFILE_POWER4,
291                 .oprofile_mmcra_sihv    = POWER6_MMCRA_SIHV,
292                 .oprofile_mmcra_sipr    = POWER6_MMCRA_SIPR,
293                 .oprofile_mmcra_clear   = POWER6_MMCRA_THRM |
294                         POWER6_MMCRA_OTHER,
295                 .platform               = "power6",
296         },
297         {       /* Cell Broadband Engine */
298                 .pvr_mask               = 0xffff0000,
299                 .pvr_value              = 0x00700000,
300                 .cpu_name               = "Cell Broadband Engine",
301                 .cpu_features           = CPU_FTRS_CELL,
302                 .cpu_user_features      = COMMON_USER_PPC64 |
303                         PPC_FEATURE_CELL | PPC_FEATURE_HAS_ALTIVEC_COMP |
304                         PPC_FEATURE_SMT,
305                 .icache_bsize           = 128,
306                 .dcache_bsize           = 128,
307                 .num_pmcs               = 4,
308                 .oprofile_cpu_type      = "ppc64/cell-be",
309                 .oprofile_type          = PPC_OPROFILE_CELL,
310                 .platform               = "ppc-cell-be",
311         },
312         {       /* PA Semi PA6T */
313                 .pvr_mask               = 0x7fff0000,
314                 .pvr_value              = 0x00900000,
315                 .cpu_name               = "PA6T",
316                 .cpu_features           = CPU_FTRS_PA6T,
317                 .cpu_user_features      = COMMON_USER_PA6T,
318                 .icache_bsize           = 64,
319                 .dcache_bsize           = 64,
320                 .num_pmcs               = 6,
321                 .platform               = "pa6t",
322         },
323         {       /* default match */
324                 .pvr_mask               = 0x00000000,
325                 .pvr_value              = 0x00000000,
326                 .cpu_name               = "POWER4 (compatible)",
327                 .cpu_features           = CPU_FTRS_COMPATIBLE,
328                 .cpu_user_features      = COMMON_USER_PPC64,
329                 .icache_bsize           = 128,
330                 .dcache_bsize           = 128,
331                 .num_pmcs               = 6,
332                 .platform               = "power4",
333         }
334 #endif  /* CONFIG_PPC64 */
335 #ifdef CONFIG_PPC32
336 #if CLASSIC_PPC
337         {       /* 601 */
338                 .pvr_mask               = 0xffff0000,
339                 .pvr_value              = 0x00010000,
340                 .cpu_name               = "601",
341                 .cpu_features           = CPU_FTRS_PPC601,
342                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_601_INSTR |
343                         PPC_FEATURE_UNIFIED_CACHE | PPC_FEATURE_NO_TB,
344                 .icache_bsize           = 32,
345                 .dcache_bsize           = 32,
346                 .platform               = "ppc601",
347         },
348         {       /* 603 */
349                 .pvr_mask               = 0xffff0000,
350                 .pvr_value              = 0x00030000,
351                 .cpu_name               = "603",
352                 .cpu_features           = CPU_FTRS_603,
353                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
354                 .icache_bsize           = 32,
355                 .dcache_bsize           = 32,
356                 .cpu_setup              = __setup_cpu_603,
357                 .platform               = "ppc603",
358         },
359         {       /* 603e */
360                 .pvr_mask               = 0xffff0000,
361                 .pvr_value              = 0x00060000,
362                 .cpu_name               = "603e",
363                 .cpu_features           = CPU_FTRS_603,
364                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
365                 .icache_bsize           = 32,
366                 .dcache_bsize           = 32,
367                 .cpu_setup              = __setup_cpu_603,
368                 .platform               = "ppc603",
369         },
370         {       /* 603ev */
371                 .pvr_mask               = 0xffff0000,
372                 .pvr_value              = 0x00070000,
373                 .cpu_name               = "603ev",
374                 .cpu_features           = CPU_FTRS_603,
375                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
376                 .icache_bsize           = 32,
377                 .dcache_bsize           = 32,
378                 .cpu_setup              = __setup_cpu_603,
379                 .platform               = "ppc603",
380         },
381         {       /* 604 */
382                 .pvr_mask               = 0xffff0000,
383                 .pvr_value              = 0x00040000,
384                 .cpu_name               = "604",
385                 .cpu_features           = CPU_FTRS_604,
386                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
387                 .icache_bsize           = 32,
388                 .dcache_bsize           = 32,
389                 .num_pmcs               = 2,
390                 .cpu_setup              = __setup_cpu_604,
391                 .platform               = "ppc604",
392         },
393         {       /* 604e */
394                 .pvr_mask               = 0xfffff000,
395                 .pvr_value              = 0x00090000,
396                 .cpu_name               = "604e",
397                 .cpu_features           = CPU_FTRS_604,
398                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
399                 .icache_bsize           = 32,
400                 .dcache_bsize           = 32,
401                 .num_pmcs               = 4,
402                 .cpu_setup              = __setup_cpu_604,
403                 .platform               = "ppc604",
404         },
405         {       /* 604r */
406                 .pvr_mask               = 0xffff0000,
407                 .pvr_value              = 0x00090000,
408                 .cpu_name               = "604r",
409                 .cpu_features           = CPU_FTRS_604,
410                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
411                 .icache_bsize           = 32,
412                 .dcache_bsize           = 32,
413                 .num_pmcs               = 4,
414                 .cpu_setup              = __setup_cpu_604,
415                 .platform               = "ppc604",
416         },
417         {       /* 604ev */
418                 .pvr_mask               = 0xffff0000,
419                 .pvr_value              = 0x000a0000,
420                 .cpu_name               = "604ev",
421                 .cpu_features           = CPU_FTRS_604,
422                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
423                 .icache_bsize           = 32,
424                 .dcache_bsize           = 32,
425                 .num_pmcs               = 4,
426                 .cpu_setup              = __setup_cpu_604,
427                 .platform               = "ppc604",
428         },
429         {       /* 740/750 (0x4202, don't support TAU ?) */
430                 .pvr_mask               = 0xffffffff,
431                 .pvr_value              = 0x00084202,
432                 .cpu_name               = "740/750",
433                 .cpu_features           = CPU_FTRS_740_NOTAU,
434                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
435                 .icache_bsize           = 32,
436                 .dcache_bsize           = 32,
437                 .num_pmcs               = 4,
438                 .cpu_setup              = __setup_cpu_750,
439                 .platform               = "ppc750",
440         },
441         {       /* 750CX (80100 and 8010x?) */
442                 .pvr_mask               = 0xfffffff0,
443                 .pvr_value              = 0x00080100,
444                 .cpu_name               = "750CX",
445                 .cpu_features           = CPU_FTRS_750,
446                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
447                 .icache_bsize           = 32,
448                 .dcache_bsize           = 32,
449                 .num_pmcs               = 4,
450                 .cpu_setup              = __setup_cpu_750cx,
451                 .platform               = "ppc750",
452         },
453         {       /* 750CX (82201 and 82202) */
454                 .pvr_mask               = 0xfffffff0,
455                 .pvr_value              = 0x00082200,
456                 .cpu_name               = "750CX",
457                 .cpu_features           = CPU_FTRS_750,
458                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
459                 .icache_bsize           = 32,
460                 .dcache_bsize           = 32,
461                 .num_pmcs               = 4,
462                 .cpu_setup              = __setup_cpu_750cx,
463                 .platform               = "ppc750",
464         },
465         {       /* 750CXe (82214) */
466                 .pvr_mask               = 0xfffffff0,
467                 .pvr_value              = 0x00082210,
468                 .cpu_name               = "750CXe",
469                 .cpu_features           = CPU_FTRS_750,
470                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
471                 .icache_bsize           = 32,
472                 .dcache_bsize           = 32,
473                 .num_pmcs               = 4,
474                 .cpu_setup              = __setup_cpu_750cx,
475                 .platform               = "ppc750",
476         },
477         {       /* 750CXe "Gekko" (83214) */
478                 .pvr_mask               = 0xffffffff,
479                 .pvr_value              = 0x00083214,
480                 .cpu_name               = "750CXe",
481                 .cpu_features           = CPU_FTRS_750,
482                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
483                 .icache_bsize           = 32,
484                 .dcache_bsize           = 32,
485                 .num_pmcs               = 4,
486                 .cpu_setup              = __setup_cpu_750cx,
487                 .platform               = "ppc750",
488         },
489         {       /* 745/755 */
490                 .pvr_mask               = 0xfffff000,
491                 .pvr_value              = 0x00083000,
492                 .cpu_name               = "745/755",
493                 .cpu_features           = CPU_FTRS_750,
494                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
495                 .icache_bsize           = 32,
496                 .dcache_bsize           = 32,
497                 .num_pmcs               = 4,
498                 .cpu_setup              = __setup_cpu_750,
499                 .platform               = "ppc750",
500         },
501         {       /* 750FX rev 1.x */
502                 .pvr_mask               = 0xffffff00,
503                 .pvr_value              = 0x70000100,
504                 .cpu_name               = "750FX",
505                 .cpu_features           = CPU_FTRS_750FX1,
506                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
507                 .icache_bsize           = 32,
508                 .dcache_bsize           = 32,
509                 .num_pmcs               = 4,
510                 .cpu_setup              = __setup_cpu_750,
511                 .platform               = "ppc750",
512         },
513         {       /* 750FX rev 2.0 must disable HID0[DPM] */
514                 .pvr_mask               = 0xffffffff,
515                 .pvr_value              = 0x70000200,
516                 .cpu_name               = "750FX",
517                 .cpu_features           = CPU_FTRS_750FX2,
518                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
519                 .icache_bsize           = 32,
520                 .dcache_bsize           = 32,
521                 .num_pmcs               = 4,
522                 .cpu_setup              = __setup_cpu_750,
523                 .platform               = "ppc750",
524         },
525         {       /* 750FX (All revs except 2.0) */
526                 .pvr_mask               = 0xffff0000,
527                 .pvr_value              = 0x70000000,
528                 .cpu_name               = "750FX",
529                 .cpu_features           = CPU_FTRS_750FX,
530                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
531                 .icache_bsize           = 32,
532                 .dcache_bsize           = 32,
533                 .num_pmcs               = 4,
534                 .cpu_setup              = __setup_cpu_750fx,
535                 .platform               = "ppc750",
536         },
537         {       /* 750GX */
538                 .pvr_mask               = 0xffff0000,
539                 .pvr_value              = 0x70020000,
540                 .cpu_name               = "750GX",
541                 .cpu_features           = CPU_FTRS_750GX,
542                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
543                 .icache_bsize           = 32,
544                 .dcache_bsize           = 32,
545                 .num_pmcs               = 4,
546                 .cpu_setup              = __setup_cpu_750fx,
547                 .platform               = "ppc750",
548         },
549         {       /* 740/750 (L2CR bit need fixup for 740) */
550                 .pvr_mask               = 0xffff0000,
551                 .pvr_value              = 0x00080000,
552                 .cpu_name               = "740/750",
553                 .cpu_features           = CPU_FTRS_740,
554                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_PPC_LE,
555                 .icache_bsize           = 32,
556                 .dcache_bsize           = 32,
557                 .num_pmcs               = 4,
558                 .cpu_setup              = __setup_cpu_750,
559                 .platform               = "ppc750",
560         },
561         {       /* 7400 rev 1.1 ? (no TAU) */
562                 .pvr_mask               = 0xffffffff,
563                 .pvr_value              = 0x000c1101,
564                 .cpu_name               = "7400 (1.1)",
565                 .cpu_features           = CPU_FTRS_7400_NOTAU,
566                 .cpu_user_features      = COMMON_USER |
567                         PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
568                 .icache_bsize           = 32,
569                 .dcache_bsize           = 32,
570                 .num_pmcs               = 4,
571                 .cpu_setup              = __setup_cpu_7400,
572                 .platform               = "ppc7400",
573         },
574         {       /* 7400 */
575                 .pvr_mask               = 0xffff0000,
576                 .pvr_value              = 0x000c0000,
577                 .cpu_name               = "7400",
578                 .cpu_features           = CPU_FTRS_7400,
579                 .cpu_user_features      = COMMON_USER |
580                         PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
581                 .icache_bsize           = 32,
582                 .dcache_bsize           = 32,
583                 .num_pmcs               = 4,
584                 .cpu_setup              = __setup_cpu_7400,
585                 .platform               = "ppc7400",
586         },
587         {       /* 7410 */
588                 .pvr_mask               = 0xffff0000,
589                 .pvr_value              = 0x800c0000,
590                 .cpu_name               = "7410",
591                 .cpu_features           = CPU_FTRS_7400,
592                 .cpu_user_features      = COMMON_USER |
593                         PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
594                 .icache_bsize           = 32,
595                 .dcache_bsize           = 32,
596                 .num_pmcs               = 4,
597                 .cpu_setup              = __setup_cpu_7410,
598                 .platform               = "ppc7400",
599         },
600         {       /* 7450 2.0 - no doze/nap */
601                 .pvr_mask               = 0xffffffff,
602                 .pvr_value              = 0x80000200,
603                 .cpu_name               = "7450",
604                 .cpu_features           = CPU_FTRS_7450_20,
605                 .cpu_user_features      = COMMON_USER |
606                         PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
607                 .icache_bsize           = 32,
608                 .dcache_bsize           = 32,
609                 .num_pmcs               = 6,
610                 .cpu_setup              = __setup_cpu_745x,
611                 .oprofile_cpu_type      = "ppc/7450",
612                 .oprofile_type          = PPC_OPROFILE_G4,
613                 .platform               = "ppc7450",
614         },
615         {       /* 7450 2.1 */
616                 .pvr_mask               = 0xffffffff,
617                 .pvr_value              = 0x80000201,
618                 .cpu_name               = "7450",
619                 .cpu_features           = CPU_FTRS_7450_21,
620                 .cpu_user_features      = COMMON_USER |
621                         PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
622                 .icache_bsize           = 32,
623                 .dcache_bsize           = 32,
624                 .num_pmcs               = 6,
625                 .cpu_setup              = __setup_cpu_745x,
626                 .oprofile_cpu_type      = "ppc/7450",
627                 .oprofile_type          = PPC_OPROFILE_G4,
628                 .platform               = "ppc7450",
629         },
630         {       /* 7450 2.3 and newer */
631                 .pvr_mask               = 0xffff0000,
632                 .pvr_value              = 0x80000000,
633                 .cpu_name               = "7450",
634                 .cpu_features           = CPU_FTRS_7450_23,
635                 .cpu_user_features      = COMMON_USER |
636                         PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
637                 .icache_bsize           = 32,
638                 .dcache_bsize           = 32,
639                 .num_pmcs               = 6,
640                 .cpu_setup              = __setup_cpu_745x,
641                 .oprofile_cpu_type      = "ppc/7450",
642                 .oprofile_type          = PPC_OPROFILE_G4,
643                 .platform               = "ppc7450",
644         },
645         {       /* 7455 rev 1.x */
646                 .pvr_mask               = 0xffffff00,
647                 .pvr_value              = 0x80010100,
648                 .cpu_name               = "7455",
649                 .cpu_features           = CPU_FTRS_7455_1,
650                 .cpu_user_features      = COMMON_USER |
651                         PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
652                 .icache_bsize           = 32,
653                 .dcache_bsize           = 32,
654                 .num_pmcs               = 6,
655                 .cpu_setup              = __setup_cpu_745x,
656                 .oprofile_cpu_type      = "ppc/7450",
657                 .oprofile_type          = PPC_OPROFILE_G4,
658                 .platform               = "ppc7450",
659         },
660         {       /* 7455 rev 2.0 */
661                 .pvr_mask               = 0xffffffff,
662                 .pvr_value              = 0x80010200,
663                 .cpu_name               = "7455",
664                 .cpu_features           = CPU_FTRS_7455_20,
665                 .cpu_user_features      = COMMON_USER |
666                         PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
667                 .icache_bsize           = 32,
668                 .dcache_bsize           = 32,
669                 .num_pmcs               = 6,
670                 .cpu_setup              = __setup_cpu_745x,
671                 .oprofile_cpu_type      = "ppc/7450",
672                 .oprofile_type          = PPC_OPROFILE_G4,
673                 .platform               = "ppc7450",
674         },
675         {       /* 7455 others */
676                 .pvr_mask               = 0xffff0000,
677                 .pvr_value              = 0x80010000,
678                 .cpu_name               = "7455",
679                 .cpu_features           = CPU_FTRS_7455,
680                 .cpu_user_features      = COMMON_USER |
681                         PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
682                 .icache_bsize           = 32,
683                 .dcache_bsize           = 32,
684                 .num_pmcs               = 6,
685                 .cpu_setup              = __setup_cpu_745x,
686                 .oprofile_cpu_type      = "ppc/7450",
687                 .oprofile_type          = PPC_OPROFILE_G4,
688                 .platform               = "ppc7450",
689         },
690         {       /* 7447/7457 Rev 1.0 */
691                 .pvr_mask               = 0xffffffff,
692                 .pvr_value              = 0x80020100,
693                 .cpu_name               = "7447/7457",
694                 .cpu_features           = CPU_FTRS_7447_10,
695                 .cpu_user_features      = COMMON_USER |
696                         PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
697                 .icache_bsize           = 32,
698                 .dcache_bsize           = 32,
699                 .num_pmcs               = 6,
700                 .cpu_setup              = __setup_cpu_745x,
701                 .oprofile_cpu_type      = "ppc/7450",
702                 .oprofile_type          = PPC_OPROFILE_G4,
703                 .platform               = "ppc7450",
704         },
705         {       /* 7447/7457 Rev 1.1 */
706                 .pvr_mask               = 0xffffffff,
707                 .pvr_value              = 0x80020101,
708                 .cpu_name               = "7447/7457",
709                 .cpu_features           = CPU_FTRS_7447_10,
710                 .cpu_user_features      = COMMON_USER |
711                         PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
712                 .icache_bsize           = 32,
713                 .dcache_bsize           = 32,
714                 .num_pmcs               = 6,
715                 .cpu_setup              = __setup_cpu_745x,
716                 .oprofile_cpu_type      = "ppc/7450",
717                 .oprofile_type          = PPC_OPROFILE_G4,
718                 .platform               = "ppc7450",
719         },
720         {       /* 7447/7457 Rev 1.2 and later */
721                 .pvr_mask               = 0xffff0000,
722                 .pvr_value              = 0x80020000,
723                 .cpu_name               = "7447/7457",
724                 .cpu_features           = CPU_FTRS_7447,
725                 .cpu_user_features      = COMMON_USER | PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
726                 .icache_bsize           = 32,
727                 .dcache_bsize           = 32,
728                 .num_pmcs               = 6,
729                 .cpu_setup              = __setup_cpu_745x,
730                 .oprofile_cpu_type      = "ppc/7450",
731                 .oprofile_type          = PPC_OPROFILE_G4,
732                 .platform               = "ppc7450",
733         },
734         {       /* 7447A */
735                 .pvr_mask               = 0xffff0000,
736                 .pvr_value              = 0x80030000,
737                 .cpu_name               = "7447A",
738                 .cpu_features           = CPU_FTRS_7447A,
739                 .cpu_user_features      = COMMON_USER |
740                         PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
741                 .icache_bsize           = 32,
742                 .dcache_bsize           = 32,
743                 .num_pmcs               = 6,
744                 .cpu_setup              = __setup_cpu_745x,
745                 .oprofile_cpu_type      = "ppc/7450",
746                 .oprofile_type          = PPC_OPROFILE_G4,
747                 .platform               = "ppc7450",
748         },
749         {       /* 7448 */
750                 .pvr_mask               = 0xffff0000,
751                 .pvr_value              = 0x80040000,
752                 .cpu_name               = "7448",
753                 .cpu_features           = CPU_FTRS_7447A,
754                 .cpu_user_features      = COMMON_USER |
755                         PPC_FEATURE_HAS_ALTIVEC_COMP | PPC_FEATURE_PPC_LE,
756                 .icache_bsize           = 32,
757                 .dcache_bsize           = 32,
758                 .num_pmcs               = 6,
759                 .cpu_setup              = __setup_cpu_745x,
760                 .oprofile_cpu_type      = "ppc/7450",
761                 .oprofile_type          = PPC_OPROFILE_G4,
762                 .platform               = "ppc7450",
763         },
764         {       /* 82xx (8240, 8245, 8260 are all 603e cores) */
765                 .pvr_mask               = 0x7fff0000,
766                 .pvr_value              = 0x00810000,
767                 .cpu_name               = "82xx",
768                 .cpu_features           = CPU_FTRS_82XX,
769                 .cpu_user_features      = COMMON_USER,
770                 .icache_bsize           = 32,
771                 .dcache_bsize           = 32,
772                 .cpu_setup              = __setup_cpu_603,
773                 .platform               = "ppc603",
774         },
775         {       /* All G2_LE (603e core, plus some) have the same pvr */
776                 .pvr_mask               = 0x7fff0000,
777                 .pvr_value              = 0x00820000,
778                 .cpu_name               = "G2_LE",
779                 .cpu_features           = CPU_FTRS_G2_LE,
780                 .cpu_user_features      = COMMON_USER,
781                 .icache_bsize           = 32,
782                 .dcache_bsize           = 32,
783                 .cpu_setup              = __setup_cpu_603,
784                 .platform               = "ppc603",
785         },
786         {       /* e300c1 (a 603e core, plus some) on 83xx */
787                 .pvr_mask               = 0x7fff0000,
788                 .pvr_value              = 0x00830000,
789                 .cpu_name               = "e300c1",
790                 .cpu_features           = CPU_FTRS_E300,
791                 .cpu_user_features      = COMMON_USER,
792                 .icache_bsize           = 32,
793                 .dcache_bsize           = 32,
794                 .cpu_setup              = __setup_cpu_603,
795                 .platform               = "ppc603",
796         },
797         {       /* e300c2 (an e300c1 core, plus some, minus FPU) on 83xx */
798                 .pvr_mask               = 0x7fff0000,
799                 .pvr_value              = 0x00840000,
800                 .cpu_name               = "e300c2",
801                 .cpu_features           = CPU_FTRS_E300,
802                 .cpu_user_features      = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
803                 .icache_bsize           = 32,
804                 .dcache_bsize           = 32,
805                 .cpu_setup              = __setup_cpu_603,
806                 .platform               = "ppc603",
807         },
808         {       /* default match, we assume split I/D cache & TB (non-601)... */
809                 .pvr_mask               = 0x00000000,
810                 .pvr_value              = 0x00000000,
811                 .cpu_name               = "(generic PPC)",
812                 .cpu_features           = CPU_FTRS_CLASSIC32,
813                 .cpu_user_features      = COMMON_USER,
814                 .icache_bsize           = 32,
815                 .dcache_bsize           = 32,
816                 .platform               = "ppc603",
817         },
818 #endif /* CLASSIC_PPC */
819 #ifdef CONFIG_8xx
820         {       /* 8xx */
821                 .pvr_mask               = 0xffff0000,
822                 .pvr_value              = 0x00500000,
823                 .cpu_name               = "8xx",
824                 /* CPU_FTR_MAYBE_CAN_DOZE is possible,
825                  * if the 8xx code is there.... */
826                 .cpu_features           = CPU_FTRS_8XX,
827                 .cpu_user_features      = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
828                 .icache_bsize           = 16,
829                 .dcache_bsize           = 16,
830                 .platform               = "ppc823",
831         },
832 #endif /* CONFIG_8xx */
833 #ifdef CONFIG_40x
834         {       /* 403GC */
835                 .pvr_mask               = 0xffffff00,
836                 .pvr_value              = 0x00200200,
837                 .cpu_name               = "403GC",
838                 .cpu_features           = CPU_FTRS_40X,
839                 .cpu_user_features      = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
840                 .icache_bsize           = 16,
841                 .dcache_bsize           = 16,
842                 .platform               = "ppc403",
843         },
844         {       /* 403GCX */
845                 .pvr_mask               = 0xffffff00,
846                 .pvr_value              = 0x00201400,
847                 .cpu_name               = "403GCX",
848                 .cpu_features           = CPU_FTRS_40X,
849                 .cpu_user_features      = PPC_FEATURE_32 |
850                         PPC_FEATURE_HAS_MMU | PPC_FEATURE_NO_TB,
851                 .icache_bsize           = 16,
852                 .dcache_bsize           = 16,
853                 .platform               = "ppc403",
854         },
855         {       /* 403G ?? */
856                 .pvr_mask               = 0xffff0000,
857                 .pvr_value              = 0x00200000,
858                 .cpu_name               = "403G ??",
859                 .cpu_features           = CPU_FTRS_40X,
860                 .cpu_user_features      = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
861                 .icache_bsize           = 16,
862                 .dcache_bsize           = 16,
863                 .platform               = "ppc403",
864         },
865         {       /* 405GP */
866                 .pvr_mask               = 0xffff0000,
867                 .pvr_value              = 0x40110000,
868                 .cpu_name               = "405GP",
869                 .cpu_features           = CPU_FTRS_40X,
870                 .cpu_user_features      = PPC_FEATURE_32 |
871                         PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
872                 .icache_bsize           = 32,
873                 .dcache_bsize           = 32,
874                 .platform               = "ppc405",
875         },
876         {       /* STB 03xxx */
877                 .pvr_mask               = 0xffff0000,
878                 .pvr_value              = 0x40130000,
879                 .cpu_name               = "STB03xxx",
880                 .cpu_features           = CPU_FTRS_40X,
881                 .cpu_user_features      = PPC_FEATURE_32 |
882                         PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
883                 .icache_bsize           = 32,
884                 .dcache_bsize           = 32,
885                 .platform               = "ppc405",
886         },
887         {       /* STB 04xxx */
888                 .pvr_mask               = 0xffff0000,
889                 .pvr_value              = 0x41810000,
890                 .cpu_name               = "STB04xxx",
891                 .cpu_features           = CPU_FTRS_40X,
892                 .cpu_user_features      = PPC_FEATURE_32 |
893                         PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
894                 .icache_bsize           = 32,
895                 .dcache_bsize           = 32,
896                 .platform               = "ppc405",
897         },
898         {       /* NP405L */
899                 .pvr_mask               = 0xffff0000,
900                 .pvr_value              = 0x41610000,
901                 .cpu_name               = "NP405L",
902                 .cpu_features           = CPU_FTRS_40X,
903                 .cpu_user_features      = PPC_FEATURE_32 |
904                         PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
905                 .icache_bsize           = 32,
906                 .dcache_bsize           = 32,
907                 .platform               = "ppc405",
908         },
909         {       /* NP4GS3 */
910                 .pvr_mask               = 0xffff0000,
911                 .pvr_value              = 0x40B10000,
912                 .cpu_name               = "NP4GS3",
913                 .cpu_features           = CPU_FTRS_40X,
914                 .cpu_user_features      = PPC_FEATURE_32 |
915                         PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
916                 .icache_bsize           = 32,
917                 .dcache_bsize           = 32,
918                 .platform               = "ppc405",
919         },
920         {   /* NP405H */
921                 .pvr_mask               = 0xffff0000,
922                 .pvr_value              = 0x41410000,
923                 .cpu_name               = "NP405H",
924                 .cpu_features           = CPU_FTRS_40X,
925                 .cpu_user_features      = PPC_FEATURE_32 |
926                         PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
927                 .icache_bsize           = 32,
928                 .dcache_bsize           = 32,
929                 .platform               = "ppc405",
930         },
931         {       /* 405GPr */
932                 .pvr_mask               = 0xffff0000,
933                 .pvr_value              = 0x50910000,
934                 .cpu_name               = "405GPr",
935                 .cpu_features           = CPU_FTRS_40X,
936                 .cpu_user_features      = PPC_FEATURE_32 |
937                         PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
938                 .icache_bsize           = 32,
939                 .dcache_bsize           = 32,
940                 .platform               = "ppc405",
941         },
942         {   /* STBx25xx */
943                 .pvr_mask               = 0xffff0000,
944                 .pvr_value              = 0x51510000,
945                 .cpu_name               = "STBx25xx",
946                 .cpu_features           = CPU_FTRS_40X,
947                 .cpu_user_features      = PPC_FEATURE_32 |
948                         PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
949                 .icache_bsize           = 32,
950                 .dcache_bsize           = 32,
951                 .platform               = "ppc405",
952         },
953         {       /* 405LP */
954                 .pvr_mask               = 0xffff0000,
955                 .pvr_value              = 0x41F10000,
956                 .cpu_name               = "405LP",
957                 .cpu_features           = CPU_FTRS_40X,
958                 .cpu_user_features      = PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU,
959                 .icache_bsize           = 32,
960                 .dcache_bsize           = 32,
961                 .platform               = "ppc405",
962         },
963         {       /* Xilinx Virtex-II Pro  */
964                 .pvr_mask               = 0xfffff000,
965                 .pvr_value              = 0x20010000,
966                 .cpu_name               = "Virtex-II Pro",
967                 .cpu_features           = CPU_FTRS_40X,
968                 .cpu_user_features      = PPC_FEATURE_32 |
969                         PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
970                 .icache_bsize           = 32,
971                 .dcache_bsize           = 32,
972                 .platform               = "ppc405",
973         },
974         {       /* Xilinx Virtex-4 FX */
975                 .pvr_mask               = 0xfffff000,
976                 .pvr_value              = 0x20011000,
977                 .cpu_name               = "Virtex-4 FX",
978                 .cpu_features           = CPU_FTRS_40X,
979                 .cpu_user_features      = PPC_FEATURE_32 |
980                         PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
981                 .icache_bsize           = 32,
982                 .dcache_bsize           = 32,
983                 .platform               = "ppc405",
984         },
985         {       /* 405EP */
986                 .pvr_mask               = 0xffff0000,
987                 .pvr_value              = 0x51210000,
988                 .cpu_name               = "405EP",
989                 .cpu_features           = CPU_FTRS_40X,
990                 .cpu_user_features      = PPC_FEATURE_32 |
991                         PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC,
992                 .icache_bsize           = 32,
993                 .dcache_bsize           = 32,
994                 .platform               = "ppc405",
995         },
996
997 #endif /* CONFIG_40x */
998 #ifdef CONFIG_44x
999         {
1000                 .pvr_mask               = 0xf0000fff,
1001                 .pvr_value              = 0x40000850,
1002                 .cpu_name               = "440EP Rev. A",
1003                 .cpu_features           = CPU_FTRS_44X,
1004                 .cpu_user_features      = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1005                 .icache_bsize           = 32,
1006                 .dcache_bsize           = 32,
1007                 .platform               = "ppc440",
1008         },
1009         {
1010                 .pvr_mask               = 0xf0000fff,
1011                 .pvr_value              = 0x400008d3,
1012                 .cpu_name               = "440EP Rev. B",
1013                 .cpu_features           = CPU_FTRS_44X,
1014                 .cpu_user_features      = COMMON_USER_BOOKE | PPC_FEATURE_HAS_FPU,
1015                 .icache_bsize           = 32,
1016                 .dcache_bsize           = 32,
1017                 .platform               = "ppc440",
1018         },
1019         {       /* 440GP Rev. B */
1020                 .pvr_mask               = 0xf0000fff,
1021                 .pvr_value              = 0x40000440,
1022                 .cpu_name               = "440GP Rev. B",
1023                 .cpu_features           = CPU_FTRS_44X,
1024                 .cpu_user_features      = COMMON_USER_BOOKE,
1025                 .icache_bsize           = 32,
1026                 .dcache_bsize           = 32,
1027                 .platform               = "ppc440gp",
1028         },
1029         {       /* 440GP Rev. C */
1030                 .pvr_mask               = 0xf0000fff,
1031                 .pvr_value              = 0x40000481,
1032                 .cpu_name               = "440GP Rev. C",
1033                 .cpu_features           = CPU_FTRS_44X,
1034                 .cpu_user_features      = COMMON_USER_BOOKE,
1035                 .icache_bsize           = 32,
1036                 .dcache_bsize           = 32,
1037                 .platform               = "ppc440gp",
1038         },
1039         { /* 440GX Rev. A */
1040                 .pvr_mask               = 0xf0000fff,
1041                 .pvr_value              = 0x50000850,
1042                 .cpu_name               = "440GX Rev. A",
1043                 .cpu_features           = CPU_FTRS_44X,
1044                 .cpu_user_features      = COMMON_USER_BOOKE,
1045                 .icache_bsize           = 32,
1046                 .dcache_bsize           = 32,
1047                 .platform               = "ppc440",
1048         },
1049         { /* 440GX Rev. B */
1050                 .pvr_mask               = 0xf0000fff,
1051                 .pvr_value              = 0x50000851,
1052                 .cpu_name               = "440GX Rev. B",
1053                 .cpu_features           = CPU_FTRS_44X,
1054                 .cpu_user_features      = COMMON_USER_BOOKE,
1055                 .icache_bsize           = 32,
1056                 .dcache_bsize           = 32,
1057                 .platform               = "ppc440",
1058         },
1059         { /* 440GX Rev. C */
1060                 .pvr_mask               = 0xf0000fff,
1061                 .pvr_value              = 0x50000892,
1062                 .cpu_name               = "440GX Rev. C",
1063                 .cpu_features           = CPU_FTRS_44X,
1064                 .cpu_user_features      = COMMON_USER_BOOKE,
1065                 .icache_bsize           = 32,
1066                 .dcache_bsize           = 32,
1067                 .platform               = "ppc440",
1068         },
1069         { /* 440GX Rev. F */
1070                 .pvr_mask               = 0xf0000fff,
1071                 .pvr_value              = 0x50000894,
1072                 .cpu_name               = "440GX Rev. F",
1073                 .cpu_features           = CPU_FTRS_44X,
1074                 .cpu_user_features      = COMMON_USER_BOOKE,
1075                 .icache_bsize           = 32,
1076                 .dcache_bsize           = 32,
1077                 .platform               = "ppc440",
1078         },
1079         { /* 440SP Rev. A */
1080                 .pvr_mask               = 0xff000fff,
1081                 .pvr_value              = 0x53000891,
1082                 .cpu_name               = "440SP Rev. A",
1083                 .cpu_features           = CPU_FTRS_44X,
1084                 .cpu_user_features      = COMMON_USER_BOOKE,
1085                 .icache_bsize           = 32,
1086                 .dcache_bsize           = 32,
1087                 .platform               = "ppc440",
1088         },
1089         { /* 440SPe Rev. A */
1090                 .pvr_mask               = 0xff000fff,
1091                 .pvr_value              = 0x53000890,
1092                 .cpu_name               = "440SPe Rev. A",
1093                 .cpu_features           = CPU_FTR_SPLIT_ID_CACHE |
1094                         CPU_FTR_USE_TB,
1095                 .cpu_user_features      = COMMON_USER_BOOKE,
1096                 .icache_bsize           = 32,
1097                 .dcache_bsize           = 32,
1098                 .platform               = "ppc440",
1099         },
1100 #endif /* CONFIG_44x */
1101 #ifdef CONFIG_FSL_BOOKE
1102         {       /* e200z5 */
1103                 .pvr_mask               = 0xfff00000,
1104                 .pvr_value              = 0x81000000,
1105                 .cpu_name               = "e200z5",
1106                 /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
1107                 .cpu_features           = CPU_FTRS_E200,
1108                 .cpu_user_features      = COMMON_USER_BOOKE |
1109                         PPC_FEATURE_HAS_EFP_SINGLE |
1110                         PPC_FEATURE_UNIFIED_CACHE,
1111                 .dcache_bsize           = 32,
1112                 .platform               = "ppc5554",
1113         },
1114         {       /* e200z6 */
1115                 .pvr_mask               = 0xfff00000,
1116                 .pvr_value              = 0x81100000,
1117                 .cpu_name               = "e200z6",
1118                 /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
1119                 .cpu_features           = CPU_FTRS_E200,
1120                 .cpu_user_features      = COMMON_USER_BOOKE |
1121                         PPC_FEATURE_SPE_COMP |
1122                         PPC_FEATURE_HAS_EFP_SINGLE |
1123                         PPC_FEATURE_UNIFIED_CACHE,
1124                 .dcache_bsize           = 32,
1125                 .platform               = "ppc5554",
1126         },
1127         {       /* e500 */
1128                 .pvr_mask               = 0xffff0000,
1129                 .pvr_value              = 0x80200000,
1130                 .cpu_name               = "e500",
1131                 /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
1132                 .cpu_features           = CPU_FTRS_E500,
1133                 .cpu_user_features      = COMMON_USER_BOOKE |
1134                         PPC_FEATURE_SPE_COMP |
1135                         PPC_FEATURE_HAS_EFP_SINGLE,
1136                 .icache_bsize           = 32,
1137                 .dcache_bsize           = 32,
1138                 .num_pmcs               = 4,
1139                 .oprofile_cpu_type      = "ppc/e500",
1140                 .oprofile_type          = PPC_OPROFILE_BOOKE,
1141                 .platform               = "ppc8540",
1142         },
1143         {       /* e500v2 */
1144                 .pvr_mask               = 0xffff0000,
1145                 .pvr_value              = 0x80210000,
1146                 .cpu_name               = "e500v2",
1147                 /* xxx - galak: add CPU_FTR_MAYBE_CAN_DOZE */
1148                 .cpu_features           = CPU_FTRS_E500_2,
1149                 .cpu_user_features      = COMMON_USER_BOOKE |
1150                         PPC_FEATURE_SPE_COMP |
1151                         PPC_FEATURE_HAS_EFP_SINGLE |
1152                         PPC_FEATURE_HAS_EFP_DOUBLE,
1153                 .icache_bsize           = 32,
1154                 .dcache_bsize           = 32,
1155                 .num_pmcs               = 4,
1156                 .oprofile_cpu_type      = "ppc/e500",
1157                 .oprofile_type          = PPC_OPROFILE_BOOKE,
1158                 .platform               = "ppc8548",
1159         },
1160 #endif
1161 #if !CLASSIC_PPC
1162         {       /* default match */
1163                 .pvr_mask               = 0x00000000,
1164                 .pvr_value              = 0x00000000,
1165                 .cpu_name               = "(generic PPC)",
1166                 .cpu_features           = CPU_FTRS_GENERIC_32,
1167                 .cpu_user_features      = PPC_FEATURE_32,
1168                 .icache_bsize           = 32,
1169                 .dcache_bsize           = 32,
1170                 .platform               = "powerpc",
1171         }
1172 #endif /* !CLASSIC_PPC */
1173 #endif /* CONFIG_PPC32 */
1174 };
1175
1176 struct cpu_spec *identify_cpu(unsigned long offset)
1177 {
1178         struct cpu_spec *s = cpu_specs;
1179         struct cpu_spec **cur = &cur_cpu_spec;
1180         unsigned int pvr = mfspr(SPRN_PVR);
1181         int i;
1182
1183         s = PTRRELOC(s);
1184         cur = PTRRELOC(cur);
1185
1186         if (*cur != NULL)
1187                 return PTRRELOC(*cur);
1188
1189         for (i = 0; i < ARRAY_SIZE(cpu_specs); i++,s++)
1190                 if ((pvr & s->pvr_mask) == s->pvr_value) {
1191                         *cur = cpu_specs + i;
1192 #ifdef CONFIG_PPC64
1193                         /* ppc64 expects identify_cpu to also call setup_cpu
1194                          * for that processor. I will consolidate that at a
1195                          * later time, for now, just use our friend #ifdef.
1196                          * we also don't need to PTRRELOC the function pointer
1197                          * on ppc64 as we are running at 0 in real mode.
1198                          */
1199                         if (s->cpu_setup) {
1200                                 s->cpu_setup(offset, s);
1201                         }
1202 #endif /* CONFIG_PPC64 */
1203                         return s;
1204                 }
1205         BUG();
1206         return NULL;
1207 }
1208
1209 void do_feature_fixups(unsigned long value, void *fixup_start, void *fixup_end)
1210 {
1211         struct fixup_entry {
1212                 unsigned long   mask;
1213                 unsigned long   value;
1214                 long            start_off;
1215                 long            end_off;
1216         } *fcur, *fend;
1217
1218         fcur = fixup_start;
1219         fend = fixup_end;
1220
1221         for (; fcur < fend; fcur++) {
1222                 unsigned int *pstart, *pend, *p;
1223
1224                 if ((value & fcur->mask) == fcur->value)
1225                         continue;
1226
1227                 /* These PTRRELOCs will disappear once the new scheme for
1228                  * modules and vdso is implemented
1229                  */
1230                 pstart = ((unsigned int *)fcur) + (fcur->start_off / 4);
1231                 pend = ((unsigned int *)fcur) + (fcur->end_off / 4);
1232
1233                 for (p = pstart; p < pend; p++) {
1234                         *p = 0x60000000u;
1235                         asm volatile ("dcbst 0, %0" : : "r" (p));
1236                 }
1237                 asm volatile ("sync" : : : "memory");
1238                 for (p = pstart; p < pend; p++)
1239                         asm volatile ("icbi 0,%0" : : "r" (p));
1240                 asm volatile ("sync; isync" : : : "memory");
1241         }
1242 }