POWER9 onwards the support for the registers HID1, HID4, HID5 has been
receded.
Although mfspr on the above registers worked in Power9, In Power10
simulator is unrecognized. Moving their assignment under the
check for machines lower than Power9
Signed-off-by: Pratik Rajesh Sampat <redacted>
---
arch/powerpc/platforms/powernv/idle.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
@@ -73,9 +73,6 @@ static int pnv_save_sprs_for_deep_states(void)*/uint64_tlpcr_val=mfspr(SPRN_LPCR);uint64_thid0_val=mfspr(SPRN_HID0);-uint64_thid1_val=mfspr(SPRN_HID1);-uint64_thid4_val=mfspr(SPRN_HID4);-uint64_thid5_val=mfspr(SPRN_HID5);uint64_thmeer_val=mfspr(SPRN_HMEER);uint64_tmsr_val=MSR_IDLE;uint64_tpsscr_val=pnv_deepest_stop_psscr_val;
@@ -117,6 +114,9 @@ static int pnv_save_sprs_for_deep_states(void)/* Only p8 needs to set extra HID regiters */if(!cpu_has_feature(CPU_FTR_ARCH_300)){+uint64_thid1_val=mfspr(SPRN_HID1);+uint64_thid4_val=mfspr(SPRN_HID4);+uint64_thid5_val=mfspr(SPRN_HID5);rc=opal_slw_set_reg(pir,SPRN_HID1,hid1_val);if(rc!=0)
Additional registers DAWR0, DAWRX0 may be lost on Power 10 for
stop levels < 4.
Therefore save the values of these SPRs before entering a "stop"
state and restore their values on wakeup.
Signed-off-by: Pratik Rajesh Sampat <redacted>
---
arch/powerpc/platforms/powernv/idle.c | 10 ++++++++++
1 file changed, 10 insertions(+)
From: Gautham R Shenoy <hidden> Date: 2020-07-09 10:58:28
On Fri, Jul 03, 2020 at 06:16:39PM +0530, Pratik Rajesh Sampat wrote:
POWER9 onwards the support for the registers HID1, HID4, HID5 has been
receded.
Although mfspr on the above registers worked in Power9, In Power10
simulator is unrecognized. Moving their assignment under the
check for machines lower than Power9
Signed-off-by: Pratik Rajesh Sampat <redacted>
Nice catch.
Reviewed-by: Gautham R. Shenoy <redacted>
@@ -73,9 +73,6 @@ static int pnv_save_sprs_for_deep_states(void)*/uint64_tlpcr_val=mfspr(SPRN_LPCR);uint64_thid0_val=mfspr(SPRN_HID0);-uint64_thid1_val=mfspr(SPRN_HID1);-uint64_thid4_val=mfspr(SPRN_HID4);-uint64_thid5_val=mfspr(SPRN_HID5);uint64_thmeer_val=mfspr(SPRN_HMEER);uint64_tmsr_val=MSR_IDLE;uint64_tpsscr_val=pnv_deepest_stop_psscr_val;
@@ -117,6 +114,9 @@ static int pnv_save_sprs_for_deep_states(void)/* Only p8 needs to set extra HID regiters */if(!cpu_has_feature(CPU_FTR_ARCH_300)){+uint64_thid1_val=mfspr(SPRN_HID1);+uint64_thid4_val=mfspr(SPRN_HID4);+uint64_thid5_val=mfspr(SPRN_HID5);rc=opal_slw_set_reg(pir,SPRN_HID1,hid1_val);if(rc!=0)
From: Gautham R Shenoy <hidden> Date: 2020-07-09 10:58:34
On Fri, Jul 03, 2020 at 06:16:40PM +0530, Pratik Rajesh Sampat wrote:
Additional registers DAWR0, DAWRX0 may be lost on Power 10 for
stop levels < 4.
Adding Ravi Bangoria [off-list ref] to the cc.
Therefore save the values of these SPRs before entering a "stop"
state and restore their values on wakeup.
Signed-off-by: Pratik Rajesh Sampat <redacted>
@@ -677,6 +679,10 @@ static unsigned long power9_idle_stop(unsigned long psscr, bool mmu_on)sprs.tscr=mfspr(SPRN_TSCR);if(!firmware_has_feature(FW_FEATURE_ULTRAVISOR))sprs.ldbar=mfspr(SPRN_LDBAR);+if(cpu_has_feature(CPU_FTR_ARCH_31)){+sprs.dawr0=mfspr(SPRN_DAWR0);+sprs.dawrx0=mfspr(SPRN_DAWRX0);+}
But this is within the if condition which says
if ((psscr & PSSCR_RL_MASK) >= pnv_first_spr_loss_level)
This if condition is meant for stop4 and stop5 since these are stop
levels that have OPAL_PM_LOSE_HYP_CONTEXT set.
Since we can lose DAWR*, on states that lose limited hypervisor
context, such as stop0-2, we need to unconditionally save them
like AMR, IAMR etc.
quoted hunk
sprs_saved = true;
@@ -792,6 +798,10 @@ static unsigned long power9_idle_stop(unsigned long psscr, bool mmu_on) mtspr(SPRN_MMCR2, sprs.mmcr2); if (!firmware_has_feature(FW_FEATURE_ULTRAVISOR)) mtspr(SPRN_LDBAR, sprs.ldbar);+ if (cpu_has_feature(CPU_FTR_ARCH_31)) {+ mtspr(SPRN_DAWR0, sprs.dawr0);+ mtspr(SPRN_DAWRX0, sprs.dawrx0);+ }
Likewise, we need to unconditionally restore these SPRs.
On Fri, Jul 03, 2020 at 06:16:40PM +0530, Pratik Rajesh Sampat wrote:
quoted
Additional registers DAWR0, DAWRX0 may be lost on Power 10 for
stop levels < 4.
Adding Ravi Bangoria [off-list ref] to the cc.
quoted
Therefore save the values of these SPRs before entering a "stop"
state and restore their values on wakeup.
Signed-off-by: Pratik Rajesh Sampat <redacted>
@@ -677,6 +679,10 @@ static unsigned long power9_idle_stop(unsigned long psscr, bool mmu_on)sprs.tscr=mfspr(SPRN_TSCR);if(!firmware_has_feature(FW_FEATURE_ULTRAVISOR))sprs.ldbar=mfspr(SPRN_LDBAR);+if(cpu_has_feature(CPU_FTR_ARCH_31)){+sprs.dawr0=mfspr(SPRN_DAWR0);+sprs.dawrx0=mfspr(SPRN_DAWRX0);+}
But this is within the if condition which says
if ((psscr & PSSCR_RL_MASK) >= pnv_first_spr_loss_level)
This if condition is meant for stop4 and stop5 since these are stop
levels that have OPAL_PM_LOSE_HYP_CONTEXT set.
Since we can lose DAWR*, on states that lose limited hypervisor
context, such as stop0-2, we need to unconditionally save them
like AMR, IAMR etc.
Right, shallow states too loose DAWR/X. Thanks for pointing it out.
I'll fix this and resend.
quoted
sprs_saved = true;
@@ -792,6 +798,10 @@ static unsigned long power9_idle_stop(unsigned long psscr, bool mmu_on) mtspr(SPRN_MMCR2, sprs.mmcr2); if (!firmware_has_feature(FW_FEATURE_ULTRAVISOR)) mtspr(SPRN_LDBAR, sprs.ldbar);+ if (cpu_has_feature(CPU_FTR_ARCH_31)) {+ mtspr(SPRN_DAWR0, sprs.dawr0);+ mtspr(SPRN_DAWRX0, sprs.dawrx0);+ }
Likewise, we need to unconditionally restore these SPRs.