summaryrefslogtreecommitdiffstats
path: root/src/usr/diag/prdf/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/diag/prdf/common')
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/service/prdfPlatServices_common.C117
-rwxr-xr-xsrc/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H85
-rwxr-xr-xsrc/usr/diag/prdf/common/iipglobl.h1
3 files changed, 203 insertions, 0 deletions
diff --git a/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.C b/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.C
index fa8f56515..65a6f49d1 100755
--- a/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.C
+++ b/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.C
@@ -33,6 +33,7 @@
#include <prdfPlatServices.H>
#include <iipglobl.h>
+#include <prdfAssert.h>
#include <prdfTrace.H>
#include <dimmBadDqBitmapFuncs.H> // for dimm[S|G]etBadDqBitmap()
@@ -248,6 +249,122 @@ getDimmPlugCardType()
}
*/
+//##############################################################################
+//##
+//## Maintance command wrapper code
+//##
+//##############################################################################
+
+mss_MaintCmdWrapper::mss_MaintCmdWrapper( mss_MaintCmd * i_maintCmd ) :
+ iv_cmd(i_maintCmd)
+{}
+
+//------------------------------------------------------------------------------
+
+mss_MaintCmdWrapper::~mss_MaintCmdWrapper()
+{
+ delete iv_cmd;
+}
+
+//------------------------------------------------------------------------------
+
+int32_t mss_MaintCmdWrapper::stopCmd()
+{
+ PRDF_ASSERT( NULL != iv_cmd );
+ int32_t o_rc = SUCCESS;
+ fapi::ReturnCode l_rc = iv_cmd->stopCmd();
+
+ // convert FAPI RC to error handle
+ errlHndl_t err = fapi::fapiRcToErrl(l_rc);
+
+ if (NULL != err)
+ {
+ PRDF_GET_REASONCODE(err, o_rc);
+ PRDF_ERR( "mss_MaintCmdWrapper::stopCmd failed: [0x%X]", o_rc);
+ PRDF_COMMIT_ERRL( err, ERRL_ACTION_REPORT );
+ o_rc = FAIL;
+ }
+ return o_rc;
+}
+
+//------------------------------------------------------------------------------
+
+int32_t mss_MaintCmdWrapper::setupAndExecuteCmd()
+{
+ PRDF_ASSERT( NULL != iv_cmd );
+ int32_t o_rc = SUCCESS;
+ fapi::ReturnCode l_rc = iv_cmd->setupAndExecuteCmd();
+
+ // convert FAPI RC to error handle
+ errlHndl_t err = fapi::fapiRcToErrl(l_rc);
+
+ if (NULL != err)
+ {
+ PRDF_GET_REASONCODE(err, o_rc);
+ PRDF_ERR( "mss_MaintCmdWrapper::setupAndExecuteCmd "
+ "failed: [0x%X]", o_rc);
+ PRDF_COMMIT_ERRL( err, ERRL_ACTION_REPORT );
+ o_rc = FAIL;
+ }
+ return o_rc;
+}
+
+//------------------------------------------------------------------------------
+
+int32_t mss_MaintCmdWrapper::cleanupCmd()
+{
+ PRDF_ASSERT( NULL != iv_cmd );
+ int32_t o_rc = SUCCESS;
+ fapi::ReturnCode l_rc = iv_cmd->cleanupCmd();
+
+ // convert FAPI RC to error handle
+ errlHndl_t err = fapi::fapiRcToErrl(l_rc);
+
+ if (NULL != err)
+ {
+ PRDF_GET_REASONCODE(err, o_rc);
+ PRDF_ERR( "mss_MaintCmdWrapper::cleanupCmd failed: [0x%X]", o_rc);
+ PRDF_COMMIT_ERRL( err, ERRL_ACTION_REPORT );
+ o_rc = FAIL;
+ }
+ return o_rc;
+}
+
+//------------------------------------------------------------------------------
+
+mss_MaintCmdWrapper* createTimeBaseScrub (
+ const TARGETING::TargetHandle_t i_target,
+ uint64_t i_startAddr,
+ uint64_t i_endAddr,
+ bool i_isFastSpeed,
+ uint32_t i_stopCondition )
+{
+ ecmdDataBufferBase ecmdStartAddr(64);
+ ecmdDataBufferBase ecmdEndAddr(64);
+
+ mss_MaintCmd::TimeBaseSpeed cmdSpeed = mss_MaintCmd::SLOW_12H;
+
+ if (true == i_isFastSpeed)
+ {
+ cmdSpeed = mss_MaintCmd::FAST_AS_POSSIBLE;
+ }
+ // Fill up emd structures for maint cmd
+ ecmdStartAddr.setDoubleWord(0, i_startAddr);
+ ecmdEndAddr.setDoubleWord(0, i_endAddr);
+
+ mss_MaintCmd *cmd = new mss_TimeBaseScrub(
+ fapi::Target(fapi::TARGET_TYPE_MBA_CHIPLET,
+ i_target ),
+ ecmdStartAddr,
+ ecmdEndAddr,
+ cmdSpeed,
+ i_stopCondition,
+ false);
+ mss_MaintCmdWrapper *cmdWrapper = new mss_MaintCmdWrapper(cmd);
+ return cmdWrapper;
+
+}
+
} // end namespace PlatServices
} // end namespace PRDF
diff --git a/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H b/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H
index 5b8c1913a..010074595 100755
--- a/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H
+++ b/src/usr/diag/prdf/common/framework/service/prdfPlatServices_common.H
@@ -43,6 +43,8 @@
#include <dimmConsts.H> // for DIMM_DQ_RANK_BITMAP_SIZE
#include <fapiPlatHwpInvoker.H> // for fapi::fapiRcToErrl()
+class mss_MaintCmd;
+
#define PRD_FAPI_TO_ERRL(ERRHNDL, FUNC, _args_...) \
{ \
fapi::ReturnCode l_rc = FUNC(_args_); \
@@ -209,6 +211,89 @@ getMembufRawCardType( TARGETING::TargetHandle_t i_memTarget );
getDimmPlugCardType( TARGETING::TargetHandle_t i_dimmTarget );
*/
+//##############################################################################
+//##
+//## Maintance command wrapper code
+//##
+//##############################################################################
+
+/**
+ * @brief This is a wrapper class for underlying maintainance class object
+ *
+ * By this class, we will hide underlying maintainance class dependency
+ * from rest of code. All public function mss_MaintCmd used by prd should
+ * be defined here also.
+ */
+
+class mss_MaintCmdWrapper
+{
+
+ public: //function
+
+ /**
+ * @brief Constructor
+ *
+ * @param i_maintCmd Underlying maintainance command object
+ */
+ mss_MaintCmdWrapper( mss_MaintCmd * i_maintCmd );
+
+ /**
+ * @brief Destructor
+ */
+ virtual ~mss_MaintCmdWrapper();
+
+
+ /**
+ * @brief Stops running maint cmd, and saves the address it stopped at.
+ * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
+ */
+ int32_t stopCmd();
+
+
+ /**
+ * @brief Saves any settings that need to be restored when command is done.
+ * Loads the setup parameters into the hardware. Starts the command,
+ * then either polls for complete or exits with command running.
+ * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
+ */
+ int32_t setupAndExecuteCmd();
+
+ /**
+ * @brief Called once a command is done if we need to restore settings that
+ * had to be modified to run a specific command type, or clear error
+ * data in the hw that is no longer relevant.
+ * @return Non-SUCCESS if an internal function fails, SUCCESS otherwise.
+ */
+ int32_t cleanupCmd();
+
+ protected:
+
+ // Underlying maintainance command object pointer
+ mss_MaintCmd * iv_cmd;
+
+}; // class mss_MaintCmdWrapper
+
+/**
+ * @brief Create Time base scrub object, wrap i around mss_MaintCmdWrapper
+ * object
+ * @param i_target MBA target
+ * @param i_startAddr Start address for scrubbing
+ * @param i_endAddr End address for scrubbing
+ * @param i_isFastSpeed (false = slow (12 H) , true = fast)
+ * @param i_stopCondition bit mask for conditions on which scrubbing should
+ * stop
+ * @return mss_MaintCmdWrapper object
+ * @note This function allocates memory on heap for mss_MaintCmdWrapper
+ * object. Its caller responsibilty to delete this object.
+ */
+mss_MaintCmdWrapper * createTimeBaseScrub (
+ const TARGETING::TargetHandle_t i_target,
+ uint64_t i_startAddr,
+ uint64_t i_endAddr,
+ bool i_isFastSpeed,
+ uint32_t i_stopCondition );
+
+
} // end namespace PlatServices
} // end namespace PRDF
diff --git a/src/usr/diag/prdf/common/iipglobl.h b/src/usr/diag/prdf/common/iipglobl.h
index d21d49a5a..d92c6ec69 100755
--- a/src/usr/diag/prdf/common/iipglobl.h
+++ b/src/usr/diag/prdf/common/iipglobl.h
@@ -44,6 +44,7 @@
#include <errlentry.H>
#include <hwsvSvrErrl.H>
#include <utilsingleton.H>
+ #include <srcisrc.H>
// FIXME: uncomment dump include when Adriana's fix is in
//#include <dumpHWURequest_applet.H>
#endif
OpenPOWER on IntegriCloud