summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/cache
diff options
context:
space:
mode:
authorChen Qian <qianqc@cn.ibm.com>2017-03-30 04:27:44 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2017-05-24 22:36:09 -0400
commit071e5f08a8c3402d7e464406dcbb81998dd99f64 (patch)
tree8b9047d5efc6c3e2891cedd74403448977b072ff /src/import/chips/p9/procedures/hwp/cache
parent7738208e04ad42fd8f9e5d4e3e51d8f27eb4c95f (diff)
downloadtalos-hostboot-071e5f08a8c3402d7e464406dcbb81998dd99f64.tar.gz
talos-hostboot-071e5f08a8c3402d7e464406dcbb81998dd99f64.zip
P9 L2err line delete HWP
--- fix bugs April 25th, 2017--- Add the busy bit poll after writing the PRD Purge Engine Command Register ----------------------------------------- 1) Add the trigger(bit0) value and type(bit1:4) value of PRD Purge Engine Command Register wrriten actions which is missed in the previous HWP. 2) Take the reg_busy(bit9) into consideration. The purge engine command register is set only when reg_busy is 0. 3) When executing the line delete procedure, if the reg_busy is non-zero, we wait for 10ms and poll reg_busy again for a maximum count of 100. 4) Fix a bug for restart trace array option. 5) Report no error found if the start header is reached during the trace array searching. Change-Id: I716601a68b5f8c3458e3085cc99a84fbee6f8c7b Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/38616 Reviewed-by: Peng Fei Gou <shgoupf@cn.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Joseph J. McGill <jmcgill@us.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/40876 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/import/chips/p9/procedures/hwp/cache')
-rw-r--r--src/import/chips/p9/procedures/hwp/cache/p9_l2err_extract.C11
-rw-r--r--src/import/chips/p9/procedures/hwp/cache/p9_l2err_linedelete.C113
-rw-r--r--src/import/chips/p9/procedures/hwp/cache/p9_l2err_linedelete.H6
3 files changed, 118 insertions, 12 deletions
diff --git a/src/import/chips/p9/procedures/hwp/cache/p9_l2err_extract.C b/src/import/chips/p9/procedures/hwp/cache/p9_l2err_extract.C
index d3b9ab6d7..68370f008 100644
--- a/src/import/chips/p9/procedures/hwp/cache/p9_l2err_extract.C
+++ b/src/import/chips/p9/procedures/hwp/cache/p9_l2err_extract.C
@@ -205,6 +205,17 @@ extern "C"
{
trace_index--;
+ if (p9_tracearray_is_trace_start_marker(trace_array[trace_index]) == fapi2::FAPI2_RC_SUCCESS)
+ {
+
+ FAPI_DBG("Head found at trace index %i, no error is found!", trace_index);
+ FAPI_DBG("%2X: 0x%016llX%016llX", trace_index, trace_array[trace_index].get<uint64_t>( 0 ),
+ trace_array[trace_index].get<uint64_t>( 1 ));
+ error_found = false;
+ ce_ue = true;
+ break;
+ }
+
//Only look at data entries (ie ignore compression entries for now)
if( !trace_array[trace_index].isBitClear( 88, 7 ) )
{
diff --git a/src/import/chips/p9/procedures/hwp/cache/p9_l2err_linedelete.C b/src/import/chips/p9/procedures/hwp/cache/p9_l2err_linedelete.C
index 8296ded16..520d0a51a 100644
--- a/src/import/chips/p9/procedures/hwp/cache/p9_l2err_linedelete.C
+++ b/src/import/chips/p9/procedures/hwp/cache/p9_l2err_linedelete.C
@@ -43,6 +43,8 @@
//------------------------------------------------------------------------------
// Constant definitions
//------------------------------------------------------------------------------
+const uint32_t BUSY_POLL_DELAY_IN_NS = 10000000; // 10ms
+const uint32_t BUSY_POLL_DELAY_IN_CYCLES = 20000000; // 10ms, assumming 2GHz
extern "C"
{
@@ -55,15 +57,21 @@ extern "C"
// HWP entry point
//------------------------------------------------------------------------------
fapi2::ReturnCode p9_l2err_linedelete(const fapi2::Target<fapi2::TARGET_TYPE_EX>& i_target,
- const p9_l2err_extract_err_data& i_err_data)
+ const p9_l2err_extract_err_data& i_err_data,
+ const uint64_t p9_l2err_linedelete_TryBusyCounts)
{
+
uint8_t member = 0;
uint8_t bank = 0;
uint16_t cgc = 0;
+ uint64_t busy_reg_counter = 0;
fapi2::buffer<uint64_t> l_l2_l2cerrs_prd_purge_cmd_reg;
+ bool reg_busy = 0;
+ bool prd_purge_busy = 1;
+
// mark function entry
FAPI_DBG("Entering p9_l2err_linedelete...");
@@ -87,6 +95,7 @@ extern "C"
// |29:30 | Don't care |
// +------+--------------------+
+
member = i_err_data.member;
bank = i_err_data.bank;
cgc = i_err_data.address;
@@ -98,17 +107,101 @@ extern "C"
// bits 17:19 is the member
// bits 20:27 is the cgc address
// bit 28 is the bank
- FAPI_TRY(fapi2::getScom(i_target, EX_PRD_PURGE_CMD_REG, l_l2_l2cerrs_prd_purge_cmd_reg),
- "Error from getScom (l_l2_l2cerrs_prd_purge_cmd_reg)");
- FAPI_DBG("l_l2_l2cerrs_prd_purge_cmd_reg_data: %#lx", l_l2_l2cerrs_prd_purge_cmd_reg);
- l_l2_l2cerrs_prd_purge_cmd_reg.insertFromRight<EX_PRD_PURGE_CMD_REG_MEM, EX_PRD_PURGE_CMD_REG_MEM_LEN>(member);
- l_l2_l2cerrs_prd_purge_cmd_reg.insertFromRight<EX_PRD_PURGE_CMD_REG_CGC, EX_PRD_PURGE_CMD_REG_CGC_LEN>(cgc);
- l_l2_l2cerrs_prd_purge_cmd_reg.insertFromRight<EX_PRD_PURGE_CMD_REG_BANK, 1>(bank);
- FAPI_DBG("l_l2_l2cerrs_prd_purge_cmd_reg_data: %#lx", l_l2_l2cerrs_prd_purge_cmd_reg);
- FAPI_TRY(fapi2::putScom(i_target, EX_PRD_PURGE_CMD_REG, l_l2_l2cerrs_prd_purge_cmd_reg),
- "Error from putScom (l_l2_l2cerrs_prd_purge_cmd_reg)");
+ FAPI_DBG("p9_l2err_linedelete_TryBusyCounts: %ld", p9_l2err_linedelete_TryBusyCounts);
+
+ // wait reg_busy bit for a max counter time which is defined by user
+ do
+ {
+ FAPI_TRY(fapi2::getScom(i_target, EX_PRD_PURGE_CMD_REG, l_l2_l2cerrs_prd_purge_cmd_reg),
+ "Error from getScom (l_l2_l2cerrs_prd_purge_cmd_reg)");
+ FAPI_DBG("l_l2_l2cerrs_prd_purge_cmd_reg_data: %#lx", l_l2_l2cerrs_prd_purge_cmd_reg);
+
+ // get the reg_busy bit from scom register
+ l_l2_l2cerrs_prd_purge_cmd_reg.extractToRight<EX_PRD_PURGE_CMD_REG_BUSY, 1>(reg_busy);
+
+ if (reg_busy == 0)
+ {
+ prd_purge_busy = 0;
+ break;
+ }
+ else
+ {
+ busy_reg_counter = busy_reg_counter + 1;
+ FAPI_DBG("reg_busy = %u, wait for 10ms and try again, remaining cout: %u!",
+ reg_busy, busy_reg_counter);
+ // Delay for 10ms
+ fapi2::delay(BUSY_POLL_DELAY_IN_NS, BUSY_POLL_DELAY_IN_CYCLES);
+ }
+ }
+ while (busy_reg_counter < p9_l2err_linedelete_TryBusyCounts);
+
+
+ // if the reg_busy is still 1 during the counter time
+ // error occurs
+ FAPI_ASSERT(!prd_purge_busy,
+ fapi2::P9_L2ERR_LINE_DELETE_REG_BUSY().
+ set_TARGET(i_target),
+ "Error: PRD_PURGE_CMD_REG_BUSY indicats the ie completion bit was not set yet.");
+
+ FAPI_DBG("reg_busy = %u", reg_busy);
+
+
+ // if reg_busy is 0
+ // write trigger, type, cgc address and bank into PRD Purge Engine Command Register
+ if (reg_busy == 0)
+ {
+
+ l_l2_l2cerrs_prd_purge_cmd_reg.insertFromRight<EX_PRD_PURGE_CMD_REG_MEM, EX_PRD_PURGE_CMD_REG_MEM_LEN>(member);
+ l_l2_l2cerrs_prd_purge_cmd_reg.insertFromRight<EX_PRD_PURGE_CMD_REG_CGC, EX_PRD_PURGE_CMD_REG_CGC_LEN>(cgc);
+ l_l2_l2cerrs_prd_purge_cmd_reg.insertFromRight<EX_PRD_PURGE_CMD_REG_BANK, 1>(bank);
+
+ l_l2_l2cerrs_prd_purge_cmd_reg.insertFromRight<EX_PRD_PURGE_CMD_REG_TRIGGER, 1>(1);
+ l_l2_l2cerrs_prd_purge_cmd_reg.insertFromRight<EX_PRD_PURGE_CMD_REG_TYPE, EX_PRD_PURGE_CMD_REG_TYPE_LEN>(0x2);
+
+ FAPI_DBG("l_l2_l2cerrs_prd_purge_cmd_reg_data: %#lx", l_l2_l2cerrs_prd_purge_cmd_reg);
+ FAPI_TRY(fapi2::putScom(i_target, EX_PRD_PURGE_CMD_REG, l_l2_l2cerrs_prd_purge_cmd_reg),
+ "Error from putScom (l_l2_l2cerrs_prd_purge_cmd_reg)");
+
+ // poll the busy bit again to ensure the purge completed
+ do
+ {
+ FAPI_TRY(fapi2::getScom(i_target, EX_PRD_PURGE_CMD_REG, l_l2_l2cerrs_prd_purge_cmd_reg),
+ "Error from getScom (l_l2_l2cerrs_prd_purge_cmd_reg)");
+ FAPI_DBG("l_l2_l2cerrs_prd_purge_cmd_reg_data: %#lx", l_l2_l2cerrs_prd_purge_cmd_reg);
+
+ // get the reg_busy bit from scom register
+ l_l2_l2cerrs_prd_purge_cmd_reg.extractToRight<EX_PRD_PURGE_CMD_REG_BUSY, 1>(reg_busy);
+
+ if (reg_busy == 0)
+ {
+ prd_purge_busy = 0;
+ break;
+ }
+ else
+ {
+ busy_reg_counter = busy_reg_counter + 1;
+ FAPI_DBG("reg_busy = %u, wait for 10ms and try again, remaining cout: %u!",
+ reg_busy, busy_reg_counter);
+ // Delay for 10ms
+ fapi2::delay(BUSY_POLL_DELAY_IN_NS, BUSY_POLL_DELAY_IN_CYCLES);
+ }
+ }
+ while (busy_reg_counter < p9_l2err_linedelete_TryBusyCounts);
+
+ // if the reg_busy is still 1 during the counter time
+ // error occurs
+ FAPI_ASSERT(!prd_purge_busy,
+ fapi2::P9_L2ERR_LINE_DELETE_REG_BUSY().
+ set_TARGET(i_target),
+ "Error: PRD_PURGE_CMD_REG_BUSY indicats the ie completion bit was not set yet, the PRD Purge Engine Command Register written failed.");
+
+ FAPI_DBG("Writing PRD Purge Engine Command Register busy bit status, reg_busy = %u", reg_busy);
+ //poll the busy bit completed
+
+
+ }
// mark HWP exit
fapi_try_exit:
diff --git a/src/import/chips/p9/procedures/hwp/cache/p9_l2err_linedelete.H b/src/import/chips/p9/procedures/hwp/cache/p9_l2err_linedelete.H
index eba56a40d..f6ef3071b 100644
--- a/src/import/chips/p9/procedures/hwp/cache/p9_l2err_linedelete.H
+++ b/src/import/chips/p9/procedures/hwp/cache/p9_l2err_linedelete.H
@@ -59,7 +59,8 @@
// function pointer typedef definition for HWP call support
typedef fapi2::ReturnCode
(*p9_l2err_linedelete_FP_t) (const fapi2::Target<fapi2::TARGET_TYPE_EX>&,
- const p9_l2err_extract_err_data& );
+ const p9_l2err_extract_err_data&,
+ const uint64_t p9_l2err_linedelete_TryBusyCounts);
extern "C"
{
@@ -67,7 +68,8 @@ extern "C"
fapi2::ReturnCode p9_l2err_linedelete(const fapi2::Target<fapi2::TARGET_TYPE_EX>& i_target,
- const p9_l2err_extract_err_data& i_err_data);
+ const p9_l2err_extract_err_data& i_err_data,
+ const uint64_t p9_l2err_linedelete_TryBusyCounts);
} // extern "C"
OpenPOWER on IntegriCloud