diff options
author | Jayashankar Padath <jayashankar.padath@in.ibm.com> | 2016-12-01 03:16:02 -0600 |
---|---|---|
committer | William G. Hoffa <wghoffa@us.ibm.com> | 2017-01-12 16:21:22 -0500 |
commit | 42013d80fce1c1e4386cda63c9c7115382f3c4eb (patch) | |
tree | b6d218d45552fa55e9226c06c0b3b395c48305fd /src/usr | |
parent | 803a38f125d5b4696b7f5fd3432dc296ea838e3d (diff) | |
download | talos-hostboot-42013d80fce1c1e4386cda63c9c7115382f3c4eb.tar.gz talos-hostboot-42013d80fce1c1e4386cda63c9c7115382f3c4eb.zip |
HDAT: Ms Area changes with new MCA design
Change-Id: Iabc1fa178e31417ff74d31f5fe528e51b390bb20
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/33231
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Reviewed-by: NAGENDRA K. GURRAM <nagendra.g@in.ibm.com>
Reviewed-by: William G. Hoffa <wghoffa@us.ibm.com>
Diffstat (limited to 'src/usr')
-rwxr-xr-x | src/usr/hdat/hdatmsvpd.C | 834 | ||||
-rwxr-xr-x | src/usr/hdat/hdatmsvpd.H | 6 |
2 files changed, 439 insertions, 401 deletions
diff --git a/src/usr/hdat/hdatmsvpd.C b/src/usr/hdat/hdatmsvpd.C index 5d7fa7b92..7ccb10979 100755 --- a/src/usr/hdat/hdatmsvpd.C +++ b/src/usr/hdat/hdatmsvpd.C @@ -1054,14 +1054,20 @@ errlHndl_t HdatMsVpd::hdatLoadMsData(uint32_t &o_size, uint32_t &o_count) uint32_t l_ueCount = 1; TARGETING::ATTR_MIRROR_BASE_ADDRESS_type l_mirroringBaseAddress_x = - l_pSysTarget->getAttr<TARGETING::ATTR_MIRROR_BASE_ADDRESS>(); + l_pSysTarget->getAttr<TARGETING::ATTR_MIRROR_BASE_ADDRESS>(); + + TARGETING::ATTR_MIRROR_BASE_ADDRESS_type l_mirrorBaseAddress_x = + l_mirroringBaseAddress_x; + l_mirroringBaseAddress_x |= HDAT_REAL_ADDRESS_MASK64; TARGETING::ATTR_MAX_MCS_PER_SYSTEM_type l_maxMsAreas = l_pSysTarget->getAttr<TARGETING::ATTR_MAX_MCS_PER_SYSTEM>(); // Initialize the MS vpd class - hdatInit(l_tmpMaxMsAddr,l_tmpMaxMsAddr,l_sizeConfigured,l_maxMsAreas, + // 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, l_mostSigAffinityDomain_x,l_ueCount,l_mirroringBaseAddress_x); TARGETING::ATTR_XSCOM_BASE_ADDRESS_type l_xscomAddr = @@ -1144,7 +1150,7 @@ errlHndl_t HdatMsVpd::hdatLoadMsData(uint32_t &o_size, uint32_t &o_count) tryGetAttr<TARGETING::ATTR_PROC_MEM_BASES>(l_procMemBases)); //Sharing count for each group - TARGETING::ATTR_MSS_MEM_MC_IN_GROUP_type l_mcsSharingCount = {0}; + 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 @@ -1195,370 +1201,401 @@ errlHndl_t HdatMsVpd::hdatLoadMsData(uint32_t &o_size, uint32_t &o_count) &l_funcMcs); //scan all mcs in this proc to get sharing counit - for(uint32_t l_idx = 0; l_idx<l_mcsList.size(); ++l_idx) + for(uint32_t l_mcsIdx = 0;l_mcsIdx<l_mcsList.size(); ++l_mcsIdx) { - TARGETING::Target *l_pMcsTarget = l_mcsList[l_idx]; + TARGETING::Target *l_pMcsTarget = l_mcsList[l_mcsIdx]; - uint32_t l_mcsInGrp = 0; - if(!hdatFindGroupForMc(l_pProcTarget, - l_pMcsTarget, - l_mcsInGrp)) - { - //Skip this MCS is not in any group - continue; - } + //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; - //Increment sharing count if mem configured under group. - if(l_procMemSizesBytes[l_mcsInGrp] > 0) + // 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) { - l_mcsSharingCount[l_mcsInGrp]++; + 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; + } - //Assign sharing group id only if shared - //And only when first instance of sharing is found - if(l_mcsSharingCount[l_mcsInGrp] == - HDAT_MIN_NUM_FOR_SHARING) + //Increment sharing count if mem configured under group. + if(l_procMemSizesBytes[l_mcaInGrp] > 0) { - l_mcsSharingGrpIds[l_mcsInGrp] = - l_nxtSharingGroupId; - l_nxtSharingGroupId++; + 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++; + } } } - } - for(uint32_t l_mcsIdx = 0; l_mcsIdx<l_mcsList.size(); - ++l_mcsIdx) - { - TARGETING::Target *l_pMcsTarget = - l_mcsList[l_mcsIdx]; + for(uint32_t l_mcaIdx = 0; l_mcaIdx<l_mcaList.size(); + ++l_mcaIdx) + { + TARGETING::Target *l_pMcaTarget = + l_mcaList[l_mcaIdx]; - //Group which this MCS is belonging - uint32_t l_mcsInGrp = 0; + //Group which this MCA is belonging + uint32_t l_mcaInGrp = 0; - if(!hdatFindGroupForMc(l_pProcTarget, - l_pMcsTarget, - l_mcsInGrp)) - { - HDAT_INF("No group found for MCS"); - //Skip this MCS is not under any group - continue; - } + 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; + 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; + 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_pMcsTarget, - l_mcaFruId, - l_areas, - l_areaSizeInMB, - l_numDimms, - l_areaFunctional, - l_parentType); + 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(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 = hdatGetMaxMemoryBlocks(l_pMcsTarget,l_maxMemBlocks); - if(NULL != l_err) - { - HDAT_ERR("Error error in get max blocks"); - break; - } + 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; + } - TARGETING::ATTR_SLCA_RID_type l_procRid = - l_pProcTarget->getAttr<TARGETING::ATTR_SLCA_RID>(); + 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_mcsSharingCount[l_mcsInGrp] >= + 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_mcsInGrp]); - } + { + 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 ? + 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; + } - // TODO RTC Story 165230 - // Need to get i2c Master data correctly - std::vector<hdatMsAreaHI2cData_t> l_i2cDevEntries; + // TODO RTC Story 165230 + // Need to get i2c Master data correctly + std::vector<hdatMsAreaHI2cData_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, + // 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) + //Skip is there is no Membuf attached to this MCS + if(l_membufList.size() > 0) { - hdatGetMsaDeviceInfo(l_pMembufTarget, - l_i2cDevEntries); + TARGETING::Target *l_pMembufTarget = + l_membufList[0]; + if (l_pMembufTarget != NULL) + { + hdatGetMsaDeviceInfo(l_pMembufTarget, + 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::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_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>(); + TARGETING::ATTR_SLCA_INDEX_type l_dimmSlcaIndex = + l_pDimmTarget->getAttr<TARGETING::ATTR_SLCA_INDEX>(); - l_err = addRamFru(l_index, - l_pDimmTarget, - l_dimmRid, - l_dimmSlcaIndex, - l_ramId, - l_status, - (l_area)->ivSize); + l_err = addRamFru(l_index, + l_pDimmTarget, + l_dimmRid, + l_dimmSlcaIndex, + l_ramId, + l_status, + (l_area)->ivSize); - 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 + 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_mcsInGrp] & - 0xFFFFFFFF00000000ull) >> 32; - l_addr_range.lo = l_procMemBases[l_mcsInGrp] & - 0x00000000FFFFFFFFull; + l_addr_range.hi = (l_procMemBases[l_mcaInGrp] & + 0xFFFFFFFF00000000ull) >> 32; + 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_mcsInGrp] & + //Update the range + l_end.hi += (l_procMemSizesBytes[l_mcaInGrp] & 0xFFFFFFFF00000000ull) >> 32; - l_end.lo += l_procMemSizesBytes[l_mcsInGrp] & + l_end.lo += l_procMemSizesBytes[l_mcaInGrp] & 0x00000000FFFFFFFFull; - HDAT_INF("MCS:0x%08X l_addr_range:0x%08X 0x%08X" + 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; - uint8_t l_hdatMirrorAlogrithm = 0xFF; - bool l_rangeIsMirrorable = false; + uint64_t l_hdatMirrorAddr_x = 0x0ull; + uint64_t l_hdatMirrorAddr = 0x0ull; + 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_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::ATTR_PROC_MIRROR_SIZES_type + l_MirrorSize = {0}; + assert(l_pProcTarget->tryGetAttr< + TARGETING::ATTR_PROC_MIRROR_SIZES>(l_MirrorSize)); - TARGETING::ATTR_MIRROR_BASE_ADDRESS_type l_mirrorBaseAddress_x = - l_pSysTarget->getAttr<TARGETING::ATTR_MIRROR_BASE_ADDRESS>(); - - uint64_t l_startAddr = (((uint64_t)(l_addr_range.hi) << 32 ) + 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; + 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>(); + TARGETING::ATTR_PAYLOAD_IN_MIRROR_MEM_type + l_payLoadMirrorMem = + l_pSysTarget->getAttr< + TARGETING::ATTR_PAYLOAD_IN_MIRROR_MEM>(); - HDAT_INF( + 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 < + 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" + { + HDAT_INF("Mirror size : 0x%016llX" " MirrorAddr[idx] : 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; + } } } - } - l_err = addMsAreaAddr(l_index, - l_addr_range, - l_end, - l_procChipId, - l_rangeIsMirrorable, - l_hdatMirrorAlogrithm, - l_hdatMirrorAddr); - if(NULL != l_err) - { - HDAT_ERR("Error in adding addMsAreaAddr" - " to ms area index[%d]", - l_index); - break; - } + l_err = addMsAreaAddr(l_index, + l_addr_range, + l_end, + l_procChipId, + l_rangeIsMirrorable, + l_hdatMirrorAlogrithm, + l_hdatMirrorAddr); + 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 - l_nhtmSize = - l_pProcTarget->getAttr + // TODO : RTC Story 159682 + // Further CHTM support needs to be added which contains + // the trace array for 24 cores + // Reinitializing the NHTM size + l_nhtmSize = + l_pProcTarget->getAttr <TARGETING::ATTR_PROC_NHTM_BAR_SIZE>(); - uint64_t l_end_addr = + uint64_t l_end_addr = (((uint64_t)(l_end.hi) << 32 ) | (uint64_t)(l_end.lo)); - uint64_t l_start_addr = (((uint64_t)(l_addr_range.hi) << 32 ) + uint64_t l_start_addr = + (((uint64_t)(l_addr_range.hi) << 32 ) | (uint64_t)(l_addr_range.lo)); - uint64_t l_size_bytes = (l_areaSizeInMB) * 1024 * 1024; + uint64_t l_size_bytes = (l_areaSizeInMB) * 1024 * 1024; - if((0 != l_nhtmSize) && + 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 " + 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; + break; + } + l_nhtmSize=0; //only add 1 entry } - l_nhtmSize=0; //only add 1 entry - } - l_addr_range = l_end; - l_index++; + l_addr_range = l_end; + l_index++; + } //end of mca list } //end of MCS list } //end of MCBIST list if(l_err) @@ -1596,6 +1633,15 @@ errlHndl_t HdatMsVpd::hdatLoadMsData(uint32_t &o_size, uint32_t &o_count) hdatMsAddr_t l_hdatRhbEndAddr; l_rhbStartAddr = l_rhbStartAddr * l_dbobId; + TARGETING::ATTR_PAYLOAD_BASE_type l_payLoadBase = + l_pSysTarget->getAttr<TARGETING::ATTR_PAYLOAD_BASE>(); + // Since PAYLOAD_BASE is in MB's, converting it to bytes + l_rhbStartAddr |= ((uint64_t)(l_payLoadBase)) << 20; + l_rhbStartAddr &= 0xFFFFFFFF00000000; + if( l_payLoadBase > 0x100 ) + { + l_rhbStartAddr = 0x40000000000; //4TB hardcode for now + } l_hdatRhbStartAddr.hi = (l_rhbStartAddr & 0xFFFFFFFF00000000ull) >> 32; l_hdatRhbStartAddr.lo = l_rhbStartAddr & 0x00000000FFFFFFFFull; @@ -1781,41 +1827,48 @@ uint64_t HdatMsVpd::hdatGetMaxMemConfiguredAddress() assert(l_pProcTarget-> tryGetAttr<TARGETING::ATTR_PROC_MEM_BASES>(l_procMemBases)); - //For each MCS - TARGETING::PredicateCTM l_allMcs(TARGETING::CLASS_UNIT, - TARGETING::TYPE_MCS); - TARGETING::PredicateHwas l_funcMcs; - l_funcMcs.functional(true); - TARGETING::PredicatePostfixExpr l_allFuncMcs; - l_allFuncMcs.push(&l_allMcs).push(&l_funcMcs).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_mcsList; + TARGETING::TargetHandleList l_mcaList; TARGETING::targetService(). - getAssociated(l_mcsList, l_pProcTarget, + getAssociated(l_mcaList, l_pProcTarget, TARGETING::TargetService::CHILD, - TARGETING::TargetService::ALL, &l_allFuncMcs); + TARGETING::TargetService::ALL, &l_allFuncMca); - for(uint32_t i=0; i < l_mcsList.size(); i++) + for(uint32_t i=0; i < l_mcaList.size(); i++) { - TARGETING::Target *l_pMcsTarget = l_mcsList[i]; + TARGETING::Target *l_pMcaTarget = l_mcaList[i]; - uint32_t l_mcsInGroup = 0; + uint32_t l_mcaInGroup = 0; if(!hdatFindGroupForMc(l_pProcTarget, - l_pMcsTarget, - l_mcsInGroup)) + 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_mcsInGroup] > l_maxBase)) + (l_procMemBases[l_mcaInGroup] > l_maxBase)) { - l_maxBase = l_procMemBases[l_mcsInGroup]; + l_maxBase = l_procMemBases[l_mcaInGroup]; l_processedAnyGroup = true; - l_maxMsAddress = l_maxBase + l_procMemSizesBytes[l_mcsInGroup]; + 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]); } } @@ -1877,12 +1930,12 @@ uint64_t HdatMsVpd::hdatGetMaxMemConfiguredAddress() //* hdatFindGroupForMc //****************************************************************************** bool HdatMsVpd::hdatFindGroupForMc(const TARGETING::Target *i_pProcTarget, - const TARGETING::Target *i_pMcsTarget, + const TARGETING::Target *i_pMcaTarget, uint32_t& o_groupOfMc) { bool l_foundGroup = false; - TARGETING::ATTR_MSS_MEM_MC_IN_GROUP_type l_mcsGroups = {0}; - assert(i_pProcTarget != NULL || i_pMcsTarget != NULL); + TARGETING::ATTR_MSS_MEM_MC_IN_GROUP_type l_mcaGroups = {0}; + assert(i_pProcTarget != NULL || i_pMcaTarget != NULL); assert(!(i_pProcTarget->getAttr<TARGETING::ATTR_TYPE>() != TARGETING::TYPE_PROC)|| @@ -1890,29 +1943,27 @@ bool HdatMsVpd::hdatFindGroupForMc(const TARGETING::Target *i_pProcTarget, != TARGETING::CLASS_CHIP)); assert(i_pProcTarget-> - tryGetAttr<TARGETING::ATTR_MSS_MEM_MC_IN_GROUP>(l_mcsGroups)); + tryGetAttr<TARGETING::ATTR_MSS_MEM_MC_IN_GROUP>(l_mcaGroups)); - assert(!(i_pMcsTarget->getAttr<TARGETING::ATTR_TYPE>() - != TARGETING::TYPE_MCS)|| - !(i_pMcsTarget->getAttr<TARGETING::ATTR_CLASS>() + assert(!(i_pMcaTarget->getAttr<TARGETING::ATTR_TYPE>() + != TARGETING::TYPE_MCA)|| + !(i_pMcaTarget->getAttr<TARGETING::ATTR_CLASS>() != TARGETING::CLASS_UNIT)); TARGETING::ATTR_CHIP_UNIT_type l_chipUnit = - i_pMcsTarget->getAttr<TARGETING::ATTR_CHIP_UNIT>(); - uint32_t l_sizeOfArray = sizeof(l_mcsGroups)/sizeof(l_mcsGroups[0]); - - assert(!(sizeof( l_mcsGroups[0] ) != sizeof(uint8_t))); + i_pMcaTarget->getAttr<TARGETING::ATTR_CHIP_UNIT>(); + uint32_t l_sizeOfArray = sizeof(l_mcaGroups)/sizeof(l_mcaGroups[0]); + assert(!(sizeof( l_mcaGroups[0] ) != sizeof(uint8_t))); - assert(!( l_chipUnit >= ( sizeof( l_mcsGroups[0] ) * HDAT_BITS_PER_BYTE ))); + assert(!( l_chipUnit >= ( sizeof( l_mcaGroups[0] ) * HDAT_BITS_PER_BYTE ))); - - const uint8_t MC_IN_GROUP_MCS_0 = 0x80; + const uint8_t MC_IN_GROUP_MCA_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 mcs 0, bit 7 to mcs7 - if((l_mcsGroups[l_idx] & (MC_IN_GROUP_MCS_0 >> l_chipUnit)) == - (MC_IN_GROUP_MCS_0 >> l_chipUnit)) + //bit 0 of bitmask corresponds to mca 0, bit 7 to mca7 + if((l_mcaGroups[l_idx] & (MC_IN_GROUP_MCA_0 >> l_chipUnit)) == + (MC_IN_GROUP_MCA_0 >> l_chipUnit)) { HDAT_INF("hdatFindGroupForMc::: Found group : %d",l_idx); o_groupOfMc = l_idx; @@ -1927,6 +1978,7 @@ bool HdatMsVpd::hdatFindGroupForMc(const TARGETING::Target *i_pProcTarget, * hdatScanDimms *******************************************************************************/ errlHndl_t HdatMsVpd::hdatScanDimms(const TARGETING::Target *i_pTarget, + const TARGETING::Target *i_pMcsTarget, uint32_t i_mcaFruid, std::list<hdatRamArea>& o_areas, uint32_t& o_areaSize, @@ -1938,139 +1990,123 @@ errlHndl_t HdatMsVpd::hdatScanDimms(const TARGETING::Target *i_pTarget, do { - if(i_pTarget->getAttr<TARGETING::ATTR_TYPE>() != TARGETING::TYPE_MCS) + if(i_pTarget->getAttr<TARGETING::ATTR_TYPE>() != TARGETING::TYPE_MCA) { - HDAT_ERR("Input Target is type not supported."); + HDAT_ERR("Input Target is type not MCA"); + break; + } + + if(i_pMcsTarget->getAttr<TARGETING::ATTR_TYPE>() != TARGETING::TYPE_MCS) + { + HDAT_ERR("Input Target is type not MCA"); break; } TARGETING::ATTR_EFF_DIMM_SIZE_type l_dimSizes = {{0}}; //Get configured memory size - if(!i_pTarget-> + if(!i_pMcsTarget-> tryGetAttr<TARGETING::ATTR_EFF_DIMM_SIZE>(l_dimSizes)) { HDAT_ERR("DIMM size should be available with MCS"); } - //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; - - // Get associated MCAs - TARGETING::targetService(). - getAssociated(l_mcaList, i_pTarget, - TARGETING::TargetService::CHILD_BY_AFFINITY, - TARGETING::TargetService::ALL, &l_presentMca); - - o_dimmNum = 0; - for (uint32_t i = 0; i < l_mcaList.size(); ++i) + uint8_t l_mcaPort = 0; + if(!i_pTarget-> + tryGetAttr<TARGETING::ATTR_REL_POS>(l_mcaPort)) { + HDAT_ERR("REL_POS not there in MCA port"); + } + else + { + l_mcaPort= l_mcaPort%2; + } + //[TODO RTC: 47148] - TARGETING::Target *l_pMcaTarget = l_mcaList[i]; - - //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(); + //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; + TARGETING::TargetHandleList l_dimmList; - // Get associated dimms - TARGETING::targetService(). - getAssociated(l_dimmList, l_pMcaTarget, + // Get associated dimms + TARGETING::targetService(). + getAssociated(l_dimmList, i_pTarget, 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]; - 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>(); + uint32_t l_dimmfru = 0; + l_dimmfru = l_pDimmTarget->getAttr<TARGETING::ATTR_FRU_ID>(); - uint8_t l_mcaDimm = 0; - uint8_t l_mcaPort = 0; - TARGETING::ATTR_REL_POS_type l_dimmRelPos = 0; + uint8_t l_mcaDimm = 0; + TARGETING::ATTR_REL_POS_type l_dimmRelPos = 0; - if(l_pDimmTarget-> + if(l_pDimmTarget-> + tryGetAttr<TARGETING::ATTR_REL_POS>(l_dimmRelPos)) + { + l_mcaDimm = l_dimmRelPos%2; //2 DIMMs per MCA + l_dimmRelPos = 0; + if(!i_pTarget-> tryGetAttr<TARGETING::ATTR_REL_POS>(l_dimmRelPos)) { - l_mcaDimm = l_dimmRelPos%2; //2 DIMMs per MCA - l_dimmRelPos = 0; - if(!l_pMcaTarget-> - tryGetAttr<TARGETING::ATTR_REL_POS>(l_dimmRelPos)) - { - HDAT_ERR("Attribute REL_POS in MCA is not " - "present"); - } - else - { - l_mcaPort = l_dimmRelPos%2; //2 MCAs per MCS - } - } - else - { - HDAT_ERR("Attribute REL_POS in DIMM " - "is not present"); + HDAT_ERR("Attribute REL_POS in MCA is not " + "present"); } + } + else + { + HDAT_ERR("Attribute REL_POS in DIMM " + "is not present"); + } - //Convert GB to MB - uint32_t l_dimmSizeInMB = - l_dimSizes[l_mcaPort][l_mcaDimm] * 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; - } - } + //Convert GB to MB + uint32_t l_dimmSizeInMB = + l_dimSizes[l_mcaPort][l_mcaDimm] * HDAT_MB_PER_GB; + uint32_t l_huid = TARGETING::get_huid(l_pDimmTarget); - //Search in the list of RAM Areas if not - //present create a new ram area - if (!foundArea) + 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 { - o_dimmNum++; - o_areas.push_back(hdatRamArea(l_huid, - isFunctional(l_pDimmTarget), - l_dimmSizeInMB,l_dimmfru)); + foundArea = true; + l_area->ivFunctional = (l_area)->ivFunctional || + isFunctional(l_pDimmTarget); + (l_area)->ivFunctional = true; + (l_area)->ivSize += l_dimmSizeInMB; + break; } - o_areaSize += l_dimmSizeInMB; - o_areaFunctional = o_areaFunctional || - isFunctional(l_pDimmTarget); } - if(l_err != NULL) + + //Search in the list of RAM Areas if not + //present create a new ram area + if (!foundArea) { - //Break of error - break; + 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); } + o_parentType = HDAT_MEM_PARENT_CEC_FRU; if(l_err != NULL) diff --git a/src/usr/hdat/hdatmsvpd.H b/src/usr/hdat/hdatmsvpd.H index 27294c339..5bc216638 100755 --- a/src/usr/hdat/hdatmsvpd.H +++ b/src/usr/hdat/hdatmsvpd.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2016 */ +/* Contributors Listed Below - COPYRIGHT 2016,2017 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -813,7 +813,8 @@ class HdatMsVpd : public HdatHdif /** * @brief Get the DIMMS list present on the system * - * @param[in] i_pTarget Mcs target + * @param[in] i_pTarget Mca target + * @param[in] i_pMcsTarget Mcs target * @param[in] i_membufFruid - membuf fruid decides the parent type * @param[out] o_areas list of ram area structure based on the DIMM * present. @@ -827,6 +828,7 @@ class HdatMsVpd : public HdatHdif * error handle */ errlHndl_t hdatScanDimms(const TARGETING::Target *i_pTarget, + const TARGETING::Target *i_pMcsTarget, uint32_t i_membufFruid, std::list<hdatRamArea>& o_areas, uint32_t& o_areaSize, |