11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * Copyright (C) 1995, 1996, 2001 Ralf Baechle 34194318cSRalf Baechle * Copyright (C) 2001, 2004 MIPS Technologies, Inc. 44194318cSRalf Baechle * Copyright (C) 2004 Maciej W. Rozycki 51da177e4SLinus Torvalds */ 61da177e4SLinus Torvalds #include <linux/delay.h> 71da177e4SLinus Torvalds #include <linux/kernel.h> 81da177e4SLinus Torvalds #include <linux/sched.h> 91da177e4SLinus Torvalds #include <linux/seq_file.h> 101da177e4SLinus Torvalds #include <asm/bootinfo.h> 111da177e4SLinus Torvalds #include <asm/cpu.h> 121da177e4SLinus Torvalds #include <asm/cpu-features.h> 131da177e4SLinus Torvalds #include <asm/mipsregs.h> 141da177e4SLinus Torvalds #include <asm/processor.h> 15487d70d0SGabor Juhos #include <asm/mips_machine.h> 161da177e4SLinus Torvalds 171da177e4SLinus Torvalds unsigned int vced_count, vcei_count; 181da177e4SLinus Torvalds 191da177e4SLinus Torvalds static int show_cpuinfo(struct seq_file *m, void *v) 201da177e4SLinus Torvalds { 211da177e4SLinus Torvalds unsigned long n = (unsigned long) v - 1; 2231aa3665SKarl-Johan Karlsson unsigned int version = cpu_data[n].processor_id; 2331aa3665SKarl-Johan Karlsson unsigned int fp_vers = cpu_data[n].fpu_id; 241da177e4SLinus Torvalds char fmt [64]; 25654f57bfSDavid Daney int i; 261da177e4SLinus Torvalds 271da177e4SLinus Torvalds #ifdef CONFIG_SMP 281da177e4SLinus Torvalds if (!cpu_isset(n, cpu_online_map)) 291da177e4SLinus Torvalds return 0; 301da177e4SLinus Torvalds #endif 311da177e4SLinus Torvalds 321da177e4SLinus Torvalds /* 331da177e4SLinus Torvalds * For the first processor also print the system type 341da177e4SLinus Torvalds */ 35487d70d0SGabor Juhos if (n == 0) { 361da177e4SLinus Torvalds seq_printf(m, "system type\t\t: %s\n", get_system_type()); 37487d70d0SGabor Juhos if (mips_get_machine_name()) 38487d70d0SGabor Juhos seq_printf(m, "machine\t\t\t: %s\n", 39487d70d0SGabor Juhos mips_get_machine_name()); 40487d70d0SGabor Juhos } 411da177e4SLinus Torvalds 421da177e4SLinus Torvalds seq_printf(m, "processor\t\t: %ld\n", n); 431da177e4SLinus Torvalds sprintf(fmt, "cpu model\t\t: %%s V%%d.%%d%s\n", 44e04582b7SAtsushi Nemoto cpu_data[n].options & MIPS_CPU_FPU ? " FPU V%d.%d" : ""); 45e47c659bSJohannes Dickgreber seq_printf(m, fmt, __cpu_name[n], 461da177e4SLinus Torvalds (version >> 4) & 0x0f, version & 0x0f, 471da177e4SLinus Torvalds (fp_vers >> 4) & 0x0f, fp_vers & 0x0f); 485636919bSRalf Baechle seq_printf(m, "BogoMIPS\t\t: %u.%02u\n", 490ac35480SRalf Baechle cpu_data[n].udelay_val / (500000/HZ), 500ac35480SRalf Baechle (cpu_data[n].udelay_val / (5000/HZ)) % 100); 511da177e4SLinus Torvalds seq_printf(m, "wait instruction\t: %s\n", cpu_wait ? "yes" : "no"); 521da177e4SLinus Torvalds seq_printf(m, "microsecond timers\t: %s\n", 531da177e4SLinus Torvalds cpu_has_counter ? "yes" : "no"); 5431aa3665SKarl-Johan Karlsson seq_printf(m, "tlb_entries\t\t: %d\n", cpu_data[n].tlbsize); 551da177e4SLinus Torvalds seq_printf(m, "extra interrupt vector\t: %s\n", 561da177e4SLinus Torvalds cpu_has_divec ? "yes" : "no"); 57654f57bfSDavid Daney seq_printf(m, "hardware watchpoint\t: %s", 58654f57bfSDavid Daney cpu_has_watch ? "yes, " : "no\n"); 59654f57bfSDavid Daney if (cpu_has_watch) { 60654f57bfSDavid Daney seq_printf(m, "count: %d, address/irw mask: [", 61654f57bfSDavid Daney cpu_data[n].watch_reg_count); 62654f57bfSDavid Daney for (i = 0; i < cpu_data[n].watch_reg_count; i++) 63654f57bfSDavid Daney seq_printf(m, "%s0x%04x", i ? ", " : "" , 64654f57bfSDavid Daney cpu_data[n].watch_reg_masks[i]); 65654f57bfSDavid Daney seq_printf(m, "]\n"); 66654f57bfSDavid Daney } 67e027802eSRalf Baechle seq_printf(m, "ASEs implemented\t:%s%s%s%s%s%s\n", 684194318cSRalf Baechle cpu_has_mips16 ? " mips16" : "", 694194318cSRalf Baechle cpu_has_mdmx ? " mdmx" : "", 704194318cSRalf Baechle cpu_has_mips3d ? " mips3d" : "", 71e027802eSRalf Baechle cpu_has_smartmips ? " smartmips" : "", 72e027802eSRalf Baechle cpu_has_dsp ? " dsp" : "", 73e027802eSRalf Baechle cpu_has_mipsmt ? " mt" : "" 74e027802eSRalf Baechle ); 75f6771dbbSRalf Baechle seq_printf(m, "shadow register sets\t: %d\n", 76f6771dbbSRalf Baechle cpu_data[n].srsets); 770ab7aefcSRalf Baechle seq_printf(m, "core\t\t\t: %d\n", cpu_data[n].core); 781da177e4SLinus Torvalds 791da177e4SLinus Torvalds sprintf(fmt, "VCE%%c exceptions\t\t: %s\n", 801da177e4SLinus Torvalds cpu_has_vce ? "%u" : "not available"); 811da177e4SLinus Torvalds seq_printf(m, fmt, 'D', vced_count); 821da177e4SLinus Torvalds seq_printf(m, fmt, 'I', vcei_count); 8317256052SMartin Michlmayr seq_printf(m, "\n"); 841da177e4SLinus Torvalds 851da177e4SLinus Torvalds return 0; 861da177e4SLinus Torvalds } 871da177e4SLinus Torvalds 881da177e4SLinus Torvalds static void *c_start(struct seq_file *m, loff_t *pos) 891da177e4SLinus Torvalds { 901da177e4SLinus Torvalds unsigned long i = *pos; 911da177e4SLinus Torvalds 921da177e4SLinus Torvalds return i < NR_CPUS ? (void *) (i + 1) : NULL; 931da177e4SLinus Torvalds } 941da177e4SLinus Torvalds 951da177e4SLinus Torvalds static void *c_next(struct seq_file *m, void *v, loff_t *pos) 961da177e4SLinus Torvalds { 971da177e4SLinus Torvalds ++*pos; 981da177e4SLinus Torvalds return c_start(m, pos); 991da177e4SLinus Torvalds } 1001da177e4SLinus Torvalds 1011da177e4SLinus Torvalds static void c_stop(struct seq_file *m, void *v) 1021da177e4SLinus Torvalds { 1031da177e4SLinus Torvalds } 1041da177e4SLinus Torvalds 10512323cacSJan Engelhardt const struct seq_operations cpuinfo_op = { 1061da177e4SLinus Torvalds .start = c_start, 1071da177e4SLinus Torvalds .next = c_next, 1081da177e4SLinus Torvalds .stop = c_stop, 1091da177e4SLinus Torvalds .show = show_cpuinfo, 1101da177e4SLinus Torvalds }; 111