aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/include/asm/opal.h2
-rw-r--r--arch/powerpc/kernel/exceptions-64s.S2
-rw-r--r--arch/powerpc/kernel/idle_power7.S27
-rw-r--r--arch/powerpc/platforms/powernv/opal-wrappers.S1
4 files changed, 31 insertions, 1 deletions
diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h
index 40157e2ca691..c71c72e47d47 100644
--- a/arch/powerpc/include/asm/opal.h
+++ b/arch/powerpc/include/asm/opal.h
@@ -154,6 +154,7 @@ extern int opal_enter_rtas(struct rtas_args *args,
154#define OPAL_FLASH_VALIDATE 76 154#define OPAL_FLASH_VALIDATE 76
155#define OPAL_FLASH_MANAGE 77 155#define OPAL_FLASH_MANAGE 77
156#define OPAL_FLASH_UPDATE 78 156#define OPAL_FLASH_UPDATE 78
157#define OPAL_RESYNC_TIMEBASE 79
157#define OPAL_GET_MSG 85 158#define OPAL_GET_MSG 85
158#define OPAL_CHECK_ASYNC_COMPLETION 86 159#define OPAL_CHECK_ASYNC_COMPLETION 86
159#define OPAL_SYNC_HOST_REBOOT 87 160#define OPAL_SYNC_HOST_REBOOT 87
@@ -865,6 +866,7 @@ extern void opal_flash_init(void);
865extern int opal_machine_check(struct pt_regs *regs); 866extern int opal_machine_check(struct pt_regs *regs);
866 867
867extern void opal_shutdown(void); 868extern void opal_shutdown(void);
869extern int opal_resync_timebase(void);
868 870
869extern void opal_lpc_init(void); 871extern void opal_lpc_init(void);
870 872
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index b01a9cb441e4..9533d7a9223c 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -145,7 +145,7 @@ BEGIN_FTR_SECTION
145 145
146 /* Fast Sleep wakeup on PowerNV */ 146 /* Fast Sleep wakeup on PowerNV */
1478: GET_PACA(r13) 1478: GET_PACA(r13)
148 b .power7_wakeup_loss 148 b .power7_wakeup_tb_loss
149 149
1509: 1509:
151END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206) 151END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
diff --git a/arch/powerpc/kernel/idle_power7.S b/arch/powerpc/kernel/idle_power7.S
index 14f78bec62c4..c3ab86975614 100644
--- a/arch/powerpc/kernel/idle_power7.S
+++ b/arch/powerpc/kernel/idle_power7.S
@@ -17,6 +17,7 @@
17#include <asm/ppc-opcode.h> 17#include <asm/ppc-opcode.h>
18#include <asm/hw_irq.h> 18#include <asm/hw_irq.h>
19#include <asm/kvm_book3s_asm.h> 19#include <asm/kvm_book3s_asm.h>
20#include <asm/opal.h>
20 21
21#undef DEBUG 22#undef DEBUG
22 23
@@ -125,6 +126,32 @@ _GLOBAL(power7_sleep)
125 b power7_powersave_common 126 b power7_powersave_common
126 /* No return */ 127 /* No return */
127 128
129_GLOBAL(power7_wakeup_tb_loss)
130 ld r2,PACATOC(r13);
131 ld r1,PACAR1(r13)
132
133 /* Time base re-sync */
134 li r0,OPAL_RESYNC_TIMEBASE
135 LOAD_REG_ADDR(r11,opal);
136 ld r12,8(r11);
137 ld r2,0(r11);
138 mtctr r12
139 bctrl
140
141 /* TODO: Check r3 for failure */
142
143 REST_NVGPRS(r1)
144 REST_GPR(2, r1)
145 ld r3,_CCR(r1)
146 ld r4,_MSR(r1)
147 ld r5,_NIP(r1)
148 addi r1,r1,INT_FRAME_SIZE
149 mtcr r3
150 mfspr r3,SPRN_SRR1 /* Return SRR1 */
151 mtspr SPRN_SRR1,r4
152 mtspr SPRN_SRR0,r5
153 rfid
154
128_GLOBAL(power7_wakeup_loss) 155_GLOBAL(power7_wakeup_loss)
129 ld r1,PACAR1(r13) 156 ld r1,PACAR1(r13)
130 REST_NVGPRS(r1) 157 REST_NVGPRS(r1)
diff --git a/arch/powerpc/platforms/powernv/opal-wrappers.S b/arch/powerpc/platforms/powernv/opal-wrappers.S
index 3e8829c40fbb..aab54b60334f 100644
--- a/arch/powerpc/platforms/powernv/opal-wrappers.S
+++ b/arch/powerpc/platforms/powernv/opal-wrappers.S
@@ -126,6 +126,7 @@ OPAL_CALL(opal_return_cpu, OPAL_RETURN_CPU);
126OPAL_CALL(opal_validate_flash, OPAL_FLASH_VALIDATE); 126OPAL_CALL(opal_validate_flash, OPAL_FLASH_VALIDATE);
127OPAL_CALL(opal_manage_flash, OPAL_FLASH_MANAGE); 127OPAL_CALL(opal_manage_flash, OPAL_FLASH_MANAGE);
128OPAL_CALL(opal_update_flash, OPAL_FLASH_UPDATE); 128OPAL_CALL(opal_update_flash, OPAL_FLASH_UPDATE);
129OPAL_CALL(opal_resync_timebase, OPAL_RESYNC_TIMEBASE);
129OPAL_CALL(opal_get_msg, OPAL_GET_MSG); 130OPAL_CALL(opal_get_msg, OPAL_GET_MSG);
130OPAL_CALL(opal_check_completion, OPAL_CHECK_ASYNC_COMPLETION); 131OPAL_CALL(opal_check_completion, OPAL_CHECK_ASYNC_COMPLETION);
131OPAL_CALL(opal_sync_host_reboot, OPAL_SYNC_HOST_REBOOT); 132OPAL_CALL(opal_sync_host_reboot, OPAL_SYNC_HOST_REBOOT);