diff options
Diffstat (limited to 'arch/sh')
-rw-r--r-- | arch/sh/kernel/cpu/sh4/probe.c | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/arch/sh/kernel/cpu/sh4/probe.c b/arch/sh/kernel/cpu/sh4/probe.c index 7d821ce8434f..28a2f0db01db 100644 --- a/arch/sh/kernel/cpu/sh4/probe.c +++ b/arch/sh/kernel/cpu/sh4/probe.c | |||
@@ -134,7 +134,7 @@ int __init detect_cpu_and_cache_system(void) | |||
134 | boot_cpu_data.icache.ways = 4; | 134 | boot_cpu_data.icache.ways = 4; |
135 | boot_cpu_data.dcache.ways = 4; | 135 | boot_cpu_data.dcache.ways = 4; |
136 | boot_cpu_data.flags |= CPU_HAS_FPU | CPU_HAS_PERF_COUNTER | | 136 | boot_cpu_data.flags |= CPU_HAS_FPU | CPU_HAS_PERF_COUNTER | |
137 | CPU_HAS_LLSC | CPU_HAS_PTEAEX; | 137 | CPU_HAS_LLSC | CPU_HAS_PTEAEX | CPU_HAS_L2_CACHE; |
138 | break; | 138 | break; |
139 | case 0x3008: | 139 | case 0x3008: |
140 | boot_cpu_data.icache.ways = 4; | 140 | boot_cpu_data.icache.ways = 4; |
@@ -228,43 +228,48 @@ int __init detect_cpu_and_cache_system(void) | |||
228 | } | 228 | } |
229 | 229 | ||
230 | /* | 230 | /* |
231 | * Setup the L2 cache desc | ||
232 | * | ||
233 | * SH-4A's have an optional PIPT L2. | 231 | * SH-4A's have an optional PIPT L2. |
234 | */ | 232 | */ |
235 | if (boot_cpu_data.flags & CPU_HAS_L2_CACHE) { | 233 | if (boot_cpu_data.flags & CPU_HAS_L2_CACHE) { |
236 | /* Bug if we can't decode the L2 info */ | ||
237 | BUG_ON(!(cvr & 0xf)); | ||
238 | |||
239 | /* Silicon and specifications have clearly never met.. */ | ||
240 | cvr ^= 0xf; | ||
241 | |||
242 | /* | 234 | /* |
243 | * Size calculation is much more sensible | 235 | * Verify that it really has something hooked up, this |
244 | * than it is for the L1. | 236 | * is the safety net for CPUs that have optional L2 |
245 | * | 237 | * support yet do not implement it. |
246 | * Sizes are 128KB, 258KB, 512KB, and 1MB. | ||
247 | */ | 238 | */ |
248 | size = (cvr & 0xf) << 17; | 239 | if ((cvr & 0xf) == 0) |
240 | boot_cpu_data.flags &= ~CPU_HAS_L2_CACHE; | ||
241 | else { | ||
242 | /* | ||
243 | * Silicon and specifications have clearly never | ||
244 | * met.. | ||
245 | */ | ||
246 | cvr ^= 0xf; | ||
249 | 247 | ||
250 | BUG_ON(!size); | 248 | /* |
249 | * Size calculation is much more sensible | ||
250 | * than it is for the L1. | ||
251 | * | ||
252 | * Sizes are 128KB, 258KB, 512KB, and 1MB. | ||
253 | */ | ||
254 | size = (cvr & 0xf) << 17; | ||
251 | 255 | ||
252 | boot_cpu_data.scache.way_incr = (1 << 16); | 256 | boot_cpu_data.scache.way_incr = (1 << 16); |
253 | boot_cpu_data.scache.entry_shift = 5; | 257 | boot_cpu_data.scache.entry_shift = 5; |
254 | boot_cpu_data.scache.ways = 4; | 258 | boot_cpu_data.scache.ways = 4; |
255 | boot_cpu_data.scache.linesz = L1_CACHE_BYTES; | 259 | boot_cpu_data.scache.linesz = L1_CACHE_BYTES; |
256 | 260 | ||
257 | boot_cpu_data.scache.entry_mask = | 261 | boot_cpu_data.scache.entry_mask = |
258 | (boot_cpu_data.scache.way_incr - | 262 | (boot_cpu_data.scache.way_incr - |
259 | boot_cpu_data.scache.linesz); | 263 | boot_cpu_data.scache.linesz); |
260 | 264 | ||
261 | boot_cpu_data.scache.sets = size / | 265 | boot_cpu_data.scache.sets = size / |
262 | (boot_cpu_data.scache.linesz * | 266 | (boot_cpu_data.scache.linesz * |
263 | boot_cpu_data.scache.ways); | 267 | boot_cpu_data.scache.ways); |
264 | 268 | ||
265 | boot_cpu_data.scache.way_size = | 269 | boot_cpu_data.scache.way_size = |
266 | (boot_cpu_data.scache.sets * | 270 | (boot_cpu_data.scache.sets * |
267 | boot_cpu_data.scache.linesz); | 271 | boot_cpu_data.scache.linesz); |
272 | } | ||
268 | } | 273 | } |
269 | 274 | ||
270 | return 0; | 275 | return 0; |