| /* |
| * Routines and structures for signalling other processors. |
| * |
| * Copyright IBM Corp. 1999,2010 |
| * Author(s): Denis Joseph Barrow, |
| * Martin Schwidefsky <schwidefsky@de.ibm.com>, |
| * Heiko Carstens <heiko.carstens@de.ibm.com>, |
| */ |
| |
| #ifndef __ASM_SIGP_H |
| #define __ASM_SIGP_H |
| |
| #include <asm/system.h> |
| |
| /* Get real cpu address from logical cpu number. */ |
| extern unsigned short __cpu_logical_map[]; |
| |
| static inline int cpu_logical_map(int cpu) |
| { |
| #ifdef CONFIG_SMP |
| return __cpu_logical_map[cpu]; |
| #else |
| return stap(); |
| #endif |
| } |
| |
| enum { |
| sigp_sense = 1, |
| sigp_external_call = 2, |
| sigp_emergency_signal = 3, |
| sigp_start = 4, |
| sigp_stop = 5, |
| sigp_restart = 6, |
| sigp_stop_and_store_status = 9, |
| sigp_initial_cpu_reset = 11, |
| sigp_cpu_reset = 12, |
| sigp_set_prefix = 13, |
| sigp_store_status_at_address = 14, |
| sigp_store_extended_status_at_address = 15, |
| sigp_set_architecture = 18, |
| sigp_conditional_emergency_signal = 19, |
| sigp_sense_running = 21, |
| }; |
| |
| enum { |
| sigp_order_code_accepted = 0, |
| sigp_status_stored = 1, |
| sigp_busy = 2, |
| sigp_not_operational = 3, |
| }; |
| |
| /* |
| * Definitions for external call. |
| */ |
| enum { |
| ec_schedule = 0, |
| ec_call_function, |
| ec_call_function_single, |
| }; |
| |
| /* |
| * Signal processor. |
| */ |
| static inline int raw_sigp(u16 cpu, int order) |
| { |
| register unsigned long reg1 asm ("1") = 0; |
| int ccode; |
| |
| asm volatile( |
| " sigp %1,%2,0(%3)\n" |
| " ipm %0\n" |
| " srl %0,28\n" |
| : "=d" (ccode) |
| : "d" (reg1), "d" (cpu), |
| "a" (order) : "cc" , "memory"); |
| return ccode; |
| } |
| |
| /* |
| * Signal processor with parameter. |
| */ |
| static inline int raw_sigp_p(u32 parameter, u16 cpu, int order) |
| { |
| register unsigned int reg1 asm ("1") = parameter; |
| int ccode; |
| |
| asm volatile( |
| " sigp %1,%2,0(%3)\n" |
| " ipm %0\n" |
| " srl %0,28\n" |
| : "=d" (ccode) |
| : "d" (reg1), "d" (cpu), |
| "a" (order) : "cc" , "memory"); |
| return ccode; |
| } |
| |
| /* |
| * Signal processor with parameter and return status. |
| */ |
| static inline int raw_sigp_ps(u32 *status, u32 parm, u16 cpu, int order) |
| { |
| register unsigned int reg1 asm ("1") = parm; |
| int ccode; |
| |
| asm volatile( |
| " sigp %1,%2,0(%3)\n" |
| " ipm %0\n" |
| " srl %0,28\n" |
| : "=d" (ccode), "+d" (reg1) |
| : "d" (cpu), "a" (order) |
| : "cc" , "memory"); |
| *status = reg1; |
| return ccode; |
| } |
| |
| static inline int sigp(int cpu, int order) |
| { |
| return raw_sigp(cpu_logical_map(cpu), order); |
| } |
| |
| static inline int sigp_p(u32 parameter, int cpu, int order) |
| { |
| return raw_sigp_p(parameter, cpu_logical_map(cpu), order); |
| } |
| |
| static inline int sigp_ps(u32 *status, u32 parm, int cpu, int order) |
| { |
| return raw_sigp_ps(status, parm, cpu_logical_map(cpu), order); |
| } |
| |
| #endif /* __ASM_SIGP_H */ |