summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures
diff options
context:
space:
mode:
Diffstat (limited to 'src/import/chips/p9/procedures')
-rw-r--r--src/import/chips/p9/procedures/hwp/lib/p9_ppe_utils.C211
1 files changed, 210 insertions, 1 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 0729c7e9..bee067ba 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
@@ -395,7 +395,7 @@ fapi2::ReturnCode ppe_resume(
//Before reume always clear debug status (Michael's comment)
FAPI_INF(" Clear debug status via XCR...");
l_data64.flush<0>();
- FAPI_TRY(putScom(i_target, i_base_address + PPE_XIXCR, l_data64), "Error in PUTSCOM in XCR to resume condition");
+ FAPI_TRY(putScom(i_target, i_base_address + PPE_XIXCR, l_data64), "Error in PUTSCOM in XCR to clear dbg status");
FAPI_INF(" Send RESUME command via XCR...");
l_data64.flush<0>().insertFromRight(p9hcd::RESUME, 1, 3);
@@ -547,7 +547,21 @@ fapi2::ReturnCode ppe_single_step(
{
fapi2::buffer<uint64_t> l_data64;
fapi2::buffer<uint64_t> l_dbcr_save;
+ fapi2::buffer<uint32_t> l_gpr31_save;
+ fapi2::buffer<uint64_t> l_sprg0_save;
+
FAPI_TRY(ppe_pollHaltState(i_target, i_base_address));
+ // Save SPRG0 i_Rs before getting dbcr
+ FAPI_DBG("Save SPRG0");
+ FAPI_TRY(getScom(i_target, i_base_address + PPE_XIRAMDBG, l_data64), "Error in GETSCOM");
+ l_data64.extractToRight(l_sprg0_save, 32, 32);
+ FAPI_DBG("Saved SPRG0 value : 0x%08llX", l_sprg0_save );
+ FAPI_DBG("Save i_Rs");
+ l_data64.flush<0>().insertFromRight(ppe_getMtsprInstruction(i_Rs, SPRG0), 0, 32);
+ FAPI_DBG("getMtsprInstruction(%d, SPRG0): 0x%16llX", R31, l_data64 );
+ FAPI_TRY(ppe_RAMRead(i_target, i_base_address, l_data64, l_gpr31_save));
+ FAPI_DBG("Saved GPR31 value : 0x%08llX", l_gpr31_save );
+
FAPI_INF(" Read and Save DBCR");
FAPI_DBG("Move DBCR to i_Rs");
l_data64.flush<0>().insertFromRight(ppe_getMfsprInstruction(i_Rs, DBCR), 0, 32);
@@ -566,6 +580,18 @@ fapi2::ReturnCode ppe_single_step(
FAPI_DBG("clear DBCR[8] IACE and DBCR[12:13] DACE");
FAPI_TRY(ppe_update_dbcr(i_target, i_base_address, ANDIS_CONST, 0x0F73, R31));
+ //Restore i_Rs and SPRG0 before single step
+ FAPI_DBG("Restore i_Rs");
+ l_data64.flush<0>().insertFromRight(ppe_getMfsprInstruction(i_Rs, SPRG0), 0, 32);
+ FAPI_DBG("getMfsprInstruction(R31, SPRG0): 0x%16llX", l_data64 );
+ l_data64.insertFromRight(l_gpr31_save, 32, 32);
+ FAPI_DBG("Final Instr + SPRG0: 0x%16llX", l_data64 );
+ //write sprg0 with address and ram mfsprg0 to i_Rs
+ FAPI_TRY(fapi2::putScom(i_target, i_base_address + PPE_XIRAMGA, l_data64 ));
+ FAPI_DBG("Restore SPRG0");
+ FAPI_TRY(ppe_pollHaltState(i_target, i_base_address));
+ FAPI_TRY(putScom(i_target, i_base_address + PPE_XIRAMDBG , l_sprg0_save), "Error in GETSCOM");
+
while(i_step_count != 0)
{
FAPI_DBG(" Send Single step command via XCR...step count = 0x%16llx", i_step_count);
@@ -576,6 +602,17 @@ fapi2::ReturnCode ppe_single_step(
FAPI_TRY(ppe_pollHaltState(i_target, i_base_address));
}
+ // Save SPRG0 i_Rs before getting dbcr
+ FAPI_DBG("Save SPRG0");
+ FAPI_TRY(getScom(i_target, i_base_address + PPE_XIRAMDBG, l_data64), "Error in GETSCOM");
+ l_data64.extractToRight(l_sprg0_save, 32, 32);
+ FAPI_DBG("Saved SPRG0 value : 0x%08llX", l_sprg0_save );
+ FAPI_DBG("Save i_Rs");
+ l_data64.flush<0>().insertFromRight(ppe_getMtsprInstruction(i_Rs, SPRG0), 0, 32);
+ FAPI_DBG("getMtsprInstruction(%d, SPRG0): 0x%16llX", R31, l_data64 );
+ FAPI_TRY(ppe_RAMRead(i_target, i_base_address, l_data64, l_gpr31_save));
+ FAPI_DBG("Saved GPR31 value : 0x%08llX", l_gpr31_save );
+
FAPI_INF(" Restore DBCR");
FAPI_INF(" Write orig. DBCR into SPRG0");
@@ -591,6 +628,18 @@ fapi2::ReturnCode ppe_single_step(
FAPI_DBG("getMtsprInstruction(%d, DBCR): 0x%16llX", i_Rs, l_data64 );
FAPI_TRY(fapi2::putScom(i_target, i_base_address + PPE_XIRAMEDR, l_data64));
+ //Restore i_Rs and SPRG0 after dbcr updates
+ FAPI_DBG("Restore i_Rs");
+ l_data64.flush<0>().insertFromRight(ppe_getMfsprInstruction(i_Rs, SPRG0), 0, 32);
+ FAPI_DBG("getMfsprInstruction(R31, SPRG0): 0x%16llX", l_data64 );
+ l_data64.insertFromRight(l_gpr31_save, 32, 32);
+ FAPI_DBG("Final Instr + SPRG0: 0x%16llX", l_data64 );
+ //write sprg0 with address and ram mfsprg0 to i_Rs
+ FAPI_TRY(fapi2::putScom(i_target, i_base_address + PPE_XIRAMGA, l_data64 ));
+ FAPI_DBG("Restore SPRG0");
+ FAPI_TRY(ppe_pollHaltState(i_target, i_base_address));
+ FAPI_TRY(putScom(i_target, i_base_address + PPE_XIRAMDBG , l_sprg0_save), "Error in GETSCOM");
+
fapi_try_exit:
return fapi2::current_err;
@@ -626,3 +675,163 @@ fapi2::ReturnCode ppe_regs_populate_name(
return fapi2::current_err;
}
+
+
+//-----------------------------------------------------------------------------
+
+/**
+ * @brief clear the dbg status engine
+ * @param[in] i_target target register number
+ * @return fapi2::ReturnCode
+ * @note programs XCR to clear dbg status.
+ */
+fapi2::ReturnCode ppe_clear_dbg(
+ const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ const uint64_t i_base_address)
+{
+ fapi2::buffer<uint64_t> l_data64;
+
+ FAPI_INF(" Clear debug status via XCR...");
+ l_data64.flush<0>();
+ FAPI_TRY(putScom(i_target, i_base_address + PPE_XIXCR, l_data64), "Error in PUTSCOM in XCR to clear dbg status");
+
+
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+//-----------------------------------------------------------------------------
+
+/**
+ * @brief toggle TRH
+ * @param[in] i_target target register number
+ * @return fapi2::ReturnCode
+ * @note programs XCR to toggle trh.
+ */
+fapi2::ReturnCode ppe_toggle_trh(
+ const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ const uint64_t i_base_address)
+{
+ fapi2::buffer<uint64_t> l_data64;
+
+ FAPI_INF(" Toggle TRH via XCR...");
+ l_data64.flush<0>().insertFromRight(4, 1, 3);
+ FAPI_TRY(putScom(i_target, i_base_address + PPE_XIXCR, l_data64), "Error in PUTSCOM in XCR to toggle TRH");
+
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+//-----------------------------------------------------------------------------
+
+/**
+ * @brief xcr soft reset
+ * @param[in] i_target target register number
+ * @return fapi2::ReturnCode
+ * @note programs XCR to give soft reset
+ */
+fapi2::ReturnCode ppe_soft_reset(
+ const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ const uint64_t i_base_address)
+{
+ fapi2::buffer<uint64_t> l_data64;
+
+ FAPI_INF(" Soft reset via XCR...");
+ l_data64.flush<0>().insertFromRight(5, 1, 3);
+ FAPI_TRY(putScom(i_target, i_base_address + PPE_XIXCR, l_data64), "Error in PUTSCOM in XCR to do soft reset");
+
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+//-----------------------------------------------------------------------------
+
+/**
+ * @brief xcr hard reset
+ * @param[in] i_target target register number
+ * @return fapi2::ReturnCode
+ * @note programs XCR to give hard reset
+ */
+fapi2::ReturnCode ppe_hard_reset(
+ const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ const uint64_t i_base_address)
+{
+ fapi2::buffer<uint64_t> l_data64;
+
+ FAPI_INF(" Hard reset via XCR...");
+ l_data64.flush<0>().insertFromRight(6, 1, 3);
+ FAPI_TRY(putScom(i_target, i_base_address + PPE_XIXCR, l_data64), "Error in PUTSCOM in XCR to do hard reset");
+
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+//-----------------------------------------------------------------------------
+
+/**
+ * @brief xcr resume only
+ * @param[in] i_target target register number
+ * @return fapi2::ReturnCode
+ * @note programs XCR to only resume
+ */
+fapi2::ReturnCode ppe_resume_only(
+ const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ const uint64_t i_base_address)
+{
+ fapi2::buffer<uint64_t> l_data64;
+
+ FAPI_INF(" Resume only through XCR...");
+ l_data64.flush<0>().insertFromRight(p9hcd::RESUME, 1, 3);
+ FAPI_TRY(putScom(i_target, i_base_address + PPE_XIXCR, l_data64), "Error in PUTSCOM in XCR only resume");
+
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+//-----------------------------------------------------------------------------
+
+/**
+ * @brief only single step the engine
+ * @param[in] i_target target register number
+ * @return fapi2::ReturnCode
+ * @note programs XCR with single step no clearing DBCR
+ */
+fapi2::ReturnCode ppe_ss_only(
+ const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ const uint64_t i_base_address,
+ uint64_t i_step_count)
+{
+ fapi2::buffer<uint64_t> l_data64;
+
+ FAPI_TRY(ppe_pollHaltState(i_target, i_base_address));
+
+
+ while(i_step_count != 0)
+ {
+ FAPI_DBG(" Send Single step command via XCR...step count = 0x%16llx", i_step_count);
+ l_data64.flush<0>().insertFromRight(p9hcd::SINGLE_STEP, 1, 3);
+ FAPI_TRY(putScom(i_target, i_base_address + PPE_XIXCR, l_data64),
+ "Error in PUTSCOM in XCR to generate Single Step condition");
+ --i_step_count; //Decrement step count
+ FAPI_TRY(ppe_pollHaltState(i_target, i_base_address));
+ }
+
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+//PPE write IAR
+fapi2::ReturnCode ppe_write_iar(
+ const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ const uint64_t i_base_address,
+ const uint64_t l_address
+)
+{
+
+ fapi2::buffer<uint64_t> temp_data64;
+ temp_data64.flush<0>().insertFromRight(l_address, 32, 32);
+ FAPI_DBG("IAR: 0x%16llX", temp_data64 );
+ FAPI_TRY(fapi2::putScom(i_target, i_base_address + PPE_XIDBGPRO, temp_data64));
+fapi_try_exit:
+ return fapi2::current_err;
+}
OpenPOWER on IntegriCloud