parisc: Rewrite arch_cpu_idle_dead() for CPU hotplugging
Let the PDC firmware put the CPU into firmware idle loop with the pdc_cpu_rendezvous() function. Signed-off-by: Helge Deller <deller@gmx.de>
This commit is contained in:
parent
88b3aac622
commit
98903688e6
|
@ -38,6 +38,7 @@
|
||||||
#include <linux/rcupdate.h>
|
#include <linux/rcupdate.h>
|
||||||
#include <linux/random.h>
|
#include <linux/random.h>
|
||||||
#include <linux/nmi.h>
|
#include <linux/nmi.h>
|
||||||
|
#include <linux/sched/hotplug.h>
|
||||||
|
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
|
@ -46,6 +47,7 @@
|
||||||
#include <asm/pdc_chassis.h>
|
#include <asm/pdc_chassis.h>
|
||||||
#include <asm/unwind.h>
|
#include <asm/unwind.h>
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
|
#include <asm/cacheflush.h>
|
||||||
|
|
||||||
#define COMMAND_GLOBAL F_EXTEND(0xfffe0030)
|
#define COMMAND_GLOBAL F_EXTEND(0xfffe0030)
|
||||||
#define CMD_RESET 5 /* reset any module */
|
#define CMD_RESET 5 /* reset any module */
|
||||||
|
@ -158,10 +160,29 @@ void release_thread(struct task_struct *dead_task)
|
||||||
int running_on_qemu __ro_after_init;
|
int running_on_qemu __ro_after_init;
|
||||||
EXPORT_SYMBOL(running_on_qemu);
|
EXPORT_SYMBOL(running_on_qemu);
|
||||||
|
|
||||||
void __cpuidle arch_cpu_idle_dead(void)
|
/*
|
||||||
|
* Called from the idle thread for the CPU which has been shutdown.
|
||||||
|
*/
|
||||||
|
void arch_cpu_idle_dead(void)
|
||||||
{
|
{
|
||||||
/* nop on real hardware, qemu will offline CPU. */
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
asm volatile("or %%r31,%%r31,%%r31\n":::);
|
idle_task_exit();
|
||||||
|
|
||||||
|
local_irq_disable();
|
||||||
|
|
||||||
|
/* Tell __cpu_die() that this CPU is now safe to dispose of. */
|
||||||
|
(void)cpu_report_death();
|
||||||
|
|
||||||
|
/* Ensure that the cache lines are written out. */
|
||||||
|
flush_cache_all_local();
|
||||||
|
flush_tlb_all_local(NULL);
|
||||||
|
|
||||||
|
/* Let PDC firmware put CPU into firmware idle loop. */
|
||||||
|
__pdc_cpu_rendezvous();
|
||||||
|
|
||||||
|
pr_warn("PDC does not provide rendezvous function.\n");
|
||||||
|
#endif
|
||||||
|
while (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __cpuidle arch_cpu_idle(void)
|
void __cpuidle arch_cpu_idle(void)
|
||||||
|
|
Loading…
Reference in New Issue