diff options
Diffstat (limited to 'src/import/generic/memory/lib/utils/find.H')
-rw-r--r-- | src/import/generic/memory/lib/utils/find.H | 186 |
1 files changed, 93 insertions, 93 deletions
diff --git a/src/import/generic/memory/lib/utils/find.H b/src/import/generic/memory/lib/utils/find.H index c22199b6d..297334ae7 100644 --- a/src/import/generic/memory/lib/utils/find.H +++ b/src/import/generic/memory/lib/utils/find.H @@ -38,9 +38,13 @@ #include <fapi2.H> #include <vector> +#include <generic/memory/lib/utils/c_str.H> +#include <generic/memory/lib/utils/index.H> +#include <generic/memory/lib/utils/shared/mss_generic_consts.H> namespace mss { + /// /// @brief Helper to find a set of elements based on a fapi2 target /// @tparam M the target type to be returned @@ -117,6 +121,7 @@ static inline fapi2::Target<M> find_target_impl( const fapi2::Target<T>& i_targe /// @tparam M the target type to be returned /// @tparam T the fapi2 target type of the argument /// @param[in] i_target the fapi2 target T +/// @param[in] std::true_type tag dispatch if T == M /// @return an M target. /// @note Only works for valid parent-child relationships /// @@ -145,30 +150,6 @@ inline fapi2::Target<M> find_target( const fapi2::Target<T>& i_target) } /// -/// @brief find the McBIST given a DIMM -/// @param[in] i_target the fapi2 target DIMM -/// @return a McBIST target. -/// -template<> -inline fapi2::Target<fapi2::TARGET_TYPE_MCBIST> find_target(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target) -{ - return i_target.getParent<fapi2::TARGET_TYPE_MCA>().getParent<fapi2::TARGET_TYPE_MCBIST>(); -} - -/// -/// @brief find the PROC_CHIP given a MBA -/// @param[in] i_target the fapi2 target MBA -/// @return a DMI target. -/// -template<> -inline fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP> find_target(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target) -{ - return i_target.getParent<fapi2::TARGET_TYPE_MEMBUF_CHIP>() - .getParent<fapi2::TARGET_TYPE_DMI>() - .getParent<fapi2::TARGET_TYPE_PROC_CHIP>(); -} - -/// /// @brief find the PROC_CHIP given a OCMB_CHIP /// @param[in] i_target the fapi2 target OCMB_CHIP /// @return a PROC_CHIP target. @@ -183,26 +164,16 @@ inline fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP> find_target(const fapi2::Targ } /// -/// @brief find the DMI given an MBA -/// @param[in] i_target the fapi2 target MBA -/// @return a DMI target. -/// -template<> -inline fapi2::Target<fapi2::TARGET_TYPE_DMI> find_target(const fapi2::Target<fapi2::TARGET_TYPE_MBA>& i_target) -{ - return i_target.getParent<fapi2::TARGET_TYPE_MEMBUF_CHIP>().getParent<fapi2::TARGET_TYPE_DMI>(); -} - -/// -/// @brief find the PROC given a MEMBUF -/// @param[in] i_target the fapi2 target MEMBUF -/// @return a PROC target. +/// @brief find the MCC given a OCMB_CHIP +/// @param[in] i_target the fapi2 target OCMB_CHIP +/// @return a MCC target. /// template<> -inline fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP> find_target(const fapi2::Target<fapi2::TARGET_TYPE_MEMBUF_CHIP>& +inline fapi2::Target<fapi2::TARGET_TYPE_MCC> find_target(const fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP>& i_target) { - return i_target.getParent<fapi2::TARGET_TYPE_DMI>().getParent<fapi2::TARGET_TYPE_PROC_CHIP>(); + return i_target.getParent<fapi2::TARGET_TYPE_OMI>() + .getParent<fapi2::TARGET_TYPE_MCC>(); } /// @@ -230,98 +201,93 @@ find_targets( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target, } /// -/// @brief find all the MBA connected to an DMI -/// @param[in] i_target a fapi2::Target DMI -/// @return a vector of fapi2::TARGET_TYPE_MBA -/// -template<> -inline std::vector< fapi2::Target<fapi2::TARGET_TYPE_MBA> > -find_targets( const fapi2::Target<fapi2::TARGET_TYPE_DMI>& i_target, - fapi2::TargetState i_state ) -{ - std::vector< fapi2::Target<fapi2::TARGET_TYPE_MBA> > l_mbas; - - for (const auto& membuf_chip : i_target.getChildren<fapi2::TARGET_TYPE_MEMBUF_CHIP>(i_state)) - { - auto l_these_mbas( membuf_chip.getChildren<fapi2::TARGET_TYPE_MBA>(i_state) ); - l_mbas.insert(l_mbas.end(), l_these_mbas.begin(), l_these_mbas.end()); - } - - return l_mbas; -} - -/// -/// @brief find all the DIMM connected to a centaur -/// @param[in] i_target a fapi2::Target TARGET_TYPE_MEMBUF_CHIP +/// @brief find all the DIMMS connected to an MI +/// @param[in] i_target a fapi2::Target MI /// @return a vector of fapi2::TARGET_TYPE_DIMM /// template<> inline std::vector< fapi2::Target<fapi2::TARGET_TYPE_DIMM> > -find_targets( const fapi2::Target<fapi2::TARGET_TYPE_MEMBUF_CHIP>& i_target, +find_targets( const fapi2::Target<fapi2::TARGET_TYPE_MI>& i_target, fapi2::TargetState i_state ) { std::vector< fapi2::Target<fapi2::TARGET_TYPE_DIMM> > l_dimms; - for (const auto& l_mba : i_target.getChildren<fapi2::TARGET_TYPE_MBA>(i_state)) + for (const auto& l_omi : i_target.getChildren<fapi2::TARGET_TYPE_OMI>(i_state)) { - auto l_these_dimms( l_mba.getChildren<fapi2::TARGET_TYPE_DIMM>(i_state) ); - l_dimms.insert(l_dimms.end(), l_these_dimms.begin(), l_these_dimms.end()); + for (const auto& l_ocmb : l_omi.getChildren<fapi2::TARGET_TYPE_OCMB_CHIP>(i_state)) + { + auto l_these_dimms( l_ocmb.getChildren<fapi2::TARGET_TYPE_DIMM>(i_state) ); + l_dimms.insert(l_dimms.end(), l_these_dimms.begin(), l_these_dimms.end()); + } } return l_dimms; } /// -/// @brief find all the dimm connected to an MCS -/// @param[in] i_target a fapi2::Target MCS -/// @return a vector of fapi2::TARGET_TYPE_DIMM +/// @brief find all the OCMB_CHIPs connected to an MI +/// @param[in] i_target a fapi2::Target MI +/// @return a vector of fapi2::TARGET_TYPE_OCMB_CHIP /// template<> -inline std::vector< fapi2::Target<fapi2::TARGET_TYPE_DIMM> > -find_targets( const fapi2::Target<fapi2::TARGET_TYPE_MCS>& i_target, +inline std::vector< fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP> > +find_targets( const fapi2::Target<fapi2::TARGET_TYPE_MI>& i_target, fapi2::TargetState i_state ) { - std::vector< fapi2::Target<fapi2::TARGET_TYPE_DIMM> > l_dimms; + std::vector< fapi2::Target<fapi2::TARGET_TYPE_OCMB_CHIP> > l_ocmbs; - for (const auto& p : i_target.getChildren<fapi2::TARGET_TYPE_MCA>(i_state)) + for (const auto& l_omi : i_target.getChildren<fapi2::TARGET_TYPE_OMI>(i_state)) { - auto l_these_dimms( p.getChildren<fapi2::TARGET_TYPE_DIMM>(i_state) ); - l_dimms.insert(l_dimms.end(), l_these_dimms.begin(), l_these_dimms.end()); + auto l_these_ocmbs( l_omi.getChildren<fapi2::TARGET_TYPE_OCMB_CHIP>(i_state) ); + l_ocmbs.insert(l_ocmbs.end(), l_these_ocmbs.begin(), l_these_ocmbs.end()); } - return l_dimms; + return l_ocmbs; } /// -/// @brief find all the dimms connected to an MCBIST -/// @param[in] i_target a fapi2::Target MCBIST -/// @return a vector of fapi2::TARGET_TYPE_DIMM +/// @brief find all the MEM_PORTs connected to a PROC_CHIP +/// @param[in] i_target a fapi2::Target PROC_CHIP +/// @return a vector of fapi2::TARGET_TYPE_MEM_PORT /// template<> -inline std::vector< fapi2::Target<fapi2::TARGET_TYPE_DIMM> > -find_targets( const fapi2::Target<fapi2::TARGET_TYPE_MCBIST>& i_target, +inline std::vector< fapi2::Target<fapi2::TARGET_TYPE_MEM_PORT> > +find_targets( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target, fapi2::TargetState i_state ) { - std::vector< fapi2::Target<fapi2::TARGET_TYPE_DIMM> > l_dimms; + std::vector< fapi2::Target<fapi2::TARGET_TYPE_MEM_PORT> > l_ports; - for (const auto& p : i_target.getChildren<fapi2::TARGET_TYPE_MCA>(i_state)) + for (const auto& l_mc : i_target.getChildren<fapi2::TARGET_TYPE_MC>(i_state)) { - auto l_these_dimms( p.getChildren<fapi2::TARGET_TYPE_DIMM>(i_state) ); - l_dimms.insert(l_dimms.end(), l_these_dimms.begin(), l_these_dimms.end()); + for (const auto& l_omi : l_mc.getChildren<fapi2::TARGET_TYPE_OMI>(i_state)) + { + for (const auto& l_ocmb : l_omi.getChildren<fapi2::TARGET_TYPE_OCMB_CHIP>(i_state)) + { + auto l_these_ports( l_ocmb.getChildren<fapi2::TARGET_TYPE_MEM_PORT>(i_state) ); + l_ports.insert(l_ports.end(), l_these_ports.begin(), l_these_ports.end()); + } + } } - return l_dimms; + return l_ports; } /// -/// @brief find the MCS given a DIMM -/// @param[in] i_target the fapi2 target DIMM -/// @return a MCS target. +/// @brief Helper to find a set of elements based on a fapi2 target, then sort them +/// @tparam M the target type to be returned +/// @tparam T the fapi2 target type of the argument +/// @param[in] i_target the fapi2 target T +/// @param[in] i_state [optional] fapi2 target state (defaults to TARGET_STATE_FUNCTIONAL) +/// @return a vector of M targets sorted by mss::index. +/// @note this uses mss::index so the targets will be sorted via ATTR_REL_POS of their immediate parent /// -template<> -inline fapi2::Target<fapi2::TARGET_TYPE_MCS> find_target( const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target) +template< fapi2::TargetType M, fapi2::TargetType T > +static inline std::vector< fapi2::Target<M> > find_targets_sorted_by_index( const fapi2::Target<T>& i_target, + fapi2::TargetState i_state = fapi2::TARGET_STATE_FUNCTIONAL ) { - return i_target.getParent<fapi2::TARGET_TYPE_MCA>().getParent<fapi2::TARGET_TYPE_MCS>(); + std::vector<fapi2::Target<M>> l_targets = find_targets<M, T>(i_target, i_state); + sort_targets_by_index(l_targets); + return l_targets; } /// @@ -432,6 +398,40 @@ bool find_value_from_key( const std::pair<T, OT> (&i_array)[N], return false; } +/// +/// @brief Mapping boilerplate check +/// @tparam T FAPI2 target type +/// @tparam IT map key type +/// @tparam OT map value type +/// @param[in] i_target the FAPI target +/// @param[in] i_map SPD to attribute data mapping +/// @param[in] i_ffdc_code FFDC function code +/// @param[in] i_key Key to query map +/// @param[out] o_output value from key +/// @return FAPI2_RC_SUCCESS iff okay +/// +template< fapi2::TargetType T, typename IT, typename OT > +inline fapi2::ReturnCode lookup_table_check(const fapi2::Target<T>& i_target, + const std::vector<std::pair<IT, OT>>& i_map, + const generic_ffdc_codes i_ffdc_code, + const IT i_key, + OT& o_output) +{ + const bool l_is_val_found = mss::find_value_from_key(i_map, i_key, o_output); + + FAPI_ASSERT( l_is_val_found, + fapi2::MSS_LOOKUP_FAILED() + .set_KEY(i_key) + .set_DATA(o_output) + .set_FUNCTION(i_ffdc_code) + .set_TARGET(i_target), + "Failed to find a mapped value for %d on %s", + i_key, + mss::spd::c_str(i_target) ); +fapi_try_exit: + return fapi2::current_err; +} + }// mss #endif |