diff options
author | Corey Swenson <cswenson@us.ibm.com> | 2014-06-18 16:09:55 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2014-07-01 13:34:57 -0500 |
commit | 2cc1c594ad2b05919d1742625de0da83ffd7f01d (patch) | |
tree | 57bbbe923325245e809ea51a96c60ffe79b18600 | |
parent | 3bcf5b7982bb8a2d9227dbff7be4ff2ce5fec05c (diff) | |
download | blackbird-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.H | 429 | ||||
-rw-r--r-- | src/include/usr/isteps/istep12list.H | 5 | ||||
-rw-r--r-- | src/include/usr/vpd/vpdreasoncodes.H | 9 | ||||
-rw-r--r-- | src/usr/diag/prdf/common/plat/pegasus/prdfLaneRepair.C | 12 | ||||
-rw-r--r-- | src/usr/fsi/fsipres.C | 150 | ||||
-rw-r--r-- | src/usr/hwas/common/hwas.C | 3 | ||||
-rw-r--r-- | src/usr/hwas/hwasPlat.C | 17 | ||||
-rw-r--r-- | src/usr/hwpf/hwp/mc_config/mc_config.C | 113 | ||||
-rw-r--r-- | src/usr/hwpf/plat/HBconfig | 4 | ||||
-rw-r--r-- | src/usr/targeting/common/xmltohb/target_types.xml | 6 | ||||
-rw-r--r-- | src/usr/vpd/HBconfig | 77 | ||||
-rw-r--r-- | src/usr/vpd/cvpd.C | 26 | ||||
-rwxr-xr-x | src/usr/vpd/dimmPres.C | 24 | ||||
-rw-r--r-- | src/usr/vpd/ipvpd.C | 377 | ||||
-rw-r--r-- | src/usr/vpd/ipvpd.H | 146 | ||||
-rw-r--r-- | src/usr/vpd/mvpd.C | 27 | ||||
-rwxr-xr-x | src/usr/vpd/spd.C | 20 |
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; |