summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorey Swenson <cswenson@us.ibm.com>2014-06-18 16:09:55 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2014-07-01 13:34:57 -0500
commit2cc1c594ad2b05919d1742625de0da83ffd7f01d (patch)
tree57bbbe923325245e809ea51a96c60ffe79b18600
parent3bcf5b7982bb8a2d9227dbff7be4ff2ce5fec05c (diff)
downloadblackbird-hostboot-2cc1c594ad2b05919d1742625de0da83ffd7f01d.tar.gz
blackbird-hostboot-2cc1c594ad2b05919d1742625de0da83ffd7f01d.zip
Merge VPD commits from Stradale
Change-Id: I95aa2bb30299c9d22563068741ffbeda48d2d84b RTC: 97488 Origin: Google Shared Technology Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/11661 Tested-by: Jenkins Server Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
-rw-r--r--src/include/usr/hwpf/plat/fapiPlatAttributeService.H429
-rw-r--r--src/include/usr/isteps/istep12list.H5
-rw-r--r--src/include/usr/vpd/vpdreasoncodes.H9
-rw-r--r--src/usr/diag/prdf/common/plat/pegasus/prdfLaneRepair.C12
-rw-r--r--src/usr/fsi/fsipres.C150
-rw-r--r--src/usr/hwas/common/hwas.C3
-rw-r--r--src/usr/hwas/hwasPlat.C17
-rw-r--r--src/usr/hwpf/hwp/mc_config/mc_config.C113
-rw-r--r--src/usr/hwpf/plat/HBconfig4
-rw-r--r--src/usr/targeting/common/xmltohb/target_types.xml6
-rw-r--r--src/usr/vpd/HBconfig77
-rw-r--r--src/usr/vpd/cvpd.C26
-rwxr-xr-xsrc/usr/vpd/dimmPres.C24
-rw-r--r--src/usr/vpd/ipvpd.C377
-rw-r--r--src/usr/vpd/ipvpd.H146
-rw-r--r--src/usr/vpd/mvpd.C27
-rwxr-xr-xsrc/usr/vpd/spd.C20
17 files changed, 1312 insertions, 133 deletions
diff --git a/src/include/usr/hwpf/plat/fapiPlatAttributeService.H b/src/include/usr/hwpf/plat/fapiPlatAttributeService.H
index c7482dd4d..4f16eb22d 100644
--- a/src/include/usr/hwpf/plat/fapiPlatAttributeService.H
+++ b/src/include/usr/hwpf/plat/fapiPlatAttributeService.H
@@ -5,7 +5,10 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* COPYRIGHT International Business Machines Corp. 2011,2014 */
+/* Contributors Listed Below - COPYRIGHT 2011,2014 */
+/* [+] Google Inc. */
+/* [+] International Business Machines Corp. */
+/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
@@ -61,6 +64,7 @@
#include <util/singleton.H>
#include <procMemConsts.H>
#include <fapiL3DeltaDataAttr.H>
+#include <config.h>
//******************************************************************************
// Interface
@@ -1157,6 +1161,7 @@ fapi::ReturnCode fapiPlatGetOscswitchCtl
//------------------------------------------------------------------------------
// MACROS to support MBVPD Phase Rotator attributes
//------------------------------------------------------------------------------
+#ifndef CONFIG_VPD_GETMACRO_USE_EFF_ATTR
#define ATTR_VPD_CEN_PHASE_ROT_M0_CLK_P0_GETMACRO(ID, PTARGET, VAL)\
fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
fapi::FAPI_RC_SUCCESS : fapi::platAttrSvc::fapiPlatGetPhaseRotatorData\
@@ -1357,18 +1362,279 @@ fapi::ReturnCode fapiPlatGetOscswitchCtl
fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
fapi::FAPI_RC_SUCCESS : fapi::platAttrSvc::fapiPlatGetPhaseRotatorData\
(PTARGET, PHASE_ROT_TSYS_DP18, VAL)
+#else
+#define ATTR_VPD_CEN_PHASE_ROT_M0_CLK_P0_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M0_CLK_P0, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M0_CLK_P1_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M0_CLK_P1, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M1_CLK_P0_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M1_CLK_P0, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M1_CLK_P1_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M1_CLK_P1, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_A0_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_A0, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_A1_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_A1, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_A2_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_A2, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_A3_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_A3, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_A4_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_A4, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_A5_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_A5, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_A6_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_A6, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_A7_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_A7, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_A8_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_A8, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_A9_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_A9, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_A10_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_A10, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_A11_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_A11, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_A12_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_A12, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_A13_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_A13, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_A14_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_A14, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_A15_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_A15, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_BA0_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_BA0, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_BA1_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_BA1, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_BA2_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_BA2, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_CASN_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_CASN, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_RASN_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_RASN, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_CMD_WEN_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_CMD_WEN, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_PAR_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_PAR, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M_ACTN_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M_ACTN, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M0_CNTL_CKE0_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M0_CNTL_CKE0, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M0_CNTL_CKE1_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M0_CNTL_CKE1, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M0_CNTL_CKE2_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M0_CNTL_CKE2, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M0_CNTL_CKE3_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M0_CNTL_CKE3, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M0_CNTL_CSN0_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M0_CNTL_CSN0, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M0_CNTL_CSN1_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M0_CNTL_CSN1, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M0_CNTL_CSN2_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M0_CNTL_CSN2, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M0_CNTL_CSN3_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M0_CNTL_CSN3, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M0_CNTL_ODT0_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M0_CNTL_ODT0, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M0_CNTL_ODT1_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M0_CNTL_ODT1, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M1_CNTL_CKE0_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M1_CNTL_CKE0, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M1_CNTL_CKE1_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M1_CNTL_CKE1, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M1_CNTL_CKE2_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M1_CNTL_CKE2, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M1_CNTL_CKE3_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M1_CNTL_CKE3, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M1_CNTL_CSN0_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M1_CNTL_CSN0, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M1_CNTL_CSN1_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M1_CNTL_CSN1, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M1_CNTL_CSN2_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M1_CNTL_CSN2, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M1_CNTL_CSN3_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M1_CNTL_CSN3, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M1_CNTL_ODT0_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M1_CNTL_ODT0, sizeof(VAL), &VAL)
+#define ATTR_VPD_CEN_PHASE_ROT_M1_CNTL_ODT1_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_PHASE_ROT_M1_CNTL_ODT1, sizeof(VAL), &VAL)
+#define ATTR_VPD_TSYS_ADR_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_TSYS_ADR, sizeof(VAL), &VAL)
+#define ATTR_VPD_TSYS_DP18_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_TSYS_DP18, sizeof(VAL), &VAL)
+#endif // CONFIG_VPD_GETMACRO_USE_EFF_ATTR
//------------------------------------------------------------------------------
// MACROS to support MBVPD Address Mirror attributes
//------------------------------------------------------------------------------
+#ifndef CONFIG_VPD_GETMACRO_USE_EFF_ATTR
#define ATTR_VPD_DRAM_ADDRESS_MIRRORING_GETMACRO(ID, PTARGET, VAL)\
fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
fapi::FAPI_RC_SUCCESS : fapi::platAttrSvc::fapiPlatGetAddrMirrorData\
(PTARGET, VAL)
+#else
+#define ATTR_VPD_DRAM_ADDRESS_MIRRORING_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_DRAM_ADDRESS_MIRRORING, sizeof(VAL), &VAL)
+#endif // CONFIG_VPD_GETMACRO_USE_EFF_ATTR
//------------------------------------------------------------------------------
// MACROS to support MBVPD Termination Data attributes
//------------------------------------------------------------------------------
+#ifndef CONFIG_VPD_GETMACRO_USE_EFF_ATTR
#define ATTR_VPD_DRAM_RON_GETMACRO(ID, PTARGET, VAL)\
fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
fapi::FAPI_RC_SUCCESS :\
@@ -1513,6 +1779,151 @@ fapi::ReturnCode fapiPlatGetOscswitchCtl
(checkTermDataType<fapi::TERM_DATA_CKE_PWR_MAP>(VAL), \
fapi::platAttrSvc::fapiPlatGetTermData\
(PTARGET, fapi::TERM_DATA_CKE_PWR_MAP , &VAL, sizeof(VAL)))
+#else
+#define ATTR_VPD_DRAM_RON_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_DRAM_RON, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_DRAM_RTT_NOM_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_DRAM_RTT_NOM, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_DRAM_RTT_WR_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_DRAM_RTT_WR, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_ODT_RD_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_ODT_RD, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_ODT_WR_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_ODT_WR, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_CEN_RD_VREF_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_RD_VREF, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_DRAM_WR_VREF_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_DRAM_WR_VREF, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_DRAM_WRDDR4_VREF_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_DRAM_WRDDR4_VREF, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_CEN_RCV_IMP_DQ_DQS_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_RCV_IMP_DQ_DQS, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_CEN_DRV_IMP_DQ_DQS_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_DRV_IMP_DQ_DQS, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_CEN_DRV_IMP_CNTL_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_DRV_IMP_CNTL, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_CEN_DRV_IMP_ADDR_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_DRV_IMP_ADDR, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_CEN_DRV_IMP_CLK_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_DRV_IMP_CLK, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_CEN_DRV_IMP_SPCKE_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_DRV_IMP_SPCKE, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_CEN_SLEW_RATE_DQ_DQS_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_SLEW_RATE_DQ_DQS, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_CEN_SLEW_RATE_CNTL_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_SLEW_RATE_CNTL, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_CEN_SLEW_RATE_ADDR_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_SLEW_RATE_ADDR, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_CEN_SLEW_RATE_CLK_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_SLEW_RATE_CLK, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_CEN_SLEW_RATE_SPCKE_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CEN_SLEW_RATE_SPCKE, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_RLO_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_RLO, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_WLO_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_WLO, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_GPO_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_GPO, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_CKE_PRI_MAP_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CKE_PRI_MAP, sizeof(VAL), &VAL)
+
+#define ATTR_VPD_CKE_PWR_MAP_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_CKE_PWR_MAP, sizeof(VAL), &VAL)
+#endif // CONFIG_VPD_GETMACRO_USE_EFF_ATTR
//------------------------------------------------------------------------------
// MACROS to support MBVPD Slope Intercept attributes
@@ -1553,10 +1964,18 @@ fapi::ReturnCode fapiPlatGetOscswitchCtl
//------------------------------------------------------------------------------
// MACRO to support VPD_DIMM_SPARE Attribute
//------------------------------------------------------------------------------
+#ifndef CONFIG_VPD_GETMACRO_USE_EFF_ATTR
#define ATTR_VPD_DIMM_SPARE_GETMACRO(ID, PTARGET, VAL)\
fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
fapi::FAPI_RC_SUCCESS : fapi::platAttrSvc::fapiPlatDimmGetSpareDram\
(PTARGET, VAL)
+#else
+#define ATTR_VPD_DIMM_SPARE_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_DIMM_SPARE, sizeof(VAL), &VAL)
+#endif // CONFIG_VPD_GETMACRO_USE_EFF_ATTR
//------------------------------------------------------------------------------
// MACROs to route ATTR PLL Ring accesses to the correct HWSV function
@@ -1741,10 +2160,18 @@ fapi::ReturnCode fapiPlatGetOscswitchCtl
//------------------------------------------------------------------------------
// MACROS to support MBVPD Get Dram 2N Mode Enabled
//------------------------------------------------------------------------------
+#ifndef CONFIG_VPD_GETMACRO_USE_EFF_ATTR
#define ATTR_VPD_DRAM_2N_MODE_ENABLED_GETMACRO(ID, PTARGET, VAL)\
fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
fapi::FAPI_RC_SUCCESS : fapi::platAttrSvc::fapiPlatGetDram2NModeEnabled\
(PTARGET, VAL)
+#else
+#define ATTR_VPD_DRAM_2N_MODE_ENABLED_GETMACRO(ID, PTARGET, VAL)\
+ fapi::AttrOverrideSync::getAttrOverrideFunc(fapi::ID, PTARGET, &VAL) ?\
+ fapi::FAPI_RC_SUCCESS :\
+ fapi::platAttrSvc::getTargetingAttr\
+ (PTARGET, TARGETING::ATTR_EFF_DRAM_2N_MODE_ENABLED, sizeof(VAL), &VAL)
+#endif // CONFIG_VPD_GETMACRO_USE_EFF_ATTR
//------------------------------------------------------------------------------
// MACROS to support MBVPD Get Sensor Map Data
diff --git a/src/include/usr/isteps/istep12list.H b/src/include/usr/isteps/istep12list.H
index 7ba93a505..d37bf4b2b 100644
--- a/src/include/usr/isteps/istep12list.H
+++ b/src/include/usr/isteps/istep12list.H
@@ -58,6 +58,8 @@
// include prototypes file
#include "../../../usr/hwpf/hwp/mc_config/mc_config.H"
+#include <config.h>
+
namespace INITSERVICE
{
@@ -97,6 +99,9 @@ const TaskInfo g_istep12[] = {
const DepModInfo g_istep12Dependancies = {
{
DEP_LIB(libmc_config.so),
+#ifdef CONFIG_DJVPD_READ_FROM_HW
+ DEP_LIB(libdram_training.so),
+#endif // CONFIG_DJVPD_READ_FROM_HW
NULL
}
};
diff --git a/src/include/usr/vpd/vpdreasoncodes.H b/src/include/usr/vpd/vpdreasoncodes.H
index 1a2d383fa..435d30ab3 100644
--- a/src/include/usr/vpd/vpdreasoncodes.H
+++ b/src/include/usr/vpd/vpdreasoncodes.H
@@ -5,7 +5,10 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* COPYRIGHT International Business Machines Corp. 2013,2014 */
+/* Contributors Listed Below - COPYRIGHT 2013,2014 */
+/* [+] Google Inc. */
+/* [+] International Business Machines Corp. */
+/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
@@ -50,6 +53,8 @@ enum vpdModuleId
VPD_IPVPD_FIND_RECORD_OFFSET = 0x22,
VPD_IPVPD_FIND_KEYWORD_ADDR = 0x23,
VPD_IPVPD_CHECK_BUFFER_SIZE = 0x24,
+ VPD_IPVPD_FIND_RECORD_OFFSET_SEEPROM = 0x30,
+ VPD_IPVPD_FETCH_DATA = 0x31,
// DIMM SPD
@@ -115,6 +120,8 @@ enum vpdReasonCode
VPD_RT_NULL_VPD_PTR = VPD_COMP_ID | 0x1a,
VPD_INSUFFICIENT_SPACE_FOR_IMAGE = VPD_COMP_ID | 0x1b,
VPD_MBOX_NOT_SUPPORTED_RT = VPD_COMP_ID | 0x1c,
+ VPD_RECORD_INVALID_VHDR = VPD_COMP_ID | 0x30,
+ VPD_READ_CONFIG_NOT_SET = VPD_COMP_ID | 0x31,
};
diff --git a/src/usr/diag/prdf/common/plat/pegasus/prdfLaneRepair.C b/src/usr/diag/prdf/common/plat/pegasus/prdfLaneRepair.C
index 03c944dff..ad1b36c7f 100644
--- a/src/usr/diag/prdf/common/plat/pegasus/prdfLaneRepair.C
+++ b/src/usr/diag/prdf/common/plat/pegasus/prdfLaneRepair.C
@@ -5,7 +5,10 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* COPYRIGHT International Business Machines Corp. 2013,2014 */
+/* Contributors Listed Below - COPYRIGHT 2013,2014 */
+/* [+] Google Inc. */
+/* [+] International Business Machines Corp. */
+/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
@@ -33,6 +36,7 @@
#include <iipServiceDataCollector.h>
#include <prdfExtensibleChip.H>
#include <UtilHash.H>
+#include <config.h>
// Pegasus includes
#include <prdfCalloutUtil.H>
@@ -59,8 +63,10 @@ int32_t handleLaneRepairEvent( ExtensibleChip * i_chip,
int32_t l_rc = SUCCESS;
TargetHandle_t rxBusTgt = NULL;
+#ifdef CONFIG_HAVE_MBVPD
TargetHandle_t txBusTgt = NULL;
bool thrExceeded = true;
+#endif // CONFIG_HAVE_MBVPD
std::vector<uint8_t> rx_lanes;
std::vector<uint8_t> rx_vpdLanes;
std::vector<uint8_t> tx_vpdLanes;
@@ -108,6 +114,8 @@ int32_t handleLaneRepairEvent( ExtensibleChip * i_chip,
for (std::vector<uint8_t>::iterator lane = rx_lanes.begin();
lane != rx_lanes.end(); ++lane)
{
+ PRDF_INF( PRDF_FUNC"New failed lane on RX HUID 0x%08x: %d",
+ getHuid(rxBusTgt), *lane);
if (*lane < 64)
l_newLaneMap0to63.Set(*lane);
else if (*lane < 127)
@@ -131,6 +139,7 @@ int32_t handleLaneRepairEvent( ExtensibleChip * i_chip,
i_chip->getSignatureOffset() ),
l_newLaneMap64to127);
+#ifdef CONFIG_HAVE_MBVPD
if (!mfgMode()) // Don't read/write VPD in mfg mode
{
// Read Failed Lanes from VPD
@@ -237,6 +246,7 @@ int32_t handleLaneRepairEvent( ExtensibleChip * i_chip,
i_sc.service_data->SetServiceCall();
}
+#endif // CONFIG_HAVE_MBVPD
} while (0);
// Clear FIRs
diff --git a/src/usr/fsi/fsipres.C b/src/usr/fsi/fsipres.C
index 91cba9268..c4ac77ce0 100644
--- a/src/usr/fsi/fsipres.C
+++ b/src/usr/fsi/fsipres.C
@@ -5,7 +5,10 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* COPYRIGHT International Business Machines Corp. 2011,2014 */
+/* Contributors Listed Below - COPYRIGHT 2011,2014 */
+/* [+] Google Inc. */
+/* [+] International Business Machines Corp. */
+/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
@@ -29,6 +32,7 @@
#include <errl/errlmanager.H>
#include <hwas/common/hwasCallout.H>
#include <targeting/common/predicates/predicatectm.H>
+#include <config.h>
extern trace_desc_t* g_trac_fsi;
@@ -105,45 +109,25 @@ errlHndl_t procPresenceDetect(DeviceFW::OperationType i_opType,
}
// Next look for valid Module VPD
+ bool check_for_mvpd = true;
+#ifdef CONFIG_MVPD_READ_FROM_HW
+ check_for_mvpd = fsi_present;
+#endif // CONFIG_MVPD_READ_FROM_HW
+
bool mvpd_present = false;
size_t theSize = 0;
- l_errl = deviceRead( i_target,
- NULL,
- theSize,
- DEVICE_MVPD_ADDRESS( MVPD::CP00,
- MVPD::VD ) );
- if( l_errl )
- {
- if( fsi_present )
- {
- // Save this plid to use later
- l_saved_plid = l_errl->plid();
-
- // commit this log because we expected to have VPD
- errlCommit( l_errl,
- FSI_COMP_ID );
- }
- else
- {
- // just delete this
- delete l_errl;
- }
- }
-
- if( theSize > 0 )
+ if ( check_for_mvpd )
{
- uint8_t theData[theSize];
l_errl = deviceRead( i_target,
- theData,
- theSize,
- DEVICE_MVPD_ADDRESS( MVPD::CP00,
- MVPD::VD ) );
+ NULL,
+ theSize,
+ DEVICE_MVPD_ADDRESS( MVPD::CP00,
+ MVPD::VD ) );
if( l_errl )
{
if( fsi_present )
{
-
// Save this plid to use later
l_saved_plid = l_errl->plid();
@@ -157,9 +141,37 @@ errlHndl_t procPresenceDetect(DeviceFW::OperationType i_opType,
delete l_errl;
}
}
- else
+
+ if( theSize > 0 )
{
- mvpd_present = true;
+ uint8_t theData[theSize];
+ l_errl = deviceRead( i_target,
+ theData,
+ theSize,
+ DEVICE_MVPD_ADDRESS( MVPD::CP00,
+ MVPD::VD ) );
+ if( l_errl )
+ {
+ if( fsi_present )
+ {
+
+ // Save this plid to use later
+ l_saved_plid = l_errl->plid();
+
+ // commit this log because we expected to have VPD
+ errlCommit( l_errl,
+ FSI_COMP_ID );
+ }
+ else
+ {
+ // just delete this
+ delete l_errl;
+ }
+ }
+ else
+ {
+ mvpd_present = true;
+ }
}
}
@@ -275,42 +287,22 @@ errlHndl_t membPresenceDetect(DeviceFW::OperationType i_opType,
bool fsi_present = isSlavePresent(i_target);
// Next look for memb FRU VPD
+ bool check_for_cvpd = true;
+#ifdef CONFIG_CVPD_READ_FROM_HW
+ check_for_cvpd = fsi_present;
+#endif // CONFIG_CVPD_READ_FROM_HW
+
bool cvpd_present = false;
size_t theSize = 0;
-
- l_errl = deviceRead( i_target,
- NULL,
- theSize,
- DEVICE_CVPD_ADDRESS( CVPD::VEIR,
- CVPD::PF ) );
-
- if( l_errl )
- {
-
- if( fsi_present )
- {
- // Save this plid to use later
- l_saved_plid = l_errl->plid();
-
- // commit this log because we expected to have VPD
- errlCommit( l_errl,
- FSI_COMP_ID );
- }
- else
- {
- // just delete this
- delete l_errl;
- }
- }
-
- if( theSize > 0 )
+
+ if ( check_for_cvpd )
{
- uint8_t theData[theSize];
l_errl = deviceRead( i_target,
- theData,
+ NULL,
theSize,
DEVICE_CVPD_ADDRESS( CVPD::VEIR,
CVPD::PF ) );
+
if( l_errl )
{
@@ -329,13 +321,40 @@ errlHndl_t membPresenceDetect(DeviceFW::OperationType i_opType,
delete l_errl;
}
}
- else
+
+ if( theSize > 0 )
{
- cvpd_present = true;
+ uint8_t theData[theSize];
+ l_errl = deviceRead( i_target,
+ theData,
+ theSize,
+ DEVICE_CVPD_ADDRESS( CVPD::VEIR,
+ CVPD::PF ) );
+ if( l_errl )
+ {
+
+ if( fsi_present )
+ {
+ // Save this plid to use later
+ l_saved_plid = l_errl->plid();
+
+ // commit this log because we expected to have VPD
+ errlCommit( l_errl,
+ FSI_COMP_ID );
+ }
+ else
+ {
+ // just delete this
+ delete l_errl;
+ }
+ }
+ else
+ {
+ cvpd_present = true;
+ }
}
}
-
// Finally compare the 2 methods
if( fsi_present != cvpd_present )
{
@@ -384,7 +403,6 @@ errlHndl_t membPresenceDetect(DeviceFW::OperationType i_opType,
errlCommit( l_errl,
FSI_COMP_ID );
}
-
bool present = fsi_present && cvpd_present;
memcpy(io_buffer, &present, sizeof(present));
io_buflen = sizeof(present);
diff --git a/src/usr/hwas/common/hwas.C b/src/usr/hwas/common/hwas.C
index 2b6730e09..086518238 100644
--- a/src/usr/hwas/common/hwas.C
+++ b/src/usr/hwas/common/hwas.C
@@ -51,6 +51,7 @@
#include <hwas/common/deconfigGard.H>
#include <hwas/common/hwas_reasoncodes.H>
#include <targeting/common/utilFilter.H>
+#include <config.h>
namespace HWAS
{
@@ -852,6 +853,7 @@ errlHndl_t checkMinimumHardware(const TARGETING::ConstTargetHandle_t i_node)
} // if no cores
}
+#ifndef CONFIG_DJVPD_READ_FROM_HW
// check here for functional dimms
TargetHandleList l_dimms;
PredicateCTM l_dimm(CLASS_LOGICAL_CARD, TYPE_DIMM);
@@ -906,6 +908,7 @@ errlHndl_t checkMinimumHardware(const TARGETING::ConstTargetHandle_t i_node)
errlCommit(l_errl, HWAS_COMP_ID);
// errl is now NULL
} // if no dimms
+#endif // CONFIG_DJVPD_READ_FROM_HW
// ------------------------------------------------------------
// Check for Mirrored memory -
diff --git a/src/usr/hwas/hwasPlat.C b/src/usr/hwas/hwasPlat.C
index a9ac424ab..6525401ad 100644
--- a/src/usr/hwas/hwasPlat.C
+++ b/src/usr/hwas/hwasPlat.C
@@ -5,7 +5,10 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* COPYRIGHT International Business Machines Corp. 2012,2014 */
+/* Contributors Listed Below - COPYRIGHT 2012,2014 */
+/* [+] Google Inc. */
+/* [+] International Business Machines Corp. */
+/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
@@ -43,6 +46,7 @@
#include <hwas/common/hwas_reasoncodes.H>
#include <targeting/common/utilFilter.H>
#include <fsi/fsiif.H>
+#include <config.h>
namespace HWAS
{
@@ -394,6 +398,17 @@ errlHndl_t platPresenceDetect(TargetHandleList &io_targets)
continue;
}
+ // HW backed by VPD cannot detect DIMMs at this stage of IPL, so will
+ // force all DIMMs on to be present for now and then fix up later
+ // @TODO RTC: 111211 - fix DIMMs later
+#ifdef CONFIG_DJVPD_READ_FROM_HW
+ if ( pTarget->getAttr<ATTR_TYPE>() == TYPE_DIMM )
+ {
+ pTarget_it++;
+ continue;
+ }
+#endif
+
// call deviceRead() to see if they are present
bool present = false;
size_t presentSize = sizeof(present);
diff --git a/src/usr/hwpf/hwp/mc_config/mc_config.C b/src/usr/hwpf/hwp/mc_config/mc_config.C
index 1ad4c3eea..e5e80d62b 100644
--- a/src/usr/hwpf/hwp/mc_config/mc_config.C
+++ b/src/usr/hwpf/hwp/mc_config/mc_config.C
@@ -5,7 +5,10 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* COPYRIGHT International Business Machines Corp. 2012,2014 */
+/* Contributors Listed Below - COPYRIGHT 2012,2014 */
+/* [+] Google Inc. */
+/* [+] International Business Machines Corp. */
+/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
@@ -73,6 +76,17 @@
#include "mss_volt/mss_volt_vddr_offset.H"
#include "mss_volt/mss_volt_vpp_offset.H"
+#include <config.h>
+
+#ifdef CONFIG_DJVPD_READ_FROM_HW
+#include <hwas/common/hwas.H>
+#include <hwas/common/hwasCommon.H>
+#endif // CONFIG_DJVPD_READ_FROM_HW
+
+#ifdef CONFIG_PALMETTO_VDDR
+#include "../dram_training/platform_vddr.H"
+#endif // CONFIG_PALMETTO_VDDR
+
namespace MC_CONFIG
{
@@ -82,6 +96,78 @@ using namespace ERRORLOG;
using namespace TARGETING;
using namespace fapi;
+#ifdef CONFIG_DJVPD_READ_FROM_HW
+// Detect all present DIMMs by reading SPD or PNOR.
+static errlHndl_t detect_present_dimms() {
+ errlHndl_t l_err = NULL;
+
+ TARGETING::Target* pSys;
+ targetService().getTopLevelTarget(pSys);
+
+ // Find list of all DIMMs to call platPresenceDetect against
+ PredicateCTM predDimm(CLASS_LOGICAL_CARD, TYPE_DIMM);
+ TARGETING::TargetHandleList pCheckPres;
+ targetService().getAssociated( pCheckPres, pSys,
+ TargetService::CHILD, TargetService::ALL, &predDimm );
+
+ // Actually check for present DIMMs by PNOR or SPD, this function will
+ // prune missing DIMMs from its argument.
+ l_err = HWAS::platPresenceDetect(pCheckPres);
+
+ if (l_err != NULL)
+ {
+ return l_err;
+ }
+
+ // Mark remaining DIMMs as present.
+ // @todo RTC:111211, may need to handle turning the dimms off
+ for (TargetHandleList::const_iterator pTarget_it = pCheckPres.begin();
+ pTarget_it != pCheckPres.end();
+ ++pTarget_it)
+ {
+ // set HWAS state to show DIMM is present, functional.
+ TARGETING::Target *target = *pTarget_it;
+ HwasState hwasState = target->getAttr<ATTR_HWAS_STATE>();
+ hwasState.poweredOn = true;
+ hwasState.present = true;
+ hwasState.functional = true;
+ target->setAttr<ATTR_HWAS_STATE>( hwasState );
+ }
+
+ return l_err;
+}
+
+// Disable any MBAs that don't have any DIMMs under them, otherwise
+// they will fail checks in mss_eff_config later.
+static errlHndl_t disable_unused_mbas() {
+ TARGETING::TargetHandleList l_mbaTargetList;
+ getAllChiplets(l_mbaTargetList, TYPE_MBA);
+
+ // @todo RTC:111211, may need to handle turning the dimms off
+ for (TargetHandleList::const_iterator
+ l_mba_iter = l_mbaTargetList.begin();
+ l_mba_iter != l_mbaTargetList.end();
+ ++l_mba_iter)
+ {
+ TARGETING::Target *mba = *l_mba_iter;
+
+ TARGETING::TargetHandleList l_dimmTargetList;
+ getChildAffinityTargets(l_dimmTargetList, mba,
+ CLASS_LOGICAL_CARD, TYPE_DIMM, true);
+
+ if (l_dimmTargetList.empty())
+ {
+ // No DIMMs found, mark the MBA as non-functional.
+ HwasState hwasState = mba->getAttr<ATTR_HWAS_STATE>();
+ hwasState.functional = false;
+ mba->setAttr<ATTR_HWAS_STATE>( hwasState );
+ }
+ }
+
+ return NULL;
+}
+#endif // CONFIG_DJVPD_READ_FROM_HW
+
//
// Wrapper function to call host_collect_dimm_spd
//
@@ -92,6 +178,31 @@ void* call_host_collect_dimm_spd( void *io_pArgs )
TRACDCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
"call_host_collect_dimm_spd entry" );
+#ifdef CONFIG_PALMETTO_VDDR
+ // Enable VSPD for reading SPDs.
+ l_err = platform_enable_vspd();
+ if ( l_err != NULL )
+ {
+ return l_err;
+ }
+#endif // CONFIG_PALMETTO_VDDR
+
+#ifdef CONFIG_DJVPD_READ_FROM_HW
+ // Detect all DIMMs by reading SPD or PNOR.
+ l_err = detect_present_dimms();
+ if ( l_err != NULL )
+ {
+ return l_err;
+ }
+
+ // Disable any unused MBAs that do not have DIMMs under them.
+ l_err = disable_unused_mbas();
+ if ( l_err != NULL )
+ {
+ return l_err;
+ }
+#endif // CONFIG_DJVPD_READ_FROM_HW
+
// Get a list of all present Centaurs
TargetHandleList l_presCentaurs;
getChipResources(l_presCentaurs, TYPE_MEMBUF, UTIL_FILTER_PRESENT);
diff --git a/src/usr/hwpf/plat/HBconfig b/src/usr/hwpf/plat/HBconfig
new file mode 100644
index 000000000..40fdc8ed5
--- /dev/null
+++ b/src/usr/hwpf/plat/HBconfig
@@ -0,0 +1,4 @@
+config VPD_GETMACRO_USE_EFF_ATTR
+ default n
+ help
+ Use EFF attribute in VPD GETMACRO \ No newline at end of file
diff --git a/src/usr/targeting/common/xmltohb/target_types.xml b/src/usr/targeting/common/xmltohb/target_types.xml
index 9ff8613d7..a70223770 100644
--- a/src/usr/targeting/common/xmltohb/target_types.xml
+++ b/src/usr/targeting/common/xmltohb/target_types.xml
@@ -5,7 +5,10 @@
<!-- -->
<!-- OpenPOWER HostBoot Project -->
<!-- -->
-<!-- COPYRIGHT International Business Machines Corp. 2011,2014 -->
+<!-- Contributors Listed Below - COPYRIGHT 2012,2014 -->
+<!-- [+] Google Inc. -->
+<!-- [+] International Business Machines Corp. -->
+<!-- -->
<!-- -->
<!-- Licensed under the Apache License, Version 2.0 (the "License"); -->
<!-- you may not use this file except in compliance with the License. -->
@@ -1418,6 +1421,7 @@
<parent>lcard-dimm</parent>
<attribute><id>MODEL</id><default>JEDEC</default></attribute>
<attribute><id>CEN_DQ_TO_DIMM_CONN_DQ</id></attribute>
+ <attribute><id>EEPROM_VPD_PRIMARY_INFO</id></attribute>
</targetType>
<targetType>
diff --git a/src/usr/vpd/HBconfig b/src/usr/vpd/HBconfig
new file mode 100644
index 000000000..83223a37d
--- /dev/null
+++ b/src/usr/vpd/HBconfig
@@ -0,0 +1,77 @@
+config CVPD_READ_FROM_PNOR
+ default y
+ depends on !CVPD_READ_FROM_HW
+ help
+ Read Centaur VPD data from PNOR cache
+
+config CVPD_READ_FROM_HW
+ default y if !CVPD_READ_FROM_PNOR
+ depends on !CVPD_READ_FROM_PNOR
+ help
+ Read Centaur VPD data from HW resources
+
+config CVPD_WRITE_TO_PNOR
+ default y
+ help
+ Write Centaur VPD data to PNOR cache
+
+config CVPD_WRITE_TO_HW
+ default n
+ depends on !PALMETTO_PASS1
+ help
+ Write Centaur VPD data to HW resources
+
+config MVPD_READ_FROM_PNOR
+ default y
+ depends on !MVPD_READ_FROM_HW
+ help
+ Read Module VPD data from PNOR cache
+
+config MVPD_READ_FROM_HW
+ default y if !MVPD_READ_FROM_PNOR
+ depends on !MVPD_READ_FROM_PNOR
+ help
+ Read Module VPD data from HW resources
+
+config MVPD_WRITE_TO_PNOR
+ default y
+ help
+ Write Module VPD data to PNOR cache
+
+config MVPD_WRITE_TO_HW
+ default n
+ help
+ Write Module VPD data to HW resources
+
+config DJVPD_READ_FROM_PNOR
+ default y
+ depends on !DJVPD_READ_FROM_HW
+ help
+ Read Dimm JEDEC VPD/SPD data from PNOR cache
+
+config DJVPD_READ_FROM_HW
+ default y if !DJVPD_READ_FROM_PNOR
+ depends on !DJVPD_READ_FROM_PNOR
+ help
+ Read Dimm JEDEC VPD/SPD data from HW resources
+
+config DJVPD_WRITE_TO_PNOR
+ default y
+ help
+ Write Dimm JEDEC VPD/SPD data to PNOR cache
+
+config DJVPD_WRITE_TO_HW
+ default n
+ help
+ Write Dimm JEDEC VPD/SPD data to HW resources
+
+config HAVE_MBVPD
+ default y if CVPD_READ_FROM_PNOR || CVPD_READ_FROM_HW
+ depends on CVPD_READ_FROM_PNOR || CVPD_READ_FROM_HW
+ help
+ Have MemBuff/Centaur VPD, PNOR or HW
+
+config PALMETTO_PASS1
+ default n
+ help
+ Palmetto pass1 specific changes
diff --git a/src/usr/vpd/cvpd.C b/src/usr/vpd/cvpd.C
index 8490ff66e..a21eaaa62 100644
--- a/src/usr/vpd/cvpd.C
+++ b/src/usr/vpd/cvpd.C
@@ -5,7 +5,10 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* COPYRIGHT International Business Machines Corp. 2013,2014 */
+/* Contributors Listed Below - COPYRIGHT 2013,2014 */
+/* [+] Google Inc. */
+/* [+] International Business Machines Corp. */
+/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
@@ -33,6 +36,7 @@
#include <vfs/vfs.H>
#include <vpd/vpdreasoncodes.H>
#include <vpd/cvpdenums.H>
+#include <config.h>
#include "cvpd.H"
#include "vpd.H"
@@ -196,4 +200,24 @@ IpVpdFacade(CVPD::SECTION_SIZE,
{
TRACUCOMP(g_trac_vpd, "CvpdFacade::CvpdFacade> " );
+#ifdef CONFIG_CVPD_READ_FROM_PNOR
+ iv_configInfo.vpdReadPNOR = true;
+#else
+ iv_configInfo.vpdReadPNOR = false;
+#endif
+#ifdef CONFIG_CVPD_READ_FROM_HW
+ iv_configInfo.vpdReadHW = true;
+#else
+ iv_configInfo.vpdReadHW = false;
+#endif
+#ifdef CONFIG_CVPD_WRITE_TO_PNOR
+ iv_configInfo.vpdWritePNOR = true;
+#else
+ iv_configInfo.vpdWritePNOR = false;
+#endif
+#ifdef CONFIG_CVPD_WRITE_TO_HW
+ iv_configInfo.vpdWriteHW = true;
+#else
+ iv_configInfo.vpdWriteHW = false;
+#endif
}
diff --git a/src/usr/vpd/dimmPres.C b/src/usr/vpd/dimmPres.C
index fa7fdc63f..32042fe6b 100755
--- a/src/usr/vpd/dimmPres.C
+++ b/src/usr/vpd/dimmPres.C
@@ -5,7 +5,10 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* COPYRIGHT International Business Machines Corp. 2012,2014 */
+/* Contributors Listed Below - COPYRIGHT 2013,2014 */
+/* [+] Google Inc. */
+/* [+] International Business Machines Corp. */
+/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
@@ -37,6 +40,7 @@
#include <devicefw/driverif.H>
#include <vpd/vpdreasoncodes.H>
#include <vpd/spdenums.H>
+#include <config.h>
#include "spd.H"
@@ -118,6 +122,24 @@ errlHndl_t dimmPresenceDetect( DeviceFW::OperationType i_opType,
}
// Is the target present
+#ifdef CONFIG_DJVPD_READ_FROM_HW
+ // Check if the parent MBA is functional.
+ // If it is non-functional then no reason to check the DIMM which
+ // would otherwise generate tons of FSI errors.
+ TARGETING::TargetHandleList membuf_parent;
+ TARGETING::PredicateIsFunctional isFunctional;
+ TARGETING::targetService().getAssociated(
+ membuf_parent,
+ i_target,
+ TARGETING::TargetService::PARENT_BY_AFFINITY,
+ TARGETING::TargetService::IMMEDIATE,
+ &isFunctional);
+ if ( membuf_parent.size() != 1 )
+ {
+ present = false;
+ break;
+ }
+#endif
present = spdPresent( i_target );
if( present == false )
diff --git a/src/usr/vpd/ipvpd.C b/src/usr/vpd/ipvpd.C
index 6b6c90cff..22504f672 100644
--- a/src/usr/vpd/ipvpd.C
+++ b/src/usr/vpd/ipvpd.C
@@ -5,7 +5,10 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* COPYRIGHT International Business Machines Corp. 2013,2014 */
+/* Contributors Listed Below - COPYRIGHT 2013,2014 */
+/* [+] Google Inc. */
+/* [+] International Business Machines Corp. */
+/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
@@ -31,8 +34,11 @@
#include <errl/errludtarget.H>
#include <targeting/common/targetservice.H>
#include <devicefw/driverif.H>
+#include <devicefw/userif.H>
+#include <i2c/eepromif.H>
#include <vfs/vfs.H>
#include <vpd/vpdreasoncodes.H>
+#include <config.h>
#include "vpd.H"
#include "ipvpd.H"
@@ -80,6 +86,10 @@ IpVpdFacade::IpVpdFacade(uint64_t i_vpdSectionSize,
,iv_cachePnorAddr(0x0)
,iv_vpdMsgType(i_vpdMsgType)
{
+ iv_configInfo.vpdReadPNOR = false;
+ iv_configInfo.vpdReadHW = false;
+ iv_configInfo.vpdWritePNOR = false;
+ iv_configInfo.vpdWriteHW = false;
TRACUCOMP(g_trac_vpd, "IpVpdFacade::IpVpdFacade> " );
}
@@ -137,6 +147,7 @@ errlHndl_t IpVpdFacade::read ( TARGETING::Target * i_target,
err = retrieveKeyword( keywordName,
recordName,
recordOffset,
+ 0,
i_target,
io_buffer,
io_buflen,
@@ -383,6 +394,50 @@ errlHndl_t IpVpdFacade::findRecordOffset ( const char * i_record,
input_args_t i_args )
{
errlHndl_t err = NULL;
+
+ if ( iv_configInfo.vpdReadPNOR )
+ {
+ return findRecordOffsetPnor(i_record, o_offset, i_target, i_args);
+ }
+ else if ( iv_configInfo.vpdReadHW )
+ {
+ return findRecordOffsetSeeprom(i_record, o_offset, i_target, i_args);
+ }
+ else
+ {
+ TRACFCOMP( g_trac_vpd,
+ ERR_MRK"IpVpdFacade::findRecordOffset:vpdReadPNOR and vpdReadHW false!");
+
+ /*@
+ * @errortype
+ * @reasoncode VPD::VPD_READ_CONFIG_NOT_SET
+ * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE
+ * @moduleid VPD::VPD_IPVPD_FIND_RECORD_OFFSET
+ * @userdata1 Target HUID
+ * @userdata2 <UNUSED>
+ * @devdesc Both VPD read PNOR and VPD read HW
+ * configs are set to false
+ */
+ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE,
+ VPD::VPD_IPVPD_FIND_RECORD_OFFSET,
+ VPD::VPD_READ_CONFIG_NOT_SET,
+ TARGETING::get_huid(i_target),
+ 0x0,
+ true /*Add HB SW Callout*/ );
+ err->collectTrace( "VPD", 256 );
+ }
+ return NULL;
+}
+
+// ------------------------------------------------------------------
+// IpVpdFacade::findRecordOffsetPnor
+// ------------------------------------------------------------------
+errlHndl_t IpVpdFacade::findRecordOffsetPnor ( const char * i_record,
+ uint16_t & o_offset,
+ TARGETING::Target * i_target,
+ input_args_t i_args )
+{
+ errlHndl_t err = NULL;
uint64_t tmpOffset = 0x0;
char record[RECORD_BYTE_SIZE] = { '\0' };
uint16_t offset = 0x0;
@@ -495,6 +550,145 @@ errlHndl_t IpVpdFacade::findRecordOffset ( const char * i_record,
return err;
}
+// ------------------------------------------------------------------
+// IpVpdFacade::findRecordOffsetSeeprom
+// ------------------------------------------------------------------
+errlHndl_t IpVpdFacade::findRecordOffsetSeeprom ( const char * i_record,
+ uint16_t & o_offset,
+ TARGETING::Target * i_target,
+ input_args_t i_args )
+{
+ errlHndl_t err = NULL;
+ char l_buffer[256] = { 0 };
+ uint16_t offset = 0x0;
+
+ TRACSSCOMP( g_trac_vpd,
+ ENTER_MRK"IpVpdFacade::findRecordOffsetSeeprom()" );
+
+ // Skip the ECC data + large resource ID in the VHDR
+ offset = VHDR_ECC_DATA_SIZE + VHDR_RESOURCE_ID_SIZE;
+
+ // Read PT keyword from VHDR to find the VTOC.
+ size_t pt_len = sizeof(l_buffer);
+ err = retrieveKeyword( "PT", "VHDR", offset, 0, i_target, l_buffer,
+ pt_len, i_args );
+ if (err) {
+ return err;
+ }
+
+ TocPtRecord *toc_rec = reinterpret_cast<TocPtRecord*>(l_buffer);
+ if (pt_len < sizeof(TocPtRecord) ||
+ (memcmp(toc_rec->record_name, "VTOC",
+ sizeof(toc_rec->record_name)) != 0))
+ {
+ TRACFCOMP( g_trac_vpd,
+ ERR_MRK"IpVpdFacade::findRecordOffset: VHDR is invalid!");
+
+ /*@
+ * @errortype
+ * @reasoncode VPD::VPD_RECORD_INVALID_VHDR
+ * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE
+ * @moduleid VPD::VPD_IPVPD_FIND_RECORD_OFFSET_SEEPROM
+ * @userdata1 VHDR length
+ * @userdata2 Target HUID
+ * @devdesc The VHDR was invalid
+ */
+ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE,
+ VPD::VPD_IPVPD_FIND_RECORD_OFFSET_SEEPROM,
+ VPD::VPD_RECORD_INVALID_VHDR,
+ pt_len,
+ TARGETING::get_huid(i_target) );
+
+ // Could be the VPD of the target wasn't set up properly
+ // -- DECONFIG so that we can possibly keep booting
+ err->addHwCallout( i_target,
+ HWAS::SRCI_PRIORITY_HIGH,
+ HWAS::DECONFIG,
+ HWAS::GARD_NULL );
+
+ // Or HB code didn't look for the record properly
+ err->addProcedureCallout(HWAS::EPUB_PRC_HB_CODE,
+ HWAS::SRCI_PRIORITY_LOW);
+
+ err->collectTrace( "VPD" );
+ return err;
+ }
+
+ offset = le16toh( toc_rec->record_offset ) + 1; // skip 'large resource'
+
+ // Read the PT keyword(s) (there may be more than 1) from the VTOC to
+ // find the requested record.
+ bool found = false;
+ for (uint16_t index = 0; !found; ++index)
+ {
+ pt_len = sizeof(l_buffer);
+ err = retrieveKeyword( "PT", "VTOC", offset, index, i_target, l_buffer,
+ pt_len, i_args );
+ if ( err ) {
+ break;
+ }
+
+ // Scan through the VTOC PT keyword records looking for a record
+ // name match.
+ for (size_t vtoc_pt_offset = 0; vtoc_pt_offset < pt_len;
+ vtoc_pt_offset += sizeof(TocPtRecord))
+ {
+ toc_rec = reinterpret_cast<TocPtRecord*>(l_buffer + vtoc_pt_offset);
+ TRACUCOMP( g_trac_vpd, "Scanning record %s", toc_rec->record_name);
+
+ if (memcmp(toc_rec->record_name, i_record,
+ sizeof(toc_rec->record_name)) == 0)
+ {
+ // Byte swap field on output, skip 'large resource' byte
+ o_offset = le16toh( toc_rec->record_offset ) + 1;
+ found = true;
+ break;
+ }
+ }
+ }
+
+ if ( !found && err == NULL ) {
+ TRACFCOMP( g_trac_vpd,
+ ERR_MRK"IpVpdFacade::findRecordOffsetSeeprom: "
+ "No matching Record (%s) found in VTOC!", i_record );
+
+ /*@
+ * @errortype
+ * @reasoncode VPD::VPD_RECORD_NOT_FOUND
+ * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE
+ * @moduleid VPD::VPD_IPVPD_FIND_RECORD_OFFSET_SEEPROM
+ * @userdata1[0:31] Requested Record
+ * @userdata1[32:63] Requested Keyword
+ * @userdata2 Target HUID
+ * @devdesc The requested record was not found in the VPD VTOC.
+ */
+ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE,
+ VPD::VPD_IPVPD_FIND_RECORD_OFFSET_SEEPROM,
+ VPD::VPD_RECORD_NOT_FOUND,
+ TWO_UINT32_TO_UINT64(i_args.record,
+ i_args.keyword),
+ TARGETING::get_huid(i_target) );
+
+ // Could be the VPD of the target wasn't set up properly
+ // -- DECONFIG so that we can possibly keep booting
+ err->addHwCallout( i_target,
+ HWAS::SRCI_PRIORITY_HIGH,
+ HWAS::DECONFIG,
+ HWAS::GARD_NULL );
+
+ // Or HB code didn't look for the record properly
+ err->addProcedureCallout(HWAS::EPUB_PRC_HB_CODE,
+ HWAS::SRCI_PRIORITY_LOW);
+
+ err->collectTrace( "VPD" );
+ }
+
+ TRACSSCOMP( g_trac_vpd,
+ EXIT_MRK"IpVpdFacade::findRecordOffsetSeeprom()" );
+
+ return err;
+}
+
// ------------------------------------------------------------------
// IpVpdFacade::retrieveKeyword
@@ -502,6 +696,7 @@ errlHndl_t IpVpdFacade::findRecordOffset ( const char * i_record,
errlHndl_t IpVpdFacade::retrieveKeyword ( const char * i_keywordName,
const char * i_recordName,
uint16_t i_offset,
+ uint16_t i_index,
TARGETING::Target * i_target,
void * io_buffer,
size_t & io_buflen,
@@ -520,6 +715,7 @@ errlHndl_t IpVpdFacade::retrieveKeyword ( const char * i_keywordName,
err = findKeywordAddr( i_keywordName,
i_recordName,
i_offset,
+ i_index,
i_target,
keywordSize,
byteAddr,
@@ -566,7 +762,6 @@ errlHndl_t IpVpdFacade::retrieveKeyword ( const char * i_keywordName,
return err;
}
-
// ------------------------------------------------------------------
// IpVpdFacade::fetchData
// ------------------------------------------------------------------
@@ -577,8 +772,52 @@ errlHndl_t IpVpdFacade::fetchData ( uint64_t i_byteAddr,
{
errlHndl_t err = NULL;
+ if ( iv_configInfo.vpdReadPNOR )
+ {
+ return fetchDataFromPnor( i_byteAddr, i_numBytes, o_data, i_target );
+ }
+ else if ( iv_configInfo.vpdReadHW )
+ {
+ return fetchDataFromEeprom( i_byteAddr, i_numBytes, o_data, i_target );
+ }
+ else
+ {
+ TRACFCOMP( g_trac_vpd,
+ ERR_MRK"IpVpdFacade::fetchData:vpdReadPNOR and vpdReadHW false!");
+
+ /*@
+ * @errortype
+ * @reasoncode VPD::VPD_READ_CONFIG_NOT_SET
+ * @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE
+ * @moduleid VPD::VPD_IPVPD_FETCH_DATA
+ * @userdata1 Target HUID
+ * @userdata2 <UNUSED>
+ * @devdesc Both VPD read PNOR and VPD read HW
+ * configs are set to false
+ */
+ err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE,
+ VPD::VPD_IPVPD_FETCH_DATA,
+ VPD::VPD_READ_CONFIG_NOT_SET,
+ TARGETING::get_huid(i_target),
+ 0x0,
+ true /*Add HB SW Callout*/ );
+ err->collectTrace( "VPD", 256 );
+ }
+ return NULL;
+}
+
+// ------------------------------------------------------------------
+// IpVpdFacade::fetchDataFromPnor
+// ------------------------------------------------------------------
+errlHndl_t IpVpdFacade::fetchDataFromPnor ( uint64_t i_byteAddr,
+ size_t i_numBytes,
+ void * o_data,
+ TARGETING::Target * i_target )
+{
+ errlHndl_t err = NULL;
+
TRACSSCOMP( g_trac_vpd,
- ENTER_MRK"IpVpdFacade::fetchData()" );
+ ENTER_MRK"IpVpdFacade::fetchDataFromPnor()" );
do
{
@@ -599,11 +838,45 @@ errlHndl_t IpVpdFacade::fetchData ( uint64_t i_byteAddr,
{
break;
}
+ } while( 0 );
+ TRACSSCOMP( g_trac_vpd,
+ EXIT_MRK"IpVpdFacade::fetchDataFromPnor()" );
+
+ return err;
+}
+
+// ------------------------------------------------------------------
+// IpVpdFacade::fetchDataFromEeprom
+// ------------------------------------------------------------------
+errlHndl_t IpVpdFacade::fetchDataFromEeprom ( uint64_t i_byteAddr,
+ size_t i_numBytes,
+ void * o_data,
+ TARGETING::Target * i_target )
+{
+ errlHndl_t err = NULL;
+
+ TRACSSCOMP( g_trac_vpd,
+ ENTER_MRK"IpVpdFacade::fetchDataFromEeprom()" );
+
+ do
+ {
+ // Need to read directly from target's EEPROM.
+ err = DeviceFW::deviceOp( DeviceFW::READ,
+ i_target,
+ o_data,
+ i_numBytes,
+ DEVICE_EEPROM_ADDRESS(
+ EEPROM::VPD_PRIMARY,
+ i_byteAddr ) );
+ if( err )
+ {
+ break;
+ }
} while( 0 );
TRACSSCOMP( g_trac_vpd,
- EXIT_MRK"IpVpdFacade::fetchData()" );
+ EXIT_MRK"IpVpdFacade::fetchDataFromEeprom()" );
return err;
}
@@ -614,6 +887,7 @@ errlHndl_t IpVpdFacade::fetchData ( uint64_t i_byteAddr,
errlHndl_t IpVpdFacade::findKeywordAddr ( const char * i_keywordName,
const char * i_recordName,
uint16_t i_offset,
+ uint16_t i_index,
TARGETING::Target * i_target,
size_t& o_keywordSize,
uint64_t& o_byteAddr,
@@ -625,7 +899,7 @@ errlHndl_t IpVpdFacade::findKeywordAddr ( const char * i_keywordName,
uint16_t keywordSize = 0x0;
char record[RECORD_BYTE_SIZE] = { '\0' };
char keyword[KEYWORD_BYTE_SIZE] = { '\0' };
- bool matchFound = false;
+ int matchesFound = 0;
TRACSSCOMP( g_trac_vpd,
ENTER_MRK"IpVpdFacade::findKeywordAddr()" );
@@ -776,8 +1050,10 @@ errlHndl_t IpVpdFacade::findKeywordAddr ( const char * i_keywordName,
o_byteAddr = offset - i_offset; //make address relative
// found our match, break out
- matchFound = true;
- break;
+ matchesFound++;
+ if ( matchesFound == i_index + 1 ) {
+ break;
+ }
}
else
{
@@ -787,14 +1063,14 @@ errlHndl_t IpVpdFacade::findKeywordAddr ( const char * i_keywordName,
}
if( err ||
- matchFound )
+ matchesFound == i_index + 1 )
{
break;
}
} while( 0 );
// If keyword not found in expected Record, flag error.
- if( !matchFound &&
+ if( matchesFound != i_index + 1 &&
NULL == err )
{
TRACFCOMP( g_trac_vpd,
@@ -807,7 +1083,8 @@ errlHndl_t IpVpdFacade::findKeywordAddr ( const char * i_keywordName,
* @reasoncode VPD::VPD_KEYWORD_NOT_FOUND
* @severity ERRORLOG::ERRL_SEV_UNRECOVERABLE
* @moduleid VPD::VPD_IPVPD_FIND_KEYWORD_ADDR
- * @userdata1 Start of Record Offset
+ * @userdata1[0:31] Start of Record Offset
+ * @userdata1[32:63] Keyword Index
* @userdata2[0:31] Requested Record
* @userdata2[32:63] Requested Keyword
* @devdesc Keyword was not found in Record starting at given
@@ -816,7 +1093,8 @@ errlHndl_t IpVpdFacade::findKeywordAddr ( const char * i_keywordName,
err = new ERRORLOG::ErrlEntry( ERRORLOG::ERRL_SEV_UNRECOVERABLE,
VPD::VPD_IPVPD_FIND_KEYWORD_ADDR,
VPD::VPD_KEYWORD_NOT_FOUND,
- i_offset,
+ TWO_UINT32_TO_UINT64( i_offset,
+ i_index ),
TWO_UINT32_TO_UINT64( i_args.record,
i_args.keyword ) );
@@ -873,6 +1151,7 @@ errlHndl_t IpVpdFacade::writeKeyword ( const char * i_keywordName,
err = findKeywordAddr( i_keywordName,
i_recordName,
i_offset,
+ 0,
i_target,
keywordSize,
byteAddr,
@@ -890,48 +1169,58 @@ errlHndl_t IpVpdFacade::writeKeyword ( const char * i_keywordName,
{
break;
}
-
- // Setup info needed to write from PNOR
- VPD::pnorInformation info;
- info.segmentSize = iv_vpdSectionSize;
- info.maxSegments = iv_vpdMaxSections;
- info.pnorSection = iv_pnorSection;
- err = VPD::writePNOR( i_offset+byteAddr,
- keywordSize,
- i_buffer,
- i_target,
- info,
- iv_cachePnorAddr,
- &iv_mutex );
- if( err )
+ if ( iv_configInfo.vpdWriteHW )
{
- break;
+ // @todo RTC 106884 - Need to handle vpd write to HW
}
+ if ( iv_configInfo.vpdWritePNOR )
+ {
+ // Setup info needed to write from PNOR
+ VPD::pnorInformation info;
+ info.segmentSize = iv_vpdSectionSize;
+ info.maxSegments = iv_vpdMaxSections;
+ info.pnorSection = iv_pnorSection;
+ err = VPD::writePNOR( i_offset+byteAddr,
+ keywordSize,
+ i_buffer,
+ i_target,
+ info,
+ iv_cachePnorAddr,
+ &iv_mutex );
+ if( err )
+ {
+ break;
+ }
+ VPD::VpdWriteMsg_t msgdata;
- VPD::VpdWriteMsg_t msgdata;
-
- // Quick double-check that our constants agree with the values in the
- // VPD message structure
- assert( sizeof(msgdata.record) == RECORD_BYTE_SIZE );
- assert( sizeof(msgdata.keyword) == KEYWORD_BYTE_SIZE );
+ // Quick double-check that our constants agree with the values
+ // in the VPD message structure
+ assert( sizeof(msgdata.record) == RECORD_BYTE_SIZE );
+ assert( sizeof(msgdata.keyword) == KEYWORD_BYTE_SIZE );
- // Finally, send it down to the FSP
- msgdata.rec_num = i_target->getAttr<TARGETING::ATTR_VPD_REC_NUM>();
- memcpy( msgdata.record, i_recordName, RECORD_BYTE_SIZE );
- memcpy( msgdata.keyword, i_keywordName, KEYWORD_BYTE_SIZE );
- err = VPD::sendMboxWriteMsg( keywordSize,
- i_buffer,
- i_target,
- iv_vpdMsgType,
- msgdata );
+ // Finally, send it down to the FSP
+ msgdata.rec_num = i_target->getAttr<TARGETING::ATTR_VPD_REC_NUM>();
+ memcpy( msgdata.record, i_recordName, RECORD_BYTE_SIZE );
+ memcpy( msgdata.keyword, i_keywordName, KEYWORD_BYTE_SIZE );
+ err = VPD::sendMboxWriteMsg( keywordSize,
+ i_buffer,
+ i_target,
+ iv_vpdMsgType,
+ msgdata );
- if( err )
+ if( err )
+ {
+ break;
+ }
+ }
+ else
{
+ // No PNOR, just eat the write attempt.
+ TRACFCOMP(g_trac_vpd, "VPD record %s:%s - write ignored",
+ i_keywordName, i_recordName);
break;
}
-
-
} while(0);
TRACSSCOMP( g_trac_vpd,
diff --git a/src/usr/vpd/ipvpd.H b/src/usr/vpd/ipvpd.H
index 46d6584b2..95f110ef0 100644
--- a/src/usr/vpd/ipvpd.H
+++ b/src/usr/vpd/ipvpd.H
@@ -5,7 +5,10 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* COPYRIGHT International Business Machines Corp. 2013,2014 */
+/* Contributors Listed Below - COPYRIGHT 2013,2014 */
+/* [+] Google Inc. */
+/* [+] International Business Machines Corp. */
+/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
@@ -50,9 +53,25 @@ class IpVpdFacade
KEYWORD_SIZE_BYTE_SIZE = 1,
RECORD_TOC_UNUSED = 2,
RT_SKIP_BYTES = 3,
+ VHDR_ECC_DATA_SIZE = 11,
+ VHDR_RESOURCE_ID_SIZE = 1,
};
/**
+ * @brief Structure representing the format of each record
+ * in the PT keyword of the VTOC or VHDR.
+ */
+ struct TocPtRecord {
+ char record_name[4];
+ // All uint16 fields are stored in little endian.
+ uint16_t record_type;
+ uint16_t record_offset;
+ uint16_t record_length;
+ uint16_t ecc_offset;
+ uint16_t ecc_length;
+ } PACKED;
+
+ /**
* @brief typdef for ipVpdRecord values
*/
typedef uint32_t ipVpdRecord;
@@ -88,6 +107,16 @@ class IpVpdFacade
char keywordName[KEYWORD_BYTE_SIZE+1];
} keywordInfo;
+ /**
+ * @brief Structure defining where to read/write VPD data
+ */
+ typedef struct
+ {
+ bool vpdReadPNOR;
+ bool vpdReadHW;
+ bool vpdWritePNOR;
+ bool vpdWriteHW;
+ } configInfo;
/**
* @brief Constructor
@@ -213,8 +242,8 @@ class IpVpdFacade
const char *& o_keyword );
/**
- * @brief This function will read the VPD TOC to find the offset where the
- * given record is located within the chunk of data.
+ * @brief This function calls the PNOR or EEPROM version of
+ * the findRecordOffset fuction based on the configInfo.
*
* @param[in] i_record - String value for the record to look for.
*
@@ -233,6 +262,46 @@ class IpVpdFacade
input_args_t i_args );
/**
+ * @brief This function will read the VPD TOC to find the offset where the
+ * given record is located within the chunk of data.
+ *
+ * @param[in] i_record - String value for the record to look for.
+ *
+ * @param[out] o_offset - The offset where the record is located.
+ *
+ * @param[in] i_target - The target to retrieve the data for.
+ *
+ * @param[in] i_args - The input arguments.
+ *
+ * @return errHndl_t - NULL if successful, otherwise a pointer to the
+ * error log.
+ */
+ errlHndl_t findRecordOffsetPnor ( const char * i_record,
+ uint16_t & o_offset,
+ TARGETING::Target * i_target,
+ input_args_t i_args );
+
+ /**
+ * @brief This function will read the VPD VTOC to find the offset where the
+ * given record is located within the chunk of data.
+ *
+ * @param[in] i_record - String value for the record to look for.
+ *
+ * @param[out] o_offset - The offset where the record is located.
+ *
+ * @param[in] i_target - The target to retrieve the data for.
+ *
+ * @param[in] i_args - The input arguments.
+ *
+ * @return errHndl_t - NULL if successful, otherwise a pointer to the
+ * error log.
+ */
+ errlHndl_t findRecordOffsetSeeprom ( const char * i_record,
+ uint16_t & o_offset,
+ TARGETING::Target * i_target,
+ input_args_t i_args );
+
+ /**
* @brief This function will read the required keyword from the VPD data.
*
* @param[in] i_keywordName - String representation of the keyword.
@@ -241,6 +310,9 @@ class IpVpdFacade
*
* @param[in] i_offset - The offset to start reading.
*
+ * @param[in] i_index - The index of the keyword to return if there are
+ * multiple instances of the same keyword.
+ *
* @param[in] i_target - The target to retrieve data for.
*
* @param[out] io_buffer - The buffer to place the data in.
@@ -259,6 +331,7 @@ class IpVpdFacade
errlHndl_t retrieveKeyword ( const char * i_keywordName,
const char * i_recordName,
uint16_t i_offset,
+ uint16_t i_index,
TARGETING::Target * i_target,
void * io_buffer,
size_t & io_buflen,
@@ -302,7 +375,10 @@ class IpVpdFacade
*
* @param[in] i_recordName - String representation of the record.
*
- * @param[in] i_offset - The offset to start writing.
+ * @param[in] i_offset - The offset to start searching.
+ *
+ * @param[in] i_index - The index of the keyword to return if there are
+ * multiple instances of the same keyword.
*
* @param[in] i_target - The target to write data for.
*
@@ -319,13 +395,15 @@ class IpVpdFacade
errlHndl_t findKeywordAddr ( const char * i_keywordName,
const char * i_recordName,
uint16_t i_offset,
+ uint16_t i_index,
TARGETING::Target * i_target,
size_t& o_keywordSize,
uint64_t& o_byteAddr,
input_args_t i_args );
+
/**
- * @brief This function actually reads the data from the source of the VPD
- * data.
+ * @brief This function calls the PNOR or EEPROM version of
+ * the fetchData function based on the configInfo
*
* @param[in] i_byteAddr - The offset to be read.
*
@@ -343,6 +421,44 @@ class IpVpdFacade
void * o_data,
TARGETING::Target * i_target );
+ /**
+ * @brief This function actually reads the data from PNOR
+ *
+ * @param[in] i_byteAddr - The offset to be read.
+ *
+ * @param[in] i_numBytes - The number of bytes to read.
+ *
+ * @param[out] o_data - The data buffer where the data will be placed.
+ *
+ * @param[in] i_target - Target device.
+ *
+ * @return errHndl_t - NULL if successful, otherwise a pointer to the
+ * error log.
+ */
+ errlHndl_t fetchDataFromPnor ( uint64_t i_byteAddr,
+ size_t i_numBytes,
+ void * o_data,
+ TARGETING::Target * i_target );
+
+ /**
+ * @brief This function actually reads the data from EEPROM
+ *
+ * @param[in] i_byteAddr - The offset to be read.
+ *
+ * @param[in] i_numBytes - The number of bytes to read.
+ *
+ * @param[out] o_data - The data buffer where the data will be placed.
+ *
+ * @param[in] i_target - Target device.
+ *
+ * @return errHndl_t - NULL if successful, otherwise a pointer to the
+ * error log.
+ */
+ errlHndl_t fetchDataFromEeprom ( uint64_t i_byteAddr,
+ size_t i_numBytes,
+ void * o_data,
+ TARGETING::Target * i_target );
+
/**
* @brief This function compares 2 ipvpd record values. Used for binary
@@ -443,13 +559,19 @@ class IpVpdFacade
* @brief cached PNOR offset for VPD
*
*/
- uint64_t iv_cachePnorAddr;
+ uint64_t iv_cachePnorAddr;
- /**
- * @brief cached PNOR offset for VPD
- *
- */
- VPD::VPD_MSG_TYPE iv_vpdMsgType;
+ /**
+ * @brief cached PNOR offset for VPD
+ *
+ */
+ VPD::VPD_MSG_TYPE iv_vpdMsgType;
+
+ /**
+ * @brief Config defining where to read/write
+ * VPD data
+ */
+ configInfo iv_configInfo;
};
diff --git a/src/usr/vpd/mvpd.C b/src/usr/vpd/mvpd.C
index 169feefdf..b9d411298 100644
--- a/src/usr/vpd/mvpd.C
+++ b/src/usr/vpd/mvpd.C
@@ -5,7 +5,10 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* COPYRIGHT International Business Machines Corp. 2013,2014 */
+/* Contributors Listed Below - COPYRIGHT 2013,2014 */
+/* [+] Google Inc. */
+/* [+] International Business Machines Corp. */
+/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
@@ -33,6 +36,7 @@
#include <vfs/vfs.H>
#include <vpd/vpdreasoncodes.H>
#include <vpd/mvpdenums.H>
+#include <config.h>
#include "mvpd.H"
#include "ipvpd.H"
@@ -193,4 +197,25 @@ IpVpdFacade(MVPD::SECTION_SIZE,
VPD::VPD_WRITE_PROC)
{
TRACUCOMP(g_trac_vpd, "MvpdFacade::MvpdFacade> " );
+
+#ifdef CONFIG_MVPD_READ_FROM_PNOR
+ iv_configInfo.vpdReadPNOR = true;
+#else
+ iv_configInfo.vpdReadPNOR = false;
+#endif
+#ifdef CONFIG_MVPD_READ_FROM_HW
+ iv_configInfo.vpdReadHW = true;
+#else
+ iv_configInfo.vpdReadHW = false;
+#endif
+#ifdef CONFIG_MVPD_WRITE_TO_PNOR
+ iv_configInfo.vpdWritePNOR = true;
+#else
+ iv_configInfo.vpdWritePNOR = false;
+#endif
+#ifdef CONFIG_MVPD_WRITE_TO_HW
+ iv_configInfo.vpdWriteHW = true;
+#else
+ iv_configInfo.vpdWriteHW = false;
+#endif
}
diff --git a/src/usr/vpd/spd.C b/src/usr/vpd/spd.C
index 15e53e9fa..4480b507c 100755
--- a/src/usr/vpd/spd.C
+++ b/src/usr/vpd/spd.C
@@ -5,7 +5,10 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* COPYRIGHT International Business Machines Corp. 2012,2014 */
+/* Contributors Listed Below - COPYRIGHT 2013,2014 */
+/* [+] Google Inc. */
+/* [+] International Business Machines Corp. */
+/* */
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); */
/* you may not use this file except in compliance with the License. */
@@ -36,6 +39,8 @@
#include <errl/errludtarget.H>
#include <targeting/common/targetservice.H>
#include <devicefw/driverif.H>
+#include <devicefw/userif.H>
+#include <i2c/eepromif.H>
#include <vfs/vfs.H>
#include <pnor/pnorif.H>
#include <vpd/vpdreasoncodes.H>
@@ -45,6 +50,7 @@
#include "spdDDR3.H"
#include "spdDDR4.H"
#include "errlud_vpd.H"
+#include <config.h>
// ----------------------------------------------
// Trace definitions
@@ -389,6 +395,16 @@ errlHndl_t spdFetchData ( uint64_t i_byteAddr,
{
if( likely( g_usePNOR ) )
{
+#ifdef CONFIG_DJVPD_READ_FROM_HW
+ // Need to read directly from target's EEPROM.
+ err = DeviceFW::deviceOp( DeviceFW::READ,
+ i_target,
+ o_data,
+ i_numBytes,
+ DEVICE_EEPROM_ADDRESS(
+ EEPROM::VPD_PRIMARY,
+ i_byteAddr ) );
+#elif CONFIG_DJVPD_READ_FROM_PNOR
// Setup info needed to read from PNOR
VPD::pnorInformation info;
info.segmentSize = DIMM_SPD_SECTION_SIZE;
@@ -401,7 +417,7 @@ errlHndl_t spdFetchData ( uint64_t i_byteAddr,
info,
g_spdPnorAddr,
&g_spdMutex );
-
+#endif // CONFIG_DJVPD_READ_FROM_PNOR
if( err )
{
break;
OpenPOWER on IntegriCloud