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};
|
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 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 power7_sleep(void);
|
||||||
extern void flush_instruction_cache(void);
|
extern void flush_instruction_cache(void);
|
||||||
extern void hard_reset_now(void);
|
extern void hard_reset_now(void);
|
||||||
|
@ -39,6 +39,10 @@
|
|||||||
* Pass requested state in r3:
|
* Pass requested state in r3:
|
||||||
* 0 - nap
|
* 0 - nap
|
||||||
* 1 - sleep
|
* 1 - sleep
|
||||||
|
*
|
||||||
|
* To check IRQ_HAPPENED in r4
|
||||||
|
* 0 - don't check
|
||||||
|
* 1 - check
|
||||||
*/
|
*/
|
||||||
_GLOBAL(power7_powersave_common)
|
_GLOBAL(power7_powersave_common)
|
||||||
/* Use r3 to pass state nap/sleep/winkle */
|
/* Use r3 to pass state nap/sleep/winkle */
|
||||||
@ -71,6 +75,8 @@ _GLOBAL(power7_powersave_common)
|
|||||||
lbz r0,PACAIRQHAPPENED(r13)
|
lbz r0,PACAIRQHAPPENED(r13)
|
||||||
cmpwi cr0,r0,0
|
cmpwi cr0,r0,0
|
||||||
beq 1f
|
beq 1f
|
||||||
|
cmpwi cr0,r4,0
|
||||||
|
beq 1f
|
||||||
addi r1,r1,INT_FRAME_SIZE
|
addi r1,r1,INT_FRAME_SIZE
|
||||||
ld r0,16(r1)
|
ld r0,16(r1)
|
||||||
mtlr r0
|
mtlr r0
|
||||||
@ -114,15 +120,18 @@ _GLOBAL(power7_idle)
|
|||||||
lwz r4,ADDROFF(powersave_nap)(r3)
|
lwz r4,ADDROFF(powersave_nap)(r3)
|
||||||
cmpwi 0,r4,0
|
cmpwi 0,r4,0
|
||||||
beqlr
|
beqlr
|
||||||
|
li r3, 1
|
||||||
/* fall through */
|
/* fall through */
|
||||||
|
|
||||||
_GLOBAL(power7_nap)
|
_GLOBAL(power7_nap)
|
||||||
|
mr r4,r3
|
||||||
li r3,0
|
li r3,0
|
||||||
b power7_powersave_common
|
b power7_powersave_common
|
||||||
/* No return */
|
/* No return */
|
||||||
|
|
||||||
_GLOBAL(power7_sleep)
|
_GLOBAL(power7_sleep)
|
||||||
li r3,1
|
li r3,1
|
||||||
|
li r4,0
|
||||||
b power7_powersave_common
|
b power7_powersave_common
|
||||||
/* No return */
|
/* No return */
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ static void pnv_smp_cpu_kill_self(void)
|
|||||||
mtspr(SPRN_LPCR, mfspr(SPRN_LPCR) & ~(u64)LPCR_PECE1);
|
mtspr(SPRN_LPCR, mfspr(SPRN_LPCR) & ~(u64)LPCR_PECE1);
|
||||||
while (!generic_check_cpu_restart(cpu)) {
|
while (!generic_check_cpu_restart(cpu)) {
|
||||||
ppc64_runlatch_off();
|
ppc64_runlatch_off();
|
||||||
power7_nap();
|
power7_nap(1);
|
||||||
ppc64_runlatch_on();
|
ppc64_runlatch_on();
|
||||||
if (!generic_check_cpu_restart(cpu)) {
|
if (!generic_check_cpu_restart(cpu)) {
|
||||||
DBG("CPU%d Unexpected exit while offline !\n", cpu);
|
DBG("CPU%d Unexpected exit while offline !\n", cpu);
|
||||||
|
Loading…
Reference in New Issue
Block a user