|
@@ -449,9 +449,23 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
|
|
|
_GLOBAL(pnv_wakeup_tb_loss)
|
|
|
ld r1,PACAR1(r13)
|
|
|
/*
|
|
|
- * Before entering any idle state, the NVGPRs are saved in the stack
|
|
|
- * and they are restored before switching to the process context. Hence
|
|
|
- * until they are restored, they are free to be used.
|
|
|
+ * Before entering any idle state, the NVGPRs are saved in the stack.
|
|
|
+ * If there was a state loss, or PACA_NAPSTATELOST was set, then the
|
|
|
+ * NVGPRs are restored. If we are here, it is likely that state is lost,
|
|
|
+ * but not guaranteed -- neither ISA207 nor ISA300 tests to reach
|
|
|
+ * here are the same as the test to restore NVGPRS:
|
|
|
+ * PACA_THREAD_IDLE_STATE test for ISA207, PSSCR test for ISA300,
|
|
|
+ * and SRR1 test for restoring NVGPRs.
|
|
|
+ *
|
|
|
+ * We are about to clobber NVGPRs now, so set NAPSTATELOST to
|
|
|
+ * guarantee they will always be restored. This might be tightened
|
|
|
+ * with careful reading of specs (particularly for ISA300) but this
|
|
|
+ * is already a slow wakeup path and it's simpler to be safe.
|
|
|
+ */
|
|
|
+ li r0,1
|
|
|
+ stb r0,PACA_NAPSTATELOST(r13)
|
|
|
+
|
|
|
+ /*
|
|
|
*
|
|
|
* Save SRR1 and LR in NVGPRs as they might be clobbered in
|
|
|
* opal_call() (called in CHECK_HMI_INTERRUPT). SRR1 is required
|