diff options
Diffstat (limited to 'src/import/chips/ocmb/common/procedures/hwp/pmic/pmic_bias.C')
-rw-r--r-- | src/import/chips/ocmb/common/procedures/hwp/pmic/pmic_bias.C | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/src/import/chips/ocmb/common/procedures/hwp/pmic/pmic_bias.C b/src/import/chips/ocmb/common/procedures/hwp/pmic/pmic_bias.C index a8da82dcd..c0b65f3ba 100644 --- a/src/import/chips/ocmb/common/procedures/hwp/pmic/pmic_bias.C +++ b/src/import/chips/ocmb/common/procedures/hwp/pmic/pmic_bias.C @@ -30,11 +30,20 @@ // *HWP HWP Owner: Mark Pizzutillo <mark.pizzutillo@ibm.com> // *HWP HWP Backup: Louis Stermole <stermole@us.ibm.com> // *HWP Team: Memory -// *HWP Level: 1 +// *HWP Level: 2 // *HWP Consumed by: FSP:HB #include <fapi2.H> #include <lib/utils/pmic_bias_utils.H> +#include <lib/utils/pmic_common_utils.H> +#include <pmic_bias.H> +#include <generic/memory/lib/utils/find.H> +#include <lib/i2c/i2c_pmic.H> +#include <pmic_regs.H> +#include <pmic_regs_fld.H> +#include <lib/utils/pmic_bias_utils.H> +#include <lib/utils/pmic_consts.H> +#include <generic/memory/lib/utils/c_str.H> extern "C" { @@ -42,6 +51,7 @@ extern "C" /// @brief Bias procedure for PMIC devices /// /// @param[in] i_ocmb_target explorer target + /// @param[in] i_id the PMIC to change (PMIC0,PMIC1) /// @param[in] i_setting setting to change (swa_volt, swb_volt, etc.) /// @param[in] i_amount amount to change by /// @param[in] i_unit percentage or value @@ -49,12 +59,54 @@ extern "C" /// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff success /// fapi2::ReturnCode pmic_bias(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_ocmb_target, + const mss::pmic::id i_id, const mss::pmic::setting i_setting, const float i_amount, const mss::pmic::unit i_unit, const bool i_force) { - // TK - L1 implementation, function not filled in yet + // Check that our inputs are valid + FAPI_ASSERT(i_id != mss::pmic::id::UNKNOWN_ID, + fapi2::PMIC_NO_PMIC_SPECIFIED() + .set_TARGET(i_ocmb_target) + .set_PMIC_ID(uint8_t(i_id)), + "pmic_bias(): PMIC ID %u was unknown for bias procedure call on OCMB %s", + uint8_t(i_id), i_ocmb_target); + + FAPI_ASSERT(i_setting != mss::pmic::setting::NO_SETTING, + fapi2::PMIC_NO_SETTING_SPECIFIED() + .set_TARGET(i_ocmb_target) + .set_SETTING_ID(uint8_t(i_setting)), + "pmic_bias(): PMIC setting ID %u was unknown for bias procedure call on OCMB %s", + uint8_t(i_setting), i_ocmb_target); + + FAPI_ASSERT(i_unit != mss::pmic::unit::NO_UNIT, + fapi2::PMIC_NO_UNIT_SPECIFIED() + .set_TARGET(i_ocmb_target) + .set_UNIT_ID(uint8_t(i_unit)), + "pmic_bias(): Biasing unit ID %u was unknown for bias procedure call on OCMB %s", + uint8_t(i_unit), i_ocmb_target); + + for (const auto& l_pmic : mss::find_targets<fapi2::TARGET_TYPE_PMIC>(i_ocmb_target)) + { + // If matching ID (pmic0, pmic1), then we will bias it + if ((mss::index(l_pmic) % mss::pmic::consts<mss::pmic::product::JEDEC_COMPLIANT>::NUM_UNIQUE_PMICS) == i_id) + { + // Poll to make sure PBULK reports good, then we can be sure we can write/read registers + FAPI_TRY(mss::pmic::poll_for_pbulk_good(l_pmic), + "pmic_enable: poll for pbulk good either failed, or returned not good status on PMIC %s", + mss::c_str(l_pmic)); + + FAPI_INF("Performing BIAS on PMIC %s", mss::c_str(l_pmic)); + + // Now call the bias function + FAPI_TRY(mss::pmic::bias_chip(l_pmic, i_setting, i_amount, i_unit, i_force), + "Error biasing PMIC %s", mss::c_str(l_pmic)); + } + } + return fapi2::FAPI2_RC_SUCCESS; + fapi_try_exit: + return fapi2::current_err; } -} +} // extern C |