-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
powerpc/book3e: Add generic 64-bit idle powersave support
We use a similar technique to ppc32: We set a thread local flag to indicate that we are about to enter or have entered the stop state, and have fixup code in the async interrupt entry code that reacts to this flag to make us return to a different location (sets NIP to LINK in our case). Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> -- v2. Fix lockdep bug Re-mask interrupts when coming back from idle
- Loading branch information
Benjamin Herrenschmidt
committed
Jul 14, 2010
1 parent
850f22d
commit 34d97e0
Showing
4 changed files
with
111 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
/* | ||
* Copyright 2010 IBM Corp, Benjamin Herrenschmidt <benh@kernel.crashing.org> | ||
* | ||
* Generic idle routine for Book3E processors | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; either version | ||
* 2 of the License, or (at your option) any later version. | ||
*/ | ||
|
||
#include <linux/threads.h> | ||
#include <asm/reg.h> | ||
#include <asm/ppc_asm.h> | ||
#include <asm/asm-offsets.h> | ||
#include <asm/ppc-opcode.h> | ||
#include <asm/processor.h> | ||
#include <asm/thread_info.h> | ||
|
||
/* 64-bit version only for now */ | ||
#ifdef CONFIG_PPC64 | ||
|
||
_GLOBAL(book3e_idle) | ||
/* Save LR for later */ | ||
mflr r0 | ||
std r0,16(r1) | ||
|
||
/* Hard disable interrupts */ | ||
wrteei 0 | ||
|
||
/* Now check if an interrupt came in while we were soft disabled | ||
* since we may otherwise lose it (doorbells etc...). We know | ||
* that since PACAHARDIRQEN will have been cleared in that case. | ||
*/ | ||
lbz r3,PACAHARDIRQEN(r13) | ||
cmpwi cr0,r3,0 | ||
beqlr | ||
|
||
/* Now we are going to mark ourselves as soft and hard enables in | ||
* order to be able to take interrupts while asleep. We inform lockdep | ||
* of that. We don't actually turn interrupts on just yet tho. | ||
*/ | ||
#ifdef CONFIG_TRACE_IRQFLAGS | ||
stdu r1,-128(r1) | ||
bl .trace_hardirqs_on | ||
#endif | ||
li r0,1 | ||
stb r0,PACASOFTIRQEN(r13) | ||
stb r0,PACAHARDIRQEN(r13) | ||
|
||
/* Interrupts will make use return to LR, so get something we want | ||
* in there | ||
*/ | ||
bl 1f | ||
|
||
/* Hard disable interrupts again */ | ||
wrteei 0 | ||
|
||
/* Mark them off again in the PACA as well */ | ||
li r0,0 | ||
stb r0,PACASOFTIRQEN(r13) | ||
stb r0,PACAHARDIRQEN(r13) | ||
|
||
/* Tell lockdep about it */ | ||
#ifdef CONFIG_TRACE_IRQFLAGS | ||
bl .trace_hardirqs_off | ||
addi r1,r1,128 | ||
#endif | ||
ld r0,16(r1) | ||
mtlr r0 | ||
blr | ||
|
||
1: /* Let's set the _TLF_NAPPING flag so interrupts make us return | ||
* to the right spot | ||
*/ | ||
clrrdi r11,r1,THREAD_SHIFT | ||
ld r10,TI_LOCAL_FLAGS(r11) | ||
ori r10,r10,_TLF_NAPPING | ||
std r10,TI_LOCAL_FLAGS(r11) | ||
|
||
/* We can now re-enable hard interrupts and go to sleep */ | ||
wrteei 1 | ||
1: PPC_WAIT(0) | ||
b 1b | ||
|
||
#endif /* CONFIG_PPC64 */ |