summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBen Gass <bgass@us.ibm.com>2016-05-18 13:01:57 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2016-06-01 14:37:49 -0400
commitb1ed58c10721fe1ec98dd537929a2942e08765d0 (patch)
tree11574d41a6edf70d1ed7d24ef8e1e3b05a2aa21b
parent0990c2c96fc3baed7908e855bacaa854b2210d0b (diff)
downloadtalos-hostboot-b1ed58c10721fe1ec98dd537929a2942e08765d0.tar.gz
talos-hostboot-b1ed58c10721fe1ec98dd537929a2942e08765d0.zip
Translate logical mca regisers in mcs chiplet as mca target type
Fixup memory code which uses the xlt registers Add dependent epsilon inits Change-Id: I995bcd895a0a7a431dcf350475fd387be70749c9 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/24733 Reviewed-by: Brian R. Silver <bsilver@us.ibm.com> Tested-by: Jenkins Server Tested-by: PPE CI Tested-by: Hostboot CI Reviewed-by: Joseph J. McGill <jmcgill@us.ibm.com> Dev-Ready: Benjamin Gass <bgass@us.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/24734 Tested-by: FSP CI Jenkins Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
-rw-r--r--src/import/chips/p9/common/include/p9_mc_scom_addresses_fixes.H5
-rw-r--r--src/import/chips/p9/common/scominfo/p9_scom_addr.H21
-rw-r--r--src/import/chips/p9/common/scominfo/p9_scominfo.C49
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/mc/mc.C37
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/mc/mc.H9
-rw-r--r--src/import/chips/p9/procedures/hwp/memory/lib/mc/xlate.C14
-rw-r--r--src/import/chips/p9/procedures/hwp/nest/p9_chiplet_scominit.C39
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);
OpenPOWER on IntegriCloud