summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/memory/lib/workarounds
diff options
context:
space:
mode:
authorTsung Yeung <tyeung@us.ibm.com>2018-11-30 15:28:03 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2019-01-18 15:21:12 -0600
commita1ec3238d820ba316f7b34a9639de7e25b7f4a7e (patch)
tree15f9e52ac8af5edc6561a2c5d09e00ffb8ed4676 /src/import/chips/p9/procedures/hwp/memory/lib/workarounds
parent856a7adf6b5097bd4b9bce7a491ebff32fce8803 (diff)
downloadtalos-hostboot-a1ec3238d820ba316f7b34a9639de7e25b7f4a7e.tar.gz
talos-hostboot-a1ec3238d820ba316f7b34a9639de7e25b7f4a7e.zip
P9: NVDIMM SBE Support to Trigger Catastrophic Save
- Adds attribute to indicate which ports contain NVDIMM - Subroutine to trigger CSAVE on ports with NVDIMM Change-Id: I5fc9ead249dda0062ca3ac5237113688a22eb50c CQ:SW452306 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/69314 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@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: PPE CI <ppe-ci+hostboot@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: Sunil Kumar <skumar8j@in.ibm.com> Reviewed-by: Louis Stermole <stermole@us.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/69320 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: Matt Derksen <mderkse1@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/import/chips/p9/procedures/hwp/memory/lib/workarounds')
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/workarounds/nvdimm_workarounds.C206
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/workarounds/nvdimm_workarounds.H87
2 files changed, 293 insertions, 0 deletions
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/workarounds/nvdimm_workarounds.C b/src/import/chips/p9/procedures/hwp/memory/lib/workarounds/nvdimm_workarounds.C
new file mode 100644
index 000000000..a544a193a
--- /dev/null
+++ b/src/import/chips/p9/procedures/hwp/memory/lib/workarounds/nvdimm_workarounds.C
@@ -0,0 +1,206 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/import/chips/p9/procedures/hwp/memory/lib/workarounds/nvdimm_workarounds.C $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2018 */
+/* [+] International Business Machines Corp. */
+/* */
+/* */
+/* Licensed under the Apache License, Version 2.0 (the "License"); */
+/* you may not use this file except in compliance with the License. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+///
+/// @file nvdimm_workarounds.C
+/// @brief Workarounds for NVDIMM
+/// Workarounds are very device specific, so there is no attempt to generalize
+/// this code in any way.
+///
+// *HWP HWP Owner: Tsung Yeung <tyeung@us.ibm.com>
+// *HWP HWP Backup: Stephen Glancy <sglancy@us.ibm.com>
+// *HWP Team: Memory
+// *HWP Level: 3
+// *HWP Consumed by: FSP:HB
+
+#include <fapi2.H>
+#include <vector>
+#include <p9_mc_scom_addresses.H>
+#include <p9_mc_scom_addresses_fld.H>
+
+namespace mss
+{
+
+namespace workarounds
+{
+
+namespace nvdimm
+{
+
+// MBASTR0Q for each MCA
+// Note: Since the scoms are executed at the chip, it needs the dedicated
+// address for each MCA
+const uint64_t MBASTR0Q_REG[] =
+{
+ MCA_0_MBASTR0Q,
+ MCA_1_MBASTR0Q,
+ MCA_2_MBASTR0Q,
+ MCA_3_MBASTR0Q,
+ MCA_4_MBASTR0Q,
+ MCA_5_MBASTR0Q,
+ MCA_6_MBASTR0Q,
+ MCA_7_MBASTR0Q,
+};
+
+// MBARPC0Q for each MCA
+const uint64_t MBARPC0Q_REG[] =
+{
+ MCA_0_MBARPC0Q,
+ MCA_1_MBARPC0Q,
+ MCA_2_MBARPC0Q,
+ MCA_3_MBARPC0Q,
+ MCA_4_MBARPC0Q,
+ MCA_5_MBARPC0Q,
+ MCA_6_MBARPC0Q,
+ MCA_7_MBARPC0Q,
+};
+
+// FARB5Q for each MCA
+const uint64_t FARB5Q_REG[] =
+{
+ MCA_0_MBA_FARB5Q,
+ MCA_1_MBA_FARB5Q,
+ MCA_2_MBA_FARB5Q,
+ MCA_3_MBA_FARB5Q,
+ MCA_4_MBA_FARB5Q,
+ MCA_5_MBA_FARB5Q,
+ MCA_6_MBA_FARB5Q,
+ MCA_7_MBA_FARB5Q,
+};
+
+constexpr uint8_t PORTS_PER_MODULE = 8;
+
+///
+/// @brief Helper for trigger_csave. This subroutine puts the MCA into STR
+/// This is the same thing as mss::nvdimm::self_refresh_entry() but rewritten
+/// to support SBE
+/// @param[in] i_target - PROC_CHIP target
+/// @param[in] l_mca_pos - The MCA position relative to the PROC
+/// @return FAPI2_RC_SUCCESS iff setup was successful
+///
+fapi2::ReturnCode self_refresh_entry( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ const uint8_t l_mca_pos)
+{
+ FAPI_ASSERT((l_mca_pos < PORTS_PER_MODULE),
+ fapi2::MSS_SRE_MCA_OUT_OF_RANGE().
+ set_PROC_TARGET(i_target).
+ set_MCA_POS(l_mca_pos),
+ "Invalid port number %u provided", l_mca_pos);
+
+ FAPI_DBG("Entering STR on port %u.", l_mca_pos);
+
+ {
+ fapi2::buffer<uint64_t> l_mbarpc0_data, l_mbastr0_data;
+ constexpr uint64_t ENABLE = 1;
+ constexpr uint64_t DISABLE = 0;
+ constexpr uint64_t MINALL_MAXALL = 0b000;
+
+ // Step 1 - In MBARPC0Q, disable power domain control, set domain to MAXALL_MINALL,
+ // and enable minimum domain reduction
+ FAPI_TRY(fapi2::getScom(i_target, MBARPC0Q_REG[l_mca_pos], l_mbarpc0_data));
+ l_mbarpc0_data.writeBit<MCA_MBARPC0Q_CFG_MIN_MAX_DOMAINS_ENABLE>(DISABLE);
+ l_mbarpc0_data.insertFromRight<MCA_MBARPC0Q_CFG_MIN_MAX_DOMAINS, MCA_MBARPC0Q_CFG_MIN_MAX_DOMAINS_LEN>(MINALL_MAXALL);
+ l_mbarpc0_data.writeBit<MCA_MBARPC0Q_CFG_MIN_DOMAIN_REDUCTION_ENABLE>(ENABLE);
+ FAPI_TRY(fapi2::putScom(i_target, MBARPC0Q_REG[l_mca_pos], l_mbarpc0_data));
+
+ // Step 2 - In MBASTR0Q, enable STR entry
+ FAPI_TRY(fapi2::getScom(i_target, MBASTR0Q_REG[l_mca_pos], l_mbastr0_data));
+ l_mbastr0_data.writeBit<MCA_MBASTR0Q_CFG_STR_ENABLE>(ENABLE);
+ FAPI_TRY(fapi2::putScom(i_target, MBASTR0Q_REG[l_mca_pos], l_mbastr0_data));
+
+ // Step 3 - In MBARPC0Q, enable power domain control.
+ l_mbarpc0_data.writeBit<MCA_MBARPC0Q_CFG_MIN_MAX_DOMAINS_ENABLE>(ENABLE);
+ FAPI_TRY(fapi2::putScom(i_target, MBARPC0Q_REG[l_mca_pos], l_mbarpc0_data));
+ }
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+
+///
+/// @brief Helper for trigger_csave. This subroutine assert RESET_n to trigger
+/// the backup on nvdimm
+/// @param[in] i_target - PROC_CHIP targetdefine
+/// @param[in] l_mca_pos - The MCA position relative to the PROC
+/// @return FAPI2_RC_SUCCESS iff setup was successful
+///
+fapi2::ReturnCode assert_resetn( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target, const uint8_t l_mca_pos)
+{
+ FAPI_ASSERT((l_mca_pos < PORTS_PER_MODULE),
+ fapi2::MSS_RESETN_MCA_OUT_OF_RANGE().
+ set_PROC_TARGET(i_target).
+ set_MCA_POS(l_mca_pos),
+ "Invalid port number %u provided", l_mca_pos);
+
+ FAPI_DBG("Asserting RESETn on port %d.", l_mca_pos);
+
+ {
+ fapi2::buffer<uint64_t> l_farb5q_data;
+ constexpr uint64_t LOW = 0;
+
+ FAPI_TRY(fapi2::getScom(i_target, FARB5Q_REG[l_mca_pos], l_farb5q_data));
+ l_farb5q_data.writeBit<MCA_MBA_FARB5Q_CFG_DDR_RESETN>(LOW);
+ FAPI_TRY(fapi2::putScom(i_target, FARB5Q_REG[l_mca_pos], l_farb5q_data));
+ }
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+
+///
+/// @brief Triggers csave on NVDIMM. This subroutine reads ATTR_SBE_NVDIMM_IN_PORT
+/// and fires the trigger to all the ports with NVDIMM plugged. This is written
+/// specifically for SBE.
+/// @param[in] i_target - PROC_CHIP target
+/// @return FAPI2_RC_SUCCESS iff setup was successful
+///
+fapi2::ReturnCode trigger_csave( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target )
+{
+ fapi2::buffer<uint8_t> l_nvdimm_port_bitmap = 0;
+
+ FAPI_TRY( FAPI_ATTR_GET(fapi2::ATTR_SBE_NVDIMM_IN_PORT, i_target, l_nvdimm_port_bitmap) );
+
+ for (uint8_t l_mca_pos = 0; l_mca_pos < PORTS_PER_MODULE; l_mca_pos++)
+ {
+ if (l_nvdimm_port_bitmap.getBit(l_mca_pos) == fapi2::ENUM_ATTR_SBE_NVDIMM_IN_PORT_YES)
+ {
+ FAPI_DBG("NVDIMM found in port %d ", l_mca_pos);
+
+ // Enter STR
+ FAPI_TRY(self_refresh_entry(i_target, l_mca_pos));
+
+ // Assert ddr_resetn
+ FAPI_TRY(assert_resetn(i_target, l_mca_pos));
+ }
+ }
+
+fapi_try_exit:
+ return fapi2::current_err;
+}
+
+}//ns nvdimm
+
+}//ns workarounds
+
+}//ns mss
diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/workarounds/nvdimm_workarounds.H b/src/import/chips/p9/procedures/hwp/memory/lib/workarounds/nvdimm_workarounds.H
new file mode 100644
index 000000000..a5d1b4a07
--- /dev/null
+++ b/src/import/chips/p9/procedures/hwp/memory/lib/workarounds/nvdimm_workarounds.H
@@ -0,0 +1,87 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/import/chips/p9/procedures/hwp/memory/lib/workarounds/nvdimm_workarounds.H $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2018 */
+/* [+] International Business Machines Corp. */
+/* */
+/* */
+/* Licensed under the Apache License, Version 2.0 (the "License"); */
+/* you may not use this file except in compliance with the License. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+///
+/// @file nvdimm_workarounds.H
+/// @brief Workarounds for NVDIMM
+/// Workarounds are very device specific, so there is no attempt to generalize
+/// this code in any way.
+///
+// *HWP HWP Owner: Tsung Yeung <tyeung@us.ibm.com>
+// *HWP HWP Backup: Stephen Glancy <sglancy@us.ibm.com>
+// *HWP Team: Memory
+// *HWP Level: 3
+// *HWP Consumed by: FSP:HB
+
+#ifndef _MSS_WORKAROUNDS_NVDIMM_H_
+#define _MSS_WORKAROUNDS_NVDIMM_H_
+
+#include <fapi2.H>
+
+namespace mss
+{
+
+namespace workarounds
+{
+
+namespace nvdimm
+{
+
+// Function pointer for HWP support in PPE
+typedef fapi2::ReturnCode (*p9_flush_nvdimm_FP_t) (const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target);
+
+///
+/// @brief Triggers csave on NVDIMM. This subroutine reads ATTR_SBE_NVDIMM_IN_PORT
+/// and fires the trigger to all the ports with NVDIMM plugged. This is written
+/// specifically for SBE.
+/// @param[in] i_target - PROC_CHIP target
+/// @return FAPI2_RC_SUCCESS iff setup was successful
+///
+
+fapi2::ReturnCode trigger_csave( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target );
+
+///
+/// @brief Helper for trigger_csave. This subroutine assert RESET_n to trigger
+/// the backup on nvdimm
+/// @param[in] i_target - PROC_CHIP target
+/// @param[in] l_mca_pos - The MCA position relative to the PROC
+/// @return FAPI2_RC_SUCCESS iff setup was successful
+///
+
+fapi2::ReturnCode assert_resetn( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target, uint8_t l_mca_pos);
+
+///
+/// @brief Helper for trigger_csave. This subroutine puts the MCA into STR
+/// @param[in] i_target - PROC_CHIP target
+/// @param[in] l_mca_pos - The MCA position relative to the PROC
+/// @return FAPI2_RC_SUCCESS iff setup was successful
+///
+
+fapi2::ReturnCode self_refresh_entry( const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target, uint8_t l_mca_pos);
+
+}//ns nvdimm
+}//ns workarounds
+}//ns mss
+
+#endif
OpenPOWER on IntegriCloud