summaryrefslogtreecommitdiffstats
path: root/src/hwpf
diff options
context:
space:
mode:
Diffstat (limited to 'src/hwpf')
-rw-r--r--src/hwpf/plat_hw_access.C2
-rw-r--r--src/hwpf/plat_target.H15
-rw-r--r--src/hwpf/plat_target_parms.H10
-rw-r--r--src/hwpf/target.C46
-rw-r--r--src/hwpf/target.H29
5 files changed, 87 insertions, 15 deletions
diff --git a/src/hwpf/plat_hw_access.C b/src/hwpf/plat_hw_access.C
index d1112533..bdf6ae3b 100644
--- a/src/hwpf/plat_hw_access.C
+++ b/src/hwpf/plat_hw_access.C
@@ -6,6 +6,7 @@
/* OpenPOWER sbe Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2016,2017 */
+/* [+] International Business Machines Corp. */
/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
@@ -165,6 +166,7 @@ static uint32_t getEffectiveAddress(const plat_target_handle_t &i_target, const
}
break;
case PPE_TARGET_TYPE_MCS:
+ case PPE_TARGET_TYPE_MI:
l_addr.iv_chiplet = i_target.fields.chiplet_num;
l_addr.iv_satId = (2 * (i_target.getTargetInstance() % 2));
break;
diff --git a/src/hwpf/plat_target.H b/src/hwpf/plat_target.H
index 51f32629..1d32dbb8 100644
--- a/src/hwpf/plat_target.H
+++ b/src/hwpf/plat_target.H
@@ -43,6 +43,7 @@ static const uint8_t CORES_PER_EX = 2;
static const uint8_t N2_CHIPLET = 4;
static const uint8_t N3_CHIPLET = 5;
static const uint8_t MCS_PER_MCBIST = 2;
+static const uint8_t MI_PER_MC = 2;
static const uint8_t PCI0_CHIPLET = 0x0D;
//
@@ -64,6 +65,8 @@ namespace fapi2
PPE_TARGET_TYPE_MCBIST = 0x40,
PPE_TARGET_TYPE_SYSTEM = 0x80,
PPE_TARGET_TYPE_PHB = 0x100,
+ PPE_TARGET_TYPE_MI = 0x200,
+ PPE_TARGET_TYPE_MC = 0x400,
PPE_TARGET_TYPE_ALL = 0xFFF,
} plat_target_type_t;
@@ -267,6 +270,18 @@ namespace fapi2
l_handle.fields.type = PPE_TARGET_TYPE_PHB;
l_handle.fields.type_target_num = i_plat_argument;
}
+ else if(K & TARGET_TYPE_MC)
+ {
+ l_handle.fields.chiplet_num = i_plat_argument + MC_CHIPLET_OFFSET;
+ l_handle.fields.type = PPE_TARGET_TYPE_MC | PPE_TARGET_TYPE_PERV;
+ l_handle.fields.type_target_num = i_plat_argument;
+ }
+ else if(K & TARGET_TYPE_MI)
+ {
+ l_handle.fields.chiplet_num = N3_CHIPLET - (MI_PER_MC * (i_plat_argument / MI_PER_MC));
+ l_handle.fields.type = PPE_TARGET_TYPE_MI;
+ l_handle.fields.type_target_num = i_plat_argument;
+ }
else if(K == TARGET_TYPE_ALL)
{
l_handle.fields.chiplet_num = i_plat_argument;
diff --git a/src/hwpf/plat_target_parms.H b/src/hwpf/plat_target_parms.H
index 1a8fe9fa..9dc4f54f 100644
--- a/src/hwpf/plat_target_parms.H
+++ b/src/hwpf/plat_target_parms.H
@@ -6,6 +6,7 @@
/* OpenPOWER sbe Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2012,2017 */
+/* [+] International Business Machines Corp. */
/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
@@ -40,10 +41,13 @@ CONST_UINT32_T(NEST_GROUP1_TARGET_OFFSET, CHIP_TARGET_OFFSET + CHIP_TARGET_COUN
CONST_UINT32_T(NEST_GROUP1_CHIPLET_OFFSET, 0x1);
CONST_UINT32_T(NEST_GROUP1_TARGET_COUNT, 6);
-// MCBIST targets
+// MCBIST/MC targets
CONST_UINT32_T(MCBIST_TARGET_OFFSET, NEST_GROUP1_TARGET_OFFSET + NEST_GROUP1_TARGET_COUNT);
CONST_UINT32_T(MCBIST_CHIPLET_OFFSET, 0x7);
CONST_UINT32_T(MCBIST_TARGET_COUNT, 2);
+CONST_UINT32_T(MC_TARGET_OFFSET, NEST_GROUP1_TARGET_OFFSET + NEST_GROUP1_TARGET_COUNT);
+CONST_UINT32_T(MC_CHIPLET_OFFSET, 0x7);
+CONST_UINT32_T(MC_TARGET_COUNT, 2);
// Nest targets - Group 2
CONST_UINT32_T(NEST_GROUP2_TARGET_OFFSET, MCBIST_TARGET_OFFSET + MCBIST_TARGET_COUNT);
@@ -65,9 +69,11 @@ CONST_UINT32_T(EX_TARGET_OFFSET, CORE_TARGET_OFFSET + CORE_TARGET_COUNT);
CONST_UINT32_T(EX_CHIPLET_OFFSET, 0x10);
CONST_UINT32_T(EX_TARGET_COUNT, 12);
-// MCS Targets
+// MCS/MI Targets
CONST_UINT32_T(MCS_TARGET_OFFSET, EX_TARGET_OFFSET + EX_TARGET_COUNT);
CONST_UINT32_T(MCS_TARGET_COUNT, 4);
+CONST_UINT32_T(MI_TARGET_OFFSET, EX_TARGET_OFFSET + EX_TARGET_COUNT);
+CONST_UINT32_T(MI_TARGET_COUNT, 4);
// PHB Targets
CONST_UINT32_T(PHB_TARGET_OFFSET, MCS_TARGET_OFFSET + MCS_TARGET_COUNT);
diff --git a/src/hwpf/target.C b/src/hwpf/target.C
index 8d6da3fe..fcd21dcb 100644
--- a/src/hwpf/target.C
+++ b/src/hwpf/target.C
@@ -181,6 +181,9 @@ fapi_try_exit:
case PPE_TARGET_TYPE_MCS:
l_targetType = TARGET_TYPE_MCS;
break;
+ case PPE_TARGET_TYPE_MI:
+ l_targetType = TARGET_TYPE_MI;
+ break;
case PPE_TARGET_TYPE_PHB:
l_targetType = TARGET_TYPE_PHB;
break;
@@ -202,6 +205,9 @@ fapi_try_exit:
case PPE_TARGET_TYPE_MCBIST | PPE_TARGET_TYPE_PERV:
l_targetType = TARGET_TYPE_MCBIST;
break;
+ case PPE_TARGET_TYPE_MC | PPE_TARGET_TYPE_PERV:
+ l_targetType = TARGET_TYPE_MC;
+ break;
case PPE_TARGET_TYPE_NONE:
case PPE_TARGET_TYPE_ALL:
default:
@@ -457,6 +463,9 @@ fapi_try_exit:
fapi2::ReturnCode plat_TargetsInit()
{
bool b_present = false;
+ uint8_t l_chipName = fapi2::ENUM_ATTR_NAME_NONE;
+ plat_target_handle_t l_platHandle;
+
// Copy fixed section from SEEPROM to PIBMEM
G_sbe_attrs.G_system_attrs = G_system_attributes;
@@ -499,6 +508,8 @@ fapi_try_exit:
// created.
FAPI_TRY(plat_AttrInit());
+ FAPI_TRY(FAPI_ATTR_GET_PRIVILEGED(fapi2::ATTR_NAME, plat_getChipTarget(), l_chipName));
+
/*
* Nest Targets - group 1
*/
@@ -515,21 +526,29 @@ fapi_try_exit:
}
/*
- * Memory Controller Synchronous (MCBIST) Targets
+ * Memory Controller Synchronous (MCBIST/MC) Targets
*/
+ // Note: MCBIST/MC have the same offset and counts, so the loop just
+ // uses MCBIST constants
l_beginning_offset = MCBIST_TARGET_OFFSET;
for (uint32_t i = 0; i < MCBIST_TARGET_COUNT; ++i)
{
- fapi2::Target<fapi2::TARGET_TYPE_MCBIST> target_name((createPlatTargetHandle<fapi2::TARGET_TYPE_MCBIST>(i)));
- fapi2::Target<fapi2::TARGET_TYPE_PERV> l_perv = target_name.getParent<fapi2::TARGET_TYPE_PERV>();
+ if(fapi2::ENUM_ATTR_NAME_CUMULUS == l_chipName)
+ {
+ l_platHandle = createPlatTargetHandle<fapi2::TARGET_TYPE_MC>(i);
+ }
+ else if(fapi2::ENUM_ATTR_NAME_NIMBUS == l_chipName)
+ {
+ l_platHandle = createPlatTargetHandle<fapi2::TARGET_TYPE_MCBIST>(i);
+ }
+ fapi2::Target<fapi2::TARGET_TYPE_PERV> l_perv(l_platHandle);
// Determine if the chiplet is present and, thus, functional
// via partial good attributes
FAPI_TRY(plat_TargetPresent(l_perv, b_present));
G_vec_targets.at(l_beginning_offset+i) = (fapi2::plat_target_handle_t)(l_perv.get());
-
}
/*
@@ -617,13 +636,22 @@ fapi_try_exit:
}
/*
- * MCS Targets
+ * MCS/MI Targets
*/
+ // Note: MCS/MI have the same offset and counts, so the loop just uses
+ // MCS constants
l_beginning_offset = MCS_TARGET_OFFSET;
for (uint32_t i = 0; i < MCS_TARGET_COUNT; ++i)
{
- fapi2::Target<fapi2::TARGET_TYPE_MCS> target_name(createPlatTargetHandle<fapi2::TARGET_TYPE_MCS>(i));
+ if(fapi2::ENUM_ATTR_NAME_CUMULUS == l_chipName)
+ {
+ l_platHandle = createPlatTargetHandle<fapi2::TARGET_TYPE_MI>(i);
+ }
+ else if(fapi2::ENUM_ATTR_NAME_NIMBUS == l_chipName)
+ {
+ l_platHandle = createPlatTargetHandle<fapi2::TARGET_TYPE_MCS>(i);
+ }
fapi2::Target<fapi2::TARGET_TYPE_PERV>
l_nestTarget((plat_getTargetHandleByChipletNumber<TARGET_TYPE_PERV>(N3_CHIPLET - (MCS_PER_MCBIST * (i / MCS_PER_MCBIST)))));
@@ -645,11 +673,11 @@ fapi_try_exit:
if(0 == l_attrPg)
{
- static_cast<plat_target_handle_t&>(target_name.operator ()()).setPresent();
- static_cast<plat_target_handle_t&>(target_name.operator ()()).setFunctional(true);
+ l_platHandle.setPresent();
+ l_platHandle.setFunctional(true);
}
- G_vec_targets.at(l_beginning_offset+i) = (fapi2::plat_target_handle_t)(target_name.get());
+ G_vec_targets.at(l_beginning_offset+i) = l_platHandle;
}
/*
diff --git a/src/hwpf/target.H b/src/hwpf/target.H
index 190b3da3..09f5793d 100644
--- a/src/hwpf/target.H
+++ b/src/hwpf/target.H
@@ -6,6 +6,7 @@
/* OpenPOWER sbe Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2012,2017 */
+/* [+] International Business Machines Corp. */
/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
@@ -114,6 +115,12 @@ namespace fapi2
}
template<>
+ constexpr plat_target_type_t fapiTargetTypeToPlatTargetType<TARGET_TYPE_MI>()
+ {
+ return PPE_TARGET_TYPE_MI;
+ }
+
+ template<>
constexpr plat_target_type_t fapiTargetTypeToPlatTargetType<TARGET_TYPE_PHB>()
{
return PPE_TARGET_TYPE_PHB;
@@ -126,6 +133,12 @@ namespace fapi2
}
template<>
+ constexpr plat_target_type_t fapiTargetTypeToPlatTargetType<TARGET_TYPE_MC>()
+ {
+ return PPE_TARGET_TYPE_MC;
+ }
+
+ template<>
constexpr plat_target_type_t fapiTargetTypeToPlatTargetType<TARGET_TYPE_PERV>()
{
return PPE_TARGET_TYPE_PERV;
@@ -186,7 +199,8 @@ namespace fapi2
constexpr TargetType TARGET_TYPE_PROC_CHILDREN =
TARGET_TYPE_EQ | TARGET_TYPE_PERV | TARGET_TYPE_EX |
TARGET_TYPE_MCBIST | TARGET_TYPE_CORE |
- TARGET_TYPE_MCS | TARGET_TYPE_PROC_CHIP | TARGET_TYPE_PHB;
+ TARGET_TYPE_MCS | TARGET_TYPE_PROC_CHIP | TARGET_TYPE_PHB |
+ TARGET_TYPE_MC | TARGET_TYPE_MI;
static_assert(((
((K & TARGET_TYPE_PROC_CHILDREN) != TARGET_TYPE_NONE) ||
@@ -213,6 +227,12 @@ namespace fapi2
"Invalid parent for MCBIST target, must be PERV or "
"PROC_CHIP");
+ static_assert(!((K == TARGET_TYPE_MC) &&
+ (T != TARGET_TYPE_PERV) &&
+ (T != TARGET_TYPE_PROC_CHIP)),
+ "Invalid parent for MC target, must be PERV or "
+ "PROC_CHIP");
+
static_assert(!((K == TARGET_TYPE_CORE) &&
(T != TARGET_TYPE_PERV) &&
(T != TARGET_TYPE_PROC_CHIP) &&
@@ -233,11 +253,11 @@ namespace fapi2
"Invalid parent for EX target, must be PERV or "
"PROC_CHIP or EQ");
- if(TARGET_TYPE_PERV == T) // EQ/EC/MCBIST/PERV ===> PERV
+ if(TARGET_TYPE_PERV == T) // EQ/EC/MCBIST/MC/PERV ===> PERV
{
return static_cast<V>(this->iv_handle);
}
- if(TARGET_TYPE_PROC_CHIP == T) // EQ/EC/EX/MCBIST/PERV ===> PROC
+ if(TARGET_TYPE_PROC_CHIP == T) // EQ/EC/EX/MCBIST/MC/PERV ===> PROC
{
return static_cast<V>(G_vec_targets[CHIP_TARGET_OFFSET]);
}
@@ -326,7 +346,8 @@ namespace fapi2
static_assert((K == TARGET_TYPE_PROC_CHIP), "Parent target must be the proc chip");
static_assert((T == TARGET_TYPE_EQ) || (T == TARGET_TYPE_CORE)
- || (T == TARGET_TYPE_PERV) || (T == TARGET_TYPE_MCBIST),
+ || (T == TARGET_TYPE_PERV) || (T == TARGET_TYPE_MCBIST)
+ || (T == TARGET_TYPE_MC),
"Child target type must be a pervasive chiplet");
std::vector<Target<T> > l_children;
OpenPOWER on IntegriCloud