summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/lib/p9_ppe_utils.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/import/chips/p9/procedures/hwp/lib/p9_ppe_utils.C')
-rw-r--r--src/import/chips/p9/procedures/hwp/lib/p9_ppe_utils.C63
1 files changed, 42 insertions, 21 deletions
diff --git a/src/import/chips/p9/procedures/hwp/lib/p9_ppe_utils.C b/src/import/chips/p9/procedures/hwp/lib/p9_ppe_utils.C
index 6395f761..15bd9e35 100644
--- a/src/import/chips/p9/procedures/hwp/lib/p9_ppe_utils.C
+++ b/src/import/chips/p9/procedures/hwp/lib/p9_ppe_utils.C
@@ -28,10 +28,10 @@
///
/// *HWP HW Owner : Ashish More <ashish.more.@in.ibm.com>
/// *HWP HW Backup Owner : Brian Vanderpool <vanderp@us.ibm.com>
-/// *HWP FW Owner : Sangeetha T S <sangeet2@in.ibm.com>
+/// *HWP FW Owner : Amit Tendolkar <amit.tendolkar@in.ibm.com>
/// *HWP Team : PM
-/// *HWP Level : 2
-/// *HWP Consumed by : SBE, Cronus
+/// *HWP Level : 3
+/// *HWP Consumed by : Hostboot, FSP
///
/// @verbatim
///
@@ -43,12 +43,9 @@
#include <fapi2.H>
#include <p9_ppe_utils.H>
#include <p9_hcd_common.H>
+#include <p9_misc_scom_addresses_fld.H>
#include <map>
-
-
-
-
//// Vector defining the special acceess egisters
//const std::map<uint16_t, std::string> v_ppe_special_num_name =
//{
@@ -198,13 +195,15 @@ fapi2::ReturnCode ppe_pollHaltState(
{
FAPI_TRY(getScom(i_target, i_base_address + PPE_XIRAMDBG, l_data64), "Error in GETSCOM");
}
- while (! l_data64.getBit<0>() &&
+ while (! l_data64.getBit<PU_PPE_XIRAMDBG_XSR_HS>() &&
--l_timeout_count != 0);
- FAPI_ASSERT(l_data64.getBit<0>(), fapi2::P9_PPE_STATE_HALT_TIMEOUT_ERR(),
- "PPE Halt Timeout");
-
+ FAPI_ASSERT ( l_data64.getBit<PU_PPE_XIRAMDBG_XSR_HS>(),
+ fapi2::PPE_STATE_HALT_TIMEOUT_ERR()
+ .set_TARGET(i_target)
+ .set_ADDRESS(i_base_address),
+ "PPE Halt Timeout" );
fapi_try_exit:
return fapi2::current_err;
@@ -218,12 +217,24 @@ fapi2::ReturnCode ppe_halt(
{
fapi2::buffer<uint64_t> l_data64;
- FAPI_INF(" Send HALT command via XCR...");
- l_data64.flush<0>().insertFromRight(p9hcd::HALT, 1, 3);
-
- FAPI_TRY(putScom(i_target, i_base_address + PPE_XIXCR, l_data64), "Error in PUTSCOM in XCR to generate Halt condition");
+ FAPI_TRY ( getScom ( i_target,
+ i_base_address + PPE_XIRAMDBG,
+ l_data64 ),
+ "Error reading PPE Halt State" );
- FAPI_TRY(ppe_pollHaltState(i_target, i_base_address));
+ // Halt the PPE only if it is not already halted
+ if (! l_data64.getBit<PU_PPE_XIRAMDBG_XSR_HS>())
+ {
+ FAPI_INF(" Send HALT command via XCR...");
+ l_data64.flush<0>().insertFromRight(p9hcd::HALT, PU_PPE_XIXCR_XCR,
+ PU_PPE_XIXCR_XCR_LEN);
+
+ FAPI_TRY ( putScom ( i_target,
+ i_base_address + PPE_XIXCR,
+ l_data64 ),
+ "Error in PUTSCOM in XCR to generate Halt condition" );
+ FAPI_TRY(ppe_pollHaltState(i_target, i_base_address));
+ }
fapi_try_exit:
return fapi2::current_err;
@@ -236,13 +247,23 @@ fapi2::ReturnCode ppe_force_halt(
{
fapi2::buffer<uint64_t> l_data64;
- FAPI_INF(" Send FORCE HALT command via XCR...");
- l_data64.flush<0>().insertFromRight(p9hcd::FORCE_HALT, 1, 3);
+ FAPI_TRY ( getScom ( i_target,
+ i_base_address + PPE_XIRAMDBG,
+ l_data64 ),
+ "Error reading PPE Halt State" );
- FAPI_TRY(putScom(i_target, i_base_address + PPE_XIXCR, l_data64),
- "Error in PUTSCOM in XCR to generate Force Halt condition");
+ // Force Halt PPE only is it is not already Halted
+ if (! l_data64.getBit<PU_PPE_XIRAMDBG_XSR_HS>())
+ {
+ FAPI_INF(" Send FORCE HALT command via XCR...");
+ l_data64.flush<0>().insertFromRight(p9hcd::FORCE_HALT, PU_PPE_XIXCR_XCR,
+ PU_PPE_XIXCR_XCR_LEN);
- FAPI_TRY(ppe_pollHaltState(i_target, i_base_address));
+ FAPI_TRY(putScom(i_target, i_base_address + PPE_XIXCR, l_data64),
+ "Error in PUTSCOM in XCR to generate Force Halt condition");
+
+ FAPI_TRY(ppe_pollHaltState(i_target, i_base_address));
+ }
fapi_try_exit:
return fapi2::current_err;
OpenPOWER on IntegriCloud