diff options
7 files changed, 110 insertions, 64 deletions
diff --git a/src/import/chips/p9/common/include/p9_mc_scom_addresses_fixes.H b/src/import/chips/p9/common/include/p9_mc_scom_addresses_fixes.H index a9b21a258..6e13c9b76 100644 --- a/src/import/chips/p9/common/include/p9_mc_scom_addresses_fixes.H +++ b/src/import/chips/p9/common/include/p9_mc_scom_addresses_fixes.H @@ -32,6 +32,11 @@ #ifndef __P9_MC_SCOM_ADDRESSES_FIXES_H #define __P9_MC_SCOM_ADDRESSES_FIXES_H +// More of an addition than a fix. +REG64( MCA_MBA_MCP0XLT0 , RULL(0x05010820), SH_UNT_MCA , SH_ACS_SCOM_RW ); +REG64( MCA_MBA_MCP0XLT1 , RULL(0x05010821), SH_UNT_MCA , SH_ACS_SCOM_RW ); +REG64( MCA_MBA_MCP0XLT2 , RULL(0x05010822), SH_UNT_MCA , SH_ACS_SCOM_RW ); + // FIXREG64( MCBIST_MCBIST_CCSARRERRINJQ , RULL(0x07010FDE), SH_UNT_MCBIST , // SH_ACS_SCOM_RW , RULL(0x0701219E) ); // FIXREG64( MCBIST_MCBIST_0_CCSARRERRINJQ , RULL(0x07010FDE), SH_UNT_MCBIST_0 , diff --git a/src/import/chips/p9/common/scominfo/p9_scom_addr.H b/src/import/chips/p9/common/scominfo/p9_scom_addr.H index 15c5c932e..392631f8d 100644 --- a/src/import/chips/p9/common/scominfo/p9_scom_addr.H +++ b/src/import/chips/p9/common/scominfo/p9_scom_addr.H @@ -275,6 +275,27 @@ extern "C" MC_DIR_SAT_ID_ECC64_3 = 0xb, } p9_mc_dir0_sat_id_t; + //These are for registers that reside in the MCS chiplet, but + //are used for MCA registers and should be targetted with MCA + //target type. There is no way to identify them other than by + //register offset value. All registers know of this type are + //listed bellow, but a range is used for checking + typedef enum + { + MC_MCS_MCA_OFFSET_MCP0XLT0 = 0x20, + MC_MCS_MCA_OFFSET_MCP0XLT1 = 0x21, + MC_MCS_MCA_OFFSET_MCP0XLT2 = 0x22, + MC_MCS_MCA_OFFSET_MCPERF0 = 0x23, + MC_MCS_MCA_OFFSET_MCPERF2 = 0x24, + MC_MCS_MCA_OFFSET_MCAMOC = 0x25, + MC_MCS_MCA_OFFSET_MCEPSQ = 0x26, + MC_MCS_MCA_OFFSET_MCBUSYQ = 0x27, + MC_MCS_MCA_OFFSET_MCERRINJ = 0x28, + MC_MCS_MCA_OFFSET_MCEBUSCL = 0x29, + MC_MCS_MCA_OFFSET_MCWAT = 0x2A, + MC_MCS_MCA_OFFSET_MCPERF3 = 0x2B + } p9_mcs_mca_offset_t; + typedef enum { MC_DIR_SAT_ID_MCBIST = 0xC diff --git a/src/import/chips/p9/common/scominfo/p9_scominfo.C b/src/import/chips/p9/common/scominfo/p9_scominfo.C index bc22649f1..d1ec2436c 100644 --- a/src/import/chips/p9/common/scominfo/p9_scominfo.C +++ b/src/import/chips/p9/common/scominfo/p9_scominfo.C @@ -112,18 +112,32 @@ extern "C" break; case PU_MCA_CHIPUNIT: - l_scom.set_chiplet_id(MC01_CHIPLET_ID + (i_chipUnitNum / 4)); - - if (l_scom.get_ring() == MC_MC01_0_RING_ID) + if (l_scom.get_chiplet_id() == MC01_CHIPLET_ID || l_scom.get_chiplet_id() == MC23_CHIPLET_ID) { - // mc - l_scom.set_sat_id( ( l_scom.get_sat_id() - ( l_scom.get_sat_id() % 4 ) ) + - ( i_chipUnitNum % 4 )); + + l_scom.set_chiplet_id(MC01_CHIPLET_ID + (i_chipUnitNum / 4)); + + if (l_scom.get_ring() == MC_MC01_0_RING_ID) + { + // mc + l_scom.set_sat_id( ( l_scom.get_sat_id() - ( l_scom.get_sat_id() % 4 ) ) + + ( i_chipUnitNum % 4 )); + } + else + { + // iomc + l_scom.set_ring(MC_IOM01_0_RING_ID + (i_chipUnitNum % 4)); + } } else { - // iomc - l_scom.set_ring(MC_IOM01_0_RING_ID + (i_chipUnitNum % 4)); + //mcs->mca regisers + uint8_t i_mcs_unitnum = ( i_chipUnitNum / 2 ); + l_scom.set_chiplet_id(N3_CHIPLET_ID - (2 * (i_mcs_unitnum / 2))); + l_scom.set_sat_id(2 * (i_mcs_unitnum % 2)); + uint8_t i_mcs_sat_offset = (0x2F & l_scom.get_sat_offset()); + i_mcs_sat_offset |= ((i_chipUnitNum % 2) << 4); + l_scom.set_sat_offset(i_mcs_sat_offset); } break; @@ -331,7 +345,8 @@ extern "C" if (((l_chiplet_id == N3_CHIPLET_ID) || (l_chiplet_id == N1_CHIPLET_ID)) && (l_port == UNIT_PORT_ID) && (l_ring == N3_MC01_0_RING_ID) && - ((l_sat_id == MC_DIR_SAT_ID_PBI_01) || (l_sat_id == MC_DIR_SAT_ID_PBI_23))) + ((l_sat_id == MC_DIR_SAT_ID_PBI_01) || (l_sat_id == MC_DIR_SAT_ID_PBI_23)) && + (((0x2F & l_sat_offset) < MC_MCS_MCA_OFFSET_MCP0XLT0 || MC_MCS_MCA_OFFSET_MCPERF3 < (0x2F & l_sat_offset)))) { o_chipUnitRelated = true; o_chipUnitPairing.push_back(p9_chipUnitPairing_t(PU_MCS_CHIPUNIT, @@ -357,6 +372,22 @@ extern "C" // PU_MCA_CHIPUNIT (mc) // mca: 0..7 + // These regisers are in the mcs chiplet but are logically mca targetted + if (((l_chiplet_id == N3_CHIPLET_ID) || (l_chiplet_id == N1_CHIPLET_ID)) && + (l_port == UNIT_PORT_ID) && + (l_ring == N3_MC01_0_RING_ID) && + ((l_sat_id == MC_DIR_SAT_ID_PBI_01) || (l_sat_id == MC_DIR_SAT_ID_PBI_23)) && + (((0x2F & l_sat_offset) >= MC_MCS_MCA_OFFSET_MCP0XLT0 && MC_MCS_MCA_OFFSET_MCPERF3 >= (0x2F & l_sat_offset)))) + { + o_chipUnitRelated = true; + o_chipUnitPairing.push_back(p9_chipUnitPairing_t(PU_MCA_CHIPUNIT, + ((((l_chiplet_id == N3_CHIPLET_ID) ? (0) : (2)) + + (l_sat_id / 2)) * 2) + + ((l_sat_offset & 0x10) >> 4) )); + } + + // PU_MCA_CHIPUNIT (mc) + // mca: 0..7 if (((l_chiplet_id == MC01_CHIPLET_ID) || (l_chiplet_id == MC23_CHIPLET_ID)) && (l_port == UNIT_PORT_ID) && (l_ring == MC_MC01_0_RING_ID) && diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/mc/mc.C b/src/import/chips/p9/procedures/hwp/memory/lib/mc/mc.C index ae8b9e61e..71b75fcaa 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/mc/mc.C +++ b/src/import/chips/p9/procedures/hwp/memory/lib/mc/mc.C @@ -40,10 +40,6 @@ using fapi2::TARGET_TYPE_MCS; namespace mss { -const uint64_t mcTraits<TARGET_TYPE_MCS>::xlate0_reg[] = {MCS_PORT02_MCP0XLT0, MCS_PORT13_MCP0XLT0}; -const uint64_t mcTraits<TARGET_TYPE_MCS>::xlate1_reg[] = {MCS_PORT02_MCP0XLT1, MCS_PORT13_MCP0XLT1}; -const uint64_t mcTraits<TARGET_TYPE_MCS>::xlate2_reg[] = {MCS_PORT02_MCP0XLT2, MCS_PORT13_MCP0XLT2}; - /// /// @brief Dump the registers of the MC (MCA_MBA, MCS) /// @param[in] i_target the MCS target @@ -126,39 +122,6 @@ fapi2::ReturnCode dump_regs( const fapi2::Target<TARGET_TYPE_MCS>& i_target ) {"MCS_MCSYNC", MCS_MCSYNC }, {"MCS_MCTO", MCS_MCTO }, {"MCS_MCWATCNTL", MCS_MCWATCNTL }, - - {"MCS_PORT02_AACR", MCS_PORT02_AACR }, - {"MCS_PORT02_AADR", MCS_PORT02_AADR }, - {"MCS_PORT02_AAER", MCS_PORT02_AAER }, - {"MCS_PORT02_MCAMOC", MCS_PORT02_MCAMOC }, - {"MCS_PORT02_MCBUSYQ", MCS_PORT02_MCBUSYQ }, - {"MCS_PORT02_MCEBUSCL", MCS_PORT02_MCEBUSCL }, - {"MCS_PORT02_MCEPSQ", MCS_PORT02_MCEPSQ }, - {"MCS_PORT02_MCERRINJ", MCS_PORT02_MCERRINJ }, - {"MCS_PORT02_MCP0XLT0", MCS_PORT02_MCP0XLT0 }, - {"MCS_PORT02_MCP0XLT1", MCS_PORT02_MCP0XLT1 }, - {"MCS_PORT02_MCP0XLT2", MCS_PORT02_MCP0XLT2 }, - {"MCS_PORT02_MCPERF0", MCS_PORT02_MCPERF0 }, - {"MCS_PORT02_MCPERF2", MCS_PORT02_MCPERF2 }, - {"MCS_PORT02_MCPERF3", MCS_PORT02_MCPERF3 }, - {"MCS_PORT02_MCWAT", MCS_PORT02_MCWAT }, - - {"MCS_PORT13_MCAMOC", MCS_PORT13_MCAMOC }, - {"MCS_PORT13_MCBUSYQ", MCS_PORT13_MCBUSYQ }, - {"MCS_PORT13_MCEBUSCL", MCS_PORT13_MCEBUSCL }, - {"MCS_PORT13_MCEBUSEN0", MCS_PORT13_MCEBUSEN0 }, - {"MCS_PORT13_MCEBUSEN1", MCS_PORT13_MCEBUSEN1 }, - {"MCS_PORT13_MCEBUSEN2", MCS_PORT13_MCEBUSEN2 }, - {"MCS_PORT13_MCEBUSEN3", MCS_PORT13_MCEBUSEN3 }, - {"MCS_PORT13_MCEPSQ", MCS_PORT13_MCEPSQ }, - {"MCS_PORT13_MCERRINJ", MCS_PORT13_MCERRINJ }, - {"MCS_PORT13_MCP0XLT0", MCS_PORT13_MCP0XLT0 }, - {"MCS_PORT13_MCP0XLT1", MCS_PORT13_MCP0XLT1 }, - {"MCS_PORT13_MCP0XLT2", MCS_PORT13_MCP0XLT2 }, - {"MCS_PORT13_MCPERF0", MCS_PORT13_MCPERF0 }, - {"MCS_PORT13_MCPERF2", MCS_PORT13_MCPERF2 }, - {"MCS_PORT13_MCPERF3", MCS_PORT13_MCPERF3 }, - {"MCS_PORT13_MCWAT", MCS_PORT13_MCWAT }, }; for (auto r : l_mcs_registers) diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/mc/mc.H b/src/import/chips/p9/procedures/hwp/memory/lib/mc/mc.H index 7416b96dd..ac52592f6 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/mc/mc.H +++ b/src/import/chips/p9/procedures/hwp/memory/lib/mc/mc.H @@ -56,7 +56,7 @@ class mcTraits; /// @brief a collection of traits associated with the Centaur controller /// template<> -class mcTraits<fapi2::TARGET_TYPE_MEMBUF_CHIP> +class mcTraits<fapi2::TARGET_TYPE_MBA> { }; @@ -65,14 +65,9 @@ class mcTraits<fapi2::TARGET_TYPE_MEMBUF_CHIP> /// @brief a collection of traits associated with the Nimbus controller /// template<> -class mcTraits<fapi2::TARGET_TYPE_MCS> +class mcTraits<fapi2::TARGET_TYPE_MCA> { public: - // Array of registers indexed by MCA position - static const uint64_t xlate0_reg[2]; - static const uint64_t xlate1_reg[2]; - static const uint64_t xlate2_reg[2]; - enum { SLOT0_VALID = MCS_PORT02_MCP0XLT0_SLOT0_VALID, diff --git a/src/import/chips/p9/procedures/hwp/memory/lib/mc/xlate.C b/src/import/chips/p9/procedures/hwp/memory/lib/mc/xlate.C index 69b2bd568..a08ca3b09 100644 --- a/src/import/chips/p9/procedures/hwp/memory/lib/mc/xlate.C +++ b/src/import/chips/p9/procedures/hwp/memory/lib/mc/xlate.C @@ -70,14 +70,6 @@ fapi2::ReturnCode mc<TARGET_TYPE_MCS>::setup_xlate_map(const fapi2::Target<TARGE FAPI_INF("Setting up xlate registers for MCA%d (%d)", mss::pos(i_target), mss::index(i_target)); - // The addressing for the xlt registers is funky. We have a different unit0 address for units 0/2 - // than we do for 1/3. - const uint64_t& l_t0_address = mss::pos(i_target) % 2 ? MCS_0_PORT13_MCP0XLT0 : MCS_0_PORT02_MCP0XLT0; - const uint64_t& l_t1_address = mss::pos(i_target) % 2 ? MCS_0_PORT13_MCP0XLT1 : MCS_0_PORT02_MCP0XLT1; - const uint64_t& l_t2_address = mss::pos(i_target) % 2 ? MCS_0_PORT13_MCP0XLT2 : MCS_0_PORT02_MCP0XLT2; - - FAPI_DBG("xlate scoms registers 0x%016lx, 0x%016lx, 0x%016lx", l_t0_address, l_t1_address, l_t2_address); - // We enable the DIMM select bit for slot1 if we have two DIMM installed l_xlate.writeBit<MCS_PORT13_MCP0XLT0_SLOT1_D_VALUE>(l_dimms.size() == 2); @@ -213,9 +205,9 @@ fapi2::ReturnCode mc<TARGET_TYPE_MCS>::setup_xlate_map(const fapi2::Target<TARGE FAPI_DBG("HACK: Cramming 0x%016lx in for MCP0XLT1", l_xlate1); FAPI_DBG("HACK: Cramming 0x%016lx in for MCP0XLT2", l_xlate2); - FAPI_TRY( mss::putScom(i_target.getParent<TARGET_TYPE_MCS>(), l_t0_address, l_xlate) ); - FAPI_TRY( mss::putScom(i_target.getParent<TARGET_TYPE_MCS>(), l_t1_address, l_xlate1) ); - FAPI_TRY( mss::putScom(i_target.getParent<TARGET_TYPE_MCS>(), l_t2_address, l_xlate2) ); + FAPI_TRY( mss::putScom(i_target, MCA_MBA_MCP0XLT0, l_xlate) ); + FAPI_TRY( mss::putScom(i_target, MCA_MBA_MCP0XLT1, l_xlate1) ); + FAPI_TRY( mss::putScom(i_target, MCA_MBA_MCP0XLT2, l_xlate2) ); fapi_try_exit: return fapi2::current_err; diff --git a/src/import/chips/p9/procedures/hwp/nest/p9_chiplet_scominit.C b/src/import/chips/p9/procedures/hwp/nest/p9_chiplet_scominit.C index d659a6322..1a2691eb0 100644 --- a/src/import/chips/p9/procedures/hwp/nest/p9_chiplet_scominit.C +++ b/src/import/chips/p9/procedures/hwp/nest/p9_chiplet_scominit.C @@ -39,6 +39,14 @@ #include <p9_fbc_ioe_dl_scom.H> #include <p9_fbc_ioo_tl_scom.H> #include <p9_fbc_ioo_dl_scom.H> +#include <p9_mc_scom_addresses.H> +#include <p9_mc_scom_addresses_fld.H> + +//------------------------------------------------------------------------------ +// Constant definitions +//------------------------------------------------------------------------------ + +const uint8_t MCEPS_JITTER_EPSILON = 0x1; //------------------------------------------------------------------------------ // Function definitions @@ -50,9 +58,40 @@ fapi2::ReturnCode p9_chiplet_scominit(const fapi2::Target<fapi2::TARGET_TYPE_PRO fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM; std::vector<fapi2::Target<fapi2::TARGET_TYPE_XBUS>> l_xbus_chiplets; std::vector<fapi2::Target<fapi2::TARGET_TYPE_OBUS>> l_obus_chiplets; + std::vector<fapi2::Target<fapi2::TARGET_TYPE_MCA>> l_mca_targets; fapi2::ATTR_PROC_FABRIC_OPTICS_CONFIG_MODE_Type l_fbc_optics_cfg_mode = { fapi2::ENUM_ATTR_PROC_FABRIC_OPTICS_CONFIG_MODE_SMP }; + fapi2::buffer<uint64_t> l_mceps; + fapi2::ATTR_PROC_EPS_READ_CYCLES_T0_Type l_eps_read_cycles_t0; + fapi2::ATTR_PROC_EPS_READ_CYCLES_T1_Type l_eps_read_cycles_t1; + fapi2::ATTR_PROC_EPS_READ_CYCLES_T2_Type l_eps_read_cycles_t2; FAPI_DBG("Start"); + + // apply MC epsilons + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_READ_CYCLES_T0, FAPI_SYSTEM, l_eps_read_cycles_t0), + "Error from FAPI_ATTR_GET (ATTR_PROC_EPS_READ_CYCLES_T0)"); + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_READ_CYCLES_T1, FAPI_SYSTEM, l_eps_read_cycles_t1), + "Error from FAPI_ATTR_GET (ATTR_PROC_EPS_READ_CYCLES_T1)"); + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_EPS_READ_CYCLES_T2, FAPI_SYSTEM, l_eps_read_cycles_t2), + "Error from FAPI_ATTR_GET (ATTR_PROC_EPS_READ_CYCLES_T2)"); + l_mceps.insertFromRight<MCS_PORT02_MCEPSQ_JITTER_EPSILON, MCS_PORT02_MCEPSQ_JITTER_EPSILON_LEN>(MCEPS_JITTER_EPSILON); + l_mceps.insertFromRight<MCS_PORT02_MCEPSQ_LOCAL_NODE_EPSILON, MCS_PORT02_MCEPSQ_LOCAL_NODE_EPSILON_LEN> + (l_eps_read_cycles_t0 / 4); + l_mceps.insertFromRight<MCS_PORT02_MCEPSQ_NEAR_NODAL_EPSILON, MCS_PORT02_MCEPSQ_NEAR_NODAL_EPSILON_LEN> + (l_eps_read_cycles_t1 / 4); + l_mceps.insertFromRight<MCS_PORT02_MCEPSQ_REMOTE_NODAL_EPSILON, MCS_PORT02_MCEPSQ_REMOTE_NODAL_EPSILON_LEN> + (l_eps_read_cycles_t2 / 4); + l_mceps.insertFromRight<MCS_PORT02_MCEPSQ_GROUP_EPSILON, MCS_PORT02_MCEPSQ_GROUP_EPSILON_LEN>(l_eps_read_cycles_t1 / 4); + l_mceps.insertFromRight<MCS_PORT02_MCEPSQ_VECTOR_GROUP_EPSILON, MCS_PORT02_MCEPSQ_VECTOR_GROUP_EPSILON_LEN> + (l_eps_read_cycles_t2 / 4); + l_mca_targets = i_target.getChildren<fapi2::TARGET_TYPE_MCA>(); + + for (auto l_mca_target : l_mca_targets) + { + FAPI_TRY(fapi2::putScom(l_mca_target, MCS_PORT02_MCEPSQ, l_mceps), + "Error from putScom (MCS_PORT02_MCEPSQ)"); + } + // apply FBC non-hotplug initfile FAPI_DBG("Invoking p9.fbc.no_hp.scom.initfile..."); FAPI_EXEC_HWP(l_rc, p9_fbc_no_hp_scom, i_target, FAPI_SYSTEM); |