linux/arch/s390/kernel/processor.c
<<
>>
Prefs
   1/*
   2 *  arch/s390/kernel/processor.c
   3 *
   4 *  Copyright IBM Corp. 2008
   5 *  Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
   6 */
   7
   8#define KMSG_COMPONENT "cpu"
   9#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
  10
  11#include <linux/kernel.h>
  12#include <linux/init.h>
  13#include <linux/smp.h>
  14#include <linux/seq_file.h>
  15#include <linux/delay.h>
  16#include <linux/cpu.h>
  17#include <asm/elf.h>
  18#include <asm/lowcore.h>
  19#include <asm/param.h>
  20
  21static DEFINE_PER_CPU(struct cpuid, cpu_id);
  22
  23/*
  24 * cpu_init - initializes state that is per-CPU.
  25 */
  26void __cpuinit cpu_init(void)
  27{
  28        struct cpuid *id = &per_cpu(cpu_id, smp_processor_id());
  29
  30        get_cpu_id(id);
  31        atomic_inc(&init_mm.mm_count);
  32        current->active_mm = &init_mm;
  33        BUG_ON(current->mm);
  34        enter_lazy_tlb(&init_mm, current);
  35}
  36
  37/*
  38 * show_cpuinfo - Get information on one CPU for use by procfs.
  39 */
  40static int show_cpuinfo(struct seq_file *m, void *v)
  41{
  42        static const char *hwcap_str[10] = {
  43                "esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp",
  44                "edat", "etf3eh", "highgprs"
  45        };
  46        unsigned long n = (unsigned long) v - 1;
  47        int i;
  48
  49        if (!n) {
  50                s390_adjust_jiffies();
  51                seq_printf(m, "vendor_id       : IBM/S390\n"
  52                           "# processors    : %i\n"
  53                           "bogomips per cpu: %lu.%02lu\n",
  54                           num_online_cpus(), loops_per_jiffy/(500000/HZ),
  55                           (loops_per_jiffy/(5000/HZ))%100);
  56                seq_puts(m, "features\t: ");
  57                for (i = 0; i < 10; i++)
  58                        if (hwcap_str[i] && (elf_hwcap & (1UL << i)))
  59                                seq_printf(m, "%s ", hwcap_str[i]);
  60                seq_puts(m, "\n");
  61        }
  62        get_online_cpus();
  63        if (cpu_online(n)) {
  64                struct cpuid *id = &per_cpu(cpu_id, n);
  65                seq_printf(m, "processor %li: "
  66                           "version = %02X,  "
  67                           "identification = %06X,  "
  68                           "machine = %04X\n",
  69                           n, id->version, id->ident, id->machine);
  70        }
  71        put_online_cpus();
  72        return 0;
  73}
  74
  75static void *c_start(struct seq_file *m, loff_t *pos)
  76{
  77        return *pos < nr_cpu_ids ? (void *)((unsigned long) *pos + 1) : NULL;
  78}
  79
  80static void *c_next(struct seq_file *m, void *v, loff_t *pos)
  81{
  82        ++*pos;
  83        return c_start(m, pos);
  84}
  85
  86static void c_stop(struct seq_file *m, void *v)
  87{
  88}
  89
  90const struct seq_operations cpuinfo_op = {
  91        .start  = c_start,
  92        .next   = c_next,
  93        .stop   = c_stop,
  94        .show   = show_cpuinfo,
  95};
  96
  97