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 */
21extern volatile int __cpu_logical_map[];
22
23typedef 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
43typedef __u32 sigp_status_word;
44
45typedef 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 */
59typedef enum
60{
61	ec_schedule=0,
62	ec_call_function,
63	ec_bit_last
64} ec_bit_sig;
65
66/*
67 * Signal processor
68 */
69extern __inline__ sigp_ccode
70signal_processor(__u16 cpu_addr, sigp_order_code order_code)
71{
72	sigp_ccode ccode;
73
74	__asm__ __volatile__(
75		"    sr     1,1\n"        /* parameter=0 in gpr 1 */
76		"    sigp   1,%1,0(%2)\n"
77		"    ipm    %0\n"
78		"    srl    %0,28\n"
79		: "=d" (ccode)
80		: "d" (__cpu_logical_map[cpu_addr]), "a" (order_code)
81		: "cc" , "memory", "1" );
82	return ccode;
83}
84
85/*
86 * Signal processor with parameter
87 */
88extern __inline__ sigp_ccode
89signal_processor_p(__u32 parameter,__u16 cpu_addr,sigp_order_code order_code)
90{
91	sigp_ccode ccode;
92
93	__asm__ __volatile__(
94		"    lr     1,%1\n"       /* parameter in gpr 1 */
95		"    sigp   1,%2,0(%3)\n"
96		"    ipm    %0\n"
97		"    srl    %0,28\n"
98		: "=d" (ccode)
99		: "d" (parameter), "d" (__cpu_logical_map[cpu_addr]),
100                  "a" (order_code)
101		: "cc" , "memory", "1" );
102	return ccode;
103}
104
105/*
106 * Signal processor with parameter and return status
107 */
108extern __inline__ sigp_ccode
109signal_processor_ps(__u32 *statusptr, __u32 parameter,
110		    __u16 cpu_addr, sigp_order_code order_code)
111{
112	sigp_ccode ccode;
113
114	__asm__ __volatile__(
115		"    sr     2,2\n"        /* clear status so it doesn't contain rubbish if not saved. */
116		"    lr     3,%2\n"       /* parameter in gpr 3 */
117		"    sigp   2,%3,0(%4)\n"
118		"    st     2,%1\n"
119		"    ipm    %0\n"
120		"    srl    %0,28\n"
121		: "=d" (ccode), "=m" (*statusptr)
122		: "d" (parameter), "d" (__cpu_logical_map[cpu_addr]),
123                  "a" (order_code)
124		: "cc" , "memory", "2" , "3"
125		);
126   return ccode;
127}
128
129#endif /* __SIGP__ */
130
131
132