aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/s390/include/asm/lowcore.h15
-rw-r--r--arch/s390/include/asm/processor.h16
-rw-r--r--arch/s390/include/asm/smp.h7
-rw-r--r--arch/s390/kernel/processor.c69
-rw-r--r--arch/s390/kernel/setup.c10
-rw-r--r--arch/s390/kernel/smp.c8
6 files changed, 51 insertions, 74 deletions
diff --git a/arch/s390/include/asm/lowcore.h b/arch/s390/include/asm/lowcore.h
index f94386ece0d3..ad543c11826d 100644
--- a/arch/s390/include/asm/lowcore.h
+++ b/arch/s390/include/asm/lowcore.h
@@ -80,7 +80,6 @@
80#define __LC_USER_ASCE 0xC50 80#define __LC_USER_ASCE 0xC50
81#define __LC_PANIC_STACK 0xC54 81#define __LC_PANIC_STACK 0xC54
82#define __LC_CPUID 0xC60 82#define __LC_CPUID 0xC60
83#define __LC_CPUADDR 0xC68
84#define __LC_IPLDEV 0xC7C 83#define __LC_IPLDEV 0xC7C
85#define __LC_CURRENT 0xC90 84#define __LC_CURRENT 0xC90
86#define __LC_INT_CLOCK 0xC98 85#define __LC_INT_CLOCK 0xC98
@@ -102,7 +101,6 @@
102#define __LC_USER_ASCE 0xD60 101#define __LC_USER_ASCE 0xD60
103#define __LC_PANIC_STACK 0xD68 102#define __LC_PANIC_STACK 0xD68
104#define __LC_CPUID 0xD80 103#define __LC_CPUID 0xD80
105#define __LC_CPUADDR 0xD88
106#define __LC_IPLDEV 0xDB8 104#define __LC_IPLDEV 0xDB8
107#define __LC_CURRENT 0xDD8 105#define __LC_CURRENT 0xDD8
108#define __LC_INT_CLOCK 0xDE8 106#define __LC_INT_CLOCK 0xDE8
@@ -273,8 +271,10 @@ struct _lowcore
273 __u32 user_exec_asce; /* 0xc58 */ 271 __u32 user_exec_asce; /* 0xc58 */
274 __u8 pad10[0xc60-0xc5c]; /* 0xc5c */ 272 __u8 pad10[0xc60-0xc5c]; /* 0xc5c */
275 /* entry.S sensitive area start */ 273 /* entry.S sensitive area start */
276 struct cpuinfo_S390 cpu_data; /* 0xc60 */ 274 cpuid_t cpu_id; /* 0xc60 */
277 __u32 ipl_device; /* 0xc7c */ 275 __u32 cpu_nr; /* 0xc68 */
276 __u32 ipl_device; /* 0xc6c */
277 __u8 pad_0xc70[0xc80-0xc70]; /* 0xc70 */
278 /* entry.S sensitive area end */ 278 /* entry.S sensitive area end */
279 279
280 /* SMP info area: defined by DJB */ 280 /* SMP info area: defined by DJB */
@@ -366,9 +366,10 @@ struct _lowcore
366 __u64 user_exec_asce; /* 0xd70 */ 366 __u64 user_exec_asce; /* 0xd70 */
367 __u8 pad10[0xd80-0xd78]; /* 0xd78 */ 367 __u8 pad10[0xd80-0xd78]; /* 0xd78 */
368 /* entry.S sensitive area start */ 368 /* entry.S sensitive area start */
369 struct cpuinfo_S390 cpu_data; /* 0xd80 */ 369 cpuid_t cpu_id; /* 0xd80 */
370 __u32 ipl_device; /* 0xdb8 */ 370 __u32 cpu_nr; /* 0xd88 */
371 __u32 pad11; /* 0xdbc */ 371 __u32 ipl_device; /* 0xd8c */
372 __u8 pad_0xd90[0xdc0-0xd90]; /* 0xd90 */
372 /* entry.S sensitive area end */ 373 /* entry.S sensitive area end */
373 374
374 /* SMP info area: defined by DJB */ 375 /* SMP info area: defined by DJB */
diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h
index db4523fe38ac..61862b3ac794 100644
--- a/arch/s390/include/asm/processor.h
+++ b/arch/s390/include/asm/processor.h
@@ -42,22 +42,8 @@ static inline void get_cpu_id(cpuid_t *ptr)
42 asm volatile("stidp 0(%1)" : "=m" (*ptr) : "a" (ptr)); 42 asm volatile("stidp 0(%1)" : "=m" (*ptr) : "a" (ptr));
43} 43}
44 44
45struct cpuinfo_S390
46{
47 cpuid_t cpu_id;
48 __u16 cpu_addr;
49 __u16 cpu_nr;
50 unsigned long loops_per_jiffy;
51 unsigned long *pgd_quick;
52#ifdef __s390x__
53 unsigned long *pmd_quick;
54#endif /* __s390x__ */
55 unsigned long *pte_quick;
56 unsigned long pgtable_cache_sz;
57};
58
59extern void s390_adjust_jiffies(void); 45extern void s390_adjust_jiffies(void);
60extern void print_cpu_info(struct cpuinfo_S390 *); 46extern void print_cpu_info(void);
61extern int get_cpu_capability(unsigned int *); 47extern int get_cpu_capability(unsigned int *);
62 48
63/* 49/*
diff --git a/arch/s390/include/asm/smp.h b/arch/s390/include/asm/smp.h
index 024b91e06239..2009158a4502 100644
--- a/arch/s390/include/asm/smp.h
+++ b/arch/s390/include/asm/smp.h
@@ -50,12 +50,7 @@ extern void machine_power_off_smp(void);
50 50
51#define PROC_CHANGE_PENALTY 20 /* Schedule penalty */ 51#define PROC_CHANGE_PENALTY 20 /* Schedule penalty */
52 52
53#define raw_smp_processor_id() (S390_lowcore.cpu_data.cpu_nr) 53#define raw_smp_processor_id() (S390_lowcore.cpu_nr)
54
55static inline __u16 hard_smp_processor_id(void)
56{
57 return stap();
58}
59 54
60/* 55/*
61 * returns 1 if cpu is in stopped/check stopped state or not operational 56 * returns 1 if cpu is in stopped/check stopped state or not operational
diff --git a/arch/s390/kernel/processor.c b/arch/s390/kernel/processor.c
index 82c1872cfe80..423da1bd42a4 100644
--- a/arch/s390/kernel/processor.c
+++ b/arch/s390/kernel/processor.c
@@ -18,10 +18,11 @@
18#include <asm/lowcore.h> 18#include <asm/lowcore.h>
19#include <asm/param.h> 19#include <asm/param.h>
20 20
21void __cpuinit print_cpu_info(struct cpuinfo_S390 *cpuinfo) 21void __cpuinit print_cpu_info(void)
22{ 22{
23 pr_info("Processor %d started, address %d, identification %06X\n", 23 pr_info("Processor %d started, address %d, identification %06X\n",
24 cpuinfo->cpu_nr, cpuinfo->cpu_addr, cpuinfo->cpu_id.ident); 24 S390_lowcore.cpu_nr, S390_lowcore.cpu_addr,
25 S390_lowcore.cpu_id.ident);
25} 26}
26 27
27/* 28/*
@@ -34,44 +35,42 @@ static int show_cpuinfo(struct seq_file *m, void *v)
34 "esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp", 35 "esan3", "zarch", "stfle", "msa", "ldisp", "eimm", "dfp",
35 "edat" 36 "edat"
36 }; 37 };
37 struct cpuinfo_S390 *cpuinfo; 38 struct _lowcore *lc;
38 unsigned long n = (unsigned long) v - 1; 39 unsigned long n = (unsigned long) v - 1;
39 int i; 40 int i;
40 41
41 s390_adjust_jiffies(); 42 s390_adjust_jiffies();
42 preempt_disable(); 43 preempt_disable();
43 if (!n) { 44 if (!n) {
44 seq_printf(m, "vendor_id : IBM/S390\n" 45 seq_printf(m, "vendor_id : IBM/S390\n"
45 "# processors : %i\n" 46 "# processors : %i\n"
46 "bogomips per cpu: %lu.%02lu\n", 47 "bogomips per cpu: %lu.%02lu\n",
47 num_online_cpus(), loops_per_jiffy/(500000/HZ), 48 num_online_cpus(), loops_per_jiffy/(500000/HZ),
48 (loops_per_jiffy/(5000/HZ))%100); 49 (loops_per_jiffy/(5000/HZ))%100);
49 seq_puts(m, "features\t: "); 50 seq_puts(m, "features\t: ");
50 for (i = 0; i < 8; i++) 51 for (i = 0; i < 8; i++)
51 if (hwcap_str[i] && (elf_hwcap & (1UL << i))) 52 if (hwcap_str[i] && (elf_hwcap & (1UL << i)))
52 seq_printf(m, "%s ", hwcap_str[i]); 53 seq_printf(m, "%s ", hwcap_str[i]);
53 seq_puts(m, "\n"); 54 seq_puts(m, "\n");
54 } 55 }
55 56
56 if (cpu_online(n)) { 57 if (cpu_online(n)) {
57#ifdef CONFIG_SMP 58#ifdef CONFIG_SMP
58 if (smp_processor_id() == n) 59 lc = (smp_processor_id() == n) ?
59 cpuinfo = &S390_lowcore.cpu_data; 60 &S390_lowcore : lowcore_ptr[n];
60 else
61 cpuinfo = &lowcore_ptr[n]->cpu_data;
62#else 61#else
63 cpuinfo = &S390_lowcore.cpu_data; 62 lc = &S390_lowcore;
64#endif 63#endif
65 seq_printf(m, "processor %li: " 64 seq_printf(m, "processor %li: "
66 "version = %02X, " 65 "version = %02X, "
67 "identification = %06X, " 66 "identification = %06X, "
68 "machine = %04X\n", 67 "machine = %04X\n",
69 n, cpuinfo->cpu_id.version, 68 n, lc->cpu_id.version,
70 cpuinfo->cpu_id.ident, 69 lc->cpu_id.ident,
71 cpuinfo->cpu_id.machine); 70 lc->cpu_id.machine);
72 } 71 }
73 preempt_enable(); 72 preempt_enable();
74 return 0; 73 return 0;
75} 74}
76 75
77static void *c_start(struct seq_file *m, loff_t *pos) 76static void *c_start(struct seq_file *m, loff_t *pos)
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c
index dd3c51736270..9c8853f21bb2 100644
--- a/arch/s390/kernel/setup.c
+++ b/arch/s390/kernel/setup.c
@@ -121,13 +121,10 @@ static struct resource data_resource = {
121 */ 121 */
122void __cpuinit cpu_init(void) 122void __cpuinit cpu_init(void)
123{ 123{
124 int addr = hard_smp_processor_id();
125
126 /* 124 /*
127 * Store processor id in lowcore (used e.g. in timer_interrupt) 125 * Store processor id in lowcore (used e.g. in timer_interrupt)
128 */ 126 */
129 get_cpu_id(&S390_lowcore.cpu_data.cpu_id); 127 get_cpu_id(&S390_lowcore.cpu_id);
130 S390_lowcore.cpu_data.cpu_addr = addr;
131 128
132 /* 129 /*
133 * Force FPU initialization: 130 * Force FPU initialization:
@@ -686,7 +683,6 @@ setup_memory(void)
686static void __init setup_hwcaps(void) 683static void __init setup_hwcaps(void)
687{ 684{
688 static const int stfl_bits[6] = { 0, 2, 7, 17, 19, 21 }; 685 static const int stfl_bits[6] = { 0, 2, 7, 17, 19, 21 };
689 struct cpuinfo_S390 *cpuinfo = &S390_lowcore.cpu_data;
690 unsigned long long facility_list_extended; 686 unsigned long long facility_list_extended;
691 unsigned int facility_list; 687 unsigned int facility_list;
692 int i; 688 int i;
@@ -732,7 +728,7 @@ static void __init setup_hwcaps(void)
732 if (MACHINE_HAS_HPAGE) 728 if (MACHINE_HAS_HPAGE)
733 elf_hwcap |= 1UL << 7; 729 elf_hwcap |= 1UL << 7;
734 730
735 switch (cpuinfo->cpu_id.machine) { 731 switch (S390_lowcore.cpu_id.machine) {
736 case 0x9672: 732 case 0x9672:
737#if !defined(CONFIG_64BIT) 733#if !defined(CONFIG_64BIT)
738 default: /* Use "g5" as default for 31 bit kernels. */ 734 default: /* Use "g5" as default for 31 bit kernels. */
@@ -825,7 +821,7 @@ setup_arch(char **cmdline_p)
825 setup_lowcore(); 821 setup_lowcore();
826 822
827 cpu_init(); 823 cpu_init();
828 __cpu_logical_map[0] = S390_lowcore.cpu_data.cpu_addr; 824 __cpu_logical_map[0] = stap();
829 s390_init_cpu_topology(); 825 s390_init_cpu_topology();
830 826
831 /* 827 /*
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c
index a8858634dd05..b167f74d94cd 100644
--- a/arch/s390/kernel/smp.c
+++ b/arch/s390/kernel/smp.c
@@ -372,7 +372,7 @@ static void __init smp_detect_cpus(void)
372 372
373 c_cpus = 1; 373 c_cpus = 1;
374 s_cpus = 0; 374 s_cpus = 0;
375 boot_cpu_addr = S390_lowcore.cpu_data.cpu_addr; 375 boot_cpu_addr = __cpu_logical_map[0];
376 info = kmalloc(sizeof(*info), GFP_KERNEL); 376 info = kmalloc(sizeof(*info), GFP_KERNEL);
377 if (!info) 377 if (!info)
378 panic("smp_detect_cpus failed to allocate memory\n"); 378 panic("smp_detect_cpus failed to allocate memory\n");
@@ -446,7 +446,7 @@ int __cpuinit start_secondary(void *cpuvoid)
446 /* Switch on interrupts */ 446 /* Switch on interrupts */
447 local_irq_enable(); 447 local_irq_enable();
448 /* Print info about this processor */ 448 /* Print info about this processor */
449 print_cpu_info(&S390_lowcore.cpu_data); 449 print_cpu_info();
450 /* cpu_idle will call schedule for us */ 450 /* cpu_idle will call schedule for us */
451 cpu_idle(); 451 cpu_idle();
452 return 0; 452 return 0;
@@ -564,7 +564,7 @@ int __cpuinit __cpu_up(unsigned int cpu)
564 : : "a" (&cpu_lowcore->access_regs_save_area) : "memory"); 564 : : "a" (&cpu_lowcore->access_regs_save_area) : "memory");
565 cpu_lowcore->percpu_offset = __per_cpu_offset[cpu]; 565 cpu_lowcore->percpu_offset = __per_cpu_offset[cpu];
566 cpu_lowcore->current_task = (unsigned long) idle; 566 cpu_lowcore->current_task = (unsigned long) idle;
567 cpu_lowcore->cpu_data.cpu_nr = cpu; 567 cpu_lowcore->cpu_nr = cpu;
568 cpu_lowcore->kernel_asce = S390_lowcore.kernel_asce; 568 cpu_lowcore->kernel_asce = S390_lowcore.kernel_asce;
569 cpu_lowcore->ipl_device = S390_lowcore.ipl_device; 569 cpu_lowcore->ipl_device = S390_lowcore.ipl_device;
570 eieio(); 570 eieio();
@@ -656,7 +656,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
656 /* request the 0x1201 emergency signal external interrupt */ 656 /* request the 0x1201 emergency signal external interrupt */
657 if (register_external_interrupt(0x1201, do_ext_call_interrupt) != 0) 657 if (register_external_interrupt(0x1201, do_ext_call_interrupt) != 0)
658 panic("Couldn't request external interrupt 0x1201"); 658 panic("Couldn't request external interrupt 0x1201");
659 print_cpu_info(&S390_lowcore.cpu_data); 659 print_cpu_info();
660 660
661 /* Reallocate current lowcore, but keep its contents. */ 661 /* Reallocate current lowcore, but keep its contents. */
662 lc_order = sizeof(long) == 8 ? 1 : 0; 662 lc_order = sizeof(long) == 8 ? 1 : 0;