summaryrefslogtreecommitdiffstats
path: root/src/import/chips/ocmb/explorer/procedures/hwp/memory
diff options
context:
space:
mode:
authorMatthew Hickman <Matthew.Hickman@ibm.com>2019-02-13 12:00:58 -0600
committerChristian R. Geddes <crgeddes@us.ibm.com>2019-06-24 23:12:20 -0500
commit428f5e2c632ee3a991593c7b8dc17f2fb03cc11d (patch)
treef3a13d255073bb1c781875619ad24788e6154d16 /src/import/chips/ocmb/explorer/procedures/hwp/memory
parentca414b982877404df7528f9449d4b6690dab3f6b (diff)
downloadtalos-hostboot-428f5e2c632ee3a991593c7b8dc17f2fb03cc11d.tar.gz
talos-hostboot-428f5e2c632ee3a991593c7b8dc17f2fb03cc11d.zip
Ported ecc engine to generic
Change-Id: Icd8034fd8a0a58874bf79f72392cdc737c5af99e Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/71828 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Tested-by: HWSV CI <hwsv-ci+hostboot@us.ibm.com> Reviewed-by: STEPHEN GLANCY <sglancy@us.ibm.com> Reviewed-by: Louis Stermole <stermole@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: Mark Pizzutillo <mark.pizzutillo@ibm.com> Reviewed-by: Jennifer A Stofer <stofer@us.ibm.com> Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/76179 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
Diffstat (limited to 'src/import/chips/ocmb/explorer/procedures/hwp/memory')
-rw-r--r--src/import/chips/ocmb/explorer/procedures/hwp/memory/exp_draminit.C1
-rw-r--r--src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/ecc_traits.H96
-rw-r--r--src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/ecc_traits_explorer.C47
-rw-r--r--src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/ecc_traits_explorer.H273
-rw-r--r--src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/exp_mbs_error_vector_trap.H181
-rw-r--r--src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/exp_modal_symbol_count.H221
-rw-r--r--src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_address.H2
-rw-r--r--src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_mcbist.H2
-rw-r--r--src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_memdiags.H1
-rw-r--r--src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_settings.H2
-rw-r--r--src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/shared/exp_consts.H3
11 files changed, 727 insertions, 102 deletions
diff --git a/src/import/chips/ocmb/explorer/procedures/hwp/memory/exp_draminit.C b/src/import/chips/ocmb/explorer/procedures/hwp/memory/exp_draminit.C
index 046a6252f..1a7abba82 100644
--- a/src/import/chips/ocmb/explorer/procedures/hwp/memory/exp_draminit.C
+++ b/src/import/chips/ocmb/explorer/procedures/hwp/memory/exp_draminit.C
@@ -35,7 +35,6 @@
#include <lib/shared/exp_consts.H>
#include <exp_inband.H>
-#include <lib/shared/exp_consts.H>
#include <generic/memory/lib/utils/c_str.H>
#include <generic/memory/lib/utils/mss_bad_bits.H>
#include <lib/exp_draminit_utils.H>
diff --git a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/ecc_traits.H b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/ecc_traits.H
deleted file mode 100644
index 6e9ec86d5..000000000
--- a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/ecc_traits.H
+++ /dev/null
@@ -1,96 +0,0 @@
-/* IBM_PROLOG_BEGIN_TAG */
-/* This is an automatically generated prolog. */
-/* */
-/* $Source: src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/ecc_traits.H $ */
-/* */
-/* OpenPOWER HostBoot Project */
-/* */
-/* Contributors Listed Below - COPYRIGHT 2019 */
-/* [+] 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 ecc_traits_explorer.H
-/// @brief Traits class for the MC ECC syndrome registers
-///
-// *HWP HWP Owner: Louis Stermole <stermole@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_ECC_TRAITS_EXPLORER_H_
-#define _MSS_ECC_TRAITS_EXPLORER_H_
-
-#include <explorer_scom_addresses.H>
-#include <explorer_scom_addresses_fld.H>
-
-
-namespace mss
-{
-
-///
-/// @class eccTraits
-/// @brief a collection of traits associated with the MC ECC interface
-/// @tparam T fapi2::TargetType representing the memory controller
-///
-template< fapi2::TargetType T >
-class eccTraits;
-
-///
-/// @class eccTraits
-/// @brief a collection of traits associated with the OCMB explorer MC ECC interface
-///
-// TODO: Need to implement this
-template<>
-class eccTraits<fapi2::TARGET_TYPE_MEM_PORT>
-{
-
- public:
- // Fields, can be any size.
- enum
- {
- FIRMWARE_MS_ADDRESS = EXPLR_RDF_FWMS0_ADDRESS,
- FIRMWARE_MS_ADDRESS_LEN = EXPLR_RDF_FWMS0_ADDRESS_LEN,
-
- // Address trap format
- TRAP_ADDRESS_PORT = 0,
- TRAP_ADDRESS_PORT_LEN = 0,
- TRAP_ADDRESS_DIMM = 1,
- TRAP_ADDRESS_DIMM_LEN = 1,
- TRAP_ADDRESS_MRANK = 2,
- TRAP_ADDRESS_MRANK_LEN = 2,
- TRAP_ADDRESS_SRANK = 4,
- TRAP_ADDRESS_SRANK_LEN = 3,
- TRAP_ADDRESS_ROW = 7,
- TRAP_ADDRESS_ROW_LEN = 18,
- TRAP_ADDRESS_COL = 25,
- // MCBIST address only need col(3 to 9) although address trap can provide col(2 to 9)
- TRAP_ADDRESS_COL_LEN = 7,
- TRAP_ADDRESS_BANK = 33,
- TRAP_ADDRESS_BANK_LEN = 3,
- TRAP_ADDRESS_BANK_GROUP = 36,
- TRAP_ADDRESS_BANK_GROUP_LEN = 2,
-
- TRAP_ADDRESS = 0,
- TRAP_ADDRESS_LEN = 38,
- };
-};
-
-} // close namespace mss
-
-#endif
diff --git a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/ecc_traits_explorer.C b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/ecc_traits_explorer.C
index f5bb7b342..0ad650036 100644
--- a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/ecc_traits_explorer.C
+++ b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/ecc_traits_explorer.C
@@ -22,3 +22,50 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
+
+///
+/// @file ecc_traits_explorer.C
+/// @brief Traits class for the MC ECC syndrome registers
+///
+// *HWP HWP Owner: Matthew Hickman<Matthew.Hickman@ibm.com>
+// *HWP HWP Backup: Louis Stermole <stermole@us.ibm.com>
+// *HWP Team: Memory
+// *HWP Level: 3
+// *HWP Consumed by: FSP:HB
+
+#include <fapi2.H>
+#include <explorer_scom_addresses.H>
+#include <explorer_scom_addresses_fld.H>
+#include <chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/ecc_traits_explorer.H>
+
+
+namespace mss
+{
+
+// we need these declarations here in order for the linker to see the definitions
+// in the eccTraits class
+constexpr const uint64_t eccTraits<mc_type::EXPLORER, fapi2::TARGET_TYPE_MEM_PORT>::MAINLINE_NCE_REGS[];
+constexpr const uint64_t eccTraits<mc_type::EXPLORER, fapi2::TARGET_TYPE_MEM_PORT>::MAINLINE_RCE_REGS[];
+constexpr const uint64_t eccTraits<mc_type::EXPLORER, fapi2::TARGET_TYPE_MEM_PORT>::MAINLINE_MPE_REGS[];
+constexpr const uint64_t eccTraits<mc_type::EXPLORER, fapi2::TARGET_TYPE_MEM_PORT>::MAINLINE_UE_REGS[];
+constexpr const uint64_t eccTraits<mc_type::EXPLORER, fapi2::TARGET_TYPE_MEM_PORT>::MAINLINE_AUE_REGS[];
+constexpr const uint64_t eccTraits<mc_type::EXPLORER, fapi2::TARGET_TYPE_MEM_PORT>::ERROR_VECTOR_REGS[];
+constexpr const uint8_t eccTraits<mc_type::EXPLORER, fapi2::TARGET_TYPE_MEM_PORT>::symbol2galois[];
+constexpr const uint8_t eccTraits<mc_type::EXPLORER, fapi2::TARGET_TYPE_MEM_PORT>::symbol2dq[];
+
+// Definition of the symbol error count registers for Explorer
+const std::vector< uint64_t > eccTraits<mc_type::EXPLORER, fapi2::TARGET_TYPE_OCMB_CHIP>::SYMBOL_COUNT_REG =
+{
+ EXPLR_MCBIST_MBSSYMEC0Q,
+ EXPLR_MCBIST_MBSSYMEC1Q,
+ EXPLR_MCBIST_MBSSYMEC2Q,
+ EXPLR_MCBIST_MBSSYMEC3Q,
+ EXPLR_MCBIST_MBSSYMEC4Q,
+ EXPLR_MCBIST_MBSSYMEC5Q,
+ EXPLR_MCBIST_MBSSYMEC6Q,
+ EXPLR_MCBIST_MBSSYMEC7Q,
+ EXPLR_MCBIST_MBSSYMEC8Q,
+ EXPLR_MCBIST_MBSSYMEC9Q,
+};
+
+} // close namespace mss
diff --git a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/ecc_traits_explorer.H b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/ecc_traits_explorer.H
index 9eb24ec19..6ef32aa63 100644
--- a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/ecc_traits_explorer.H
+++ b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/ecc_traits_explorer.H
@@ -22,3 +22,276 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
+
+///
+/// @file ecc_traits_explorer.H
+/// @brief Traits class for the MC ECC syndrome registers
+///
+// *HWP HWP Owner: Matt Hickman <Matthew.Hickman@ibm.com>
+// *HWP HWP Backup: Louis Stermole <stermole@us.ibm.com>
+// *HWP Team: Memory
+// *HWP Level: 3
+// *HWP Consumed by: FSP:HB
+
+#ifndef _MSS_ECC_TRAITS_EXPLORER_H_
+#define _MSS_ECC_TRAITS_EXPLORER_H_
+
+#include <explorer_scom_addresses.H>
+#include <explorer_scom_addresses_fld.H>
+#include <explorer_scom_addresses_fixes.H>
+#include <explorer_scom_addresses_fld_fixes.H>
+#include <generic/memory/lib/ecc/ecc_traits.H>
+#include <lib/shared/exp_consts.H>
+
+namespace mss
+{
+
+///
+/// @class eccTraits
+/// @brief a collection of traits associated with the Axone Mem Port ECC interface
+///
+template<>
+class eccTraits<mc_type::EXPLORER, fapi2::TARGET_TYPE_MEM_PORT>
+{
+ public:
+ // MCA ECC registers - must be 64 bits.
+ static constexpr uint64_t HARDWARE_MS0_REG = EXPLR_RDF_HWMS0;
+ static constexpr uint64_t HARDWARE_MS1_REG = EXPLR_RDF_HWMS1;
+ static constexpr uint64_t HARDWARE_MS2_REG = EXPLR_RDF_HWMS2;
+ static constexpr uint64_t HARDWARE_MS3_REG = EXPLR_RDF_HWMS3;
+ static constexpr uint64_t HARDWARE_MS4_REG = EXPLR_RDF_HWMS4;
+ static constexpr uint64_t HARDWARE_MS5_REG = EXPLR_RDF_HWMS5;
+ static constexpr uint64_t HARDWARE_MS6_REG = EXPLR_RDF_HWMS6;
+ static constexpr uint64_t HARDWARE_MS7_REG = EXPLR_RDF_HWMS7;
+ static constexpr uint64_t FIRMWARE_MS0_REG = EXPLR_RDF_FWMS0;
+ static constexpr uint64_t FIRMWARE_MS1_REG = EXPLR_RDF_FWMS1;
+ static constexpr uint64_t FIRMWARE_MS2_REG = EXPLR_RDF_FWMS2;
+ static constexpr uint64_t FIRMWARE_MS3_REG = EXPLR_RDF_FWMS3;
+ static constexpr uint64_t FIRMWARE_MS4_REG = EXPLR_RDF_FWMS4;
+ static constexpr uint64_t FIRMWARE_MS5_REG = EXPLR_RDF_FWMS5;
+ static constexpr uint64_t FIRMWARE_MS6_REG = EXPLR_RDF_FWMS6;
+ static constexpr uint64_t FIRMWARE_MS7_REG = EXPLR_RDF_FWMS7;
+ static constexpr uint64_t MARK_SHADOW_REG = EXPLR_RDF_MSR;
+ static constexpr uint64_t ECC_MAX_MRANK_PER_PORT = exp::MAX_MRANK_PER_PORT;
+ static constexpr uint64_t ECC_MAX_DQ_BITS = exp::MAX_DQ_BITS_PER_PORT;
+ static constexpr uint64_t ECC_MAX_SYMBOLS = exp::MAX_SYMBOLS_PER_PORT;
+
+
+ // MCBIST ECC registers - Register API uses an MEMPORT target instead
+ // of MCBIST since MEMPORT's relative position is needed to find
+ // correct reg+field
+ constexpr static const uint64_t MAINLINE_NCE_REGS[] =
+ {
+ EXPLR_MCBIST_MBNCER0Q,
+ };
+
+ constexpr static const uint64_t MAINLINE_RCE_REGS[] =
+ {
+ EXPLR_MCBIST_MBRCER0Q,
+ };
+
+ constexpr static const uint64_t MAINLINE_MPE_REGS[] =
+ {
+ EXPLR_MCBIST_MBMPER0Q,
+ };
+
+ constexpr static const uint64_t MAINLINE_UE_REGS[] =
+ {
+ EXPLR_MCBIST_MBUER0Q,
+ };
+
+ constexpr static const uint64_t MAINLINE_AUE_REGS[] =
+ {
+ EXPLR_MCBIST_MBAUER0Q,
+ };
+
+ constexpr static const uint64_t ERROR_VECTOR_REGS[] =
+ {
+ EXPLR_MCBIST_MBSEVR0Q,
+ };
+
+ // Fields, can be any size.
+ enum
+ {
+ HARDWARE_MS_CHIPMARK = EXPLR_RDF_HWMS0_CHIPMARK,
+ HARDWARE_MS_CHIPMARK_LEN = EXPLR_RDF_HWMS0_CHIPMARK_LEN,
+ HARDWARE_MS_CONFIRMED = EXPLR_RDF_HWMS0_CONFIRMED,
+ HARDWARE_MS_EXIT1 = EXPLR_RDF_HWMS0_EXIT_1,
+ FIRMWARE_MS_MARK = EXPLR_RDF_FWMS0_MARK,
+ FIRMWARE_MS_MARK_LEN = EXPLR_RDF_FWMS0_MARK_LEN,
+ FIRMWARE_MS_TYPE = EXPLR_RDF_FWMS0_TYPE,
+ FIRMWARE_MS_REGION = EXPLR_RDF_FWMS0_REGION,
+ FIRMWARE_MS_REGION_LEN = EXPLR_RDF_FWMS0_REGION_LEN,
+ FIRMWARE_MS_ADDRESS = EXPLR_RDF_FWMS0_ADDRESS,
+ FIRMWARE_MS_ADDRESS_LEN = EXPLR_RDF_FWMS0_ADDRESS_LEN,
+ FIRMWARE_MS_EXIT1 = EXPLR_RDF_FWMS0_EXIT_1,
+ NCE_ADDR_TRAP = EXPLR_MCBIST_MBNCER0Q_PORT_0_MAINLINE_NCE_ADDR_TRAP,
+ NCE_ADDR_TRAP_LEN = EXPLR_MCBIST_MBNCER0Q_PORT_0_MAINLINE_NCE_ADDR_TRAP_LEN,
+ NCE_ON_RCE = EXPLR_MCBIST_MBNCER0Q_PORT_0_MAINLINE_NCE_ON_RCE,
+ NCE_IS_TCE = EXPLR_MCBIST_MBNCER0Q_PORT_0_MAINLINE_NCE_IS_TCE,
+ RCE_ADDR_TRAP = EXPLR_MCBIST_MBRCER0Q_PORT_0_MAINLINE_RCE_ADDR_TRAP,
+ RCE_ADDR_TRAP_LEN = EXPLR_MCBIST_MBRCER0Q_PORT_0_MAINLINE_RCE_ADDR_TRAP_LEN,
+ MPE_ADDR_TRAP = EXPLR_MCBIST_MBMPER0Q_PORT_0_MAINLINE_MPE_ADDR_TRAP,
+ MPE_ADDR_TRAP_LEN = EXPLR_MCBIST_MBMPER0Q_PORT_0_MAINLINE_MPE_ADDR_TRAP_LEN,
+ MPE_ON_RCE = EXPLR_MCBIST_MBMPER0Q_PORT_0_MAINLINE_MPE_ON_RCE,
+ UE_ADDR_TRAP = EXPLR_MCBIST_MBUER0Q_PORT_0_MAINLINE_UE_ADDR_TRAP,
+ UE_ADDR_TRAP_LEN = EXPLR_MCBIST_MBUER0Q_PORT_0_MAINLINE_UE_ADDR_TRAP_LEN,
+ AUE_ADDR_TRAP = EXPLR_MCBIST_MBAUER0Q_PORT_0_MAINLINE_AUE_ADDR_TRAP,
+ AUE_ADDR_TRAP_LEN = EXPLR_MCBIST_MBAUER0Q_PORT_0_MAINLINE_AUE_ADDR_TRAP_LEN,
+ P0_NCE_GALOIS = EXPLR_MCBIST_MBSEVR0Q_PORT_0_MAINLINE_NCE_GALOIS_FIELD,
+ P0_NCE_GALOIS_LEN = EXPLR_MCBIST_MBSEVR0Q_PORT_0_MAINLINE_NCE_GALOIS_FIELD_LEN,
+ P0_NCE_MAGNITUDE = EXPLR_MCBIST_MBSEVR0Q_PORT_0_MAINLINE_NCE_MAGNITUDE_FIELD,
+ P0_NCE_MAGNITUDE_LEN = EXPLR_MCBIST_MBSEVR0Q_PORT_0_MAINLINE_NCE_MAGNITUDE_FIELD_LEN,
+ P0_TCE_GALOIS = EXPLR_MCBIST_MBSEVR0Q_PORT_0_MAINLINE_TCE_GALOIS_FIELD,
+ P0_TCE_GALOIS_LEN = EXPLR_MCBIST_MBSEVR0Q_PORT_0_MAINLINE_TCE_GALOIS_FIELD_LEN,
+ P0_TCE_MAGNITUDE = EXPLR_MCBIST_MBSEVR0Q_PORT_0_MAINLINE_TCE_MAGNITUDE_FIELD,
+ P0_TCE_MAGNITUDE_LEN = EXPLR_MCBIST_MBSEVR0Q_PORT_0_MAINLINE_TCE_MAGNITUDE_FIELD_LEN,
+ CURRENT_ADDR_TRAP = EXPLR_MCBIST_MCBMCATQ_CFG_CURRENT_ADDR_TRAP,
+ CURRENT_ADDR_TRAP_LEN = EXPLR_MCBIST_MCBMCATQ_CFG_CURRENT_ADDR_TRAP_LEN,
+ CURRENT_PORT = EXPLR_MCBIST_MCBMCATQ_CFG_CURRENT_PORT_TRAP,
+ CURRENT_PORT_LEN = EXPLR_MCBIST_MCBMCATQ_CFG_CURRENT_PORT_TRAP_LEN,
+ CURRENT_DIMM = EXPLR_MCBIST_MCBMCATQ_CFG_CURRENT_DIMM_TRAP,
+ SHADOW_CHIPMARK = EXPLR_RDF_MSR_CHIPMARK,
+ SHADOW_CHIPMARK_LEN = EXPLR_RDF_MSR_CHIPMARK_LEN,
+ SHADOW_RANK = EXPLR_RDF_MSR_RANK,
+ SHADOW_RANK_LEN = EXPLR_RDF_MSR_RANK_LEN,
+
+ };
+
+ // Symbol to Galois code mapping table for Explorer
+ constexpr static const uint8_t symbol2galois[] =
+ {
+ 0x80, 0xa0, 0x90, 0xf0,
+ 0x08, 0x0a, 0x09, 0x0f,
+ 0x98, 0xda, 0xb9, 0x7f,
+ 0x91, 0xd7, 0xb2, 0x78,
+ 0x28, 0xea, 0x49, 0x9f,
+ 0x9a, 0xd4, 0xbd, 0x76,
+ 0x60, 0xb0, 0xc0, 0x20,
+ 0x06, 0x0b, 0x0c, 0x02,
+ 0xc6, 0xfb, 0x1c, 0x42,
+ 0xca, 0xf4, 0x1d, 0x46,
+ 0xd6, 0x8b, 0x3c, 0xc2,
+ 0xcb, 0xf3, 0x1f, 0x4e,
+ 0xe0, 0x10, 0x50, 0xd0,
+ 0x0e, 0x01, 0x05, 0x0d,
+ 0x5e, 0x21, 0xa5, 0x3d,
+ 0x5b, 0x23, 0xaf, 0x3e,
+ 0xfe, 0x61, 0x75, 0x5d,
+ 0x51, 0x27, 0xa2, 0x38
+ };
+
+ // Symbol to DQ index mapping table for Explorer
+ constexpr static const uint8_t symbol2dq[] =
+ {
+ 39, 38, 37, 36,
+ 35, 34, 33, 32,
+ 79, 78, 77, 76,
+ 71, 70, 69, 68,
+ 63, 62, 61, 60,
+ 55, 54, 53, 52,
+ 31, 30, 29, 28,
+ 23, 22, 21, 20,
+ 15, 14, 13, 12,
+ 7, 6, 5, 4,
+ 75, 74, 73, 72,
+ 67, 66, 65, 64,
+ 59, 58, 57, 56,
+ 51, 50, 49, 48,
+ 27, 26, 25, 24,
+ 19, 18, 17, 16,
+ 11, 10, 9, 8,
+ 3, 2, 1, 0
+ };
+
+};
+
+///
+/// @class eccTraits
+/// @brief a collection of traits associated with the Axone MC ECC interface
+///
+template<>
+class eccTraits<mc_type::EXPLORER, fapi2::TARGET_TYPE_OCMB_CHIP>
+{
+ public:
+ // MCBIST ECC registers - must be 64 bits.
+ static constexpr uint64_t READ_ERROR_COUNT_REG0 = EXPLR_MCBIST_MBSEC0Q;
+ static constexpr uint64_t READ_ERROR_COUNT_REG1 = EXPLR_MCBIST_MBSEC1Q;
+ static constexpr uint64_t MARK_SYMBOL_COUNT_REG = EXPLR_MCBIST_MBSMSECQ;
+ static constexpr uint64_t MODAL_SYM_COUNT0_REG = EXPLR_MCBIST_MBSSYMEC0Q;
+ static constexpr uint64_t MODAL_SYM_COUNT1_REG = EXPLR_MCBIST_MBSSYMEC1Q;
+ static constexpr uint64_t MODAL_SYM_COUNT2_REG = EXPLR_MCBIST_MBSSYMEC2Q;
+ static constexpr uint64_t MODAL_SYM_COUNT3_REG = EXPLR_MCBIST_MBSSYMEC3Q;
+ static constexpr uint64_t MODAL_SYM_COUNT4_REG = EXPLR_MCBIST_MBSSYMEC4Q;
+ static constexpr uint64_t MODAL_SYM_COUNT5_REG = EXPLR_MCBIST_MBSSYMEC5Q;
+ static constexpr uint64_t MODAL_SYM_COUNT6_REG = EXPLR_MCBIST_MBSSYMEC6Q;
+ static constexpr uint64_t MODAL_SYM_COUNT7_REG = EXPLR_MCBIST_MBSSYMEC7Q;
+ static constexpr uint64_t MODAL_SYM_COUNT8_REG = EXPLR_MCBIST_MBSSYMEC8Q;
+ static constexpr uint64_t MODAL_SYM_COUNT9_REG = EXPLR_MCBIST_MBSSYMEC9Q;
+ static constexpr uint64_t MPE_ADDR_TRAP_REG = EXPLR_MCBIST_MCBMCATQ;
+ static constexpr uint64_t ECC_MAX_MRANK_PER_PORT = exp::MAX_MRANK_PER_PORT;
+ static constexpr uint64_t ECC_MAX_DQ_BITS = exp::MAX_DQ_BITS_PER_PORT;
+ static constexpr uint64_t ECC_MAX_SYMBOLS = exp::MAX_SYMBOLS_PER_PORT;
+
+ // Stores the symbol counter registers in a vector for easier access for MCBIST
+ static const std::vector<uint64_t> SYMBOL_COUNT_REG;
+
+ // Fields, can be any size.
+ enum
+ {
+ INTERMITTENT_CE_COUNT = EXPLR_MCBIST_MBSEC0Q_INTERMITTENT_CE_COUNT,
+ INTERMITTENT_CE_COUNT_LEN = EXPLR_MCBIST_MBSEC0Q_INTERMITTENT_CE_COUNT_LEN,
+ SOFT_CE_COUNT = EXPLR_MCBIST_MBSEC0Q_SOFT_CE_COUNT,
+ SOFT_CE_COUNT_LEN = EXPLR_MCBIST_MBSEC0Q_SOFT_CE_COUNT_LEN,
+ HARD_CE_COUNT = EXPLR_MCBIST_MBSEC0Q_HARD_CE_COUNT,
+ HARD_CE_COUNT_LEN = EXPLR_MCBIST_MBSEC0Q_HARD_CE_COUNT_LEN,
+ INTERMITTENT_MCE_COUNT = EXPLR_MCBIST_MBSEC0Q_INTERMITTENT_MCE_COUNT,
+ INTERMITTENT_MCE_COUNT_LEN = EXPLR_MCBIST_MBSEC0Q_INTERMITTENT_MCE_COUNT_LEN,
+ SOFT_MCE_COUNT = EXPLR_MCBIST_MBSEC0Q_SOFT_MCE_COUNT,
+ SOFT_MCE_COUNT_LEN = EXPLR_MCBIST_MBSEC0Q_SOFT_MCE_COUNT_LEN,
+ HARD_MCE_COUNT = EXPLR_MCBIST_MBSEC1Q_HARD_MCE_COUNT,
+ HARD_MCE_COUNT_LEN = EXPLR_MCBIST_MBSEC1Q_HARD_MCE_COUNT_LEN,
+ ICE_COUNT = EXPLR_MCBIST_MBSEC1Q_ICE_COUNT,
+ ICE_COUNT_LEN = EXPLR_MCBIST_MBSEC1Q_ICE_COUNT_LEN,
+ UE_COUNT = EXPLR_MCBIST_MBSEC1Q_UE_COUNT,
+ UE_COUNT_LEN = EXPLR_MCBIST_MBSEC1Q_UE_COUNT_LEN,
+ AUE_COUNT = EXPLR_MCBIST_MBSEC1Q_AUE,
+ AUE_COUNT_LEN = EXPLR_MCBIST_MBSEC1Q_AUE_LEN,
+ RCE_COUNT = EXPLR_MCBIST_MBSEC1Q_RCE_COUNT,
+ RCE_COUNT_LEN = EXPLR_MCBIST_MBSEC1Q_RCE_COUNT_LEN,
+ SYMBOL0_COUNT = EXPLR_MCBIST_MBSMSECQ_MCE_SYMBOL0_COUNT,
+ SYMBOL0_COUNT_LEN = EXPLR_MCBIST_MBSMSECQ_MCE_SYMBOL0_COUNT_LEN,
+ SYMBOL1_COUNT = EXPLR_MCBIST_MBSMSECQ_MCE_SYMBOL1_COUNT,
+ SYMBOL1_COUNT_LEN = EXPLR_MCBIST_MBSMSECQ_MCE_SYMBOL1_COUNT_LEN,
+ SYMBOL2_COUNT = EXPLR_MCBIST_MBSMSECQ_MCE_SYMBOL2_COUNT,
+ SYMBOL2_COUNT_LEN = EXPLR_MCBIST_MBSMSECQ_MCE_SYMBOL2_COUNT_LEN,
+ SYMBOL3_COUNT = EXPLR_MCBIST_MBSMSECQ_MCE_SYMBOL3_COUNT,
+ SYMBOL3_COUNT_LEN = EXPLR_MCBIST_MBSMSECQ_MCE_SYMBOL3_COUNT_LEN,
+ MODAL_SYMBOL_COUNTER_00 = EXPLR_MCBIST_MBSSYMEC0Q_MODAL_SYMBOL_COUNTER_00,
+ MODAL_SYMBOL_COUNTER_00_LEN = EXPLR_MCBIST_MBSSYMEC0Q_MODAL_SYMBOL_COUNTER_00_LEN,
+ MODAL_SYMBOL_COUNTER_01 = EXPLR_MCBIST_MBSSYMEC0Q_MODAL_SYMBOL_COUNTER_01,
+ MODAL_SYMBOL_COUNTER_01_LEN = EXPLR_MCBIST_MBSSYMEC0Q_MODAL_SYMBOL_COUNTER_01_LEN,
+ MODAL_SYMBOL_COUNTER_02 = EXPLR_MCBIST_MBSSYMEC0Q_MODAL_SYMBOL_COUNTER_02,
+ MODAL_SYMBOL_COUNTER_02_LEN = EXPLR_MCBIST_MBSSYMEC0Q_MODAL_SYMBOL_COUNTER_02_LEN,
+ MODAL_SYMBOL_COUNTER_03 = EXPLR_MCBIST_MBSSYMEC0Q_MODAL_SYMBOL_COUNTER_03,
+ MODAL_SYMBOL_COUNTER_03_LEN = EXPLR_MCBIST_MBSSYMEC0Q_MODAL_SYMBOL_COUNTER_03_LEN,
+ MODAL_SYMBOL_COUNTER_04 = EXPLR_MCBIST_MBSSYMEC0Q_MODAL_SYMBOL_COUNTER_04,
+ MODAL_SYMBOL_COUNTER_04_LEN = EXPLR_MCBIST_MBSSYMEC0Q_MODAL_SYMBOL_COUNTER_04_LEN,
+ MODAL_SYMBOL_COUNTER_05 = EXPLR_MCBIST_MBSSYMEC0Q_MODAL_SYMBOL_COUNTER_05,
+ MODAL_SYMBOL_COUNTER_05_LEN = EXPLR_MCBIST_MBSSYMEC0Q_MODAL_SYMBOL_COUNTER_05_LEN,
+ MODAL_SYMBOL_COUNTER_06 = EXPLR_MCBIST_MBSSYMEC0Q_MODAL_SYMBOL_COUNTER_06,
+ MODAL_SYMBOL_COUNTER_06_LEN = EXPLR_MCBIST_MBSSYMEC0Q_MODAL_SYMBOL_COUNTER_06_LEN,
+ MODAL_SYMBOL_COUNTER_07 = EXPLR_MCBIST_MBSSYMEC0Q_MODAL_SYMBOL_COUNTER_07,
+ MODAL_SYMBOL_COUNTER_07_LEN = EXPLR_MCBIST_MBSSYMEC0Q_MODAL_SYMBOL_COUNTER_07_LEN,
+
+ // FROM NIMBUS, UNSURE IF STILL ACCURATE OR NEEDED
+ // and a couple constants
+ NUM_MBSSYM_REGS = 10,
+ MODAL_SYMBOL_COUNTERS_PER_REG = 8,
+ };
+
+};
+
+} // close namespace mss
+
+#endif
diff --git a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/exp_mbs_error_vector_trap.H b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/exp_mbs_error_vector_trap.H
index fd7bddef3..cf0665d32 100644
--- a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/exp_mbs_error_vector_trap.H
+++ b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/exp_mbs_error_vector_trap.H
@@ -22,3 +22,184 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
+
+///
+/// @file exp_mbs_error_vector_trap.H
+/// @brief Subroutines for the MC MBS error vector trap registers (MBSEVR*Q)
+///
+// *HWP HWP Owner: Matt Hickman <Matthew.Hickman@ibm.com>
+// *HWP HWP Backup: Stephen Glancy <sglancy@us.ibm.com>
+// *HWP Team: Memory
+// *HWP Level: 3
+// *HWP Consumed by: FSP:HB
+
+#ifndef _EXP_MSS_MBS_ERROR_VECTOR_TRAP_H_
+#define _EXP_MSS_MBS_ERROR_VECTOR_TRAP_H_
+
+#include <fapi2.H>
+#include <generic/memory/lib/utils/scom.H>
+#include <generic/memory/lib/utils/find.H>
+#include <generic/memory/lib/utils/shared/mss_generic_consts.H>
+#include <generic/memory/lib/ecc/ecc_traits.H>
+#include <generic/memory/lib/ecc/mbs_error_vector_trap.H>
+
+namespace mss
+{
+
+namespace ecc
+{
+
+namespace mbs_error_vector_trap
+{
+
+///
+/// @brief set_nce_galois
+/// @tparam T fapi2 Target Type - derived from i_target's type
+/// @tparam TT traits type defaults to eccTraits<mc_type::EXPLORER, T>
+/// @param[in] i_target the fapi2 target of the mc
+/// @param[in, out] io_data the register value
+/// @param[in] i_value the value of the field
+///
+template< fapi2::TargetType T, typename TT = eccTraits<mc_type::EXPLORER, T> >
+inline void set_nce_galois( const fapi2::Target<T>& i_target,
+ fapi2::buffer<uint64_t>& io_data,
+ const uint64_t i_value)
+{
+ io_data.insertFromRight<TT::P0_NCE_GALOIS, TT::P0_NCE_GALOIS_LEN>(i_value);
+
+ FAPI_INF("%s set_nce_galois: 0x%016lx", mss::c_str(i_target), i_value);
+}
+
+///
+/// @brief get_nce_galois
+/// @tparam T fapi2 Target Type - derived from i_target's type
+/// @tparam TT traits type defaults to eccTraits<mc_type::EXPLORER, T>
+/// @param[in] i_target the fapi2 target of the mc
+/// @param[in] i_data the register value
+/// @param[out] i_value the value of the field
+///
+template< fapi2::TargetType T, typename TT = eccTraits<mc_type::EXPLORER, T> >
+inline void get_nce_galois( const fapi2::Target<T>& i_target,
+ const fapi2::buffer<uint64_t>& i_data,
+ uint64_t& o_value)
+{
+ i_data.extractToRight<TT::P0_NCE_GALOIS, TT::P0_NCE_GALOIS_LEN>(o_value);
+
+ FAPI_INF("%s get_nce_galois: 0x%016lx", mss::c_str(i_target), o_value);
+}
+
+///
+/// @brief set_nce_magnitude
+/// @tparam T fapi2 Target Type - derived from i_target's type
+/// @tparam TT traits type defaults to eccTraits<mc_type::EXPLORER, T>
+/// @param[in] i_target the fapi2 target of the mc
+/// @param[in, out] io_data the register value
+/// @param[in] i_value the value of the field
+///
+template< fapi2::TargetType T, typename TT = eccTraits<mc_type::EXPLORER, T> >
+inline void set_nce_magnitude( const fapi2::Target<T>& i_target,
+ fapi2::buffer<uint64_t>& io_data,
+ const uint64_t i_value)
+{
+ io_data.insertFromRight<TT::P0_NCE_MAGNITUDE, TT::P0_NCE_MAGNITUDE_LEN>(i_value);
+
+ FAPI_INF("%s set_nce_magnitude: 0x%016lx", mss::c_str(i_target), i_value);
+}
+
+///
+/// @brief get_nce_magnitude
+/// @tparam T fapi2 Target Type - derived from i_target's type
+/// @tparam TT traits type defaults to eccTraits<mc_type::EXPLORER, T>
+/// @param[in] i_target the fapi2 target of the mc
+/// @param[in] i_data the register value
+/// @param[out] i_value the value of the field
+///
+template< fapi2::TargetType T, typename TT = eccTraits<mc_type::EXPLORER, T> >
+inline void get_nce_magnitude( const fapi2::Target<T>& i_target,
+ const fapi2::buffer<uint64_t>& i_data,
+ uint64_t& o_value)
+{
+ i_data.extractToRight<TT::P0_NCE_MAGNITUDE, TT::P0_NCE_MAGNITUDE_LEN>(o_value);
+
+ FAPI_INF("%s get_nce_magnitude: 0x%016lx", mss::c_str(i_target), o_value);
+}
+
+///
+/// @brief set_tce_galois
+/// @tparam T fapi2 Target Type - derived from i_target's type
+/// @tparam TT traits type defaults to eccTraits<mc_type::EXPLORER, T>
+/// @param[in] i_target the fapi2 target of the mc
+/// @param[in, out] io_data the register value
+/// @param[in] i_value the value of the field
+///
+template< fapi2::TargetType T, typename TT = eccTraits<mc_type::EXPLORER, T> >
+inline void set_tce_galois( const fapi2::Target<T>& i_target,
+ fapi2::buffer<uint64_t>& io_data,
+ const uint64_t i_value)
+{
+ io_data.insertFromRight<TT::P0_TCE_GALOIS, TT::P0_TCE_GALOIS_LEN>(i_value);
+
+ FAPI_INF("%s set_tce_galois: 0x%016lx", mss::c_str(i_target), i_value);
+}
+
+///
+/// @brief get_tce_galois
+/// @tparam T fapi2 Target Type - derived from i_target's type
+/// @tparam TT traits type defaults to eccTraits<mc_type::EXPLORER, T>
+/// @param[in] i_target the fapi2 target of the mc
+/// @param[in] i_data the register value
+/// @param[out] i_value the value of the field
+///
+template< fapi2::TargetType T, typename TT = eccTraits<mc_type::EXPLORER, T> >
+inline void get_tce_galois( const fapi2::Target<T>& i_target,
+ const fapi2::buffer<uint64_t>& i_data,
+ uint64_t& o_value)
+{
+ i_data.extractToRight<TT::P0_TCE_GALOIS, TT::P0_TCE_GALOIS_LEN>(o_value);
+
+ FAPI_INF("%s get_tce_galois: 0x%016lx", mss::c_str(i_target), o_value);
+}
+
+///
+/// @brief set_tce_magnitude
+/// @tparam T fapi2 Target Type - derived from i_target's type
+/// @tparam TT traits type defaults to eccTraits<mc_type::EXPLORER, T>
+/// @param[in] i_target the fapi2 target of the mc
+/// @param[in, out] io_data the register value
+/// @param[in] i_value the value of the field
+///
+template< fapi2::TargetType T, typename TT = eccTraits<mc_type::EXPLORER, T> >
+inline void set_tce_magnitude( const fapi2::Target<T>& i_target,
+ fapi2::buffer<uint64_t>& io_data,
+ const uint64_t i_value)
+{
+ io_data.insertFromRight<TT::P0_TCE_MAGNITUDE, TT::P0_TCE_MAGNITUDE_LEN>(i_value);
+
+ FAPI_INF("%s set_tce_magnitude: 0x%016lx", mss::c_str(i_target), i_value);
+}
+
+///
+/// @brief get_tce_magnitude
+/// @tparam T fapi2 Target Type - derived from i_target's type
+/// @tparam TT traits type defaults to eccTraits<mc_type::EXPLORER, T>
+/// @param[in] i_target the fapi2 target of the mc
+/// @param[in] i_data the register value
+/// @param[out] i_value the value of the field
+///
+template< fapi2::TargetType T, typename TT = eccTraits<mc_type::EXPLORER, T> >
+inline void get_tce_magnitude( const fapi2::Target<T>& i_target,
+ const fapi2::buffer<uint64_t>& i_data,
+ uint64_t& o_value)
+{
+ i_data.extractToRight<TT::P0_TCE_MAGNITUDE, TT::P0_TCE_MAGNITUDE_LEN>(o_value);
+
+ FAPI_INF("%s get_tce_magnitude: 0x%016lx", mss::c_str(i_target), o_value);
+}
+
+} // close namespace mbs_error_vector_trap
+
+} // close namespace ecc
+
+} // close namespace mss
+
+#endif
diff --git a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/exp_modal_symbol_count.H b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/exp_modal_symbol_count.H
index 846bab9d4..dd9431a3d 100644
--- a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/exp_modal_symbol_count.H
+++ b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/ecc/exp_modal_symbol_count.H
@@ -22,3 +22,224 @@
/* permissions and limitations under the License. */
/* */
/* IBM_PROLOG_END_TAG */
+
+///
+/// @file exp_modal_symbol_count.H
+/// @brief Subroutines for the MC modal symbol count (MBSSYMEC*Q) registers
+///
+// *HWP HWP Owner: Matt Hickman <Matthew.Hickman@ibm.com>
+// *HWP HWP Backup: Stephen Glancy <sglancy@us.ibm.com>
+// *HWP Team: Memory
+// *HWP Level: 3
+// *HWP Consumed by: FSP:HB
+
+#ifndef _EXP_MSS_MODAL_SYMBOL_COUNT_H_
+#define _EXP_MSS_MODAL_SYMBOL_COUNT_H_
+
+#include <fapi2.H>
+#include <generic/memory/lib/utils/scom.H>
+#include <generic/memory/lib/utils/shared/mss_generic_consts.H>
+#include <generic/memory/lib/ecc/ecc_traits.H>
+#include <generic/memory/lib/ecc/modal_symbol_count.H>
+
+namespace mss
+{
+
+namespace ecc
+{
+
+namespace modal_symbol_count
+{
+
+///
+/// @brief Read modal symbol count (MBSSYMEC*Q) register
+/// @tparam N the register index (0-8)
+/// @tparam T fapi2 Target Type - derived from i_target's type
+/// @tparam TT traits type defaults to eccTraits<DEFAULT_MC_TYPE, T>
+/// @param[in] i_target the fapi2 target of the mc
+/// @param[out] o_data the value of the register
+/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS if ok
+///
+template< uint64_t N, fapi2::TargetType T, typename TT = eccTraits<mc_type::EXPLORER, T> >
+inline fapi2::ReturnCode read_index( const fapi2::Target<T>& i_target, fapi2::buffer<uint64_t>& o_data )
+{
+ static_assert((N < TT::NUM_MBSSYM_REGS), "Modal symbol count reg index failed range check");
+ FAPI_TRY( mss::getScom(i_target, (TT::MODAL_SYM_COUNT0_REG + N), o_data) );
+ FAPI_INF("read_index<%d>: 0x%016lx", N, o_data);
+fapi_try_exit:
+ return fapi2::current_err;
+}
+
+///
+/// @brief Read modal symbol count (MBSSYMEC*Q) 9 register
+/// @tparam T fapi2 Target Type - derived from i_target's type
+/// @param[in] i_target the fapi2 target of the mc
+/// @param[out] o_data the value of the register
+/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS if ok
+///
+template< fapi2::TargetType T >
+inline fapi2::ReturnCode read_index9( const fapi2::Target<T>& i_target, fapi2::buffer<uint64_t>& o_data )
+{
+ return ( read_index<9>(i_target, o_data) );
+}
+
+///
+/// @brief Read modal symbol count (MBSSYMEC*Q) register
+/// @tparam T fapi2 Target Type - derived from i_target's type
+/// @param[in] i_target the fapi2 target of the mc
+/// @param[in] i_index the register index
+/// @param[out] o_data the value of the register
+/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS if ok
+///
+template< fapi2::TARGET_TYPE_OCMB_CHIP >
+inline fapi2::ReturnCode read( const fapi2::TARGET_TYPE_OCMB_CHIP i_target,
+ const uint64_t i_index,
+ fapi2::buffer<uint64_t>& o_data )
+{
+ switch (i_index)
+ {
+ case(0):
+ return ( read_index0(i_target, o_data) );
+
+ case(1):
+ return ( read_index1(i_target, o_data) );
+
+ case(2):
+ return ( read_index2(i_target, o_data) );
+
+ case(3):
+ return ( read_index3(i_target, o_data) );
+
+ case(4):
+ return ( read_index4(i_target, o_data) );
+
+ case(5):
+ return ( read_index5(i_target, o_data) );
+
+ case(6):
+ return ( read_index6(i_target, o_data) );
+
+ case(7):
+ return ( read_index7(i_target, o_data) );
+
+ case(8):
+ return ( read_index8(i_target, o_data) );
+
+ case(9):
+ return ( read_index9(i_target, o_data) );
+
+ default:
+ FAPI_ASSERT( false,
+ fapi2::MSS_INVALID_INDEX_PASSED()
+ .set_INDEX(i_index)
+ .set_FUNCTION(SYMBOL_COUNT_READ),
+ "%s Invalid index passed to fwms::ecc::modal_symbol_count::read (%d)",
+ mss::c_str(i_target),
+ i_index);
+ }
+
+ return fapi2::FAPI2_RC_SUCCESS;
+fapi_try_exit:
+ return fapi2::current_err;
+}
+
+///
+/// @brief Write modal symbol count (MBSSYMEC*Q) register
+/// @tparam N the register index (0-8)
+/// @tparam T fapi2 Target Type - derived from i_target's type
+/// @tparam TT traits type defaults to eccTraits<EXPLORER, T>
+/// @param[in] i_target the fapi2 target of the mc
+/// @param[in] i_data the value to write to the register
+/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS if ok
+///
+template< uint64_t N, fapi2::TargetType T, typename TT = eccTraits<mc_type::EXPLORER, T> >
+inline fapi2::ReturnCode write_index( const fapi2::Target<T>& i_target, const fapi2::buffer<uint64_t>& i_data )
+{
+ static_assert((N < TT::NUM_MBSSYM_REGS), "Modal symbol count reg index failed range check");
+ FAPI_TRY( mss::putScom(i_target, (TT::MODAL_SYM_COUNT0_REG + N), i_data) );
+ FAPI_INF("write_index<%d>: 0x%016lx", N, i_data);
+fapi_try_exit:
+ return fapi2::current_err;
+}
+
+///
+/// @brief Write modal symbol count (MBSSYMEC*Q) 9 register
+/// @tparam T fapi2 Target Type - derived from i_target's type
+/// @param[in] i_target the fapi2 target of the mc
+/// @param[in] i_data the value to write to the register
+/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS if ok
+///
+template< fapi2::TargetType T >
+inline fapi2::ReturnCode write_index9( const fapi2::Target<T>& i_target, const fapi2::buffer<uint64_t>& i_data )
+{
+ return ( write_index<9>(i_target, i_data) );
+}
+
+///
+/// @brief Write Hardware Mark Store (HWMS) register
+/// @tparam T fapi2 Target Type - derived from i_target's type
+/// @param[in] i_target the fapi2 target of the mc
+/// @param[in] i_index the register index
+/// @param[in] i_data the value to write to the register
+/// @return fapi2::ReturnCode FAPI2_RC_SUCCESS if ok
+///
+template< fapi2::TARGET_TYPE_OCMB_CHIP >
+inline fapi2::ReturnCode write( const fapi2::TARGET_TYPE_OCMB_CHIP i_target,
+ const uint64_t i_index,
+ const fapi2::buffer<uint64_t>& i_data )
+{
+ switch (i_index)
+ {
+ case(0):
+ return ( write_index0(i_target, i_data) );
+
+ case(1):
+ return ( write_index1(i_target, i_data) );
+
+ case(2):
+ return ( write_index2(i_target, i_data) );
+
+ case(3):
+ return ( write_index3(i_target, i_data) );
+
+ case(4):
+ return ( write_index4(i_target, i_data) );
+
+ case(5):
+ return ( write_index5(i_target, i_data) );
+
+ case(6):
+ return ( write_index6(i_target, i_data) );
+
+ case(7):
+ return ( write_index7(i_target, i_data) );
+
+ case(8):
+ return ( write_index8(i_target, i_data) );
+
+ case(9):
+ return ( write_index9(i_target, i_data) );
+
+ default:
+ FAPI_ASSERT( false,
+ fapi2::MSS_INVALID_INDEX_PASSED()
+ .set_INDEX(i_index)
+ .set_FUNCTION(SYMBOL_COUNT_WRITE),
+ "%s Invalid index passed to fwms::ecc::modal_symbol_count::write (%d)",
+ mss::c_str(i_target),
+ i_index);
+ }
+
+ return fapi2::FAPI2_RC_SUCCESS;
+fapi_try_exit:
+ return fapi2::current_err;
+}
+
+
+} // close namespace modal_symbol_count
+
+} // close namespace ecc
+
+} // close namespace mss
+
+#endif
diff --git a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_address.H b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_address.H
index 4672948d1..8cbd5b347 100644
--- a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_address.H
+++ b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_address.H
@@ -39,7 +39,7 @@
#include <fapi2.H>
#include <utility>
#include <lib/shared/exp_consts.H>
-#include <lib/ecc/ecc_traits.H>
+#include <lib/ecc/ecc_traits_explorer.H>
#include <generic/memory/lib/utils/mcbist/gen_mss_mcbist_traits.H>
#include <generic/memory/lib/utils/mcbist/gen_mss_mcbist_address.H>
diff --git a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_mcbist.H b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_mcbist.H
index 06467b5e2..747b47311 100644
--- a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_mcbist.H
+++ b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_mcbist.H
@@ -42,7 +42,7 @@
#include <explorer_scom_addresses_fld.H>
#include <lib/shared/exp_consts.H>
-#include <lib/ecc/ecc_traits.H>
+#include <lib/ecc/ecc_traits_explorer.H>
#include <lib/mc/exp_port.H>
#include <lib/utils/mss_exp_conversions.H>
#include <lib/mcbist/exp_mcbist_traits.H>
diff --git a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_memdiags.H b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_memdiags.H
index 220061d1e..8feb8123c 100644
--- a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_memdiags.H
+++ b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_memdiags.H
@@ -40,7 +40,6 @@
#include <fapi2.H>
#include <lib/shared/exp_consts.H>
-#include <lib/ecc/ecc_traits.H>
#include <lib/mcbist/exp_mcbist.H>
#include <generic/memory/lib/utils/mcbist/gen_mss_memdiags.H>
diff --git a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_settings.H b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_settings.H
index 483691f09..dc1c42c4b 100644
--- a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_settings.H
+++ b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/mcbist/exp_settings.H
@@ -38,7 +38,7 @@
#include <fapi2.H>
#include <lib/shared/exp_consts.H>
-#include <lib/ecc/ecc_traits.H>
+#include <lib/ecc/ecc_traits_explorer.H>
#include <generic/memory/lib/utils/mcbist/gen_mss_mcbist_traits.H>
#include <generic/memory/lib/utils/mcbist/gen_mss_mcbist_settings.H>
diff --git a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/shared/exp_consts.H b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/shared/exp_consts.H
index 89e1be775..910213e59 100644
--- a/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/shared/exp_consts.H
+++ b/src/import/chips/ocmb/explorer/procedures/hwp/memory/lib/shared/exp_consts.H
@@ -121,7 +121,8 @@ enum sizes
MAX_PORT_PER_OCMB = 1,
MAX_DIMM_PER_PORT = 2,
MAX_RANK_PER_DIMM = 4,
- MAX_BITS_PER_PORT = 80,
+ MAX_DQ_BITS_PER_PORT = 80,
+ MAX_SYMBOLS_PER_PORT = 72,
MAX_RANKS_DIMM1 = 2,
MAX_MRANK_PER_PORT = MAX_DIMM_PER_PORT * MAX_RANK_PER_DIMM,
};
OpenPOWER on IntegriCloud