Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | /* * 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, ec_stop_cpu, }; /* * 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 */ |