summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorCaleb Palmer <cnpalmer@us.ibm.com>2017-06-12 10:24:58 -0500
committerDaniel M. Crowell <dcrowell@us.ibm.com>2017-08-28 14:56:52 -0400
commitbf7a405a6f888ec9b5e7e125b57178e1234f4bb8 (patch)
tree2b3a102f01f7a9fabea98e1efe6214825738dec6 /src
parentd520480e52251b3b025bd4697c0af312c6ca21a2 (diff)
downloadtalos-hostboot-bf7a405a6f888ec9b5e7e125b57178e1234f4bb8.tar.gz
talos-hostboot-bf7a405a6f888ec9b5e7e125b57178e1234f4bb8.zip
Functions for BAD_DQ_BITMAP attribute usage
Change-Id: I216c10a4224fde3936e287b0aa1032bc1f506054 RTC: 173478 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/41746 Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src')
-rw-r--r--src/include/usr/fapi2/dimmBadDqBitmapFuncs.H85
-rw-r--r--src/usr/fapi2/dimmBadDqBitmapFuncs.C218
-rwxr-xr-xsrc/usr/fapi2/fapi2.mk1
3 files changed, 304 insertions, 0 deletions
diff --git a/src/include/usr/fapi2/dimmBadDqBitmapFuncs.H b/src/include/usr/fapi2/dimmBadDqBitmapFuncs.H
new file mode 100644
index 000000000..0cc564b68
--- /dev/null
+++ b/src/include/usr/fapi2/dimmBadDqBitmapFuncs.H
@@ -0,0 +1,85 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/include/usr/fapi2/dimmBadDqBitmapFuncs.H $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2017 */
+/* [+] 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. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+#ifndef DIMMBADDQBITMAPFUNCS_H_
+#define DIMMBADDQBITMAPFUNCS_H_
+
+#include <fapi2.H>
+#include <../memory/lib/shared/mss_const.H>
+
+extern "C"
+{
+
+/**
+ * @brief FW Team Utility function that gets the Bad DQ Bitmap.
+ *
+ * This utility functon should be called by a HWP needing to get the Bad DQ
+ * bitmap for a particular mca/mba, port, dimm and rank.
+ *
+ * This function finds the corresponding DIMM Target, calls
+ * dimmBadDqBitmapAccessHwp to get the DQ bitmap and returns the data
+ * for the specified rank.
+ *
+ * @param[in] i_fapiTrgt Reference to MCA/MBA Target
+ * @param[in] i_dimm MCA/MBA port DIMM number
+ * @param[in] i_rank DIMM rank number
+ * @param[out] o_data Reference to data where Bad DQ bitmap is copied to
+ * @param[in] i_port Optional port for MBA targets. Default is port 0.
+ *
+ * @return ReturnCode
+ */
+fapi2::ReturnCode dimmGetBadDqBitmap( const fapi2::Target
+ <fapi2::TARGET_TYPE_MCA|fapi2::TARGET_TYPE_MBA> & i_fapiTrgt,
+ const uint8_t i_dimm,
+ const uint8_t i_rank,
+ uint8_t (&o_data)[mss::BAD_DQ_BYTE_COUNT],
+ const uint8_t i_port = 0 );
+
+/**
+ * @brief FW Team Utility function that sets the Bad DQ Bitmap.
+ *
+ * This utility functon should be called by a HWP needing to set the Bad DQ
+ * bitmap for a particular mca/mba, port, dimm and rank.
+ *
+ * This utility function finds the corresponding DIMM Target, calls
+ * dimmBadDqBitmapAccessHwp to get the DQ bitmap, fills in the data for the
+ * specified rank and calls dimmBadDqBitmapAccessHwp to set the DQ bitmap
+ *
+ * @param[in] i_fapiTrgt Reference to MCA/MBA Chiplet
+ * @param[in] i_dimm MCA/MBA port DIMM number
+ * @param[in] i_rank DIMM rank number
+ * @param[in] i_data Reference to data where Bad DQ bitmap is copied from
+ * @param[in] i_port Optional port for MBA targets. Default is port 0.
+ *
+ * @return ReturnCode
+ */
+fapi2::ReturnCode dimmSetBadDqBitmap( const fapi2::Target
+ <fapi2::TARGET_TYPE_MCA|fapi2::TARGET_TYPE_MBA> & i_fapiTrgt,
+ const uint8_t i_dimm,
+ const uint8_t i_rank,
+ const uint8_t (&i_data)[mss::BAD_DQ_BYTE_COUNT],
+ const uint8_t i_port = 0 );
+}
+
+#endif
diff --git a/src/usr/fapi2/dimmBadDqBitmapFuncs.C b/src/usr/fapi2/dimmBadDqBitmapFuncs.C
new file mode 100644
index 000000000..fb74a14ae
--- /dev/null
+++ b/src/usr/fapi2/dimmBadDqBitmapFuncs.C
@@ -0,0 +1,218 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/fapi2/dimmBadDqBitmapFuncs.C $ */
+/* */
+/* OpenPOWER HostBoot Project */
+/* */
+/* Contributors Listed Below - COPYRIGHT 2017 */
+/* [+] 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. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+#include <dimmBadDqBitmapFuncs.H>
+#include <string.h>
+#include <attribute_service.H>
+#include <target.H>
+#include <errl/errlmanager.H>
+
+using namespace TARGETING;
+
+extern "C"
+{
+
+
+//------------------------------------------------------------------------------
+// Utility function to check parameters and get the Bad DQ bitmap
+//------------------------------------------------------------------------------
+fapi2::ReturnCode dimmBadDqCheckParamGetBitmap( const fapi2::Target
+ <fapi2::TARGET_TYPE_MCA|fapi2::TARGET_TYPE_MBA> & i_fapiTrgt,
+ const uint8_t i_port,
+ const uint8_t i_dimm,
+ const uint8_t i_rank,
+ TARGETING::TargetHandle_t & o_dimmTrgt,
+ uint8_t (&o_dqBitmap)[mss::MAX_RANK_PER_DIMM][mss::BAD_DQ_BYTE_COUNT])
+{
+ fapi2::ReturnCode l_rc;
+
+ do
+ {
+ // Check parameters.
+ if ( (i_dimm >= mss::MAX_DIMM_PER_PORT) ||
+ (i_rank >= mss::MAX_RANK_PER_DIMM) )
+ {
+ FAPI_ERR( "dimmBadDqCheckParamGetBitmap: Bad parameter. "
+ "i_dimm:%d i_rank:%d", i_dimm, i_rank );
+ l_rc = fapi2::FAPI2_RC_INVALID_ATTR_GET;
+ break;
+ }
+
+ errlHndl_t l_errl = nullptr;
+ TARGETING::TargetHandle_t l_trgt = nullptr;
+
+ l_errl = fapi2::platAttrSvc::getTargetingTarget(i_fapiTrgt, l_trgt);
+ if ( l_errl )
+ {
+ FAPI_ERR( "dimmBadDqCheckParamGetBitmap: Error from "
+ "getTargetingTarget" );
+ errlCommit( l_errl, FAPI2_COMP_ID );
+ l_rc.setPlatDataPtr(reinterpret_cast<void *> (l_errl));
+ break;
+ }
+
+ // Get the DIMM
+ TargetHandleList l_dimmList;
+
+ if ( fapi2::TARGET_TYPE_MBA == i_fapiTrgt.getType() )
+ {
+ // Get all functional DIMMs
+ getChildAffinityTargets( l_dimmList, l_trgt, CLASS_NA, TYPE_DIMM );
+
+ // Find the DIMM with the correct MBA port/dimm
+ uint8_t l_port = 0;
+ uint8_t l_dimm = 0;
+
+ for ( auto &dimmTrgt : l_dimmList )
+ {
+ // Get and compare the port
+ l_port = dimmTrgt->getAttr<ATTR_MBA_PORT>();
+
+ if ( l_port == i_port )
+ {
+ // Get and compare the dimm
+ l_dimm = dimmTrgt->getAttr<ATTR_MBA_DIMM>();
+
+ if ( l_dimm == i_dimm )
+ {
+ o_dimmTrgt = dimmTrgt;
+ // Port and dimm are correct, get the Bad DQ bitmap
+ l_rc = FAPI_ATTR_GET( fapi2::ATTR_BAD_DQ_BITMAP,
+ dimmTrgt, o_dqBitmap );
+ if ( l_rc ) break;
+ }
+ }
+ }
+ }
+ else
+ {
+ // Get all connected DIMMs, even nonfunctioning ones.
+ getChildAffinityTargets( l_dimmList, l_trgt, CLASS_NA, TYPE_DIMM,
+ false );
+ o_dimmTrgt = l_dimmList[i_dimm];
+
+ // Get the Bad DQ bitmap by querying ATTR_BAD_DQ_BITMAP.
+ l_rc = FAPI_ATTR_GET( fapi2::ATTR_BAD_DQ_BITMAP, o_dimmTrgt,
+ o_dqBitmap );
+ }
+
+ if ( l_rc )
+ {
+ FAPI_ERR( "dimmBadDqCheckParamGetBitmap: Error getting "
+ "ATTR_BAD_DQ_BITMAP." );
+ }
+
+ }while(0);
+
+ return l_rc;
+}
+
+//------------------------------------------------------------------------------
+fapi2::ReturnCode dimmGetBadDqBitmap( const fapi2::Target
+ <fapi2::TARGET_TYPE_MCA|fapi2::TARGET_TYPE_MBA> & i_fapiTrgt,
+ const uint8_t i_dimm,
+ const uint8_t i_rank,
+ uint8_t (&o_data)[mss::BAD_DQ_BYTE_COUNT],
+ const uint8_t i_port )
+{
+ FAPI_INF( ">>dimmGetBadDqBitmap. %d:%d", i_dimm, i_rank );
+
+ fapi2::ReturnCode l_rc;
+
+ do
+ {
+ uint8_t l_dqBitmap[mss::MAX_RANK_PER_DIMM][mss::BAD_DQ_BYTE_COUNT];
+ TARGETING::TargetHandle_t l_dimmTrgt = nullptr;
+
+ // Check parameters and get Bad Dq Bitmap
+ l_rc = dimmBadDqCheckParamGetBitmap( i_fapiTrgt, i_port, i_dimm, i_rank,
+ l_dimmTrgt, l_dqBitmap );
+ if ( l_rc )
+ {
+ FAPI_ERR( "dimmGetBadDqBitmap: Error from "
+ "dimmBadDqCheckParamGetBitmap." );
+ break;
+ }
+ // Write contents of DQ bitmap for specific rank to o_data.
+ memcpy( o_data, l_dqBitmap[i_rank], mss::BAD_DQ_BYTE_COUNT );
+ }while(0);
+
+ FAPI_INF( "<<dimmGetBadDqBitmap" );
+
+ return l_rc;
+}
+
+//------------------------------------------------------------------------------
+fapi2::ReturnCode dimmSetBadDqBitmap( const fapi2::Target
+ <fapi2::TARGET_TYPE_MCA|fapi2::TARGET_TYPE_MBA> & i_fapiTrgt,
+ const uint8_t i_dimm,
+ const uint8_t i_rank,
+ const uint8_t (&i_data)[mss::BAD_DQ_BYTE_COUNT],
+ const uint8_t i_port )
+{
+ FAPI_INF( ">>dimmSetBadDqBitmap. %d:%d", i_dimm, i_rank );
+
+ fapi2::ReturnCode l_rc;
+
+ do
+ {
+ // Get the Bad DQ Bitmap by querying ATTR_BAD_DQ_BITMAP.
+ uint8_t l_dqBitmap[mss::MAX_RANK_PER_DIMM][mss::BAD_DQ_BYTE_COUNT];
+ TARGETING::TargetHandle_t l_dimmTrgt = nullptr;
+
+ // Check parameters and get Bad Dq Bitmap
+ l_rc = dimmBadDqCheckParamGetBitmap( i_fapiTrgt, i_port, i_dimm, i_rank,
+ l_dimmTrgt, l_dqBitmap );
+ if ( l_rc )
+ {
+ FAPI_ERR( "dimmSetBadDqBitmap: Error getting ATTR_BAD_DQ_BITMAP." );
+ break;
+ }
+ // Add the rank bitmap to the DIMM bitmap and write the bitmap.
+ memcpy( l_dqBitmap[i_rank], i_data, mss::BAD_DQ_BYTE_COUNT );
+
+ errlHndl_t l_errl = nullptr;
+ TARGETING::TargetHandle_t l_trgt = nullptr;
+ l_errl = fapi2::platAttrSvc::getTargetingTarget(i_fapiTrgt, l_trgt);
+ if ( l_errl )
+ {
+ FAPI_ERR( "dimmSetBadDqBitmap: Error from getTargetingTarget" );
+ break;
+ }
+
+ l_rc = FAPI_ATTR_SET( fapi2::ATTR_BAD_DQ_BITMAP, l_dimmTrgt,
+ l_dqBitmap );
+
+ if ( l_rc )
+ {
+ FAPI_ERR( "dimmSetBadDqBitmap: Error setting ATTR_BAD_DQ_BITMAP." );
+ }
+ }while(0);
+
+ FAPI_INF( "<<dimmSetBadDqBitmap" );
+
+ return l_rc;
+}
+
+} // extern "C"
diff --git a/src/usr/fapi2/fapi2.mk b/src/usr/fapi2/fapi2.mk
index 963bd4a30..ee1cdc162 100755
--- a/src/usr/fapi2/fapi2.mk
+++ b/src/usr/fapi2/fapi2.mk
@@ -69,6 +69,7 @@ OBJS += plat_mvpd_access.o
OBJS += plat_mbvpd_access.o
OBJS += plat_vpd_access.o
OBJS += plat_wof_access.o
+OBJS += dimmBadDqBitmapFuncs.o
#Required include before all the procedure.mk are included
OpenPOWER on IntegriCloud