summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Glancy <sglancy@us.ibm.com>2018-01-30 14:34:40 -0600
committerDaniel M. Crowell <dcrowell@us.ibm.com>2018-02-06 23:38:29 -0500
commit9aee6dc5b82ad828006ef12c4742b98a3700b7ba (patch)
tree98938385c08a4b9154955723e8d6f13d3c22f99a
parent862087b9cf1afa120158f97be253ed5b5b5be214 (diff)
downloadtalos-hostboot-9aee6dc5b82ad828006ef12c4742b98a3700b7ba.tar.gz
talos-hostboot-9aee6dc5b82ad828006ef12c4742b98a3700b7ba.zip
Adds plug rule for NVDIMM in specific DIMM slots
NVDIMMs can only be plugged into specific slots on certain systems. This code adds in plug rules to ensure that NVDIMM are only plugged into slots that can support them. Change-Id: Ie54e46bbdf09236c8d6a431dcc41e19af54b9b34 RTC:186541 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/52946 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Louis Stermole <stermole@us.ibm.com> Reviewed-by: ANDRE A. MARIN <aamarin@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: HWSV CI <hwsv-ci+hostboot@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://ralgit01.raleigh.ibm.com/gerrit1/52965 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>
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/eff_config/plug_rules.C64
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/eff_config/plug_rules.H22
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/mss_attribute_accessors.H24
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/mss_attribute_accessors_manual.H3
-rwxr-xr-xsrc/import/chips/p9/procedures/xml/attribute_info/memory_mrw_attributes.xml20
-rw-r--r--src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_plug_rules.xml28
6 files changed, 155 insertions, 6 deletions
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/eff_config/plug_rules.C b/src/import/chips/p9/procedures/hwp/memory/lib/eff_config/plug_rules.C
index 29689c59d..f3230ef8b 100644
--- a/src/import/chips/p9/procedures/hwp/memory/lib/eff_config/plug_rules.C
+++ b/src/import/chips/p9/procedures/hwp/memory/lib/eff_config/plug_rules.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2016,2017 */
+/* Contributors Listed Below - COPYRIGHT 2016,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -27,7 +27,7 @@
/// @file plug_rules.C
/// @brief Enforcement of rules for plugging in DIMM
///
-// *HWP HWP Owner: Jacob L Harvey <jlharvey@us.ibm.com>
+// *HWP HWP Owner: Stephen Glancy <sglancy@us.ibm.com>
// *HWP HWP Backup: Andre Marin <aamarin@us.ibm.com>
// *HWP Team: Memory
// *HWP Level: 3
@@ -160,6 +160,63 @@ fapi_try_exit:
}
///
+/// @brief Helper function to determine if a given DIMM slot can support an NVDIMM
+/// @param[in] const ref to the DIMM target
+/// @param[out] o_is_capable true if the DIMM slot is NVDIMM capable
+/// @return bool FAPI2_RC_SUCCESS iff we pass without errors
+///
+fapi2::ReturnCode dimm_slot_is_nv_capable(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target,
+ bool& o_is_capable)
+{
+ const auto l_pos = mss::pos(i_target);
+
+ fapi2::buffer<uint64_t> l_plug_rules_bitmap = 0;
+
+ FAPI_TRY( mss::mrw_nvdimm_plug_rules(l_plug_rules_bitmap) );
+
+ o_is_capable = l_plug_rules_bitmap.getBit(l_pos);
+
+ FAPI_INF("failed accessing ATTR_MSS_MRW_NVDIMM_PLUG_RULES: 0x%016lx %s capable (target: %s)",
+ l_plug_rules_bitmap, o_is_capable ? "is" : "isn't", mss::c_str(i_target));
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+
+///
+/// @brief Enforces that NVDIMM are plugged in the proper location
+/// @note NVDIMM can only be plugged in locations where the MRW attribute bitmap is set
+/// @param[in] i_target the port
+/// @param[in] i_kinds a vector of DIMM (sorted while processing)
+/// @return fapi2::FAPI2_RC_SUCCESS if okay
+/// @note Expects the kind array to represent the DIMM on the port.
+///
+fapi2::ReturnCode check_nvdimm(const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target,
+ const std::vector<dimm::kind>& i_kinds)
+{
+ fapi2::current_err = fapi2::FAPI2_RC_SUCCESS;
+
+ // Note: NVDIMM + non-NVDIMM mixing is checked in check hybrid
+ for(const auto& l_kind : i_kinds)
+ {
+ bool l_nvdimm_supported = true;
+ FAPI_TRY(dimm_slot_is_nv_capable(l_kind.iv_target, l_nvdimm_supported));
+
+ // We're always good if NVDIMM is supported OR we're not an NVDIMM, otherwise, throw an error
+ FAPI_ASSERT( (l_nvdimm_supported) || (l_kind.iv_hybrid_memory_type != fapi2::ENUM_ATTR_EFF_HYBRID_MEMORY_TYPE_NVDIMM),
+ fapi2::MSS_PLUG_RULES_NVDIMM_PLUG_ERROR()
+ .set_DIMM_TARGET(l_kind.iv_target)
+ .set_DIMM_POS(mss::pos(l_kind.iv_target))
+ .set_MCA_TARGET(i_target),
+ "%s is an NVDIMM plugged into a DIMM slot where NVDIMM are not supported",
+ mss::c_str(l_kind.iv_target) );
+ }
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+
+///
/// @brief Enforce DRAM stack type checks
/// @note No 3DS and non-3DS DIMM's can mix
/// @param[in] i_target the port
@@ -658,6 +715,9 @@ fapi2::ReturnCode plug_rule::enforce_plug_rules(const fapi2::Target<fapi2::TARGE
// Ensures that the port has a valid combination of hybrid DIMM
FAPI_TRY( plug_rule::check_hybrid(i_target, l_dimm_kinds) );
+ // Checks if NVDIMM are properly plugged for this system
+ FAPI_TRY( plug_rule::check_nvdimm(i_target, l_dimm_kinds) );
+
// Checks to see if any DIMM are LRDIMM
FAPI_TRY( plug_rule::code::check_lrdimm(l_dimm_kinds) );
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/eff_config/plug_rules.H b/src/import/chips/p9/procedures/hwp/memory/lib/eff_config/plug_rules.H
index 14ae03d36..aabc7b09f 100644
--- a/src/import/chips/p9/procedures/hwp/memory/lib/eff_config/plug_rules.H
+++ b/src/import/chips/p9/procedures/hwp/memory/lib/eff_config/plug_rules.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2016,2017 */
+/* Contributors Listed Below - COPYRIGHT 2016,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -46,6 +46,15 @@ namespace mss
namespace plug_rule
{
+///
+/// @brief Helper function to determine if a given DIMM slot can support an NVDIMM
+/// @param[in] const ref to the DIMM target
+/// @param[out] o_is_capable true if the DIMM slot is NVDIMM capable
+/// @return bool FAPI2_RC_SUCCESS iff we pass without errors
+///
+fapi2::ReturnCode dimm_slot_is_nv_capable(const fapi2::Target<fapi2::TARGET_TYPE_DIMM>& i_target,
+ bool& o_is_capable);
+
///
/// @brief Enforce the plug-rules per MCS
@@ -182,6 +191,17 @@ fapi2::ReturnCode check_stack_type(const fapi2::Target<fapi2::TARGET_TYPE_MCA>&
fapi2::ReturnCode check_hybrid(const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target,
const std::vector<dimm::kind>& i_kinds);
+///
+/// @brief Enforces that NVDIMM are plugged in the proper location
+/// @note NVDIMM can only be plugged in locations where the MRW attribute bitmap is set
+/// @param[in] i_target the port
+/// @param[in] i_kinds a vector of DIMM (sorted while processing)
+/// @return fapi2::FAPI2_RC_SUCCESS if okay
+/// @note Expects the kind array to represent the DIMM on the port.
+///
+fapi2::ReturnCode check_nvdimm(const fapi2::Target<fapi2::TARGET_TYPE_MCA>& i_target,
+ const std::vector<dimm::kind>& i_kinds);
+
// Adding in code based plug rules - as supporting code gets added, the following checks can be deleted
namespace code
{
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/mss_attribute_accessors.H b/src/import/chips/p9/procedures/hwp/memory/lib/mss_attribute_accessors.H
index 47fbf0e2b..cc580d3e7 100644
--- a/src/import/chips/p9/procedures/hwp/memory/lib/mss_attribute_accessors.H
+++ b/src/import/chips/p9/procedures/hwp/memory/lib/mss_attribute_accessors.H
@@ -21510,6 +21510,30 @@ fapi_try_exit:
return fapi2::current_err;
}
+///
+/// @brief ATTR_MSS_MRW_NVDIMM_PLUG_RULES getter
+/// @param[out] uint64_t& reference to store the value
+/// @note Generated by gen_accessors.pl generateParameters (SYSTEM)
+/// @return fapi2::ReturnCode - FAPI2_RC_SUCCESS iff get is OK
+/// @note A bitmap containing the plug rules for NVDIMM. 1 if a DIMM supports an NVDIMM
+/// being plugged in, 0 if it does not DIMM slot 0 is the left most bit The index to
+/// the bitmap is the position of the DIMM target As such, a bitmap of 0b10010000,
+/// would allow NVDIMM plugged into DIMM0 and DIMM3 Note: this attribute is a 64 bit
+/// number to account for 16 DIMM per processor if there is ever a 4 processor
+/// system
+///
+inline fapi2::ReturnCode mrw_nvdimm_plug_rules(uint64_t& o_value)
+{
+
+ FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_MSS_MRW_NVDIMM_PLUG_RULES, fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(), o_value) );
+ return fapi2::current_err;
+
+fapi_try_exit:
+ FAPI_ERR("failed accessing ATTR_MSS_MRW_NVDIMM_PLUG_RULES: 0x%lx (system target)",
+ uint64_t(fapi2::current_err));
+ return fapi2::current_err;
+}
+
///
/// @brief ATTR_MSS_VPD_MR_0_VERSION_LAYOUT getter
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/mss_attribute_accessors_manual.H b/src/import/chips/p9/procedures/hwp/memory/lib/mss_attribute_accessors_manual.H
index 60c51e9ae..ee405528b 100644
--- a/src/import/chips/p9/procedures/hwp/memory/lib/mss_attribute_accessors_manual.H
+++ b/src/import/chips/p9/procedures/hwp/memory/lib/mss_attribute_accessors_manual.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2016,2017 */
+/* Contributors Listed Below - COPYRIGHT 2016,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -41,6 +41,7 @@
#include <fapi2.H>
#include <generic/memory/lib/utils/find.H>
+#include <lib/mss_attribute_accessors.H>
namespace mss
{
diff --git a/src/import/chips/p9/procedures/xml/attribute_info/memory_mrw_attributes.xml b/src/import/chips/p9/procedures/xml/attribute_info/memory_mrw_attributes.xml
index 163cb8d54..6b4ff1a28 100755
--- a/src/import/chips/p9/procedures/xml/attribute_info/memory_mrw_attributes.xml
+++ b/src/import/chips/p9/procedures/xml/attribute_info/memory_mrw_attributes.xml
@@ -5,7 +5,7 @@
<!-- -->
<!-- OpenPOWER HostBoot Project -->
<!-- -->
-<!-- Contributors Listed Below - COPYRIGHT 2016,2017 -->
+<!-- Contributors Listed Below - COPYRIGHT 2016,2018 -->
<!-- [+] International Business Machines Corp. -->
<!-- -->
<!-- -->
@@ -630,4 +630,22 @@
<enum> ENABLE = 0, DISABLE = 1 </enum>
<mssAccessorName>mrw_memdiags_bcmode</mssAccessorName>
</attribute>
+
+ <attribute>
+ <id>ATTR_MSS_MRW_NVDIMM_PLUG_RULES</id>
+ <targetType>TARGET_TYPE_SYSTEM</targetType>
+ <description>
+ A bitmap containing the plug rules for NVDIMM.
+ 1 if a DIMM supports an NVDIMM being plugged in, 0 if it does not
+ DIMM slot 0 is the left most bit
+ The index to the bitmap is the position of the DIMM target
+ As such, a bitmap of 0b10010000, would allow NVDIMM plugged into DIMM0 and DIMM3
+ Note: this attribute is a 64 bit number to account for 16 DIMM per processor if there is ever a 4 processor system
+ </description>
+ <valueType>uint64</valueType>
+ <platInit/>
+ <default> 0 </default>
+ <enum> NO_NVDIMM = 0, NVDIMM_CAPABLE = 1 </enum>
+ <mssAccessorName>mrw_nvdimm_plug_rules</mssAccessorName>
+ </attribute>
</attributes>
diff --git a/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_plug_rules.xml b/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_plug_rules.xml
index 9c8f265e2..ca7c2fa8d 100644
--- a/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_plug_rules.xml
+++ b/src/import/chips/p9/procedures/xml/error_info/p9_memory_mss_plug_rules.xml
@@ -5,7 +5,7 @@
<!-- -->
<!-- OpenPOWER HostBoot Project -->
<!-- -->
-<!-- Contributors Listed Below - COPYRIGHT 2016,2017 -->
+<!-- Contributors Listed Below - COPYRIGHT 2016,2018 -->
<!-- [+] International Business Machines Corp. -->
<!-- -->
<!-- -->
@@ -163,6 +163,32 @@
</hwpError>
<hwpError>
+ <rc>RC_MSS_PLUG_RULES_NVDIMM_PLUG_ERROR</rc>
+ <description>
+ An NVDIMM was plugged in a slot where NVDIMM's are not supported
+ </description>
+ <ffdc>DIMM_TARGET</ffdc>
+ <ffdc>DIMM_POS</ffdc>
+ <callout>
+ <procedure>MEMORY_PLUGGING_ERROR</procedure>
+ <priority>HIGH</priority>
+ </callout>
+ <callout>
+ <childTargets>
+ <parent>MCA_TARGET</parent>
+ <childType>TARGET_TYPE_DIMM</childType>
+ </childTargets>
+ <priority>MEDIUM</priority>
+ </callout>
+ <deconfigure>
+ <childTargets>
+ <parent>MCA_TARGET</parent>
+ <childType>TARGET_TYPE_DIMM</childType>
+ </childTargets>
+ </deconfigure>
+ </hwpError>
+
+ <hwpError>
<rc>RC_MSS_PLUG_RULES_LRDIMM_UNSUPPORTED</rc>
<description>
The DIMM is an LRDIMM and that is currently not supported
OpenPOWER on IntegriCloud