blob: a20960e47105ed9957804485faf297a4835cb6df [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * arch/ppc64/kernel/cputable.c
3 *
4 * Copyright (C) 2001 Ben. Herrenschmidt (benh@kernel.crashing.org)
5 *
6 * Modifications for ppc64:
7 * Copyright (C) 2003 Dave Engebretsen <engebret@us.ibm.com>
Stephen Rothwell8d15a3e2005-08-03 14:40:16 +10008 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07009 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version
12 * 2 of the License, or (at your option) any later version.
13 */
14
15#include <linux/config.h>
16#include <linux/string.h>
17#include <linux/sched.h>
18#include <linux/threads.h>
19#include <linux/init.h>
20#include <linux/module.h>
21
22#include <asm/cputable.h>
23
24struct cpu_spec* cur_cpu_spec = NULL;
25EXPORT_SYMBOL(cur_cpu_spec);
26
27/* NOTE:
28 * Unlike ppc32, ppc64 will only call this once for the boot CPU, it's
29 * the responsibility of the appropriate CPU save/restore functions to
30 * eventually copy these settings over. Those save/restore aren't yet
31 * part of the cputable though. That has to be fixed for both ppc32
32 * and ppc64
33 */
34extern void __setup_cpu_power3(unsigned long offset, struct cpu_spec* spec);
35extern void __setup_cpu_power4(unsigned long offset, struct cpu_spec* spec);
36extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec);
Arnd Bergmannfef1c772005-06-23 09:43:37 +100037extern void __setup_cpu_be(unsigned long offset, struct cpu_spec* spec);
Linus Torvalds1da177e2005-04-16 15:20:36 -070038
39
40/* We only set the altivec features if the kernel was compiled with altivec
41 * support
42 */
43#ifdef CONFIG_ALTIVEC
44#define CPU_FTR_ALTIVEC_COMP CPU_FTR_ALTIVEC
45#define PPC_FEATURE_HAS_ALTIVEC_COMP PPC_FEATURE_HAS_ALTIVEC
46#else
47#define CPU_FTR_ALTIVEC_COMP 0
48#define PPC_FEATURE_HAS_ALTIVEC_COMP 0
49#endif
50
51struct cpu_spec cpu_specs[] = {
Anton Blanchard315a6992005-07-07 17:56:11 -070052 { /* Power3 */
53 .pvr_mask = 0xffff0000,
54 .pvr_value = 0x00400000,
55 .cpu_name = "POWER3 (630)",
56 .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
57 CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
58 CPU_FTR_PMC8,
59 .cpu_user_features = COMMON_USER_PPC64,
60 .icache_bsize = 128,
61 .dcache_bsize = 128,
Anton Blanchardfd5b4372005-09-06 14:47:49 +100062 .num_pmcs = 8,
Anton Blanchard315a6992005-07-07 17:56:11 -070063 .cpu_setup = __setup_cpu_power3,
Anton Blanchard315a6992005-07-07 17:56:11 -070064 },
65 { /* Power3+ */
66 .pvr_mask = 0xffff0000,
67 .pvr_value = 0x00410000,
68 .cpu_name = "POWER3 (630+)",
69 .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
70 CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
71 CPU_FTR_PMC8,
72 .cpu_user_features = COMMON_USER_PPC64,
73 .icache_bsize = 128,
74 .dcache_bsize = 128,
Anton Blanchardfd5b4372005-09-06 14:47:49 +100075 .num_pmcs = 8,
Anton Blanchard315a6992005-07-07 17:56:11 -070076 .cpu_setup = __setup_cpu_power3,
Anton Blanchard315a6992005-07-07 17:56:11 -070077 },
78 { /* Northstar */
79 .pvr_mask = 0xffff0000,
80 .pvr_value = 0x00330000,
81 .cpu_name = "RS64-II (northstar)",
82 .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
83 CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
Anton Blancharda2f7a9c2005-07-07 17:56:11 -070084 CPU_FTR_PMC8 | CPU_FTR_MMCRA | CPU_FTR_CTRL,
Anton Blanchard315a6992005-07-07 17:56:11 -070085 .cpu_user_features = COMMON_USER_PPC64,
86 .icache_bsize = 128,
87 .dcache_bsize = 128,
Anton Blanchardfd5b4372005-09-06 14:47:49 +100088 .num_pmcs = 8,
Anton Blanchard315a6992005-07-07 17:56:11 -070089 .cpu_setup = __setup_cpu_power3,
Anton Blanchard315a6992005-07-07 17:56:11 -070090 },
91 { /* Pulsar */
92 .pvr_mask = 0xffff0000,
93 .pvr_value = 0x00340000,
94 .cpu_name = "RS64-III (pulsar)",
95 .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
96 CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
Anton Blancharda2f7a9c2005-07-07 17:56:11 -070097 CPU_FTR_PMC8 | CPU_FTR_MMCRA | CPU_FTR_CTRL,
Anton Blanchard315a6992005-07-07 17:56:11 -070098 .cpu_user_features = COMMON_USER_PPC64,
99 .icache_bsize = 128,
100 .dcache_bsize = 128,
Anton Blanchardfd5b4372005-09-06 14:47:49 +1000101 .num_pmcs = 8,
Anton Blanchard315a6992005-07-07 17:56:11 -0700102 .cpu_setup = __setup_cpu_power3,
Anton Blanchard315a6992005-07-07 17:56:11 -0700103 },
104 { /* I-star */
105 .pvr_mask = 0xffff0000,
106 .pvr_value = 0x00360000,
107 .cpu_name = "RS64-III (icestar)",
108 .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
109 CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
Anton Blancharda2f7a9c2005-07-07 17:56:11 -0700110 CPU_FTR_PMC8 | CPU_FTR_MMCRA | CPU_FTR_CTRL,
Anton Blanchard315a6992005-07-07 17:56:11 -0700111 .cpu_user_features = COMMON_USER_PPC64,
112 .icache_bsize = 128,
113 .dcache_bsize = 128,
Anton Blanchardfd5b4372005-09-06 14:47:49 +1000114 .num_pmcs = 8,
Anton Blanchard315a6992005-07-07 17:56:11 -0700115 .cpu_setup = __setup_cpu_power3,
Anton Blanchard315a6992005-07-07 17:56:11 -0700116 },
117 { /* S-star */
118 .pvr_mask = 0xffff0000,
119 .pvr_value = 0x00370000,
120 .cpu_name = "RS64-IV (sstar)",
121 .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
122 CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE | CPU_FTR_IABR |
Anton Blancharda2f7a9c2005-07-07 17:56:11 -0700123 CPU_FTR_PMC8 | CPU_FTR_MMCRA | CPU_FTR_CTRL,
Anton Blanchard315a6992005-07-07 17:56:11 -0700124 .cpu_user_features = COMMON_USER_PPC64,
125 .icache_bsize = 128,
126 .dcache_bsize = 128,
Anton Blanchardfd5b4372005-09-06 14:47:49 +1000127 .num_pmcs = 8,
Anton Blanchard315a6992005-07-07 17:56:11 -0700128 .cpu_setup = __setup_cpu_power3,
Anton Blanchard315a6992005-07-07 17:56:11 -0700129 },
130 { /* Power4 */
131 .pvr_mask = 0xffff0000,
132 .pvr_value = 0x00350000,
133 .cpu_name = "POWER4 (gp)",
134 .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
135 CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
136 CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
137 .cpu_user_features = COMMON_USER_PPC64,
138 .icache_bsize = 128,
139 .dcache_bsize = 128,
Anton Blanchardfd5b4372005-09-06 14:47:49 +1000140 .num_pmcs = 8,
Anton Blanchard315a6992005-07-07 17:56:11 -0700141 .cpu_setup = __setup_cpu_power4,
Anton Blanchard315a6992005-07-07 17:56:11 -0700142 },
143 { /* Power4+ */
144 .pvr_mask = 0xffff0000,
145 .pvr_value = 0x00380000,
146 .cpu_name = "POWER4+ (gq)",
147 .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
148 CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
149 CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
150 .cpu_user_features = COMMON_USER_PPC64,
151 .icache_bsize = 128,
152 .dcache_bsize = 128,
Anton Blanchardfd5b4372005-09-06 14:47:49 +1000153 .num_pmcs = 8,
Anton Blanchard315a6992005-07-07 17:56:11 -0700154 .cpu_setup = __setup_cpu_power4,
Anton Blanchard315a6992005-07-07 17:56:11 -0700155 },
156 { /* PPC970 */
157 .pvr_mask = 0xffff0000,
158 .pvr_value = 0x00390000,
159 .cpu_name = "PPC970",
160 .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
161 CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
162 CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
163 CPU_FTR_CAN_NAP | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
164 .cpu_user_features = COMMON_USER_PPC64 |
165 PPC_FEATURE_HAS_ALTIVEC_COMP,
166 .icache_bsize = 128,
167 .dcache_bsize = 128,
Anton Blanchardfd5b4372005-09-06 14:47:49 +1000168 .num_pmcs = 8,
Anton Blanchard315a6992005-07-07 17:56:11 -0700169 .cpu_setup = __setup_cpu_ppc970,
Anton Blanchard315a6992005-07-07 17:56:11 -0700170 },
171 { /* PPC970FX */
172 .pvr_mask = 0xffff0000,
173 .pvr_value = 0x003c0000,
174 .cpu_name = "PPC970FX",
175 .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
176 CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
177 CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
178 CPU_FTR_CAN_NAP | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
179 .cpu_user_features = COMMON_USER_PPC64 |
180 PPC_FEATURE_HAS_ALTIVEC_COMP,
181 .icache_bsize = 128,
182 .dcache_bsize = 128,
Anton Blanchardfd5b4372005-09-06 14:47:49 +1000183 .num_pmcs = 8,
Anton Blanchard315a6992005-07-07 17:56:11 -0700184 .cpu_setup = __setup_cpu_ppc970,
Anton Blanchard315a6992005-07-07 17:56:11 -0700185 },
Olof Johanssonf264cc22005-07-13 01:11:44 -0700186 { /* PPC970MP */
187 .pvr_mask = 0xffff0000,
188 .pvr_value = 0x00440000,
189 .cpu_name = "PPC970MP",
190 .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
191 CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
192 CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
193 CPU_FTR_CAN_NAP | CPU_FTR_PMC8 | CPU_FTR_MMCRA,
194 .cpu_user_features = COMMON_USER_PPC64 |
195 PPC_FEATURE_HAS_ALTIVEC_COMP,
196 .icache_bsize = 128,
197 .dcache_bsize = 128,
198 .cpu_setup = __setup_cpu_ppc970,
Olof Johanssonf264cc22005-07-13 01:11:44 -0700199 },
Anton Blanchard315a6992005-07-07 17:56:11 -0700200 { /* Power5 */
201 .pvr_mask = 0xffff0000,
202 .pvr_value = 0x003a0000,
203 .cpu_name = "POWER5 (gr)",
204 .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
205 CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
206 CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA | CPU_FTR_SMT |
207 CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE |
208 CPU_FTR_MMCRA_SIHV,
209 .cpu_user_features = COMMON_USER_PPC64,
210 .icache_bsize = 128,
211 .dcache_bsize = 128,
Anton Blanchardfd5b4372005-09-06 14:47:49 +1000212 .num_pmcs = 6,
Anton Blanchard315a6992005-07-07 17:56:11 -0700213 .cpu_setup = __setup_cpu_power4,
Anton Blanchard315a6992005-07-07 17:56:11 -0700214 },
215 { /* Power5 */
216 .pvr_mask = 0xffff0000,
217 .pvr_value = 0x003b0000,
218 .cpu_name = "POWER5 (gs)",
219 .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
220 CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
221 CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_MMCRA | CPU_FTR_SMT |
222 CPU_FTR_COHERENT_ICACHE | CPU_FTR_LOCKLESS_TLBIE |
223 CPU_FTR_MMCRA_SIHV,
224 .cpu_user_features = COMMON_USER_PPC64,
225 .icache_bsize = 128,
226 .dcache_bsize = 128,
Anton Blanchardfd5b4372005-09-06 14:47:49 +1000227 .num_pmcs = 6,
Anton Blanchard315a6992005-07-07 17:56:11 -0700228 .cpu_setup = __setup_cpu_power4,
Anton Blanchard315a6992005-07-07 17:56:11 -0700229 },
230 { /* BE DD1.x */
231 .pvr_mask = 0xffff0000,
232 .pvr_value = 0x00700000,
233 .cpu_name = "Broadband Engine",
234 .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
235 CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
236 CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_ALTIVEC_COMP |
237 CPU_FTR_SMT,
238 .cpu_user_features = COMMON_USER_PPC64 |
239 PPC_FEATURE_HAS_ALTIVEC_COMP,
240 .icache_bsize = 128,
241 .dcache_bsize = 128,
242 .cpu_setup = __setup_cpu_be,
Anton Blanchard315a6992005-07-07 17:56:11 -0700243 },
244 { /* default match */
245 .pvr_mask = 0x00000000,
246 .pvr_value = 0x00000000,
247 .cpu_name = "POWER4 (compatible)",
248 .cpu_features = CPU_FTR_SPLIT_ID_CACHE |
249 CPU_FTR_USE_TB | CPU_FTR_HPTE_TABLE |
250 CPU_FTR_PPCAS_ARCH_V2,
251 .cpu_user_features = COMMON_USER_PPC64,
252 .icache_bsize = 128,
253 .dcache_bsize = 128,
Anton Blanchardfd5b4372005-09-06 14:47:49 +1000254 .num_pmcs = 6,
Anton Blanchard315a6992005-07-07 17:56:11 -0700255 .cpu_setup = __setup_cpu_power4,
Anton Blanchard315a6992005-07-07 17:56:11 -0700256 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700257};