diff options
author | Joe McGill <jmcgill@us.ibm.com> | 2015-12-22 10:57:36 -0600 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2018-06-15 10:18:23 -0400 |
commit | b7d8c7cfb45ec3e4ea8576f51426b677dc38f684 (patch) | |
tree | 8bade1490f756b36034e4bbc6e94ea955a6c9884 | |
parent | 306a7107053580f955bba6491a3f98c6d7456f74 (diff) | |
download | talos-hostboot-b7d8c7cfb45ec3e4ea8576f51426b677dc38f684.tar.gz talos-hostboot-b7d8c7cfb45ec3e4ea8576f51426b677dc38f684.zip |
L2 HWPs -- p9_smp_link_layer and p9_fab_iovalid
Tested on n10_e9031_tp030_soa_mc_u008_01
Rebased on e9034 SCOM address header implementation
Change-Id: Ib3c2408e890f4151d6951edfcd83d0a9fb79ba7b
Original-Change-Id: Iae352ca9392f3e863c9881c90a8a07969befe727
Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/22942
Tested-by: Jenkins Server
Tested-by: Auto Mirror
Tested-by: Hostboot CI
Tested-by: PPE CI
Reviewed-by: Thi N. Tran <thi@us.ibm.com>
Reviewed-by: CHRISTINA L. GRAVES <clgraves@us.ibm.com>
Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com>
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/60645
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Disable-CI: Daniel M. Crowell <dcrowell@us.ibm.com>
Tested-by: Daniel M. Crowell <dcrowell@us.ibm.com>
-rw-r--r-- | src/import/chips/p9/procedures/hwp/nest/p9_fab_iovalid.C | 147 |
1 files changed, 145 insertions, 2 deletions
diff --git a/src/import/chips/p9/procedures/hwp/nest/p9_fab_iovalid.C b/src/import/chips/p9/procedures/hwp/nest/p9_fab_iovalid.C index c8279600e..f51357db2 100644 --- a/src/import/chips/p9/procedures/hwp/nest/p9_fab_iovalid.C +++ b/src/import/chips/p9/procedures/hwp/nest/p9_fab_iovalid.C @@ -27,14 +27,13 @@ /// @brief Manage fabric link iovalid controls (FAPI2) /// /// @author Joe McGill <jmcgill@us.ibm.com> -/// @author Christy Graves <clgraves@us.ibm.com> /// // // *HWP HWP Owner: Joe McGill <jmcgill@us.ibm.com> // *HWP FW Owner: Thi Tran <thi@us.ibm.com> // *HWP Team: Nest -// *HWP Level: 1 +// *HWP Level: 2 // *HWP Consumed by: HB,FSP // @@ -42,18 +41,162 @@ // Includes //------------------------------------------------------------------------------ #include <p9_fab_iovalid.H> +#include <p9_fbc_utils.H> + + +//------------------------------------------------------------------------------ +// Constant definitions +//------------------------------------------------------------------------------ +const uint8_t IOVALID_FIELD_NUM_BITS = 2; //------------------------------------------------------------------------------ // Function definitions //------------------------------------------------------------------------------ +/// +/// @brief Manipulate iovalid/FIR settings for a single fabric link +/// +/// @param[in] i_target Reference to processor chip target +/// @param[in] i_ctl Reference to link control structure +/// @param[op] i_set_not_clear Define iovalid operation (true=set, false=clear) +/// @return fapi::ReturnCode. FAPI2_RC_SUCCESS if success, else error code. +/// +fapi2::ReturnCode +p9_fab_iovalid_update_link(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target, + const p9_fbc_link_ctl_t& i_ctl, + const bool i_set_not_clear) +{ + FAPI_DBG("Start"); + + // form data buffers for iovalid/RAS FIR mask updates + fapi2::buffer<uint64_t> l_iovalid_mask; + fapi2::buffer<uint64_t> l_ras_fir_mask; + + if (i_set_not_clear) + { + // set iovalid + l_iovalid_mask.flush<0>(); + FAPI_TRY(l_iovalid_mask.setBit(i_ctl.iovalid_field_start_bit, + IOVALID_FIELD_NUM_BITS)); + // clear RAS FIR mask + l_ras_fir_mask.flush<1>(); + FAPI_TRY(l_ras_fir_mask.clearBit(i_ctl.ras_fir_field_bit)); + } + else + { + // clear iovalid + l_iovalid_mask.flush<1>(); + FAPI_TRY(l_iovalid_mask.clearBit(i_ctl.iovalid_field_start_bit, + IOVALID_FIELD_NUM_BITS)); + // set RAS FIR mask + l_ras_fir_mask.flush<0>(); + FAPI_TRY(l_ras_fir_mask.setBit(i_ctl.ras_fir_field_bit)); + } + + // use AND/OR mask registers to atomically update link specific fields + // in iovalid/RAS FIR mask registers + FAPI_TRY(fapi2::putScom(i_target, + (i_set_not_clear) ? (i_ctl.iovalid_or_addr) : (i_ctl.iovalid_clear_addr), + l_iovalid_mask), + "Error writing iovalid control register!"); + + FAPI_TRY(fapi2::putScom(i_target, + (i_set_not_clear) ? (PU_PB_CENT_SM1_EXTFIR_MASK_REG_AND) : (PU_PB_CENT_SM1_EXTFIR_MASK_REG_OR), + l_ras_fir_mask), + "Error writing RAS FIR mask register!"); + +fapi_try_exit: + FAPI_DBG("End"); + return fapi2::current_err; +} + + fapi2::ReturnCode p9_fab_iovalid(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target, const bool i_set_not_clear) { FAPI_INF("Start"); + + uint8_t l_x_en_attr[P9_FBC_UTILS_MAX_X_LINKS]; + uint8_t l_a_en_attr[P9_FBC_UTILS_MAX_A_LINKS]; + std::vector<std::pair<p9_fbc_link_t, uint8_t>> l_valid_links; + std::vector<p9_fbc_link_ctl_t> l_link_ctls(P9_FBC_LINK_CTL_ARR, + P9_FBC_LINK_CTL_ARR + (sizeof(P9_FBC_LINK_CTL_ARR) / sizeof(P9_FBC_LINK_CTL_ARR[0]))); + bool l_ctl_match_found = false; + + + // read X/A link enable attributes, extract set of valid links + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_FABRIC_X_ATTACHED_CHIP_CNFG, + i_target, + l_x_en_attr), + "Error from FAPI_ATTR_GET (ATTR_PROC_FABRIC_X_ATTACHED_CHIP_CNFG"); + + for (uint8_t x = 0; x < P9_FBC_UTILS_MAX_X_LINKS; x++) + { + if (l_x_en_attr[x]) + { + FAPI_DBG("Adding link X%d", x); + l_valid_links.push_back(std::make_pair(XBUS, x)); + } + else + { + FAPI_DBG("Skipping link X%d", x); + } + } + + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_FABRIC_A_ATTACHED_CHIP_CNFG, + i_target, + l_a_en_attr), + "Error from FAPI_ATTR_GET (ATTR_PROC_FABRIC_A_ATTACHED_CHIP_CNFG"); + + for (uint8_t a = 0; a < P9_FBC_UTILS_MAX_A_LINKS; a++) + { + if (l_a_en_attr[a]) + { + FAPI_DBG("Adding link A%d", a); + l_valid_links.push_back(std::make_pair(ABUS, a)); + } + else + { + FAPI_DBG("Skipping link A%d", a); + } + } + + // for each valid link, search vector table & call link update routine + for (auto l_link_iter = l_valid_links.begin(); l_link_iter != l_valid_links.end(); l_link_iter++) + { + FAPI_DBG("Processing %s%d (action = %s)", + (l_link_iter->first == XBUS) ? ("X") : ("A)"), + l_link_iter->second, + (i_set_not_clear) ? ("set") : ("clear")); + + l_ctl_match_found = false; + + for (auto l_link_ctl_iter = l_link_ctls.begin(); + (l_link_ctl_iter != l_link_ctls.end()) && (!l_ctl_match_found); + l_link_ctl_iter++) + { + if ((l_link_ctl_iter->link_type == l_link_iter->first) && + (l_link_ctl_iter->link_id == l_link_iter->second)) + { + l_ctl_match_found = true; + FAPI_TRY(p9_fab_iovalid_update_link(i_target, + *l_link_ctl_iter, + i_set_not_clear), + "Error from p9_fab_iovalid_update_link"); + } + } + + FAPI_ASSERT(l_ctl_match_found, + fapi2::P9_FAB_IOVALID_TABLE_ERR().set_TARGET(i_target). + set_LINK(l_link_iter->first). + set_LINK_ID(l_link_iter->second), + "No match found for link"); + } + +fapi_try_exit: FAPI_INF("End"); return fapi2::current_err; } |