diff options
Diffstat (limited to 'src/import/chips/ocmb/common/procedures/hwp/pmic/lib/eff_config/pmic_efd_processing.C')
-rw-r--r-- | src/import/chips/ocmb/common/procedures/hwp/pmic/lib/eff_config/pmic_efd_processing.C | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/eff_config/pmic_efd_processing.C b/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/eff_config/pmic_efd_processing.C index b0001c9cb..58bbc9aa2 100644 --- a/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/eff_config/pmic_efd_processing.C +++ b/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/eff_config/pmic_efd_processing.C @@ -22,3 +22,256 @@ /* permissions and limitations under the License. */ /* */ /* IBM_PROLOG_END_TAG */ +/// +/// @file pmic_efd_processing.C +/// @brief Processing for EFD for eff config +/// + +// *HWP HWP Owner: Mark Pizzutillo Mark.Pizzutillo@ibm.com> +// *HWP FW Owner: Stephen Glancy <sglancy@us.ibm.com> +// *HWP Team: Memory +// *HWP Level: 2 +// *HWP Consumed by: HB:CI + +#include <fapi2.H> +#include <generic/memory/lib/data_engine/data_engine_traits_def.H> +#include <generic/memory/lib/data_engine/data_engine.H> +#include <generic/memory/lib/spd/spd_facade.H> +#include <lib/mss_pmic_attribute_setters.H> +#include <lib/eff_config/pmic_efd_processing.H> +#include <lib/utils/pmic_consts.H> +#include <lib/utils/pmic_common_utils.H> + +namespace mss +{ +namespace pmic +{ + +/// +/// @brief Convert unsigned offset from SPD to signed offset for attributes +/// +/// @param[in] i_offset - unsigned offset +/// @param[in] i_direction - direction +/// @return int8_t signed equivalent +/// @note Should be used with SPD data where the offset is 7 bits such that overflow could not be possible +/// +int8_t convert_to_signed_offset(const uint8_t i_offset, const uint8_t i_direction) +{ + // Since offset value must be 7 bits (from SPD), we can directly cast it to an int8_t + int8_t l_signed_offset = static_cast<int8_t>(i_offset); + + if (i_direction == CONSTS::OFFSET_MINUS) + { + // Can't overflow since signed_offset was only 7 bits + l_signed_offset = 0 - l_signed_offset; + } + + return l_signed_offset; +} + +namespace efd +{ + +using CONSTS = mss::pmic::consts<mss::pmic::product::JEDEC_COMPLIANT>; +/// +/// @brief Processes the EFD PMIC0 SWA Voltage Offset +/// @param[in] i_target the target on which to operate +/// @param[in] i_efd_data the EFD data to process +/// @return fapi2::FAPI2_RC_SUCCESS iff function completes successfully +/// +fapi2::ReturnCode pmic0_swa_voltage_offset(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target, + const std::shared_ptr<mss::efd::base_decoder>& i_efd_data) +{ + uint8_t l_offset = 0; + uint8_t l_direction = 0; + FAPI_TRY(i_efd_data->pmic0_swa_offset(l_offset)); + FAPI_TRY(i_efd_data->pmic0_swa_offset_direction(l_direction)); + { + int8_t l_signed_offset = mss::pmic::convert_to_signed_offset(l_offset, l_direction); + FAPI_TRY(mss::attr::set_efd_pmic0_swa_voltage_offset(i_target, l_signed_offset)); + } + +fapi_try_exit: + return fapi2::current_err; +} + +/// +/// @brief Processes the EFD PMIC0 SWB Voltage Offset +/// @param[in] i_target the target on which to operate +/// @param[in] i_efd_data the EFD data to process +/// @return fapi2::FAPI2_RC_SUCCESS iff function completes successfully +/// +fapi2::ReturnCode pmic0_swb_voltage_offset(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target, + const std::shared_ptr<mss::efd::base_decoder>& i_efd_data) +{ + uint8_t l_offset = 0; + uint8_t l_direction = 0; + FAPI_TRY(i_efd_data->pmic0_swb_offset(l_offset)); + FAPI_TRY(i_efd_data->pmic0_swb_offset_direction(l_offset)); + { + int8_t l_signed_offset = mss::pmic::convert_to_signed_offset(l_offset, l_direction); + FAPI_TRY(mss::attr::set_efd_pmic0_swb_voltage_offset(i_target, l_signed_offset)); + } + +fapi_try_exit: + return fapi2::current_err; +} + +/// +/// @brief Processes the EFD PMIC0 SWC Voltage Offset +/// @param[in] i_target the target on which to operate +/// @param[in] i_efd_data the EFD data to process +/// @return fapi2::FAPI2_RC_SUCCESS iff function completes successfully +/// +fapi2::ReturnCode pmic0_swc_voltage_offset(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target, + const std::shared_ptr<mss::efd::base_decoder>& i_efd_data) +{ + uint8_t l_offset = 0; + uint8_t l_direction = 0; + FAPI_TRY(i_efd_data->pmic0_swc_offset(l_offset)); + FAPI_TRY(i_efd_data->pmic0_swc_offset_direction(l_offset)); + { + int8_t l_signed_offset = mss::pmic::convert_to_signed_offset(l_offset, l_direction); + FAPI_TRY(mss::attr::set_efd_pmic0_swc_voltage_offset(i_target, l_signed_offset)); + } + +fapi_try_exit: + return fapi2::current_err; +} + +/// +/// @brief Processes the EFD PMIC0 SWD Voltage Offset +/// @param[in] i_target the target on which to operate +/// @param[in] i_efd_data the EFD data to process +/// @return fapi2::FAPI2_RC_SUCCESS iff function completes successfully +/// +fapi2::ReturnCode pmic0_swd_voltage_offset(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target, + const std::shared_ptr<mss::efd::base_decoder>& i_efd_data) +{ + uint8_t l_offset = 0; + uint8_t l_direction = 0; + FAPI_TRY(i_efd_data->pmic0_swd_offset(l_offset)); + FAPI_TRY(i_efd_data->pmic0_swd_offset_direction(l_offset)); + { + int8_t l_signed_offset = mss::pmic::convert_to_signed_offset(l_offset, l_direction); + FAPI_TRY(mss::attr::set_efd_pmic0_swd_voltage_offset(i_target, l_signed_offset)); + } + +fapi_try_exit: + return fapi2::current_err; +} + +/// +/// @brief Processes the EFD PMIC1 SWA Voltage Offset +/// @param[in] i_target the target on which to operate +/// @param[in] i_efd_data the EFD data to process +/// @return fapi2::FAPI2_RC_SUCCESS iff function completes successfully +/// +fapi2::ReturnCode pmic1_swa_voltage_offset(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target, + const std::shared_ptr<mss::efd::base_decoder>& i_efd_data) +{ + uint8_t l_offset = 0; + uint8_t l_direction = 0; + FAPI_TRY(i_efd_data->pmic1_swa_offset(l_offset)); + FAPI_TRY(i_efd_data->pmic1_swa_offset_direction(l_offset)); + { + int8_t l_signed_offset = mss::pmic::convert_to_signed_offset(l_offset, l_direction); + FAPI_TRY(mss::attr::set_efd_pmic1_swa_voltage_offset(i_target, l_signed_offset)); + } + +fapi_try_exit: + return fapi2::current_err; +} + +/// +/// @brief Processes the EFD PMIC1 SWB Voltage Offset +/// @param[in] i_target the target on which to operate +/// @param[in] i_efd_data the EFD data to process +/// @return fapi2::FAPI2_RC_SUCCESS iff function completes successfully +/// +fapi2::ReturnCode pmic1_swb_voltage_offset(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target, + const std::shared_ptr<mss::efd::base_decoder>& i_efd_data) +{ + uint8_t l_offset = 0; + uint8_t l_direction = 0; + FAPI_TRY(i_efd_data->pmic1_swb_offset(l_offset)); + FAPI_TRY(i_efd_data->pmic1_swb_offset_direction(l_offset)); + { + int8_t l_signed_offset = mss::pmic::convert_to_signed_offset(l_offset, l_direction); + FAPI_TRY(mss::attr::set_efd_pmic1_swb_voltage_offset(i_target, l_signed_offset)); + } + +fapi_try_exit: + return fapi2::current_err; +} + +/// +/// @brief Processes the EFD PMIC1 SWC Voltage Offset +/// @param[in] i_target the target on which to operate +/// @param[in] i_efd_data the EFD data to process +/// @return fapi2::FAPI2_RC_SUCCESS iff function completes successfully +/// +fapi2::ReturnCode pmic1_swc_voltage_offset(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target, + const std::shared_ptr<mss::efd::base_decoder>& i_efd_data) +{ + uint8_t l_offset = 0; + uint8_t l_direction = 0; + FAPI_TRY(i_efd_data->pmic1_swc_offset(l_offset)); + FAPI_TRY(i_efd_data->pmic1_swc_offset_direction(l_offset)); + { + int8_t l_signed_offset = mss::pmic::convert_to_signed_offset(l_offset, l_direction); + FAPI_TRY(mss::attr::set_efd_pmic1_swc_voltage_offset(i_target, l_signed_offset)); + } + +fapi_try_exit: + return fapi2::current_err; +} + +/// +/// @brief Processes the EFD PMIC1 SWD Voltage Offset +/// @param[in] i_target the target on which to operate +/// @param[in] i_efd_data the EFD data to process +/// @return fapi2::FAPI2_RC_SUCCESS iff function completes successfully +/// +fapi2::ReturnCode pmic1_swd_voltage_offset(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target, + const std::shared_ptr<mss::efd::base_decoder>& i_efd_data) +{ + uint8_t l_offset = 0; + uint8_t l_direction = 0; + FAPI_TRY(i_efd_data->pmic1_swd_offset(l_offset)); + FAPI_TRY(i_efd_data->pmic1_swd_offset_direction(l_offset)); + { + int8_t l_signed_offset = mss::pmic::convert_to_signed_offset(l_offset, l_direction); + FAPI_TRY(mss::attr::set_efd_pmic1_swd_voltage_offset(i_target, l_signed_offset)); + } + +fapi_try_exit: + return fapi2::current_err; +} + +/// +/// @brief Process the EFD data and set attributes +/// @param[in] i_target DIMM target on which to operate +/// @param[in] i_efd_data the EFD data to process +/// @return fapi2::FAPI2_RC_SUCCESS iff function completes successfully +/// +fapi2::ReturnCode process(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target, + const std::shared_ptr<mss::efd::base_decoder>& i_efd_data) +{ + FAPI_TRY(pmic0_swa_voltage_offset(i_target, i_efd_data)); + FAPI_TRY(pmic0_swb_voltage_offset(i_target, i_efd_data)); + FAPI_TRY(pmic0_swc_voltage_offset(i_target, i_efd_data)); + FAPI_TRY(pmic0_swd_voltage_offset(i_target, i_efd_data)); + + FAPI_TRY(pmic1_swa_voltage_offset(i_target, i_efd_data)); + FAPI_TRY(pmic1_swb_voltage_offset(i_target, i_efd_data)); + FAPI_TRY(pmic1_swc_voltage_offset(i_target, i_efd_data)); + FAPI_TRY(pmic1_swd_voltage_offset(i_target, i_efd_data)); + +fapi_try_exit: + return fapi2::current_err; +} + +} // efd +} // pmic +} // mss |