blob: 8aa46ce4229c49dd397f4a7ebbe3e5c089d5e5f3 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Heiko Carstensa93b8ec2010-02-26 22:37:35 +01002 * Routines and structures for signalling other processors.
Linus Torvalds1da177e2005-04-16 15:20:36 -07003 *
Heiko Carstensa93b8ec2010-02-26 22:37:35 +01004 * Copyright IBM Corp. 1999,2010
5 * Author(s): Denis Joseph Barrow,
6 * Martin Schwidefsky <schwidefsky@de.ibm.com>,
7 * Heiko Carstens <heiko.carstens@de.ibm.com>,
Linus Torvalds1da177e2005-04-16 15:20:36 -07008 */
9
Heiko Carstensa93b8ec2010-02-26 22:37:35 +010010#ifndef __ASM_SIGP_H
11#define __ASM_SIGP_H
Linus Torvalds1da177e2005-04-16 15:20:36 -070012
Heiko Carstensfb380aa2010-01-13 20:44:37 +010013#include <asm/system.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070014
Heiko Carstensa93b8ec2010-02-26 22:37:35 +010015/* Get real cpu address from logical cpu number. */
16extern unsigned short __cpu_logical_map[];
Linus Torvalds1da177e2005-04-16 15:20:36 -070017
Heiko Carstensfb380aa2010-01-13 20:44:37 +010018static inline int cpu_logical_map(int cpu)
19{
20#ifdef CONFIG_SMP
21 return __cpu_logical_map[cpu];
22#else
23 return stap();
24#endif
25}
26
Heiko Carstensa93b8ec2010-02-26 22:37:35 +010027enum {
Linus Torvalds1da177e2005-04-16 15:20:36 -070028 sigp_unassigned=0x0,
29 sigp_sense,
30 sigp_external_call,
31 sigp_emergency_signal,
32 sigp_start,
33 sigp_stop,
34 sigp_restart,
35 sigp_unassigned1,
36 sigp_unassigned2,
37 sigp_stop_and_store_status,
38 sigp_unassigned3,
39 sigp_initial_cpu_reset,
40 sigp_cpu_reset,
41 sigp_set_prefix,
42 sigp_store_status_at_address,
43 sigp_store_extended_status_at_address
Heiko Carstensa93b8ec2010-02-26 22:37:35 +010044};
Linus Torvalds1da177e2005-04-16 15:20:36 -070045
Heiko Carstensa93b8ec2010-02-26 22:37:35 +010046enum {
Linus Torvalds1da177e2005-04-16 15:20:36 -070047 sigp_order_code_accepted=0,
48 sigp_status_stored,
49 sigp_busy,
50 sigp_not_operational
Heiko Carstensa93b8ec2010-02-26 22:37:35 +010051};
Linus Torvalds1da177e2005-04-16 15:20:36 -070052
53/*
Heiko Carstensa93b8ec2010-02-26 22:37:35 +010054 * Definitions for external call.
Linus Torvalds1da177e2005-04-16 15:20:36 -070055 */
Heiko Carstensa93b8ec2010-02-26 22:37:35 +010056enum {
57 ec_schedule = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -070058 ec_call_function,
Heiko Carstensca9fc752008-12-25 13:38:39 +010059 ec_call_function_single,
Linus Torvalds1da177e2005-04-16 15:20:36 -070060 ec_bit_last
Heiko Carstensa93b8ec2010-02-26 22:37:35 +010061};
Linus Torvalds1da177e2005-04-16 15:20:36 -070062
63/*
Heiko Carstensa93b8ec2010-02-26 22:37:35 +010064 * Signal processor.
Linus Torvalds1da177e2005-04-16 15:20:36 -070065 */
Heiko Carstensa93b8ec2010-02-26 22:37:35 +010066static inline int raw_sigp(u16 cpu, int order)
Linus Torvalds1da177e2005-04-16 15:20:36 -070067{
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +020068 register unsigned long reg1 asm ("1") = 0;
Heiko Carstensa93b8ec2010-02-26 22:37:35 +010069 int ccode;
Linus Torvalds1da177e2005-04-16 15:20:36 -070070
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +020071 asm volatile(
72 " sigp %1,%2,0(%3)\n"
73 " ipm %0\n"
74 " srl %0,28\n"
75 : "=d" (ccode)
Heiko Carstensa93b8ec2010-02-26 22:37:35 +010076 : "d" (reg1), "d" (cpu),
77 "a" (order) : "cc" , "memory");
Linus Torvalds1da177e2005-04-16 15:20:36 -070078 return ccode;
79}
80
81/*
Heiko Carstensa93b8ec2010-02-26 22:37:35 +010082 * Signal processor with parameter.
Linus Torvalds1da177e2005-04-16 15:20:36 -070083 */
Heiko Carstensa93b8ec2010-02-26 22:37:35 +010084static inline int raw_sigp_p(u32 parameter, u16 cpu, int order)
Linus Torvalds1da177e2005-04-16 15:20:36 -070085{
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +020086 register unsigned int reg1 asm ("1") = parameter;
Heiko Carstensa93b8ec2010-02-26 22:37:35 +010087 int ccode;
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +020088
89 asm volatile(
90 " sigp %1,%2,0(%3)\n"
91 " ipm %0\n"
92 " srl %0,28\n"
Linus Torvalds1da177e2005-04-16 15:20:36 -070093 : "=d" (ccode)
Heiko Carstensa93b8ec2010-02-26 22:37:35 +010094 : "d" (reg1), "d" (cpu),
95 "a" (order) : "cc" , "memory");
Linus Torvalds1da177e2005-04-16 15:20:36 -070096 return ccode;
97}
98
99/*
Heiko Carstensa93b8ec2010-02-26 22:37:35 +0100100 * Signal processor with parameter and return status.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700101 */
Heiko Carstensa93b8ec2010-02-26 22:37:35 +0100102static inline int raw_sigp_ps(u32 *status, u32 parm, u16 cpu, int order)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700103{
Heiko Carstensa93b8ec2010-02-26 22:37:35 +0100104 register unsigned int reg1 asm ("1") = parm;
105 int ccode;
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +0200106
107 asm volatile(
108 " sigp %1,%2,0(%3)\n"
109 " ipm %0\n"
110 " srl %0,28\n"
111 : "=d" (ccode), "+d" (reg1)
Heiko Carstensa93b8ec2010-02-26 22:37:35 +0100112 : "d" (cpu), "a" (order)
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +0200113 : "cc" , "memory");
Heiko Carstensa93b8ec2010-02-26 22:37:35 +0100114 *status = reg1;
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +0200115 return ccode;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116}
117
Heiko Carstensa93b8ec2010-02-26 22:37:35 +0100118static inline int sigp(int cpu, int order)
119{
120 return raw_sigp(cpu_logical_map(cpu), order);
121}
122
123static inline int sigp_p(u32 parameter, int cpu, int order)
124{
125 return raw_sigp_p(parameter, cpu_logical_map(cpu), order);
126}
127
128static 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 */