diff options
author | Catalin Marinas <catalin.marinas@arm.com> | 2013-12-19 12:57:51 -0500 |
---|---|---|
committer | Catalin Marinas <catalin.marinas@arm.com> | 2013-12-19 12:57:51 -0500 |
commit | 0a5be743e8c3c3230600fbc0cf923fb5dbefd579 (patch) | |
tree | 239236cda1f31532831af7b3214b1db6c398221c /arch/arm64/kernel/smp.c | |
parent | 6ac2104debc235b745265b64d610237a6833fd53 (diff) | |
parent | 1307220d7bb79fc526d006f854ebfd2bf44e6e87 (diff) |
Merge tag 'arm64-suspend' of git://linux-arm.org/linux-2.6-lp into upstream
* tag 'arm64-suspend' of git://linux-arm.org/linux-2.6-lp:
arm64: add CPU power management menu/entries
arm64: kernel: add PM build infrastructure
arm64: kernel: add CPU idle call
arm64: enable generic clockevent broadcast
arm64: kernel: implement HW breakpoints CPU PM notifier
arm64: kernel: refactor code to install/uninstall breakpoints
arm: kvm: implement CPU PM notifier
arm64: kernel: implement fpsimd CPU PM notifier
arm64: kernel: cpu_{suspend/resume} implementation
arm64: kernel: suspend/resume registers save/restore
arm64: kernel: build MPIDR_EL1 hash function data structure
arm64: kernel: add MPIDR_EL1 accessors macros
Conflicts:
arch/arm64/Kconfig
Diffstat (limited to 'arch/arm64/kernel/smp.c')
-rw-r--r-- | arch/arm64/kernel/smp.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c index b5d2031c12c6..1b7617ab499b 100644 --- a/arch/arm64/kernel/smp.c +++ b/arch/arm64/kernel/smp.c | |||
@@ -61,6 +61,7 @@ enum ipi_msg_type { | |||
61 | IPI_CALL_FUNC, | 61 | IPI_CALL_FUNC, |
62 | IPI_CALL_FUNC_SINGLE, | 62 | IPI_CALL_FUNC_SINGLE, |
63 | IPI_CPU_STOP, | 63 | IPI_CPU_STOP, |
64 | IPI_TIMER, | ||
64 | }; | 65 | }; |
65 | 66 | ||
66 | /* | 67 | /* |
@@ -449,6 +450,7 @@ static const char *ipi_types[NR_IPI] = { | |||
449 | S(IPI_CALL_FUNC, "Function call interrupts"), | 450 | S(IPI_CALL_FUNC, "Function call interrupts"), |
450 | S(IPI_CALL_FUNC_SINGLE, "Single function call interrupts"), | 451 | S(IPI_CALL_FUNC_SINGLE, "Single function call interrupts"), |
451 | S(IPI_CPU_STOP, "CPU stop interrupts"), | 452 | S(IPI_CPU_STOP, "CPU stop interrupts"), |
453 | S(IPI_TIMER, "Timer broadcast interrupts"), | ||
452 | }; | 454 | }; |
453 | 455 | ||
454 | void show_ipi_list(struct seq_file *p, int prec) | 456 | void show_ipi_list(struct seq_file *p, int prec) |
@@ -534,6 +536,14 @@ void handle_IPI(int ipinr, struct pt_regs *regs) | |||
534 | irq_exit(); | 536 | irq_exit(); |
535 | break; | 537 | break; |
536 | 538 | ||
539 | #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST | ||
540 | case IPI_TIMER: | ||
541 | irq_enter(); | ||
542 | tick_receive_broadcast(); | ||
543 | irq_exit(); | ||
544 | break; | ||
545 | #endif | ||
546 | |||
537 | default: | 547 | default: |
538 | pr_crit("CPU%u: Unknown IPI message 0x%x\n", cpu, ipinr); | 548 | pr_crit("CPU%u: Unknown IPI message 0x%x\n", cpu, ipinr); |
539 | break; | 549 | break; |
@@ -546,6 +556,13 @@ void smp_send_reschedule(int cpu) | |||
546 | smp_cross_call(cpumask_of(cpu), IPI_RESCHEDULE); | 556 | smp_cross_call(cpumask_of(cpu), IPI_RESCHEDULE); |
547 | } | 557 | } |
548 | 558 | ||
559 | #ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST | ||
560 | void tick_broadcast(const struct cpumask *mask) | ||
561 | { | ||
562 | smp_cross_call(mask, IPI_TIMER); | ||
563 | } | ||
564 | #endif | ||
565 | |||
549 | void smp_send_stop(void) | 566 | void smp_send_stop(void) |
550 | { | 567 | { |
551 | unsigned long timeout; | 568 | unsigned long timeout; |