diff options
Diffstat (limited to 'arch/s390/include/asm/sigp.h')
-rw-r--r-- | arch/s390/include/asm/sigp.h | 142 |
1 files changed, 69 insertions, 73 deletions
diff --git a/arch/s390/include/asm/sigp.h b/arch/s390/include/asm/sigp.h index f72d611f7e13..e3bffd4e2d66 100644 --- a/arch/s390/include/asm/sigp.h +++ b/arch/s390/include/asm/sigp.h | |||
@@ -1,24 +1,19 @@ | |||
1 | /* | 1 | /* |
2 | * include/asm-s390/sigp.h | 2 | * Routines and structures for signalling other processors. |
3 | * | 3 | * |
4 | * S390 version | 4 | * Copyright IBM Corp. 1999,2010 |
5 | * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation | 5 | * Author(s): Denis Joseph Barrow, |
6 | * Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com), | 6 | * Martin Schwidefsky <schwidefsky@de.ibm.com>, |
7 | * Martin Schwidefsky (schwidefsky@de.ibm.com) | 7 | * Heiko Carstens <heiko.carstens@de.ibm.com>, |
8 | * Heiko Carstens (heiko.carstens@de.ibm.com) | ||
9 | * | ||
10 | * sigp.h by D.J. Barrow (c) IBM 1999 | ||
11 | * contains routines / structures for signalling other S/390 processors in an | ||
12 | * SMP configuration. | ||
13 | */ | 8 | */ |
14 | 9 | ||
15 | #ifndef __SIGP__ | 10 | #ifndef __ASM_SIGP_H |
16 | #define __SIGP__ | 11 | #define __ASM_SIGP_H |
17 | 12 | ||
18 | #include <asm/system.h> | 13 | #include <asm/system.h> |
19 | 14 | ||
20 | /* get real cpu address from logical cpu number */ | 15 | /* Get real cpu address from logical cpu number. */ |
21 | extern int __cpu_logical_map[]; | 16 | extern unsigned short __cpu_logical_map[]; |
22 | 17 | ||
23 | static inline int cpu_logical_map(int cpu) | 18 | static inline int cpu_logical_map(int cpu) |
24 | { | 19 | { |
@@ -29,107 +24,108 @@ static inline int cpu_logical_map(int cpu) | |||
29 | #endif | 24 | #endif |
30 | } | 25 | } |
31 | 26 | ||
32 | typedef enum | 27 | enum { |
33 | { | 28 | sigp_sense = 1, |
34 | sigp_unassigned=0x0, | 29 | sigp_external_call = 2, |
35 | sigp_sense, | 30 | sigp_emergency_signal = 3, |
36 | sigp_external_call, | 31 | sigp_start = 4, |
37 | sigp_emergency_signal, | 32 | sigp_stop = 5, |
38 | sigp_start, | 33 | sigp_restart = 6, |
39 | sigp_stop, | 34 | sigp_stop_and_store_status = 9, |
40 | sigp_restart, | 35 | sigp_initial_cpu_reset = 11, |
41 | sigp_unassigned1, | 36 | sigp_cpu_reset = 12, |
42 | sigp_unassigned2, | 37 | sigp_set_prefix = 13, |
43 | sigp_stop_and_store_status, | 38 | sigp_store_status_at_address = 14, |
44 | sigp_unassigned3, | 39 | sigp_store_extended_status_at_address = 15, |
45 | sigp_initial_cpu_reset, | 40 | sigp_set_architecture = 18, |
46 | sigp_cpu_reset, | 41 | sigp_conditional_emergency_signal = 19, |
47 | sigp_set_prefix, | 42 | sigp_sense_running = 21, |
48 | sigp_store_status_at_address, | 43 | }; |
49 | sigp_store_extended_status_at_address | 44 | |
50 | } sigp_order_code; | 45 | enum { |
51 | 46 | sigp_order_code_accepted = 0, | |
52 | typedef __u32 sigp_status_word; | 47 | sigp_status_stored = 1, |
53 | 48 | sigp_busy = 2, | |
54 | typedef enum | 49 | sigp_not_operational = 3, |
55 | { | 50 | }; |
56 | sigp_order_code_accepted=0, | ||
57 | sigp_status_stored, | ||
58 | sigp_busy, | ||
59 | sigp_not_operational | ||
60 | } sigp_ccode; | ||
61 | |||
62 | 51 | ||
63 | /* | 52 | /* |
64 | * Definitions for the external call | 53 | * Definitions for external call. |
65 | */ | 54 | */ |
66 | 55 | enum { | |
67 | /* 'Bit' signals, asynchronous */ | 56 | ec_schedule = 0, |
68 | typedef enum | ||
69 | { | ||
70 | ec_schedule=0, | ||
71 | ec_call_function, | 57 | ec_call_function, |
72 | ec_call_function_single, | 58 | ec_call_function_single, |
73 | ec_bit_last | 59 | }; |
74 | } ec_bit_sig; | ||
75 | 60 | ||
76 | /* | 61 | /* |
77 | * Signal processor | 62 | * Signal processor. |
78 | */ | 63 | */ |
79 | static inline sigp_ccode | 64 | static inline int raw_sigp(u16 cpu, int order) |
80 | signal_processor(__u16 cpu_addr, sigp_order_code order_code) | ||
81 | { | 65 | { |
82 | register unsigned long reg1 asm ("1") = 0; | 66 | register unsigned long reg1 asm ("1") = 0; |
83 | sigp_ccode ccode; | 67 | int ccode; |
84 | 68 | ||
85 | asm volatile( | 69 | asm volatile( |
86 | " sigp %1,%2,0(%3)\n" | 70 | " sigp %1,%2,0(%3)\n" |
87 | " ipm %0\n" | 71 | " ipm %0\n" |
88 | " srl %0,28\n" | 72 | " srl %0,28\n" |
89 | : "=d" (ccode) | 73 | : "=d" (ccode) |
90 | : "d" (reg1), "d" (cpu_logical_map(cpu_addr)), | 74 | : "d" (reg1), "d" (cpu), |
91 | "a" (order_code) : "cc" , "memory"); | 75 | "a" (order) : "cc" , "memory"); |
92 | return ccode; | 76 | return ccode; |
93 | } | 77 | } |
94 | 78 | ||
95 | /* | 79 | /* |
96 | * Signal processor with parameter | 80 | * Signal processor with parameter. |
97 | */ | 81 | */ |
98 | static inline sigp_ccode | 82 | static inline int raw_sigp_p(u32 parameter, u16 cpu, int order) |
99 | signal_processor_p(__u32 parameter, __u16 cpu_addr, sigp_order_code order_code) | ||
100 | { | 83 | { |
101 | register unsigned int reg1 asm ("1") = parameter; | 84 | register unsigned int reg1 asm ("1") = parameter; |
102 | sigp_ccode ccode; | 85 | int ccode; |
103 | 86 | ||
104 | asm volatile( | 87 | asm volatile( |
105 | " sigp %1,%2,0(%3)\n" | 88 | " sigp %1,%2,0(%3)\n" |
106 | " ipm %0\n" | 89 | " ipm %0\n" |
107 | " srl %0,28\n" | 90 | " srl %0,28\n" |
108 | : "=d" (ccode) | 91 | : "=d" (ccode) |
109 | : "d" (reg1), "d" (cpu_logical_map(cpu_addr)), | 92 | : "d" (reg1), "d" (cpu), |
110 | "a" (order_code) : "cc" , "memory"); | 93 | "a" (order) : "cc" , "memory"); |
111 | return ccode; | 94 | return ccode; |
112 | } | 95 | } |
113 | 96 | ||
114 | /* | 97 | /* |
115 | * Signal processor with parameter and return status | 98 | * Signal processor with parameter and return status. |
116 | */ | 99 | */ |
117 | static inline sigp_ccode | 100 | static inline int raw_sigp_ps(u32 *status, u32 parm, u16 cpu, int order) |
118 | signal_processor_ps(__u32 *statusptr, __u32 parameter, __u16 cpu_addr, | ||
119 | sigp_order_code order_code) | ||
120 | { | 101 | { |
121 | register unsigned int reg1 asm ("1") = parameter; | 102 | register unsigned int reg1 asm ("1") = parm; |
122 | sigp_ccode ccode; | 103 | int ccode; |
123 | 104 | ||
124 | asm volatile( | 105 | asm volatile( |
125 | " sigp %1,%2,0(%3)\n" | 106 | " sigp %1,%2,0(%3)\n" |
126 | " ipm %0\n" | 107 | " ipm %0\n" |
127 | " srl %0,28\n" | 108 | " srl %0,28\n" |
128 | : "=d" (ccode), "+d" (reg1) | 109 | : "=d" (ccode), "+d" (reg1) |
129 | : "d" (cpu_logical_map(cpu_addr)), "a" (order_code) | 110 | : "d" (cpu), "a" (order) |
130 | : "cc" , "memory"); | 111 | : "cc" , "memory"); |
131 | *statusptr = reg1; | 112 | *status = reg1; |
132 | return ccode; | 113 | return ccode; |
133 | } | 114 | } |
134 | 115 | ||
135 | #endif /* __SIGP__ */ | 116 | static inline int sigp(int cpu, int order) |
117 | { | ||
118 | return raw_sigp(cpu_logical_map(cpu), order); | ||
119 | } | ||
120 | |||
121 | static inline int sigp_p(u32 parameter, int cpu, int order) | ||
122 | { | ||
123 | return raw_sigp_p(parameter, cpu_logical_map(cpu), order); | ||
124 | } | ||
125 | |||
126 | static inline int sigp_ps(u32 *status, u32 parm, int cpu, int order) | ||
127 | { | ||
128 | return raw_sigp_ps(status, parm, cpu_logical_map(cpu), order); | ||
129 | } | ||
130 | |||
131 | #endif /* __ASM_SIGP_H */ | ||