summaryrefslogtreecommitdiffstats
path: root/src/usr/hdat/hdatmsvpd.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/hdat/hdatmsvpd.C')
-rwxr-xr-xsrc/usr/hdat/hdatmsvpd.C1875
1 files changed, 1440 insertions, 435 deletions
diff --git a/src/usr/hdat/hdatmsvpd.C b/src/usr/hdat/hdatmsvpd.C
index e5593db3d..5b67903f7 100755
--- a/src/usr/hdat/hdatmsvpd.C
+++ b/src/usr/hdat/hdatmsvpd.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2016,2018 */
+/* Contributors Listed Below - COPYRIGHT 2016,2020 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -609,7 +609,8 @@ errlHndl_t HdatMsVpd::addMsAreaAddr(uint16_t i_msAreaId,
bool i_rangeIsMirrorable,
uint8_t i_mirroringAlgorithm,
uint64_t i_startMirrAddr,
- uint32_t i_hdatMemCntrlID)
+ uint32_t i_hdatMemCntrlID,
+ bool i_hdatSmf)
{
errlHndl_t l_errlHndl = NULL;
HdatMsArea *l_obj;
@@ -620,8 +621,14 @@ errlHndl_t HdatMsVpd::addMsAreaAddr(uint16_t i_msAreaId,
if (i_msAreaId < iv_actMsAreaCnt)
{
l_obj = HDAT_MS_AREA(i_msAreaId);
- l_errlHndl = l_obj->addAddrRange(i_start, i_end, i_procChipId,
- i_rangeIsMirrorable, i_mirroringAlgorithm, l_startMirrAddr, i_hdatMemCntrlID);
+ l_errlHndl = l_obj->addAddrRange(i_start,
+ i_end,
+ i_procChipId,
+ i_rangeIsMirrorable,
+ i_mirroringAlgorithm,
+ l_startMirrAddr,
+ i_hdatMemCntrlID,
+ i_hdatSmf);
}
else
{
@@ -926,6 +933,8 @@ void HdatMsVpd::prt()
iv_mover.hdatMoverAddr.lo);
HDAT_INF(" hdatBSRAddr = 0X %08X %08X ", iv_mover.hdatBSRAddr.hi,
iv_mover.hdatBSRAddr.lo);
+ HDAT_INF(" hdatXSCOMAddr = 0X %08X %08X", iv_mover.hdatXSCOMAddr.hi,
+ iv_mover.hdatXSCOMAddr.lo);
HDAT_INF(" **hdatMsVpdImtAddrRange_t**");
hdatPrintHdrs(NULL, NULL, &iv_IMTaddrRngArrayHdr, NULL);
@@ -1013,8 +1022,13 @@ errlHndl_t HdatMsVpd::hdatLoadMsData(uint32_t &o_size, uint32_t &o_count)
l_addr_range.lo = 0x0;
l_end = l_addr_range;
+ //Get the processor model
+ auto l_model = TARGETING::targetService().getProcessorModel();
+
uint32_t l_sizeConfigured = 0;
- uint64_t l_maxMsAddr = hdatGetMaxMemConfiguredAddress();
+
+ uint64_t l_maxMsAddr =
+ hdatGetMaxMemConfiguredAddress(l_model);
hdatMsAddr_t l_tmpMaxMsAddr;
l_tmpMaxMsAddr.hi = (l_maxMsAddr & 0xFFFFFFFF00000000ull) >> 32;
@@ -1037,10 +1051,19 @@ errlHndl_t HdatMsVpd::hdatLoadMsData(uint32_t &o_size, uint32_t &o_count)
TARGETING::ATTR_MAX_MCS_PER_SYSTEM_type l_maxMsAreas =
l_pSysTarget->getAttr<TARGETING::ATTR_MAX_MCS_PER_SYSTEM>();
+ if (l_model == TARGETING::MODEL_NIMBUS)
+ {
+ l_maxMsAreas *= 2;
+ }
+ else
+ {
+ l_maxMsAreas = HDAT_MAX_MSAREA_AXONE;
+ }
+
// Initialize the MS vpd class
// TODO : RTC Story 166994 to set the maximum number of Ms Area entries
// from new attribute
- hdatInit(l_tmpMaxMsAddr,l_tmpMaxMsAddr,l_sizeConfigured,l_maxMsAreas*2,
+ hdatInit(l_tmpMaxMsAddr,l_tmpMaxMsAddr,l_sizeConfigured,l_maxMsAreas,
l_mostSigAffinityDomain_x,l_ueCount,l_mirroringBaseAddress_x);
TARGETING::ATTR_XSCOM_BASE_ADDRESS_type l_xscomAddr =
@@ -1056,7 +1079,9 @@ errlHndl_t HdatMsVpd::hdatLoadMsData(uint32_t &o_size, uint32_t &o_count)
setXSCOM(l_hdatXscomAddr);
}
+ // This contains the MS Area Index
uint32_t l_index = 0;
+
//for each proc/ memory controller in the system
TARGETING::PredicateCTM l_procPred(TARGETING::CLASS_CHIP,
TARGETING::TYPE_PROC);
@@ -1076,77 +1101,12 @@ errlHndl_t HdatMsVpd::hdatLoadMsData(uint32_t &o_size, uint32_t &o_count)
for(;l_procs;++l_procs)
{
+ bool l_smfAdded = false;
+
TARGETING::Target *l_pProcTarget = *(l_procs);
TARGETING::ATTR_ORDINAL_ID_type l_procChipId
= l_pProcTarget->getAttr<TARGETING::ATTR_ORDINAL_ID>();
-
- //For each MCA
- TARGETING::PredicateCTM l_allMca(TARGETING::CLASS_UNIT,
- TARGETING::TYPE_MCA);
- TARGETING::PredicateHwas l_funcMca;
- l_funcMca.functional(true);
- TARGETING::PredicatePostfixExpr l_allFuncMca;
- l_allFuncMca.push(&l_allMca).push(&l_funcMca).And();
-
- TARGETING::TargetHandleList l_mcaList;
-
- TARGETING::targetService().
- getAssociated(l_mcaList, l_pProcTarget,
- TARGETING::TargetService::CHILD,
- TARGETING::TargetService::ALL, &l_allFuncMca);
-
- TARGETING::ATTR_PROC_MEM_BASES_type l_procMemBases = {0};
- assert(l_pProcTarget->
- tryGetAttr<TARGETING::ATTR_PROC_MEM_BASES>(l_procMemBases));
-
- //Sharing count for each group
- TARGETING::ATTR_MSS_MEM_MC_IN_GROUP_type l_mcaSharingCount = {0};
-
- //Group ID for each group, group id will be assigned only
- //if the group is shared
- TARGETING::ATTR_MSS_MEM_MC_IN_GROUP_type l_mcsSharingGrpIds = {0};
-
- //Size configured under each group
- TARGETING::ATTR_PROC_MEM_SIZES_type l_procMemSizesBytes = {0};
-
- assert(l_pProcTarget->tryGetAttr<TARGETING::ATTR_PROC_MEM_SIZES>
- (l_procMemSizesBytes));
-
-
-
- for(uint32_t l_mcaIdx = 0; l_mcaIdx<l_mcaList.size();
- ++l_mcaIdx)
- {
- uint32_t l_mcaInGrp = 0;
- TARGETING::Target *l_pMcaTarget =
- l_mcaList[l_mcaIdx];
- if(!hdatFindGroupForMc(l_pProcTarget,
- l_pMcaTarget,
- l_mcaInGrp))
- {
- //Skip this MCA is not in any group
- continue;
- }
-
- //Increment sharing count if mem configured under group.
- if(l_procMemSizesBytes[l_mcaInGrp] > 0)
- {
- l_mcaSharingCount[l_mcaInGrp]++;
-
- //Assign sharing group id only if shared
- //And only when first instance of sharing is found
- if(l_mcaSharingCount[l_mcaInGrp] ==
- HDAT_MIN_NUM_FOR_SHARING)
- {
- l_mcsSharingGrpIds[l_mcaInGrp] =
- l_nxtSharingGroupId;
- l_nxtSharingGroupId++;
- }
- }
- }
-
-
// TODO : RTC Story 159682
// Further CHTM support needs to be added which contains the trace
// array for 24 cores
@@ -1154,14 +1114,14 @@ errlHndl_t HdatMsVpd::hdatLoadMsData(uint32_t &o_size, uint32_t &o_count)
hdatMsAddr_t l_hdatNhtmEndAddr;
TARGETING::ATTR_PROC_NHTM_BAR_BASE_ADDR_type l_nhtmStartAddr =
- l_pProcTarget->getAttr<TARGETING::ATTR_PROC_NHTM_BAR_BASE_ADDR>();
+ l_pProcTarget->getAttr<TARGETING::ATTR_PROC_NHTM_BAR_BASE_ADDR>();
TARGETING::ATTR_PROC_NHTM_BAR_SIZE_type l_nhtmSize =
l_pProcTarget->getAttr<TARGETING::ATTR_PROC_NHTM_BAR_SIZE>();
if( 0 != l_nhtmSize )
{
l_hdatNhtmStartAddr.hi =
- (l_nhtmStartAddr & 0xFFFFFFFF00000000ull) >> 32;
+ (l_nhtmStartAddr & 0xFFFFFFFF00000000ull) >> 32;
l_hdatNhtmStartAddr.lo =
l_nhtmStartAddr & 0x00000000FFFFFFFFull;
l_hdatNhtmStartAddr.hi |= HDAT_REAL_ADDRESS_MASK;
@@ -1185,433 +1145,1236 @@ errlHndl_t HdatMsVpd::hdatLoadMsData(uint32_t &o_size, uint32_t &o_count)
l_nhtmSize);
}
+ TARGETING::ATTR_PROC_MEM_BASES_type l_procMemBases = {0};
+ assert(l_pProcTarget->
+ tryGetAttr<TARGETING::ATTR_PROC_MEM_BASES>(l_procMemBases));
+
+ TARGETING::ATTR_PROC_MIRROR_BASES_type l_MirrorAddr = {0};
+ assert(l_pProcTarget->tryGetAttr<
+ TARGETING::ATTR_PROC_MIRROR_BASES>(l_MirrorAddr));
+
+ TARGETING::ATTR_PROC_MIRROR_SIZES_type l_MirrorSize = {0};
+ assert(l_pProcTarget->tryGetAttr<
+ TARGETING::ATTR_PROC_MIRROR_SIZES>(l_MirrorSize));
- TARGETING::PredicateCTM l_mcbistPredicate(TARGETING::CLASS_UNIT,
+ TARGETING::ATTR_PAYLOAD_IN_MIRROR_MEM_type l_payLoadMirrorMem =
+ l_pSysTarget->getAttr<TARGETING::ATTR_PAYLOAD_IN_MIRROR_MEM>();
+
+ if(l_model == TARGETING::MODEL_NIMBUS)
+ {
+ //Sharing count for each group
+ TARGETING::ATTR_MSS_MEM_MC_IN_GROUP_type l_mcaSharingCount
+ = {0};
+
+ //Group ID for each group, group id will be assigned only
+ //if the group is shared
+ TARGETING::ATTR_MSS_MEM_MC_IN_GROUP_type l_mcsSharingGrpIds
+ = {0};
+
+ //Size configured under each group
+ TARGETING::ATTR_PROC_MEM_SIZES_type l_procMemSizesBytes = {0};
+
+ assert(l_pProcTarget->tryGetAttr<TARGETING::ATTR_PROC_MEM_SIZES>
+ (l_procMemSizesBytes));
+
+ //For each MCA
+ TARGETING::PredicateCTM l_allMca(TARGETING::CLASS_UNIT,
+ TARGETING::TYPE_MCA);
+ TARGETING::PredicateHwas l_funcMca;
+ l_funcMca.functional(true);
+ TARGETING::PredicatePostfixExpr l_allFuncMca;
+ l_allFuncMca.push(&l_allMca).push(&l_funcMca).And();
+
+ TARGETING::TargetHandleList l_mcaList;
+
+ TARGETING::targetService().
+ getAssociated(l_mcaList, l_pProcTarget,
+ TARGETING::TargetService::CHILD,
+ TARGETING::TargetService::ALL, &l_allFuncMca);
+
+ for(uint32_t l_mcaIdx = 0; l_mcaIdx<l_mcaList.size();
+ ++l_mcaIdx)
+ {
+ uint32_t l_mcaInGrp = 0;
+ TARGETING::Target *l_pMcaTarget =
+ l_mcaList[l_mcaIdx];
+ if(!hdatFindGroupForMc(l_pProcTarget,
+ l_pMcaTarget,
+ l_mcaInGrp))
+ {
+ //Skip this MCA is not in any group
+ continue;
+ }
+
+ //Increment sharing count if mem configured under group.
+ if(l_procMemSizesBytes[l_mcaInGrp] > 0)
+ {
+ l_mcaSharingCount[l_mcaInGrp]++;
+
+ //Assign sharing group id only if shared
+ //And only when first instance of sharing is found
+ if(l_mcaSharingCount[l_mcaInGrp] ==
+ HDAT_MIN_NUM_FOR_SHARING)
+ {
+ l_mcsSharingGrpIds[l_mcaInGrp] =
+ l_nxtSharingGroupId;
+ l_nxtSharingGroupId++;
+ }
+ }
+ }
+
+ TARGETING::PredicateCTM l_mcbistPredicate(TARGETING::CLASS_UNIT,
TARGETING::TYPE_MCBIST);
- TARGETING::PredicatePostfixExpr l_presentMcbist;
+ TARGETING::PredicatePostfixExpr l_presentMcbist;
l_presentMcbist.push(&l_mcbistPredicate).
push(&l_predHwasFunc).And();
- TARGETING::TargetHandleList l_mcbistList;
+ TARGETING::TargetHandleList l_mcbistList;
- // Find Associated MCBIST list
- TARGETING::targetService().getAssociated(l_mcbistList,
+ // Find Associated MCBIST list
+ TARGETING::targetService().getAssociated(l_mcbistList,
l_pProcTarget,
TARGETING::TargetService::CHILD_BY_AFFINITY,
TARGETING::TargetService::ALL,
&l_presentMcbist);
- //scan all mcbist in this proc
- for(uint32_t l_mcbistIdx =0;
- l_mcbistIdx < l_mcbistList.size();
- ++l_mcbistIdx)
- {
- TARGETING::Target *l_pMcbistTarget = l_mcbistList[l_mcbistIdx];
-
- TARGETING::PredicateCTM l_mcsPredicate(TARGETING::CLASS_UNIT,
- TARGETING::TYPE_MCS);
+ //scan all mcbist in this proc
+ for(uint32_t l_mcbistIdx =0;
+ l_mcbistIdx < l_mcbistList.size();
+ ++l_mcbistIdx)
+ {
+ TARGETING::Target *l_pMcbistTarget =
+ l_mcbistList[l_mcbistIdx];
+
+ TARGETING::PredicateCTM l_mcsPredicate(
+ TARGETING::CLASS_UNIT,
+ TARGETING::TYPE_MCS);
- TARGETING::PredicatePostfixExpr l_funcMcs;
+ TARGETING::PredicatePostfixExpr l_funcMcs;
l_funcMcs.push(&l_mcsPredicate).push(&l_predHwasFunc).And();
- TARGETING::TargetHandleList l_mcsList;
+ TARGETING::TargetHandleList l_mcsList;
- // Find Associated memory controllers
- TARGETING::targetService().getAssociated(l_mcsList,
+ // Find Associated memory controllers
+ TARGETING::targetService().getAssociated(l_mcsList,
l_pMcbistTarget,
TARGETING::TargetService::CHILD,
TARGETING::TargetService::ALL,
&l_funcMcs);
- uint32_t l_memBusFreq = getMemBusFreq(l_pMcbistTarget);
+ uint32_t l_memBusFreq = getMemBusFreq(l_pMcbistTarget);
- //scan all mcs in this proc to get sharing counit
- for(uint32_t l_mcsIdx = 0;l_mcsIdx<l_mcsList.size(); ++l_mcsIdx)
- {
- TARGETING::Target *l_pMcsTarget = l_mcsList[l_mcsIdx];
+ //scan all mcs in this proc to get sharing counit
+ for(uint32_t l_mcsIdx = 0;l_mcsIdx<l_mcsList.size();
+ ++l_mcsIdx)
+ {
+ TARGETING::Target *l_pMcsTarget = l_mcsList[l_mcsIdx];
- //for each MCA connected to this this MCS
- TARGETING::PredicateCTM l_mcaPredicate(
- TARGETING::CLASS_UNIT, TARGETING::TYPE_MCA);
+ //for each MCA connected to this this MCS
+ TARGETING::PredicateCTM l_mcaPredicate(
+ TARGETING::CLASS_UNIT, TARGETING::TYPE_MCA);
- TARGETING::PredicateHwas l_predMca;
- l_predMca.present(true);
- TARGETING::PredicatePostfixExpr l_presentMca;
- l_presentMca.push(&l_mcaPredicate).push(&l_predMca).And();
- TARGETING::TargetHandleList l_mcaList;
+ TARGETING::PredicateHwas l_predMca;
+ l_predMca.present(true);
+ TARGETING::PredicatePostfixExpr l_presentMca;
+ l_presentMca.push(&l_mcaPredicate).
+ push(&l_predMca).And();
+ TARGETING::TargetHandleList l_mcaList;
- // Get associated MCAs
- TARGETING::targetService().
- getAssociated(l_mcaList, l_pMcsTarget,
- TARGETING::TargetService::CHILD_BY_AFFINITY,
- TARGETING::TargetService::ALL, &l_presentMca);
+ // Get associated MCAs
+ TARGETING::targetService().
+ getAssociated(l_mcaList, l_pMcsTarget,
+ TARGETING::TargetService::CHILD_BY_AFFINITY,
+ TARGETING::TargetService::ALL, &l_presentMca);
- for(uint32_t l_mcaIdx = 0; l_mcaIdx<l_mcaList.size();
- ++l_mcaIdx)
- {
- TARGETING::Target *l_pMcaTarget =
- l_mcaList[l_mcaIdx];
+ for(uint32_t l_mcaIdx = 0; l_mcaIdx<l_mcaList.size();
+ ++l_mcaIdx)
+ {
+ TARGETING::Target *l_pMcaTarget =
+ l_mcaList[l_mcaIdx];
- //Group which this MCA is belonging
- uint32_t l_mcaInGrp = 0;
+ //Group which this MCA is belonging
+ uint32_t l_mcaInGrp = 0;
- if(!hdatFindGroupForMc(l_pProcTarget,
- l_pMcaTarget,
- l_mcaInGrp))
- {
- HDAT_INF("No group found for MCA");
- //Skip this MCS is not under any group
- continue;
- }
- uint32_t l_mcaFruId = 0;
- hdatMemParentType l_parentType= HDAT_MEM_PARENT_CEC_FRU;
-
- std::list<hdatRamArea> l_areas;
- l_areas.clear();
- uint32_t l_areaSizeInMB = 0;
- bool l_areaFunctional = false;
- uint32_t l_numDimms =0;
-
- l_err = hdatScanDimms(l_pMcaTarget,
- l_pMcsTarget,
- l_mcaFruId,
- l_areas,
- l_areaSizeInMB,
- l_numDimms,
- l_areaFunctional,
- l_parentType);
-
- if(NULL != l_err)
- {
- HDAT_ERR("Error in calling Scan Dimms");
- break;
- }
+ if(!hdatFindGroupForMc(l_pProcTarget,
+ l_pMcaTarget,
+ l_mcaInGrp))
+ {
+ HDAT_INF("No group found for MCA");
+ //Skip this MCS is not under any group
+ continue;
+ }
+ uint32_t l_mcaFruId = 0;
+ hdatMemParentType l_parentType =
+ HDAT_MEM_PARENT_CEC_FRU;
+
+ std::list<hdatRamArea> l_areas;
+ l_areas.clear();
+ uint32_t l_areaSizeInMB = 0;
+ bool l_areaFunctional = false;
+ uint32_t l_numDimms =0;
+
+ l_err = hdatScanDimms(l_pMcaTarget,
+ l_pMcsTarget,
+ l_mcaFruId,
+ l_areas,
+ l_areaSizeInMB,
+ l_numDimms,
+ l_areaFunctional,
+ l_parentType);
+
+ if(NULL != l_err)
+ {
+ HDAT_ERR("Error in calling Scan Dimms");
+ break;
+ }
- HDAT_INF("l_areaSizeInMB:0x%.8X l_numDimms:0x%.8X "
- "l_areas.size():0x%.8X", l_areaSizeInMB, l_numDimms,
- l_areas.size());
+ HDAT_INF("l_areaSizeInMB:0x%.8X l_numDimms:0x%.8X "
+ "l_areas.size():0x%.8X", l_areaSizeInMB,
+ l_numDimms, l_areas.size());
- //Skip if no memory configured under this MCS
- if(l_areaSizeInMB == 0)
- {
- continue;
- }
+ //Skip if no memory configured under this MCS
+ if(l_areaSizeInMB == 0)
+ {
+ continue;
+ }
- uint32_t l_maxMemBlocks = 0;
- l_err =
+ uint32_t l_maxMemBlocks = 0;
+ l_err =
hdatGetMaxMemoryBlocks(l_pMcsTarget,l_maxMemBlocks);
- if(NULL != l_err)
- {
- HDAT_ERR("Error error in get max blocks");
- break;
- }
+ if(NULL != l_err)
+ {
+ HDAT_ERR("Error error in get max blocks");
+ break;
+ }
- TARGETING::ATTR_SLCA_RID_type l_procRid =
+ TARGETING::ATTR_SLCA_RID_type l_procRid =
l_pProcTarget->getAttr<TARGETING::ATTR_SLCA_RID>();
- TARGETING::ATTR_SLCA_INDEX_type l_procSlcaIndex =
- l_pProcTarget->getAttr<TARGETING::ATTR_SLCA_INDEX>();
-
+ TARGETING::ATTR_SLCA_INDEX_type l_procSlcaIndex =
+ l_pProcTarget->getAttr
+ <TARGETING::ATTR_SLCA_INDEX>();
- l_err = addMsAreaFru(l_procRid,
- l_procSlcaIndex,
- l_pProcTarget,
- l_index,
- l_numDimms,
- MAX_CHIP_EC_CNT_PER_MSAREA,
- l_maxMemBlocks);
+ l_err = addMsAreaFru(l_procRid,
+ l_procSlcaIndex,
+ l_pProcTarget,
+ l_index,
+ l_numDimms,
+ MAX_CHIP_EC_CNT_PER_MSAREA,
+ l_maxMemBlocks);
- if(NULL != l_err)
- {
- HDAT_ERR("Error adding MSArea %d"
- "Number of Dimms: %d Max Blocks: %d",
- l_index,
- l_numDimms,l_maxMemBlocks);
- break;
- }
+ if(NULL != l_err)
+ {
+ HDAT_ERR("Error adding MSArea %d"
+ "Number of Dimms: %d Max Blocks: %d",
+ l_index,
+ l_numDimms,l_maxMemBlocks);
+ break;
+ }
- uint32_t l_memStatus = 0;
- //If group is shared with more than one area
- if(l_mcaSharingCount[l_mcaInGrp] >=
- HDAT_MIN_NUM_FOR_SHARING)
- {
- l_memStatus = HDAT_MEM_SHARED;
- setMsAreaInterleavedId(l_index,
- l_mcsSharingGrpIds[l_mcaInGrp]);
- }
+ uint32_t l_memStatus = 0;
+ //If group is shared with more than one area
+ if(l_mcaSharingCount[l_mcaInGrp] >=
+ HDAT_MIN_NUM_FOR_SHARING)
+ {
+ l_memStatus = HDAT_MEM_SHARED;
+ setMsAreaInterleavedId(l_index,
+ l_mcsSharingGrpIds[l_mcaInGrp]);
+ }
- setMsAreaType(l_index,l_parentType);
- setMsAreaSize(l_index,l_areaSizeInMB);
+ setMsAreaType(l_index,l_parentType);
+ setMsAreaSize(l_index,l_areaSizeInMB);
- iv_maxSize.hdatTotSize += l_areaSizeInMB;
+ iv_maxSize.hdatTotSize += l_areaSizeInMB;
- l_memStatus |= l_areaFunctional ?
- (HDAT_MEM_INSTALLED | HDAT_MEM_FUNCTIONAL) :
- HDAT_MEM_INSTALLED;
+ l_memStatus |= l_areaFunctional ?
+ (HDAT_MEM_INSTALLED | HDAT_MEM_FUNCTIONAL) :
+ HDAT_MEM_INSTALLED;
- setMsAreaStat(l_index, l_memStatus);
+ setMsAreaStat(l_index, l_memStatus);
- //Add MCS ec level
- uint32_t l_mcsEcLevel = 0;
- uint32_t l_mcsChipId = 0;
- l_err = hdatGetIdEc(l_pMcsTarget,
- l_mcsEcLevel,
- l_mcsChipId);
- if(NULL != l_err)
- {
- HDAT_ERR("Error in getting MCS ID "
+ //Add MCS ec level
+ uint32_t l_mcsEcLevel = 0;
+ uint32_t l_mcsChipId = 0;
+ l_err = hdatGetIdEc(l_pMcsTarget,
+ l_mcsEcLevel,
+ l_mcsChipId);
+ if(NULL != l_err)
+ {
+ HDAT_ERR("Error in getting MCS ID "
"and EC HUID:[0x%08X]",
l_pMcsTarget->getAttr<TARGETING::ATTR_HUID>());
- break;
- }
+ break;
+ }
- l_err = addEcEntry(l_index,
- l_mcsChipId,
- l_mcsEcLevel);
- if(NULL != l_err)
- {
- HDAT_ERR("Error in adding"
+ l_err = addEcEntry(l_index,
+ l_mcsChipId,
+ l_mcsEcLevel);
+ if(NULL != l_err)
+ {
+ HDAT_ERR("Error in adding"
" ID[0x%08X] and EC[0x%08X] to ms area"
" HUID:[0x%08X]",l_mcsChipId,
l_mcsEcLevel,
l_pMcsTarget->getAttr<TARGETING::ATTR_HUID>());
- break;
- }
+ break;
+ }
- // Need to get i2c Master data correctly
- std::vector<hdatI2cData_t> l_i2cDevEntries;
+ // Need to get i2c Master data correctly
+ std::vector<hdatI2cData_t> l_i2cDevEntries;
- TARGETING::PredicateCTM l_membufPredicate(
- TARGETING::CLASS_CHIP, TARGETING::TYPE_MEMBUF);
+ TARGETING::PredicateCTM l_membufPredicate(
+ TARGETING::CLASS_CHIP, TARGETING::TYPE_MEMBUF);
- TARGETING::PredicatePostfixExpr l_presentMemBuf;
- l_presentMemBuf.push(&l_membufPredicate).
+ TARGETING::PredicatePostfixExpr l_presentMemBuf;
+ l_presentMemBuf.push(&l_membufPredicate).
push(&l_predHwasPresent).And();
- TARGETING::TargetHandleList l_membufList;
+ TARGETING::TargetHandleList l_membufList;
- // Find Associated membuf
- TARGETING::targetService().getAssociated(l_membufList,
- l_pMcsTarget,
- TARGETING::TargetService::CHILD_BY_AFFINITY,
- TARGETING::TargetService::ALL,
- &l_presentMemBuf);
- //Skip is there is no Membuf attached to this MCS
- if(l_membufList.size() > 0)
- {
- TARGETING::Target *l_pMembufTarget =
- l_membufList[0];
- if (l_pMembufTarget != NULL)
+ // Find Associated membuf
+ TARGETING::targetService().getAssociated(
+ l_membufList,
+ l_pMcsTarget,
+ TARGETING::TargetService::CHILD_BY_AFFINITY,
+ TARGETING::TargetService::ALL,
+ &l_presentMemBuf);
+ //Skip is there is no Membuf attached to this MCS
+ if(l_membufList.size() > 0)
{
- hdatGetI2cDeviceInfo(l_pMembufTarget,
- l_i2cDevEntries);
+ TARGETING::Target *l_pMembufTarget =
+ l_membufList[0];
+ if (l_pMembufTarget != NULL)
+ {
+ hdatGetI2cDeviceInfo(l_pMembufTarget,
+ l_model,
+ l_i2cDevEntries);
+ }
}
- }
- setMsaI2cInfo(l_index, l_i2cDevEntries);
+ setMsaI2cInfo(l_index, l_i2cDevEntries);
- std::list<hdatRamArea>::iterator l_area =
- l_areas.begin();
+ std::list<hdatRamArea>::iterator l_area =
+ l_areas.begin();
- for (uint32_t l_ramId = 0;
- l_area != l_areas.end();
- ++l_ramId, ++l_area)
- {
- uint32_t l_status = (l_area)->ivFunctional ?
+ for (uint32_t l_ramId = 0;
+ l_area != l_areas.end();
+ ++l_ramId, ++l_area)
+ {
+ uint32_t l_status = (l_area)->ivFunctional ?
(HDAT_RAM_INSTALLED | HDAT_RAM_FUNCTIONAL)
: HDAT_RAM_INSTALLED;
- TARGETING::Target *l_pDimmTarget =
- TARGETING::Target::getTargetFromHuid(l_area->ivHuid);
-
- TARGETING::ATTR_SLCA_RID_type l_dimmRid =
- l_pDimmTarget->getAttr<TARGETING::ATTR_SLCA_RID>();
-
- TARGETING::ATTR_SLCA_INDEX_type l_dimmSlcaIndex =
- l_pDimmTarget->getAttr<TARGETING::ATTR_SLCA_INDEX>();
-
- uint32_t l_dimmId =
- 1 << (31 - (l_pDimmTarget->getAttr<TARGETING::ATTR_FAPI_POS>() % MAX_DIMMS_PER_MCBIST));
- l_err = addRamFru(l_index,
- l_pDimmTarget,
- l_dimmRid,
- l_dimmSlcaIndex,
- l_ramId,
- l_status,
- (l_area)->ivSize,
- l_dimmId,
- l_memBusFreq);
-
- if (l_err) // Failed to add ram fru information
- {
- HDAT_ERR("Error in adding RAM FRU"
- "Index:%d Rid:[0x%08X] status:[0x%08X]"
- "Size:[0x%08X] RamID:[0x%08X]",
- l_index,(l_area)->ivHuid,
- l_status,(l_area)->ivSize,l_ramId);
- ERRORLOG::errlCommit(l_err,HDAT_COMP_ID);
-
- delete l_err;
- l_err = NULL;
- continue;
- }
- }//end of RAM list
+ TARGETING::Target *l_pDimmTarget =
+ TARGETING::Target::getTargetFromHuid(
+ l_area->ivHuid);
+
+ TARGETING::ATTR_SLCA_RID_type l_dimmRid =
+ l_pDimmTarget->getAttr
+ <TARGETING::ATTR_SLCA_RID>();
+
+ TARGETING::ATTR_SLCA_INDEX_type l_dimmSlcaIndex=
+ l_pDimmTarget->getAttr
+ <TARGETING::ATTR_SLCA_INDEX>();
+
+ uint32_t l_dimmId =
+ 1 << (31 - (l_pDimmTarget->getAttr
+ <TARGETING::ATTR_FAPI_POS>() %
+ MAX_DIMMS_PER_MCBIST));
+ l_err = addRamFru(l_index,
+ l_pDimmTarget,
+ l_dimmRid,
+ l_dimmSlcaIndex,
+ l_ramId,
+ l_status,
+ (l_area)->ivSize,
+ l_dimmId,
+ l_memBusFreq);
+
+ if (l_err) // Failed to add ram fru information
+ {
+ HDAT_ERR("Error in adding RAM FRU"
+ "Index:%d Rid:[0x%08X] status:[0x%08X]"
+ "Size:[0x%08X] RamID:[0x%08X]",
+ l_index,(l_area)->ivHuid,
+ l_status,(l_area)->ivSize,l_ramId);
+ ERRORLOG::errlCommit(l_err,HDAT_COMP_ID);
+
+ delete l_err;
+ l_err = NULL;
+ continue;
+ }
+ }//end of RAM list
- l_addr_range.hi = (l_procMemBases[l_mcaInGrp] &
+ l_addr_range.hi = (l_procMemBases[l_mcaInGrp] &
0xFFFFFFFF00000000ull) >> 32;
- l_addr_range.lo = l_procMemBases[l_mcaInGrp] &
+ l_addr_range.lo = l_procMemBases[l_mcaInGrp] &
0x00000000FFFFFFFFull;
- l_end = l_addr_range;
+ l_end = l_addr_range;
- //Update the range
- l_end.hi += (l_procMemSizesBytes[l_mcaInGrp] &
+ //Update the range
+ l_end.hi += (l_procMemSizesBytes[l_mcaInGrp] &
0xFFFFFFFF00000000ull) >> 32;
- l_end.lo += l_procMemSizesBytes[l_mcaInGrp] &
+ l_end.lo += l_procMemSizesBytes[l_mcaInGrp] &
0x00000000FFFFFFFFull;
- HDAT_INF("MCS:0x%08X l_addr_range:0x%08X 0x%08X"
- " l_end:0x%08X 0x%08X",
- l_pMcsTarget->getAttr<TARGETING::ATTR_HUID>(),
- l_addr_range.hi, l_addr_range.lo,
- l_end.hi,l_end.lo);
-
- uint64_t l_hdatMirrorAddr_x = 0x0ull;
- uint64_t l_hdatMirrorAddr = 0x0ull;
- uint32_t l_hdatMemcntrlID = 0x0 ;
- uint8_t l_hdatMirrorAlogrithm = 0xFF;
- bool l_rangeIsMirrorable = false;
-
- TARGETING::ATTR_PROC_MIRROR_BASES_type
- l_MirrorAddr = {0};
- assert(l_pProcTarget->tryGetAttr<
- TARGETING::ATTR_PROC_MIRROR_BASES>(l_MirrorAddr));
-
- TARGETING::ATTR_PROC_MIRROR_SIZES_type
- l_MirrorSize = {0};
- assert(l_pProcTarget->tryGetAttr<
- TARGETING::ATTR_PROC_MIRROR_SIZES>(l_MirrorSize));
-
- uint64_t l_startAddr =
+ HDAT_INF("MCS:0x%08X l_addr_range:0x%08X 0x%08X"
+ " l_end:0x%08X 0x%08X",
+ l_pMcsTarget->getAttr<TARGETING::ATTR_HUID>(),
+ l_addr_range.hi, l_addr_range.lo,
+ l_end.hi,l_end.lo);
+
+ uint64_t l_hdatMirrorAddr_x = 0x0ull;
+ uint64_t l_hdatMirrorAddr = 0x0ull;
+ uint32_t l_hdatMemcntrlID = 0x0 ;
+ uint8_t l_hdatMirrorAlogrithm = 0xFF;
+ bool l_rangeIsMirrorable = false;
+
+ //Calculate the mirror address and related data
+ uint64_t l_startAddr =
(((uint64_t)(l_addr_range.hi) << 32 )
| (uint64_t)(l_addr_range.lo));
- l_hdatMirrorAddr_x =
- (l_startAddr / 2) + l_mirrorBaseAddress_x;
-
- TARGETING::ATTR_PAYLOAD_IN_MIRROR_MEM_type
- l_payLoadMirrorMem =
- l_pSysTarget->getAttr<
- TARGETING::ATTR_PAYLOAD_IN_MIRROR_MEM>();
+ l_hdatMirrorAddr_x =
+ (l_startAddr / 2) + l_mirrorBaseAddress_x;
- HDAT_INF(
- "Start add : 0x%016llX MirrorBase : 0x%016llX"
- " MirrorAddr : 0x%016llX PayLoadMirrorMem : 0x%X",
- l_startAddr, l_mirrorBaseAddress_x,
- l_hdatMirrorAddr_x, l_payLoadMirrorMem);
+ HDAT_INF(
+ "Start add : 0x%016llX MirrorBase : 0x%016llX"
+ " MirrorAddr : 0x%016llX PayLoadMirrorMem : 0x%X",
+ l_startAddr, l_mirrorBaseAddress_x,
+ l_hdatMirrorAddr_x, l_payLoadMirrorMem);
- if ( 0 != l_payLoadMirrorMem )
- {
- for ( int idx=0 ; idx <
- (int)(sizeof(TARGETING::ATTR_PROC_MIRROR_SIZES_type)
- / sizeof(uint64_t)) ; idx++ )
+ if ( 0 != l_payLoadMirrorMem )
{
- HDAT_INF("Mirror size : 0x%016llX"
- " MirrorAddr[idx] : 0x%016llX"
- " hdatMirrorAddr_x : 0x%016llX",
- l_MirrorSize[idx], l_MirrorAddr[idx],
- l_hdatMirrorAddr_x);
+ for ( int idx=0 ; idx <
+ (int)
+ (sizeof(TARGETING::ATTR_PROC_MIRROR_SIZES_type)
+ / sizeof(uint64_t)) ; idx++ )
+ {
+ HDAT_INF("Mirror size : 0x%016llX"
+ " MirrorAddr : 0x%016llX"
+ " hdatMirrorAddr_x : 0x%016llX",
+ l_MirrorSize[idx], l_MirrorAddr[idx],
+ l_hdatMirrorAddr_x);
- if( (0 != l_MirrorSize[idx]) &&
+ if( (0 != l_MirrorSize[idx]) &&
(l_MirrorAddr[idx] == l_hdatMirrorAddr_x) )
- {
- l_rangeIsMirrorable = true;
- l_hdatMirrorAddr = l_MirrorAddr[idx]
+ {
+ l_rangeIsMirrorable = true;
+ l_hdatMirrorAddr = l_MirrorAddr[idx]
| HDAT_REAL_ADDRESS_MASK64;
- break;
+ break;
+ }
}
}
- }
- if(l_pProcTarget->getAttr<TARGETING::ATTR_MODEL>() == TARGETING::MODEL_NIMBUS)
- {
+
// Set the memory controller ID
- l_hdatMemcntrlID |= 1 << (31 - l_pMcbistTarget->getAttr<TARGETING::ATTR_CHIP_UNIT>());
- l_hdatMemcntrlID |= 1 << (31 - (l_pMcsTarget->getAttr<TARGETING::ATTR_CHIP_UNIT>() + 4));
- l_hdatMemcntrlID |= 1 << (31 - (l_pMcaTarget->getAttr<TARGETING::ATTR_CHIP_UNIT>() + 8));
- }
- else if(l_pProcTarget->getAttr<TARGETING::ATTR_MODEL>() == TARGETING::MODEL_CUMULUS)
- {
- //TODO : MEmory controller ID for cumulus need to be defined.
- HDAT_INF("Memory controller ID : 0 since this is Cumulus proc");
- }
- l_err = addMsAreaAddr(l_index,
- l_addr_range,
- l_end,
- l_procChipId,
- l_rangeIsMirrorable,
- l_hdatMirrorAlogrithm,
- l_hdatMirrorAddr,
- l_hdatMemcntrlID);
- if(NULL != l_err)
+ l_hdatMemcntrlID |=
+ 1 << (31 - l_pMcbistTarget->getAttr
+ <TARGETING::ATTR_CHIP_UNIT>());
+ l_hdatMemcntrlID |=
+ 1 << (31 - (l_pMcsTarget->getAttr
+ <TARGETING::ATTR_CHIP_UNIT>() + 4));
+ l_hdatMemcntrlID |=
+ 1 << (31 - (l_pMcaTarget->getAttr
+ <TARGETING::ATTR_CHIP_UNIT>() + 8));
+
+ l_err = addMsAreaAddr(l_index,
+ l_addr_range,
+ l_end,
+ l_procChipId,
+ l_rangeIsMirrorable,
+ l_hdatMirrorAlogrithm,
+ l_hdatMirrorAddr,
+ l_hdatMemcntrlID);
+ if(NULL != l_err)
+ {
+ HDAT_ERR("Error in adding addMsAreaAddr"
+ " to ms area index[%d]",
+ l_index);
+ break;
+ }
+
+ // TODO : RTC Story 159682
+ // Further CHTM support needs to be added which
+ // contains the trace array for 24 cores
+ // Reinitializing the NHTM size
+
+ // Don't re-init NHTM size -- only one HTM region
+ // per proc
+ uint64_t l_end_hi = l_end.hi;
+ uint64_t l_end_lo = l_end.lo;
+ uint64_t l_end_addr =
+ ((l_end_hi << 32 ) | l_end_lo);
+
+
+ uint64_t l_addr_range_hi = l_addr_range.hi;
+ uint64_t l_addr_range_lo = l_addr_range.lo;
+ uint64_t l_start_addr =
+ ((l_addr_range_hi << 32 )| l_addr_range_lo);
+
+ uint64_t l_size_bytes = ((uint64_t)l_areaSizeInMB) *
+ l_mcaSharingCount[l_mcaInGrp] * 1024 * 1024;
+
+ if((0 != l_nhtmSize) &&
+ (l_size_bytes != (l_end_addr - l_start_addr)))
+ {
+ HDAT_INF("NHTM Bar size = 0x%016llX "
+ " MS area size = 0x%016llX"
+ " l_end_addr = 0x%016llX"
+ " l_start_addr = 0x%016llX",
+ l_nhtmSize,l_size_bytes, l_end_addr,
+ l_start_addr);
+
+ l_addr_range.lo = l_hdatNhtmStartAddr.lo;
+ l_addr_range.hi = l_hdatNhtmStartAddr.hi;
+
+ l_end.lo = l_hdatNhtmEndAddr.lo;
+ l_end.hi = l_hdatNhtmEndAddr.hi;
+
+ l_err = addMsAreaAddr(l_index,
+ l_addr_range,
+ l_end,
+ l_procChipId,
+ false, 0, 0);
+ if(NULL != l_err)
+ {
+ HDAT_ERR("Error in adding "
+ " addMsAreaAddr to ms area index[%d]",
+ l_index);
+ break;
+ }
+ l_nhtmSize=0; //only add 1 entry
+ }
+ l_addr_range = l_end;
+
+ auto l_smfStartAddr = l_pProcTarget->
+ getAttr<TARGETING::ATTR_PROC_SMF_BAR_BASE_ADDR>();
+ auto l_smfSize = l_pProcTarget->
+ getAttr<TARGETING::ATTR_PROC_SMF_BAR_SIZE>();
+
+ if(l_smfSize && !l_smfAdded)
+ {
+ hdatMsAddr_t l_hdatSmfStartAddr{};
+ hdatMsAddr_t l_hdatSmfEndAddr{};
+ l_hdatSmfStartAddr.hi =
+ (l_smfStartAddr & 0xFFFFFFFF00000000ull) >> 32;
+ l_hdatSmfStartAddr.lo =
+ l_smfStartAddr & 0x00000000FFFFFFFFull;
+ l_hdatSmfStartAddr.hi |= HDAT_REAL_ADDRESS_MASK;
+
+ l_hdatSmfEndAddr.hi =
+ ((l_smfStartAddr + l_smfSize) &
+ 0xFFFFFFFF00000000ull) >>32;
+ l_hdatSmfEndAddr.lo =
+ (l_smfStartAddr + l_smfSize) &
+ 0x00000000FFFFFFFFull;
+ l_hdatSmfEndAddr.hi |= HDAT_REAL_ADDRESS_MASK;
+
+ l_err = addMsAreaAddr(l_index,
+ l_hdatSmfStartAddr,
+ l_hdatSmfEndAddr,
+ l_procChipId,
+ false, //rangeIsMirrorable
+ 0, // i_mirroringAlgorithm
+ 0, // i_startMirrAddr
+ l_hdatMemcntrlID,
+ true); // i_hdatsmf
+ l_smfAdded = true;
+ }
+
+ if(l_err)
+ {
+ HDAT_ERR("Could not add SMF memory range to "
+ "HDAT at index[%d]", l_index);
+ break;
+ }
+ else
+ {
+ HDAT_INF("Added SMF memory range to HDAT at "
+ "index[%d]; start addr: 0x%08x; end addr: 0x%08x"
+ "; size: 0x%08x",
+ l_smfStartAddr,
+ l_smfStartAddr + l_smfSize,
+ l_smfSize);
+ }
+
+ l_index++;
+ } //end of mca list
+ if(l_err)
{
- HDAT_ERR("Error in adding addMsAreaAddr"
- " to ms area index[%d]",
- l_index);
break;
}
+ } //end of MCS list
+ if(l_err)
+ {
+ break;
+ }
+ } //end of MCBIST list
+ }
+ else //if model is Axone
+ {
+ //Sharing count for each group
+ TARGETING::ATTR_MSS_MEM_MC_IN_GROUP_type l_mccSharingCount
+ = {0};
+
+ //Size configured under each group
+ TARGETING::ATTR_PROC_MEM_SIZES_type l_procMemSizesBytes = {0};
+
+ assert(l_pProcTarget->tryGetAttr<TARGETING::ATTR_PROC_MEM_SIZES>
+ (l_procMemSizesBytes));
+
+ //For each MCC
+ TARGETING::PredicateCTM l_allMcc(TARGETING::CLASS_UNIT,
+ TARGETING::TYPE_MCC);
+ TARGETING::PredicateHwas l_funcMcc;
+ l_funcMcc.functional(true);
+ TARGETING::PredicatePostfixExpr l_allFuncMcc;
+ l_allFuncMcc.push(&l_allMcc).push(&l_funcMcc).And();
+
+ TARGETING::TargetHandleList l_mccList;
+
+ TARGETING::targetService().
+ getAssociated(l_mccList, l_pProcTarget,
+ TARGETING::TargetService::CHILD,
+ TARGETING::TargetService::ALL, &l_allFuncMcc);
+
+ for(uint32_t l_mccIdx = 0; l_mccIdx<l_mccList.size();
+ ++l_mccIdx)
+ {
+ uint32_t l_mccInGrp = 0;
+
+ TARGETING::Target *l_pMccTarget =
+ l_mccList[l_mccIdx];
+ if(!hdatFindGroupForMcc(l_pProcTarget,
+ l_pMccTarget,
+ l_mccInGrp))
+ {
+ //Skip this MCC is not in any group
+ continue;
+ }
+
+ //Increment sharing count if mem configured under group.
+ if(l_procMemSizesBytes[l_mccInGrp] > 0)
+ {
+ l_mccSharingCount[l_mccInGrp]++;
+ }
+ }
+
+ TARGETING::PredicateCTM l_mcPredicate(TARGETING::CLASS_UNIT,
+ TARGETING::TYPE_MC);
+
+ TARGETING::PredicatePostfixExpr l_presentMc;
+ l_presentMc.push(&l_mcPredicate).
+ push(&l_predHwasFunc).And();
+
+ TARGETING::TargetHandleList l_mcList;
+
+ // Find Associated MC list
+ TARGETING::targetService().getAssociated(l_mcList,
+ l_pProcTarget,
+ TARGETING::TargetService::CHILD_BY_AFFINITY,
+ TARGETING::TargetService::ALL,
+ &l_presentMc);
- // TODO : RTC Story 159682
- // Further CHTM support needs to be added which contains
- // the trace array for 24 cores
- // Reinitializing the NHTM size
+ //scan all mc in this proc
+ for(uint32_t l_mcIdx =0;
+ l_mcIdx < l_mcList.size();
+ ++l_mcIdx)
+ {
+ TARGETING::Target *l_pMcTarget = l_mcList[l_mcIdx];
- //Don't re-init NHTM size -- only one HTM region per proc
- uint64_t l_end_hi = l_end.hi;
- uint64_t l_end_lo = l_end.lo;
- uint64_t l_end_addr = ((l_end_hi << 32 ) | l_end_lo);
+ TARGETING::PredicateCTM l_miPredicate(
+ TARGETING::CLASS_UNIT,
+ TARGETING::TYPE_MI);
+ TARGETING::PredicatePostfixExpr l_funcMi;
+ l_funcMi.push(&l_miPredicate).push(&l_predHwasFunc).And();
- uint64_t l_addr_range_hi = l_addr_range.hi;
- uint64_t l_addr_range_lo = l_addr_range.lo;
- uint64_t l_start_addr =((l_addr_range_hi << 32 )| l_addr_range_lo);
+ TARGETING::TargetHandleList l_miList;
- uint64_t l_size_bytes = ((uint64_t)l_areaSizeInMB) * l_mcaSharingCount[l_mcaInGrp] * 1024 * 1024;
+ // Find Associated mi list
+ TARGETING::targetService().getAssociated(l_miList,
+ l_pMcTarget,
+ TARGETING::TargetService::CHILD,
+ TARGETING::TargetService::ALL,
+ &l_funcMi);
- if((0 != l_nhtmSize) &&
- (l_size_bytes != (l_end_addr - l_start_addr)))
+ //for each MI connected to this this MC
+ for(uint32_t l_miIdx = 0;l_miIdx<l_miList.size();
+ ++l_miIdx)
+ {
+ TARGETING::Target *l_pMiTarget = l_miList[l_miIdx];
+
+ //for each MCC connected to this this MI
+ TARGETING::PredicateCTM l_mccPredicate(
+ TARGETING::CLASS_UNIT, TARGETING::TYPE_MCC);
+
+ TARGETING::PredicateHwas l_predMcc;
+ l_predMcc.present(true);
+ TARGETING::PredicatePostfixExpr l_presentMcc;
+ l_presentMcc.push(&l_mccPredicate).
+ push(&l_predMcc).And();
+ TARGETING::TargetHandleList l_mccList;
+
+ // Get associated MCCs
+ TARGETING::targetService().
+ getAssociated(l_mccList, l_pMiTarget,
+ TARGETING::TargetService::CHILD_BY_AFFINITY,
+ TARGETING::TargetService::ALL, &l_presentMcc);
+
+ for(uint32_t l_mccIdx = 0; l_mccIdx<l_mccList.size();
+ ++l_mccIdx)
{
- HDAT_INF("NHTM Bar size = 0x%016llX "
- " MS area size = 0x%016llX"
- " l_end_addr = 0x%016llX"
- " l_start_addr = 0x%016llX",
- l_nhtmSize,l_size_bytes, l_end_addr,
- l_start_addr);
+ TARGETING::Target *l_pMccTarget =
+ l_mccList[l_mccIdx];
- l_addr_range.lo = l_hdatNhtmStartAddr.lo;
- l_addr_range.hi = l_hdatNhtmStartAddr.hi;
+ //Group which this MCC is belonging
+ uint32_t l_mccInGrp = 0;
- l_end.lo = l_hdatNhtmEndAddr.lo;
- l_end.hi = l_hdatNhtmEndAddr.hi;
+ if(!hdatFindGroupForMcc(l_pProcTarget,
+ l_pMccTarget,
+ l_mccInGrp))
+ {
+ HDAT_INF("No group found for MCC");
+ //Skip this MCC as it is not under any group
+ continue;
+ }
- l_err = addMsAreaAddr(l_index,
- l_addr_range,
- l_end,
- l_procChipId,
- false, 0, 0);
- if(NULL != l_err)
+ //for each OMI connected to this this MCC
+ TARGETING::PredicateCTM l_omiPredicate(
+ TARGETING::CLASS_UNIT, TARGETING::TYPE_OMI);
+
+ TARGETING::PredicateHwas l_predOmi;
+ l_predOmi.present(true);
+ TARGETING::PredicatePostfixExpr l_presentOmi;
+ l_presentOmi.push(&l_omiPredicate).
+ push(&l_predOmi).And();
+ TARGETING::TargetHandleList l_omiList;
+
+ // Get associated OMIs
+ TARGETING::targetService().
+ getAssociated(l_omiList, l_pMccTarget,
+ TARGETING::TargetService::CHILD_BY_AFFINITY,
+ TARGETING::TargetService::ALL, &l_presentOmi);
+
+ for(uint32_t l_omiIdx = 0;
+ l_omiIdx<l_omiList.size();
+ ++l_omiIdx)
+ {
+ TARGETING::Target *l_pOmiTarget =
+ l_omiList[l_omiIdx];
+
+ //for each OCMB CHIP connected to this this OMI
+ TARGETING::PredicateCTM l_ocmbPredicate(
+ TARGETING::CLASS_CHIP,
+ TARGETING::TYPE_OCMB_CHIP);
+
+ TARGETING::PredicateHwas l_predOcmb;
+ l_predOcmb.present(true);
+ TARGETING::PredicatePostfixExpr l_presentOcmb;
+ l_presentOcmb.push(&l_ocmbPredicate).
+ push(&l_predOcmb).And();
+ TARGETING::TargetHandleList l_ocmbList;
+
+ // Get associated OCMB CHIP's
+ TARGETING::targetService().
+ getAssociated(l_ocmbList, l_pOmiTarget,
+ TARGETING::TargetService::CHILD_BY_AFFINITY,
+ TARGETING::TargetService::ALL, &l_presentOcmb);
+
+ for(uint32_t l_ocmbIdx = 0;
+ l_ocmbIdx<l_ocmbList.size();
+ ++l_ocmbIdx)
+ {
+ TARGETING::Target *l_pOcmbTarget =
+ l_ocmbList[l_ocmbIdx];
+
+ // Swift uses a DDIMM. It is a single FRU
+ // that includes 1 OCMB chip and some dram
+ hdatMemParentType l_parentType =
+ HDAT_MEM_PARENT_RISER;
+
+ std::list<hdatRamArea> l_areas;
+ l_areas.clear();
+ uint32_t l_areaSizeInMB = 0;
+ bool l_areaFunctional = false;
+ uint32_t l_numDimms =0;
+
+ l_err = hdatScanDimmsAxone(l_pOcmbTarget,
+ l_areas,
+ l_areaSizeInMB,
+ l_numDimms,
+ l_areaFunctional,
+ l_parentType);
+ if(NULL != l_err)
+ {
+ HDAT_ERR("Error in calling Scan Dimms");
+ break;
+ }
+
+ HDAT_INF("l_areaSizeInMB:0x%.8X "
+ "l_numDimms:0x%.8X "
+ "l_areas.size():0x%.8X", l_areaSizeInMB,
+ l_numDimms, l_areas.size());
+
+ // Skip if no memory configured under
+ // OCMB_CHIP
+ if(l_areaSizeInMB == 0)
+ {
+ continue;
+ }
+
+ uint32_t l_maxMemBlocks = 0;
+ l_err = hdatGetMaxMemoryBlocks
+ (l_pOcmbTarget,l_maxMemBlocks);
+ if(NULL != l_err)
+ {
+ HDAT_ERR("Error to get max blocks");
+ break;
+ }
+
+ TARGETING::ATTR_SLCA_RID_type l_procRid =
+ l_pProcTarget->getAttr
+ <TARGETING::ATTR_SLCA_RID>();
+
+ TARGETING::ATTR_SLCA_INDEX_type
+ l_procSlcaIndex = l_pProcTarget->getAttr
+ <TARGETING::ATTR_SLCA_INDEX>();
+
+ l_err = addMsAreaFru(l_procRid,
+ l_procSlcaIndex,
+ l_pProcTarget,
+ l_index,
+ l_numDimms,
+ MAX_CHIP_EC_CNT_PER_MSAREA,
+ l_maxMemBlocks);
+
+ if(NULL != l_err)
+ {
+ HDAT_ERR("Error adding MSArea %d"
+ "Number of Dimms: %d "
+ "Max Blocks: %d",
+ l_index,
+ l_numDimms,l_maxMemBlocks);
+ break;
+ }
+
+ uint32_t l_memStatus = 0;
+
+ //If group is shared with more than one area
+ if(l_mccSharingCount[l_mccInGrp] >=
+ HDAT_MIN_NUM_FOR_SHARING)
+ {
+ l_memStatus = HDAT_MEM_SHARED;
+ setMsAreaInterleavedId(l_index,
+ l_mccInGrp);
+ }
+ //The memory channel is defined as a single
+ // MCC, and all of the memory on that
+ // channel is part of a single address
+ // space. That means that both OCMBs on
+ // the same MCC share an address space.
+ // While this isn't the same mechanism as
+ // true interleaving, it looks the same to
+ // the code consuming HDAT, so we need to
+ // set the sharing flags appropriately.
+ else if( l_omiList.size() > 1 )
+ {
+ l_memStatus = HDAT_MEM_SHARED;
+ setMsAreaInterleavedId(l_index,
+ l_mccInGrp);
+ }
+
+ setMsAreaType(l_index,l_parentType);
+ setMsAreaSize(l_index,l_areaSizeInMB);
+
+ iv_maxSize.hdatTotSize += l_areaSizeInMB;
+
+ l_memStatus |= l_areaFunctional ?
+ (HDAT_MEM_INSTALLED |
+ HDAT_MEM_FUNCTIONAL) :
+ HDAT_MEM_INSTALLED;
+
+ setMsAreaStat(l_index, l_memStatus);
+
+ //Add OMI ec level
+ uint32_t l_omiEcLevel = 0;
+ uint32_t l_omiChipId = 0;
+ l_err = hdatGetIdEc(l_pOmiTarget,
+ l_omiEcLevel,
+ l_omiChipId);
+ if(NULL != l_err)
+ {
+ HDAT_ERR("Error in getting OMI ID "
+ "and EC HUID:[0x%08X]",
+ l_pOmiTarget->getAttr
+ <TARGETING::ATTR_HUID>());
+ break;
+ }
+
+ l_err = addEcEntry(l_index,
+ l_omiChipId,
+ l_omiEcLevel);
+ if(NULL != l_err)
+ {
+ HDAT_ERR("Error in adding"
+ " ID[0x%08X] and "
+ "EC[0x%08X] to ms area"
+ " HUID:[0x%08X]",l_omiChipId,
+ l_omiEcLevel,
+ l_pOmiTarget->getAttr
+ <TARGETING::ATTR_HUID>());
+ break;
+ }
+
+ // Get the i2c Master data
+ std::vector<hdatI2cData_t> l_i2cDevEntries;
+
+ if (l_pOcmbTarget != NULL)
+ {
+ hdatGetI2cDeviceInfo(l_pOcmbTarget,
+ l_model,
+ l_i2cDevEntries);
+ }
+
+ setMsaI2cInfo(l_index, l_i2cDevEntries);
+
+ //for each mem-port connected to this this
+ //ocmb_chip
+ TARGETING::PredicateCTM l_allMemPort(
+ TARGETING::CLASS_UNIT,
+ TARGETING::TYPE_MEM_PORT);
+ TARGETING::PredicateHwas l_funcMemPort;
+ l_funcMemPort.functional(true);
+ TARGETING::PredicatePostfixExpr
+ l_allFuncMemPort;
+ l_allFuncMemPort.push(&l_allMemPort).
+ push(&l_funcMemPort).And();
+
+ TARGETING::TargetHandleList l_memPortList;
+
+ TARGETING::targetService().
+ getAssociated(l_memPortList,
+ l_pOcmbTarget,
+ TARGETING::TargetService::CHILD,
+ TARGETING::TargetService::ALL,
+ &l_allFuncMemPort);
+
+ TARGETING::Target *l_pmemPortTarget;
+
+ l_pmemPortTarget = l_memPortList[0];
+
+ uint32_t l_memBusFreq = 0;
+ l_memBusFreq =
+ getMemBusFreqAxone(l_pmemPortTarget);
+
+ std::list<hdatRamArea>::iterator l_area =
+ l_areas.begin();
+
+ for (uint32_t l_ramId = 0;
+ l_area != l_areas.end();
+ ++l_ramId, ++l_area)
+ {
+ uint32_t l_status =
+ (l_area)->ivFunctional ?
+ (HDAT_RAM_INSTALLED |
+ HDAT_RAM_FUNCTIONAL)
+ : HDAT_RAM_INSTALLED;
+
+ TARGETING::Target *l_pDimmTarget =
+ TARGETING::Target::getTargetFromHuid(
+ l_area->ivHuid);
+
+ TARGETING::ATTR_SLCA_RID_type l_dimmRid
+ = 0;
+ TARGETING::ATTR_SLCA_INDEX_type
+ l_dimmSlcaIndex = 0;
+ l_dimmRid
+ = l_pDimmTarget->getAttr
+ <TARGETING::ATTR_SLCA_RID>();
+
+ l_dimmSlcaIndex =
+ l_pDimmTarget->getAttr
+ <TARGETING::ATTR_SLCA_INDEX>();
+
+ uint32_t l_dimmId = 0;
+ l_dimmId |=
+ 1 << (31 - l_pOmiTarget->getAttr
+ <TARGETING::ATTR_CHIP_UNIT>());
+ l_dimmId |=
+ 1 << (31 - (l_pmemPortTarget->getAttr
+ <TARGETING::ATTR_CHIP_UNIT>()+16));
+ l_dimmId |=
+ 1 << (31 - (l_pDimmTarget->getAttr
+ <TARGETING::ATTR_REL_POS>()+20));
+
+ l_err = addRamFru(l_index,
+ l_pDimmTarget,
+ l_dimmRid,
+ l_dimmSlcaIndex,
+ l_ramId,
+ l_status,
+ (l_area)->ivSize,
+ l_dimmId,
+ l_memBusFreq);
+
+ if (l_err) // Failed to add ram fru
+ {
+ HDAT_ERR("Error in adding RAM FRU"
+ "Index:%d Rid:[0x%08X] "
+ "status:[0x%08X]"
+ "Size:[0x%08X] RamID:[0x%08X]",
+ l_index,(l_area)->ivHuid,
+ l_status,(l_area)->ivSize,
+ l_ramId);
+ ERRORLOG::errlCommit(l_err,
+ HDAT_COMP_ID);
+
+ delete l_err;
+ l_err = NULL;
+ continue;
+ }
+ }//end of RAM list
+
+ l_addr_range.hi =
+ (l_procMemBases[l_mccInGrp] &
+ 0xFFFFFFFF00000000ull) >> 32;
+ l_addr_range.lo =
+ l_procMemBases[l_mccInGrp] &
+ 0x00000000FFFFFFFFull;
+
+ l_end = l_addr_range;
+
+ //Update the range
+ l_end.hi +=
+ (l_procMemSizesBytes[l_mccInGrp] &
+ 0xFFFFFFFF00000000ull) >> 32;
+ l_end.lo +=
+ l_procMemSizesBytes[l_mccInGrp] &
+ 0x00000000FFFFFFFFull;
+
+ HDAT_INF("MI:0x%08X l_addr_range:0x%08X "
+ "0x%08X"
+ " l_end:0x%08X 0x%08X",
+ l_pMiTarget->getAttr
+ <TARGETING::ATTR_HUID>(),
+ l_addr_range.hi, l_addr_range.lo,
+ l_end.hi,l_end.lo);
+
+ uint64_t l_hdatMirrorAddr_x = 0x0ull;
+ uint64_t l_hdatMirrorAddr = 0x0ull;
+ uint32_t l_hdatMemcntrlID = 0x0 ;
+ uint8_t l_hdatMirrorAlogrithm = 0xFF;
+ bool l_rangeIsMirrorable = false;
+
+ //Calculate the mirror address and
+ //related data
+ uint64_t l_startAddr =
+ (((uint64_t)(l_addr_range.hi) << 32 )
+ | (uint64_t)(l_addr_range.lo));
+ l_hdatMirrorAddr_x = (l_startAddr / 2) +
+ l_mirrorBaseAddress_x;
+
+ HDAT_INF("Start add : 0x%016llX "
+ "MirrorBase : 0x%016llX"
+ " MirrorAddr : 0x%016llX"
+ " PayLoadMirrorMem : 0x%X",
+ l_startAddr, l_mirrorBaseAddress_x,
+ l_hdatMirrorAddr_x, l_payLoadMirrorMem);
+
+ if ( 0 != l_payLoadMirrorMem )
+ {
+ for ( int idx=0 ; idx <
+ (int)(sizeof
+ (TARGETING::ATTR_PROC_MIRROR_SIZES_type)
+ / sizeof(uint64_t)) ; idx++ )
+ {
+ HDAT_INF("Mirror size : 0x%016llX"
+ " MirrorAddr : 0x%016llX"
+ " hdatMirrorAddr_x : 0x%016llX",
+ l_MirrorSize[idx],
+ l_MirrorAddr[idx],
+ l_hdatMirrorAddr_x);
+
+ if( (0 != l_MirrorSize[idx]) &&
+ (l_MirrorAddr[idx] ==
+ l_hdatMirrorAddr_x) )
+ {
+ l_rangeIsMirrorable = true;
+ l_hdatMirrorAddr =
+ l_MirrorAddr[idx] |
+ HDAT_REAL_ADDRESS_MASK64;
+ break;
+ }
+ }
+ }
+
+ // Set the memory controller ID
+ l_hdatMemcntrlID |=
+ 1 << (31 - l_pMcTarget->getAttr
+ <TARGETING::ATTR_CHIP_UNIT>());
+ l_hdatMemcntrlID |=
+ 1 << (31 - (l_pMiTarget->getAttr
+ <TARGETING::ATTR_CHIP_UNIT>() + 4));
+ l_hdatMemcntrlID |=
+ 1 << (31 - (l_pMccTarget->getAttr
+ <TARGETING::ATTR_CHIP_UNIT>() + 8));
+ l_hdatMemcntrlID |=
+ 1 << (31 - (l_pOmiTarget->getAttr
+ <TARGETING::ATTR_CHIP_UNIT>() + 16));
+
+ l_err = addMsAreaAddr(l_index,
+ l_addr_range,
+ l_end,
+ l_procChipId,
+ l_rangeIsMirrorable,
+ l_hdatMirrorAlogrithm,
+ l_hdatMirrorAddr,
+ l_hdatMemcntrlID);
+ if(NULL != l_err)
+ {
+ HDAT_ERR("Error in adding addMsAreaAddr"
+ " to ms area index[%d]",
+ l_index);
+ break;
+ }
+
+ // TODO : RTC Story 159682
+ // Further CHTM support needs to be added
+ // which contains the trace array for
+ // 24 cores
+ // Reinitializing the NHTM size
+
+ // Don't re-init NHTM size -- only one HTM
+ // region per proc
+ uint64_t l_end_hi = l_end.hi;
+ uint64_t l_end_lo = l_end.lo;
+ uint64_t l_end_addr =
+ ((l_end_hi << 32 ) | l_end_lo);
+
+
+ uint64_t l_addr_range_hi = l_addr_range.hi;
+ uint64_t l_addr_range_lo = l_addr_range.lo;
+ uint64_t l_start_addr =
+ ((l_addr_range_hi << 32 )| l_addr_range_lo);
+
+ uint64_t l_size_bytes =
+ ((uint64_t)l_areaSizeInMB) *
+ l_mccSharingCount[l_mccInGrp] * 1024 * 1024;
+
+ if((0 != l_nhtmSize) &&
+ (l_size_bytes !=
+ (l_end_addr - l_start_addr)))
+ {
+ HDAT_INF("NHTM Bar size = 0x%016llX "
+ " MS area size = 0x%016llX"
+ " l_end_addr = 0x%016llX"
+ " l_start_addr = 0x%016llX",
+ l_nhtmSize,l_size_bytes,
+ l_end_addr,
+ l_start_addr);
+
+ l_addr_range.lo =
+ l_hdatNhtmStartAddr.lo;
+ l_addr_range.hi =
+ l_hdatNhtmStartAddr.hi;
+
+ l_end.lo = l_hdatNhtmEndAddr.lo;
+ l_end.hi = l_hdatNhtmEndAddr.hi;
+
+ l_err = addMsAreaAddr(l_index,
+ l_addr_range,
+ l_end,
+ l_procChipId,
+ false, 0, 0);
+ if(NULL != l_err)
+ {
+ HDAT_ERR("Error in adding "
+ " addMsAreaAddr to ms area "
+ "index[%d]",
+ l_index);
+ break;
+ }
+ l_nhtmSize=0; //only add 1 entry
+ }
+ l_addr_range = l_end;
+
+ // Add SMF memory addr range
+ auto l_smfStartAddr = l_pProcTarget->
+ getAttr<TARGETING::ATTR_PROC_SMF_BAR_BASE_ADDR>();
+ auto l_smfSize = l_pProcTarget->
+ getAttr<TARGETING::ATTR_PROC_SMF_BAR_SIZE>();
+
+ if(l_smfSize && !l_smfAdded)
+ {
+ hdatMsAddr_t l_hdatSmfStartAddr{};
+ hdatMsAddr_t l_hdatSmfEndAddr{};
+ l_hdatSmfStartAddr.hi =
+ (l_smfStartAddr & 0xFFFFFFFF00000000ull) >> 32;
+ l_hdatSmfStartAddr.lo =
+ l_smfStartAddr & 0x00000000FFFFFFFFull;
+ l_hdatSmfStartAddr.hi |= HDAT_REAL_ADDRESS_MASK;
+
+ l_hdatSmfEndAddr.hi =
+ ((l_smfStartAddr + l_smfSize) &
+ 0xFFFFFFFF00000000ull) >>32;
+ l_hdatSmfEndAddr.lo =
+ (l_smfStartAddr + l_smfSize) &
+ 0x00000000FFFFFFFFull;
+ l_hdatSmfEndAddr.hi |= HDAT_REAL_ADDRESS_MASK;
+
+ l_err = addMsAreaAddr(l_index,
+ l_hdatSmfStartAddr,
+ l_hdatSmfEndAddr,
+ l_procChipId,
+ false, //rangeIsMirrorable
+ 0, // i_mirroringAlgorithm
+ 0, // i_startMirrAddr
+ l_hdatMemcntrlID,
+ true); // i_hdatsmf
+ l_smfAdded = true;
+ }
+
+ if(l_err)
+ {
+ HDAT_ERR("Could not add SMF memory range to "
+ "HDAT at index[%d]", l_index);
+ break;
+ }
+ else
+ {
+ HDAT_INF("Added SMF memory range to HDAT at "
+ "index[%d]; start addr: 0x%08x; end addr: 0x%08x"
+ "; size: 0x%08x",
+ l_smfStartAddr,
+ l_smfStartAddr + l_smfSize,
+ l_smfSize);
+ }
+ l_index++;
+ } // end of OCMB_CHIP list
+ if(l_err)
+ {
+ break;
+ }
+ } //end of OMI list
+ if(l_err)
{
- HDAT_ERR("Error in adding "
- " addMsAreaAddr to ms area index[%d]",
- l_index);
break;
}
- l_nhtmSize=0; //only add 1 entry
+ } //end of MCC list
+ if(l_err)
+ {
+ break;
}
- l_addr_range = l_end;
- l_index++;
- } //end of mca list
- } //end of MCS list
- } //end of MCBIST list
+ } //end of MI list
+ if(l_err)
+ {
+ break;
+ }
+ } //end of MC list
+ }
if(l_err)
{
// Error message recorded above
@@ -1823,7 +2586,8 @@ void HdatMsVpd::commit(void * i_addr,
/*******************************************************************************
* hdatGetMaxMemConfiguredAddress
*******************************************************************************/
-uint64_t HdatMsVpd::hdatGetMaxMemConfiguredAddress()
+uint64_t HdatMsVpd::hdatGetMaxMemConfiguredAddress(
+ TARGETING::ATTR_MODEL_type i_model)
{
//For each processor in the system
TARGETING::PredicateCTM l_procChipPred(TARGETING::CLASS_CHIP,
@@ -1856,49 +2620,101 @@ uint64_t HdatMsVpd::hdatGetMaxMemConfiguredAddress()
assert(l_pProcTarget->
tryGetAttr<TARGETING::ATTR_PROC_MEM_BASES>(l_procMemBases));
+ if (i_model == TARGETING::MODEL_NIMBUS)
+ {
+ //For each MCA
+ TARGETING::PredicateCTM l_allMca(TARGETING::CLASS_UNIT,
+ TARGETING::TYPE_MCA);
+ TARGETING::PredicateHwas l_funcMca;
+ l_funcMca.functional(true);
+ TARGETING::PredicatePostfixExpr l_allFuncMca;
+ l_allFuncMca.push(&l_allMca).push(&l_funcMca).And();
- //For each MCA
- TARGETING::PredicateCTM l_allMca(TARGETING::CLASS_UNIT,
- TARGETING::TYPE_MCA);
- TARGETING::PredicateHwas l_funcMca;
- l_funcMca.functional(true);
- TARGETING::PredicatePostfixExpr l_allFuncMca;
- l_allFuncMca.push(&l_allMca).push(&l_funcMca).And();
-
- TARGETING::TargetHandleList l_mcaList;
+ TARGETING::TargetHandleList l_mcaList;
- TARGETING::targetService().
+ TARGETING::targetService().
getAssociated(l_mcaList, l_pProcTarget,
TARGETING::TargetService::CHILD,
TARGETING::TargetService::ALL, &l_allFuncMca);
- for(uint32_t i=0; i < l_mcaList.size(); i++)
- {
+ for(uint32_t i=0; i < l_mcaList.size(); i++)
+ {
- TARGETING::Target *l_pMcaTarget = l_mcaList[i];
+ TARGETING::Target *l_pMcaTarget = l_mcaList[i];
- uint32_t l_mcaInGroup = 0;
- if(!hdatFindGroupForMc(l_pProcTarget,
- l_pMcaTarget,
- l_mcaInGroup))
- {
- HDAT_INF("Input target is not in group,"
- " MCA HUID:[0x%08X]",
- l_pMcaTarget->getAttr<TARGETING::ATTR_HUID>());
- //Skip this MC not part of any group
- continue;
+ uint32_t l_mcaInGroup = 0;
+ if(!hdatFindGroupForMc(l_pProcTarget,
+ l_pMcaTarget,
+ l_mcaInGroup))
+ {
+ HDAT_INF("Input target is not in group,"
+ " MCA HUID:[0x%08X]",
+ l_pMcaTarget->getAttr<TARGETING::ATTR_HUID>());
+ //Skip this MC not part of any group
+ continue;
+ }
+
+ if(!l_processedAnyGroup ||
+ (l_procMemBases[l_mcaInGroup] > l_maxBase))
+ {
+ l_maxBase = l_procMemBases[l_mcaInGroup];
+ l_processedAnyGroup = true;
+ l_maxMsAddress =
+ l_maxBase + l_procMemSizesBytes[l_mcaInGroup];
+ HDAT_INF("Max MS Addr l_maxMsAddress: = 0x%016llX,"
+ "l_maxBase= 0x%016llX,"
+ "l_procMemSizesBytes[l_mcaInGroup]= 0x%016llX",
+ l_maxMsAddress, l_maxBase,
+ l_procMemSizesBytes[l_mcaInGroup]);
+ }
}
+ }
+ else
+ {
+ //For each MCC
+ TARGETING::PredicateCTM l_allMcc(TARGETING::CLASS_UNIT,
+ TARGETING::TYPE_MCC);
+ TARGETING::PredicateHwas l_funcMcc;
+ l_funcMcc.functional(true);
+ TARGETING::PredicatePostfixExpr l_allFuncMcc;
+ l_allFuncMcc.push(&l_allMcc).push(&l_funcMcc).And();
- if(!l_processedAnyGroup ||
- (l_procMemBases[l_mcaInGroup] > l_maxBase))
+ TARGETING::TargetHandleList l_mccList;
+
+ TARGETING::targetService().
+ getAssociated(l_mccList, l_pProcTarget,
+ TARGETING::TargetService::CHILD,
+ TARGETING::TargetService::ALL, &l_allFuncMcc);
+
+ for(uint32_t i=0; i < l_mccList.size(); i++)
{
- l_maxBase = l_procMemBases[l_mcaInGroup];
- l_processedAnyGroup = true;
- l_maxMsAddress = l_maxBase + l_procMemSizesBytes[l_mcaInGroup];
- HDAT_INF("Max MS Addr l_maxMsAddress: = 0x%016llX,"
- "l_maxBase= 0x%016llX,"
- "l_procMemSizesBytes[l_mcaInGroup]= 0x%016llX",
- l_maxMsAddress, l_maxBase, l_procMemSizesBytes[l_mcaInGroup]);
+ TARGETING::Target *l_pMccTarget = l_mccList[i];
+
+ uint32_t l_mccInGroup = 0;
+ if(!hdatFindGroupForMcc(l_pProcTarget,
+ l_pMccTarget,
+ l_mccInGroup))
+ {
+ HDAT_INF("Input target is not in group,"
+ " MCC HUID:[0x%08X]",
+ l_pMccTarget->getAttr<TARGETING::ATTR_HUID>());
+ //Skip this MCC as its not part of any group
+ continue;
+ }
+
+ if(!l_processedAnyGroup ||
+ (l_procMemBases[l_mccInGroup] > l_maxBase))
+ {
+ l_maxBase = l_procMemBases[l_mccInGroup];
+ l_processedAnyGroup = true;
+ l_maxMsAddress =
+ l_maxBase + l_procMemSizesBytes[l_mccInGroup];
+ HDAT_INF("Max MS Addr l_maxMsAddress: = 0x%016llX,"
+ "l_maxBase= 0x%016llX,"
+ "l_procMemSizesBytes[l_omiInGroup]= 0x%016llX",
+ l_maxMsAddress, l_maxBase,
+ l_procMemSizesBytes[l_mccInGroup]);
+ }
}
}
@@ -2004,6 +2820,56 @@ bool HdatMsVpd::hdatFindGroupForMc(const TARGETING::Target *i_pProcTarget,
return l_foundGroup;
}
+
+//******************************************************************************
+//* hdatFindGroupForMcc
+//******************************************************************************
+bool HdatMsVpd::hdatFindGroupForMcc(const TARGETING::Target *i_pProcTarget,
+ const TARGETING::Target *i_pMccTarget,
+ uint32_t& o_groupOfMcc)
+{
+ bool l_foundGroup = false;
+ TARGETING::ATTR_MSS_MEM_MC_IN_GROUP_type l_mccGroups = {0};
+ assert(i_pProcTarget != NULL || i_pMccTarget != NULL);
+
+ assert(!(i_pProcTarget->getAttr<TARGETING::ATTR_TYPE>()
+ != TARGETING::TYPE_PROC)||
+ !(i_pProcTarget->getAttr<TARGETING::ATTR_CLASS>()
+ != TARGETING::CLASS_CHIP));
+
+ assert(i_pProcTarget->
+ tryGetAttr<TARGETING::ATTR_MSS_MEM_MC_IN_GROUP>(l_mccGroups));
+
+ assert(!(i_pMccTarget->getAttr<TARGETING::ATTR_TYPE>()
+ != TARGETING::TYPE_MCC)||
+ !(i_pMccTarget->getAttr<TARGETING::ATTR_CLASS>()
+ != TARGETING::CLASS_UNIT));
+ TARGETING::ATTR_CHIP_UNIT_type l_chipUnit =
+ i_pMccTarget->getAttr<TARGETING::ATTR_CHIP_UNIT>();
+ uint32_t l_sizeOfArray = sizeof(l_mccGroups)/sizeof(l_mccGroups[0]);
+
+ assert(!(sizeof( l_mccGroups[0] ) != sizeof(uint8_t)));
+
+ assert(!( l_chipUnit >= ( sizeof( l_mccGroups[0] ) * HDAT_BITS_PER_BYTE )));
+
+ const uint8_t MC_IN_GROUP_MCC_0 = 0x80;
+ for(uint32_t l_idx =0; l_idx < l_sizeOfArray;++l_idx)
+ {
+ //Attribute ATTR_MSS_MEM_MC_IN_GROUP is an array of bitmask
+ //bit 0 of bitmask corresponds to mcc 0, bit 7 to mcc 7
+ if((l_mccGroups[l_idx] & (MC_IN_GROUP_MCC_0 >> l_chipUnit)) ==
+ (MC_IN_GROUP_MCC_0 >> l_chipUnit))
+ {
+ HDAT_INF("hdatFindGroupForMcc::: Found group : %d",l_idx);
+ o_groupOfMcc = l_idx;
+ l_foundGroup = true;
+ break;
+ }
+ }
+
+ return l_foundGroup;
+}
+
/*******************************************************************************
* hdatScanDimms
*******************************************************************************/
@@ -2148,6 +3014,145 @@ errlHndl_t HdatMsVpd::hdatScanDimms(const TARGETING::Target *i_pTarget,
while(0);
return l_err;
}
+
+/*******************************************************************************
+* hdatScanDimmsAxone
+*******************************************************************************/
+errlHndl_t HdatMsVpd::hdatScanDimmsAxone(const TARGETING::Target *i_pOcmbTarget,
+ std::list<hdatRamArea>& o_areas,
+ uint32_t& o_areaSize,
+ uint32_t& o_dimmNum,
+ bool& o_areaFunctional,
+ hdatMemParentType& o_parentType)
+{
+ errlHndl_t l_err = NULL;
+
+ do
+ {
+ if(i_pOcmbTarget->getAttr<TARGETING::ATTR_TYPE>() !=
+ TARGETING::TYPE_OCMB_CHIP)
+ {
+ HDAT_ERR("Input Target is type not OCMB_CHIP");
+ break;
+ }
+
+ //for each mem-port connected to this this ocmb_chip
+ TARGETING::PredicateCTM l_allMemPort(TARGETING::CLASS_UNIT,
+ TARGETING::TYPE_MEM_PORT);
+ TARGETING::PredicateHwas l_funcMemPort;
+ l_funcMemPort.functional(true);
+ TARGETING::PredicatePostfixExpr l_allFuncMemPort;
+ l_allFuncMemPort.push(&l_allMemPort).push(&l_funcMemPort).And();
+
+ TARGETING::TargetHandleList l_memPortList;
+
+ TARGETING::targetService().
+ getAssociated(l_memPortList, i_pOcmbTarget,
+ TARGETING::TargetService::CHILD,
+ TARGETING::TargetService::ALL, &l_allFuncMemPort);
+
+ for(uint32_t i=0; i < l_memPortList.size(); i++)
+ {
+ TARGETING::Target *l_pmemPortTarget = l_memPortList[i];
+
+ TARGETING::ATTR_MEM_EFF_DIMM_SIZE_type l_dimSizes = {0};
+ //Get configured memory size
+ if(!l_pmemPortTarget->
+ tryGetAttr<TARGETING::ATTR_MEM_EFF_DIMM_SIZE>(l_dimSizes))
+ {
+ HDAT_ERR("DIMM size should be available with MEM_PORT");
+ }
+
+ //for each DIMM connected to this this MCA
+ TARGETING::PredicateCTM l_dimmPredicate(TARGETING::
+ CLASS_LOGICAL_CARD,
+ TARGETING::TYPE_DIMM);
+ TARGETING::PredicateHwas l_predDimm;
+ l_predDimm.present(true);
+ TARGETING::PredicatePostfixExpr l_presentDimm;
+ l_presentDimm.push(&l_dimmPredicate).push(&l_predDimm).And();
+
+ TARGETING::TargetHandleList l_dimmList;
+
+ // Get associated dimms
+ TARGETING::targetService().
+ getAssociated(l_dimmList, l_pmemPortTarget,
+ TARGETING::TargetService::CHILD_BY_AFFINITY,
+ TARGETING::TargetService::ALL, &l_presentDimm);
+
+ for(uint32_t j=0; j < l_dimmList.size(); ++j)
+ {
+ //fetch each dimm
+ TARGETING::Target *l_pDimmTarget = l_dimmList[j];
+
+ uint32_t l_dimmfru = 0;
+ l_dimmfru = l_pDimmTarget->getAttr<TARGETING::ATTR_FRU_ID>();
+
+ TARGETING::ATTR_MEM_PORT_type l_dimmMemPort = 0;
+
+ if(!l_pDimmTarget->
+ tryGetAttr<TARGETING::ATTR_MEM_PORT>(l_dimmMemPort))
+ {
+ HDAT_ERR("DIMM size should be available with MEM_PORT");
+ }
+
+ //Convert GB to MB
+ uint32_t l_dimmSizeInMB = l_dimSizes[l_dimmMemPort] *
+ HDAT_MB_PER_GB;
+ uint32_t l_huid = TARGETING::get_huid(l_pDimmTarget);
+
+ bool foundArea = false;
+ for (std::list<hdatRamArea>::iterator l_area = o_areas.begin();
+ l_area != o_areas.end();
+ ++l_area)
+ {
+ //we do not need to compare each dimm fru id with mca fru id
+ //to create ram area, by the below logic
+ //dimms with same fruid will fall into same ram area
+ //even if they have fru id same with mca
+ if (l_area->ivfruId == l_dimmfru)//this means soldered dimms
+ {
+ foundArea = true;
+ l_area->ivFunctional = (l_area)->ivFunctional ||
+ isFunctional(l_pDimmTarget);
+ (l_area)->ivFunctional = true;
+ (l_area)->ivSize += l_dimmSizeInMB;
+ break;
+ }
+ }
+
+ //Search in the list of RAM Areas if not
+ //present create a new ram area
+ if (!foundArea)
+ {
+ o_dimmNum++;
+ o_areas.push_back(hdatRamArea(l_huid,
+ isFunctional(l_pDimmTarget),
+ l_dimmSizeInMB,l_dimmfru));
+ }
+ o_areaSize += l_dimmSizeInMB;
+ o_areaFunctional = o_areaFunctional ||
+ isFunctional(l_pDimmTarget);
+ } //end of dimm list
+
+ o_parentType = HDAT_MEM_PARENT_CEC_FRU;
+
+ if(l_err != NULL)
+ {
+ //break if error
+ break;
+ }
+ } // end of mem_port list
+ if(l_err != NULL)
+ {
+ //break if error
+ break;
+ }
+ }
+ while(0);
+ return l_err;
+}
+
/*******************************************************************************
* hdatGetMaxMemoryBlocks
*******************************************************************************/
OpenPOWER on IntegriCloud