|
@@ -4,6 +4,7 @@
|
|
|
* Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
|
|
|
*/
|
|
|
|
|
|
+#include <linux/seq_file.h>
|
|
|
#include <linux/kernel.h>
|
|
|
#include <linux/module.h>
|
|
|
#include <linux/init.h>
|
|
@@ -11,7 +12,9 @@
|
|
|
#include <linux/threads.h>
|
|
|
|
|
|
#include <asm/spitfire.h>
|
|
|
+#include <asm/pgtable.h>
|
|
|
#include <asm/oplib.h>
|
|
|
+#include <asm/setup.h>
|
|
|
#include <asm/page.h>
|
|
|
#include <asm/head.h>
|
|
|
#include <asm/psr.h>
|
|
@@ -23,6 +26,9 @@
|
|
|
DEFINE_PER_CPU(cpuinfo_sparc, __cpu_data) = { 0 };
|
|
|
EXPORT_PER_CPU_SYMBOL(__cpu_data);
|
|
|
|
|
|
+int ncpus_probed;
|
|
|
+unsigned int fsr_storage;
|
|
|
+
|
|
|
struct cpu_info {
|
|
|
int psr_vers;
|
|
|
const char *name;
|
|
@@ -247,11 +253,10 @@ static const struct manufacturer_info __initconst manufacturer_info[] = {
|
|
|
* machine type value into consideration too. I will fix this.
|
|
|
*/
|
|
|
|
|
|
-const char *sparc_cpu_type;
|
|
|
-const char *sparc_fpu_type;
|
|
|
+static const char *sparc_cpu_type;
|
|
|
+static const char *sparc_fpu_type;
|
|
|
const char *sparc_pmu_type;
|
|
|
|
|
|
-unsigned int fsr_storage;
|
|
|
|
|
|
static void set_cpu_and_fpu(int psr_impl, int psr_vers, int fpu_vers)
|
|
|
{
|
|
@@ -312,6 +317,122 @@ static void set_cpu_and_fpu(int psr_impl, int psr_vers, int fpu_vers)
|
|
|
sparc_pmu_type = "Unknown PMU";
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_SPARC32
|
|
|
+static int show_cpuinfo(struct seq_file *m, void *__unused)
|
|
|
+{
|
|
|
+ seq_printf(m,
|
|
|
+ "cpu\t\t: %s\n"
|
|
|
+ "fpu\t\t: %s\n"
|
|
|
+ "promlib\t\t: Version %d Revision %d\n"
|
|
|
+ "prom\t\t: %d.%d\n"
|
|
|
+ "type\t\t: %s\n"
|
|
|
+ "ncpus probed\t: %d\n"
|
|
|
+ "ncpus active\t: %d\n"
|
|
|
+#ifndef CONFIG_SMP
|
|
|
+ "CPU0Bogo\t: %lu.%02lu\n"
|
|
|
+ "CPU0ClkTck\t: %ld\n"
|
|
|
+#endif
|
|
|
+ ,
|
|
|
+ sparc_cpu_type,
|
|
|
+ sparc_fpu_type ,
|
|
|
+ romvec->pv_romvers,
|
|
|
+ prom_rev,
|
|
|
+ romvec->pv_printrev >> 16,
|
|
|
+ romvec->pv_printrev & 0xffff,
|
|
|
+ &cputypval[0],
|
|
|
+ ncpus_probed,
|
|
|
+ num_online_cpus()
|
|
|
+#ifndef CONFIG_SMP
|
|
|
+ , cpu_data(0).udelay_val/(500000/HZ),
|
|
|
+ (cpu_data(0).udelay_val/(5000/HZ)) % 100,
|
|
|
+ cpu_data(0).clock_tick
|
|
|
+#endif
|
|
|
+ );
|
|
|
+
|
|
|
+#ifdef CONFIG_SMP
|
|
|
+ smp_bogo(m);
|
|
|
+#endif
|
|
|
+ mmu_info(m);
|
|
|
+#ifdef CONFIG_SMP
|
|
|
+ smp_info(m);
|
|
|
+#endif
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#endif /* CONFIG_SPARC32 */
|
|
|
+
|
|
|
+#ifdef CONFIG_SPARC64
|
|
|
+unsigned int dcache_parity_tl1_occurred;
|
|
|
+unsigned int icache_parity_tl1_occurred;
|
|
|
+
|
|
|
+
|
|
|
+static int show_cpuinfo(struct seq_file *m, void *__unused)
|
|
|
+{
|
|
|
+ seq_printf(m,
|
|
|
+ "cpu\t\t: %s\n"
|
|
|
+ "fpu\t\t: %s\n"
|
|
|
+ "pmu\t\t: %s\n"
|
|
|
+ "prom\t\t: %s\n"
|
|
|
+ "type\t\t: %s\n"
|
|
|
+ "ncpus probed\t: %d\n"
|
|
|
+ "ncpus active\t: %d\n"
|
|
|
+ "D$ parity tl1\t: %u\n"
|
|
|
+ "I$ parity tl1\t: %u\n"
|
|
|
+#ifndef CONFIG_SMP
|
|
|
+ "Cpu0ClkTck\t: %016lx\n"
|
|
|
+#endif
|
|
|
+ ,
|
|
|
+ sparc_cpu_type,
|
|
|
+ sparc_fpu_type,
|
|
|
+ sparc_pmu_type,
|
|
|
+ prom_version,
|
|
|
+ ((tlb_type == hypervisor) ?
|
|
|
+ "sun4v" :
|
|
|
+ "sun4u"),
|
|
|
+ ncpus_probed,
|
|
|
+ num_online_cpus(),
|
|
|
+ dcache_parity_tl1_occurred,
|
|
|
+ icache_parity_tl1_occurred
|
|
|
+#ifndef CONFIG_SMP
|
|
|
+ , cpu_data(0).clock_tick
|
|
|
+#endif
|
|
|
+ );
|
|
|
+#ifdef CONFIG_SMP
|
|
|
+ smp_bogo(m);
|
|
|
+#endif
|
|
|
+ mmu_info(m);
|
|
|
+#ifdef CONFIG_SMP
|
|
|
+ smp_info(m);
|
|
|
+#endif
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#endif /* CONFIG_SPARC64 */
|
|
|
+
|
|
|
+static void *c_start(struct seq_file *m, loff_t *pos)
|
|
|
+{
|
|
|
+ /* The pointer we are returning is arbitrary,
|
|
|
+ * it just has to be non-NULL and not IS_ERR
|
|
|
+ * in the success case.
|
|
|
+ */
|
|
|
+ return *pos == 0 ? &c_start : NULL;
|
|
|
+}
|
|
|
+
|
|
|
+static void *c_next(struct seq_file *m, void *v, loff_t *pos)
|
|
|
+{
|
|
|
+ ++*pos;
|
|
|
+ return c_start(m, pos);
|
|
|
+}
|
|
|
+
|
|
|
+static void c_stop(struct seq_file *m, void *v)
|
|
|
+{
|
|
|
+}
|
|
|
+
|
|
|
+const struct seq_operations cpuinfo_op = {
|
|
|
+ .start =c_start,
|
|
|
+ .next = c_next,
|
|
|
+ .stop = c_stop,
|
|
|
+ .show = show_cpuinfo,
|
|
|
+};
|
|
|
+
|
|
|
#ifdef CONFIG_SPARC32
|
|
|
void __cpuinit cpu_probe(void)
|
|
|
{
|