From 8feb62b8d22be7881355e8cf44de0f11e9b28fae Mon Sep 17 00:00:00 2001 From: nagurram-in Date: Mon, 11 Sep 2017 08:54:34 -0500 Subject: HDAT: NVLink speed changes in SMP Link info Change-Id: I410fa688690046ed9864a4ace13043856a9f0a58 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/46009 Reviewed-by: VENKATESH SAINATH Tested-by: Jenkins Server Tested-by: FSP CI Jenkins Tested-by: Jenkins OP Build CI Tested-by: Jenkins OP HW Reviewed-by: Daniel M. Crowell --- src/usr/hdat/hdatpcrd.C | 13 +++- src/usr/hdat/hdatspiraS.C | 2 +- src/usr/hdat/hdatutil.C | 180 +++++++++++++++++++++++++++++++++++++++------- src/usr/hdat/hdatutil.H | 24 ++++++- src/usr/hdat/makefile | 2 +- 5 files changed, 193 insertions(+), 28 deletions(-) (limited to 'src/usr/hdat') 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 ((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 #include +#include #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 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(); break;} + case 1: { l_obusPllFreqBucket = i_pProcTarget->getAttr(); break;} + case 2: { l_obusPllFreqBucket = i_pProcTarget->getAttr(); break;} + case 3: { l_obusPllFreqBucket = i_pProcTarget->getAttr(); 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(); + uint32_t l_chipECLevel = i_pProcTarget->getAttr(); + if(l_chipModel == TARGETING::MODEL_NIMBUS) + { + switch (l_chipECLevel){ + case 0x10:{l_freqList = const_cast(OBUS_PLL_FREQ_LIST_P9N_10); break; } + case 0x20:{l_freqList = const_cast(OBUS_PLL_FREQ_LIST_P9N_20); break; } + case 0x21:{l_freqList = const_cast(OBUS_PLL_FREQ_LIST_P9N_21); break; } + case 0x22:{l_freqList = const_cast(OBUS_PLL_FREQ_LIST_P9N_22); break; } + } + } + else if(l_chipModel == TARGETING::MODEL_CUMULUS) + { + if(l_chipECLevel == 0x10) + { + l_freqList = const_cast(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(), 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&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 -- cgit v1.2.1