#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>
#include <asm/epapr_hcalls.h>
#include <asm/hw_irq.h>
.macro BOOK3E_IDLE name loop
_GLOBAL(\name)
mflr r0
std r0,16(r1)
wrteei 0
lbz r3,PACAIRQHAPPENED(r13)
cmpwi cr0,r3,0
bne 2f
#ifdef CONFIG_TRACE_IRQFLAGS
stdu r1,-128(r1)
bl trace_hardirqs_on
addi r1,r1,128
#endif
li r0,IRQS_ENABLED
stb r0,PACAIRQSOFTMASK(r13)
bl 1f
ld r0,16(r1)
mtlr r0
blr
1:
ld r11, PACACURRENT(r13)
ld r10,TI_LOCAL_FLAGS(r11)
ori r10,r10,_TLF_NAPPING
std r10,TI_LOCAL_FLAGS(r11)
wrteei 1
\loop
2:
lbz r10,PACAIRQHAPPENED(r13)
ori r10,r10,PACA_IRQ_HARD_DIS
stb r10,PACAIRQHAPPENED(r13)
blr
.endm
.macro BOOK3E_IDLE_LOOP
1:
PPC_WAIT_v203
b 1b
.endm
.macro EPAPR_EV_IDLE_LOOP
idle_loop:
LOAD_REG_IMMEDIATE(r11, EV_HCALL_TOKEN(EV_IDLE))
.global epapr_ev_idle_start
epapr_ev_idle_start:
li r3, -1
nop
nop
nop
b idle_loop
.endm
BOOK3E_IDLE epapr_ev_idle EPAPR_EV_IDLE_LOOP
BOOK3E_IDLE e500_idle BOOK3E_IDLE_LOOP