
Rename signal_processor* functions to sigp*. Add raw variants of each version, so we can get rid of the hacks played in smp code which establish temporary cpu logical mappings so they could call the sigp functions. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
134 lines
2.5 KiB
C
134 lines
2.5 KiB
C
/*
|
|
* 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_unassigned=0x0,
|
|
sigp_sense,
|
|
sigp_external_call,
|
|
sigp_emergency_signal,
|
|
sigp_start,
|
|
sigp_stop,
|
|
sigp_restart,
|
|
sigp_unassigned1,
|
|
sigp_unassigned2,
|
|
sigp_stop_and_store_status,
|
|
sigp_unassigned3,
|
|
sigp_initial_cpu_reset,
|
|
sigp_cpu_reset,
|
|
sigp_set_prefix,
|
|
sigp_store_status_at_address,
|
|
sigp_store_extended_status_at_address
|
|
};
|
|
|
|
enum {
|
|
sigp_order_code_accepted=0,
|
|
sigp_status_stored,
|
|
sigp_busy,
|
|
sigp_not_operational
|
|
};
|
|
|
|
/*
|
|
* Definitions for external call.
|
|
*/
|
|
enum {
|
|
ec_schedule = 0,
|
|
ec_call_function,
|
|
ec_call_function_single,
|
|
ec_bit_last
|
|
};
|
|
|
|
/*
|
|
* 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 */
|