Loading arch/arm64/Kconfig +2 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ config ARM64 def_bool y select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE select ARCH_USE_CMPXCHG_LOCKREF select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST select ARCH_WANT_OPTIONAL_GPIOLIB select ARCH_WANT_COMPAT_IPC_PARSE_VERSION select ARCH_WANT_FRAME_POINTERS Loading @@ -11,6 +12,7 @@ config ARM64 select CLONE_BACKWARDS select COMMON_CLK if !ARCH_MSM select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS_BROADCAST if SMP select GENERIC_IOMAP select GENERIC_IRQ_PROBE select GENERIC_IRQ_SHOW Loading arch/arm64/include/asm/hardirq.h +1 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,7 @@ #include <linux/threads.h> #include <asm/irq.h> #define NR_IPI 4 #define NR_IPI 5 typedef struct { unsigned int __softirq_pending; Loading arch/arm64/kernel/smp.c +17 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ enum ipi_msg_type { IPI_CALL_FUNC, IPI_CALL_FUNC_SINGLE, IPI_CPU_STOP, IPI_TIMER, }; /* Loading Loading @@ -446,6 +447,7 @@ static const char *ipi_types[NR_IPI] = { S(IPI_CALL_FUNC, "Function call interrupts"), S(IPI_CALL_FUNC_SINGLE, "Single function call interrupts"), S(IPI_CPU_STOP, "CPU stop interrupts"), S(IPI_TIMER, "Timer broadcast interrupts"), }; void show_ipi_list(struct seq_file *p, int prec) Loading Loading @@ -531,6 +533,14 @@ void handle_IPI(int ipinr, struct pt_regs *regs) irq_exit(); break; #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST case IPI_TIMER: irq_enter(); tick_receive_broadcast(); irq_exit(); break; #endif default: pr_crit("CPU%u: Unknown IPI message 0x%x\n", cpu, ipinr); break; Loading @@ -543,6 +553,13 @@ void smp_send_reschedule(int cpu) smp_cross_call(cpumask_of(cpu), IPI_RESCHEDULE); } #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST void tick_broadcast(const struct cpumask *mask) { smp_cross_call(mask, IPI_TIMER); } #endif void smp_send_stop(void) { unsigned long timeout; Loading Loading
arch/arm64/Kconfig +2 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ config ARM64 def_bool y select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE select ARCH_USE_CMPXCHG_LOCKREF select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST select ARCH_WANT_OPTIONAL_GPIOLIB select ARCH_WANT_COMPAT_IPC_PARSE_VERSION select ARCH_WANT_FRAME_POINTERS Loading @@ -11,6 +12,7 @@ config ARM64 select CLONE_BACKWARDS select COMMON_CLK if !ARCH_MSM select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS_BROADCAST if SMP select GENERIC_IOMAP select GENERIC_IRQ_PROBE select GENERIC_IRQ_SHOW Loading
arch/arm64/include/asm/hardirq.h +1 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,7 @@ #include <linux/threads.h> #include <asm/irq.h> #define NR_IPI 4 #define NR_IPI 5 typedef struct { unsigned int __softirq_pending; Loading
arch/arm64/kernel/smp.c +17 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ enum ipi_msg_type { IPI_CALL_FUNC, IPI_CALL_FUNC_SINGLE, IPI_CPU_STOP, IPI_TIMER, }; /* Loading Loading @@ -446,6 +447,7 @@ static const char *ipi_types[NR_IPI] = { S(IPI_CALL_FUNC, "Function call interrupts"), S(IPI_CALL_FUNC_SINGLE, "Single function call interrupts"), S(IPI_CPU_STOP, "CPU stop interrupts"), S(IPI_TIMER, "Timer broadcast interrupts"), }; void show_ipi_list(struct seq_file *p, int prec) Loading Loading @@ -531,6 +533,14 @@ void handle_IPI(int ipinr, struct pt_regs *regs) irq_exit(); break; #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST case IPI_TIMER: irq_enter(); tick_receive_broadcast(); irq_exit(); break; #endif default: pr_crit("CPU%u: Unknown IPI message 0x%x\n", cpu, ipinr); break; Loading @@ -543,6 +553,13 @@ void smp_send_reschedule(int cpu) smp_cross_call(cpumask_of(cpu), IPI_RESCHEDULE); } #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST void tick_broadcast(const struct cpumask *mask) { smp_cross_call(mask, IPI_TIMER); } #endif void smp_send_stop(void) { unsigned long timeout; Loading