summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/cache
diff options
context:
space:
mode:
authorThi Tran <thi@us.ibm.com>2017-09-18 14:19:02 -0500
committerChristian R. Geddes <crgeddes@us.ibm.com>2017-10-11 17:43:04 -0400
commite1ea4c3922ff7298fdf8858768aea27527a30cb9 (patch)
tree329eac2ba0e0a65d1ff2c9e6db397176f2113ecc /src/import/chips/p9/procedures/hwp/cache
parent6be06fc2818d424dc2de77592700e31e71d00bff (diff)
downloadtalos-hostboot-e1ea4c3922ff7298fdf8858768aea27527a30cb9.tar.gz
talos-hostboot-e1ea4c3922ff7298fdf8858768aea27527a30cb9.zip
Share common code between p9_l2_flush and p9_l2err_linedelete
Change-Id: I547078b1e0fc7adec767402faf5e64e4b4390bc9 RTC: 178071 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/46359 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: HWSV CI <hwsv-ci+hostboot@us.ibm.com> Tested-by: PPE CI <ppe-ci+hostboot@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: Joseph J. McGill <jmcgill@us.ibm.com> Reviewed-by: Benjamin Gass <bgass@us.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/46386 Reviewed-by: Hostboot Team <hostboot@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Reviewed-by: Christian R. Geddes <crgeddes@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_linedelete.C118
-rw-r--r--src/import/chips/p9/procedures/hwp/cache/p9_l2err_linedelete.H4
-rw-r--r--src/import/chips/p9/procedures/hwp/cache/p9_l2err_linedelete.mk3
3 files changed, 19 insertions, 106 deletions
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 cbed86c4b..8ef374e75 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
@@ -42,91 +42,26 @@
// Includes
//------------------------------------------------------------------------------
#include <p9_l2err_linedelete.H>
+#include <p9_l2_flush.H>
#include <p9_quad_scom_addresses.H>
#include <p9_quad_scom_addresses_fld.H>
//------------------------------------------------------------------------------
-// Constant definitions
-//------------------------------------------------------------------------------
-const uint32_t BUSY_POLL_DELAY_IN_NS = 10000000; // 10ms
-const uint32_t BUSY_POLL_DELAY_IN_CYCLES = 20000000; // 10ms, assumming 2GHz
-
-//------------------------------------------------------------------------------
// Function definitions
//------------------------------------------------------------------------------
-///
-/// @brief Utility function to check for a purge operation to be completed.
-/// This function polls the EX_PRD_PURGE_CMD_REG_BUSY bit of
-/// EX_PRD_PURGE_CMD_REG.
-/// - If this bit is clear before the input loop threshold is
-/// reached, it returns FAPi2_RC_SUCCESS.
-/// - Otherwise, it returns an error code.
-///
-/// @param[in] i_target => EX chiplet target
-/// @param[in] i_busyCount => Max busy count waiting for PURGE to complete.
-/// @param[out] o_prdPurgeCmdReg => EX_PRD_PURGE_CMD_REG value.
-///
-fapi2::ReturnCode purgeCompleteCheck(
- const fapi2::Target<fapi2::TARGET_TYPE_EX>& i_target,
- const uint64_t i_busyCount,
- fapi2::buffer<uint64_t>& o_prdPurgeCmdReg)
-{
- FAPI_DBG("Entering purgeCompleteCheck");
-
- // Wait EX_PRD_PURGE_CMD_REG_BUSY bit for a max input counter time
- uint64_t l_loopCount = 0;
-
- do
- {
- FAPI_TRY(fapi2::getScom(i_target, EX_PRD_PURGE_CMD_REG, o_prdPurgeCmdReg),
- "Error from getScom EX_PRD_PURGE_CMD_REG");
-
- // Check the EX_PRD_PURGE_CMD_REG_BUSY bit from scom register
- if ( !o_prdPurgeCmdReg.getBit(EX_PRD_PURGE_CMD_REG_BUSY) )
- {
- // PURGE is done, get out
- break;
- }
- else
- {
- l_loopCount++;
- // Delay for 10ms
- FAPI_TRY(fapi2::delay(BUSY_POLL_DELAY_IN_NS,
- BUSY_POLL_DELAY_IN_CYCLES),
- "Fapi Delay call failed.");
- }
- }
- while (l_loopCount < i_busyCount);
-
- // Error out if still busy
- FAPI_ASSERT(l_loopCount < i_busyCount,
- fapi2::P9_L2ERR_LINE_DELETE_REG_BUSY()
- .set_TARGET(i_target)
- .set_COUNT_THRESHOLD(i_busyCount)
- .set_PRD_PURGE_CMD_REG(o_prdPurgeCmdReg),
- "Error: PRD_PURGE_CMD_REG_BUSY exceeds limit count of %d.",
- i_busyCount);
-
-fapi_try_exit:
- FAPI_DBG("Exiting purgeCompleteCheck - Counter: %d; prdPurgeCmdReg: 0x%.16llX",
- l_loopCount, o_prdPurgeCmdReg);
- return fapi2::current_err;
-}
-
//------------------------------------------------------------------------------
// HWP entry point
//------------------------------------------------------------------------------
// See doxygen in header file
-// TODO: RTC 178071
-// See if with some small refactoring we could just call/share the p9_l2_flush
-// HWP code/errors to implement this routine?
fapi2::ReturnCode p9_l2err_linedelete(
const fapi2::Target<fapi2::TARGET_TYPE_EX>& i_target,
const p9_l2err_extract_err_data& i_err_data,
const uint64_t i_busyCount)
{
- fapi2::buffer<uint64_t> l_l2_l2cerrs_prd_purge_cmd_reg;
+ fapi2::ReturnCode l_rc;
+ fapi2::buffer<uint64_t> l_cmdReg;
+ p9core::purgeData_t l_purgeData;
// mark function entry
FAPI_DBG("Entering p9_l2err_linedelete. BusyCount %d", i_busyCount);
@@ -159,41 +94,22 @@ fapi2::ReturnCode p9_l2err_linedelete(
// bits 20:27 is the cgc address
// bit 28 is the bank
- // Make sure there's no current purge is in progress
- FAPI_TRY(purgeCompleteCheck(i_target, i_busyCount,
- l_l2_l2cerrs_prd_purge_cmd_reg),
- "Error returned from purgeCompleteCheck()");
- FAPI_DBG("l_l2_l2cerrs_prd_purge_cmd_reg_data: 0x%.16llX",
- l_l2_l2cerrs_prd_purge_cmd_reg);
-
- // write trigger, type, cgc address and bank into PRD Purge Engine Command Register
- l_l2_l2cerrs_prd_purge_cmd_reg.insertFromRight
- <EX_PRD_PURGE_CMD_REG_MEM, EX_PRD_PURGE_CMD_REG_MEM_LEN>
- (i_err_data.member);
- l_l2_l2cerrs_prd_purge_cmd_reg.insertFromRight
- <EX_PRD_PURGE_CMD_REG_CGC, EX_PRD_PURGE_CMD_REG_CGC_LEN>
- (i_err_data.address);
- l_l2_l2cerrs_prd_purge_cmd_reg.insertFromRight
- <EX_PRD_PURGE_CMD_REG_BANK, 1>(i_err_data.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);
+ // Ensure that purge engine is idle before starting line delete
+ FAPI_TRY(purgeCompleteCheck(i_target, i_busyCount, l_cmdReg),
+ "Error returned from purgeCompleteCheck call");
- 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 EX_PRD_PURGE_CMD_REG");
+ // Set PRD Purge Engine Command register values for line delete
+ l_purgeData.iv_cmdType = 0b0010; // L2 Dir Line_Delete
+ l_purgeData.iv_cmdMem = i_err_data.member;
+ l_purgeData.iv_cmdBank = i_err_data.bank;
+ l_purgeData.iv_cmdCGC = i_err_data.address;
+ FAPI_TRY(setupAndTriggerPrdPurge(i_target, l_purgeData, l_cmdReg),
+ "Error returned from setupAndTriggerPrdPurge");
- // Verify purge operation is complete
- FAPI_TRY(purgeCompleteCheck(i_target, i_busyCount,
- l_l2_l2cerrs_prd_purge_cmd_reg),
- "Error returned from purgeCompleteCheck()");
- FAPI_DBG("l_l2_l2cerrs_prd_purge_cmd_reg_data: 0x%.16llX",
- l_l2_l2cerrs_prd_purge_cmd_reg);
+ // Verify purge/line delete complete
+ FAPI_TRY(purgeCompleteCheck(i_target, i_busyCount, l_cmdReg),
+ "Error returned from purgeCompleteCheck call");
fapi_try_exit:
FAPI_INF("Exiting p9_l2err_linedelete...");
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 64550e7c0..274428471 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
@@ -56,10 +56,6 @@
#include <fapi2.H>
#include <p9_l2err_extract.H>
-//------------------------------------------------------------------------------
-// Structure definitions
-//------------------------------------------------------------------------------
-
// function pointer typedef definition for HWP call support
typedef fapi2::ReturnCode (*p9_l2err_linedelete_FP_t)
(const fapi2::Target<fapi2::TARGET_TYPE_EX>&,
diff --git a/src/import/chips/p9/procedures/hwp/cache/p9_l2err_linedelete.mk b/src/import/chips/p9/procedures/hwp/cache/p9_l2err_linedelete.mk
index d53c9a751..734beae00 100644
--- a/src/import/chips/p9/procedures/hwp/cache/p9_l2err_linedelete.mk
+++ b/src/import/chips/p9/procedures/hwp/cache/p9_l2err_linedelete.mk
@@ -23,5 +23,6 @@
#
# IBM_PROLOG_END_TAG
PROCEDURE=p9_l2err_linedelete
+$(call ADD_MODULE_INCDIR,$(PROCEDURE),$(ROOTPATH)/chips/p9/procedures/hwp/nest)
+lib$(PROCEDURE)_DEPLIBS+=p9_l2_flush
$(call BUILD_PROCEDURE)
-
OpenPOWER on IntegriCloud