summaryrefslogtreecommitdiffstats
path: root/src/usr/hdat
diff options
context:
space:
mode:
authornagurram-in <nagendra.g@in.ibm.com>2017-09-11 08:54:34 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2017-09-12 11:28:03 -0400
commit8feb62b8d22be7881355e8cf44de0f11e9b28fae (patch)
tree6a621615cc69b0e55ecac017e5f9fde17f46dd08 /src/usr/hdat
parent62a80b8e13df4c383635287a0f685c789c8e5a83 (diff)
downloadtalos-hostboot-8feb62b8d22be7881355e8cf44de0f11e9b28fae.tar.gz
talos-hostboot-8feb62b8d22be7881355e8cf44de0f11e9b28fae.zip
HDAT: NVLink speed changes in SMP Link info
Change-Id: I410fa688690046ed9864a4ace13043856a9f0a58 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/46009 Reviewed-by: VENKATESH SAINATH <venkatesh.sainath@in.ibm.com> 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> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/hdat')
-rw-r--r--src/usr/hdat/hdatpcrd.C13
-rwxr-xr-xsrc/usr/hdat/hdatspiraS.C2
-rw-r--r--src/usr/hdat/hdatutil.C180
-rwxr-xr-xsrc/usr/hdat/hdatutil.H24
-rw-r--r--src/usr/hdat/makefile2
5 files changed, 193 insertions, 28 deletions
diff --git a/src/usr/hdat/hdatpcrd.C b/src/usr/hdat/hdatpcrd.C
index 9ffe9cff1..b77c8d2e3 100644
--- a/src/usr/hdat/hdatpcrd.C
+++ b/src/usr/hdat/hdatpcrd.C
@@ -597,7 +597,6 @@ errlHndl_t HdatPcrd::hdatLoadPcrd(uint32_t &o_size, uint32_t &o_count)
l_SMPInfoFullPcrdHdrPtr->hdatActSize =
sizeof(hdatSMPLinkInfo_t);
-
hdatSMPLinkInfo_t *l_SMPInfoFullPcrdDataPtr = NULL;
l_SMPInfoFullPcrdDataPtr = reinterpret_cast<hdatSMPLinkInfo_t *>
((uint8_t*)l_SMPInfoFullPcrdHdrPtr + sizeof(hdatHDIFDataArray_t));
@@ -607,12 +606,24 @@ errlHndl_t HdatPcrd::hdatLoadPcrd(uint32_t &o_size, uint32_t &o_count)
//copy data from vector to data ptr
std::copy(l_SMPInfoEntries.begin(),
l_SMPInfoEntries.end(), l_SMPInfoFullPcrdDataPtr);
+
+ // Update obus speed and other things which can't be pulled from mrw
+ // Since those are dynamically set by sbe.
+ l_errl = hdatUpdateSMPLinkInfoData(l_SMPInfoFullPcrdHdrPtr ,
+ l_SMPInfoFullPcrdDataPtr,
+ l_pProcTarget);
+ if(l_errl)
+ {
+ HDAT_ERR(" Failed in hdatUpdateSMPLinkInfoData");
+ break;
+ }
}
else
{
HDAT_INF("Empty SMP Link info vector : Size=%d",
l_SMPInfoEntries.size());
}
+
this->iv_spPcrd->hdatPcrdIntData[HDAT_PCRD_DA_SMP].hdatOffset =
this->iv_spPcrd->hdatPcrdIntData[HDAT_PCRD_DA_PNOR].hdatOffset +
sizeof(hdatPcrdPnor_t);
diff --git a/src/usr/hdat/hdatspiraS.C b/src/usr/hdat/hdatspiraS.C
index db23584ac..9c063badc 100755
--- a/src/usr/hdat/hdatspiraS.C
+++ b/src/usr/hdat/hdatspiraS.C
@@ -542,7 +542,7 @@ errlHndl_t HdatSpiraS::loadDataArea( const hdat5Tuple_t& i_spirasHostEntry,
if ( NULL == l_err )
{
- l_pcrd.hdatLoadPcrd(l_size,l_count);
+ l_err = l_pcrd.hdatLoadPcrd(l_size,l_count);
HDAT_DBG("PCRD count=%d,size=%x",l_count,l_size);
}
else
diff --git a/src/usr/hdat/hdatutil.C b/src/usr/hdat/hdatutil.C
index 1c013dd72..1f3a3220f 100644
--- a/src/usr/hdat/hdatutil.C
+++ b/src/usr/hdat/hdatutil.C
@@ -26,6 +26,7 @@
#include "hdatutil.H"
#include <i2c/eepromif.H>
#include <stdio.h>
+#include <p9_frequency_buckets.H>
#define UINT16_IN_LITTLE_ENDIAN(x) (((x) >> 8) | ((x) << 8))
#define HDAT_VPD_RECORD_START_TAG 0x84
@@ -42,38 +43,38 @@ extern trace_desc_t *g_trac_hdat;
// SEQUOIA
const hdatSMPLinkInfo_t l_hdatSMPLinkInfoProc0_6gpucfg[] = {
- {0,0x01,0x00,0xF1E00000,21,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {1,0x01,0x01,0x07187000,21,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {2,0x01,0x02,0x00078F00,23,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {3,0x01,0x09,0xF1E00000,25,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {4,0x01,0x0A,0x07187000,25,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {5,0x01,0x0B,0x00078F00,23,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF}
+ {0,0x01,0x00,0xF1E00000,11,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,22,0},
+ {2,0x01,0x01,0x07187000,11,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,22,0},
+ {4,0x01,0x02,0x00078F00,13,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,24,0},
+ {6,0x01,0x09,0xF1E00000,15,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,23,0},
+ {8,0x01,0x0A,0x07187000,15,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,23,0},
+ {10,0x01,0x0B,0x00078F00,13,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,24,0}
};
const hdatSMPLinkInfo_t l_hdatSMPLinkInfoProc1_6gpucfg[] = {
- {0,0x01,0x00,0xF1E00000,10,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {1,0x01,0x01,0x07187000,10,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {2,0x01,0x02,0x00078F00,12,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {3,0x01,0x09,0xF1E00000,27,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {4,0x01,0x0A,0x07187000,27,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {5,0x01,0x0B,0x00078F00,12,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF}
+ {0,0x01,0x00,0xF1E00000,24,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,22,0},
+ {2,0x01,0x01,0x07187000,24,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,22,0},
+ {4,0x01,0x02,0x00078F00,26,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,23,0},
+ {6,0x01,0x09,0xF1E00000,28,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,24,0},
+ {8,0x01,0x0A,0x07187000,28,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,24,0},
+ {10,0x01,0x0B,0x00078F00,26,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,23,0}
};
// REDBUD
const hdatSMPLinkInfo_t l_hdatSMPLinkInfoProc0_4gpucfg[] = {
- {0,0x01,0x00,0xF1E00000,21,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {1,0x01,0x01,0x07187000,21,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {2,0x01,0x02,0x00078F00,21,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {3,0x01,0x09,0xF1E00000,23,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {4,0x01,0x0A,0x07187000,23,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {5,0x01,0x0B,0x00078F00,23,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF}
+ {1,0x01,0x00,0xF1E00000,11,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,22,0},
+ {3,0x01,0x01,0x07187000,11,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,22,0},
+ {5,0x01,0x02,0x00078F00,11,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,22,0},
+ {7,0x01,0x09,0xF1E00000,13,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,24,0},
+ {9,0x01,0x0A,0x07187000,13,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,24,0},
+ {11,0x01,0x0B,0x00078F00,13,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,24,0}
};
const hdatSMPLinkInfo_t l_hdatSMPLinkInfoProc1_4gpucfg[] = {
- {0,0x01,0x00,0xF1E00000,25,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {1,0x01,0x01,0x07187000,25,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {2,0x01,0x02,0x00078F00,25,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {3,0x01,0x09,0xF1E00000,10,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {4,0x01,0x0A,0x07187000,10,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF},
- {5,0x01,0x0B,0x00078F00,10,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF}
+ {1,0x01,0x00,0xF1E00000,24,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,22,0},
+ {3,0x01,0x01,0x07187000,24,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,22,0},
+ {5,0x01,0x02,0x00078F00,24,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,22,0},
+ {7,0x01,0x09,0xF1E00000,26,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,23,0},
+ {9,0x01,0x0A,0x07187000,26,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,23,0},
+ {11,0x01,0x0B,0x00078F00,26,0xFFFF,0xFF,0x00,0xFF,0xFF,0xFF,2,23,0}
};
@@ -1989,6 +1990,137 @@ void hdatGetSMPLinkInfo(TARGETING::Target* i_pTarget,
HDAT_EXIT();
}
+errlHndl_t hdatUpdateSMPLinkInfoData(hdatHDIFDataArray_t * i_SMPInfoFullPcrdHdrPtr ,
+ hdatSMPLinkInfo_t * io_SMPInfoFullPcrdDataPtr,
+ TARGETING::Target* i_pProcTarget)
+{
+ errlHndl_t l_errl = NULL;
+ HDAT_ENTER();
+ std::vector<hdatSMPLinkInfo_t> l_SMPLinkInfoCntr(io_SMPInfoFullPcrdDataPtr,
+ io_SMPInfoFullPcrdDataPtr + i_SMPInfoFullPcrdHdrPtr->hdatArrayCnt);
+ do{
+ for(auto & l_SMPInfoEle : l_SMPLinkInfoCntr)
+ {
+ uint8_t l_obusChipletPos =
+ (uint8_t) l_SMPInfoEle.hdatSMPLinkBrickID / NUM_BRICKS_PER_OBUS;
+ uint32_t l_obusPllFreqBucket = 0;
+ switch( l_obusChipletPos){
+ case 0: { l_obusPllFreqBucket = i_pProcTarget->getAttr<ATTR_OB0_PLL_BUCKET>(); break;}
+ case 1: { l_obusPllFreqBucket = i_pProcTarget->getAttr<ATTR_OB1_PLL_BUCKET>(); break;}
+ case 2: { l_obusPllFreqBucket = i_pProcTarget->getAttr<ATTR_OB2_PLL_BUCKET>(); break;}
+ case 3: { l_obusPllFreqBucket = i_pProcTarget->getAttr<ATTR_OB3_PLL_BUCKET>(); break;}
+ default :{
+ HDAT_ERR(" Invalid obus Brick ID ");
+
+ /*@
+ * @errortype
+ * @moduleid HDAT::MOD_UTIL_SMP_LINK_INFO
+ * @reasoncode HDAT::RC_INVALID_OBUS_BRICKID
+ * @devdesc Invalid OBUS brick ID
+ * @custdesc Firmware encountered an internal
+ * error while getting obus brick ID
+ */
+ hdatBldErrLog(l_errl,
+ MOD_UTIL_SMP_LINK_INFO,
+ RC_INVALID_OBUS_BRICKID,
+ 0,0,0,0);
+ break;
+ }
+ }
+ if(l_errl != NULL)
+ {
+ HDAT_ERR(" Error in getting the PLL Freq bucket");
+ break;
+ }
+
+ if(l_obusPllFreqBucket >= OBUS_PLL_FREQ_BUCKETS)
+ {
+ HDAT_ERR(" Invalid obus Freq bucket ");
+
+ /*@
+ * @errortype
+ * @moduleid HDAT::MOD_UTIL_SMP_LINK_INFO
+ * @reasoncode HDAT::RC_INVALID_OBUS_FREQ_BUCKET
+ * @devdesc Invalid OBUS Freq Bucket
+ * @custdesc Firmware encountered an internal
+ * error while getting obus frequency bucket
+ */
+ hdatBldErrLog(l_errl,
+ MOD_UTIL_SMP_LINK_INFO,
+ RC_INVALID_OBUS_FREQ_BUCKET,
+ 0,0,0,0);
+ break;
+ }
+ uint32_t *l_freqList = NULL;
+ TARGETING::ATTR_MODEL_type l_chipModel = i_pProcTarget->getAttr<TARGETING::ATTR_MODEL>();
+ uint32_t l_chipECLevel = i_pProcTarget->getAttr<TARGETING::ATTR_HDAT_EC>();
+ if(l_chipModel == TARGETING::MODEL_NIMBUS)
+ {
+ switch (l_chipECLevel){
+ case 0x10:{l_freqList = const_cast<uint32_t *>(OBUS_PLL_FREQ_LIST_P9N_10); break; }
+ case 0x20:{l_freqList = const_cast<uint32_t *>(OBUS_PLL_FREQ_LIST_P9N_20); break; }
+ case 0x21:{l_freqList = const_cast<uint32_t *>(OBUS_PLL_FREQ_LIST_P9N_21); break; }
+ case 0x22:{l_freqList = const_cast<uint32_t *>(OBUS_PLL_FREQ_LIST_P9N_22); break; }
+ }
+ }
+ else if(l_chipModel == TARGETING::MODEL_CUMULUS)
+ {
+ if(l_chipECLevel == 0x10)
+ {
+ l_freqList = const_cast<uint32_t *>(OBUS_PLL_FREQ_LIST_P9C_10);
+ }
+ }
+ if(l_freqList == NULL)
+ {
+ HDAT_ERR("Invalid proc model and ec 0x%x, 0x%x", l_chipModel , l_chipECLevel);
+ /*@
+ * @errortype
+ * @moduleid HDAT::MOD_UTIL_SMP_LINK_INFO
+ * @reasoncode HDAT::RC_UNDEFINED_PROC_MODEL_EC
+ * @devdesc Undefined Proc model and ec
+ * @custdesc Firmware encountered an internal
+ * error while finding proc model and ec
+ */
+ hdatBldErrLog(l_errl,
+ MOD_UTIL_SMP_LINK_INFO,
+ RC_UNDEFINED_PROC_MODEL_EC,
+ 0,0,0,0);
+ break;
+ }
+
+ uint32_t l_pllfreq = *(l_freqList+l_obusPllFreqBucket);
+
+ switch( l_pllfreq ){
+ case 1250:{l_SMPInfoEle.hdatSMPLinkSpeed = HDAT_OBUS_FREQ_20GBPS; break; };
+ case 1563:{l_SMPInfoEle.hdatSMPLinkSpeed = HDAT_OBUS_FREQ_25GBPS; break; };
+ case 1611:{l_SMPInfoEle.hdatSMPLinkSpeed = HDAT_OBUS_FREQ_25_78125GBPS; break; };
+ default:{
+ HDAT_ERR("Invalid obus pll freq value for obus chiplet %d,"
+ "of proc with HUID 0x%8X: 0x%d", l_obusChipletPos,
+ i_pProcTarget->getAttr<ATTR_HUID>(), l_pllfreq);
+ /*@
+ * @errortype
+ * @moduleid HDAT::MOD_UTIL_SMP_LINK_INFO
+ * @reasoncode HDAT::RC_INVALID_OBUS_PLL_FREQ
+ * @devdesc Invalid OBUS PLL frequency value
+ * @custdesc Firmware encountered an internal
+ * error while retrieving obus pll frequency values
+ */
+ hdatBldErrLog(l_errl,
+ MOD_UTIL_SMP_LINK_INFO,
+ RC_INVALID_OBUS_PLL_FREQ,
+ 0,0,0,0);
+ break;
+ }
+ }
+ if(l_errl != NULL){break;};
+ }
+ }while(0);
+ //Replace the updated data in the passed in pointer.
+ std::copy(l_SMPLinkInfoCntr.begin(), l_SMPLinkInfoCntr.end(),io_SMPInfoFullPcrdDataPtr);
+ HDAT_EXIT();
+ return l_errl;
+}
} //namespace HDAT
diff --git a/src/usr/hdat/hdatutil.H b/src/usr/hdat/hdatutil.H
index 39400343b..efb492c57 100755
--- a/src/usr/hdat/hdatutil.H
+++ b/src/usr/hdat/hdatutil.H
@@ -98,7 +98,7 @@ const uint16_t HDAT_VERSION3 = 3;
#define HDAT_ADD_PAD(x) x += (16 - ((uint64_t)x % 16))
#define HDAT_NV_KWD_MAGIC_WRD 0x4E563030 // "NV00"
-
+#define NUM_BRICKS_PER_OBUS 3
namespace HDAT
{
@@ -141,6 +141,9 @@ struct hdatSMPLinkInfo_t
uint32_t hdatSMPLinkI2cLinkId;
uint32_t hdatSMPLinkI2cLinkIdPres;
uint32_t hdatSMPLinkI2cLinkIdMicro;
+ uint8_t hdatSMPLinkSpeed;
+ uint8_t hdatSMPOccRegBitPos;
+ uint16_t hdatSMPGPUSlcaIdx;
}__attribute__ ((packed));
@@ -166,6 +169,14 @@ enum hdatWitherspoonNVCnfg
HDAT_SEQUOIA_NV_CNFG = 2,
};
+/** @enum NV Link speeds
+ */
+enum hdatNVLinkSpeed
+{
+ HDAT_OBUS_FREQ_20GBPS = 0,
+ HDAT_OBUS_FREQ_25GBPS = 1,
+ HDAT_OBUS_FREQ_25_78125GBPS = 2,
+};
/** @brief Structure definition for an entry in the chip's engineering change
* level array
@@ -579,6 +590,17 @@ void hdatGetI2cDeviceInfo(TARGETING::Target* i_pTarget,
void hdatGetSMPLinkInfo(TARGETING::Target* i_pTarget,
std::vector<hdatSMPLinkInfo_t>&o_SMPLinkEntries);
+/******************************************************************************
+ * @brief Updated the smp link info data got from hdat pnor partition
+ * @param[in] i_SMPinfoFullPcrdHdrPtr : SMP info header pointer
+ * @param[in/out] io_SMPInfoFullPcrdDataPtr : SMP info data pointer
+ * @param[in] i_pProcTarget : Proc target
+ * @return A null error log handle if successfull, else the return code
+ * pointed by o_errlHndl
+*******************************************************************************/
+errlHndl_t hdatUpdateSMPLinkInfoData(hdatHDIFDataArray_t * i_SMPInfoFullPcrdHdrPtr ,
+ hdatSMPLinkInfo_t * io_SMPInfoFullPcrdDataPtr,
+ TARGETING::Target* i_pProcTarget);
};// end namespace
diff --git a/src/usr/hdat/makefile b/src/usr/hdat/makefile
index f04be84a7..9e9de6c74 100644
--- a/src/usr/hdat/makefile
+++ b/src/usr/hdat/makefile
@@ -28,7 +28,7 @@ MODULE = hdat
EXTRAINCDIR += ../vpd
EXTRAINCDIR += ../../include/usr/vpd
-EXTRAINCDIR +=
+EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/common/include
OBJS += hdatutil.o
OBJS += hdatpcia.o
OpenPOWER on IntegriCloud