diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/s390/kernel/Makefile | 4 | ||||
-rw-r--r-- | arch/s390/kernel/processor.c | 98 | ||||
-rw-r--r-- | arch/s390/kernel/setup.c | 88 | ||||
-rw-r--r-- | arch/s390/kernel/smp.c | 17 | ||||
-rw-r--r-- | arch/s390/kernel/topology.c | 5 |
5 files changed, 112 insertions, 100 deletions
diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile index 90dad65c20ec..3edc6c6f258b 100644 --- a/arch/s390/kernel/Makefile +++ b/arch/s390/kernel/Makefile | |||
@@ -17,8 +17,8 @@ CFLAGS_smp.o := -Wno-nonnull | |||
17 | # | 17 | # |
18 | CFLAGS_ptrace.o += -DUTS_MACHINE='"$(UTS_MACHINE)"' | 18 | CFLAGS_ptrace.o += -DUTS_MACHINE='"$(UTS_MACHINE)"' |
19 | 19 | ||
20 | obj-y := bitmap.o traps.o time.o process.o base.o early.o \ | 20 | obj-y := bitmap.o traps.o time.o process.o base.o early.o setup.o \ |
21 | setup.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \ | 21 | processor.o sys_s390.o ptrace.o signal.o cpcmd.o ebcdic.o \ |
22 | s390_ext.o debug.o irq.o ipl.o dis.o diag.o mem_detect.o \ | 22 | s390_ext.o debug.o irq.o ipl.o dis.o diag.o mem_detect.o \ |
23 | vdso.o vtime.o | 23 | vdso.o vtime.o |
24 | 24 | ||
diff --git a/arch/s390/kernel/processor.c b/arch/s390/kernel/processor.c new file mode 100644 index 000000000000..82c1872cfe80 --- /dev/null +++ b/arch/s390/kernel/processor.c | |||
@@ -0,0 +1,98 @@ | |||
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 | |||
17 | #include <asm/elf.h> | ||
18 | #include <asm/lowcore.h> | ||
19 | #include <asm/param.h> | ||
20 | |||
21 | void __cpuinit print_cpu_info(struct cpuinfo_S390 *cpuinfo) | ||
22 | { | ||
23 | pr_info("Processor %d started, address %d, identification %06X\n", | ||
24 | cpuinfo->cpu_nr, cpuinfo->cpu_addr, cpuinfo->cpu_id.ident); | ||
25 | } | ||
26 | |||
27 | /* | ||
28 | * show_cpuinfo - Get information on one CPU for use by procfs. | ||
29 | */ | ||
30 | |||
31 | static int show_cpuinfo(struct seq_file *m, void *v) | ||
32 | { | ||
33 | static const char *hwcap_str[8] = { | ||
34 | "esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp", | ||
35 | "edat" | ||
36 | }; | ||
37 | struct cpuinfo_S390 *cpuinfo; | ||
38 | unsigned long n = (unsigned long) v - 1; | ||
39 | int i; | ||
40 | |||
41 | s390_adjust_jiffies(); | ||
42 | preempt_disable(); | ||
43 | if (!n) { | ||
44 | seq_printf(m, "vendor_id : IBM/S390\n" | ||
45 | "# processors : %i\n" | ||
46 | "bogomips per cpu: %lu.%02lu\n", | ||
47 | num_online_cpus(), loops_per_jiffy/(500000/HZ), | ||
48 | (loops_per_jiffy/(5000/HZ))%100); | ||
49 | seq_puts(m, "features\t: "); | ||
50 | for (i = 0; i < 8; i++) | ||
51 | if (hwcap_str[i] && (elf_hwcap & (1UL << i))) | ||
52 | seq_printf(m, "%s ", hwcap_str[i]); | ||
53 | seq_puts(m, "\n"); | ||
54 | } | ||
55 | |||
56 | if (cpu_online(n)) { | ||
57 | #ifdef CONFIG_SMP | ||
58 | if (smp_processor_id() == n) | ||
59 | cpuinfo = &S390_lowcore.cpu_data; | ||
60 | else | ||
61 | cpuinfo = &lowcore_ptr[n]->cpu_data; | ||
62 | #else | ||
63 | cpuinfo = &S390_lowcore.cpu_data; | ||
64 | #endif | ||
65 | seq_printf(m, "processor %li: " | ||
66 | "version = %02X, " | ||
67 | "identification = %06X, " | ||
68 | "machine = %04X\n", | ||
69 | n, cpuinfo->cpu_id.version, | ||
70 | cpuinfo->cpu_id.ident, | ||
71 | cpuinfo->cpu_id.machine); | ||
72 | } | ||
73 | preempt_enable(); | ||
74 | return 0; | ||
75 | } | ||
76 | |||
77 | static void *c_start(struct seq_file *m, loff_t *pos) | ||
78 | { | ||
79 | return *pos < NR_CPUS ? (void *)((unsigned long) *pos + 1) : NULL; | ||
80 | } | ||
81 | |||
82 | static void *c_next(struct seq_file *m, void *v, loff_t *pos) | ||
83 | { | ||
84 | ++*pos; | ||
85 | return c_start(m, pos); | ||
86 | } | ||
87 | |||
88 | static void c_stop(struct seq_file *m, void *v) | ||
89 | { | ||
90 | } | ||
91 | |||
92 | const struct seq_operations cpuinfo_op = { | ||
93 | .start = c_start, | ||
94 | .next = c_next, | ||
95 | .stop = c_stop, | ||
96 | .show = show_cpuinfo, | ||
97 | }; | ||
98 | |||
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index ba724d180be7..b7a1efd5522c 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
@@ -35,7 +35,6 @@ | |||
35 | #include <linux/bootmem.h> | 35 | #include <linux/bootmem.h> |
36 | #include <linux/root_dev.h> | 36 | #include <linux/root_dev.h> |
37 | #include <linux/console.h> | 37 | #include <linux/console.h> |
38 | #include <linux/seq_file.h> | ||
39 | #include <linux/kernel_stat.h> | 38 | #include <linux/kernel_stat.h> |
40 | #include <linux/device.h> | 39 | #include <linux/device.h> |
41 | #include <linux/notifier.h> | 40 | #include <linux/notifier.h> |
@@ -829,90 +828,3 @@ setup_arch(char **cmdline_p) | |||
829 | /* Setup zfcpdump support */ | 828 | /* Setup zfcpdump support */ |
830 | setup_zfcpdump(console_devno); | 829 | setup_zfcpdump(console_devno); |
831 | } | 830 | } |
832 | |||
833 | void __cpuinit print_cpu_info(struct cpuinfo_S390 *cpuinfo) | ||
834 | { | ||
835 | printk(KERN_INFO "cpu %d " | ||
836 | #ifdef CONFIG_SMP | ||
837 | "phys_idx=%d " | ||
838 | #endif | ||
839 | "vers=%02X ident=%06X machine=%04X unused=%04X\n", | ||
840 | cpuinfo->cpu_nr, | ||
841 | #ifdef CONFIG_SMP | ||
842 | cpuinfo->cpu_addr, | ||
843 | #endif | ||
844 | cpuinfo->cpu_id.version, | ||
845 | cpuinfo->cpu_id.ident, | ||
846 | cpuinfo->cpu_id.machine, | ||
847 | cpuinfo->cpu_id.unused); | ||
848 | } | ||
849 | |||
850 | /* | ||
851 | * show_cpuinfo - Get information on one CPU for use by procfs. | ||
852 | */ | ||
853 | |||
854 | static int show_cpuinfo(struct seq_file *m, void *v) | ||
855 | { | ||
856 | static const char *hwcap_str[8] = { | ||
857 | "esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp", | ||
858 | "edat" | ||
859 | }; | ||
860 | struct cpuinfo_S390 *cpuinfo; | ||
861 | unsigned long n = (unsigned long) v - 1; | ||
862 | int i; | ||
863 | |||
864 | s390_adjust_jiffies(); | ||
865 | preempt_disable(); | ||
866 | if (!n) { | ||
867 | seq_printf(m, "vendor_id : IBM/S390\n" | ||
868 | "# processors : %i\n" | ||
869 | "bogomips per cpu: %lu.%02lu\n", | ||
870 | num_online_cpus(), loops_per_jiffy/(500000/HZ), | ||
871 | (loops_per_jiffy/(5000/HZ))%100); | ||
872 | seq_puts(m, "features\t: "); | ||
873 | for (i = 0; i < 8; i++) | ||
874 | if (hwcap_str[i] && (elf_hwcap & (1UL << i))) | ||
875 | seq_printf(m, "%s ", hwcap_str[i]); | ||
876 | seq_puts(m, "\n"); | ||
877 | } | ||
878 | |||
879 | if (cpu_online(n)) { | ||
880 | #ifdef CONFIG_SMP | ||
881 | if (smp_processor_id() == n) | ||
882 | cpuinfo = &S390_lowcore.cpu_data; | ||
883 | else | ||
884 | cpuinfo = &lowcore_ptr[n]->cpu_data; | ||
885 | #else | ||
886 | cpuinfo = &S390_lowcore.cpu_data; | ||
887 | #endif | ||
888 | seq_printf(m, "processor %li: " | ||
889 | "version = %02X, " | ||
890 | "identification = %06X, " | ||
891 | "machine = %04X\n", | ||
892 | n, cpuinfo->cpu_id.version, | ||
893 | cpuinfo->cpu_id.ident, | ||
894 | cpuinfo->cpu_id.machine); | ||
895 | } | ||
896 | preempt_enable(); | ||
897 | return 0; | ||
898 | } | ||
899 | |||
900 | static void *c_start(struct seq_file *m, loff_t *pos) | ||
901 | { | ||
902 | return *pos < NR_CPUS ? (void *)((unsigned long) *pos + 1) : NULL; | ||
903 | } | ||
904 | static void *c_next(struct seq_file *m, void *v, loff_t *pos) | ||
905 | { | ||
906 | ++*pos; | ||
907 | return c_start(m, pos); | ||
908 | } | ||
909 | static void c_stop(struct seq_file *m, void *v) | ||
910 | { | ||
911 | } | ||
912 | const struct seq_operations cpuinfo_op = { | ||
913 | .start = c_start, | ||
914 | .next = c_next, | ||
915 | .stop = c_stop, | ||
916 | .show = show_cpuinfo, | ||
917 | }; | ||
918 | |||
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index 1e7db1ab7453..6fc78541dc57 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -20,6 +20,9 @@ | |||
20 | * cpu_number_map in other architectures. | 20 | * cpu_number_map in other architectures. |
21 | */ | 21 | */ |
22 | 22 | ||
23 | #define KMSG_COMPONENT "cpu" | ||
24 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt | ||
25 | |||
23 | #include <linux/module.h> | 26 | #include <linux/module.h> |
24 | #include <linux/init.h> | 27 | #include <linux/init.h> |
25 | #include <linux/mm.h> | 28 | #include <linux/mm.h> |
@@ -251,8 +254,8 @@ static void __init smp_get_save_area(unsigned int cpu, unsigned int phy_cpu) | |||
251 | if (ipl_info.type != IPL_TYPE_FCP_DUMP) | 254 | if (ipl_info.type != IPL_TYPE_FCP_DUMP) |
252 | return; | 255 | return; |
253 | if (cpu >= NR_CPUS) { | 256 | if (cpu >= NR_CPUS) { |
254 | printk(KERN_WARNING "Registers for cpu %i not saved since dump " | 257 | pr_warning("CPU %i exceeds the maximum %i and is excluded from " |
255 | "kernel was compiled with NR_CPUS=%i\n", cpu, NR_CPUS); | 258 | "the dump\n", cpu, NR_CPUS - 1); |
256 | return; | 259 | return; |
257 | } | 260 | } |
258 | zfcpdump_save_areas[cpu] = kmalloc(sizeof(union save_area), GFP_KERNEL); | 261 | zfcpdump_save_areas[cpu] = kmalloc(sizeof(union save_area), GFP_KERNEL); |
@@ -425,7 +428,7 @@ static void __init smp_detect_cpus(void) | |||
425 | } | 428 | } |
426 | out: | 429 | out: |
427 | kfree(info); | 430 | kfree(info); |
428 | printk(KERN_INFO "CPUs: %d configured, %d standby\n", c_cpus, s_cpus); | 431 | pr_info("%d configured CPUs, %d standby CPUs\n", c_cpus, s_cpus); |
429 | get_online_cpus(); | 432 | get_online_cpus(); |
430 | __smp_rescan_cpus(); | 433 | __smp_rescan_cpus(); |
431 | put_online_cpus(); | 434 | put_online_cpus(); |
@@ -548,12 +551,8 @@ int __cpuinit __cpu_up(unsigned int cpu) | |||
548 | 551 | ||
549 | ccode = signal_processor_p((__u32)(unsigned long)(lowcore_ptr[cpu]), | 552 | ccode = signal_processor_p((__u32)(unsigned long)(lowcore_ptr[cpu]), |
550 | cpu, sigp_set_prefix); | 553 | cpu, sigp_set_prefix); |
551 | if (ccode) { | 554 | if (ccode) |
552 | printk("sigp_set_prefix failed for cpu %d " | ||
553 | "with condition code %d\n", | ||
554 | (int) cpu, (int) ccode); | ||
555 | return -EIO; | 555 | return -EIO; |
556 | } | ||
557 | 556 | ||
558 | idle = current_set[cpu]; | 557 | idle = current_set[cpu]; |
559 | cpu_lowcore = lowcore_ptr[cpu]; | 558 | cpu_lowcore = lowcore_ptr[cpu]; |
@@ -636,7 +635,7 @@ void __cpu_die(unsigned int cpu) | |||
636 | while (!smp_cpu_not_running(cpu)) | 635 | while (!smp_cpu_not_running(cpu)) |
637 | cpu_relax(); | 636 | cpu_relax(); |
638 | smp_free_lowcore(cpu); | 637 | smp_free_lowcore(cpu); |
639 | printk(KERN_INFO "Processor %d spun down\n", cpu); | 638 | pr_info("Processor %d stopped\n", cpu); |
640 | } | 639 | } |
641 | 640 | ||
642 | void cpu_die(void) | 641 | void cpu_die(void) |
diff --git a/arch/s390/kernel/topology.c b/arch/s390/kernel/topology.c index b3aac53fd6dc..83579ed62933 100644 --- a/arch/s390/kernel/topology.c +++ b/arch/s390/kernel/topology.c | |||
@@ -3,6 +3,9 @@ | |||
3 | * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com> | 3 | * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com> |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #define KMSG_COMPONENT "cpu" | ||
7 | #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt | ||
8 | |||
6 | #include <linux/kernel.h> | 9 | #include <linux/kernel.h> |
7 | #include <linux/mm.h> | 10 | #include <linux/mm.h> |
8 | #include <linux/init.h> | 11 | #include <linux/init.h> |
@@ -306,7 +309,7 @@ void __init s390_init_cpu_topology(void) | |||
306 | for (i = 0; i < info->mnest - 2; i++) | 309 | for (i = 0; i < info->mnest - 2; i++) |
307 | nr_cores *= info->mag[NR_MAG - 3 - i]; | 310 | nr_cores *= info->mag[NR_MAG - 3 - i]; |
308 | 311 | ||
309 | printk(KERN_INFO "CPU topology:"); | 312 | pr_info("The CPU configuration topology of the machine is:"); |
310 | for (i = 0; i < NR_MAG; i++) | 313 | for (i = 0; i < NR_MAG; i++) |
311 | printk(" %d", info->mag[i]); | 314 | printk(" %d", info->mag[i]); |
312 | printk(" / %d\n", info->mnest); | 315 | printk(" / %d\n", info->mnest); |