|
@@ -35,6 +35,7 @@
|
|
|
#include <asm/ptrace.h>
|
|
|
#include <linux/atomic.h>
|
|
|
#include <asm/irq.h>
|
|
|
+#include <asm/hw_irq.h>
|
|
|
#include <asm/page.h>
|
|
|
#include <asm/pgtable.h>
|
|
|
#include <asm/prom.h>
|
|
@@ -145,9 +146,9 @@ static irqreturn_t reschedule_action(int irq, void *data)
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
|
|
|
|
-static irqreturn_t unused_action(int irq, void *data)
|
|
|
+static irqreturn_t tick_broadcast_ipi_action(int irq, void *data)
|
|
|
{
|
|
|
- /* This slot is unused and hence available for use, if needed */
|
|
|
+ tick_broadcast_ipi_handler();
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
|
|
|
@@ -168,14 +169,14 @@ static irqreturn_t debug_ipi_action(int irq, void *data)
|
|
|
static irq_handler_t smp_ipi_action[] = {
|
|
|
[PPC_MSG_CALL_FUNCTION] = call_function_action,
|
|
|
[PPC_MSG_RESCHEDULE] = reschedule_action,
|
|
|
- [PPC_MSG_UNUSED] = unused_action,
|
|
|
+ [PPC_MSG_TICK_BROADCAST] = tick_broadcast_ipi_action,
|
|
|
[PPC_MSG_DEBUGGER_BREAK] = debug_ipi_action,
|
|
|
};
|
|
|
|
|
|
const char *smp_ipi_name[] = {
|
|
|
[PPC_MSG_CALL_FUNCTION] = "ipi call function",
|
|
|
[PPC_MSG_RESCHEDULE] = "ipi reschedule",
|
|
|
- [PPC_MSG_UNUSED] = "ipi unused",
|
|
|
+ [PPC_MSG_TICK_BROADCAST] = "ipi tick-broadcast",
|
|
|
[PPC_MSG_DEBUGGER_BREAK] = "ipi debugger",
|
|
|
};
|
|
|
|
|
@@ -251,6 +252,8 @@ irqreturn_t smp_ipi_demux(void)
|
|
|
generic_smp_call_function_interrupt();
|
|
|
if (all & IPI_MESSAGE(PPC_MSG_RESCHEDULE))
|
|
|
scheduler_ipi();
|
|
|
+ if (all & IPI_MESSAGE(PPC_MSG_TICK_BROADCAST))
|
|
|
+ tick_broadcast_ipi_handler();
|
|
|
if (all & IPI_MESSAGE(PPC_MSG_DEBUGGER_BREAK))
|
|
|
debug_ipi_action(0, NULL);
|
|
|
} while (info->messages);
|
|
@@ -289,6 +292,16 @@ void arch_send_call_function_ipi_mask(const struct cpumask *mask)
|
|
|
do_message_pass(cpu, PPC_MSG_CALL_FUNCTION);
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST
|
|
|
+void tick_broadcast(const struct cpumask *mask)
|
|
|
+{
|
|
|
+ unsigned int cpu;
|
|
|
+
|
|
|
+ for_each_cpu(cpu, mask)
|
|
|
+ do_message_pass(cpu, PPC_MSG_TICK_BROADCAST);
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
#if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC)
|
|
|
void smp_send_debugger_break(void)
|
|
|
{
|