Skip to content

Commit

Permalink
Add support for MC and MI targets
Browse files Browse the repository at this point in the history
Change-Id: Ife13683349bfe4f618ab2632d78e6ade70cc095c
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/39870
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: RAJA DAS <rajadas2@in.ibm.com>
Reviewed-by: Sachin Gupta <sgupta2m@in.ibm.com>
  • Loading branch information
Santosh Puranik authored and sgupta2m committed Jun 9, 2017
1 parent 3f9beab commit 158f067
Show file tree
Hide file tree
Showing 6 changed files with 89 additions and 16 deletions.
2 changes: 2 additions & 0 deletions src/hwpf/plat_hw_access.C
Original file line number Diff line number Diff line change
Expand Up @@ -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"); */
Expand Down Expand Up @@ -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;
Expand Down
15 changes: 15 additions & 0 deletions src/hwpf/plat_target.H
Original file line number Diff line number Diff line change
Expand Up @@ -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;

//
Expand All @@ -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;

Expand Down Expand Up @@ -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;
Expand Down
10 changes: 8 additions & 2 deletions src/hwpf/plat_target_parms.H
Original file line number Diff line number Diff line change
Expand Up @@ -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"); */
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down
46 changes: 37 additions & 9 deletions src/hwpf/target.C
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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:
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
*/
Expand All @@ -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());

}

/*
Expand Down Expand Up @@ -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)))));
Expand All @@ -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;
}

/*
Expand Down
29 changes: 25 additions & 4 deletions src/hwpf/target.H
Original file line number Diff line number Diff line change
Expand Up @@ -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"); */
Expand Down Expand Up @@ -113,6 +114,12 @@ namespace fapi2
return PPE_TARGET_TYPE_MCS;
}

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>()
{
Expand All @@ -125,6 +132,12 @@ namespace fapi2
return PPE_TARGET_TYPE_MCBIST;
}

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>()
{
Expand Down Expand Up @@ -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) ||
Expand All @@ -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) &&
Expand All @@ -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]);
}
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion src/tools/scripts/ppeParseAttributeInfo.pl
Original file line number Diff line number Diff line change
Expand Up @@ -495,7 +495,8 @@ sub help {
# Consider only supported target types. The rest are ignored
if($targType ~~ ["TARGET_TYPE_PROC_CHIP", "TARGET_TYPE_SYSTEM",
"TARGET_TYPE_CORE", "TARGET_TYPE_MCS", "TARGET_TYPE_PERV",
"TARGET_TYPE_EQ", "TARGET_TYPE_EX", "TARGET_TYPE_PHB"])
"TARGET_TYPE_EQ", "TARGET_TYPE_EX", "TARGET_TYPE_PHB",
"TARGET_TYPE_MCBIST", "TARGET_TYPE_MC", "TARGET_TYPE_MI"])
{
if($targetTypeCount != 0)
{
Expand Down

0 comments on commit 158f067

Please sign in to comment.