From 104c2dc5963a11e6b0d15888705eeb6c18a4c314 Mon Sep 17 00:00:00 2001 From: Mark Pizzutillo Date: Wed, 2 Oct 2019 18:08:02 -0400 Subject: Disable & clear PMIC status codes in beginning of pmic_enable Change-Id: I64b025443395c842f68dbaa1fb58909a4695f31a Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/84680 Reviewed-by: STEPHEN GLANCY Reviewed-by: Louis Stermole Tested-by: FSP CI Jenkins Tested-by: Jenkins Server Tested-by: Hostboot CI Reviewed-by: Jennifer A Stofer Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/84792 Tested-by: Jenkins OP Build CI Reviewed-by: Daniel M Crowell --- .../hwp/pmic/lib/utils/pmic_common_utils.C | 22 ++++++++++++++ .../hwp/pmic/lib/utils/pmic_common_utils.H | 8 +++++ .../hwp/pmic/lib/utils/pmic_enable_utils.C | 35 ++++++++++++++++++++++ .../hwp/pmic/lib/utils/pmic_enable_utils.H | 8 +++++ .../ocmb/common/procedures/hwp/pmic/pmic_enable.C | 3 ++ 5 files changed, 76 insertions(+) (limited to 'src/import/chips') diff --git a/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/utils/pmic_common_utils.C b/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/utils/pmic_common_utils.C index 06487ffbd..fe5e54c0d 100644 --- a/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/utils/pmic_common_utils.C +++ b/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/utils/pmic_common_utils.C @@ -295,6 +295,28 @@ fapi_try_exit: return fapi2::current_err; } +/// +/// @brief Clear PMIC status registers +/// +/// @param[in] i_pmic_target PMIC to clear +/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff success, else error code +/// +fapi2::ReturnCode clear(const fapi2::Target& i_pmic_target) +{ + using REGS = pmicRegs; + using FIELDS = pmicFields; + + fapi2::buffer l_reg_contents; + FAPI_TRY(mss::pmic::i2c::reg_read_reverse_buffer(i_pmic_target, REGS::R14, l_reg_contents)); + + // Write to clear + l_reg_contents.setBit(); + FAPI_TRY(mss::pmic::i2c::reg_write_reverse_buffer(i_pmic_target, REGS::R14, l_reg_contents)); + +fapi_try_exit: + return fapi2::current_err; +} + /// /// @brief Check an individual set of PMIC status codes /// diff --git a/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/utils/pmic_common_utils.H b/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/utils/pmic_common_utils.H index 4b73203cd..b2a7c60d7 100644 --- a/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/utils/pmic_common_utils.H +++ b/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/utils/pmic_common_utils.H @@ -300,6 +300,14 @@ fapi2::ReturnCode check_all_pmics(const fapi2::Target& i_pmic_target, bool& o_error); +/// +/// @brief Clear PMIC status registers +/// +/// @param[in] i_pmic_target PMIC to clear +/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff success, else error code +/// +fapi2::ReturnCode clear(const fapi2::Target& i_pmic_target); + /// /// @brief Check the IDT specific status codes /// diff --git a/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/utils/pmic_enable_utils.C b/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/utils/pmic_enable_utils.C index d77805122..70951fb89 100644 --- a/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/utils/pmic_enable_utils.C +++ b/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/utils/pmic_enable_utils.C @@ -520,6 +520,41 @@ fapi_try_exit: return fapi2::current_err; } +/// +/// @brief Disable PMICs and clear status bits in preparation for enable +/// +/// @param[in] i_pmics vector of PMIC targets +/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff success, else error code +/// +fapi2::ReturnCode disable_and_reset_pmics(const std::vector>& i_pmics) +{ + using REGS = pmicRegs; + using FIELDS = pmicFields; + + for (const auto& l_pmic : i_pmics) + { + // Make sure PMIC is alive + FAPI_TRY(mss::pmic::poll_for_pbulk_good(l_pmic)); + + // First, disable + { + fapi2::buffer l_reg_contents; + + // Redundant clearBit, but just so it's clear what we're doing + l_reg_contents.clearBit(); + + FAPI_TRY(mss::pmic::i2c::reg_write_reverse_buffer(l_pmic, REGS::R32, l_reg_contents)); + } + + // Now that it's disabled, let's clear the status bits so errors don't hang over into the next enable + { + FAPI_TRY(mss::pmic::status::clear(l_pmic)); + } + } + +fapi_try_exit: + return fapi2::current_err; +} /// /// @brief Enable PMIC for SPD mode /// diff --git a/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/utils/pmic_enable_utils.H b/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/utils/pmic_enable_utils.H index 680bb8f9b..9220993b5 100644 --- a/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/utils/pmic_enable_utils.H +++ b/src/import/chips/ocmb/common/procedures/hwp/pmic/lib/utils/pmic_enable_utils.H @@ -764,6 +764,14 @@ fapi2::ReturnCode enable_chip_1U_2U(const fapi2::Target const fapi2::Target& i_dimm_target, const uint16_t i_vendor_id); +/// +/// @brief Disable PMICs and clear status bits in preparation for enable +/// +/// @param[in] i_pmics vector of PMIC targets +/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS iff success, else error code +/// +fapi2::ReturnCode disable_and_reset_pmics(const std::vector>& i_pmics); + /// /// @brief Enable PMIC for SPD mode /// diff --git a/src/import/chips/ocmb/common/procedures/hwp/pmic/pmic_enable.C b/src/import/chips/ocmb/common/procedures/hwp/pmic/pmic_enable.C index bec758f65..eaab19cd5 100644 --- a/src/import/chips/ocmb/common/procedures/hwp/pmic/pmic_enable.C +++ b/src/import/chips/ocmb/common/procedures/hwp/pmic/pmic_enable.C @@ -63,6 +63,9 @@ extern "C" return fapi2::FAPI2_RC_SUCCESS; } + // Disable PMICs and clear status bits so we are starting at a known off state + FAPI_TRY(mss::pmic::disable_and_reset_pmics(l_pmics)); + // // If we're enabling via internal settings, we can just run VR ENABLE down the line if (i_mode == mss::pmic::enable_mode::MANUAL) { -- cgit v1.2.1