diff options
Diffstat (limited to 'src/usr/hwpf/hwp/winkle_ring_accessors/getL3DeltaDataAttr.C')
-rwxr-xr-x | src/usr/hwpf/hwp/winkle_ring_accessors/getL3DeltaDataAttr.C | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/src/usr/hwpf/hwp/winkle_ring_accessors/getL3DeltaDataAttr.C b/src/usr/hwpf/hwp/winkle_ring_accessors/getL3DeltaDataAttr.C new file mode 100755 index 000000000..d89743270 --- /dev/null +++ b/src/usr/hwpf/hwp/winkle_ring_accessors/getL3DeltaDataAttr.C @@ -0,0 +1,180 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/hwpf/hwp/winkle_ring_accessors/getL3DeltaDataAttr.C $ */ +/* */ +/* IBM CONFIDENTIAL */ +/* */ +/* COPYRIGHT International Business Machines Corp. 2013 */ +/* */ +/* p1 */ +/* */ +/* Object Code Only (OCO) source materials */ +/* Licensed Internal Code Source Materials */ +/* IBM HostBoot Licensed Internal Code */ +/* */ +/* 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. */ +/* */ +/* Origin: 30 */ +/* */ +/* IBM_PROLOG_END_TAG */ +// $Id: getL3DeltaDataAttr.C,v 1.4 2013/12/13 14:46:30 mjjones Exp $ +/** + * @file getL3DeltaDataAttr.C + * + * @brief fetch processor ex func l3 delta data attributes based on chip type, + * EC and PROC_PBIEX_ASYNC_SEL value from static arrays in + * fapiL3DeltaDataAttr.H + * + */ + +#include <stdint.h> + +// fapi support +#include <fapi.H> +#include <getL3DeltaDataAttr.H> +#include <fapiL3DeltaDataAttr.H> + +// Logic overview + +// Define and initialize variables +// Get chip type +// Get EC level +// Get PROC_PBIEX_ASYNC_SEL attr +// Use chip & ec to select array entry and selection attr to select data array +// entry +// Set return delta data attr value + +extern "C" +{ + +fapi::ReturnCode getL3DeltaDataAttr( const fapi::Target &i_fapiTarget, + uint32_t (&o_data)[DELTA_DATA_SIZE]) +{ + FAPI_INF("getL3DeltaDataAttr: entry" ); + + // Initialize return values to 0x00 + memset(o_data, 0x00, sizeof(o_data)); + + // Define and initialize variables + + uint8_t i = 0; + uint8_t l_attrDdLevel = 0; + fapi::TargetType l_targetType = fapi::TARGET_TYPE_NONE; + fapi::ATTR_NAME_Type l_chipType = 0x00; + fapi::ATTR_PROC_PBIEX_ASYNC_SEL_Type l_selection = 0; + fapi::ReturnCode rc; + + // Get attributes used to determine delta data + + do + { + // Verify input target is a processor + l_targetType = i_fapiTarget.getType(); + if (l_targetType != fapi::TARGET_TYPE_PROC_CHIP) + { + FAPI_ERR("getL3DeltaDataAttr: Invalid target type passed on " + "invocation. target type=0x%08X ", + static_cast<uint32_t>(l_targetType)); + // Return error on get attr + fapi::TargetType & TARGET_TYPE = l_targetType; + FAPI_SET_HWP_ERROR(rc, RC_GET_L3_DELTA_DATA_PARAMETER_ERR ); + break; + } + + // Get chip type + rc = FAPI_ATTR_GET_PRIVILEGED(ATTR_NAME, + &i_fapiTarget, + l_chipType); + if (rc) + { + FAPI_ERR("getL3DeltaDataAttr: FAPI_ATTR_GET_PRIVILEGED of " + "ATTR_NAME failed w/rc=0x%08X", + static_cast<uint32_t>(rc)); + break; + } + + // Get EC level + rc = FAPI_ATTR_GET_PRIVILEGED(ATTR_EC, + &i_fapiTarget, + l_attrDdLevel); + // Exit on error + if (rc) + { + FAPI_ERR("getL3DeltaDataAttr: FAPI_ATTR_GET_PRIVILEGED of " + "ATTR_EC failed w/rc=0x%08X", static_cast<uint32_t>(rc)); + break; + } + + // Get proc_pbiex_async_sel + rc = FAPI_ATTR_GET(ATTR_PROC_PBIEX_ASYNC_SEL, + NULL, + l_selection); + // Exit on error + if (rc) + { + FAPI_ERR("getL3DeltaDataAttr: FAPI_ATTR_GET of " + "ATTR_PROC_PBIEX_ASYNC_SEL failed w/rc=0x%08X", + static_cast<uint32_t>(rc)); + break; + } + // Check for valid value + if ((l_selection != fapi::ENUM_ATTR_PROC_PBIEX_ASYNC_SEL_SEL0) && + (l_selection != fapi::ENUM_ATTR_PROC_PBIEX_ASYNC_SEL_SEL1) && + (l_selection != fapi::ENUM_ATTR_PROC_PBIEX_ASYNC_SEL_SEL2)) + { + FAPI_ERR("getL3DeltaDataAttr: FAPI_ATTR_GET() returned " + "unsupported value ATTR_PROC_PBIEX_ASYNC_SEL=0x%02x", + l_selection); + fapi::ATTR_PROC_PBIEX_ASYNC_SEL_Type & SELECT_VAL = l_selection; + FAPI_SET_HWP_ERROR(rc, RC_GET_L3_DELTA_DATA_SELECT_ERR ); + break; + } + + FAPI_INF("getL3DeltaDataAttr: Chip type=0x%02x EC=0x%02x " + "ATTR_PROC_PBIEX_ASYNC_SEL = %i", + l_chipType, l_attrDdLevel, l_selection); + + // Murano DD1.2 and DD1.0 are equivalent in terms of engineering data + if ((l_chipType == fapi::ENUM_ATTR_NAME_MURANO) && + (l_attrDdLevel == 0x12)) + { + FAPI_INF("getL3DeltaDataAttr: Treating EC1.2 like EC1.0"); + l_attrDdLevel = 0x10; + } + + // Use chip & ec to select array entry and selection attr to select + // data array entry + for (i = 0; ((i < (sizeof(L3_DELTA_DATA_array) / + sizeof(L3_DELTA_DATA_ATTR))) && + ((L3_DELTA_DATA_array[i].l_ATTR_CHIPTYPE != l_chipType) || + (L3_DELTA_DATA_array[i].l_ATTR_EC != l_attrDdLevel))); i++) + { } + // No match found + if (i == (sizeof(L3_DELTA_DATA_array)/sizeof(L3_DELTA_DATA_ATTR))) + { + FAPI_ERR("getL3DeltaDataAttr: No match found for chiptype=0x%x " + "EC=0x%x selection=%d", + l_chipType, l_attrDdLevel, l_selection); + // Return error on get attr + fapi::ATTR_NAME_Type & CHIP_NAME = l_chipType; + uint8_t & CHIP_EC = l_attrDdLevel; + FAPI_SET_HWP_ERROR(rc, RC_GET_L3_DELTA_DATA_ERR ); + break; + } + + // Set return delta data attr value + memcpy(o_data, L3_DELTA_DATA_array[i].l_ATTR_L3_DELTA_DATA[l_selection], + sizeof(o_data)); + + } while (0); + + FAPI_INF("getL3DeltaDataAttr: exit rc=0x%x", static_cast<uint32_t>(rc) ); + + return rc; +} + +} // extern "C" + |