diff options
author | Mark Wenning <wenning@us.ibm.com> | 2013-02-12 20:29:41 -0600 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2013-02-26 14:44:28 -0600 |
commit | 152220a65b946e489587ead8731b793066b54d38 (patch) | |
tree | acd34a8562a570cbdb06af7a6ba061f9cfc093f8 /src/usr/hwpf/hwp | |
parent | 8fa257a4a2bdd2be776c561ae7498433eedca53d (diff) | |
download | talos-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.C | 156 | ||||
-rw-r--r-- | src/usr/hwpf/hwp/bus_training/io_read_erepair.H | 54 | ||||
-rw-r--r-- | src/usr/hwpf/hwp/bus_training/makefile | 1 |
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 |