diff options
author | Chen Qian <qianqc@cn.ibm.com> | 2017-03-30 04:27:44 -0500 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2017-05-24 22:36:09 -0400 |
commit | 071e5f08a8c3402d7e464406dcbb81998dd99f64 (patch) | |
tree | 8b9047d5efc6c3e2891cedd74403448977b072ff /src/import/chips/p9/procedures/hwp/cache | |
parent | 7738208e04ad42fd8f9e5d4e3e51d8f27eb4c95f (diff) | |
download | talos-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')
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" |