1
2
3
4
5
6
7
8
9
10
11
12#include <linux/threads.h>
13#include <asm/reg.h>
14#include <asm/ppc_asm.h>
15#include <asm/asm-offsets.h>
16#include <asm/ppc-opcode.h>
17#include <asm/processor.h>
18#include <asm/thread_info.h>
19#include <asm/epapr_hcalls.h>
20
21
22#ifdef CONFIG_PPC64
23
24.macro BOOK3E_IDLE name loop
25_GLOBAL(\name)
26
27 mflr r0
28 std r0,16(r1)
29
30
31 wrteei 0
32
33
34
35
36 lbz r3,PACAIRQHAPPENED(r13)
37 cmpwi cr0,r3,0
38 bnelr
39
40
41
42
43
44#ifdef CONFIG_TRACE_IRQFLAGS
45 stdu r1,-128(r1)
46 bl trace_hardirqs_on
47 addi r1,r1,128
48#endif
49 li r0,1
50 stb r0,PACASOFTIRQEN(r13)
51
52
53
54
55 bl 1f
56
57
58 ld r0,16(r1)
59 mtlr r0
60 blr
61
621:
63
64
65 CURRENT_THREAD_INFO(r11, r1)
66 ld r10,TI_LOCAL_FLAGS(r11)
67 ori r10,r10,_TLF_NAPPING
68 std r10,TI_LOCAL_FLAGS(r11)
69
70
71 wrteei 1
72 \loop
73
74.endm
75
76.macro BOOK3E_IDLE_LOOP
771:
78 PPC_WAIT(0)
79 b 1b
80.endm
81
82
83
84.macro EPAPR_EV_IDLE_LOOP
85idle_loop:
86 LOAD_REG_IMMEDIATE(r11, EV_HCALL_TOKEN(EV_IDLE))
87
88.global epapr_ev_idle_start
89epapr_ev_idle_start:
90 li r3, -1
91 nop
92 nop
93 nop
94 b idle_loop
95.endm
96
97BOOK3E_IDLE epapr_ev_idle EPAPR_EV_IDLE_LOOP
98
99BOOK3E_IDLE book3e_idle BOOK3E_IDLE_LOOP
100
101#endif
102