summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/plat/fapiPlatAttributeService.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/hwpf/plat/fapiPlatAttributeService.C')
-rw-r--r--src/usr/hwpf/plat/fapiPlatAttributeService.C205
1 files changed, 205 insertions, 0 deletions
diff --git a/src/usr/hwpf/plat/fapiPlatAttributeService.C b/src/usr/hwpf/plat/fapiPlatAttributeService.C
index fd22a350b..5c2bf00f6 100644
--- a/src/usr/hwpf/plat/fapiPlatAttributeService.C
+++ b/src/usr/hwpf/plat/fapiPlatAttributeService.C
@@ -1799,6 +1799,211 @@ fapi::ReturnCode fapiPlatGetTpVitlSpyOffsetAttr(
return l_rc;
}
+fapi::ReturnCode fapiPlatGetMemAttrData (
+ const fapi::Target * i_pTarget,
+ const TARGETING::ATTRIBUTE_ID i_attr,
+ uint32_t & o_val)
+{
+
+ FAPI_DBG("fapiPlatGetMemAttrData: START: i_attr=0x%X", i_attr);
+
+ fapi::ReturnCode l_rc;
+ TARGETING::Target * l_pTgt = NULL;
+
+ do {
+
+ // Get non-FAPI Centaur Target
+ l_rc = getTargetingTarget(i_pTarget, l_pTgt,
+ TARGETING::TYPE_MEMBUF);
+
+ if (l_rc)
+ {
+ FAPI_ERR("fapiPlatGetMemAttrData: Error from getTargetingTarget");
+ break;
+ }
+
+ // Get NODE from MEMBUF target
+ TARGETING::TargetHandleList l_nodeList;
+ TARGETING::TargetService& tS = TARGETING::targetService();
+
+ TARGETING::PredicateCTM isaNode(TARGETING::CLASS_ENC,
+ TARGETING::TYPE_NODE);
+ tS.getAssociated( l_nodeList,
+ l_pTgt,
+ TARGETING::TargetService::PARENT,
+ TARGETING::TargetService::ALL,
+ &isaNode);
+
+ // Node list should only have 1 tgt
+ if (l_nodeList.size() != 1 )
+ {
+ FAPI_ERR("fapiPlatGetMemAttrData: expect 1 node %d ",
+ l_nodeList.size());
+
+ /*@
+ * @errortype
+ * @moduleid MOD_PLAT_ATTR_SVC_GET_MEM_ATTR_DATA
+ * @reasoncode RC_NO_SINGLE_NODE
+ * @userdata1 Number of Nodes
+ * @userdata2 MEMBUF Target HUID
+ * @devdesc fapiPlatGetMemAttrData could not find the single
+ * node associated with this membuf target
+ */
+ const bool hbSwError = true;
+ errlHndl_t l_pError = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_UNRECOVERABLE,
+ MOD_PLAT_ATTR_SVC_GET_MEM_ATTR_DATA,
+ RC_NO_SINGLE_NODE,
+ l_nodeList.size(),
+ TARGETING::get_huid(l_pTgt),
+ hbSwError);
+
+ // Attach the error log to the fapi::ReturnCode
+ l_rc.setPlatError(reinterpret_cast<void *> (l_pError));
+ break;
+ }
+
+ // Get the attribute from the node level
+ // NOTE: Using switch statement to explicitly track the attributes
+ // that need to do this lookup.
+ bool l_success = false;
+
+ switch ( i_attr )
+ {
+ case TARGETING::ATTR_MSS_CENT_VDD_SLOPE_ACTIVE:
+ l_success =
+ l_nodeList[0]->tryGetAttr<
+ TARGETING::ATTR_MSS_CENT_VDD_SLOPE_ACTIVE>(o_val);
+ break;
+
+ case TARGETING::ATTR_MSS_CENT_VDD_SLOPE_INACTIVE:
+ l_success =
+ l_nodeList[0]->tryGetAttr<
+ TARGETING::ATTR_MSS_CENT_VDD_SLOPE_INACTIVE>(o_val);
+ break;
+
+ case TARGETING::ATTR_MSS_CENT_VDD_INTERCEPT:
+ l_success =
+ l_nodeList[0]->tryGetAttr<
+ TARGETING::ATTR_MSS_CENT_VDD_INTERCEPT>(o_val);
+ break;
+
+ case TARGETING::ATTR_MSS_CENT_VCS_SLOPE_ACTIVE:
+ l_success =
+ l_nodeList[0]->tryGetAttr<
+ TARGETING::ATTR_MSS_CENT_VCS_SLOPE_ACTIVE>(o_val);
+ break;
+
+ case TARGETING::ATTR_MSS_CENT_VCS_SLOPE_INACTIVE:
+ l_success =
+ l_nodeList[0]->tryGetAttr<
+ TARGETING::ATTR_MSS_CENT_VCS_SLOPE_INACTIVE>(o_val);
+ break;
+
+ case TARGETING::ATTR_MSS_CENT_VCS_INTERCEPT:
+ l_success = l_nodeList[0]->tryGetAttr<
+ TARGETING::ATTR_MSS_CENT_VCS_INTERCEPT>(o_val);
+ break;
+
+ case TARGETING::ATTR_MSS_VOLT_VPP_SLOPE_EFF_CONFIG:
+ l_success =
+ l_nodeList[0]->tryGetAttr<
+ TARGETING::ATTR_MSS_VOLT_VPP_SLOPE_EFF_CONFIG>(o_val);
+ break;
+
+ case TARGETING::ATTR_MSS_VOLT_VPP_INTERCEPT_EFF_CONFIG:
+ l_success =
+ l_nodeList[0]->tryGetAttr<
+ TARGETING::ATTR_MSS_VOLT_VPP_INTERCEPT_EFF_CONFIG>
+ (o_val);
+ break;
+
+ case TARGETING::ATTR_MSS_VOLT_DDR3_VDDR_SLOPE_EFF_CONFIG:
+ l_success =
+ l_nodeList[0]->tryGetAttr<
+ TARGETING::ATTR_MSS_VOLT_DDR3_VDDR_SLOPE_EFF_CONFIG>
+ (o_val);
+ break;
+
+ case TARGETING::ATTR_MSS_VOLT_DDR3_VDDR_INTERCEPT_EFF_CONFIG:
+ l_success =
+ l_nodeList[0]->tryGetAttr<
+ TARGETING::ATTR_MSS_VOLT_DDR3_VDDR_INTERCEPT_EFF_CONFIG
+ >(o_val);
+ break;
+
+ case TARGETING::ATTR_MRW_DDR3_VDDR_MAX_LIMIT_EFF_CONFIG:
+ l_success =
+ l_nodeList[0]->tryGetAttr<
+ TARGETING::ATTR_MRW_DDR3_VDDR_MAX_LIMIT_EFF_CONFIG>
+ (o_val);
+ break;
+
+ case TARGETING::ATTR_MSS_VOLT_DDR4_VDDR_SLOPE_EFF_CONFIG:
+ l_success =
+ l_nodeList[0]->tryGetAttr<
+ TARGETING::ATTR_MSS_VOLT_DDR4_VDDR_SLOPE_EFF_CONFIG>
+ (o_val);
+ break;
+
+ case TARGETING::ATTR_MSS_VOLT_DDR4_VDDR_INTERCEPT_EFF_CONFIG:
+ l_success =
+ l_nodeList[0]->tryGetAttr<
+ TARGETING::ATTR_MSS_VOLT_DDR4_VDDR_INTERCEPT_EFF_CONFIG
+ >(o_val);
+ break;
+
+ case TARGETING::ATTR_MRW_DDR4_VDDR_MAX_LIMIT_EFF_CONFIG:
+ l_success =
+ l_nodeList[0]->tryGetAttr<
+ TARGETING::ATTR_MRW_DDR4_VDDR_MAX_LIMIT_EFF_CONFIG>
+ (o_val);
+ break;
+
+ default:
+ // Use error creation below
+ l_success = false;
+ break;
+ }
+
+ if (!l_success)
+ {
+ FAPI_ERR("fapiPlatGetMemAttrData: Error from _tryGetAttr");
+
+ /*@
+ * @errortype
+ * @moduleid MOD_PLAT_ATTR_SVC_GET_MEM_ATTR_DATA
+ * @reasoncode RC_FAILED_TO_ACCESS_ATTRIBUTE
+ * @userdata1[0:31] Platform attribute ID
+ * @userdata1[32:64] MEMBUF Target
+ * @userdata2 FAPI target type, or NULL if system target
+ * @devdesc Failed to get requested attribute.
+ * Possible causes: Invalid target, attribute not implemented,
+ * attribute not present on given target, target service
+ * not initialized
+ */
+ const bool hbSwError = true;
+ errlHndl_t l_pError = new ERRORLOG::ErrlEntry(
+ ERRORLOG::ERRL_SEV_INFORMATIONAL,
+ MOD_PLAT_ATTR_SVC_GET_MEM_ATTR_DATA,
+ RC_FAILED_TO_ACCESS_ATTRIBUTE,
+ TWO_UINT32_TO_UINT64(
+ i_attr,
+ TARGETING::get_huid(l_pTgt)),
+ i_pTarget ? i_pTarget->getType(): NULL,
+ hbSwError);
+ l_rc.setPlatError(reinterpret_cast<void *>(l_pError));
+ }
+
+ } while (0);
+
+ FAPI_DBG("fapiPlatGetMemAttrData: EXIT: i_attr=0x%X --> o_val = %d (0x%X)",
+ i_attr, o_val, o_val);
+
+ return l_rc;
+
+}
+
} // End platAttrSvc namespace
} // End fapi namespace
OpenPOWER on IntegriCloud