Skip to content

Commit

Permalink
Added error checking and handling to nvdimm ipl
Browse files Browse the repository at this point in the history
Change-Id: I153cf39cc674b49441b5f41f7b96cd667b2a265b
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/77543
Tested-by: Jenkins Server <pfd-jenkins+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>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Matt Derksen <mderkse1@us.ibm.com>
Reviewed-by: TSUNG K YEUNG <tyeung@us.ibm.com>
Reviewed-by: Daniel M Crowell <dcrowell@us.ibm.com>
  • Loading branch information
Matthickman14 authored and dcrowell77 committed Aug 19, 2019
1 parent f691dc2 commit d577988
Show file tree
Hide file tree
Showing 14 changed files with 2,425 additions and 259 deletions.
24 changes: 13 additions & 11 deletions src/include/usr/isteps/nvdimm/nvdimm.H
Expand Up @@ -29,17 +29,18 @@

namespace NVDIMM
{

enum nvdimm_err_status
{
NSTD_VAL_NOPRSV = 0x08, // memory valid, contents not preserved (genesis)
NSTD_VAL_NOPRSV_MASK = 0xF7,
NSTD_VAL_PRSV = 0x04, // memory contents preserved
NSTD_VAL_PRSV_MASK = 0xFB,
NSTD_ERR_NOPRSV = 0x02, // memory failed to preserve contents
NSTD_ERR_NOPRSV_MASK = 0xFD,
NSTD_ERR_NOBKUP = 0x01, // memory unable to preserve future content
NSTD_ERR_NOBKUP_MASK = 0xFE,
NSTD_ERR = 0x03, // NSTD_ERR_NOPRSV+NSTD_ERR_NOBKUP
NSTD_VAL_ERASED = 0x08, // Image erased, SCM device contents not persisted
NSTD_VAL_ERASED_MASK = 0xF7,
NSTD_VAL_ERROR = 0x04, // Valid image successfully restored, SCM persisted
NSTD_VAL_ERROR_MASK = 0xFB,
NSTD_VAL_SR_FAILED = 0x02, // Save/Restore failed to persist memory contents
NSTD_VAL_SR_FAILED_MASK = 0xFD,
NSTD_VAL_DISARMED = 0x01, // memory unable to preserve future content
NSTD_VAL_DISARMED_MASK = 0xFE,
NSTD_ERR = 0x03, // NSTD_ERR_NOPRSV+NSTD_ERR_NOBKUP
};

#ifndef __HOSTBOOT_RUNTIME
Expand All @@ -54,7 +55,7 @@ enum nvdimm_err_status
* @param[in] i_nvdimmList - list of nvdimm targets
*
**/
void nvdimm_restore(TARGETING::TargetHandleList &i_nvdimmList);
errlHndl_t nvdimm_restore(TARGETING::TargetHandleList &i_nvdimmList);


/**
Expand Down Expand Up @@ -273,7 +274,8 @@ errlHndl_t notifyNvdimmProtectionChange(TARGETING::Target* i_target,
* - Disarms the trigger for draminit
* @param i_target nvdimm target
*/
void nvdimm_init(TARGETING::Target *i_nvdimm);
errlHndl_t nvdimm_init(TARGETING::Target *i_nvdimm);

}

#endif // NVDIMM_EXT_H__
Expand Down
55 changes: 40 additions & 15 deletions src/include/usr/isteps/nvdimm/nvdimmreasoncodes.H
Expand Up @@ -99,6 +99,10 @@ enum nvdimmModuleId
SEND_ATTR_NVDIMM_ARMED = 0x31,
NVDIMM_FACTORY_RESET = 0x32,
NVDIMM_HEALTH_CHECK = 0x33,
NVDIMM_CHECK_RESETN = 0x34,
NVDIMM_CHECK_CSAVE = 0x35,
NVDIMM_MODULE_HEALTH_STATUS_CHECK = 0x36,
NVDIMM_SET_EVENT_NOTIFICATION = 0x37,
};

