diff options
Diffstat (limited to 'src/hwpf')
-rw-r--r-- | src/hwpf/plat_hw_access.C | 2 | ||||
-rw-r--r-- | src/hwpf/plat_target.H | 15 | ||||
-rw-r--r-- | src/hwpf/plat_target_parms.H | 10 | ||||
-rw-r--r-- | src/hwpf/target.C | 46 | ||||
-rw-r--r-- | src/hwpf/target.H | 29 |
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; |