diff options
Diffstat (limited to 'arch/sparc/kernel/cpu.c')
-rw-r--r-- | arch/sparc/kernel/cpu.c | 127 |
1 files changed, 124 insertions, 3 deletions
diff --git a/arch/sparc/kernel/cpu.c b/arch/sparc/kernel/cpu.c index 7925c54f4133..c3483c71aa04 100644 --- a/arch/sparc/kernel/cpu.c +++ b/arch/sparc/kernel/cpu.c | |||
@@ -4,6 +4,7 @@ | |||
4 | * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) | 4 | * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) |
5 | */ | 5 | */ |
6 | 6 | ||
7 | #include <linux/seq_file.h> | ||
7 | #include <linux/kernel.h> | 8 | #include <linux/kernel.h> |
8 | #include <linux/module.h> | 9 | #include <linux/module.h> |
9 | #include <linux/init.h> | 10 | #include <linux/init.h> |
@@ -11,7 +12,9 @@ | |||
11 | #include <linux/threads.h> | 12 | #include <linux/threads.h> |
12 | 13 | ||
13 | #include <asm/spitfire.h> | 14 | #include <asm/spitfire.h> |
15 | #include <asm/pgtable.h> | ||
14 | #include <asm/oplib.h> | 16 | #include <asm/oplib.h> |
17 | #include <asm/setup.h> | ||
15 | #include <asm/page.h> | 18 | #include <asm/page.h> |
16 | #include <asm/head.h> | 19 | #include <asm/head.h> |
17 | #include <asm/psr.h> | 20 | #include <asm/psr.h> |
@@ -23,6 +26,9 @@ | |||
23 | DEFINE_PER_CPU(cpuinfo_sparc, __cpu_data) = { 0 }; | 26 | DEFINE_PER_CPU(cpuinfo_sparc, __cpu_data) = { 0 }; |
24 | EXPORT_PER_CPU_SYMBOL(__cpu_data); | 27 | EXPORT_PER_CPU_SYMBOL(__cpu_data); |
25 | 28 | ||
29 | int ncpus_probed; | ||
30 | unsigned int fsr_storage; | ||
31 | |||
26 | struct cpu_info { | 32 | struct cpu_info { |
27 | int psr_vers; | 33 | int psr_vers; |
28 | const char *name; | 34 | const char *name; |
@@ -247,11 +253,10 @@ static const struct manufacturer_info __initconst manufacturer_info[] = { | |||
247 | * machine type value into consideration too. I will fix this. | 253 | * machine type value into consideration too. I will fix this. |
248 | */ | 254 | */ |
249 | 255 | ||
250 | const char *sparc_cpu_type; | 256 | static const char *sparc_cpu_type; |
251 | const char *sparc_fpu_type; | 257 | static const char *sparc_fpu_type; |
252 | const char *sparc_pmu_type; | 258 | const char *sparc_pmu_type; |
253 | 259 | ||
254 | unsigned int fsr_storage; | ||
255 | 260 | ||
256 | static void set_cpu_and_fpu(int psr_impl, int psr_vers, int fpu_vers) | 261 | static void set_cpu_and_fpu(int psr_impl, int psr_vers, int fpu_vers) |
257 | { | 262 | { |
@@ -313,6 +318,122 @@ static void set_cpu_and_fpu(int psr_impl, int psr_vers, int fpu_vers) | |||
313 | } | 318 | } |
314 | 319 | ||
315 | #ifdef CONFIG_SPARC32 | 320 | #ifdef CONFIG_SPARC32 |
321 | static int show_cpuinfo(struct seq_file *m, void *__unused) | ||
322 | { | ||
323 | seq_printf(m, | ||
324 | "cpu\t\t: %s\n" | ||
325 | "fpu\t\t: %s\n" | ||
326 | "promlib\t\t: Version %d Revision %d\n" | ||
327 | "prom\t\t: %d.%d\n" | ||
328 | "type\t\t: %s\n" | ||
329 | "ncpus probed\t: %d\n" | ||
330 | "ncpus active\t: %d\n" | ||
331 | #ifndef CONFIG_SMP | ||
332 | "CPU0Bogo\t: %lu.%02lu\n" | ||
333 | "CPU0ClkTck\t: %ld\n" | ||
334 | #endif | ||
335 | , | ||
336 | sparc_cpu_type, | ||
337 | sparc_fpu_type , | ||
338 | romvec->pv_romvers, | ||
339 | prom_rev, | ||
340 | romvec->pv_printrev >> 16, | ||
341 | romvec->pv_printrev & 0xffff, | ||
342 | &cputypval[0], | ||
343 | ncpus_probed, | ||
344 | num_online_cpus() | ||
345 | #ifndef CONFIG_SMP | ||
346 | , cpu_data(0).udelay_val/(500000/HZ), | ||
347 | (cpu_data(0).udelay_val/(5000/HZ)) % 100, | ||
348 | cpu_data(0).clock_tick | ||
349 | #endif | ||
350 | ); | ||
351 | |||
352 | #ifdef CONFIG_SMP | ||
353 | smp_bogo(m); | ||
354 | #endif | ||
355 | mmu_info(m); | ||
356 | #ifdef CONFIG_SMP | ||
357 | smp_info(m); | ||
358 | #endif | ||
359 | return 0; | ||
360 | } | ||
361 | #endif /* CONFIG_SPARC32 */ | ||
362 | |||
363 | #ifdef CONFIG_SPARC64 | ||
364 | unsigned int dcache_parity_tl1_occurred; | ||
365 | unsigned int icache_parity_tl1_occurred; | ||
366 | |||
367 | |||
368 | static int show_cpuinfo(struct seq_file *m, void *__unused) | ||
369 | { | ||
370 | seq_printf(m, | ||
371 | "cpu\t\t: %s\n" | ||
372 | "fpu\t\t: %s\n" | ||
373 | "pmu\t\t: %s\n" | ||
374 | "prom\t\t: %s\n" | ||
375 | "type\t\t: %s\n" | ||
376 | "ncpus probed\t: %d\n" | ||
377 | "ncpus active\t: %d\n" | ||
378 | "D$ parity tl1\t: %u\n" | ||
379 | "I$ parity tl1\t: %u\n" | ||
380 | #ifndef CONFIG_SMP | ||
381 | "Cpu0ClkTck\t: %016lx\n" | ||
382 | #endif | ||
383 | , | ||
384 | sparc_cpu_type, | ||
385 | sparc_fpu_type, | ||
386 | sparc_pmu_type, | ||
387 | prom_version, | ||
388 | ((tlb_type == hypervisor) ? | ||
389 | "sun4v" : | ||
390 | "sun4u"), | ||
391 | ncpus_probed, | ||
392 | num_online_cpus(), | ||
393 | dcache_parity_tl1_occurred, | ||
394 | icache_parity_tl1_occurred | ||
395 | #ifndef CONFIG_SMP | ||
396 | , cpu_data(0).clock_tick | ||
397 | #endif | ||
398 | ); | ||
399 | #ifdef CONFIG_SMP | ||
400 | smp_bogo(m); | ||
401 | #endif | ||
402 | mmu_info(m); | ||
403 | #ifdef CONFIG_SMP | ||
404 | smp_info(m); | ||
405 | #endif | ||
406 | return 0; | ||
407 | } | ||
408 | #endif /* CONFIG_SPARC64 */ | ||
409 | |||
410 | static void *c_start(struct seq_file *m, loff_t *pos) | ||
411 | { | ||
412 | /* The pointer we are returning is arbitrary, | ||
413 | * it just has to be non-NULL and not IS_ERR | ||
414 | * in the success case. | ||
415 | */ | ||
416 | return *pos == 0 ? &c_start : NULL; | ||
417 | } | ||
418 | |||
419 | static void *c_next(struct seq_file *m, void *v, loff_t *pos) | ||
420 | { | ||
421 | ++*pos; | ||
422 | return c_start(m, pos); | ||
423 | } | ||
424 | |||
425 | static void c_stop(struct seq_file *m, void *v) | ||
426 | { | ||
427 | } | ||
428 | |||
429 | const struct seq_operations cpuinfo_op = { | ||
430 | .start =c_start, | ||
431 | .next = c_next, | ||
432 | .stop = c_stop, | ||
433 | .show = show_cpuinfo, | ||
434 | }; | ||
435 | |||
436 | #ifdef CONFIG_SPARC32 | ||
316 | void __cpuinit cpu_probe(void) | 437 | void __cpuinit cpu_probe(void) |
317 | { | 438 | { |
318 | int psr_impl, psr_vers, fpu_vers; | 439 | int psr_impl, psr_vers, fpu_vers; |