diff options
Diffstat (limited to 'src')
3 files changed, 307 insertions, 0 deletions
diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundv_bucket_attr.C b/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundv_bucket_attr.C new file mode 100644 index 000000000..9e2ca2673 --- /dev/null +++ b/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundv_bucket_attr.C @@ -0,0 +1,231 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: chips/p9/procedures/hwp/pm/p9_pm_get_poundv_bucket_attr.C $ */ +/* */ +/* IBM CONFIDENTIAL */ +/* */ +/* EKB Project */ +/* */ +/* COPYRIGHT 2015,2016 */ +/* [+] International Business Machines Corp. */ +/* */ +/* */ +/* The source code for this program is not published or otherwise */ +/* divested of its trade secrets, irrespective of what has been */ +/* deposited with the U.S. Copyright Office. */ +/* */ +/* IBM_PROLOG_END_TAG */ +/// +/// @file p9_pm_get_poundv_bucket_attr.C +/// @brief Grab PM data from certain bucket in #V keyword in LRPX record +/// + +// ---------------------------------------------------------------------- +// Includes +// ---------------------------------------------------------------------- +#include <p9_pm_get_poundv_bucket_attr.H> +#include <mvpd_access_defs.H> +#include <attribute_ids.H> + +fapi2::ReturnCode p9_pm_get_poundv_bucket_attr( + const fapi2::Target<fapi2::TARGET_TYPE_EQ>& i_target, + uint8_t* o_data) +{ + FAPI_IMP("Entering p9_pm_get_poundv_bucket_attr ...."); + uint8_t* l_prDataPtr = NULL; + uint8_t* l_fullVpdData = NULL; + uint8_t l_overridePresent = 0; + uint32_t l_vpdSize = 0; + uint32_t l_eqFapiPos = 0; + uint8_t l_bucketId; + fapi2::ReturnCode l_rc = fapi2::FAPI2_RC_SUCCESS; + + do + { + //To read MVPD we will need the proc parent of the inputted EQ target + fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP> l_procParent = + i_target.getParent<fapi2::TARGET_TYPE_PROC_CHIP>(); + + //check if bucket num has been overriden + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_POUNDV_BUCKET_NUM_OVERRIDE, + i_target, + l_overridePresent)); + + if(l_overridePresent != 0) + { + //If it has been overriden then get the override + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_POUNDV_BUCKET_NUM, + i_target, + l_bucketId)); + } + else + { + //Otherwise get the bucket num from MVPD data + //First read is to get size of vpd record, note the o_buffer is NULL + l_rc = getMvpdField(fapi2::MVPD_RECORD_VINI, + fapi2::MVPD_KEYWORD_PR, + l_procParent, + NULL, + l_vpdSize); + + if(l_rc) + { + FAPI_ERR("p9_pm_get_poundv_bucket_attr:: Error reading PR keyword size from VINI record"); + break; + } + + l_prDataPtr = reinterpret_cast<uint8_t*>(malloc(l_vpdSize)); + + //Second read is to get data of vpd record + l_rc = getMvpdField(fapi2::MVPD_RECORD_VINI, + fapi2::MVPD_KEYWORD_PR, + l_procParent, + l_prDataPtr, + l_vpdSize); + + if(l_rc) + { + FAPI_ERR("p9_pm_get_poundv_bucket_attr:: Error reading PR keyword from VINI record"); + break; + } + + //Bucket ID is byte[4] of the PR keyword + memcpy(&l_bucketId, (l_prDataPtr + 4), sizeof(uint8_t)); + } + + + //Need to determine which LRP record to read from depending on which + //bucket we are getting the power management data from. FapiPos will + //tell us which LRP record to use. + FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_FAPI_POS, + i_target, + l_eqFapiPos)); + fapi2::MvpdRecord lprRecord; + + switch(l_eqFapiPos) + { + case 0: + lprRecord = fapi2::MVPD_RECORD_LRP0; + break; + + case 1: + lprRecord = fapi2::MVPD_RECORD_LRP1; + break; + + case 2: + lprRecord = fapi2::MVPD_RECORD_LRP2; + break; + + case 3: + lprRecord = fapi2::MVPD_RECORD_LRP3; + break; + + case 4: + lprRecord = fapi2::MVPD_RECORD_LRP4; + break; + + case 5: + lprRecord = fapi2::MVPD_RECORD_LRP5; + break; + + default: + FAPI_ERR("No LRP record found for EQ with fapi pos = %d", l_eqFapiPos); + assert(0); + break; + } + + //Reset VPD size because we want to find size of another VPD record + l_vpdSize = 0; + + //First read is to get size of vpd record, note the o_buffer is NULL + l_rc = getMvpdField(lprRecord, + fapi2::MVPD_KEYWORD_PDV, + l_procParent, + NULL, + l_vpdSize); + + if(l_rc) + { + FAPI_ERR("p9_pm_get_poundv_bucket_attr:: Error reading PDV keyword size from LRP%d record", l_eqFapiPos); + break; + } + + //Allocate memory for vpd data + l_fullVpdData = reinterpret_cast<uint8_t*>(malloc(l_vpdSize)); + + FAPI_ASSERT(l_vpdSize - 4 - ((l_bucketId - 1) * 0x33) >= sizeof(fapi2::ATTR_POUNDV_BUCKET_DATA_Type), + fapi2::BAD_VPD_READ() + .set_EXPECTED_SIZE(sizeof(fapi2::ATTR_POUNDV_BUCKET_DATA_Type)) + .set_ACTUAL_SIZE(l_vpdSize - 4 - ((l_bucketId - 1) * 0x33)), + "#V data read was too small!" ); + + //Second read is to get data of vpd record + l_rc = getMvpdField(lprRecord, + fapi2::MVPD_KEYWORD_PDV, + l_procParent, + l_fullVpdData, + l_vpdSize); + + if(l_rc) + { + FAPI_ERR("p9_pm_get_poundv_bucket_attr:: Error reading PDV keyword from LRP%d record", l_eqFapiPos); + break; + } + + //#V record is laid out as follows: + //Name: 0x2 byte + //Length: 0x2 byte + //Version: 0x1 byte **buffer starts here + //PNP: 0x3 byte + //bucket a: 0x33 byte + //bucket b: 0x33 byte + //bucket c: 0x33 byte + //bucket d: 0x33 byte + //bucket e: 0x33 byte + //bucket f: 0x33 byte + if( *l_fullVpdData == 0x2) + { + memcpy(o_data, + l_fullVpdData + 4 + (l_bucketId - 1) * 0x33, + sizeof(fapi2::ATTR_POUNDV_BUCKET_DATA_Type)); + } + else + { + FAPI_ERR("p9_pm_get_poundv_bucket_attr::Invalid #V record version: 0x%x", *l_fullVpdData); + FAPI_ASSERT(0, + fapi2::INVALID_POUNDV_VERSION() + .set_POUNDV_VERSION(*l_fullVpdData), + "#V is of an invalid version!" ); + } + + + } + while(0); + +fapi_try_exit: + + if(l_fullVpdData != NULL) + { + free(l_fullVpdData); + } + + if(l_prDataPtr != NULL) + { + free(l_prDataPtr); + } + + FAPI_IMP("Exiting p9_pm_get_poundv_bucket_attr ...."); + + //If there is no issue in the current err, check + //the local rc to see if the mvpd access methods caught anything + if((fapi2::current_err == fapi2::FAPI2_RC_SUCCESS) && + (l_rc != fapi2::FAPI2_RC_SUCCESS)) + { + fapi2::current_err = l_rc; + } + + return fapi2::current_err; +} + + diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundv_bucket_attr.H b/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundv_bucket_attr.H new file mode 100644 index 000000000..e6cd81cb3 --- /dev/null +++ b/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundv_bucket_attr.H @@ -0,0 +1,56 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: chips/p9/procedures/hwp/pm/p9_pm_get_poundv_bucket_attr.H $ */ +/* */ +/* IBM CONFIDENTIAL */ +/* */ +/* EKB Project */ +/* */ +/* COPYRIGHT 2015,2016 */ +/* [+] International Business Machines Corp. */ +/* */ +/* */ +/* The source code for this program is not published or otherwise */ +/* divested of its trade secrets, irrespective of what has been */ +/* deposited with the U.S. Copyright Office. */ +/* */ +/* IBM_PROLOG_END_TAG */ +/// +/// @file p9_pm_get_poundv_bucket.H +/// @brief Provide structure for voltageBucketData so that info from #V keyword +/// can be stored inside of this struct. +/// Also define prototype for p9_pm_get_poundv_bucket +/// + +#ifndef _P9_PM_GET_POUND_V_BUCKET_ATTR_H_ +#define _P9_PM_GET_POUND_V_BUCKET_ATTR_H_ + +//------------------------------------------------------------------------------ +// Includes +//------------------------------------------------------------------------------ +#include <fapi2.H> + +// function pointer typedef definition for HWP call support +typedef fapi2::ReturnCode (*p9_pm_get_poundv_bucket_attr_FP_t) ( + const fapi2::Target<fapi2::TARGET_TYPE_EQ>&, + uint8_t* o_data); + +extern "C" { + +/// +/// @brief Read #V bucket data from LRP record based upon +/// bucket ID read off of parent proc chip. This function +/// will pass out array of bytes as they are read from the VPD +/// NOTE: This might be incorrect endianness +/// @param[in] i_target EQ chiplet target +/// @param[in] o_data bytes read from #V keyword of an LRP record +/// @return FAPI2_RC_SUCCESS if success, else error code. +/// + fapi2::ReturnCode p9_pm_get_poundv_bucket_attr( + const fapi2::Target<fapi2::TARGET_TYPE_EQ>& i_target, + uint8_t* o_data); + +} // extern "C" + +#endif // _P9_PM_GET_POUND_V_BUCKET_ATTR_H_ diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundv_bucket_attr.mk b/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundv_bucket_attr.mk new file mode 100644 index 000000000..539c38d25 --- /dev/null +++ b/src/import/chips/p9/procedures/hwp/pm/p9_pm_get_poundv_bucket_attr.mk @@ -0,0 +1,20 @@ +# IBM_PROLOG_BEGIN_TAG +# This is an automatically generated prolog. +# +# $Source: chips/p9/procedures/hwp/pm/p9_pm_get_poundv_bucket_attr.mk $ +# +# IBM CONFIDENTIAL +# +# EKB Project +# +# COPYRIGHT 2015,2016 +# [+] International Business Machines Corp. +# +# +# The source code for this program is not published or otherwise +# divested of its trade secrets, irrespective of what has been +# deposited with the U.S. Copyright Office. +# +# IBM_PROLOG_END_TAG +PROCEDURE=p9_pm_get_poundv_bucket_attr +$(call BUILD_PROCEDURE) |