/**
Expand Down Expand Up @@ -151,27 +155,48 @@ enum nvdimmReasonCode
NVDIMM_UPDATE_NOT_SUPPORTED = NVDIMM_COMP_ID | 0x27, // NV controller cannot be updated
NVDIMM_START_UPDATE = NVDIMM_COMP_ID | 0x28, // start update
NVDIMM_UPDATE_COMPLETE = NVDIMM_COMP_ID | 0x29, // update completed
NVDIMM_TPM_NOT_FOUND = NVDIMM_COMP_ID | 0x30, // TPM not found
NVDIMM_VERIF_BYTE_CHECK_FAILED = NVDIMM_COMP_ID | 0x31, // Encryption key reg verif failed
NVDIMM_ENCRYPTION_ENABLE_FAILED = NVDIMM_COMP_ID | 0x32, // Encryption enable failed
NVDIMM_ENCRYPTION_ERASE_PENDING_FAILED = NVDIMM_COMP_ID | 0x32, // Encryption crypto erase pending failed
NVDIMM_ENCRYPTION_ERASE_FAILED = NVDIMM_COMP_ID | 0x33, // Encryption crypto erase failed
NVDIMM_ENCRYPTION_UNLOCK_FAILED = NVDIMM_COMP_ID | 0x34, // Encryption unlock failed
NVDIMM_ENCRYPTION_INVALID_ATTRIBUTE = NVDIMM_COMP_ID | 0x35, // Encryption attribute key data invalid
NVDIMM_ENCRYPTION_KEY_ATTRS_INVALID = NVDIMM_COMP_ID | 0x36, // Encryption key attributes are both invalid
NVDIMM_ENCRYPTION_MAX_DARN_ERRORS = NVDIMM_COMP_ID | 0x37, // Darn random key gen reached max errors
NVDIMM_ENCRYPTION_BAD_RANDOM_DATA = NVDIMM_COMP_ID | 0x38, // Generated key data not valid
NVDIMM_CANNOT_MAKE_ATTRIBUTE = NVDIMM_COMP_ID | 0x39, // Cannot make Attribute
NVDIMM_HEALTH_CHECK_IN_PROGRESS_FAILURE = NVDIMM_COMP_ID | 0x3A, // !< pertains to ES_CMD_STATUS0[0]; the health check in progress flag
NVDIMM_HEALTH_CHECK_REPORTED_FAILURE = NVDIMM_COMP_ID | 0x3B, // !< pertains to ES_CMD_STATUS0[2]; the health check reported a failure flag
NVDIMM_LIFETIME_MIN_REQ_NOT_MET = NVDIMM_COMP_ID | 0x3C, // !< pertains to ES_LIFETIME; BPM does not meet minimum requirement for a new BPM
NVDIMM_HEALTH_CHECK_NEVER_INITIATED = NVDIMM_COMP_ID | 0x3D, // !< A health check was never initiated at start of IPL
NVDIMM_TPM_NOT_FOUND = NVDIMM_COMP_ID | 0x2A, // TPM not found
NVDIMM_POWER_SAVE_FAILURE = NVDIMM_COMP_ID | 0x2B, // Save failed due to power loss
NVDIMM_CSAVE_ERROR = NVDIMM_COMP_ID | 0x2C, // CSave failed due to error
NVDIMM_VOLTAGE_REGULATOR_FAILED = NVDIMM_COMP_ID | 0x2D,
NVDIMM_VDD_LOST = NVDIMM_COMP_ID | 0x2E,
NVDIMM_VPP_LOST = NVDIMM_COMP_ID | 0x2F,
NVDIMM_VTT_LOST = NVDIMM_COMP_ID | 0x30,
NVDIMM_DRAM_NOT_SELF_REFRESH = NVDIMM_COMP_ID | 0x31,
NVDIMM_CONTROLLER_HARDWARE_ERROR = NVDIMM_COMP_ID | 0x32,
NVDIMM_NVM_CONTROLLER_ERROR = NVDIMM_COMP_ID | 0x33,
NVDIMM_NVM_LIFETIME_ERROR = NVDIMM_COMP_ID | 0x34,
NVDIMM_NOT_ENOUGH_ENERGY_FOR_CSAVE = NVDIMM_COMP_ID | 0x35,
NVDIMM_INVALID_FIRMWARE_ERROR = NVDIMM_COMP_ID | 0x36, // Module Health Status Registers
NVDIMM_CONFIG_DATA_ERROR = NVDIMM_COMP_ID | 0x37,
NVDIMM_NO_ES_PRESENT = NVDIMM_COMP_ID | 0x38,
NVDIMM_ES_POLICY_NOT_SET = NVDIMM_COMP_ID | 0x39,
NVDIMM_ES_HARDWARE_FAILURE = NVDIMM_COMP_ID | 0x3A,
NVDIMM_ES_HEALTH_ASSESSMENT_ERROR = NVDIMM_COMP_ID | 0x3B,
NVDIMM_ES_LIFETIME_ERROR = NVDIMM_COMP_ID | 0x3C,
NVDIMM_ES_TEMP_ERROR = NVDIMM_COMP_ID | 0x3D,
NVDIMM_SET_EVENT_NOTIFICATION_ERROR = NVDIMM_COMP_ID | 0x3E,
NVDIMM_VERIF_BYTE_CHECK_FAILED = NVDIMM_COMP_ID | 0x3F, // Encryption key reg verif failed
NVDIMM_ENCRYPTION_ENABLE_FAILED = NVDIMM_COMP_ID | 0x40, // Encryption enable failed
NVDIMM_ENCRYPTION_ERASE_PENDING_FAILED = NVDIMM_COMP_ID | 0x41, // Encryption crypto erase pending failed
NVDIMM_ENCRYPTION_ERASE_FAILED = NVDIMM_COMP_ID | 0x42, // Encryption crypto erase failed
NVDIMM_ENCRYPTION_UNLOCK_FAILED = NVDIMM_COMP_ID | 0x43, // Encryption unlock failed
NVDIMM_ENCRYPTION_INVALID_ATTRIBUTE = NVDIMM_COMP_ID | 0x44, // Encryption attribute key data invalid
NVDIMM_ENCRYPTION_KEY_ATTRS_INVALID = NVDIMM_COMP_ID | 0x45, // Encryption key attributes are both invalid
NVDIMM_ENCRYPTION_MAX_DARN_ERRORS = NVDIMM_COMP_ID | 0x46, // Darn random key gen reached max errors
NVDIMM_ENCRYPTION_BAD_RANDOM_DATA = NVDIMM_COMP_ID | 0x47, // Generated key data not valid
NVDIMM_CANNOT_MAKE_ATTRIBUTE = NVDIMM_COMP_ID | 0x48, // Cannot make Attribute
NVDIMM_HEALTH_CHECK_IN_PROGRESS_FAILURE = NVDIMM_COMP_ID | 0x49, // !< pertains to ES_CMD_STATUS0[0]; the health check in progress flag
NVDIMM_HEALTH_CHECK_REPORTED_FAILURE = NVDIMM_COMP_ID | 0x4A, // !< pertains to ES_CMD_STATUS0[2]; the health check reported a failure flag
NVDIMM_LIFETIME_MIN_REQ_NOT_MET = NVDIMM_COMP_ID | 0x4B, // !< pertains to ES_LIFETIME; BPM does not meet minimum requirement for a new BPM
NVDIMM_HEALTH_CHECK_NEVER_INITIATED = NVDIMM_COMP_ID | 0x4C, // !< A health check was never initiated at start of IPL
};

enum UserDetailsTypes
{
NVDIMM_UDT_NO_FORMAT = 0x0,
NVDIMM_UDT_PARAMETERS = 0x1,
NVDIMM_OP_PARAMETERS = 0x2,
};

}; // end NVDIMM
Expand Down
41 changes: 39 additions & 2 deletions src/usr/isteps/nvdimm/errlud_nvdimm.C
Expand Up @@ -158,9 +158,46 @@ UdNvdimmParms::UdNvdimmParms( uint8_t i_opType,
}

//------------------------------------------------------------------------------
UdNvdimmParms::~UdNvdimmParms()
{
UdNvdimmParms::~UdNvdimmParms() = default;

//------------------------------------------------------------------------------
// NVDIMM Dimm Operation Parameters and Errors
//------------------------------------------------------------------------------
UdNvdimmOPParms::UdNvdimmOPParms( const nvdimm_reg_t &i_RegInfo )
{
// Version control for ErrorUD struct
iv_CompId = NVDIMM_COMP_ID;
iv_Version = 3;
iv_SubSection = NVDIMM_OP_PARAMETERS;

//***** Memory Layout *****
// 1 byte : MODULE_HEALTH
// 1 byte : MODULE_HEALTH_STATUS0
// 1 byte : MODULE_HEALTH_STATUS1
// 1 byte : CSAVE_STATUS
// 1 byte : CSAVE_INFO
// 1 byte : CSAVE_FAIL_INFO0
// 1 byte : CSAVE_FAIL_INFO1
// 1 byte : ERROR_THRESHOLD_STATUS
// 1 byte : NVDIMM_READY
// 1 byte : NVDIMM_CMD_STATUS0
// 1 byte : ABORT_CMD_TIMEOUT
// 1 byte : ERASE_STATUS
// 1 byte : ERASE_TIMEOUT0
// 1 byte : ERASE_TIMEOUT1
// 1 byte : SET_ES_POLICY_STATUS
// 1 byte : RESTORE_STATUS
// 1 byte : RESTORE_FAIL_INFO
// 1 byte : RESTORE_TIMEOUT0
// 1 byte : RESTORE_TIMEOUT1
// 1 byte : ARM_STATUS
// 1 byte : SET_EVENT_NOTIFICATION_STATUS

char * l_pBuf = reinterpret_cast<char *>( reallocUsrBuf(sizeof(i_RegInfo)));
memcpy(l_pBuf, &i_RegInfo, sizeof(i_RegInfo));
}

// Default the deconstructor
UdNvdimmOPParms::~UdNvdimmOPParms() = default;

} // end NVDIMM namespace
33 changes: 29 additions & 4 deletions src/usr/isteps/nvdimm/errlud_nvdimm.H
Expand Up @@ -61,12 +61,37 @@ class UdNvdimmParms : public ERRORLOG::ErrlUserDetails
*/
virtual ~UdNvdimmParms();

private:
// Disabled
UdNvdimmParms(UdNvdimmParms &);
UdNvdimmParms & operator=(UdNvdimmParms &);
UdNvdimmParms(UdNvdimmParms &) = delete;
UdNvdimmParms & operator=(UdNvdimmParms &) = delete;
};

} // end NVDIMM namespace

/**
* @class UdNvdimmOPParms
*
* Adds NVDIMM information to an error log as user detail data
*/
class UdNvdimmOPParms : public ERRORLOG::ErrlUserDetails
{
public:
/**
* @brief Constructor
*
* @param i_i2cInfo Miscellaneous Parameters
*/
UdNvdimmOPParms( const nvdimm_reg_t &i_RegInfo );

/**
* @brief Destructor
*/
virtual ~UdNvdimmOPParms();

// Disabled
UdNvdimmOPParms() = delete;
UdNvdimmOPParms(UdNvdimmOPParms &) = delete;
UdNvdimmOPParms & operator=(UdNvdimmOPParms &) = delete;
};

} // end of namespace NVDIMM
#endif

0 comments on commit d577988

Please sign in to comment.