diff options
| author | Brian Vanderpool <vanderp@us.ibm.com> | 2017-11-04 16:34:54 -0500 |
|---|---|---|
| committer | Joshua Hunsberger <jahunsbe@us.ibm.com> | 2017-11-17 15:06:46 -0600 |
| commit | 6ec15f3d2d8fd652e1ce89cf105220a0a8274092 (patch) | |
| tree | 71dd02e34fea39cccd032ed883f4530d86a3aec2 | |
| parent | 533c7251d97b2565d90c70c113e53f9e3b9f5e88 (diff) | |
| download | talos-hcode-6ec15f3d2d8fd652e1ce89cf105220a0a8274092.tar.gz talos-hcode-6ec15f3d2d8fd652e1ce89cf105220a0a8274092.zip | |
PM: Retry DIRECT_CONTROLS write of PLS after stop 2 exit
Key_Cronus_Test=PM_REGRESS
Change-Id: I6870df4ffb75fe3342c6a42dcc40fa867245fe1b
CQ: SW404478
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/49272
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Tested-by: Cronus HW CI <cronushw-ci+hostboot@us.ibm.com>
Reviewed-by: Gregory S. Still <stillgs@us.ibm.com>
Reviewed-by: Michael S. Floyd <mfloyd@us.ibm.com>
Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com>
| -rw-r--r-- | import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_exit.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_exit.c b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_exit.c index ad5286a8..5ebbda95 100644 --- a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_exit.c +++ b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_exit.c @@ -68,8 +68,11 @@ p9_cme_stop_exit_end(uint32_t core, uint32_t spwu_stop) uint32_t thread = 0; uint32_t temp_dsl = 0; uint32_t core_index = 0; +#else + uint32_t saved_msr = 0; #endif + //-------------------------------------------------------------------------- PK_TRACE_PERF("+++++ +++++ END OF STOP EXIT +++++ +++++"); //-------------------------------------------------------------------------- @@ -222,7 +225,24 @@ p9_cme_stop_exit_end(uint32_t core, uint32_t spwu_stop) SOME_STATE_LOSS_BUT_NOT_TIMEBASE : NO_STATE_LOSS))); } + + // Treat the first write with suspicion due to a bug in the PSCOM macro when a previous scom has timed out + saved_msr = mfmsr(); + mtmsr( saved_msr | MSR_SEM4); // Mask off timeout + CME_PUTSCOM(DIRECT_CONTROLS, core_mask, scom_data.value); + + if ((mfmsr() & MSR_SIBRC) != 0) + { + // The second write should never fail. Unmask the error + mtmsr(saved_msr); + CME_PUTSCOM(DIRECT_CONTROLS, core_mask, scom_data.value); + } + else + { + mtmsr(saved_msr); + } + } } |

