diff options
author | Corey Swenson <cswenson@us.ibm.com> | 2017-01-31 12:06:13 -0600 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2017-02-28 11:51:33 -0500 |
commit | 600d2fb18f8566e50bb1036c664ed576753ad8c1 (patch) | |
tree | 5740bfba01c9041c353225ac64351b116ae03f3d /src/usr/hdat | |
parent | 2f76aef57ebc1c12e5d19e90a8d6872fbd67664e (diff) | |
download | talos-hostboot-600d2fb18f8566e50bb1036c664ed576753ad8c1.tar.gz talos-hostboot-600d2fb18f8566e50bb1036c664ed576753ad8c1.zip |
Update the HDAT HB reserved memory fields
Change-Id: I45fb3144836877b3b495e62d06289f70af7dbdf6
RTC:168523
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/35855
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: NAGENDRA K. GURRAM <nagendra.g@in.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/hdat')
-rwxr-xr-x | src/usr/hdat/hdatmsvpd.C | 31 | ||||
-rwxr-xr-x | src/usr/hdat/hdatmsvpd.H | 215 |
2 files changed, 132 insertions, 114 deletions
diff --git a/src/usr/hdat/hdatmsvpd.C b/src/usr/hdat/hdatmsvpd.C index c87d714da..f835da10e 100755 --- a/src/usr/hdat/hdatmsvpd.C +++ b/src/usr/hdat/hdatmsvpd.C @@ -142,7 +142,7 @@ void HdatMsVpd::hdatInit(hdatMsAddr_t &i_maxMsAddr, iv_RHBaddrRngArrayHdr.hdatAllocSize = sizeof(hdatMsVpdRhbAddrRange_t); iv_RHBaddrRngArrayHdr.hdatActSize = sizeof(hdatMsVpdRhbAddrRange_t); - iv_maxRHBAddrRngCnt = hdatGetMaxCecNodes(); + iv_maxRHBAddrRngCnt = HDAT_RHB_MAX_RANGE_ENTRIES * hdatGetMaxCecNodes(); // Allocate space for the mainstore area entries and IMT Addr Range array iv_msAreaPtrs = new HdatMsArea*[iv_maxMsAreaCnt]; @@ -328,7 +328,8 @@ errlHndl_t HdatMsVpd::addRHBAddrRange(uint32_t i_dbob_id, hdatMsAddr_t &i_start, <char*>(iv_RHBaddrRangeArray) + (iv_RHBaddrRngArrayHdr.hdatArrayCnt * sizeof(hdatMsVpdRhbAddrRange_t))); - l_addr->hdatDbobID = i_dbob_id; + l_addr->hdatRhbRngType = 0x0; + l_addr->hdatRhbRngId = i_dbob_id; l_addr->hdatRhbAddrRngStrAddr = i_start; l_addr->hdatRhbAddrRngEndAddr = i_end; //TODO : : RTC Story 159684 @@ -343,7 +344,7 @@ errlHndl_t HdatMsVpd::addRHBAddrRange(uint32_t i_dbob_id, hdatMsAddr_t &i_start, } memset(l_addr->hdatRhbLabelString, 0x00, HDAT_MS_RHB_LABEL_LEN); - + if (i_labelStringPtr != NULL) { for(uint8_t l_idx = 0; l_idx < l_addr->hdatRhbLabelSize; l_idx++) @@ -1192,7 +1193,7 @@ errlHndl_t HdatMsVpd::hdatLoadMsData(uint32_t &o_size, uint32_t &o_count) l_hdatNhtmStartAddr.lo = l_nhtmStartAddr & 0x00000000FFFFFFFFull; l_hdatNhtmStartAddr.hi |= HDAT_REAL_ADDRESS_MASK; - + l_nhtmSize = l_nhtmStartAddr + l_nhtmSize; l_hdatNhtmEndAddr.hi = (l_nhtmSize & 0xFFFFFFFF00000000ull) >> 32; @@ -1572,7 +1573,7 @@ errlHndl_t HdatMsVpd::hdatLoadMsData(uint32_t &o_size, uint32_t &o_count) // TODO : RTC Story 159682 // Further CHTM support needs to be added which contains // the trace array for 24 cores - // Reinitializing the NHTM size + // Reinitializing the NHTM size l_nhtmSize = l_pProcTarget->getAttr <TARGETING::ATTR_PROC_NHTM_BAR_SIZE>(); @@ -1638,7 +1639,7 @@ errlHndl_t HdatMsVpd::hdatLoadMsData(uint32_t &o_size, uint32_t &o_count) &l_functionalnode); TARGETING::ATTR_HB_RSV_MEM_SIZE_MB_type l_rhbSize = - l_pSysTarget->getAttr<TARGETING::ATTR_HB_RSV_MEM_SIZE_MB>(); + l_pSysTarget->getAttr<TARGETING::ATTR_HB_RSV_MEM_SIZE_MB>(); if( 0 != l_rhbSize ) { for(;l_nodes;++l_nodes) @@ -1682,9 +1683,25 @@ errlHndl_t HdatMsVpd::hdatLoadMsData(uint32_t &o_size, uint32_t &o_count) uint32_t l_rhbLabelSize = 0; uint8_t* l_rhbLabelStringPtr = NULL; - addRHBAddrRange(l_dbobId, l_hdatRhbStartAddr, + addRHBAddrRange(l_dbobId, l_hdatRhbStartAddr, l_hdatRhbEndAddr, l_rhbLabelSize, l_rhbLabelStringPtr); + + TARGETING::ATTR_HB_RSV_MEM_SIZE_MB_type l_rhbEntries = + l_pSysTarget->getAttr + <TARGETING::ATTR_HDAT_RSV_MEM_NUM_SECTIONS>(); + + l_dbobId = 0x0; + l_hdatRhbStartAddr.lo = 0x0; + l_hdatRhbStartAddr.hi = 0x0; + l_hdatRhbEndAddr.lo = 0x0; + l_hdatRhbEndAddr.hi = 0x0; + for(uint32_t l_entry=0; l_entry<l_rhbEntries; l_entry++) + { + addRHBAddrRange(l_dbobId, l_hdatRhbStartAddr, + l_hdatRhbEndAddr, l_rhbLabelSize, + l_rhbLabelStringPtr); + } } } else diff --git a/src/usr/hdat/hdatmsvpd.H b/src/usr/hdat/hdatmsvpd.H index 5bc216638..fc54ce966 100755 --- a/src/usr/hdat/hdatmsvpd.H +++ b/src/usr/hdat/hdatmsvpd.H @@ -24,7 +24,7 @@ /* IBM_PROLOG_END_TAG */ #ifndef HDATMSVPD_H #define HDATMSVPD_H - + /** * @file hdatmsvpd.H * @@ -60,6 +60,7 @@ const uint32_t HDAT_BITS_PER_BYTE = 8; const uint32_t HDAT_MB_PER_GB = 1024; const uint32_t MAX_CHIP_EC_CNT_PER_MSAREA = 2; const uint32_t HDAT_START_INSTANCE = 0; +const uint32_t HDAT_RHB_MAX_RANGE_ENTRIES = 15; /** @brief Structure version number @@ -81,7 +82,7 @@ enum hdatMsVpdDataPtrs HDAT_MS_VPD_IMT_ADDR_RNG = 3, HDAT_MS_VPD_UE_ADDR_RNG = 4, HDAT_MS_VPD_HB_ADDR_RNG = 5, - HDAT_MS_VPD_LAST = 6 + HDAT_MS_VPD_LAST = 6 }; @@ -113,11 +114,11 @@ struct hdatRamArea uint32_t ivfruId; hdatRamArea(uint32_t i_huid, bool status, - uint32_t dimmSize,uint32_t i_fruId) : + uint32_t dimmSize,uint32_t i_fruId) : ivHuid(i_huid), ivFunctional(status), ivSize(dimmSize), - ivfruId(i_fruId) { + ivfruId(i_fruId) { } }; @@ -179,13 +180,13 @@ struct hdatMsVpdUEAddrRange_t */ struct hdatMsVpdRhbAddrRange_t { - uint32_t hdatDbobID; // 0x0000 Node instance - // number + uint32_t hdatRhbRngType:8; // 0x0000 Range type + uint32_t hdatRhbRngId:24; // 0x0001 Range ID hdatMsAddr_t hdatRhbAddrRngStrAddr; // 0x0004 Range starting // address hdatMsAddr_t hdatRhbAddrRngEndAddr; // 0x000C Range ending // address+1 - uint32_t hdatRhbLabelSize; // 0x0014 Label size + uint32_t hdatRhbLabelSize; // 0x0014 Label size uint8_t hdatRhbLabelString[HDAT_MS_RHB_LABEL_LEN];// 0x0019 Label string Ptr } __attribute__ ((packed)); @@ -276,7 +277,7 @@ enum hdatBsrMode * CEC Server process. * * Contained within the mainstore VPD object are mainstore area - * objects and RAM objects. + * objects and RAM objects. * * Thread safety: An HdatMsVpd object is not thread safe. That is, a single * object cannot be shared and used concurrently by multiple @@ -294,7 +295,7 @@ class HdatMsVpd : public HdatHdif { public: - /** + /** * @brief Construct an HdatMsVpd object. * * This is the constructor for the HdatMsVpd object. @@ -442,13 +443,13 @@ class HdatMsVpd : public HdatHdif * @param[in] i_resourceId - The FRU's resource id * @param[in] i_msAreaId - A unique id for each main store area * associated with a mainstore VPD object. The id starts at - * 0 and is incremented by 1 for each new + * 0 and is incremented by 1 for each new * mainstore area. * @param[in] i_ramCnt - The number of RAM objects that will be * added to the mainstore area. If an exact count * cannot be computed, a maximum number can be * provided. - * @param[in] i_chipEcCnt - The number of EC entries that will be + * @param[in] i_chipEcCnt - The number of EC entries that will be * added to the mainstore area. If an exact count cannot be * computed, a maximum number can be provided. * @param[in] i_addrRngCnt - The number of address range entries that @@ -481,9 +482,9 @@ class HdatMsVpd : public HdatHdif * @post None * * @param[in] i_msAreaId - A unique id for each main store area - * associated with a mainstore VPD object. The id - * identifies the mainstore area that is to be - * updated. + * associated with a mainstore VPD object. The id + * identifies the mainstore area that is to be + * updated. * @param[in] i_type - This specifies the type of memory card * for this mainstore area. */ @@ -491,42 +492,42 @@ class HdatMsVpd : public HdatHdif hdatMemParentType i_type); - /** + /** * @brief Update the mainstore area to specify the status of the memory * DIMMS * * @pre The i_msAreaId parameter must be for a valid mainstore area that - * was added with the addMsAreaFru() method.HDAT does not check or + * was added with the addMsAreaFru() method.HDAT does not check or * enforce that this is a valid main store area ID. * * @post None * - * @param[in] i_msAreaId - A unique id for each main store area - * associated with a mainstore VPD object. The id + * @param[in] i_msAreaId - A unique id for each main store area + * associated with a mainstore VPD object. The id * identifies the mainstore area that is to be updated. * @param[in] i_status - See the hdatMsAreaStatus enum. The value - * specified here can be a bitwise OR of the enum + * specified here can be a bitwise OR of the enum * values. */ void setMsAreaStat(uint16_t i_msAreaId, uint16_t i_status); - /** + /** * @brief Update the mainstore area with an id for interleaved memory * * @pre The i_msAreaId parameter must be for a valid mainstore area that - * was added with the addMsAreaFru() method.HDAT does not check or + * was added with the addMsAreaFru() method.HDAT does not check or * enforce that this is a valid main store area ID. * * @post None * * @param[in] i_msAreaId - A unique id for each main store area - * associated with a mainstore VPD object. The id + * associated with a mainstore VPD object. The id * identifies the mainstore area that is to be updated * @param[in] i_id - An identifier from 0 to N which is the same - * for each MS area which is interleaved. In - * addition, the HDAT_MEM_SHARED status attribute + * for each MS area which is interleaved. In + * addition, the HDAT_MEM_SHARED status attribute * must have been used for this * MS area when setMsAreaStat() was called. */ @@ -534,139 +535,139 @@ class HdatMsVpd : public HdatHdif uint16_t i_id); - /** - * @brief Update the mainstore area to specify the total size of the + /** + * @brief Update the mainstore area to specify the total size of the * mainstore area. * * @pre The i_msAreaId parameter must be for a valid mainstore area that - * was added with the addMsAreaFru() method. HDAT does not check or + * was added with the addMsAreaFru() method. HDAT does not check or * enforce that this is a valid main store area ID. * * @post None * - * @param[in] i_msAreaId - A unique id for each main store area - * associated with a mainstore VPD object. The id - * identifies the mainstore area that is to be - * updated. + * @param[in] i_msAreaId - A unique id for each main store area + * associated with a mainstore VPD object. The id + * identifies the mainstore area that is to be + * updated. * @param[in] i_size - The total size of the configured mainstore - * area in megabytes. It is the (high address of - * the mainstore area + 1 minus the low address of + * area in megabytes. It is the (high address of + * the mainstore area + 1 minus the low address of * the mainstore area) divided by 1 megabyte. */ void setMsAreaSize(uint16_t i_msAreaId, uint32_t i_size); - /** + /** * @brief Update the mainstore area to specify associated processor id * * @pre The i_msAreaId parameter must be for a valid mainstore area that - * was added with the addMsAreaFru() method. HDAT does not check or + * was added with the addMsAreaFru() method. HDAT does not check or * enforce that this is a valid main store area ID. * * @post None * * @param[in] i_msAreaId - A unique id for each main store area - * associated with a mainstore VPD object. - * The id identifies the mainstore area that is - * to be updated. - * @param[in] i_moduleId - The Module Id of the processor + * associated with a mainstore VPD object. + * The id identifies the mainstore area that is + * to be updated. + * @param[in] i_moduleId - The Module Id of the processor * associated with this mainstore area. */ void setMsAreaModuleId(uint16_t i_msAreaId, uint32_t i_moduleId); - /** + /** * @brief Update the mainstore area to specify the affinity domain * * @pre The i_msAreaId parameter must be for a valid mainstore area that - * was added with the addMsAreaFru() method. HDAT does not check or + * was added with the addMsAreaFru() method. HDAT does not check or * enforce that this is a valid main store area ID. * * @post None * * @param[in] i_msAreaId - A unique id for each main store area - * associated with a mainstore VPD object. - * The id identifies the mainstore area that is - * to be updated. - * @param[in] i_affinityDomain - The affinity domain + * associated with a mainstore VPD object. + * The id identifies the mainstore area that is + * to be updated. + * @param[in] i_affinityDomain - The affinity domain * associated with this mainstore area. */ void setMsAreaAffinityDomain(uint16_t i_msAreaId, uint32_t i_affinityDomain); - /** + /** * @brief Update the mainstore area to specify the memory address range - * More than one address range can be added. + * More than one address range can be added. * * @pre The i_msAreaId parameter must be for a valid mainstore area that - * was added with the addMsAreaFru() method. HDAT does not check or + * was added with the addMsAreaFru() method. HDAT does not check or * enforce that this is a valid main store area ID. * * @post None * * @param[in] i_msAreaId - A unique id for each main store area * associated with a mainstore VPD object. The id - * identifies the mainstore area that is to be - * updated. - * @param[in] i_start - The starting address of the range + * identifies the mainstore area that is to be + * updated. + * @param[in] i_start - The starting address of the range * @param[in] i_end - The ending address of the range + 1 - * @param[in] i_procChipId - which is the chip id of the physical + * @param[in] i_procChipId - which is the chip id of the physical * processor * @param[in] i_rangeIsMirrorable - Specifies whether the range is * mirrorable * @param[in] i_mirroringAlgorithm - Specifies hardware mirroring * algorithm to use * @param[in] i_startMirrAddr - Specifies the starting mirrorable - * address for range + * address for range * - * @return A null error log handle if successful, else the return code + * @return A null error log handle if successful, else the return code * pointed to by errlHndl_t contains one of: * - * @retval HDAT_ARRAY_ERROR + * @retval HDAT_ARRAY_ERROR */ errlHndl_t addMsAreaAddr(uint16_t i_msAreaId, hdatMsAddr_t &i_start, hdatMsAddr_t &i_end, uint32_t i_procChipId, - bool i_rangeIsMirrorable = false, - uint8_t i_mirroringAlgorithm = 0, - uint64_t i_startMirrAddr = 0); + bool i_rangeIsMirrorable = false, + uint8_t i_mirroringAlgorithm = 0, + uint64_t i_startMirrAddr = 0); - /** + /** * @brief Add engineering change information for memory interface chips * - * @pre The first EC entry added must be for the memory controller. - * HDAT has no way of validating or enforcing this so it is up to the + * @pre The first EC entry added must be for the memory controller. + * HDAT has no way of validating or enforcing this so it is up to the * user of the method to do this correctly. * * The i_msAreaId parameter must be for a valid mainstore area that - * was added with the addMsAreaFru() method.HDAT does not check or + * was added with the addMsAreaFru() method.HDAT does not check or * enforce that this is a valid main store area ID. * - * @post One cannot add any more engineering change entries than was + * @post One cannot add any more engineering change entries than was * specified by the i_chipEcCnt parameter on the addMsAreaFru method. * * @param[in] i_msAreaId -A unique id for each main store area - * associated with a mainstore VPD object. The id - * identifies the mainstore area that is to be - * updated. - * @param[in] i_manfId - Chip's manufacturing id + * associated with a mainstore VPD object. The id + * identifies the mainstore area that is to be + * updated. + * @param[in] i_manfId - Chip's manufacturing id * @param[in] i_ecLvl - Chip's engineering change level * - * @return A null error log handle if successful, else the return code + * @return A null error log handle if successful, else the return code * pointed to by errlHndl_t contains one of: * - * @retval HDAT_ARRAY_ERROR + * @retval HDAT_ARRAY_ERROR */ errlHndl_t addEcEntry(uint16_t i_msAreaId, uint32_t i_manfId, uint32_t i_ecLvl); - - /** + + /** * @brief Update the mainstore area to specify the host I2C device info * * @pre The i_msAreaId parameter must be for a valid mainstore area that @@ -678,26 +679,26 @@ class HdatMsVpd : public HdatHdif * @param i_msAreaId - input parameter - A unique id for each main * store area associated with a mainstore VPD * object. The id identifies the mainstore area - * that is to be updated. + * that is to be updated. * @param i_I2cDevEntries- input parameter - host I2c device info */ void setMsaI2cInfo(uint16_t i_msAreaId, std::vector<hdatMsAreaHI2cData_t>& i_I2cDevEntries); - /** + /** * @brief Add a RAM area FRU. * * After a mainstore area has been added to the mainstore VBPD object, * one or more RAM FRUs must be added to the mainstore area. * - * @pre A mainstore area must have been previously created so this RAM + * @pre A mainstore area must have been previously created so this RAM * area can be added to it. * * The i_msAreaId parameter must be for a valid mainstore area that - * was added with the addMsAreaFru() method. HDAT does not check + * was added with the addMsAreaFru() method. HDAT does not check * or enforce that this is a valid main store area ID. * - * @post A RAM card's VPD definiton has been added to the object. Heap + * @post A RAM card's VPD definiton has been added to the object. Heap * storage has been allocated. * * @param[in] i_msAreaId - The id of the mainstore area this @@ -710,7 +711,7 @@ class HdatMsVpd : public HdatHdif * @param[in] i_size -the total size of configured mainstore in this * RAM area * - * @return A null error log handle if successful, else the return code + * @return A null error log handle if successful, else the return code * pointed to by errlHndl_t contains one of: * * @retval HDAT_ALLOC_ERROR @@ -722,8 +723,8 @@ class HdatMsVpd : public HdatHdif uint32_t i_slcaIndex, uint16_t i_ramId, uint16_t i_status, - uint32_t i_size); - /** + uint32_t i_size); + /** * @brief Initialization of HdatMsVpd object. * * If you are constructing this object on the heap by using new, then @@ -737,24 +738,24 @@ class HdatMsVpd : public HdatHdif * * @pre None * - * @post An HdatMsVpd object has been initialized. Heap storage has + * @post An HdatMsVpd object has been initialized. Heap storage has * been allocated. * * @param[in] i_maxMsAddr - maximum configured main store address * @param[in] i_maxMsCcmAddr - maximum main store address that could be - * configured if memory was added with - * concurrent maintenance.If concurrent - * maintenance cannot be performed on this - * machine,this parameter has the same value as + * configured if memory was added with + * concurrent maintenance.If concurrent + * maintenance cannot be performed on this + * machine,this parameter has the same value as * i_maxMsAddr. * @param[in] i_msSize - total size of configured main store in * mega-bytes. (number of mega-bytes from lowest - * main store address to highest main store + * main store address to highest main store * address minus the number of mega-bytes of a * ddress holes) * @param[in] i_msAreaCnt The count of the number of main store areas - * that will be defined by using the - * addMsAreaFru() method below.If the actual + * that will be defined by using the + * addMsAreaFru() method below.If the actual * count cannot be derived when this object is * constructed, a maximum count can be supplied. * @param[in] i_MostSigAffinityDomain -most significant affinity domain. @@ -764,7 +765,7 @@ class HdatMsVpd : public HdatHdif * @param[in] i_ueAreaCnt - Maximum number of UE Address ranges * @param[in] i_MirrMemStartAddr - The address of the start of * mirrorable memory - * + * */ void hdatInit(hdatMsAddr_t &i_maxMsAddr, hdatMsAddr_t &i_maxMsCcmAddr, @@ -774,32 +775,32 @@ class HdatMsVpd : public HdatHdif uint32_t i_ueAreaCnt, uint64_t i_MirrMemStartAddr); - /** + /** * @brief Gather MS data for HDAT * @par Description: * This function collects various MS attributes and fills MS Data area - * + * * @param[in] o_size - total size written * @param[in] o_count - total count of ms vpd instance * - * @return A null error log handle if successful, else the return code + * @return A null error log handle if successful, else the return code * pointed to by o_errlHndl contains one of: * * @retval HDAT_ARRAY_ERROR */ errlHndl_t hdatLoadMsData(uint32_t &o_size, uint32_t &o_count); - /** + /** * @brief Gets maximum configured memory address - * + * * * @return value of ms address */ uint64_t hdatGetMaxMemConfiguredAddress(); - /** + /** * @brief Fetches the group of MC - * + * * @param[in] i_pTarget Proc target * @param[in] i_pMcsTarget MCS target * @param[out] o_groupOfMc MC group value @@ -810,9 +811,9 @@ class HdatMsVpd : public HdatHdif const TARGETING::Target *i_pMcsTarget, uint32_t& o_groupOfMc); - /** + /** * @brief Get the DIMMS list present on the system - * + * * @param[in] i_pTarget Mca target * @param[in] i_pMcsTarget Mcs target * @param[in] i_membufFruid - membuf fruid decides the parent type @@ -836,9 +837,9 @@ class HdatMsVpd : public HdatHdif bool& o_areaFunctional, hdatMemParentType& i_parentType); - /** + /** * @brief Get max memory blocks connected to membuf - * + * * @param[in] i_pTarget Mcs target * @param[out] o_maxMemoryBlocks - max memory block value * @@ -848,24 +849,24 @@ class HdatMsVpd : public HdatHdif errlHndl_t hdatGetMaxMemoryBlocks(const TARGETING::Target *i_pTarget, uint32_t &o_maxMemoryBlocks); - /** + /** * @brief Write the data to Mainstore area space - * + * * @param[in] i_addr - MS address * @param[in] i_size - total size to be written * */ void commit(void * i_addr,uint32_t i_size); - /** + /** * @brief Get total size of MS data to be written - * - * @param[out] o_size - total size value + * + * @param[out] o_size - total size value * */ void getTotalSize(uint32_t &o_size); - /** + /** * @brief Print an HdatMsVpd object. * * This method is a debug mthod which prints out a mainstore VPD object. @@ -879,7 +880,7 @@ class HdatMsVpd : public HdatHdif protected: - /** + /** * @brief After all MS area objects have been created, this routine must * be called to see if they are all the same size.If they are not, the * smaller one(s) will be adjusted with padding so they are all @@ -897,7 +898,7 @@ class HdatMsVpd : public HdatHdif private: - + /** Object Instance Data * |