summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndre Marin <aamarin@us.ibm.com>2019-01-07 16:10:52 -0600
committerDaniel M. Crowell <dcrowell@us.ibm.com>2019-02-21 10:34:05 -0600
commita47c3bc95b0dc6ac9ced4b7777d122d86ff57a77 (patch)
tree55df39ba3e132f6153f4caa41589676c2f2afbab /src
parent5a0ae42a9589542e5eb6e1d1c95957d639e102d5 (diff)
downloadtalos-hostboot-a47c3bc95b0dc6ac9ced4b7777d122d86ff57a77.tar.gz
talos-hostboot-a47c3bc95b0dc6ac9ced4b7777d122d86ff57a77.zip
Generalize set fields in pre_data_init
Added a definition file for data engine traits for specialization purposes. Moved pre_data_engine definitions into a common templated version. Change-Id: I891690f9f4d9d6865309c329f8fc769dd4836a23 Original-Change-Id: Ifb204da9cc6eb9d5d36b6eaeb1e1a5e99c97544e Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/69411 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Reviewed-by: Louis Stermole <stermole@us.ibm.com> Tested-by: HWSV CI <hwsv-ci+hostboot@us.ibm.com> Reviewed-by: STEPHEN GLANCY <sglancy@us.ibm.com> Dev-Ready: ANDRE A. MARIN <aamarin@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/72223 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src')
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/eff_config/nimbus_pre_data_engine.C402
-rw-r--r--src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_general_errors.xml71
-rw-r--r--src/import/generic/memory/lib/data_engine/data_engine_traits_def.H45
-rw-r--r--src/import/generic/memory/lib/data_engine/data_engine_utils.H167
-rw-r--r--src/import/generic/memory/lib/data_engine/p9n/p9n_data_init_traits.H304
-rw-r--r--src/import/generic/memory/lib/data_engine/pre_data_init.H211
-rw-r--r--src/import/generic/procedures/xml/error_info/generic_error.xml70
7 files changed, 699 insertions, 571 deletions
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/eff_config/nimbus_pre_data_engine.C b/src/import/chips/p9/procedures/hwp/memory/lib/eff_config/nimbus_pre_data_engine.C
index 28e67f9b9..281fe8c56 100644
--- a/src/import/chips/p9/procedures/hwp/memory/lib/eff_config/nimbus_pre_data_engine.C
+++ b/src/import/chips/p9/procedures/hwp/memory/lib/eff_config/nimbus_pre_data_engine.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2018 */
+/* Contributors Listed Below - COPYRIGHT 2018,2019 */
/* [+] Evan Lojewski */
/* [+] International Business Machines Corp. */
/* */
@@ -34,289 +34,11 @@
// *HWP Level: 3
// *HWP Consumed by: CI
-#include <generic/memory/lib/utils/index.H>
-#include <lib/mss_attribute_accessors.H>
#include <generic/memory/lib/data_engine/pre_data_init.H>
-#include <generic/memory/lib/utils/find.H>
namespace mss
{
-///
-/// @brief Traits for pre_data_engine
-/// @class preDataInitTraits
-/// @note NIMBUS, DIMM_TYPE specialization
-///
-template<>
-class preDataInitTraits<mss::proc_type::NIMBUS, DIMM_TYPE>
-{
- public:
- using attr_type = fapi2::ATTR_EFF_DIMM_TYPE_Type;
- static const fapi2::TargetType TARGET_TYPE = fapi2::ATTR_EFF_DIMM_TYPE_TargetType;
-
- ///
- /// @brief attribute getter
- /// @param[in] i_target the MCS target
- /// @param[out] o_setting array to populate
- /// @return FAPI2_RC_SUCCESS iff okay
- ///
- static fapi2::ReturnCode get_attr(const fapi2::Target<TARGET_TYPE>& i_target,
- attr_type& o_setting)
- {
- FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_DIMM_TYPE, i_target, o_setting) );
-
- fapi_try_exit:
- return fapi2::current_err;
- }
-
- ///
- /// @brief attribute setter
- /// @param[in] i_target the MCS target
- /// @param[in] i_setting array to set
- /// @return FAPI2_RC_SUCCESS iff okay
- ///
- static fapi2::ReturnCode set_attr(const fapi2::Target<TARGET_TYPE>& i_target,
- const attr_type& i_setting)
- {
- attr_type l_data = {};
- memcpy(l_data, i_setting, sizeof(l_data));
- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_TYPE, i_target, l_data) );
-
- fapi_try_exit:
- return fapi2::current_err;
- }
-};
-
-///
-/// @brief Traits for pre_data_engine
-/// @class preDataInitTraits
-/// @note NIMBUS, DRAM_GEN specialization
-///
-template<>
-class preDataInitTraits<mss::proc_type::NIMBUS, DRAM_GEN>
-{
- public:
- using attr_type = fapi2::ATTR_EFF_DRAM_GEN_Type;
- static const fapi2::TargetType TARGET_TYPE = fapi2::ATTR_EFF_DRAM_GEN_TargetType;
-
- ///
- /// @brief attribute getter
- /// @param[in] i_target the MCS target
- /// @param[out] o_setting array to populate
- /// @return FAPI2_RC_SUCCESS iff okay
- ///
- static fapi2::ReturnCode get_attr(const fapi2::Target<TARGET_TYPE>& i_target,
- attr_type& o_setting)
- {
- FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_DRAM_GEN, i_target, o_setting) );
-
- fapi_try_exit:
- return fapi2::current_err;
- }
-
- ///
- /// @brief attribute setter
- /// @param[in] i_target the MCS target
- /// @param[in] i_setting array to set
- /// @return FAPI2_RC_SUCCESS iff okay
- ///
- static fapi2::ReturnCode set_attr(const fapi2::Target<TARGET_TYPE>& i_target,
- const attr_type& i_setting)
- {
- attr_type l_data = {};
- memcpy(l_data, i_setting, sizeof(l_data));
-
- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DRAM_GEN, i_target, l_data) );
-
- fapi_try_exit:
- return fapi2::current_err;
- }
-};
-
-///
-/// @brief Traits for pre_data_engine
-/// @class preDataInitTraits
-/// @note NIMBUS, HYBRID specialization
-///
-template<>
-class preDataInitTraits<mss::proc_type::NIMBUS, HYBRID>
-{
- public:
- using attr_type = fapi2::ATTR_EFF_HYBRID_Type;
- static const fapi2::TargetType TARGET_TYPE = fapi2::ATTR_EFF_HYBRID_TargetType;
-
- ///
- /// @brief attribute getter
- /// @param[in] i_target the MCS target
- /// @param[out] o_setting array to populate
- /// @return FAPI2_RC_SUCCESS iff okay
- ///
- static fapi2::ReturnCode get_attr(const fapi2::Target<TARGET_TYPE>& i_target,
- attr_type& o_setting)
- {
- FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_HYBRID, i_target, o_setting) );
-
- fapi_try_exit:
- return fapi2::current_err;
- }
-
- ///
- /// @brief attribute setter
- /// @param[in] i_target the MCS target
- /// @param[in] i_setting array to set
- /// @return FAPI2_RC_SUCCESS iff okay
- ///
- static fapi2::ReturnCode set_attr(const fapi2::Target<TARGET_TYPE>& i_target,
- const attr_type& i_setting)
- {
- attr_type l_data = {};
- memcpy(l_data, i_setting, sizeof(l_data));
-
- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_HYBRID, i_target, l_data) );
-
- fapi_try_exit:
- return fapi2::current_err;
- }
-};
-
-///
-/// @brief Traits for pre_data_engine
-/// @class preDataInitTraits
-/// @note NIMBUS, HYBRID_MEDIA specialization
-///
-template<>
-class preDataInitTraits<mss::proc_type::NIMBUS, HYBRID_MEDIA>
-{
- public:
- using attr_type = fapi2::ATTR_EFF_HYBRID_MEMORY_TYPE_Type;
- static const fapi2::TargetType TARGET_TYPE = fapi2::ATTR_EFF_HYBRID_MEMORY_TYPE_TargetType;
-
- ///
- /// @brief attribute getter
- /// @param[in] i_target the MCS target
- /// @param[out] o_setting array to populate
- /// @return FAPI2_RC_SUCCESS iff okay
- ///
- static fapi2::ReturnCode get_attr(const fapi2::Target<TARGET_TYPE>& i_target,
- attr_type& o_setting)
- {
- FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_HYBRID_MEMORY_TYPE, i_target, o_setting) );
-
- fapi_try_exit:
- return fapi2::current_err;
- }
-
- ///
- /// @brief attribute setter
- /// @param[in] i_target the MCS target
- /// @param[in] i_setting array to set
- /// @return FAPI2_RC_SUCCESS iff okay
- ///
- static fapi2::ReturnCode set_attr(const fapi2::Target<TARGET_TYPE>& i_target,
- const attr_type& i_setting)
- {
- attr_type l_data = {};
- memcpy(l_data, i_setting, sizeof(l_data));
-
- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_HYBRID_MEMORY_TYPE, i_target, l_data) );
-
- fapi_try_exit:
- return fapi2::current_err;
- }
-};
-
-///
-/// @brief Traits for pre_data_engine
-/// @class preDataInitTraits
-/// @note NIMBUS, MRANKS specialization
-///
-template<>
-class preDataInitTraits<mss::proc_type::NIMBUS, MRANKS>
-{
- public:
- using attr_type = fapi2::ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM_Type;
- static const fapi2::TargetType TARGET_TYPE = fapi2::ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM_TargetType;
-
- ///
- /// @brief attribute getter
- /// @param[in] i_target the MCS target
- /// @param[out] o_setting array to populate
- /// @return FAPI2_RC_SUCCESS iff okay
- ///
- static fapi2::ReturnCode get_attr(const fapi2::Target<TARGET_TYPE>& i_target,
- attr_type& o_setting)
- {
- FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM, i_target, o_setting) );
-
- fapi_try_exit:
- return fapi2::current_err;
- }
-
- ///
- /// @brief attribute setter
- /// @param[in] i_target the MCS target
- /// @param[in] i_setting array to set
- /// @return FAPI2_RC_SUCCESS iff okay
- ///
- static fapi2::ReturnCode set_attr(const fapi2::Target<TARGET_TYPE>& i_target,
- const attr_type& i_setting)
- {
- attr_type l_data = {};
- memcpy(l_data, i_setting, sizeof(l_data));
-
- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM, i_target, l_data) );
-
- fapi_try_exit:
- return fapi2::current_err;
- }
-};
-
-///
-/// @brief Traits for pre_data_engine
-/// @class preDataInitTraits
-/// @note NIMBUS, DIMM_RANKS_CNFG specialization
-///
-template<>
-class preDataInitTraits<mss::proc_type::NIMBUS, DIMM_RANKS_CNFG>
-{
- public:
- using attr_type = fapi2::ATTR_EFF_DIMM_RANKS_CONFIGED_Type;
- static const fapi2::TargetType TARGET_TYPE = fapi2::ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM_TargetType;
-
- ///
- /// @brief attribute getter
- /// @param[in] i_target the MCS target
- /// @param[out] o_setting array to populate
- /// @return FAPI2_RC_SUCCESS iff okay
- ///
- static fapi2::ReturnCode get_attr(const fapi2::Target<TARGET_TYPE>& i_target,
- attr_type& o_setting)
- {
- FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_DIMM_RANKS_CONFIGED, i_target, o_setting) );
-
- fapi_try_exit:
- return fapi2::current_err;
- }
-
- ///
- /// @brief attribute setter
- /// @param[in] i_target the MCS target
- /// @param[in] i_setting array to set
- /// @return FAPI2_RC_SUCCESS iff okay
- ///
- static fapi2::ReturnCode set_attr(const fapi2::Target<TARGET_TYPE>& i_target,
- const attr_type& i_setting)
- {
- attr_type l_data = {};
- memcpy(l_data, i_setting, sizeof(l_data));
-
- FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_RANKS_CONFIGED, i_target, l_data) );
-
- fapi_try_exit:
- return fapi2::current_err;
- }
-};
-
// =========================================================
// DDR4 SPD Document Release 4
// Byte 2 (0x002): Key Byte / DRAM Device Type
@@ -389,126 +111,4 @@ const std::vector< std::pair<uint8_t, uint8_t> > pre_data_engine<mss::proc_type:
{3, fapi2::ENUM_ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM_4R},
};
-///
-/// @brief Set ATTR_EFF_DIMM_TYPE
-/// @return FAPI2_RC_SUCCESS iff ok
-///
-template<>
-fapi2::ReturnCode pre_data_engine<mss::proc_type::NIMBUS>::set_dimm_type()
-{
- uint8_t l_base_module_type = 0;
- uint8_t l_dimm_type = 0;
-
- FAPI_TRY(iv_spd_data.base_module(l_base_module_type));
- FAPI_TRY(lookup_table_check(iv_dimm, BASE_MODULE_TYPE_MAP, SET_ATTR_DIMM_TYPE, l_base_module_type, l_dimm_type));
- FAPI_TRY( (set_field<mss::proc_type::NIMBUS, DIMM_TYPE>(iv_dimm, l_dimm_type)) );
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
-/// @brief Set ATTR_EFF_DRAM_GEN
-/// @return FAPI2_RC_SUCCESS iff ok
-///
-template<>
-fapi2::ReturnCode pre_data_engine<mss::proc_type::NIMBUS>::set_dram_gen()
-{
- uint8_t l_device_type = 0;
- uint8_t l_dram_gen = 0;
-
- FAPI_TRY(iv_spd_data.device_type(l_device_type));
- FAPI_TRY(lookup_table_check(iv_dimm, DRAM_GEN_MAP, SET_ATTR_DRAM_GEN, l_device_type, l_dram_gen));
-
- FAPI_TRY( (set_field<mss::proc_type::NIMBUS, DRAM_GEN>(iv_dimm, l_dram_gen)) );
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
-/// @brief Set ATTR_EFF_HYBRID
-/// @return FAPI2_RC_SUCCESS iff ok
-///
-template<>
-fapi2::ReturnCode pre_data_engine<mss::proc_type::NIMBUS>::set_hybrid()
-{
- uint8_t l_spd_hybrid_type = 0;
- uint8_t l_hybrid = 0;
-
- FAPI_TRY(iv_spd_data.hybrid(l_spd_hybrid_type));
- FAPI_TRY(lookup_table_check(iv_dimm, HYBRID_MAP, SET_ATTR_HYBRID, l_spd_hybrid_type, l_hybrid));
-
- FAPI_TRY( (set_field<mss::proc_type::NIMBUS, HYBRID>(iv_dimm, l_hybrid)) );
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
-/// @brief Set ATTR_EFF_HYBRID_MEMORY_TYPE
-/// @return FAPI2_RC_SUCCESS iff ok
-///
-template<>
-fapi2::ReturnCode pre_data_engine<mss::proc_type::NIMBUS>::set_hybrid_media()
-{
- uint8_t l_hybrid_media = 0;
- uint8_t l_spd_hybrid_media = 0;
-
- FAPI_TRY(iv_spd_data.hybrid_media(l_spd_hybrid_media));
- FAPI_TRY(lookup_table_check(iv_dimm, HYBRID_MAP, SET_ATTR_HYBRID, l_spd_hybrid_media, l_hybrid_media));
-
- FAPI_TRY( (set_field<mss::proc_type::NIMBUS, HYBRID_MEDIA>(iv_dimm, l_hybrid_media)) );
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
-/// @brief Set ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM
-/// @return FAPI2_RC_SUCCESS iff ok
-///
-template<>
-fapi2::ReturnCode pre_data_engine<mss::proc_type::NIMBUS>::set_master_ranks()
-{
- // Sets up commonly used member variables
- uint8_t l_master_ranks_spd = 0;
- uint8_t l_master_ranks_to_set = 0;
- FAPI_TRY(iv_spd_data.num_package_ranks_per_dimm(l_master_ranks_spd),
- "%s failed to get number of package ranks from SPD", spd::c_str(iv_dimm));
- FAPI_TRY(lookup_table_check(iv_dimm, NUM_PACKAGE_RANKS_MAP, PRE_DATA_ENGINE_CTOR, l_master_ranks_spd,
- l_master_ranks_to_set), "%s failed MASTER_RANKS lookup check", spd::c_str(iv_dimm));
-
- FAPI_TRY( (set_field<mss::proc_type::NIMBUS, MRANKS>(iv_dimm, l_master_ranks_to_set)) );
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
-///
-/// @brief Sets ATTR_EFF_DIMM_RANKS_CONFIGED
-/// @return FAPI2_RC_SUCCESS iff okay
-///
-template<>
-fapi2::ReturnCode pre_data_engine<mss::proc_type::NIMBUS>::set_dimm_ranks_configured()
-{
- // Set configed ranks. Set the bit representing the master rank configured (0 being left most.) So,
- // a 4R DIMM would be 0b11110000 (0xF0). This is used by PRD.
- fapi2::buffer<uint8_t> l_ranks_configed;
- uint8_t l_master_ranks = 0;
-
- // Make sure the number of master ranks is setup
- FAPI_TRY( set_master_ranks(), "%s Failed to set the number of master ranks", spd::c_str(iv_dimm) );
- FAPI_TRY( eff_num_master_ranks_per_dimm(iv_dimm, l_master_ranks),
- "%s Failed to get the number of master ranks", spd::c_str(iv_dimm) );
-
- FAPI_TRY( l_ranks_configed.setBit(0, l_master_ranks),
- "%s. Failed to setBit", spd::c_str(iv_dimm) );
-
- FAPI_TRY( (set_field<mss::proc_type::NIMBUS, DIMM_RANKS_CNFG>(iv_dimm, uint8_t(l_ranks_configed))) );
-
-fapi_try_exit:
- return fapi2::current_err;
-}
-
}//mss
diff --git a/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_general_errors.xml b/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_general_errors.xml
index 7264ed78f..292bb393f 100644
--- a/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_general_errors.xml
+++ b/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_general_errors.xml
@@ -5,7 +5,7 @@
<!-- -->
<!-- OpenPOWER HostBoot Project -->
<!-- -->
-<!-- Contributors Listed Below - COPYRIGHT 2016,2018 -->
+<!-- Contributors Listed Below - COPYRIGHT 2016,2019 -->
<!-- [+] International Business Machines Corp. -->
<!-- -->
<!-- -->
@@ -62,73 +62,4 @@
</callout>
</hwpError>
- <hwpError>
- <rc>RC_MSS_UNEXPECTED_VALUE_SEEN</rc>
- <description> Invalid value seen versus the expected value wanted </description>
- <ffdc>TARGET</ffdc>
- <ffdc>EXPECTED</ffdc>
- <ffdc>ACTUAL</ffdc>
- <ffdc>FUNCTION</ffdc>
- <callout>
- <procedure>CODE</procedure>
- <priority>LOW</priority>
- </callout>
- </hwpError>
-
- <hwpError>
- <rc>RC_MSS_OUT_OF_BOUNDS_INDEXING</rc>
- <description>
- Desired index is larger than list (std::vector, array, etc.) size.
- Likely a programming error.
- </description>
- <ffdc>TARGET</ffdc>
- <ffdc>INDEX</ffdc>
- <ffdc>LIST_SIZE</ffdc>
- <ffdc>FUNCTION</ffdc>
- <callout>
- <procedure>CODE</procedure>
- <priority>LOW</priority>
- </callout>
- </hwpError>
-
- <hwpError>
- <rc>RC_MSS_CONVERSION_ERROR</rc>
- <description>
- Overflow or underflow occured converting one integral type to another.
- This is a programming error.
- </description>
- <ffdc>TARGET</ffdc>
- <ffdc>ORIGINAL_VAL</ffdc>
- <ffdc>CONVERTED_VAL</ffdc>
- <ffdc>FUNCTION</ffdc>
- <callout>
- <procedure>CODE</procedure>
- <priority>LOW</priority>
- </callout>
- </hwpError>
-
-
- <hwpError>
- <rc>RC_MSS_FAILED_DATA_INTEGRITY_CHECK</rc>
- <description>
- Bad data received.
- Settings are incorrect for received data.
- This could be code problem (decoding) or bad data.
- </description>
- <ffdc>VALUE</ffdc>
- <ffdc>BYTE</ffdc>
- <ffdc>FFDC_CODE</ffdc>
- <callout>
- <procedure>CODE</procedure>
- <priority>MEDIUM</priority>
- </callout>
- <callout>
- <target>TARGET</target>
- <priority>HIGH</priority>
- </callout>
- <deconfigure>
- <target>TARGET</target>
- </deconfigure>
- </hwpError>
-
</hwpErrors>
diff --git a/src/import/generic/memory/lib/data_engine/data_engine_traits_def.H b/src/import/generic/memory/lib/data_engine/data_engine_traits_def.H
index 56df471a6..37fb596b4 100644
--- a/src/import/generic/memory/lib/data_engine/data_engine_traits_def.H
+++ b/src/import/generic/memory/lib/data_engine/data_engine_traits_def.H
@@ -22,3 +22,48 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
+
+///
+/// @file data_engine_traits_def.H
+/// @brief Class to set preliminary eff_config attributes
+///
+// *HWP HWP Owner: Andre Marin <aamarin@us.ibm.com>
+// *HWP FW Owner: Stephen Glancy <sglancy@us.ibm.com>
+// *HWP Team: Memory
+// *HWP Level: 2
+// *HWP Consumed by: CI
+
+#ifndef _MSS_DATA_ENGINE_TRAITS_DEF_H_
+#define _MSS_DATA_ENGINE_TRAITS_DEF_H_
+
+#include <cstring>
+#include <generic/memory/lib/utils/shared/mss_generic_consts.H>
+
+namespace mss
+{
+
+///
+/// @brief enum list of preliminary data fields
+///
+enum pre_data_init_fields
+{
+ DIMM_TYPE,
+ DRAM_GEN,
+ HYBRID,
+ HYBRID_MEDIA,
+ MRANKS,
+ DIMM_RANKS_CNFG,
+};
+
+///
+/// @brief Forward declartion of traits for pre_data_engine
+/// @class preDataInitTraits
+/// @tparam T proc_type (e.g. Nimbus, Axone, etc.)
+/// @tparam TT pre_data_init_fields (e.g. DIMM_TYPE, MRANK, etc.)
+///
+template< proc_type T, pre_data_init_fields TT >
+class preDataInitTraits;
+
+}// mss
+
+#endif
diff --git a/src/import/generic/memory/lib/data_engine/data_engine_utils.H b/src/import/generic/memory/lib/data_engine/data_engine_utils.H
index cc0d78f74..e2d5652c0 100644
--- a/src/import/generic/memory/lib/data_engine/data_engine_utils.H
+++ b/src/import/generic/memory/lib/data_engine/data_engine_utils.H
@@ -22,3 +22,170 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
+
+///
+/// @file data_engine_utils.H
+/// @brief Data engine to set memory driven data
+///
+// *HWP HWP Owner: Andre Marin <aamarin@us.ibm.com>
+// *HWP FW Owner: Stephen Glancy <sglancy@us.ibm.com>
+// *HWP Team: Memory
+// *HWP Level: 2
+// *HWP Consumed by: CI
+
+#ifndef _MSS_DATA_ENGINE_UTILS_H_
+#define _MSS_DATA_ENGINE_UTILS_H_
+
+#include <fapi2.H>
+#include <generic/memory/lib/utils/index.H>
+#include <generic/memory/lib/utils/find.H>
+
+namespace mss
+{
+
+///
+/// @class DataSetterTraits2D
+/// @brief Traits for setting eff_config data
+/// @tparam P proc_type
+/// @tparam X size of 1st array index
+/// @tparam Y size of 2nd array index
+///
+template < proc_type, size_t X, size_t Y >
+struct DataSetterTraits2D;
+
+///
+/// @class DataSetterTraits - Nimbus, [PORT][DIMM] array specialization
+/// @brief Traits for setting eff_config data
+///
+template < >
+struct DataSetterTraits2D < proc_type::NIMBUS,
+ procTraits<proc_type::NIMBUS>::PORTS_PER_MCS,
+ procTraits<proc_type::NIMBUS>::DIMMS_PER_PORT
+ >
+{
+ static constexpr fapi2::TargetType TARGET = fapi2::TARGET_TYPE_MCA;
+};
+
+///
+/// @brief Helper function for attribute setting
+/// @tparam P proc_type
+/// @tparam X size of 1st array index
+/// @tparam Y size of 2nd array index
+/// @tparam T Input/output data type
+/// @tparam TT defaulted to DataSetterTraits2D<P, X, Y>
+/// @param[in] i_target the DIMM target
+/// @param[in] i_setting array to set
+/// @param[in] i_ffdc_code FFDC function code
+/// @param[out] o_data attribute data structure to set
+/// @warning This is Nimbus specific until MCA alias to MEM_PORT
+///
+template < proc_type P,
+ size_t X,
+ size_t Y,
+ typename T,
+ typename TT = DataSetterTraits2D<P, X, Y>
+ >
+fapi2::ReturnCode data_setter(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target,
+ const T i_setting,
+ const generic_ffdc_codes i_ffdc_code,
+ T (&o_data)[X][Y])
+{
+ const auto l_port_index = mss::index( find_target<TT::TARGET>(i_target) );
+ const auto l_dimm_index = mss::index(i_target);
+
+ FAPI_ASSERT( l_port_index < X,
+ fapi2::MSS_OUT_OF_BOUNDS_INDEXING()
+ .set_INDEX(l_port_index)
+ .set_LIST_SIZE(X)
+ .set_FUNCTION(i_ffdc_code)
+ .set_TARGET(i_target),
+ "Port index (%d) was larger than max (%d) on %s",
+ l_port_index,
+ X,
+ mss::spd::c_str(i_target) );
+
+ FAPI_ASSERT( l_dimm_index < Y,
+ fapi2::MSS_OUT_OF_BOUNDS_INDEXING()
+ .set_INDEX(l_dimm_index)
+ .set_LIST_SIZE(Y)
+ .set_FUNCTION(i_ffdc_code)
+ .set_TARGET(i_target),
+ "DIMM index (%d) was larger than max (%d) on %s",
+ l_dimm_index,
+ Y,
+ mss::spd::c_str(i_target) );
+
+ o_data[l_port_index][l_dimm_index] = i_setting;
+
+ return fapi2::FAPI2_RC_SUCCESS;
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+
+///
+/// @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;
+}
+
+///
+/// @brief Sets attr data fields
+/// @tparam P proc_type
+/// @tparam TT data engine class traits (e.g. preDataInitTraits, etc.)
+/// @tparam T FAPI2 target type
+/// @tparam IT Input data type
+/// @param[in] i_target the FAPI target
+/// @param[in] i_setting value we want to set attr with
+/// @return FAPI2_RC_SUCCESS iff okay
+///
+template< proc_type P,
+ typename TT,
+ fapi2::TargetType T,
+ typename IT
+ >
+inline fapi2::ReturnCode set_field(const fapi2::Target<T>& i_target,
+ const IT i_setting)
+{
+ const auto l_attr_target = mss::find_target<TT::TARGET_TYPE>(i_target);
+ typename TT::attr_type l_attr_list = {};
+ FAPI_TRY( TT::get_attr(l_attr_target, l_attr_list) );
+
+ FAPI_TRY( data_setter<P>(i_target, i_setting, TT::FFDC_CODE, l_attr_list) );
+ FAPI_TRY( TT::set_attr(l_attr_target, l_attr_list) );
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+
+}//mss
+
+#endif
diff --git a/src/import/generic/memory/lib/data_engine/p9n/p9n_data_init_traits.H b/src/import/generic/memory/lib/data_engine/p9n/p9n_data_init_traits.H
index a82aa2b7b..02254790e 100644
--- a/src/import/generic/memory/lib/data_engine/p9n/p9n_data_init_traits.H
+++ b/src/import/generic/memory/lib/data_engine/p9n/p9n_data_init_traits.H
@@ -22,3 +22,307 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
+
+///
+/// @file p9n_data_init_traits.H
+/// @brief Trait class definitions for Nimbus pre_data_init
+///
+// *HWP HWP Owner: Andre Marin <aamarin@us.ibm.com>
+// *HWP FW Owner: Stephen Glancy <sglancy@us.ibm.com>
+// *HWP Team: Memory
+// *HWP Level: 2
+// *HWP Consumed by: CI
+
+#ifndef _MSS_P9N_PRE_DATA_INIT_TRAITS_H_
+#define _MSS_P9N_PRE_DATA_INIT_TRAITS_H_
+
+#include <fapi2.H>
+#include <generic/memory/lib/data_engine/data_engine_traits_def.H>
+
+namespace mss
+{
+
+///
+/// @brief Traits for pre_data_engine
+/// @class preDataInitTraits
+/// @note NIMBUS, DIMM_TYPE specialization
+///
+template<>
+class preDataInitTraits<mss::proc_type::NIMBUS, DIMM_TYPE>
+{
+ public:
+ using attr_type = fapi2::ATTR_EFF_DIMM_TYPE_Type;
+ static const fapi2::TargetType TARGET_TYPE = fapi2::ATTR_EFF_DIMM_TYPE_TargetType;
+ static constexpr generic_ffdc_codes FFDC_CODE = SET_DIMM_TYPE;
+
+ ///
+ /// @brief attribute getter
+ /// @param[in] i_target the MCS target
+ /// @param[out] o_setting array to populate
+ /// @return FAPI2_RC_SUCCESS iff okay
+ ///
+ static fapi2::ReturnCode get_attr(const fapi2::Target<TARGET_TYPE>& i_target,
+ attr_type& o_setting)
+ {
+ FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_DIMM_TYPE, i_target, o_setting) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
+
+ ///
+ /// @brief attribute setter
+ /// @param[in] i_target the MCS target
+ /// @param[in] i_setting array to set
+ /// @return FAPI2_RC_SUCCESS iff okay
+ ///
+ static fapi2::ReturnCode set_attr(const fapi2::Target<TARGET_TYPE>& i_target,
+ const attr_type& i_setting)
+ {
+ attr_type l_data = {};
+ memcpy(l_data, i_setting, sizeof(l_data));
+ FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_TYPE, i_target, l_data) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
+};
+
+///
+/// @brief Traits for pre_data_engine
+/// @class preDataInitTraits
+/// @note NIMBUS, DRAM_GEN specialization
+///
+template<>
+class preDataInitTraits<mss::proc_type::NIMBUS, DRAM_GEN>
+{
+ public:
+ using attr_type = fapi2::ATTR_EFF_DRAM_GEN_Type;
+ static const fapi2::TargetType TARGET_TYPE = fapi2::ATTR_EFF_DRAM_GEN_TargetType;
+ static constexpr generic_ffdc_codes FFDC_CODE = SET_DRAM_GEN;
+
+ ///
+ /// @brief attribute getter
+ /// @param[in] i_target the MCS target
+ /// @param[out] o_setting array to populate
+ /// @return FAPI2_RC_SUCCESS iff okay
+ ///
+ static fapi2::ReturnCode get_attr(const fapi2::Target<TARGET_TYPE>& i_target,
+ attr_type& o_setting)
+ {
+ FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_DRAM_GEN, i_target, o_setting) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
+
+ ///
+ /// @brief attribute setter
+ /// @param[in] i_target the MCS target
+ /// @param[in] i_setting array to set
+ /// @return FAPI2_RC_SUCCESS iff okay
+ ///
+ static fapi2::ReturnCode set_attr(const fapi2::Target<TARGET_TYPE>& i_target,
+ const attr_type& i_setting)
+ {
+ attr_type l_data = {};
+ memcpy(l_data, i_setting, sizeof(l_data));
+
+ FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DRAM_GEN, i_target, l_data) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
+};
+
+///
+/// @brief Traits for pre_data_engine
+/// @class preDataInitTraits
+/// @note NIMBUS, HYBRID specialization
+///
+template<>
+class preDataInitTraits<mss::proc_type::NIMBUS, HYBRID>
+{
+ public:
+ using attr_type = fapi2::ATTR_EFF_HYBRID_Type;
+ static const fapi2::TargetType TARGET_TYPE = fapi2::ATTR_EFF_HYBRID_TargetType;
+ static constexpr generic_ffdc_codes FFDC_CODE = SET_HYBRID;
+
+ ///
+ /// @brief attribute getter
+ /// @param[in] i_target the MCS target
+ /// @param[out] o_setting array to populate
+ /// @return FAPI2_RC_SUCCESS iff okay
+ ///
+ static fapi2::ReturnCode get_attr(const fapi2::Target<TARGET_TYPE>& i_target,
+ attr_type& o_setting)
+ {
+ FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_HYBRID, i_target, o_setting) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
+
+ ///
+ /// @brief attribute setter
+ /// @param[in] i_target the MCS target
+ /// @param[in] i_setting array to set
+ /// @return FAPI2_RC_SUCCESS iff okay
+ ///
+ static fapi2::ReturnCode set_attr(const fapi2::Target<TARGET_TYPE>& i_target,
+ const attr_type& i_setting)
+ {
+ attr_type l_data = {};
+ memcpy(l_data, i_setting, sizeof(l_data));
+
+ FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_HYBRID, i_target, l_data) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
+};
+
+///
+/// @brief Traits for pre_data_engine
+/// @class preDataInitTraits
+/// @note NIMBUS, HYBRID_MEDIA specialization
+///
+template<>
+class preDataInitTraits<mss::proc_type::NIMBUS, HYBRID_MEDIA>
+{
+ public:
+ using attr_type = fapi2::ATTR_EFF_HYBRID_MEMORY_TYPE_Type;
+ static const fapi2::TargetType TARGET_TYPE = fapi2::ATTR_EFF_HYBRID_MEMORY_TYPE_TargetType;
+ static constexpr generic_ffdc_codes FFDC_CODE = SET_HYBRID_MEDIA;
+
+ ///
+ /// @brief attribute getter
+ /// @param[in] i_target the MCS target
+ /// @param[out] o_setting array to populate
+ /// @return FAPI2_RC_SUCCESS iff okay
+ ///
+ static fapi2::ReturnCode get_attr(const fapi2::Target<TARGET_TYPE>& i_target,
+ attr_type& o_setting)
+ {
+ FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_HYBRID_MEMORY_TYPE, i_target, o_setting) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
+
+ ///
+ /// @brief attribute setter
+ /// @param[in] i_target the MCS target
+ /// @param[in] i_setting array to set
+ /// @return FAPI2_RC_SUCCESS iff okay
+ ///
+ static fapi2::ReturnCode set_attr(const fapi2::Target<TARGET_TYPE>& i_target,
+ const attr_type& i_setting)
+ {
+ attr_type l_data = {};
+ memcpy(l_data, i_setting, sizeof(l_data));
+
+ FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_HYBRID_MEMORY_TYPE, i_target, l_data) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
+};
+
+///
+/// @brief Traits for pre_data_engine
+/// @class preDataInitTraits
+/// @note NIMBUS, MRANKS specialization
+///
+template<>
+class preDataInitTraits<mss::proc_type::NIMBUS, MRANKS>
+{
+ public:
+ using attr_type = fapi2::ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM_Type;
+ static const fapi2::TargetType TARGET_TYPE = fapi2::ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM_TargetType;
+ static constexpr generic_ffdc_codes FFDC_CODE = SET_MRANKS;
+
+ ///
+ /// @brief attribute getter
+ /// @param[in] i_target the MCS target
+ /// @param[out] o_setting array to populate
+ /// @return FAPI2_RC_SUCCESS iff okay
+ ///
+ static fapi2::ReturnCode get_attr(const fapi2::Target<TARGET_TYPE>& i_target,
+ attr_type& o_setting)
+ {
+ FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM, i_target, o_setting) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
+
+ ///
+ /// @brief attribute setter
+ /// @param[in] i_target the MCS target
+ /// @param[in] i_setting array to set
+ /// @return FAPI2_RC_SUCCESS iff okay
+ ///
+ static fapi2::ReturnCode set_attr(const fapi2::Target<TARGET_TYPE>& i_target,
+ const attr_type& i_setting)
+ {
+ attr_type l_data = {};
+ memcpy(l_data, i_setting, sizeof(l_data));
+
+ FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM, i_target, l_data) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
+};
+
+///
+/// @brief Traits for pre_data_engine
+/// @class preDataInitTraits
+/// @note NIMBUS, DIMM_RANKS_CNFG specialization
+///
+template<>
+class preDataInitTraits<mss::proc_type::NIMBUS, DIMM_RANKS_CNFG>
+{
+ public:
+ using attr_type = fapi2::ATTR_EFF_DIMM_RANKS_CONFIGED_Type;
+ static const fapi2::TargetType TARGET_TYPE = fapi2::ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM_TargetType;
+ static constexpr generic_ffdc_codes FFDC_CODE = SET_DIMM_RANKS_CNFG;
+
+ ///
+ /// @brief attribute getter
+ /// @param[in] i_target the MCS target
+ /// @param[out] o_setting array to populate
+ /// @return FAPI2_RC_SUCCESS iff okay
+ ///
+ static fapi2::ReturnCode get_attr(const fapi2::Target<TARGET_TYPE>& i_target,
+ attr_type& o_setting)
+ {
+ FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_EFF_DIMM_RANKS_CONFIGED, i_target, o_setting) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
+
+ ///
+ /// @brief attribute setter
+ /// @param[in] i_target the MCS target
+ /// @param[in] i_setting array to set
+ /// @return FAPI2_RC_SUCCESS iff okay
+ ///
+ static fapi2::ReturnCode set_attr(const fapi2::Target<TARGET_TYPE>& i_target,
+ const attr_type& i_setting)
+ {
+ attr_type l_data = {};
+ memcpy(l_data, i_setting, sizeof(l_data));
+
+ FAPI_TRY( FAPI_ATTR_SET(fapi2::ATTR_EFF_DIMM_RANKS_CONFIGED, i_target, l_data) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
+};
+
+}// mss
+
+#endif
diff --git a/src/import/generic/memory/lib/data_engine/pre_data_init.H b/src/import/generic/memory/lib/data_engine/pre_data_init.H
index 2daea4c15..068e4da4f 100644
--- a/src/import/generic/memory/lib/data_engine/pre_data_init.H
+++ b/src/import/generic/memory/lib/data_engine/pre_data_init.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2018 */
+/* Contributors Listed Below - COPYRIGHT 2018,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -38,92 +38,17 @@
#include <cstring>
#include <fapi2.H>
+#include <generic/memory/lib/utils/shared/mss_generic_consts.H>
#include <generic/memory/lib/spd/spd_facade.H>
#include <generic/memory/lib/utils/find.H>
-#include <generic/memory/lib/utils/shared/mss_generic_consts.H>
+#include <generic/memory/lib/data_engine/p9n/p9n_data_init_traits.H>
+#include <generic/memory/lib/data_engine/p9a/p9a_data_init_traits.H>
+#include <generic/memory/lib/data_engine/data_engine_utils.H>
namespace mss
{
///
-/// @brief enum list of preliminary data fields
-///
-enum pre_data_init_fields
-{
- DIMM_TYPE,
- DRAM_GEN,
- HYBRID,
- HYBRID_MEDIA,
- MRANKS,
- DIMM_RANKS_CNFG,
-};
-
-///
-/// @brief Traits for pre_data_engine
-/// @class preDataInitTraits
-/// @tparam T proc_type (e.g. Nimbus, Axone, etc.)
-/// @tparam TT pre_data_init_fields (e.g. DIMM_TYPE, MRANK, etc.)
-///
-template< proc_type T, pre_data_init_fields TT >
-class preDataInitTraits;
-
-///
-/// @brief Helper function for attribute setting
-/// @tparam T processor type (e.g. NIMBUS, AXONE, etc.)
-/// defaulted to NIMBUS
-/// @tparam X size of 1st array index
-/// @tparam Y size of 2nd array index
-/// @tparam TT FAPI2 target type
-/// @tparam IT Input/outpu data type
-/// @param[in] i_target the MCS target
-/// @param[in] i_setting array to set
-/// @param[out] o_data attribute data structure to set
-/// @warning This is Nimbus specific
-///
-template < size_t X, size_t Y, typename IT >
-void data_setter( const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target,
- const IT i_setting,
- IT (&o_data)[X][Y])
-{
- const size_t l_port_index = mss::index( find_target<fapi2::TARGET_TYPE_MCA>(i_target) );
- const size_t l_dimm_index = mss::index(i_target);
-
- o_data[l_port_index][l_dimm_index] = i_setting;
-}
-
-///
-/// @brief Mapping boilerplate check
-/// @tparam T FAPI2 target type
-/// @tparam IT map key type
-/// @tparam OT map value type
-/// @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
-///
-template< fapi2::TargetType T, typename IT, typename OT >
-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;
-}
-
-///
/// @brief Sets preliminary data fields
/// @tparam P processor type (e.g. NIMBUS, AXONE, etc.)
/// @tparam F pre_data_init_fields
@@ -139,18 +64,11 @@ template< proc_type P,
typename IT,
typename TT = preDataInitTraits<P, F>
>
-fapi2::ReturnCode set_field(const fapi2::Target<T>& i_target, const IT i_setting)
+inline fapi2::ReturnCode set_field(const fapi2::Target<T>& i_target,
+ const IT i_setting)
{
- const auto l_target = mss::find_target<TT::TARGET_TYPE>(i_target);
- typename TT::attr_type l_attr_list = {};
- IT l_mapping_value = i_setting;
-
- FAPI_TRY( TT::get_attr(l_target, l_attr_list) );
-
- // Indexing isn't very general
- data_setter(i_target, l_mapping_value, l_attr_list);
-
- FAPI_TRY( TT::set_attr(l_target, l_attr_list) );
+ FAPI_TRY( (set_field<P, TT>(i_target, i_setting)),
+ "Failed set_field() for %s", spd::c_str(i_target) );
fapi_try_exit:
return fapi2::current_err;
@@ -159,9 +77,9 @@ fapi_try_exit:
///
/// @brief Data structure to set pre-effective config data
/// @class pre_data_engine
-/// @tparam T supported processor type (e.g. Nimbus, Axone, etc.)
+/// @tparam P supported processor type (e.g. Nimbus, Axone, etc.)
///
-template< proc_type T >
+template< proc_type P >
class pre_data_engine
{
private:
@@ -197,37 +115,132 @@ class pre_data_engine
/// @brief Set ATTR_EFF_DIMM_TYPE
/// @return FAPI2_RC_SUCCESS iff ok
///
- fapi2::ReturnCode set_dimm_type();
+ fapi2::ReturnCode set_dimm_type()
+ {
+ uint8_t l_base_module_type = 0;
+ uint8_t l_dimm_type = 0;
+
+ FAPI_TRY(iv_spd_data.base_module(l_base_module_type));
+ FAPI_TRY(lookup_table_check(iv_dimm, BASE_MODULE_TYPE_MAP, SET_ATTR_DIMM_TYPE, l_base_module_type, l_dimm_type));
+ FAPI_TRY( (set_field<P, DIMM_TYPE>(iv_dimm, l_dimm_type)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
///
/// @brief Set ATTR_EFF_DRAM_GEN
/// @return FAPI2_RC_SUCCESS iff ok
///
- fapi2::ReturnCode set_dram_gen();
+ fapi2::ReturnCode set_dram_gen()
+ {
+ uint8_t l_device_type = 0;
+ uint8_t l_dram_gen = 0;
+
+ FAPI_TRY(iv_spd_data.device_type(l_device_type));
+ FAPI_TRY(lookup_table_check(iv_dimm, DRAM_GEN_MAP, SET_ATTR_DRAM_GEN, l_device_type, l_dram_gen));
+
+ FAPI_TRY( (set_field<P, DRAM_GEN>(iv_dimm, l_dram_gen)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
+
///
/// @brief Set ATTR_EFF_HYBRID
/// @return FAPI2_RC_SUCCESS iff ok
///
- fapi2::ReturnCode set_hybrid();
+ fapi2::ReturnCode set_hybrid()
+ {
+ uint8_t l_spd_hybrid_type = 0;
+ uint8_t l_hybrid = 0;
+
+ FAPI_TRY(iv_spd_data.hybrid(l_spd_hybrid_type));
+ FAPI_TRY(lookup_table_check(iv_dimm, HYBRID_MAP, SET_ATTR_HYBRID, l_spd_hybrid_type, l_hybrid));
+
+ FAPI_TRY( (set_field<P, HYBRID>(iv_dimm, l_hybrid)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
///
/// @brief Set ATTR_EFF_HYBRID_MEMORY_TYPE
/// @return FAPI2_RC_SUCCESS iff ok
///
- fapi2::ReturnCode set_hybrid_media();
+ fapi2::ReturnCode set_hybrid_media()
+ {
+ uint8_t l_hybrid_media = 0;
+ uint8_t l_spd_hybrid_media = 0;
+
+ FAPI_TRY(iv_spd_data.hybrid_media(l_spd_hybrid_media));
+ FAPI_TRY(lookup_table_check(iv_dimm, HYBRID_MAP, SET_ATTR_HYBRID, l_spd_hybrid_media, l_hybrid_media));
+
+ FAPI_TRY( (set_field<P, HYBRID_MEDIA>(iv_dimm, l_hybrid_media)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
///
/// @brief Set ATTR_EFF_NUM_MASTER_RANKS_PER_DIMM
/// @return FAPI2_RC_SUCCESS iff ok
///
- fapi2::ReturnCode set_master_ranks();
+ fapi2::ReturnCode set_master_ranks()
+ {
+ uint8_t l_master_ranks = 0;
+ FAPI_TRY( get_master_ranks(l_master_ranks) );
+
+ FAPI_TRY( (set_field<P, MRANKS>(iv_dimm, l_master_ranks)) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
///
/// @brief Sets ATTR_EFF_DIMM_RANKS_CONFIGED
/// @return FAPI2_RC_SUCCESS iff okay
///
- fapi2::ReturnCode set_dimm_ranks_configured();
+ fapi2::ReturnCode set_dimm_ranks_configured()
+ {
+ // Set configed ranks. Set the bit representing the master rank configured (0 being left most.) So,
+ // a 4R DIMM would be 0b11110000 (0xF0). This is used by PRD.
+ fapi2::buffer<uint8_t> l_ranks_configed;
+
+ // Make sure the number of master ranks is setup
+ uint8_t l_master_ranks = 0;
+ FAPI_TRY( get_master_ranks(l_master_ranks) );
+
+ FAPI_TRY( l_ranks_configed.setBit(0, l_master_ranks),
+ "%s. Failed to setBit", spd::c_str(iv_dimm) );
+
+ FAPI_TRY( (set_field<P, DIMM_RANKS_CNFG>(iv_dimm, uint8_t(l_ranks_configed))) );
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
+
+ private:
+
+ ///
+ /// @brief Gets master ranks from SPD
+ /// @param[out] o_output num package ranks per DIMM
+ /// @return FAPI2_RC_SUCCESS iff ok
+ ///
+ fapi2::ReturnCode get_master_ranks(uint8_t& o_output)
+ {
+ // Sets up commonly used member variables
+ uint8_t l_master_ranks_spd = 0;
+ FAPI_TRY(iv_spd_data.num_package_ranks_per_dimm(l_master_ranks_spd),
+ "%s failed to get number of package ranks from SPD", spd::c_str(iv_dimm));
+
+ FAPI_TRY(lookup_table_check(iv_dimm, NUM_PACKAGE_RANKS_MAP, PRE_DATA_ENGINE_CTOR, l_master_ranks_spd,
+ o_output), "%s failed MASTER_RANKS lookup check", spd::c_str(iv_dimm));
+
+ fapi_try_exit:
+ return fapi2::current_err;
+ }
};
///
diff --git a/src/import/generic/procedures/xml/error_info/generic_error.xml b/src/import/generic/procedures/xml/error_info/generic_error.xml
index 066c8817a..aaa8edd2b 100644
--- a/src/import/generic/procedures/xml/error_info/generic_error.xml
+++ b/src/import/generic/procedures/xml/error_info/generic_error.xml
@@ -5,7 +5,7 @@
<!-- -->
<!-- OpenPOWER HostBoot Project -->
<!-- -->
-<!-- Contributors Listed Below - COPYRIGHT 2015,2018 -->
+<!-- Contributors Listed Below - COPYRIGHT 2018,2019 -->
<!-- [+] International Business Machines Corp. -->
<!-- -->
<!-- -->
@@ -330,4 +330,72 @@
</callout>
</hwpError>
+ <hwpError>
+ <rc>RC_MSS_UNEXPECTED_VALUE_SEEN</rc>
+ <description> Invalid value seen versus the expected value wanted </description>
+ <ffdc>TARGET</ffdc>
+ <ffdc>EXPECTED</ffdc>
+ <ffdc>ACTUAL</ffdc>
+ <ffdc>FUNCTION</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>LOW</priority>
+ </callout>
+ </hwpError>
+
+ <hwpError>
+ <rc>RC_MSS_OUT_OF_BOUNDS_INDEXING</rc>
+ <description>
+ Desired index is larger than list (std::vector, array, etc.) size.
+ Likely a programming error.
+ </description>
+ <ffdc>TARGET</ffdc>
+ <ffdc>INDEX</ffdc>
+ <ffdc>LIST_SIZE</ffdc>
+ <ffdc>FUNCTION</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>LOW</priority>
+ </callout>
+ </hwpError>
+
+ <hwpError>
+ <rc>RC_MSS_CONVERSION_ERROR</rc>
+ <description>
+ Overflow or underflow occured converting one integral type to another.
+ This is a programming error.
+ </description>
+ <ffdc>TARGET</ffdc>
+ <ffdc>ORIGINAL_VAL</ffdc>
+ <ffdc>CONVERTED_VAL</ffdc>
+ <ffdc>FUNCTION</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>LOW</priority>
+ </callout>
+ </hwpError>
+
+ <hwpError>
+ <rc>RC_MSS_FAILED_DATA_INTEGRITY_CHECK</rc>
+ <description>
+ Bad data received.
+ Settings are incorrect for received data.
+ This could be code problem (decoding) or bad data.
+ </description>
+ <ffdc>VALUE</ffdc>
+ <ffdc>BYTE</ffdc>
+ <ffdc>FFDC_CODE</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>MEDIUM</priority>
+ </callout>
+ <callout>
+ <target>TARGET</target>
+ <priority>HIGH</priority>
+ </callout>
+ <deconfigure>
+ <target>TARGET</target>
+ </deconfigure>
+ </hwpError>
+
</hwpErrors>
OpenPOWER on IntegriCloud