/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* $Source: src/include/usr/hwpf/hwp/erepairAccessorHwpFuncs.H $          */
/*                                                                        */
/* OpenPOWER HostBoot Project                                             */
/*                                                                        */
/* COPYRIGHT International Business Machines Corp. 2012,2014              */
/*                                                                        */
/* 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                                                     */
// $Id: erepairAccessorHwpFuncs.H,v 1.2 2014/04/29 11:59:25 bilicon Exp $
/**
 *  @file erepairAccessorHwpFuncs.H
 *
 *  @brief FW Team Utility functions that accesses fabric and memory eRepair
 *  data.
 */

/*
 * Change Log ******************************************************************
 * Flag     Defect/Feature  User        Date        Description
 * ------   --------------  ----------  ----------- ----------------------------
 *                          bilicon     10/24/2012  Created.
 */

#ifndef EREPAIRACCESSORHWPFUNCS_H_
#define EREPAIRACCESSORHWPFUNCS_H_

#include <fapi.H>
#include <algorithm>

const uint8_t EREPAIR_MAX_CENTAUR_PER_MCS = 1;

typedef fapi::ReturnCode (*getLanes_t)(
                          const fapi::Target   &i_tgtHandle,
                          std::vector<uint8_t> &o_txFailLanes,
                          std::vector<uint8_t> &o_rxFailLanes);

typedef fapi::ReturnCode (*setLanes_t)(
                          const fapi::Target         &i_tgtHandle,
                          const std::vector<uint8_t> &i_txFailLanes,
                          const std::vector<uint8_t> &i_rxFailLanes);

/**
 * @brief FW Team Utility function that gets eRepair data from the VPD
 *        This function gets the eRepair data from both the Field VPD
 *        and the Manufacturing VPD.
 *
 * @param[in]  i_endp_target Reference to X-Bus or A-Bus or MCS or memBuf Target
 * @param[out] o_txFailLanes Reference to a Vector that will contain the fail
 *                           lanes read from the VPD for Drive side
 * @param[out] o_rxFailLanes Reference to a Vector that will contain the fail
 *                           lanes read from the VPD for Receive side
 * @return ReturnCode
 *
 */
fapi::ReturnCode erepairGetFailedLanes(const fapi::Target &i_endp_target,
                                       std::vector<uint8_t> &o_txFailLanes,
                                       std::vector<uint8_t> &o_rxFailLanes);

/**
 * @brief FW Team Utility function that gets eRepair data
 *
 * This is a wrapper function for the Accessor HWP which reads failed lane
 * numbers from the Field VPD
 *
 * @param[in]  i_endp_target Reference to X-Bus or A-Bus or MCS or memBuf Target
 * @param[out] o_txFailLanes Reference to a Vector that will contain the fail
 *                           lanes read from the Field VPD for Drive side
 * @param[out] o_rxFailLanes Reference to a Vector that will contain the fail
 *                           lanes read from the Field VPD for Receive side
 * @return ReturnCode
 *
 */
fapi::ReturnCode erepairGetFieldFailedLanes(const fapi::Target &i_endp_target,
                                            std::vector<uint8_t> &o_txFailLanes,
                                            std::vector<uint8_t> &o_rxFailLanes);

/**
 * @brief FW Team Utility function that gets eRepair data
 *
 * This is a wrapper function for the Accessor HWP which reads failed lane
 * numbers from the Manufacturing VPD
 *
 * @param[in]  i_endp_target Reference to X-Bus or A-Bus or MCS or memBuf Target
 * @param[out] o_txFailLanes Reference to a Vector that will contain the fail
 *                           lanes read from the Mnfg VPD for Drive side
 * @param[out] o_rxFailLanes Reference to a Vector that will contain the fail
 *                           lanes read from the Mnfg VPD for Receive side
 * @return ReturnCode
 *
 */
fapi::ReturnCode erepairGetMnfgFailedLanes(const fapi::Target &i_endp_target,
                                           std::vector<uint8_t> &o_txFailLanes,
                                           std::vector<uint8_t> &o_rxFailLanes);

/**
 * @brief FW Team Utility function that sets eRepair data in the VPD.
 *        This functions sets the eRepair data to either the Field VPD
 *        or the Manufacturing VPD depending on whether the IPL was done
 *        in normal mode or Manufacturing mode.
 *        It writes eRepair data to the VPD of both the endpoint targets
 *        passed as arguments.
 *
 * @param[in]  i_txEndp_target   Reference to X-Bus or A-Bus or MCS or memBuf
 *                               Target. This is the peer target of
 *                               i_rxEndp_target
 * @param[in]  i_rxEndp_target   Reference to X-Bus or A-Bus or MCS or memBuf
 *                               Target. This is the target on which the
 *                               badlanes were found
 * @param[in]  i_rxFailLanes     Vector that will contain the fail lanes
 *                               to be written to VPD for Receive side
 * @param[out] o_thresholdExceed If TRUE, indicates that the eRepair threshold
 *                               has exceeded, FALSE otherwise.
 *
 * @return ReturnCode
 */
