Skip to content

Commit

Permalink
ARM: 7536/1: smp: Formalize an IPI for wakeup
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Stephen Boyd authored and Russell King committed Sep 19, 2012
1 parent 38ef2ad commit 559a593
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 5 deletions.
2 changes: 1 addition & 1 deletion arch/arm/include/asm/hardirq.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include <linux/threads.h>
#include <asm/irq.h>

#define NR_IPI 5
#define NR_IPI 6

typedef struct {
unsigned int __softirq_pending;
Expand Down
13 changes: 9 additions & 4 deletions arch/arm/kernel/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@
struct secondary_data secondary_data;

enum ipi_msg_type {
IPI_TIMER = 2,
IPI_WAKEUP,
IPI_TIMER,
IPI_RESCHEDULE,
IPI_CALL_FUNC,
IPI_CALL_FUNC_SINGLE,
Expand Down Expand Up @@ -347,7 +348,8 @@ void arch_send_call_function_single_ipi(int cpu)
}

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_RESCHEDULE, "Rescheduling interrupts"),
S(IPI_CALL_FUNC, "Function call interrupts"),
Expand Down Expand Up @@ -500,10 +502,13 @@ void handle_IPI(int ipinr, struct pt_regs *regs)
unsigned int cpu = smp_processor_id();
struct pt_regs *old_regs = set_irq_regs(regs);

if (ipinr >= IPI_TIMER && ipinr < IPI_TIMER + NR_IPI)
__inc_irq_stat(cpu, ipi_irqs[ipinr - IPI_TIMER]);
if (ipinr < NR_IPI)
__inc_irq_stat(cpu, ipi_irqs[ipinr]);

switch (ipinr) {
case IPI_WAKEUP:
break;

case IPI_TIMER:
irq_enter();
ipi_timer();
Expand Down

0 comments on commit 559a593

Please sign in to comment.