summaryrefslogtreecommitdiffstats
path: root/src/usr/hdat/hdatpcrd.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/hdat/hdatpcrd.C')
-rw-r--r--src/usr/hdat/hdatpcrd.C57
1 files changed, 56 insertions, 1 deletions
diff --git a/src/usr/hdat/hdatpcrd.C b/src/usr/hdat/hdatpcrd.C
index 29794ad60..9ffe9cff1 100644
--- a/src/usr/hdat/hdatpcrd.C
+++ b/src/usr/hdat/hdatpcrd.C
@@ -133,6 +133,10 @@ static errlHndl_t hdatSetPcrdHdrs(hdatSpPcrd_t *i_pcrd)
i_pcrd->hdatPcrdIntData[HDAT_PCRD_DA_SMP].hdatOffset = 0;
i_pcrd->hdatPcrdIntData[HDAT_PCRD_DA_SMP].hdatSize = 0;
+ i_pcrd->hdatPcrdIntData[HDAT_PCRD_CHIP_EC_LVL].hdatOffset = 0;
+ i_pcrd->hdatPcrdIntData[HDAT_PCRD_CHIP_EC_LVL].hdatSize = 0;
+
+
return l_errlHndl;
}
@@ -510,7 +514,8 @@ errlHndl_t HdatPcrd::hdatLoadPcrd(uint32_t &o_size, uint32_t &o_count)
uint8_t* l_temp = reinterpret_cast<uint8_t *>
(l_hostI2cFullPcrdHdrPtr);
- l_temp += l_pcrdHI2cTotalSize;
+ l_temp += sizeof(*l_hostI2cFullPcrdHdrPtr) + (sizeof(hdatI2cData_t)
+ * HDAT_PCRD_MAX_I2C_DEV);
l_pnor = reinterpret_cast<hdatPcrdPnor_t *>(l_temp);
}
@@ -615,6 +620,50 @@ errlHndl_t HdatPcrd::hdatLoadPcrd(uint32_t &o_size, uint32_t &o_count)
this->iv_spPcrd->hdatHdr.hdatSize +=
sizeof(hdatHDIFDataArray_t) + (sizeof(hdatSMPLinkInfo_t) * HDAT_PCRD_MAX_SMP_LINK);
+
+
+ // Need to populate EC level info
+ // PCRD is only one per chip . Hence the array count of EC level int pntr will be only 1.
+
+ hdatHDIFDataArray_t *l_ECLvlInfoPcrdHdrPtr = NULL;
+ l_ECLvlInfoPcrdHdrPtr = reinterpret_cast<hdatHDIFDataArray_t *>
+ ((uint8_t *)l_SMPInfoFullPcrdHdrPtr + sizeof(hdatHDIFDataArray_t) +
+ (sizeof(hdatSMPLinkInfo_t) * HDAT_PCRD_MAX_SMP_LINK));
+ uint32_t l_pcrdECLvlTotalSize = sizeof(hdatHDIFDataArray_t) +
+ sizeof(hdatEcLvl_t);
+
+
+ l_ECLvlInfoPcrdHdrPtr->hdatOffset = 0x0010; // All array entries start right after header which is of 4 word size
+ l_ECLvlInfoPcrdHdrPtr->hdatArrayCnt = 1;
+ l_ECLvlInfoPcrdHdrPtr->hdatAllocSize =
+ sizeof(hdatEcLvl_t);
+ l_ECLvlInfoPcrdHdrPtr->hdatActSize =
+ sizeof(hdatEcLvl_t);
+
+ uint32_t l_ecLevel = 0;
+ uint32_t l_chipId = 0;
+
+ l_errl = hdatGetIdEc( l_pProcTarget,
+ l_ecLevel,
+ l_chipId);
+ if(l_errl)
+ {
+ HDAT_ERR(" Getting the chip EC and ID value for proc chip with HUID 0X%8x failed",
+ l_pProcTarget->getAttr<ATTR_HUID>());
+ break;
+ }
+ hdatEcLvl_t *l_hdatEcLvl = reinterpret_cast<hdatEcLvl_t *>
+ ((uint8_t *)l_ECLvlInfoPcrdHdrPtr + sizeof(hdatHDIFDataArray_t));
+ l_hdatEcLvl->hdatChipManfId = l_chipId;
+ l_hdatEcLvl->hdatChipEcLvl = l_ecLevel;
+
+
+ this->iv_spPcrd->hdatPcrdIntData[HDAT_PCRD_CHIP_EC_LVL].hdatOffset =
+ this->iv_spPcrd->hdatPcrdIntData[HDAT_PCRD_DA_SMP].hdatOffset + sizeof(hdatHDIFDataArray_t) +
+ (sizeof(hdatSMPLinkInfo_t) * HDAT_PCRD_MAX_SMP_LINK);
+ this->iv_spPcrd->hdatPcrdIntData[HDAT_PCRD_CHIP_EC_LVL].hdatSize = l_pcrdECLvlTotalSize;
+ this->iv_spPcrd->hdatHdr.hdatSize += l_pcrdECLvlTotalSize;
+
if( NULL != l_errl)
{
break;
@@ -678,6 +727,12 @@ errlHndl_t HdatPcrd::hdatSetProcessorInfo(
iv_spPcrd->hdatChipData.hdatPcrdStatusFlags =
isFunctional(i_pProcTarget)? i_procstatus : HDAT_PROC_NOT_USABLE;
+ if(i_pProcTarget->getAttr<ATTR_PROC_MASTER_TYPE>() ==
+ TARGETING::PROC_MASTER_TYPE_ACTING_MASTER)
+ {
+ iv_spPcrd->hdatChipData.hdatPcrdStatusFlags |= HDAT_PROC_IPL_MASTER;
+ }
+
//Set NxFunctional State
iv_spPcrd->hdatChipData.hdatPcrdNxFunctional = 0;
TARGETING::PredicateCTM l_predNx(TARGETING::CLASS_UNIT,
OpenPOWER on IntegriCloud