ARM: 7536/1: smp: Formalize an IPI for wakeup
Remove the offset from ipi_msg_type and assume that SGI0 is the wakeup interrupt now that all WFI hotplug users call gic_raise_softirq() with 0 instead of 1. This allows us to track how many wakeup interrupts are sent and also removes the unknown IPI printk message for WFI hotplug based systems. Reviewed-by: Nicolas Pitre <nico@linaro.org> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
38ef2ad5f1
commit
559a593905
2 changed files with 10 additions and 5 deletions
|
@ -5,7 +5,7 @@
|
||||||
#include <linux/threads.h>
|
#include <linux/threads.h>
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
|
|
||||||
#define NR_IPI 5
|
#define NR_IPI 6
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
unsigned int __softirq_pending;
|
unsigned int __softirq_pending;
|
||||||
|
|
|
@ -51,7 +51,8 @@
|
||||||
struct secondary_data secondary_data;
|
struct secondary_data secondary_data;
|
||||||
|
|
||||||
enum ipi_msg_type {
|
enum ipi_msg_type {
|
||||||
IPI_TIMER = 2,
|
IPI_WAKEUP,
|
||||||
|
IPI_TIMER,
|
||||||
IPI_RESCHEDULE,
|
IPI_RESCHEDULE,
|
||||||
IPI_CALL_FUNC,
|
IPI_CALL_FUNC,
|
||||||
IPI_CALL_FUNC_SINGLE,
|
IPI_CALL_FUNC_SINGLE,
|
||||||
|
@ -347,7 +348,8 @@ void arch_send_call_function_single_ipi(int cpu)
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *ipi_types[NR_IPI] = {
|
static const char *ipi_types[NR_IPI] = {
|
||||||
#define S(x,s) [x - IPI_TIMER] = s
|
#define S(x,s) [x] = s
|
||||||
|
S(IPI_WAKEUP, "CPU wakeup interrupts"),
|
||||||
S(IPI_TIMER, "Timer broadcast interrupts"),
|
S(IPI_TIMER, "Timer broadcast interrupts"),
|
||||||
S(IPI_RESCHEDULE, "Rescheduling interrupts"),
|
S(IPI_RESCHEDULE, "Rescheduling interrupts"),
|
||||||
S(IPI_CALL_FUNC, "Function call interrupts"),
|
S(IPI_CALL_FUNC, "Function call interrupts"),
|
||||||
|
@ -500,10 +502,13 @@ void handle_IPI(int ipinr, struct pt_regs *regs)
|
||||||
unsigned int cpu = smp_processor_id();
|
unsigned int cpu = smp_processor_id();
|
||||||
struct pt_regs *old_regs = set_irq_regs(regs);
|
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||||
|
|
||||||
if (ipinr >= IPI_TIMER && ipinr < IPI_TIMER + NR_IPI)
|
if (ipinr < NR_IPI)
|
||||||
__inc_irq_stat(cpu, ipi_irqs[ipinr - IPI_TIMER]);
|
__inc_irq_stat(cpu, ipi_irqs[ipinr]);
|
||||||
|
|
||||||
switch (ipinr) {
|
switch (ipinr) {
|
||||||
|
case IPI_WAKEUP:
|
||||||
|
break;
|
||||||
|
|
||||||
case IPI_TIMER:
|
case IPI_TIMER:
|
||||||
irq_enter();
|
irq_enter();
|
||||||
ipi_timer();
|
ipi_timer();
|
||||||
|
|
Loading…
Add table
Reference in a new issue