File: /usr/src/linux/include/asm-s390x/sigp.h
1 /*
2 * include/asm-s390/sigp.h
3 *
4 * S390 version
5 * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
6 * Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
7 * Martin Schwidefsky (schwidefsky@de.ibm.com)
8 *
9 * sigp.h by D.J. Barrow (c) IBM 1999
10 * contains routines / structures for signalling other S/390 processors in an
11 * SMP configuration.
12 */
13
14 #ifndef __SIGP__
15 #define __SIGP__
16
17 #include <asm/ptrace.h>
18 #include <asm/atomic.h>
19
20 /* get real cpu address from logical cpu number */
21 extern volatile int __cpu_logical_map[];
22
23 typedef enum
24 {
25 sigp_unassigned=0x0,
26 sigp_sense,
27 sigp_external_call,
28 sigp_emergency_signal,
29 sigp_start,
30 sigp_stop,
31 sigp_restart,
32 sigp_unassigned1,
33 sigp_unassigned2,
34 sigp_stop_and_store_status,
35 sigp_unassigned3,
36 sigp_initial_cpu_reset,
37 sigp_cpu_reset,
38 sigp_set_prefix,
39 sigp_store_status_at_address,
40 sigp_store_extended_status_at_address
41 } sigp_order_code;
42
43 typedef __u32 sigp_status_word;
44
45 typedef enum
46 {
47 sigp_order_code_accepted=0,
48 sigp_status_stored,
49 sigp_busy,
50 sigp_not_operational
51 } sigp_ccode;
52
53
54 /*
55 * Definitions for the external call
56 */
57
58 /* 'Bit' signals, asynchronous */
59 typedef enum
60 {
61 ec_schedule=0,
62 ec_restart,
63 ec_halt,
64 ec_power_off,
65 ec_bit_last
66 } ec_bit_sig;
67
68 /* Signals which come with a parameter area */
69 typedef enum
70 {
71 ec_callback_sync,
72 ec_callback_async
73 } ec_cmd_sig;
74
75 /* state information for signals */
76 typedef enum
77 {
78 ec_pending,
79 ec_executing,
80 ec_done
81 } ec_state;
82
83 /* header for the queuing of callbacks */
84 typedef struct ec_ext_call
85 {
86 ec_cmd_sig cmd;
87 atomic_t status;
88 struct ec_ext_call *next;
89 void (*func)(void *info);
90 void *info;
91 } ec_ext_call;
92
93 /*
94 * Signal processor
95 */
96 extern __inline__ sigp_ccode
97 signal_processor(__u16 cpu_addr, sigp_order_code order_code)
98 {
99 sigp_ccode ccode;
100
101 __asm__ __volatile__(
102 " sgr 1,1\n" /* parameter=0 in gpr 1 */
103 " sigp 1,%1,0(%2)\n"
104 " ipm %0\n"
105 " srl %0,28"
106 : "=d" (ccode)
107 : "d" (__cpu_logical_map[cpu_addr]), "a" (order_code)
108 : "cc" , "memory", "1" );
109 return ccode;
110 }
111
112 /*
113 * Signal processor with parameter
114 */
115 extern __inline__ sigp_ccode
116 signal_processor_p(__u64 parameter,__u16 cpu_addr,sigp_order_code order_code)
117 {
118 sigp_ccode ccode;
119
120 __asm__ __volatile__(
121 " lgr 1,%1\n" /* parameter in gpr 1 */
122 " sigp 1,%2,0(%3)\n"
123 " ipm %0\n"
124 " srl %0,28\n"
125 : "=d" (ccode)
126 : "d" (parameter), "d" (__cpu_logical_map[cpu_addr]),
127 "a" (order_code)
128 : "cc" , "memory", "1" );
129 return ccode;
130 }
131
132 /*
133 * Signal processor with parameter and return status
134 */
135 extern __inline__ sigp_ccode
136 signal_processor_ps(__u32 *statusptr, __u64 parameter,
137 __u16 cpu_addr, sigp_order_code order_code)
138 {
139 sigp_ccode ccode;
140
141 __asm__ __volatile__(
142 " sgr 2,2\n" /* clear status so it doesn't contain rubbish if not saved. */
143 " lgr 3,%2\n" /* parameter in gpr 3 */
144 " sigp 2,%3,0(%4)\n"
145 " stg 2,%1\n"
146 " ipm %0\n"
147 " srl %0,28\n"
148 : "=d" (ccode), "=m" (*statusptr)
149 : "d" (parameter), "d" (__cpu_logical_map[cpu_addr]),
150 "a" (order_code)
151 : "cc" , "memory", "2" , "3"
152 );
153 return ccode;
154 }
155
156 #endif __SIGP__
157
158
159