summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/hwp
diff options
context:
space:
mode:
authorMark Wenning <wenning@us.ibm.com>2013-02-12 20:29:41 -0600
committerA. Patrick Williams III <iawillia@us.ibm.com>2013-02-26 14:44:28 -0600
commit152220a65b946e489587ead8731b793066b54d38 (patch)
treeacd34a8562a570cbdb06af7a6ba061f9cfc093f8 /src/usr/hwpf/hwp
parent8fa257a4a2bdd2be776c561ae7498433eedca53d (diff)
downloadtalos-hostboot-152220a65b946e489587ead8731b793066b54d38.tar.gz
talos-hostboot-152220a65b946e489587ead8731b793066b54d38.zip
io_read_erepair
Change-Id: I50feb3969df59079bb05b8b091153f365dc9bfd8 RTC: 63038 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/3193 Tested-by: Jenkins Server Reviewed-by: Brian H. Horton <brianh@linux.ibm.com> Reviewed-by: Bilicon Patil <bilpatil@in.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/usr/hwpf/hwp')
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_read_erepair.C156
-rw-r--r--src/usr/hwpf/hwp/bus_training/io_read_erepair.H54
-rw-r--r--src/usr/hwpf/hwp/bus_training/makefile1
3 files changed, 211 insertions, 0 deletions
diff --git a/src/usr/hwpf/hwp/bus_training/io_read_erepair.C b/src/usr/hwpf/hwp/bus_training/io_read_erepair.C
new file mode 100644
index 000000000..3d3707902
--- /dev/null
+++ b/src/usr/hwpf/hwp/bus_training/io_read_erepair.C
@@ -0,0 +1,156 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/hwpf/hwp/io_read_erepair/io_read_erepair.C $ */
+/* */
+/* IBM CONFIDENTIAL */
+/* */
+/* COPYRIGHT International Business Machines Corp. 2013 */
+/* */
+/* p1 */
+/* */
+/* Object Code Only (OCO) source materials */
+/* Licensed Internal Code Source Materials */
+/* IBM HostBoot Licensed Internal Code */
+/* */
+/* The source code for this program is not published or otherwise */
+/* divested of its trade secrets, irrespective of what has been */
+/* deposited with the U.S. Copyright Office. */
+/* */
+/* Origin: 30 */
+/* */
+/* IBM_PROLOG_END_TAG */
+// $Id: io_read_erepair.C,v 1.5 2013/02/05 06:06:06 varkeykv Exp $
+// *!***************************************************************************
+// *! (C) Copyright International Business Machines Corp. 1997, 1998
+// *! All Rights Reserved -- Property of IBM
+// *! *** IBM Confidential ***
+// *!***************************************************************************
+// *! FILENAME : io_read_erepair.C
+// *! TITLE :
+// *! DESCRIPTION : Read e-repair data
+// *! CONTEXT :
+// *!
+// *! OWNER NAME : Varghese, Varkey Email: varkey.kv@in.ibm.com
+// *! BACKUP NAME : Swaminathan, Janani Email: jaswamin@in.ibm.com
+// *!
+// *!***************************************************************************
+// CHANGE HISTORY:
+//------------------------------------------------------------------------------
+// Version:|Author: | Date: | Comment:
+// --------|--------|---------|--------------------------------------------------
+// 1.0 |varkeykv|21-Jan-13|Initial check in
+//------------------------------------------------------------------------------
+
+#include <fapi.H>
+#include "io_read_erepair.H"
+#include "gcr_funcs.H"
+
+extern "C" {
+
+
+using namespace fapi;
+
+
+//! Read repair values from VPD into the HW
+/*
+ This function will perform erepair for one IO type target -- eithe MCS or XBUS or ABUS
+* Tx and Rx lanes vector is filled in by the HWP with bad lane numbers
+*/
+ReturnCode io_read_erepair(const Target& target,std::vector<uint8_t> &rx_lanes)
+{
+ ReturnCode rc;
+ ecmdDataBufferBase data_one(16);
+ ecmdDataBufferBase data_two(16);
+ ecmdDataBufferBase mask(16);
+ uint8_t lane;
+
+ io_interface_t interface=CP_IOMC0_P0; // Since G
+ uint32_t rc_ecmd=0;
+ uint8_t start_group=0;
+ uint8_t end_group=0;
+
+ rc_ecmd=mask.flushTo1();
+ if(rc_ecmd)
+ {
+ rc.setEcmdError(rc_ecmd);
+ return(rc);
+ }
+
+ // Check which type of bus this is and do setup needed
+ if(target.getType() == fapi::TARGET_TYPE_ABUS_ENDPOINT) {
+ start_group=0;
+ end_group=0;
+ interface=CP_FABRIC_A0; // base scom for A bus , assume translation to A1 by PLAT
+ }
+ else if(target.getType() == fapi::TARGET_TYPE_XBUS_ENDPOINT ) {
+ start_group=0;
+ end_group=3;
+ interface=CP_FABRIC_X0; // base scom for X bus
+ }
+ else if(target.getType() == fapi::TARGET_TYPE_MCS_CHIPLET){
+ start_group=3;
+ end_group=3;
+ interface=CP_IOMC0_P0; // base scom for MC bus
+ }
+ else if(target.getType() == fapi::TARGET_TYPE_MEMBUF_CHIP){
+ start_group=0;
+ end_group=0;
+ interface=CEN_DMI; // base scom Centaur chip
+ }
+ else{
+ FAPI_ERR("Invalid io_read_erepair HWP invocation");
+ FAPI_SET_HWP_ERROR(rc, IO_RUN_TRAINING_INVALID_INVOCATION_RC);
+ return(rc);
+ }
+
+ FAPI_INF("Reading erepair data \n");
+
+ for(uint8_t clock_group=start_group;clock_group<=end_group;++clock_group){
+ // This is only for X bus ..where multi groups are translated to consecutive lane numbers
+ if(clock_group==0){
+ lane=0;
+ }
+ else if(clock_group==1){
+ lane=20;
+ }
+ else if(clock_group==2){
+ lane=40;
+ }
+ else if(clock_group==3){
+ lane=60;
+ }
+
+ //Collect the RX bad lanes
+ rc_ecmd|=data_one.flushTo0();
+ rc_ecmd|=data_two.flushTo0();
+
+ if(rc_ecmd)
+ {
+ rc.setEcmdError(rc_ecmd);
+ return(rc);
+ }
+
+ rc = GCR_read( target, interface, rx_lane_bad_vec_0_15_pg, clock_group, 0, data_one);
+ if(rc){return rc;}
+ rc = GCR_read( target, interface, rx_lane_bad_vec_16_31_pg, clock_group, 0, data_two);
+ if(rc){return rc;}
+
+ // RX lane records
+ // Set the RX bad lanes in the RX vector
+
+ for(uint8_t i=0;i<16;++i){
+ if (data_one.isBitSet(i)) {
+ rx_lanes.push_back(lane+i); // 0 to 15 bad lanes
+ }
+ if(data_two.isBitSet(i)){
+ rx_lanes.push_back(lane+i+16); // 16 to 31 bad lanes
+ }
+ }
+
+ }
+ return rc;
+}
+
+} //end extern C
+
diff --git a/src/usr/hwpf/hwp/bus_training/io_read_erepair.H b/src/usr/hwpf/hwp/bus_training/io_read_erepair.H
new file mode 100644
index 000000000..af45b9e13
--- /dev/null
+++ b/src/usr/hwpf/hwp/bus_training/io_read_erepair.H
@@ -0,0 +1,54 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: src/usr/hwpf/hwp/io_read_erepair/io_read_erepair.H $ */
+/* */
+/* IBM CONFIDENTIAL */
+/* */
+/* COPYRIGHT International Business Machines Corp. 2013 */
+/* */
+/* p1 */
+/* */
+/* Object Code Only (OCO) source materials */
+/* Licensed Internal Code Source Materials */
+/* IBM HostBoot Licensed Internal Code */
+/* */
+/* The source code for this program is not published or otherwise */
+/* divested of its trade secrets, irrespective of what has been */
+/* deposited with the U.S. Copyright Office. */
+/* */
+/* Origin: 30 */
+/* */
+/* IBM_PROLOG_END_TAG */
+// $Id: io_read_erepair.H,v 1.4 2013/02/05 06:06:06 varkeykv Exp $
+#ifndef IO_READ_EREPAIR_H_
+#define IO_READ_EREPAIR_H_
+
+#include <fapi.H>
+
+/**
+ * @brief IO read e repair function
+ * the rx vectors will return to the caller(PRD or e-repair)the bad lane numbers on this endpoint
+ */
+typedef fapi::ReturnCode (*io_read_erepair_FP_t)(const fapi::Target &target,std::vector<uint8_t> &rx_lanes);
+
+extern "C"
+{
+
+/**
+ * @brief IO read erepair function
+ *
+ * @param[in] target could P8 MCS ,Centaur ( MEMBUF ) , p8 XBUS or p8 ABUS
+ *
+ * rx lanes will return bad lane data to the caller on this particular bus/endpoint
+ * e-repair will duplicate this to TX vpd records as well on the other connected side
+ *
+ *
+ * @return ReturnCode
+ */
+
+fapi::ReturnCode io_read_erepair(const fapi::Target &target,std::vector<uint8_t> &rx_lanes);
+
+} // extern "C"
+
+#endif // IO_READ_EREPAIR_H_
diff --git a/src/usr/hwpf/hwp/bus_training/makefile b/src/usr/hwpf/hwp/bus_training/makefile
index 358fbae07..3bdb6b83d 100644
--- a/src/usr/hwpf/hwp/bus_training/makefile
+++ b/src/usr/hwpf/hwp/bus_training/makefile
@@ -37,6 +37,7 @@ EXTRAINCDIR += ${ROOTPATH}/src/usr/hwpf/hwp/include
OBJS = gcr_funcs.o io_funcs.o io_run_training.o pbusLinkSvc.o proc_fab_smp.o \
io_dccal.o \
io_power_down_lanes.o \
+ io_read_erepair.o \
## NOTE: add a new directory onto the vpaths when you add a new HWP
OpenPOWER on IntegriCloud