powerpc/powernv: Make it possible to skip the IRQHAPPENED check in power7_nap()
To support split core we need to be able to force all secondaries into nap, so the core can detect they are idle and do an unsplit. Currently power7_nap() will return without napping if there is an irq pending. We want to ignore the pending irq and nap anyway, we will deal with the interrupt later. Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Signed-off-by: Michael Neuling <mikey@neuling.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
441c19c8a2
commit
8d6f7c5aa3
|
@ -449,7 +449,7 @@ extern unsigned long cpuidle_disable;
|
|||
enum idle_boot_override {IDLE_NO_OVERRIDE = 0, IDLE_POWERSAVE_OFF};
|
||||
|
||||
extern int powersave_nap; /* set if nap mode can be used in idle loop */
|
||||
extern void power7_nap(void);
|
||||
extern void power7_nap(int check_irq);
|
||||
extern void power7_sleep(void);
|
||||
extern void flush_instruction_cache(void);
|
||||
extern void hard_reset_now(void);
|
||||
|
|
|
@ -39,6 +39,10 @@
|
|||
* Pass requested state in r3:
|
||||
* 0 - nap
|
||||
* 1 - sleep
|
||||
*
|
||||
* To check IRQ_HAPPENED in r4
|
||||
* 0 - don't check
|
||||
* 1 - check
|
||||
*/
|
||||
_GLOBAL(power7_powersave_common)
|
||||
/* Use r3 to pass state nap/sleep/winkle */
|
||||
|
@ -71,6 +75,8 @@ _GLOBAL(power7_powersave_common)
|
|||
lbz r0,PACAIRQHAPPENED(r13)
|
||||
cmpwi cr0,r0,0
|
||||
beq 1f
|
||||
cmpwi cr0,r4,0
|
||||
beq 1f
|
||||
addi r1,r1,INT_FRAME_SIZE
|
||||
ld r0,16(r1)
|
||||
mtlr r0
|
||||
|
@ -114,15 +120,18 @@ _GLOBAL(power7_idle)
|
|||
lwz r4,ADDROFF(powersave_nap)(r3)
|
||||
cmpwi 0,r4,0
|
||||
beqlr
|
||||
li r3, 1
|
||||
/* fall through */
|
||||
|
||||
_GLOBAL(power7_nap)
|
||||
mr r4,r3
|
||||
li r3,0
|
||||
b power7_powersave_common
|
||||
/* No return */
|
||||
|
||||
_GLOBAL(power7_sleep)
|
||||
li r3,1
|
||||
li r4,0
|
||||
b power7_powersave_common
|
||||
/* No return */
|
||||
|
||||
|
|
|
@ -159,7 +159,7 @@ static void pnv_smp_cpu_kill_self(void)
|
|||
mtspr(SPRN_LPCR, mfspr(SPRN_LPCR) & ~(u64)LPCR_PECE1);
|
||||
while (!generic_check_cpu_restart(cpu)) {
|
||||
ppc64_runlatch_off();
|
||||
power7_nap();
|
||||
power7_nap(1);
|
||||
ppc64_runlatch_on();
|
||||
if (!generic_check_cpu_restart(cpu)) {
|
||||
DBG("CPU%d Unexpected exit while offline !\n", cpu);
|
||||
|
|
Loading…
Reference in a new issue