diff options
| -rw-r--r-- | arch/i386/mach-voyager/voyager_smp.c | 57 |
1 files changed, 44 insertions, 13 deletions
diff --git a/arch/i386/mach-voyager/voyager_smp.c b/arch/i386/mach-voyager/voyager_smp.c index 74aeedf277f4..a126baeaa423 100644 --- a/arch/i386/mach-voyager/voyager_smp.c +++ b/arch/i386/mach-voyager/voyager_smp.c | |||
| @@ -1082,20 +1082,11 @@ smp_call_function_interrupt(void) | |||
| 1082 | } | 1082 | } |
| 1083 | } | 1083 | } |
| 1084 | 1084 | ||
| 1085 | /* Call this function on all CPUs using the function_interrupt above | 1085 | static int |
| 1086 | <func> The function to run. This must be fast and non-blocking. | 1086 | __smp_call_function_mask (void (*func) (void *info), void *info, int retry, |
| 1087 | <info> An arbitrary pointer to pass to the function. | 1087 | int wait, __u32 mask) |
| 1088 | <retry> If true, keep retrying until ready. | ||
| 1089 | <wait> If true, wait until function has completed on other CPUs. | ||
| 1090 | [RETURNS] 0 on success, else a negative status code. Does not return until | ||
| 1091 | remote CPUs are nearly ready to execute <<func>> or are or have executed. | ||
| 1092 | */ | ||
| 1093 | int | ||
| 1094 | smp_call_function (void (*func) (void *info), void *info, int retry, | ||
| 1095 | int wait) | ||
| 1096 | { | 1088 | { |
| 1097 | struct call_data_struct data; | 1089 | struct call_data_struct data; |
| 1098 | __u32 mask = cpus_addr(cpu_online_map)[0]; | ||
| 1099 | 1090 | ||
| 1100 | mask &= ~(1<<smp_processor_id()); | 1091 | mask &= ~(1<<smp_processor_id()); |
| 1101 | 1092 | ||
| @@ -1116,7 +1107,7 @@ smp_call_function (void (*func) (void *info), void *info, int retry, | |||
| 1116 | call_data = &data; | 1107 | call_data = &data; |
| 1117 | wmb(); | 1108 | wmb(); |
| 1118 | /* Send a message to all other CPUs and wait for them to respond */ | 1109 | /* Send a message to all other CPUs and wait for them to respond */ |
| 1119 | send_CPI_allbutself(VIC_CALL_FUNCTION_CPI); | 1110 | send_CPI(mask, VIC_CALL_FUNCTION_CPI); |
| 1120 | 1111 | ||
| 1121 | /* Wait for response */ | 1112 | /* Wait for response */ |
| 1122 | while (data.started) | 1113 | while (data.started) |
| @@ -1130,8 +1121,48 @@ smp_call_function (void (*func) (void *info), void *info, int retry, | |||
| 1130 | 1121 | ||
| 1131 | return 0; | 1122 | return 0; |
| 1132 | } | 1123 | } |
| 1124 | |||
| 1125 | /* Call this function on all CPUs using the function_interrupt above | ||
| 1126 | <func> The function to run. This must be fast and non-blocking. | ||
| 1127 | <info> An arbitrary pointer to pass to the function. | ||
| 1128 | <retry> If true, keep retrying until ready. | ||
| 1129 | <wait> If true, wait until function has completed on other CPUs. | ||
| 1130 | [RETURNS] 0 on success, else a negative status code. Does not return until | ||
| 1131 | remote CPUs are nearly ready to execute <<func>> or are or have executed. | ||
| 1132 | */ | ||
| 1133 | int | ||
| 1134 | smp_call_function(void (*func) (void *info), void *info, int retry, | ||
| 1135 | int wait) | ||
| 1136 | { | ||
| 1137 | __u32 mask = cpus_addr(cpu_online_map)[0]; | ||
| 1138 | |||
| 1139 | return __smp_call_function_mask(func, info, retry, wait, mask); | ||
| 1140 | } | ||
| 1133 | EXPORT_SYMBOL(smp_call_function); | 1141 | EXPORT_SYMBOL(smp_call_function); |
| 1134 | 1142 | ||
| 1143 | /* | ||
| 1144 | * smp_call_function_single - Run a function on another CPU | ||
| 1145 | * @func: The function to run. This must be fast and non-blocking. | ||
| 1146 | * @info: An arbitrary pointer to pass to the function. | ||
| 1147 | * @nonatomic: Currently unused. | ||
| 1148 | * @wait: If true, wait until function has completed on other CPUs. | ||
| 1149 | * | ||
| 1150 | * Retrurns 0 on success, else a negative status code. | ||
| 1151 | * | ||
| 1152 | * Does not return until the remote CPU is nearly ready to execute <func> | ||
| 1153 | * or is or has executed. | ||
| 1154 | */ | ||
| 1155 | |||
| 1156 | int | ||
| 1157 | smp_call_function_single(int cpu, void (*func) (void *info), void *info, | ||
| 1158 | int nonatomic, int wait) | ||
| 1159 | { | ||
| 1160 | __u32 mask = 1 << cpu; | ||
| 1161 | |||
| 1162 | return __smp_call_function_mask(func, info, nonatomic, wait, mask); | ||
| 1163 | } | ||
| 1164 | EXPORT_SYMBOL(smp_call_function_single); | ||
| 1165 | |||
| 1135 | /* Sorry about the name. In an APIC based system, the APICs | 1166 | /* Sorry about the name. In an APIC based system, the APICs |
| 1136 | * themselves are programmed to send a timer interrupt. This is used | 1167 | * themselves are programmed to send a timer interrupt. This is used |
| 1137 | * by linux to reschedule the processor. Voyager doesn't have this, | 1168 | * by linux to reschedule the processor. Voyager doesn't have this, |