fapi::ReturnCode erepairSetFailedLanes(
                                 const fapi::Target         &i_txEndp_target,
                                 const fapi::Target         &i_rxEndp_target,
                                 const std::vector<uint8_t> &i_rxFailLanes,
                                 bool                       &o_thresholdExceed);

/**
 * @brief FW Team Utility function that sets eRepair data in Field VPD
 *
 * This is a wrapper function for the Accessor HWP which writes failed lane
 * numbers to the Field VPD
 *
 * @param[in]  i_endp_target Reference to X-Bus or A-Bus or MCS or memBuf Target
 * @param[in]  i_txFailLanes Vector that will contain the fail lane
 *                           to be written to Field VPD for Drive side
 * @param[in]  i_rxFailLanes Vector that will contain the fail lanes
 *                           to be written to Field VPD for Receive side
 *
 * @return ReturnCode
 */
fapi::ReturnCode erepairSetFieldFailedLanes(
                                     const fapi::Target &i_endp_target,
                                     const std::vector<uint8_t> &i_txFailLanes,
                                     const std::vector<uint8_t> &i_rxFailLanes);

/**
 * @brief FW Team Utility function that sets eRepair data in Manufacturing VPD
 *
 * This is a wrapper function for the Accessor HWP which writes failed lane
 * numbers to the Manufacturing VPD
 *
 * @param[in]  i_endp_target Reference to X-Bus or A-Bus or MCS or memBuf Target
 * @param[in]  i_txFailLanes Vector that will contain the fail lane
 *                           to be written to Mnfg VPD for Drive side
 * @param[in]  i_rxFailLanes Vector that will contain the fail lanes
 *                           to be written to Mnfg VPD for Receive side
 *
 * @return ReturnCode
 */
fapi::ReturnCode erepairSetMnfgFailedLanes(
                                      const fapi::Target &i_endp_target,
                                      const std::vector<uint8_t> &i_txFailLanes,
                                      const std::vector<uint8_t> &i_rxFailLanes);

/**
 * @brief Function which retrieves the lanes that need to be restored for the
 *        given end point targets
 *
 * This function is called by the iStep dispatcher during the Restore Repair
 * iStep for Fabric buses and DMI buses. The caller need to make sure that the
 * first and fourth arguments are the endpoint targets of a Fabric bus or
 * DMI bus.
 * It calls the wrapper functions of Accessor HWP to read the fail lane data
 * recorded in the VPD on both the ends and verifies that there are matching
 * records on both the ends. If matching fail lanes are not found, the
 * corresponding fail lane data is invalidated using the wrapper Accessor HWP
 * that writes data to the VPD.
 *
 * @param [in]   i_endp1_target      Reference to X-Bus or A-Bus or MCS Target
 * @param [out]  o_endp1_txFaillanes Reference to vector that will have the
 *                                   fail lane numbers that need to be restored
 *                                   for the Tx side of the target passed
 *                                   as first param
 * @param [out]  o_endp1_rxFaillanes Reference to vector that will have the
 *                                   fail lane numbers that need to be restored
 *                                   for the Rx side of the target passed
 *                                   as first param
 * @param [in]   i_endp2_target      Reference to X-Bus or A-Bus or MCS Target
 * @param [out]  o_endp2_txFaillanes Reference to vector that will have the
 *                                   fail lane numbers that need to be restored
 *                                   for the Tx side of the target passed
 *                                   as fourth param
 * @param [out]  o_endp2_rxFaillanes Reference to vector that will have the
 *                                   fail lane numbers that need to be restored
 *                                   for the Rx side of the target passed
 *                                   as fourth param
 *
 * @return ReturnCode
 *
 */

fapi::ReturnCode erepairGetRestoreLanes(const fapi::Target &i_endp1_target,
                                     std::vector<uint8_t> &o_endp1_txFaillanes,
                                     std::vector<uint8_t> &o_endp1_rxFaillanes,
                                     const fapi::Target   &i_endp2_target,
                                     std::vector<uint8_t> &o_endp2_txFaillanes,
                                     std::vector<uint8_t> &o_endp2_rxFaillanes);

#endif