summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9
diff options
context:
space:
mode:
authorJoe McGill <jmcgill@us.ibm.com>2017-11-06 09:49:30 -0600
committerDaniel M. Crowell <dcrowell@us.ibm.com>2017-12-10 16:01:04 -0500
commit74cc36c5dd03aa7e36f4762c904350fecd0abf98 (patch)
treed8d46a30c79450fac6634e09c3d0f366c3974c43 /src/import/chips/p9
parent2209292ea1a7f54bfa0c5452fb9039b38d5a1985 (diff)
downloadtalos-hostboot-74cc36c5dd03aa7e36f4762c904350fecd0abf98.tar.gz
talos-hostboot-74cc36c5dd03aa7e36f4762c904350fecd0abf98.zip
Chip address extension workaround for HW423589 (option2), part2
Change-Id: I175167f9f011e1da23b3f81a49d4ed5a2847b54d Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/49290 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Joseph J. McGill <jmcgill@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Hostboot CI <hostboot-ci+hostboot@us.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/49307 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/import/chips/p9')
-rw-r--r--src/import/chips/p9/procedures/hwp/nest/p9_mss_eff_grouping.C505
-rw-r--r--src/import/chips/p9/procedures/hwp/nest/p9_setup_bars.C458
-rw-r--r--src/import/chips/p9/procedures/hwp/nest/p9_setup_bars_defs.H9
-rw-r--r--src/import/chips/p9/procedures/xml/error_info/p9_mss_eff_grouping_errors.xml38
-rw-r--r--src/import/chips/p9/procedures/xml/error_info/p9_setup_bars_errors.xml5
5 files changed, 741 insertions, 274 deletions
diff --git a/src/import/chips/p9/procedures/hwp/nest/p9_mss_eff_grouping.C b/src/import/chips/p9/procedures/hwp/nest/p9_mss_eff_grouping.C
index aa6bd504e..46f11239f 100644
--- a/src/import/chips/p9/procedures/hwp/nest/p9_mss_eff_grouping.C
+++ b/src/import/chips/p9/procedures/hwp/nest/p9_mss_eff_grouping.C
@@ -120,6 +120,69 @@ fapi2::ReturnCode EffGroupingSysAttrs::getAttrs()
fapi2::ReturnCode l_rc;
const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> FAPI_SYSTEM;
+ uint8_t l_addr_extension_group_id = 0;
+ uint8_t l_addr_extension_chip_id = 0;
+ uint64_t l_max_interleave_group_size;
+ fapi2::ATTR_CHIP_EC_FEATURE_EXTENDED_ADDRESSING_MODE_Type l_extended_addressing_mode = 0;
+ fapi2::ATTR_CHIP_EC_FEATURE_HW423589_OPTION2_Type l_hw423589_option2 = 0;
+
+ auto l_targets = FAPI_SYSTEM.getChildren<fapi2::TARGET_TYPE_PROC_CHIP>();
+
+ if (l_targets.size() != 0)
+ {
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_EC_FEATURE_EXTENDED_ADDRESSING_MODE,
+ l_targets.front(),
+ l_extended_addressing_mode),
+ "Error from FAPI_ATTR_GET (fapi2::ATTR_CHIP_EC_FEATURE_EXTENDED_ADDRESSING_MODE)");
+
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_EC_FEATURE_HW423589_OPTION2,
+ l_targets.front(),
+ l_hw423589_option2),
+ "Error from FAPI_ATTR_GET (ATTR_CHIP_EC_FEATURE_HW423589_OPTION2)");
+
+ FAPI_DBG("Extended addressing supported: %d, HW423589 option2: %d",
+ l_extended_addressing_mode,
+ l_hw423589_option2);
+ }
+
+ if (l_extended_addressing_mode)
+ {
+ if (l_hw423589_option2)
+ {
+ l_addr_extension_group_id = CHIP_ADDRESS_EXTENSION_GROUP_ID_MASK_HW423589_OPTION2;
+ l_addr_extension_chip_id = CHIP_ADDRESS_EXTENSION_CHIP_ID_MASK_HW423589_OPTION2;
+ }
+
+ // enable extended addressing mode, seed attributes from defaults
+ // should allow for testing alternate configurations via Cronus with const
+ // attribute overrides
+ FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_FABRIC_ADDR_EXTENSION_GROUP_ID,
+ FAPI_SYSTEM,
+ l_addr_extension_group_id),
+ "Error from FAPI_ATTR_SET (ATTR_FABRIC_ADDR_EXTENSION_GROUP_ID)");
+ FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID,
+ FAPI_SYSTEM,
+ l_addr_extension_chip_id),
+ "Error from FAPI_ATTR_SET (ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID)");
+ }
+
+ if (l_hw423589_option2)
+ {
+ // restrict max size for MCD issue
+ l_max_interleave_group_size = MAX_INTERLEAVE_GROUP_SIZE_HW423589_OPTION2;
+ }
+ else
+ {
+ l_max_interleave_group_size = MAX_INTERLEAVE_GROUP_SIZE;
+ }
+
+ // store attribute in GB for direct comparison with group size attributes
+ l_max_interleave_group_size = l_max_interleave_group_size >> 30;
+
+ FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_MAX_INTERLEAVE_GROUP_SIZE,
+ FAPI_SYSTEM,
+ l_max_interleave_group_size),
+ "Error from FAPI_ATTR_SET (ATTR_MAX_INTERLEAVE_GROUP_SIZE)");
// Get mirror placement policy
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_MEM_MIRROR_PLACEMENT_POLICY,
@@ -190,9 +253,12 @@ struct EffGroupingProcAttrs
const EffGroupingSysAttrs i_sysAttrs);
// Public data
- uint64_t iv_memBaseAddr = 0; // ATTR_PROC_MEM_BASE
- uint64_t iv_mirrorBaseAddr = 0; // ATTR_PROC_MIRROR_BASE
- uint64_t iv_nhtmBarSize; // ATTR_PROC_NHTM_BAR_SIZE
+ std::vector<uint64_t> iv_memBaseAddr; // ATTR_PROC_MEM_BASE
+ std::vector<uint64_t> iv_mirrorBaseAddr; // ATTR_PROC_MIRROR_BASE
+
+ uint64_t iv_maxGroupMemSize = 0; // ATTR_MAX_INTERLEAVE_GROUP_SIZE
+
+ uint64_t iv_nhtmBarSize; // ATTR_PROC_NHTM_BAR_SIZE
uint64_t iv_chtmBarSizes[NUM_OF_CHTM_REGIONS]; // ATTR_PROC_CHTM_BAR_SIZES
uint64_t iv_occSandboxSize = 0; // ATTR_PROC_OCC_SANDBOX_SIZE
@@ -209,18 +275,21 @@ fapi2::ReturnCode EffGroupingProcAttrs::calcProcBaseAddr(
{
FAPI_DBG("Entering");
- uint64_t l_memBaseAddr1, l_mmioBaseAddr;
+ std::vector<uint64_t> l_memBaseAddr1;
+ uint64_t l_mmioBaseAddr;
// Get the Mirror/Non-mirror base addresses
- FAPI_TRY(p9_fbc_utils_get_chip_base_address_no_aliases(i_target,
+ FAPI_TRY(p9_fbc_utils_get_chip_base_address(i_target,
EFF_FBC_GRP_CHIP_IDS,
iv_memBaseAddr,
l_memBaseAddr1,
iv_mirrorBaseAddr,
l_mmioBaseAddr),
- "p9_fbc_utils_get_chip_base_address_no_aliases() returns an error, l_rc 0x%.8X",
+ "p9_fbc_utils_get_chip_base_address() returns an error, l_rc 0x%.8X",
(uint64_t)fapi2::current_err);
+ iv_memBaseAddr.insert(iv_memBaseAddr.end(), l_memBaseAddr1.begin(), l_memBaseAddr1.end());
+
fapi_try_exit:
FAPI_DBG("Exiting");
return fapi2::current_err;
@@ -233,6 +302,12 @@ fapi2::ReturnCode EffGroupingProcAttrs::getAttrs(
{
FAPI_DBG("Entering EffGroupingProcAttrs::getAttrs");
+ // Get size (max) of each msel region
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_MAX_INTERLEAVE_GROUP_SIZE,
+ fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
+ iv_maxGroupMemSize),
+ "Error from FAPI_ATTR_GET (ATTR_MAX_INTERLEAVE_GROUP_SIZE)");
+
// Get Nest Hardware Trace Macro (NHTM) bar size
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_NHTM_BAR_SIZE, i_target, iv_nhtmBarSize),
"Error getting ATTR_PROC_HTM_BAR_SIZE, l_rc 0x%.8X",
@@ -286,8 +361,16 @@ fapi2::ReturnCode EffGroupingProcAttrs::getAttrs(
FAPI_INF(" ATTR_PROC_FABRIC_SYSTEM_ID 0x%.8X", iv_fabricSystemId);
FAPI_INF(" ATTR_PROC_FABRIC_GROUP_ID 0x%.8X", iv_fabricGroupId);
FAPI_INF(" ATTR_PROC_FABRIC_CHIP_ID 0x%.8X", iv_fabricChipId);
- FAPI_INF(" ATTR_PROC_MEM_BASE 0x%.16llX", iv_memBaseAddr);
- FAPI_INF(" ATTR_PROC_MIRROR_BASE 0x%.16llX", iv_mirrorBaseAddr);
+
+ for (uint8_t ii = 0; ii < iv_memBaseAddr.size(); ii++)
+ {
+ FAPI_INF(" ATTR_PROC_MEM_BASE[%d] 0x%.16llX", ii, iv_memBaseAddr[ii]);
+ }
+
+ for (uint8_t ii = 0; ii < iv_mirrorBaseAddr.size(); ii++)
+ {
+ FAPI_INF(" ATTR_PROC_MIRROR_BASE[%d] 0x%.16llX", ii, iv_mirrorBaseAddr[ii]);
+ }
fapi_try_exit:
FAPI_DBG("Exiting EffGroupingProcAttrs::getAttrs");
@@ -519,6 +602,8 @@ struct EffGroupingMemInfo
// Memory sizes behind MC ports
uint32_t iv_portSize[NUM_MC_PORTS_PER_PROC];
+ // maximum group size which can be formed
+ uint64_t iv_maxGroupMemSize = 0;
};
// See doxygen in struct definition.
@@ -533,6 +618,13 @@ fapi2::ReturnCode EffGroupingMemInfo::getMemInfo (
// Get the functional MCAs
auto l_mcaChiplets = i_target.getChildren<fapi2::TARGET_TYPE_MCA>();
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_MAX_INTERLEAVE_GROUP_SIZE,
+ fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
+ iv_maxGroupMemSize),
+ "Error from FAPI_ATTR_GET (ATTR_MAX_INTERLEAVE_GROUP_SIZE)");
+
+ FAPI_DBG("iv_maxGroupMemSize: 0x%016lX", iv_maxGroupMemSize);
+
if (l_mcaChiplets.size() > 0)
{
FAPI_DBG("Number of MCAs found: %d", l_mcaChiplets.size());
@@ -592,7 +684,7 @@ fapi_try_exit:
}
///----------------------------------------------------------------------------
-/// struct EffGroupingMemInfo
+/// struct EffGroupingData
///----------------------------------------------------------------------------
///
/// @struct EffGroupingData
@@ -1417,13 +1509,13 @@ void grouping_group8PortsPerGroup(const EffGroupingMemInfo& i_memInfo,
}
// Group of 8 is possible
- if (grouped)
+ if (grouped &&
+ ((8 * i_memInfo.iv_portSize[0]) <= i_memInfo.iv_maxGroupMemSize))
{
// All 8 ports have same amount of memory, group them
o_groupData.iv_data[g][PORT_SIZE] = i_memInfo.iv_portSize[0];
o_groupData.iv_data[g][PORTS_IN_GROUP] = 8;
- o_groupData.iv_data[g][GROUP_SIZE] =
- (NUM_MC_PORTS_PER_PROC * i_memInfo.iv_portSize[0]);
+ o_groupData.iv_data[g][GROUP_SIZE] = (NUM_MC_PORTS_PER_PROC * i_memInfo.iv_portSize[0]);
o_groupData.iv_data[g][MEMBER_IDX(0)] = MCPORTID_0;
o_groupData.iv_data[g][MEMBER_IDX(1)] = MCPORTID_4;
o_groupData.iv_data[g][MEMBER_IDX(2)] = MCPORTID_2;
@@ -1529,7 +1621,8 @@ void grouping_group6PortsPerGroup(const EffGroupingMemInfo& i_memInfo,
}
// Group of 6 is possible
- if (potential_group)
+ if (potential_group &&
+ ((PORTS_PER_GROUP * i_memInfo.iv_portSize[CFG_6MCPORT[ii][0]]) <= i_memInfo.iv_maxGroupMemSize))
{
o_groupData.iv_data[g][PORT_SIZE] =
i_memInfo.iv_portSize[CFG_6MCPORT[ii][0]];
@@ -1648,7 +1741,8 @@ void grouping_group4PortsPerGroup(const EffGroupingMemInfo& i_memInfo,
}
// Group of 4 is possible
- if (potential_group)
+ if (potential_group &&
+ ((PORTS_PER_GROUP * i_memInfo.iv_portSize[CFG_4MCPORT[ii][0]]) <= i_memInfo.iv_maxGroupMemSize))
{
FAPI_INF(" Potential group MC ports: MCPORTID %u, MCPORTID %u, MCPORTID %u, MCPORTID %u",
CFG_4MCPORT[ii][0], CFG_4MCPORT[ii][1],
@@ -1827,6 +1921,7 @@ void grouping_group3PortsPerGroup(const EffGroupingMemInfo& i_memInfo,
// 0 = OK to group
// 1 = One of the ports has unequal amount of memory
// 2 = 3rd entry port is odd and its even port has memory.
+ // 3 = group extent exceeds maximum size
uint8_t l_canNotGroup = 0;
uint8_t jj = 0;
@@ -1857,6 +1952,13 @@ void grouping_group3PortsPerGroup(const EffGroupingMemInfo& i_memInfo,
break;
}
}
+
+ if ((PORTS_PER_GROUP * i_memInfo.iv_portSize[CFG_3MCPORT[ii][0]]) >
+ i_memInfo.iv_maxGroupMemSize)
+ {
+ l_canNotGroup = 3;
+ break;
+ }
}
if (l_canNotGroup != 0) // Can not group 3 ports
@@ -1946,6 +2048,14 @@ void grouping_2ports_same_MCS(const EffGroupingMemInfo& i_memInfo,
continue;
}
+ if ((PORTS_PER_GROUP * i_memInfo.iv_portSize[pos]) >
+ i_memInfo.iv_maxGroupMemSize)
+ {
+ FAPI_DBG("Ports %u & %u can't be grouped because group size is too large, skip",
+ pos, pos + 1);
+ continue;
+ }
+
// Successfully find 2 ports on same MCS to group
o_groupData.iv_data[g][PORT_SIZE] = i_memInfo.iv_portSize[pos];
o_groupData.iv_data[g][PORTS_IN_GROUP] = PORTS_PER_GROUP;
@@ -2021,6 +2131,16 @@ void grouping_2groupsOf2_cross_MCS(const EffGroupingMemInfo& i_memInfo,
continue;
}
+ // only need to check size of 1st MCS (since the 2nd MCS would be the
+ // same size)
+ if ((PORTS_PER_GROUP * i_memInfo.iv_portSize[l_port]) >
+ i_memInfo.iv_maxGroupMemSize)
+ {
+ FAPI_DBG("Skip 1st MCS %u, as group size formed would be too large",
+ mcs1);
+ continue;
+ }
+
// Found first potential MCS, look for the 2nd MCS
for (uint8_t mcs2 = mcs1 + 1; mcs2 < NUM_MCS_PER_PROC; mcs2++)
{
@@ -2154,6 +2274,15 @@ void grouping_group2PortsPerGroup(const EffGroupingMemInfo& i_memInfo,
continue;
}
+ // Skip if group size would be too large
+ if ((PORTS_PER_GROUP * i_memInfo.iv_portSize[pos]) >
+ i_memInfo.iv_maxGroupMemSize)
+ {
+ FAPI_DBG("Skip this port %u, as group size formed would be too large",
+ pos);
+ continue;
+ }
+
// Rules for group of 2 for remaining ports on cross-MCS
// 1. Both ports must not be grouped yet and have the same amount of memory.
// 2. For both ports, the other port in their MCS must be empty
@@ -2258,7 +2387,8 @@ void grouping_group1PortsPerGroup(const EffGroupingMemInfo& i_memInfo,
for (uint8_t pos = 0; pos < NUM_MC_PORTS_PER_PROC; pos++)
{
if ( (!o_groupData.iv_portGrouped[pos]) &&
- (i_memInfo.iv_portSize[pos] != 0) )
+ (i_memInfo.iv_portSize[pos] != 0) &&
+ (i_memInfo.iv_portSize[pos] <= i_memInfo.iv_maxGroupMemSize) )
{
// This MCS is not already grouped and has memory
o_groupData.iv_data[g][PORT_SIZE] = i_memInfo.iv_portSize[pos];
@@ -2335,7 +2465,9 @@ fapi2::ReturnCode grouping_findUngroupedPorts(
uint8_t l_mcPortNum = l_unGroupedPair.begin()->first;
FAPI_ASSERT(false,
fapi2::MSS_EFF_GROUPING_UNABLE_TO_GROUP_MC()
- .set_MC_PORT(l_mcPortNum),
+ .set_MC_PORT(l_mcPortNum)
+ .set_MC_PORT_SIZE(i_memInfo.iv_portSize[l_mcPortNum])
+ .set_MAX_REGION_SIZE(i_memInfo.iv_maxGroupMemSize),
"grouping_findUngroupedPorts: Unable to group port %u", l_mcPortNum);
}
@@ -2549,166 +2681,232 @@ fapi_try_exit:
return;
}
+
///
-/// @brief Calculate Mirror Memory base and alt-base addresses
+/// @brief Calculate base and alt-base addresses
///
-/// @param[in] i_target Reference to processor chip target
-/// @param[io] io_procAttrs Processor Attributes (iv_mirrorBaseAddr can be
-/// updated)
-/// @param[io] io_groupData Group Data
-/// @param[in] i_totalSizeNonMirr Total non mirrored size
+/// @param[in] i_target Reference to processor chip target
+/// @param[in] i_procAttrs Processor Chip Attributes
+/// @param[in] i_cfgMirror Map mirrored memory
+/// @param[io] io_groupData Group Data
///
/// @return FAPI2_RC_SUCCESS if success, else error code.
///
-fapi2::ReturnCode grouping_calcMirrorMemory(
+fapi2::ReturnCode grouping_calcRegions(
const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
- EffGroupingProcAttrs& io_procAttrs,
+ const EffGroupingProcAttrs& i_procAttrs,
+ const bool i_cfgMirror,
EffGroupingData& io_groupData)
{
FAPI_DBG("Entering");
- // Calculate mirrored group size and non mirrored group size
- for (uint8_t pos = 0; pos < io_groupData.iv_numGroups; pos++)
+ // index for region which is used for mapping current group
+ // group size should never exceed the size of a particular
+ // region (enforced by restricting group size at formation time)
+ // if current group will stack on top of the prior group & not overflow
+ // the region, stack it, else place in next region
+ uint8_t l_cur_nm_region_idx = 0;
+ uint8_t l_cur_m_region_idx = 0;
+ uint8_t l_max_nm_region_idx = 0;
+ uint8_t l_max_m_region_idx = 0;
+ uint64_t l_nm_region_size_left = i_procAttrs.iv_maxGroupMemSize;
+ uint64_t l_m_region_size_left = i_procAttrs.iv_maxGroupMemSize / 2;
+ uint64_t l_cur_m_base_addr = 0;
+
+ if (i_procAttrs.iv_memBaseAddr.size())
+ {
+ l_max_nm_region_idx = i_procAttrs.iv_memBaseAddr.size() - 1;
+ }
+
+ if (i_procAttrs.iv_mirrorBaseAddr.size())
+ {
+ l_max_m_region_idx = i_procAttrs.iv_mirrorBaseAddr.size() - 1;
+ }
+
+ // Calculate mirrored group sizes
+ if (i_cfgMirror)
{
- if (io_groupData.iv_mirrorOn[pos])
+ l_cur_m_base_addr = i_procAttrs.iv_mirrorBaseAddr[l_cur_m_region_idx];
+
+ for (uint8_t pos = 0; pos < io_groupData.iv_numGroups; pos++)
{
- uint8_t l_mirrorOffset = pos + MIRR_OFFSET;
-
- // Mirrored size is half the group size
- io_groupData.iv_data[l_mirrorOffset][GROUP_SIZE] =
- io_groupData.iv_data[pos][GROUP_SIZE] / 2;
- io_groupData.iv_data[l_mirrorOffset][PORT_SIZE] =
- io_groupData.iv_data[pos][PORT_SIZE];
- io_groupData.iv_data[l_mirrorOffset][PORTS_IN_GROUP] =
- io_groupData.iv_data[pos][PORTS_IN_GROUP];
-
- // Copy port members fron non-mirrored to mirrored group
- for (uint8_t ii = 0; ii < io_groupData.iv_data[pos][PORTS_IN_GROUP]; ii++)
+ if (io_groupData.iv_mirrorOn[pos])
{
- io_groupData.iv_data[l_mirrorOffset][MEMBER_IDX(ii)] =
- io_groupData.iv_data[pos][MEMBER_IDX(ii)];
- }
+ uint8_t l_mirrorOffset = pos + MIRR_OFFSET;
+
+ // Mirrored size is half the group size
+ io_groupData.iv_data[l_mirrorOffset][GROUP_SIZE] =
+ io_groupData.iv_data[pos][GROUP_SIZE] / 2;
+ io_groupData.iv_data[l_mirrorOffset][PORT_SIZE] =
+ io_groupData.iv_data[pos][PORT_SIZE];
+ io_groupData.iv_data[l_mirrorOffset][PORTS_IN_GROUP] =
+ io_groupData.iv_data[pos][PORTS_IN_GROUP];
+
+ // Copy port members fron non-mirrored to mirrored group
+ for (uint8_t ii = 0; ii < io_groupData.iv_data[pos][PORTS_IN_GROUP]; ii++)
+ {
+ io_groupData.iv_data[l_mirrorOffset][MEMBER_IDX(ii)] =
+ io_groupData.iv_data[pos][MEMBER_IDX(ii)];
+ }
- for (uint8_t l_altRegion = 0; l_altRegion < NUM_OF_ALT_MEM_REGIONS; l_altRegion++)
- {
- if (io_groupData.iv_data[pos][ALT_VALID(l_altRegion)])
+ for (uint8_t l_altRegion = 0; l_altRegion < NUM_OF_ALT_MEM_REGIONS; l_altRegion++)
{
- FAPI_INF("Mirrored group %u needs alt bars definition, group size %u GB",
- pos, io_groupData.iv_data[pos][GROUP_SIZE]);
- io_groupData.iv_data[l_mirrorOffset][ALT_SIZE(l_altRegion)] =
- io_groupData.iv_data[pos][ALT_SIZE(l_altRegion)] / 2;
- io_groupData.iv_data[l_mirrorOffset][ALT_VALID(l_altRegion)] = 1;
+ if (io_groupData.iv_data[pos][ALT_VALID(l_altRegion)])
+ {
+ FAPI_INF("Mirrored group %u needs alt bars definition, group size %u GB",
+ pos, io_groupData.iv_data[pos][GROUP_SIZE]);
+ io_groupData.iv_data[l_mirrorOffset][ALT_SIZE(l_altRegion)] =
+ io_groupData.iv_data[pos][ALT_SIZE(l_altRegion)] / 2;
+ io_groupData.iv_data[l_mirrorOffset][ALT_VALID(l_altRegion)] = 1;
+ }
}
}
}
}
- // Convert base addresses to GB for calculation
- uint64_t memBaseAddr_GB = io_procAttrs.iv_memBaseAddr >> 30;
- uint64_t mirrorBaseAddr_GB = io_procAttrs.iv_mirrorBaseAddr >> 30;
- FAPI_DBG("io_procAttrs.iv_memBaseAddr 0x%.16llX, memBaseAddr_GB 0x%.16llX", io_procAttrs.iv_memBaseAddr,
- memBaseAddr_GB);
- FAPI_DBG("io_procAttrs.iv_mirrorBaseAddr 0x%.16llX, mirrorBaseAddr_GB 0x%.16llX", io_procAttrs.iv_mirrorBaseAddr,
- mirrorBaseAddr_GB);
- FAPI_DBG("io_groupData.iv_totalSizeNonMirr %d", io_groupData.iv_totalSizeNonMirr);
-
- // Check if the memory base address overlaps with the mirror base address
- if ( (memBaseAddr_GB > (mirrorBaseAddr_GB + (io_groupData.iv_totalSizeNonMirr / 2))) ||
- (mirrorBaseAddr_GB > (memBaseAddr_GB + io_groupData.iv_totalSizeNonMirr)) )
+ // Assign non-mirroring base address for each group
+ for (uint8_t pos = 0; pos < io_groupData.iv_numGroups; pos++)
{
- // No overlapping
- for (uint8_t pos = 0; pos < io_groupData.iv_numGroups; pos++)
+ bool l_map_mirror = i_cfgMirror &&
+ (io_groupData.iv_data[pos][PORTS_IN_GROUP] > 1);
+
+ // first group goes in first region
+ if (pos == 0)
{
- if (pos == 0)
+ FAPI_ASSERT((l_cur_nm_region_idx < l_max_nm_region_idx) &&
+ (l_nm_region_size_left >=
+ io_groupData.iv_data[pos][GROUP_SIZE]),
+ fapi2::MSS_EFF_GROUPING_NM_REGION_MAP_ERROR()
+ .set_PROC_CHIP(i_target)
+ .set_MEM_BASE_ADDRS(i_procAttrs.iv_memBaseAddr)
+ .set_CURR_GROUP_IDX(pos)
+ .set_CURR_GROUP_SIZE(io_groupData.iv_data[pos][GROUP_SIZE])
+ .set_CURR_REGION_IDX(l_cur_nm_region_idx)
+ .set_CURR_REGION_SIZE_LEFT(l_nm_region_size_left)
+ .set_MAX_REGION_IDX(l_max_nm_region_idx)
+ .set_MAX_REGION_SIZE(i_procAttrs.iv_maxGroupMemSize),
+ "Unable to map non-mirrored group!");
+
+ FAPI_ASSERT(!l_map_mirror ||
+ ((l_cur_m_region_idx < l_max_m_region_idx) &&
+ (l_m_region_size_left >=
+ io_groupData.iv_data[pos + MIRR_OFFSET][GROUP_SIZE])),
+ fapi2::MSS_EFF_GROUPING_M_REGION_MAP_ERROR()
+ .set_PROC_CHIP(i_target)
+ .set_MIRROR_BASE_ADDRS(i_procAttrs.iv_memBaseAddr)
+ .set_CURR_GROUP_IDX(pos)
+ .set_CURR_GROUP_SIZE(io_groupData.iv_data[pos + MIRR_OFFSET][GROUP_SIZE])
+ .set_CURR_REGION_IDX(l_cur_m_region_idx)
+ .set_CURR_REGION_SIZE_LEFT(l_m_region_size_left)
+ .set_MAX_REGION_IDX(l_max_m_region_idx)
+ .set_MAX_REGION_SIZE(i_procAttrs.iv_maxGroupMemSize / 2),
+ "Unable to map mirrored group!");
+
+ // assign non mirrored base address
+ io_groupData.iv_data[pos][BASE_ADDR] =
+ (i_procAttrs.iv_memBaseAddr[l_cur_nm_region_idx] >> 30);
+
+ // assign mirrored base address
+ if (l_map_mirror)
{
- // Note:
- // The 2nd memory hole was intended for use with 12Gb DRAM parts,
- // which we do not have to support - so it will not be used in Nimbus.
- io_groupData.iv_data[pos][BASE_ADDR] = memBaseAddr_GB;
+ io_groupData.iv_data[pos + MIRR_OFFSET][BASE_ADDR] =
+ l_cur_m_base_addr >> 30;
}
- else
+ }
+ else
+ {
+ if (l_nm_region_size_left >= io_groupData.iv_data[pos][GROUP_SIZE])
{
+ // stack on top of last region mapped
io_groupData.iv_data[pos][BASE_ADDR] =
io_groupData.iv_data[pos - 1][BASE_ADDR] +
io_groupData.iv_data[pos - 1][GROUP_SIZE];
- }
- // Note:
- // The 2nd memory hole was intended for use with 12Gb DRAM parts,
- // which we do not have to support - so it will not be used in Nimbus.
- if (io_groupData.iv_data[pos][ALT_VALID(0)])
- {
- io_groupData.iv_data[pos][ALT_BASE_ADDR(0)] =
- io_groupData.iv_data[pos][BASE_ADDR] +
- io_groupData.iv_data[pos][GROUP_SIZE] -
- io_groupData.iv_data[pos][ALT_SIZE(0)];
+ if (l_map_mirror)
+ {
+ // should have space to map mirrored group if non-mirrored
+ // group fits, assert
+ FAPI_ASSERT((l_m_region_size_left >=
+ io_groupData.iv_data[pos + MIRR_OFFSET][GROUP_SIZE]),
+ fapi2::MSS_EFF_GROUPING_M_REGION_MAP_ERROR()
+ .set_PROC_CHIP(i_target)
+ .set_MIRROR_BASE_ADDRS(i_procAttrs.iv_memBaseAddr)
+ .set_CURR_GROUP_IDX(pos)
+ .set_CURR_GROUP_SIZE(io_groupData.iv_data[pos + MIRR_OFFSET][GROUP_SIZE])
+ .set_CURR_REGION_IDX(l_cur_m_region_idx)
+ .set_CURR_REGION_SIZE_LEFT(l_m_region_size_left)
+ .set_MAX_REGION_IDX(l_max_m_region_idx)
+ .set_MAX_REGION_SIZE(i_procAttrs.iv_maxGroupMemSize / 2),
+ "Unable to map mirrored group!");
+ io_groupData.iv_data[pos + MIRR_OFFSET][BASE_ADDR] =
+ l_cur_m_base_addr >> 30;
+ }
}
-
- if (io_groupData.iv_data[pos][PORTS_IN_GROUP] > 1)
+ else
{
- io_groupData.iv_data[pos + MIRR_OFFSET][BASE_ADDR] = mirrorBaseAddr_GB;
- mirrorBaseAddr_GB += io_groupData.iv_data[pos + MIRR_OFFSET][GROUP_SIZE];
- io_procAttrs.iv_mirrorBaseAddr = (mirrorBaseAddr_GB << 30);
+ // move to next region (mirrored/non-mirrored)
+ l_cur_nm_region_idx++;
+ l_cur_m_region_idx++;
+
+ // reset available size variables
+ l_nm_region_size_left = i_procAttrs.iv_maxGroupMemSize;
+ l_m_region_size_left = i_procAttrs.iv_maxGroupMemSize / 2;
+
+ // assert that mappings are valid
+ FAPI_ASSERT((l_cur_nm_region_idx < l_max_nm_region_idx) &&
+ (l_nm_region_size_left >=
+ io_groupData.iv_data[pos][GROUP_SIZE]),
+ fapi2::MSS_EFF_GROUPING_NM_REGION_MAP_ERROR()
+ .set_PROC_CHIP(i_target)
+ .set_MEM_BASE_ADDRS(i_procAttrs.iv_memBaseAddr)
+ .set_CURR_GROUP_IDX(pos)
+ .set_CURR_GROUP_SIZE(io_groupData.iv_data[pos][GROUP_SIZE])
+ .set_CURR_REGION_IDX(l_cur_nm_region_idx)
+ .set_CURR_REGION_SIZE_LEFT(l_nm_region_size_left)
+ .set_MAX_REGION_IDX(l_max_nm_region_idx)
+ .set_MAX_REGION_SIZE(i_procAttrs.iv_maxGroupMemSize),
+ "Unable to map non-mirrored group!");
+
+ FAPI_ASSERT(!l_map_mirror ||
+ ((l_cur_m_region_idx < l_max_m_region_idx) &&
+ (l_m_region_size_left >=
+ io_groupData.iv_data[pos + MIRR_OFFSET][GROUP_SIZE])),
+ fapi2::MSS_EFF_GROUPING_M_REGION_MAP_ERROR()
+ .set_PROC_CHIP(i_target)
+ .set_MIRROR_BASE_ADDRS(i_procAttrs.iv_memBaseAddr)
+ .set_CURR_GROUP_IDX(pos)
+ .set_CURR_GROUP_SIZE(io_groupData.iv_data[pos + MIRR_OFFSET][GROUP_SIZE])
+ .set_CURR_REGION_IDX(l_cur_m_region_idx)
+ .set_CURR_REGION_SIZE_LEFT(l_m_region_size_left)
+ .set_MAX_REGION_IDX(l_max_m_region_idx)
+ .set_MAX_REGION_SIZE(i_procAttrs.iv_maxGroupMemSize / 2),
+ "Unable to map mirrored group!");
+
+ // reset mirror base address
+ l_cur_m_base_addr = i_procAttrs.iv_mirrorBaseAddr[l_cur_m_region_idx];
+
+ // assign non mirrored base address
+ io_groupData.iv_data[pos][BASE_ADDR] =
+ (i_procAttrs.iv_memBaseAddr[l_cur_nm_region_idx] >> 30);
- if (io_groupData.iv_data[pos][ALT_VALID(0)])
+ // assign mirrored base address
+ if (l_map_mirror)
{
- io_groupData.iv_data[pos + MIRR_OFFSET][ALT_BASE_ADDR(0)] = io_groupData.iv_data[pos + MIRR_OFFSET][BASE_ADDR] +
- io_groupData.iv_data[pos + MIRR_OFFSET][GROUP_SIZE] / 2;
- io_groupData.iv_data[pos + MIRR_OFFSET][ALT_VALID(0)] = 1;
+ io_groupData.iv_data[pos + MIRR_OFFSET][BASE_ADDR] =
+ l_cur_m_base_addr >> 30;
}
-
- FAPI_DBG("Adjust Mirror Base Address for group %d", pos);
- FAPI_DBG("New values: io_procAttrs.iv_mirrorBaseAddr 0x%.16llX, mirrorBaseAddr_GB 0x%.16llX",
- io_procAttrs.iv_mirrorBaseAddr, mirrorBaseAddr_GB);
- FAPI_DBG("Mirror group size: io_groupData.iv_data[%d][GROUP_SIZE] = %d", pos + MIRR_OFFSET,
- io_groupData.iv_data[pos + MIRR_OFFSET][GROUP_SIZE]);
- FAPI_DBG("Mirror group base addr: io_groupData.iv_data[%d][BASE_ADDR] = 0x%.16llX", pos + MIRR_OFFSET,
- io_groupData.iv_data[pos + MIRR_OFFSET][BASE_ADDR]);
}
}
- }
- else
- {
- FAPI_ASSERT(false,
- fapi2::MSS_EFF_GROUPING_BASE_ADDRESS_OVERLAPS_MIRROR_ADDRESS()
- .set_PROC_CHIP(i_target)
- .set_MEM_BASE_ADDR(io_procAttrs.iv_memBaseAddr)
- .set_MIRROR_BASE_ADDR(io_procAttrs.iv_mirrorBaseAddr)
- .set_SIZE_NON_MIRROR(io_groupData.iv_totalSizeNonMirr),
- "Mirror Base address overlaps with memory base address");
- }
-fapi_try_exit:
- FAPI_DBG("Exiting");
- return fapi2::current_err;
-}
+ // update remaining size in region
+ l_nm_region_size_left -= io_groupData.iv_data[pos][GROUP_SIZE];
+ l_m_region_size_left -= (io_groupData.iv_data[pos][GROUP_SIZE] / 2);
-///
-/// @brief Calculate Non-mirror Memory base and alt-base addresses
-///
-/// @param[in] i_procAttrs Processor Chip Attributes
-/// @param[io] io_groupData Group Data
-///
-void grouping_calcNonMirrorMemory(const EffGroupingProcAttrs& i_procAttrs,
- EffGroupingData& io_groupData)
-{
- FAPI_DBG("Entering");
-
- // Assign mirroring and non-mirroring base address for each group
- for (uint8_t pos = 0; pos < io_groupData.iv_numGroups; pos++)
- {
- if (pos == 0)
- {
- io_groupData.iv_data[pos][BASE_ADDR] =
- (i_procAttrs.iv_memBaseAddr >> 30);
- }
- else
- {
- io_groupData.iv_data[pos][BASE_ADDR] =
- io_groupData.iv_data[pos - 1][BASE_ADDR] +
- io_groupData.iv_data[pos - 1][GROUP_SIZE];
- }
+ // increment mirrored address (regardless of whether mapped
+ // for this group)
+ l_cur_m_base_addr += io_groupData.iv_data[pos][GROUP_SIZE] / 2;
+ // set alt region information directly based on base region mapping
for (uint8_t ii = 0; ii < NUM_OF_ALT_MEM_REGIONS; ii++)
{
if (io_groupData.iv_data[pos][ALT_VALID(ii)])
@@ -2717,12 +2915,21 @@ void grouping_calcNonMirrorMemory(const EffGroupingProcAttrs& i_procAttrs,
io_groupData.iv_data[pos][BASE_ADDR] +
io_groupData.iv_data[pos][GROUP_SIZE] -
io_groupData.iv_data[pos][ALT_SIZE(ii)];
+
+ if (l_map_mirror)
+ {
+ io_groupData.iv_data[pos + MIRR_OFFSET][ALT_BASE_ADDR(ii)] =
+ io_groupData.iv_data[pos + MIRR_OFFSET][BASE_ADDR] +
+ io_groupData.iv_data[pos + MIRR_OFFSET][GROUP_SIZE] / 2;
+ io_groupData.iv_data[pos + MIRR_OFFSET][ALT_VALID(ii)] = 1;
+ }
}
}
}
+fapi_try_exit:
FAPI_DBG("Exiting");
- return;
+ return fapi2::current_err;
}
///
@@ -2987,21 +3194,13 @@ fapi2::ReturnCode p9_mss_eff_grouping(
}
}
- if (l_mirrorIsOn)
- {
- FAPI_INF("Mirror memory configured");
- // Calculate base and alt-base addresses
- FAPI_TRY(grouping_calcMirrorMemory(i_target, l_procAttrs, l_groupData),
- "Error from grouping_calcMirrorMemory, l_rc 0x%.8X",
- (uint64_t)fapi2::current_err);
- }
- else
- {
- // ATTR_MRW_HW_MIRRORING_ENABLE is false
- // Calculate base and alt-base addresses
- FAPI_INF("No mirror memory configured");
- grouping_calcNonMirrorMemory(l_procAttrs, l_groupData);
- }
+ FAPI_INF("Mapping groups to regions (mirroring=%s)",
+ (l_mirrorIsOn ? ("enabled") : ("disabled")));
+
+ // Calculate base and alt-base addresses
+ FAPI_TRY(grouping_calcRegions(i_target, l_procAttrs, l_mirrorIsOn, l_groupData),
+ "Error from grouping_calcRegions, l_rc 0x%.8X",
+ (uint64_t)fapi2::current_err);
// Set the ATTR_MSS_MEM_MC_IN_GROUP attribute
FAPI_TRY(grouping_setATTR_MSS_MEM_MC_IN_GROUP(i_target, l_groupData),
diff --git a/src/import/chips/p9/procedures/hwp/nest/p9_setup_bars.C b/src/import/chips/p9/procedures/hwp/nest/p9_setup_bars.C
index 7223b2098..25f5281a3 100644
--- a/src/import/chips/p9/procedures/hwp/nest/p9_setup_bars.C
+++ b/src/import/chips/p9/procedures/hwp/nest/p9_setup_bars.C
@@ -69,13 +69,13 @@ p9_setup_bars_build_chip_info(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>&
{
FAPI_DBG("Start");
- FAPI_TRY(p9_fbc_utils_get_chip_base_address_no_aliases(i_target,
+ FAPI_TRY(p9_fbc_utils_get_chip_base_address(i_target,
EFF_FBC_GRP_CHIP_IDS,
- io_chip_info.base_address_nm[0],
- io_chip_info.base_address_nm[1],
+ io_chip_info.base_address_nm0,
+ io_chip_info.base_address_nm1,
io_chip_info.base_address_m,
io_chip_info.base_address_mmio),
- "Error from p9_fbc_utils_get_chip_base_address_no_aliases");
+ "Error from p9_fbc_utils_get_chip_base_address");
FAPI_TRY(p9_fbc_utils_get_group_id_attr(i_target,
io_chip_info.fbc_group_id),
@@ -85,6 +85,16 @@ p9_setup_bars_build_chip_info(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>&
io_chip_info.fbc_chip_id),
"Error from p9_fbc_utils_get_chip_id_attr");
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_EC_FEATURE_EXTENDED_ADDRESSING_MODE,
+ i_target,
+ io_chip_info.extended_addressing_mode),
+ "Error from FAPI_ATTR_GET (ATTR_CHIP_EC_FEATURE_EXTENDED_ADDRESSING_MODE)");
+
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_EC_FEATURE_HW423589_OPTION2,
+ i_target,
+ io_chip_info.hw423589_option2),
+ "Error from FAPI_ATTR_GET (ATTR_CHIP_EC_FEATURE_HW423589_OPTION2)");
+
fapi_try_exit:
FAPI_DBG("End");
return fapi2::current_err;
@@ -143,6 +153,151 @@ fapi_try_exit:
}
+///
+/// @brief Enable MCD units 0/1
+///
+/// @param[in] i_target Processor chip target
+/// @param[in] i_target_sys System target
+/// @param[in] i_chip_info Structure describing chip properties/base addresses
+///
+/// @return FAPI_RC_SUCCESS if all calls are successful, else error
+fapi2::ReturnCode
+p9_setup_bars_mcd_enable(
+ const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>& i_target_sys,
+ p9_setup_bars_chip_info& i_chip_info)
+{
+ FAPI_DBG("Start");
+
+ uint8_t l_addr_extension_group_id = 0;
+ uint8_t l_addr_extension_chip_id = 0;
+ fapi2::buffer<uint64_t> l_fir_data = 0;
+ fapi2::buffer<uint64_t> l_mcd_rec_data = 0;
+ fapi2::buffer<uint64_t> l_mcd_vgc_data = 0;
+
+ // configure FIR
+ // clear FIR
+ FAPI_TRY(fapi2::putScom(i_target, PU_MCC_FIR_REG, l_fir_data),
+ "Error from putScom (PU_MCC_FIR_REG)");
+ FAPI_TRY(fapi2::putScom(i_target, PU_MCD1_MCC_FIR_REG, l_fir_data),
+ "Error from putScom (PU_MCD1_MCC_FIR_REG)");
+ // set action
+ l_fir_data = MCD_FIR_ACTION0;
+ FAPI_TRY(fapi2::putScom(i_target, PU_MCD_FIR_ACTION0_REG, l_fir_data),
+ "Error from putScom (PU_MCD_FIR_ACTION0_REG)");
+ FAPI_TRY(fapi2::putScom(i_target, PU_MCD1_MCD_FIR_ACTION0_REG, l_fir_data),
+ "Error from putScom (PU_MCD1_MCD_FIR_ACTION0_REG)");
+ l_fir_data = MCD_FIR_ACTION1;
+ FAPI_TRY(fapi2::putScom(i_target, PU_MCD_FIR_ACTION1_REG, l_fir_data),
+ "Error from putScom (PU_MCD_FIR_ACTION1_REG)");
+ FAPI_TRY(fapi2::putScom(i_target, PU_MCD1_MCD_FIR_ACTION1_REG, l_fir_data),
+ "Error from putScom (PU_MCD1_MCD_FIR_ACTION1_REG)");
+ // set mask
+ l_fir_data = MCD_FIR_MASK;
+ FAPI_TRY(fapi2::putScom(i_target, PU_MCD_FIR_MASK_REG, l_fir_data),
+ "Error from putScom (PU_MCD_FIR_MASK_REG)");
+ FAPI_TRY(fapi2::putScom(i_target, PU_MCD1_MCD_FIR_MASK_REG, l_fir_data),
+ "Error from putScom (PU_MCD1_MCD_FIR_MASK_REG)");
+
+ if (i_chip_info.extended_addressing_mode)
+ {
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_FABRIC_ADDR_EXTENSION_GROUP_ID,
+ i_target_sys,
+ l_addr_extension_group_id),
+ "Error from FAPI_ATTR_GET (ATTR_FABRIC_ADDR_EXTENSION_GROUP_ID)");
+
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID,
+ i_target_sys,
+ l_addr_extension_chip_id),
+ "Error from FAPI_ATTR_GET (ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID");
+ }
+
+ // set MCD vectored group configuration register
+ FAPI_TRY(fapi2::getScom(i_target, PU_BANK0_MCD_VGC, l_mcd_vgc_data),
+ "Error from getScom (PU_BANK0_MCD_VGC)");
+
+ if (l_addr_extension_group_id ||
+ l_addr_extension_chip_id)
+ {
+ l_mcd_vgc_data.setBit<P9N2_PU_BANK0_MCD_VGC_EXT_ADDR_FAC_ENABLE>();
+ l_mcd_vgc_data.insertFromRight<P9N2_PU_BANK0_MCD_VGC_EXT_ADDR_FAC_MASK,
+ P9N2_PU_BANK0_MCD_VGC_EXT_ADDR_FAC_MASK_LEN>((l_addr_extension_group_id << 3) |
+ l_addr_extension_chip_id);
+ }
+
+ l_mcd_vgc_data.insertFromRight<PU_BANK0_MCD_VGC_AVAIL_GROUPS, PU_BANK0_MCD_VGC_AVAIL_GROUPS_LEN>(MCD_VGC_AVAIL_GROUPS);
+ l_mcd_vgc_data.setBit<PU_BANK0_MCD_VGC_HANG_POLL_ENABLE>();
+ FAPI_TRY(fapi2::putScom(i_target, PU_BANK0_MCD_VGC, l_mcd_vgc_data),
+ "Error from putScom (PU_BANK0_MCD_VGC)");
+ FAPI_TRY(fapi2::putScom(i_target, PU_MCD1_BANK0_MCD_VGC, l_mcd_vgc_data),
+ "Error from putScom (PU_MCD1_BANK0_MCD_VGC)");
+
+ // enable MCD probes
+ l_mcd_rec_data.setBit<PU_BANK0_MCD_REC_ENABLE>();
+ l_mcd_rec_data.setBit<PU_BANK0_MCD_REC_CONTINUOUS>();
+ l_mcd_rec_data.insertFromRight<PU_BANK0_MCD_REC_PACE, PU_BANK0_MCD_REC_PACE_LEN>(MCD_RECOVERY_PACE_RATE);
+ l_mcd_rec_data.insertFromRight<PU_BANK0_MCD_REC_RTY_COUNT, PU_BANK0_MCD_REC_RTY_COUNT_LEN>(MCD_RECOVERY_RTY_COUNT);
+ l_mcd_rec_data.insertFromRight<PU_BANK0_MCD_REC_VG_COUNT, PU_BANK0_MCD_REC_VG_COUNT_LEN>(MCD_RECOVERY_VG_COUNT);
+ FAPI_TRY(fapi2::putScom(i_target, PU_BANK0_MCD_REC, l_mcd_rec_data),
+ "Error from putScom (PU_BANK0_MCD_REC)");
+ FAPI_TRY(fapi2::putScom(i_target, PU_MCD1_BANK0_MCD_REC, l_mcd_rec_data),
+ "Error from putScom (PU_MCD1_BANK0_MCD_REC)");
+
+fapi_try_exit:
+ FAPI_DBG("End");
+ return fapi2::current_err;
+}
+
+
+/// @brief Program MCD units 0/1 to track non-mirrored regions
+/// of real address space on this chip, for HW423589_OPTION2
+///
+/// @param[in] i_target Processor chip target
+/// @param[in] i_target_sys System target
+/// @param[in] i_chip_info Structure describing chip properties/base addresses
+///
+/// @return FAPI_RC_SUCCESS if all calls are successful, else error
+fapi2::ReturnCode
+p9_setup_bars_mcd_HW423589_OPTION2(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>& i_target_sys,
+ p9_setup_bars_chip_info& i_chip_info)
+{
+ FAPI_DBG("Start");
+ p9_setup_bars_addr_range l_nm_cover;
+ uint64_t l_cover_size = MAX_INTERLEAVE_GROUP_SIZE_HW423589_OPTION2 / 2;
+
+ // setup two MCD configurations
+ // chip msel0 base [ size=256 GB ]
+ // chip msel0 base + 256 [ size=256 GB ]
+ l_nm_cover.enabled = true;
+ l_nm_cover.base_addr = i_chip_info.base_address_nm0.front();
+ l_nm_cover.size = l_cover_size;
+
+ FAPI_TRY(p9_setup_bars_mcd_track_range(i_target,
+ l_nm_cover,
+ PU_MCD1_BANK0_MCD_TOP,
+ PU_BANK0_MCD_TOP),
+ "Error from p9_setup_bars_mcd_track_range (0)");
+
+ l_nm_cover.base_addr += l_cover_size;
+
+ FAPI_TRY(p9_setup_bars_mcd_track_range(i_target,
+ l_nm_cover,
+ PU_MCD1_BANK0_MCD_STR,
+ PU_BANK0_MCD_STR),
+ "Error from p9_setup_bars_mcd_track_range (1)");
+
+ FAPI_TRY(p9_setup_bars_mcd_enable(i_target,
+ i_target_sys,
+ i_chip_info),
+ "Error from p9_setup_bars_mcd_enable");
+
+fapi_try_exit:
+ FAPI_DBG("End");
+ return fapi2::current_err;
+}
+
+
/// @brief Program MCD units 0/1 to track non-mirrored and mirrored regions
/// of real address space on this chip
///
@@ -157,9 +312,10 @@ p9_setup_bars_mcd(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
p9_setup_bars_chip_info& i_chip_info)
{
FAPI_DBG("Start");
- p9_setup_bars_addr_range l_nm_range[2];
- p9_setup_bars_addr_range l_m_range;
- bool l_enable_mcd = false;
+ std::vector<p9_setup_bars_addr_range> l_nm_ranges[2];
+ std::vector<p9_setup_bars_addr_range> l_m_ranges;
+ bool l_enable_mcd_nm = false;
+ bool l_enable_mcd_m = false;
fapi2::ATTR_MRW_HW_MIRRORING_ENABLE_Type l_mirror_ctl;
// determine range of NM memory which MCD needs to cover on this chip
@@ -167,12 +323,26 @@ p9_setup_bars_mcd(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
fapi2::ATTR_PROC_MEM_BASES_ACK_Type l_nm_bases;
fapi2::ATTR_PROC_MEM_SIZES_ACK_Type l_nm_sizes;
+ // initialize set of ranges -- track the number of mappable regions
+ // in each msel
+ for (uint8_t ii = 0; ii < i_chip_info.base_address_nm0.size(); ii++)
+ {
+ p9_setup_bars_addr_range r;
+ l_nm_ranges[0].push_back(r);
+ }
+
+ for (uint8_t ii = 0; ii < i_chip_info.base_address_nm1.size(); ii++)
+ {
+ p9_setup_bars_addr_range r;
+ l_nm_ranges[1].push_back(r);
+ }
+
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_MEM_BASES_ACK, i_target, l_nm_bases),
"Error fram FAPI_ATTR_GET (ATTR_PROC_MEM_BASES_ACK)");
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_MEM_SIZES_ACK, i_target, l_nm_sizes),
"Error fram FAPI_ATTR_GET (ATTR_PROC_MEM_SIZES_ACK)");
- // add each valid NM group range to its associated NM chip range
+ // add each valid NM group to its associated NM chip range
for (uint8_t ll = 0; ll < NUM_NON_MIRROR_REGIONS; ll++)
{
p9_setup_bars_addr_range l_range(l_nm_bases[ll],
@@ -180,51 +350,109 @@ p9_setup_bars_mcd(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
if (l_range.enabled)
{
- l_enable_mcd = true;
-
- // determine which NM range (0/1) this range is associated with
- if (l_range.base_addr < i_chip_info.base_address_nm[1])
+ FAPI_DBG("Adding group: %d", ll);
+ l_range.print();
+
+ bool l_range_placed = false;
+ l_enable_mcd_nm = true;
+
+ // determine which msel (nm0/nm1) the region lies within
+ // then determine which NM range this range is associated with
+ // find first range (walking backwards through the sorted
+ // list) for which the starting address of this range is
+ // greater than the base address
+ if ((i_chip_info.base_address_nm1.size() != 0) &&
+ l_range.base_addr >= i_chip_info.base_address_nm1[0])
{
- l_nm_range[0].merge(l_range);
+ // nm1
+ for (int jj = i_chip_info.base_address_nm1.size() - 1;
+ (jj >= 0) && !l_range_placed;
+ jj--)
+ {
+ if (l_range.base_addr >= i_chip_info.base_address_nm1[jj])
+ {
+ l_nm_ranges[1][jj].merge(l_range);
+ l_range_placed = true;
+ }
+ }
}
else
{
- l_nm_range[1].merge(l_range);
+ // nm0
+ for (int jj = i_chip_info.base_address_nm0.size() - 1;
+ (jj >= 0) && !l_range_placed;
+ jj--)
+ {
+ if (l_range.base_addr >= i_chip_info.base_address_nm0[jj])
+ {
+ l_nm_ranges[0][jj].merge(l_range);
+ l_range_placed = true;
+ }
+ }
}
+
+ // check for consistency -- should always find a match
+ FAPI_ASSERT(l_range_placed,
+ fapi2::P9_SETUP_BARS_INVALID_MCD_NM_RANGE_ERR().
+ set_TARGET(i_target).
+ set_NM_RANGE_IDX(ll).
+ set_NM_RANGE_BASE_ADDR(l_nm_bases[ll]).
+ set_NM_RANGE_SIZE(l_nm_sizes[ll]).
+ set_NM0_CHIP_BASES(i_chip_info.base_address_nm0).
+ set_NM1_CHIP_BASES(i_chip_info.base_address_nm1),
+ "Invalid configuration for MCD NM range!");
}
}
- // process each NM chip range
- for (uint8_t l_nm_range_idx = 0; l_nm_range_idx < 2; l_nm_range_idx++)
+ // generate independent cover for each of the two msels
+ for (uint8_t ii = 0; ii < 2; ii++)
{
- if (l_nm_range[l_nm_range_idx].enabled)
+ if (l_nm_ranges[ii].size() != 0)
{
- // ensure power of two alignment
- if (!l_nm_range[l_nm_range_idx].is_power_of_2())
+ FAPI_DBG("Generating MCD cover for NM msel %d",
+ ii);
+
+ p9_setup_bars_addr_range l_nm_cover;
+ l_nm_cover.base_addr = l_nm_ranges[ii][0].base_addr;
+
+ FAPI_DBG(" Cover base address: 0x%016lX",
+ l_nm_cover.base_addr);
+
+ for (uint8_t jj = 0; jj < l_nm_ranges[ii].size(); jj++)
{
- l_nm_range[l_nm_range_idx].round_next_power_of_2();
+ if (l_nm_ranges[ii][jj].enabled)
+ {
+ FAPI_DBG(" Processing valid range %d, base addr: 0x%016lX, size: 0x%016lX",
+ jj, l_nm_ranges[ii][jj].base_addr, l_nm_ranges[ii][jj].size);
+
+ l_nm_cover.enabled = true;
+
+ // ensure power of two alignment
+ if (!l_nm_ranges[ii][jj].is_power_of_2())
+ {
+ l_nm_ranges[ii][jj].round_next_power_of_2();
+ }
+
+ i_chip_info.ranges.push_back(l_nm_ranges[ii][jj]);
+ i_chip_info.ranges.back().print();
+ }
+
+ // need to cover size of largest alias region
+ if (l_nm_cover.size < l_nm_ranges[ii][jj].size)
+ {
+ l_nm_cover.size = l_nm_ranges[ii][jj].size;
+ FAPI_DBG(" Updating cover size: 0x%016lX",
+ l_nm_cover.size);
+ }
}
- // verify that base lines up with chip info struct
- FAPI_ASSERT(l_nm_range[l_nm_range_idx].base_addr == i_chip_info.base_address_nm[l_nm_range_idx],
- fapi2::P9_SETUP_BARS_INVALID_MCD_NM_RANGE_ERR().
- set_TARGET(i_target).
- set_NM_RANGE_IDX(l_nm_range_idx).
- set_NM_RANGE_BASE_ADDR(l_nm_range[l_nm_range_idx].base_addr).
- set_NM_RANGE_SIZE(l_nm_range[l_nm_range_idx].size).
- set_NM_CHIP_BASE(i_chip_info.base_address_nm[l_nm_range_idx]),
- "Invalid configuration for MCD NM range!");
-
// configure MCD to track this range
- // range 0 = MCD_BOT, range 1 = MCD_STR
+ // nm0 = MCD_BOT, nm1 = MCD_STR
FAPI_TRY(p9_setup_bars_mcd_track_range(i_target,
- l_nm_range[l_nm_range_idx],
- ((l_nm_range_idx == 0) ? (PU_MCD1_BANK0_MCD_BOT) : (PU_MCD1_BANK0_MCD_STR)),
- ((l_nm_range_idx == 0) ? (PU_BANK0_MCD_BOT) : (PU_BANK0_MCD_STR))),
- "Error from p9_setup_bars_mcd_track_range (NM%d)", l_nm_range_idx);
-
- i_chip_info.ranges.push_back(l_nm_range[l_nm_range_idx]);
- i_chip_info.ranges.back().print();
+ l_nm_cover,
+ ((ii == 0) ? (PU_MCD1_BANK0_MCD_BOT) : (PU_MCD1_BANK0_MCD_STR)),
+ ((ii == 0) ? (PU_BANK0_MCD_BOT) : (PU_BANK0_MCD_STR))),
+ "Error from p9_setup_bars_mcd_track_range (NM%d)", ii);
}
}
}
@@ -236,15 +464,24 @@ p9_setup_bars_mcd(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
if (l_mirror_ctl == fapi2::ENUM_ATTR_MRW_HW_MIRRORING_ENABLE_TRUE)
{
-
fapi2::ATTR_PROC_MIRROR_BASES_ACK_Type l_m_bases;
fapi2::ATTR_PROC_MIRROR_SIZES_ACK_Type l_m_sizes;
+ p9_setup_bars_addr_range l_m_cover;
+
+ // initialize set of ranges -- track the number of mappable
+ // regions
+ for (uint8_t ii = 0; ii < i_chip_info.base_address_m.size(); ii++)
+ {
+ p9_setup_bars_addr_range r;
+ l_m_ranges.push_back(r);
+ }
+
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_MIRROR_BASES_ACK, i_target, l_m_bases),
"Error fram FAPI_ATTR_GET (ATTR_PROC_MIRROR_BASES_ACK)");
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_MIRROR_SIZES_ACK, i_target, l_m_sizes),
"Error fram FAPI_ATTR_GET (ATTR_PROC_MIRROR_SIZES_ACK)");
- // add each valid M group range to the M chip range
+ // add each valid M group range to its associated M chip range
for (uint8_t ll = 0; ll < NUM_MIRROR_REGIONS; ll++)
{
p9_setup_bars_addr_range l_range(l_m_bases[ll],
@@ -252,91 +489,81 @@ p9_setup_bars_mcd(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
if (l_range.enabled)
{
- l_enable_mcd = true;
- l_m_range.merge(l_range);
+ bool l_range_placed = false;
+ l_enable_mcd_m = true;
+
+ // determine which M range this range is associated with
+ // find first range (walking backwards through the sorted
+ // list) for which the starting address of this range is
+ // greater than the base address
+ for (int jj = i_chip_info.base_address_m.size() - 1;
+ (jj >= 0) && !l_range_placed;
+ jj--)
+ {
+ if (l_range.base_addr >= i_chip_info.base_address_m[jj])
+ {
+ l_m_ranges[jj].merge(l_range);
+ l_range_placed = true;
+ }
+ }
+
+ // check for consistency -- should always find a match
+ FAPI_ASSERT(l_range_placed,
+ fapi2::P9_SETUP_BARS_INVALID_MCD_M_RANGE_ERR().
+ set_TARGET(i_target).
+ set_M_RANGE_IDX(ll).
+ set_M_RANGE_BASE_ADDR(l_m_bases[ll]).
+ set_M_RANGE_SIZE(l_m_sizes[ll]).
+ set_M_CHIP_BASES(i_chip_info.base_address_m),
+ "Invalid configuration for MCD M range!");
}
}
- // process M chip range
- if (l_m_range.enabled)
+ // process each merged range, find the largest which the MCD needs to
+ // cover -- all aliases will be covered by the MCD config reg programmed
+ if (l_enable_mcd_m)
{
- // ensure power of two alignment
- if (!l_m_range.is_power_of_2())
+ l_m_cover.enabled = true;
+ l_m_cover.base_addr = l_m_ranges[0].base_addr;
+
+ for (uint8_t jj = 0; jj < l_m_ranges.size(); jj++)
{
- l_m_range.round_next_power_of_2();
- }
+ if (l_m_ranges[jj].enabled)
+ {
+ // ensure power of two alignment
+ if (!l_m_ranges[jj].is_power_of_2())
+ {
+ l_m_ranges[jj].round_next_power_of_2();
+ }
+
+ i_chip_info.ranges.push_back(l_m_ranges[jj]);
+ i_chip_info.ranges.back().print();
+ }
- // verify that base lines up with chip info struct
- FAPI_ASSERT(l_m_range.base_addr == i_chip_info.base_address_m,
- fapi2::P9_SETUP_BARS_INVALID_MCD_M_RANGE_ERR().
- set_TARGET(i_target).
- set_M_RANGE_BASE_ADDR(l_m_range.base_addr).
- set_M_RANGE_SIZE(l_m_range.size).
- set_M_CHIP_BASE(i_chip_info.base_address_m),
- "Invalid configuration for MCD M range!");
+ // need to cover size of largest alias
+ if (l_m_cover.size < l_m_ranges[jj].size)
+ {
+ l_m_cover.size = l_m_ranges[jj].size;
+ }
+ }
- // configure MCD to track this range (MCD_TOP)
+ // configure MCD to track this range via MCD_TOP
FAPI_TRY(p9_setup_bars_mcd_track_range(i_target,
- l_m_range,
+ l_m_cover,
PU_MCD1_BANK0_MCD_TOP,
PU_BANK0_MCD_TOP),
"Error from p9_setup_bars_mcd_track_range (M)");
-
- i_chip_info.ranges.push_back(l_m_range);
- i_chip_info.ranges.back().print();
}
}
// if configured above to track any NM or M space, perform the remainder
// of the MCD setup (FIR configuration, probe enablement)
- if (l_enable_mcd)
+ if (l_enable_mcd_nm || l_enable_mcd_m)
{
- fapi2::buffer<uint64_t> l_fir_data = 0;
- fapi2::buffer<uint64_t> l_mcd_rec_data = 0;
- fapi2::buffer<uint64_t> l_mcd_vgc_data = 0;
-
- // configure FIR
- // clear FIR
- FAPI_TRY(fapi2::putScom(i_target, PU_MCC_FIR_REG, l_fir_data),
- "Error from putScom (PU_MCC_FIR_REG)");
- FAPI_TRY(fapi2::putScom(i_target, PU_MCD1_MCC_FIR_REG, l_fir_data),
- "Error from putScom (PU_MCD1_MCC_FIR_REG)");
- // set action
- l_fir_data = MCD_FIR_ACTION0;
- FAPI_TRY(fapi2::putScom(i_target, PU_MCD_FIR_ACTION0_REG, l_fir_data),
- "Error from putScom (PU_MCD_FIR_ACTION0_REG)");
- FAPI_TRY(fapi2::putScom(i_target, PU_MCD1_MCD_FIR_ACTION0_REG, l_fir_data),
- "Error from putScom (PU_MCD1_MCD_FIR_ACTION0_REG)");
- l_fir_data = MCD_FIR_ACTION1;
- FAPI_TRY(fapi2::putScom(i_target, PU_MCD_FIR_ACTION1_REG, l_fir_data),
- "Error from putScom (PU_MCD_FIR_ACTION1_REG)");
- FAPI_TRY(fapi2::putScom(i_target, PU_MCD1_MCD_FIR_ACTION1_REG, l_fir_data),
- "Error from putScom (PU_MCD1_MCD_FIR_ACTION1_REG)");
- // set mask
- l_fir_data = MCD_FIR_MASK;
- FAPI_TRY(fapi2::putScom(i_target, PU_MCD_FIR_MASK_REG, l_fir_data),
- "Error from putScom (PU_MCD_FIR_MASK_REG)");
- FAPI_TRY(fapi2::putScom(i_target, PU_MCD1_MCD_FIR_MASK_REG, l_fir_data),
- "Error from putScom (PU_MCD1_MCD_FIR_MASK_REG)");
-
- // set MCD vectored group configuration
- l_mcd_vgc_data.insertFromRight<PU_BANK0_MCD_VGC_AVAIL_GROUPS, PU_BANK0_MCD_VGC_AVAIL_GROUPS_LEN>(MCD_VGC_AVAIL_GROUPS);
- l_mcd_vgc_data.setBit<PU_BANK0_MCD_VGC_HANG_POLL_ENABLE>();
- FAPI_TRY(fapi2::putScom(i_target, PU_BANK0_MCD_VGC, l_mcd_vgc_data),
- "Error from putScom (PU_BANK0_MCD_VGC)");
- FAPI_TRY(fapi2::putScom(i_target, PU_MCD1_BANK0_MCD_VGC, l_mcd_vgc_data),
- "Error from putScom (PU_MCD1_BANK0_MCD_VGC)");
-
- // enable MCD probes
- l_mcd_rec_data.setBit<PU_BANK0_MCD_REC_ENABLE>();
- l_mcd_rec_data.setBit<PU_BANK0_MCD_REC_CONTINUOUS>();
- l_mcd_rec_data.insertFromRight<PU_BANK0_MCD_REC_PACE, PU_BANK0_MCD_REC_PACE_LEN>(MCD_RECOVERY_PACE_RATE);
- l_mcd_rec_data.insertFromRight<PU_BANK0_MCD_REC_RTY_COUNT, PU_BANK0_MCD_REC_RTY_COUNT_LEN>(MCD_RECOVERY_RTY_COUNT);
- l_mcd_rec_data.insertFromRight<PU_BANK0_MCD_REC_VG_COUNT, PU_BANK0_MCD_REC_VG_COUNT_LEN>(MCD_RECOVERY_VG_COUNT);
- FAPI_TRY(fapi2::putScom(i_target, PU_BANK0_MCD_REC, l_mcd_rec_data),
- "Error from putScom (PU_BANK0_MCD_REC)");
- FAPI_TRY(fapi2::putScom(i_target, PU_MCD1_BANK0_MCD_REC, l_mcd_rec_data),
- "Error from putScom (PU_MCD1_BANK0_MCD_REC)");
+ FAPI_TRY(p9_setup_bars_mcd_enable(i_target,
+ i_target_sys,
+ i_chip_info),
+ "Error from p9_setup_bars_mcd_enable");
}
fapi_try_exit:
@@ -1020,8 +1247,19 @@ p9_setup_bars(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target)
"Error from p9_setup_bars_npu");
// MCD
- FAPI_TRY(p9_setup_bars_mcd(i_target, FAPI_SYSTEM, l_chip_info),
- "Error from p9_setup_bars_mcd");
+ if (l_chip_info.extended_addressing_mode && l_chip_info.hw423589_option2)
+ {
+ FAPI_TRY(p9_setup_bars_mcd_HW423589_OPTION2(i_target,
+ FAPI_SYSTEM,
+ l_chip_info),
+ "Error from p9_setup_bars_mcd_HW423589_OPTION2");
+ }
+ else
+ {
+ FAPI_TRY(p9_setup_bars_mcd(i_target, FAPI_SYSTEM, l_chip_info),
+ "Error from p9_setup_bars_mcd");
+ }
+
// INT
FAPI_TRY(p9_setup_bars_int(i_target, FAPI_SYSTEM, l_chip_info),
"Error from p9_setup_bars_int");
diff --git a/src/import/chips/p9/procedures/hwp/nest/p9_setup_bars_defs.H b/src/import/chips/p9/procedures/hwp/nest/p9_setup_bars_defs.H
index 36c71fb23..84500f122 100644
--- a/src/import/chips/p9/procedures/hwp/nest/p9_setup_bars_defs.H
+++ b/src/import/chips/p9/procedures/hwp/nest/p9_setup_bars_defs.H
@@ -43,7 +43,7 @@
#include <fapi2.H>
#include <p9_fbc_utils.H>
#include <p9_misc_scom_addresses.H>
-
+#include <p9n2_misc_scom_addresses_fld.H>
//------------------------------------------------------------------------------
// Structure definitions
@@ -289,10 +289,13 @@ struct p9_setup_bars_chip_info
{
uint8_t fbc_group_id;
uint8_t fbc_chip_id;
- uint64_t base_address_nm[2];
- uint64_t base_address_m;
+ std::vector<uint64_t> base_address_nm0;
+ std::vector<uint64_t> base_address_nm1;
+ std::vector<uint64_t> base_address_m;
uint64_t base_address_mmio;
std::vector<p9_setup_bars_addr_range> ranges;
+ uint8_t hw423589_option2;
+ uint8_t extended_addressing_mode;
};
//------------------------------------------------------------------------------
diff --git a/src/import/chips/p9/procedures/xml/error_info/p9_mss_eff_grouping_errors.xml b/src/import/chips/p9/procedures/xml/error_info/p9_mss_eff_grouping_errors.xml
index 7f5344769..13f2aba9e 100644
--- a/src/import/chips/p9/procedures/xml/error_info/p9_mss_eff_grouping_errors.xml
+++ b/src/import/chips/p9/procedures/xml/error_info/p9_mss_eff_grouping_errors.xml
@@ -64,6 +64,8 @@
This is a memory plugging error. Refer to memory plugging rules.
</description>
<ffdc>MC_PORT</ffdc>
+ <ffdc>MC_PORT_SIZE</ffdc>
+ <ffdc>MAX_REGION_SIZE</ffdc>
<callout>
<procedure>MEMORY_PLUGGING_ERROR</procedure>
<priority>HIGH</priority>
@@ -108,15 +110,39 @@
</hwpError>
<hwpError>
- <rc>RC_MSS_EFF_GROUPING_BASE_ADDRESS_OVERLAPS_MIRROR_ADDRESS</rc>
+ <rc>RC_MSS_EFF_GROUPING_NM_REGION_MAP_ERROR</rc>
<description>
- p9_mss_eff_grouping found that the base address overlaps with the
- mirror base address.
+ p9_mss_eff_grouping did not find an available region
+ to map non-mirrored group
</description>
<ffdc>PROC_CHIP</ffdc>
- <ffdc>MEM_BASE_ADDR</ffdc>
- <ffdc>MIRROR_BASE_ADDR</ffdc>
- <ffdc>SIZE_NON_MIRROR</ffdc>
+ <ffdc>MEM_BASE_ADDRS</ffdc>
+ <ffdc>CURR_GROUP_IDX</ffdc>
+ <ffdc>CURR_GROUP_SIZE</ffdc>
+ <ffdc>CURR_REGION_IDX</ffdc>
+ <ffdc>CURR_REGION_SIZE_LEFT</ffdc>
+ <ffdc>MAX_REGION_IDX</ffdc>
+ <ffdc>MAX_REGION_SIZE</ffdc>
+ <callout>
+ <procedure>CODE</procedure>
+ <priority>HIGH</priority>
+ </callout>
+</hwpError>
+
+<hwpError>
+ <rc>RC_MSS_EFF_GROUPING_M_REGION_MAP_ERROR</rc>
+ <description>
+ p9_mss_eff_grouping did not find an available region
+ to map mirrored group
+ </description>
+ <ffdc>PROC_CHIP</ffdc>
+ <ffdc>MIRROR_BASE_ADDRS</ffdc>
+ <ffdc>CURR_GROUP_IDX</ffdc>
+ <ffdc>CURR_GROUP_SIZE</ffdc>
+ <ffdc>CURR_REGION_IDX</ffdc>
+ <ffdc>CURR_REGION_SIZE_LEFT</ffdc>
+ <ffdc>MAX_REGION_IDX</ffdc>
+ <ffdc>MAX_REGION_SIZE</ffdc>
<callout>
<procedure>CODE</procedure>
<priority>HIGH</priority>
diff --git a/src/import/chips/p9/procedures/xml/error_info/p9_setup_bars_errors.xml b/src/import/chips/p9/procedures/xml/error_info/p9_setup_bars_errors.xml
index ddcac8321..657da4205 100644
--- a/src/import/chips/p9/procedures/xml/error_info/p9_setup_bars_errors.xml
+++ b/src/import/chips/p9/procedures/xml/error_info/p9_setup_bars_errors.xml
@@ -114,7 +114,8 @@
<ffdc>NM_RANGE_IDX</ffdc>
<ffdc>NM_RANGE_BASE_ADDR</ffdc>
<ffdc>NM_RANGE_SIZE</ffdc>
- <ffdc>NM_CHIP_BASE</ffdc>
+ <ffdc>NM0_CHIP_BASES</ffdc>
+ <ffdc>NM1_CHIP_BASES</ffdc>
<callout>
<procedure>CODE</procedure>
<priority>HIGH</priority>
@@ -131,7 +132,7 @@
<ffdc>M_RANGE_IDX</ffdc>
<ffdc>M_RANGE_BASE_ADDR</ffdc>
<ffdc>M_RANGE_SIZE</ffdc>
- <ffdc>M_CHIP_BASE</ffdc>
+ <ffdc>M_CHIP_BASES</ffdc>
<callout>
<procedure>CODE</procedure>
<priority>HIGH</priority>
OpenPOWER on IntegriCloud