diff options
Diffstat (limited to 'arch/s390/include')
-rw-r--r-- | arch/s390/include/asm/sigp.h | 100 |
1 files changed, 49 insertions, 51 deletions
diff --git a/arch/s390/include/asm/sigp.h b/arch/s390/include/asm/sigp.h index f72d611f7e13..8aa46ce4229c 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,8 +24,7 @@ static inline int cpu_logical_map(int cpu) | |||
29 | #endif | 24 | #endif |
30 | } | 25 | } |
31 | 26 | ||
32 | typedef enum | 27 | enum { |
33 | { | ||
34 | sigp_unassigned=0x0, | 28 | sigp_unassigned=0x0, |
35 | sigp_sense, | 29 | sigp_sense, |
36 | sigp_external_call, | 30 | sigp_external_call, |
@@ -47,89 +41,93 @@ typedef enum | |||
47 | sigp_set_prefix, | 41 | sigp_set_prefix, |
48 | sigp_store_status_at_address, | 42 | sigp_store_status_at_address, |
49 | sigp_store_extended_status_at_address | 43 | sigp_store_extended_status_at_address |
50 | } sigp_order_code; | 44 | }; |
51 | |||
52 | typedef __u32 sigp_status_word; | ||
53 | 45 | ||
54 | typedef enum | 46 | enum { |
55 | { | ||
56 | sigp_order_code_accepted=0, | 47 | sigp_order_code_accepted=0, |
57 | sigp_status_stored, | 48 | sigp_status_stored, |
58 | sigp_busy, | 49 | sigp_busy, |
59 | sigp_not_operational | 50 | sigp_not_operational |
60 | } sigp_ccode; | 51 | }; |
61 | |||
62 | 52 | ||
63 | /* | 53 | /* |
64 | * Definitions for the external call | 54 | * Definitions for external call. |
65 | */ | 55 | */ |
66 | 56 | enum { | |
67 | /* 'Bit' signals, asynchronous */ | 57 | ec_schedule = 0, |
68 | typedef enum | ||
69 | { | ||
70 | ec_schedule=0, | ||
71 | ec_call_function, | 58 | ec_call_function, |
72 | ec_call_function_single, | 59 | ec_call_function_single, |
73 | ec_bit_last | 60 | ec_bit_last |
74 | } ec_bit_sig; | 61 | }; |
75 | 62 | ||
76 | /* | 63 | /* |
77 | * Signal processor | 64 | * Signal processor. |
78 | */ | 65 | */ |
79 | static inline sigp_ccode | 66 | static inline int raw_sigp(u16 cpu, int order) |
80 | signal_processor(__u16 cpu_addr, sigp_order_code order_code) | ||
81 | { | 67 | { |
82 | register unsigned long reg1 asm ("1") = 0; | 68 | register unsigned long reg1 asm ("1") = 0; |
83 | sigp_ccode ccode; | 69 | int ccode; |
84 | 70 | ||
85 | asm volatile( | 71 | asm volatile( |
86 | " sigp %1,%2,0(%3)\n" | 72 | " sigp %1,%2,0(%3)\n" |
87 | " ipm %0\n" | 73 | " ipm %0\n" |
88 | " srl %0,28\n" | 74 | " srl %0,28\n" |
89 | : "=d" (ccode) | 75 | : "=d" (ccode) |
90 | : "d" (reg1), "d" (cpu_logical_map(cpu_addr)), | 76 | : "d" (reg1), "d" (cpu), |
91 | "a" (order_code) : "cc" , "memory"); | 77 | "a" (order) : "cc" , "memory"); |
92 | return ccode; | 78 | return ccode; |
93 | } | 79 | } |
94 | 80 | ||
95 | /* | 81 | /* |
96 | * Signal processor with parameter | 82 | * Signal processor with parameter. |
97 | */ | 83 | */ |
98 | static inline sigp_ccode | 84 | 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 | { | 85 | { |
101 | register unsigned int reg1 asm ("1") = parameter; | 86 | register unsigned int reg1 asm ("1") = parameter; |
102 | sigp_ccode ccode; | 87 | int ccode; |
103 | 88 | ||
104 | asm volatile( | 89 | asm volatile( |
105 | " sigp %1,%2,0(%3)\n" | 90 | " sigp %1,%2,0(%3)\n" |
106 | " ipm %0\n" | 91 | " ipm %0\n" |
107 | " srl %0,28\n" | 92 | " srl %0,28\n" |
108 | : "=d" (ccode) | 93 | : "=d" (ccode) |
109 | : "d" (reg1), "d" (cpu_logical_map(cpu_addr)), | 94 | : "d" (reg1), "d" (cpu), |
110 | "a" (order_code) : "cc" , "memory"); | 95 | "a" (order) : "cc" , "memory"); |
111 | return ccode; | 96 | return ccode; |
112 | } | 97 | } |
113 | 98 | ||
114 | /* | 99 | /* |
115 | * Signal processor with parameter and return status | 100 | * Signal processor with parameter and return status. |
116 | */ | 101 | */ |
117 | static inline sigp_ccode | 102 | 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 | { | 103 | { |
121 | register unsigned int reg1 asm ("1") = parameter; | 104 | register unsigned int reg1 asm ("1") = parm; |
122 | sigp_ccode ccode; | 105 | int ccode; |
123 | 106 | ||
124 | asm volatile( | 107 | asm volatile( |
125 | " sigp %1,%2,0(%3)\n" | 108 | " sigp %1,%2,0(%3)\n" |
126 | " ipm %0\n" | 109 | " ipm %0\n" |
127 | " srl %0,28\n" | 110 | " srl %0,28\n" |
128 | : "=d" (ccode), "+d" (reg1) | 111 | : "=d" (ccode), "+d" (reg1) |
129 | : "d" (cpu_logical_map(cpu_addr)), "a" (order_code) | 112 | : "d" (cpu), "a" (order) |
130 | : "cc" , "memory"); | 113 | : "cc" , "memory"); |
131 | *statusptr = reg1; | 114 | *status = reg1; |
132 | return ccode; | 115 | return ccode; |
133 | } | 116 | } |
134 | 117 | ||
135 | #endif /* __SIGP__ */ | 118 | static inline int sigp(int cpu, int order) |
119 | { | ||
120 | return raw_sigp(cpu_logical_map(cpu), order); | ||
121 | } | ||
122 | |||
123 | static inline int sigp_p(u32 parameter, int cpu, int order) | ||
124 | { | ||
125 | return raw_sigp_p(parameter, cpu_logical_map(cpu), order); | ||
126 | } | ||
127 | |||
128 | static inline int sigp_ps(u32 *status, u32 parm, int cpu, int order) | ||
129 | { | ||
130 | return raw_sigp_ps(status, parm, cpu_logical_map(cpu), order); | ||
131 | } | ||
132 | |||
133 | #endif /* __ASM_SIGP_H */ | ||