diff options
Diffstat (limited to 'src/usr/diag/prdf/common')
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 |