Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 559a5939 authored by Stephen Boyd's avatar Stephen Boyd Committed by Russell King
Browse files

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: default avatarNicolas Pitre <nico@linaro.org>
Signed-off-by: default avatarStephen Boyd <sboyd@codeaurora.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 38ef2ad5
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -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;
+9 −4
Original line number Original line Diff line number Diff line
@@ -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();