diff options
author | Vitaly Marin <mvitaly@us.ibm.com> | 2016-08-28 15:52:35 -0500 |
---|---|---|
committer | Daniel M. Crowell <dcrowell@us.ibm.com> | 2016-09-18 13:13:11 -0400 |
commit | 83efa306d8460f901459b936c341781633c7b507 (patch) | |
tree | 86a6b613687f1cbc8e44947dbb42e41aad9084e9 /src/usr/scan | |
parent | ebeb735ad3227137996822e03cf1108b549b8b69 (diff) | |
download | talos-hostboot-83efa306d8460f901459b936c341781633c7b507.tar.gz talos-hostboot-83efa306d8460f901459b936c341781633c7b507.zip |
Added support for 'Put Ring from Image' command on HB for SBE
Change-Id: I4930633f87bdb61acb19e01f17a8006277f7868d
RTC:132654
CMVC-Prereq: 1004971
CMVC-Prereq: 1005024
Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/28887
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Vitaly Marin <mvitaly@us.ibm.com>
Reviewed-by: William G. Hoffa <wghoffa@us.ibm.com>
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/usr/scan')
-rw-r--r-- | src/usr/scan/makefile | 8 | ||||
-rw-r--r-- | src/usr/scan/scandd.C | 559 | ||||
-rw-r--r-- | src/usr/scan/scandd.H | 20 |
3 files changed, 441 insertions, 146 deletions
diff --git a/src/usr/scan/makefile b/src/usr/scan/makefile index 6016f5beb..039be831a 100644 --- a/src/usr/scan/makefile +++ b/src/usr/scan/makefile @@ -5,7 +5,9 @@ # # OpenPOWER HostBoot Project # -# COPYRIGHT International Business Machines Corp. 2011,2014 +# Contributors Listed Below - COPYRIGHT 2012,2016 +# [+] 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. @@ -23,6 +25,10 @@ ROOTPATH = ../../.. MODULE = scan +EXTRAINCDIR +=${ROOTPATH}/src/import/chips/p9/utils/imageProcs +EXTRAINCDIR +=${ROOTPATH}/src/import/hwpf/fapi2/include + + OBJS += scandd.o SUBDIRS += test.d diff --git a/src/usr/scan/scandd.C b/src/usr/scan/scandd.C index 329d642cd..1f3941a36 100644 --- a/src/usr/scan/scandd.C +++ b/src/usr/scan/scandd.C @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2011,2014 */ +/* Contributors Listed Below - COPYRIGHT 2012,2016 */ +/* [+] 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. */ @@ -24,7 +26,6 @@ * @file scandd.C * * @brief Implementation of the scan device driver - * */ // ---------------------------------------------- @@ -42,6 +43,13 @@ #include <scan/scanif.H> #include "scandd.H" #include <errl/errludtarget.H> +#include <sbeio/sbe_psudd.H> +#include <targeting/common/util.H> +#include <p9_ring_id.h> +#include <hw_access_def.H> +#include <devicefw/userif.H> + + // ---------------------------------------------- // Globals @@ -60,13 +68,16 @@ TRAC_INIT( & g_trac_scanddr, SCANDD_RTRACE_BUF, KILOBYTE ); // ---------------------------------------------- // Defines // ---------------------------------------------- - +#define VIRTUAL_CHIPLET_ID_BASE_MCS_TARGET_TYPE (0x80) // ---------------------------------------------- namespace SCANDD { +using namespace SBEIO; + // Register the perform Op with the routing code for Procs. +//for "Put Ring From Image" command too DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD, DeviceFW::SCAN, TARGETING::TYPE_PROC, @@ -78,157 +89,419 @@ DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD, TARGETING::TYPE_MEMBUF, scanPerformOp ); +//for "Put Ring From Image" command +// Register the perform Op with the routing code +DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD, + DeviceFW::SCAN, + TARGETING::TYPE_EX, + scanPerformOp ); + +//for "Put Ring From Image" command +// Register the perform Op with the routing code +DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD, + DeviceFW::SCAN, + TARGETING::TYPE_PERV, + scanPerformOp ); + +//for "Put Ring From Image" command +// Register the perform Op with the routing code +DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD, + DeviceFW::SCAN, + TARGETING::TYPE_XBUS, + scanPerformOp ); + +//for "Put Ring From Image" command +// Register the perform Op with the routing code +DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD, + DeviceFW::SCAN, + TARGETING::TYPE_MCBIST, + scanPerformOp ); + +//for "Put Ring From Image" command +// Register the perform Op with the routing code +DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD, + DeviceFW::SCAN, + TARGETING::TYPE_OBUS, + scanPerformOp ); + +//for "Put Ring From Image" command +// Register the perform Op with the routing code +DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD, + DeviceFW::SCAN, + TARGETING::TYPE_PCI, + scanPerformOp ); + +//for "Put Ring From Image" command +// Register the perform Op with the routing code +DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD, + DeviceFW::SCAN, + TARGETING::TYPE_CORE, + scanPerformOp ); + +//for "Put Ring From Image" command +// Register the perform Op with the routing code +DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD, + DeviceFW::SCAN, + TARGETING::TYPE_L2, + scanPerformOp ); + +//for "Put Ring From Image" command +// Register the perform Op with the routing code +DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD, + DeviceFW::SCAN, + TARGETING::TYPE_L3, + scanPerformOp ); + +//for "Put Ring From Image" command +// Register the perform Op with the routing code +DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD, + DeviceFW::SCAN, + TARGETING::TYPE_L4, + scanPerformOp ); + +//for "Put Ring From Image" command +// Register the perform Op with the routing code +DEVICE_REGISTER_ROUTE( DeviceFW::WILDCARD, + DeviceFW::SCAN, + TARGETING::TYPE_MCS, + scanPerformOp ); + + +/// @brief translates HB target types to SBE target type groups +/// @param[in] i_hbTarget includes the HB target type +/// @return SBEIO::SBE_TARGET_TYPES returns SBE_TARGET_TYPE_UNKNOWN in error +SBE_TARGET_TYPES translateToSBETargetType(TARGETING::Target * i_hbTarget) +{ + + TRACDCOMP( g_trac_scandd, + ENTER_MRK "entering translateToSBETargetType()"); + SBE_TARGET_TYPES sbeType; + sbeType = SBE_TARGET_TYPE_UNKNOWN; + + + switch( i_hbTarget->getAttr<TARGETING::ATTR_TYPE>()){ + + case(TARGETING::TYPE_PROC): + { + sbeType = SBE_TARGET_TYPE_PROC; + break; + } + + case(TARGETING::TYPE_EX): + { + sbeType = SBE_TARGET_TYPE_EX; + break; + } + + case(TARGETING::TYPE_PERV): + case(TARGETING::TYPE_XBUS): + case(TARGETING::TYPE_MCBIST): + case(TARGETING::TYPE_OBUS): + case(TARGETING::TYPE_PCI): + case(TARGETING::TYPE_L2): + case(TARGETING::TYPE_L3): + case(TARGETING::TYPE_L4): + case(TARGETING::TYPE_CORE): + { + sbeType = SBE_TARGET_TYPE_PERV; + break; + } + case(TARGETING::TYPE_MCS): + { + sbeType = SBE_TARGET_TYPE_MCS; + break; + } + default: + TRACFCOMP( g_trac_scandd, + ERR_MRK "translateToSBETargetType:>" + " Not supported Target type =%.8X ", + i_hbTarget->getAttr<TARGETING::ATTR_TYPE>() ); + break; + } + + TRACDCOMP( g_trac_scandd, EXIT_MRK "exiting translateToSBETargetType()"); + return sbeType; +} + +/// @brief returns a ChipletID for a give target +/// @param[in] i_hbTarget includes the HB target type +/// @return: ChipletID for i_hbTarget target +uint8_t getChipletIDForSBE(TARGETING::Target * i_hbTarget) +{ + uint8_t l_chipletID = 0; + + TRACDCOMP( g_trac_scandd, ENTER_MRK "entering getChipletIDForSBE()"); + + //based on the Host to SBE Interface specification ver 0.70+ + switch( i_hbTarget->getAttr<TARGETING::ATTR_TYPE>()) + { + case(TARGETING::TYPE_PROC): + { //not all targets will have CHIPLET_IDs + l_chipletID = 0; + break; + } + //MCS has a virtual Chiplet ID + case (TARGETING::TYPE_MCS): + { + l_chipletID = VIRTUAL_CHIPLET_ID_BASE_MCS_TARGET_TYPE + + static_cast<uint8_t>(i_hbTarget-> + getAttr<TARGETING::ATTR_CHIP_UNIT>()); + break; + } + default: + { + l_chipletID = static_cast<uint8_t>(i_hbTarget-> + getAttr<TARGETING::ATTR_CHIPLET_ID>()); + break; + } + } + + TRACDCOMP( g_trac_scandd, EXIT_MRK "exiting getChipletIDForSBE()"); + return l_chipletID; +} + +/// @brief sends Put Ring from Image message to SBE via scan interface +/// @param[in] i_target target includes the target type that is needed +/// @param[in] va_list i_args contains: ringID, RingMode, flags +/// @return errlHndl_t returns non-zero value if there is error. +errlHndl_t sbeScanPerformOp(TARGETING::Target * i_target, va_list i_args) +{ + errlHndl_t l_errl = NULL; + TRACFCOMP( g_trac_scandd, ENTER_MRK "sbeScanPerformOp()"); + + psuCommand l_psuCommand( + //control flags are hardcoded here, no need to pass them into sbe function + SBE_DMCONTROL_RESPONSE_REQUIRED, + //command class + SBE_PSU_PUT_RING_FROM_IMAGE_CMD, + //command + SBE_CMD_CONTROL_PUTRING); + psuResponse l_psuResponse; + + //Ring ID for this message + RingID l_ringID = static_cast<RingID>(va_arg(i_args,uint64_t)); + //Ring Mode for this message + fapi2::RingMode l_ringMode = + static_cast<fapi2::RingMode>(va_arg(i_args,uint64_t)); + + uint64_t l_flags = va_arg(i_args,uint64_t); + TRACDCOMP( g_trac_scandd, INFO_MRK + ":: sbeScanPerformOp() does not use Control Flags :%.8X ", l_flags); + + l_psuCommand.cd3_PutRing_TargetType = translateToSBETargetType(i_target); + l_psuCommand.cd3_PutRing_Reserved1 = 0x00; + l_psuCommand.cd3_PutRing_ChipletID = getChipletIDForSBE(i_target); + l_psuCommand.cd3_PutRing_RingID = l_ringID; + l_psuCommand.cd3_PutRing_RingMode = l_ringMode; + + TRACDCOMP( g_trac_scandd, INFO_MRK" sbeScanPerformOp()" + " l_target : %.16llX i_targetType %.16llX", + i_target, + i_target->getAttr<TARGETING::ATTR_TYPE>()); + TRACDCOMP( g_trac_scandd, INFO_MRK + ":: sbeScanPerformOp() TargetType:%.8X ", + l_psuCommand.cd3_PutRing_TargetType); + TRACDCOMP( g_trac_scandd, INFO_MRK + ":: sbeScanPerformOp() Reserved1:%.8X ", + l_psuCommand.cd3_PutRing_Reserved1 ); + TRACDCOMP( g_trac_scandd, INFO_MRK + ":: sbeScanPerformOp() ChipletID:%.8X ", + l_psuCommand.cd3_PutRing_ChipletID ); + TRACDCOMP( g_trac_scandd, INFO_MRK + ":: sbeScanPerformOp() RingID:%.8X ", + l_psuCommand.cd3_PutRing_RingID ); + TRACDCOMP( g_trac_scandd, INFO_MRK + ":: sbeScanPerformOp() Control Flags :%.8X ", + l_psuCommand.cd3_PutRing_ControlFlags ); + TRACDCOMP( g_trac_scandd, INFO_MRK + ":: sbeScanPerformOp() RingMode:%.8X ", + l_psuCommand.cd3_PutRing_RingMode ); + + l_errl = performPsuChipOp(&l_psuCommand, + &l_psuResponse, + MAX_PSU_SHORT_TIMEOUT_NS, + SBE_DMCONTROL_START_REQ_USED_REGS, + SBE_DMCONTROL_START_RSP_USED_REGS); + + TRACFCOMP( g_trac_scandd, EXIT_MRK "exiting :: sbeScanPerformOp()"); + + return l_errl; +} // ------------------------------------------------------------------ // scanPerformOp // ------------------------------------------------------------------ errlHndl_t scanPerformOp( DeviceFW::OperationType i_opType, - TARGETING::Target * i_target, - void * io_buffer, - size_t & io_buflen, - int64_t i_accessType, - va_list i_args ) + TARGETING::Target * i_target, + void * io_buffer, + size_t & io_buflen, + int64_t i_accessType, + va_list i_args ) { errlHndl_t l_err = NULL; + va_list i_args_copy; + va_copy(i_args_copy, i_args); uint64_t i_ring = va_arg(i_args,uint64_t); uint64_t i_ringlength = va_arg(i_args,uint64_t); uint64_t i_flag = va_arg(i_args,uint64_t); + uint64_t i_whichFunction = va_arg(i_args,uint64_t); - do - { - // If the ringlength equals 0 - if( i_ringlength == 0x0 ) - { - TRACFCOMP( g_trac_scandd, ERR_MRK "SCAN::scanPerformOp> Invalid Ringlength for ring =%d for target =%.8X", i_ring, TARGETING::get_huid(i_target)); - /*@ - * @errortype - * @moduleid SCAN::MOD_SCANDD_DDOP - * @reasoncode SCAN::RC_INVALID_LENGTH - * @userdata1 SCAN Ring Address - * @userdata2 SCAN ring length - * @devdesc ScanDD::scanPerformOp> Invalid ringlength - * @custdesc A problem occurred during the IPL - * of the system. - */ - l_err = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE, - SCAN::MOD_SCANDD_DDOP, - SCAN::RC_INVALID_LENGTH, - i_ring, - i_ringlength, - true/*SW Error*/); - //Add this target to the FFDC - ERRORLOG::ErrlUserDetailsTarget(i_target,"Scan Target") - .addToLog(l_err); - - l_err->collectTrace(SCANDD_TRACE_BUF,1024); - break; - } - - // Check to see if invalid RING.. (0xFFFFFFFF - has been used as a - // test ring in fips code so checking for that as well. - if ((i_ring == 0x0) || (i_ring == 0xFFFFFFFF)) - { - TRACFCOMP( g_trac_scandd, ERR_MRK "SCAN:scanPerformOp> Invalid ring i_ring=%.8X for target =%.8X", i_ring, TARGETING::get_huid(i_target) ); - /*@ - * @errortype - * @moduleid SCAN::MOD_SCANDD_DDOP - * @reasoncode SCAN::RC_INVALID_RING_ADDRESS - * @userdata1 SCAN Ring Address - * @userdata2 TARGET - * @devdesc ScanDD::scanPerformOp> Invalid Ring Address - * @custdesc A problem occurred during the IPL - * of the system. - */ - l_err = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE, - SCAN::MOD_SCANDD_DDOP, - SCAN::RC_INVALID_RING_ADDRESS, - i_ring, - TARGETING::get_huid(i_target), - true/*SW Error*/); - //Add this target to the FFDC - ERRORLOG::ErrlUserDetailsTarget(i_target,"Scan Target") - .addToLog(l_err); - - l_err->collectTrace(SCANDD_TRACE_BUF,1024); - break; - } - - // Check to make sure the buflength is big enough. - // ringlength is in bits, io_buflen is in bytes - if ((i_ringlength) > io_buflen*8) - { - TRACFCOMP( g_trac_scandd, ERR_MRK "SCAN::scanPerformOp> IObuffer not big enough=ringlength = %d, iobuflen = %d for target =%.8X", i_ringlength, io_buflen,TARGETING::get_huid(i_target) ); - /*@ - * @errortype - * @moduleid SCAN::MOD_SCANDD_DDOP - * @reasoncode SCAN::RC_INVALID_BUF_SIZE - * @userdata1 SCAN IO buffer length - * @userdata2 SCAN ring length - * @devdesc ScanDD::scanPerformOp> Invalid IObuf length - * @custdesc A problem occurred during the IPL - * of the system. - */ - l_err = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE, - SCAN::MOD_SCANDD_DDOP, - SCAN::RC_INVALID_BUF_SIZE, - io_buflen, - i_ringlength, - true/*SW Error*/); - //Add this target to the FFDC - ERRORLOG::ErrlUserDetailsTarget(i_target,"Scan Target") - .addToLog(l_err); - - l_err->collectTrace(SCANDD_TRACE_BUF,1024); - break; - } - - // If a Scan read or Write.. do the scan op. - if(( DeviceFW::READ == i_opType ) || ( DeviceFW::WRITE == i_opType )) - { - l_err = scanDoScan( i_opType, - i_target, - io_buffer, - io_buflen, - i_ring, - i_ringlength, - i_flag ); - - if(l_err) - { - break; - } - - } - else - { - TRACFCOMP( g_trac_scandd, ERR_MRK "SCAN::scanPerformOp> Invalid Op Type = %d for target =%.8X", i_opType, TARGETING::get_huid(i_target) ); - /*@ - * @errortype - * @moduleid SCAN::MOD_SCANDD_DDOP - * @reasoncode SCAN::RC_INVALID_OPERATION - * @userdata1 SCAN Address - * @userdata2 Operation Type (i_opType) - * @devdesc ScanDD::scanPerformOp> Invalid operation type - * @custdesc A problem occurred during the IPL - * of the system. - */ - l_err = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE, - SCAN::MOD_SCANDD_DDOP, - SCAN::RC_INVALID_OPERATION, - i_ring, - TO_UINT64(i_opType), - true/*SW Error*/); - //Add this target to the FFDC - ERRORLOG::ErrlUserDetailsTarget(i_target,"Scan Target") - .addToLog(l_err); - l_err->collectTrace(SCANDD_TRACE_BUF,1024); - break; - } - - }while(0); - - return l_err; + do + { + + if(i_whichFunction == PUT_RING_FROM_IMAGE_COMMAND) + { + TRACFCOMP( g_trac_scandd, + ENTER_MRK " scanPerformOP 'Put Ring From Image'" + " command is being generated"); + l_err = sbeScanPerformOp(i_target, i_args_copy); + } + else + { + + // If the ringlength equals 0 + if( i_ringlength == 0x0 ) + { + TRACFCOMP( g_trac_scandd, + ERR_MRK "SCAN::scanPerformOp> Invalid Ringlength for" + " ring =%d for target =%.8X", + i_ring, TARGETING::get_huid(i_target)); + /*@ + * @errortype + * @moduleid SCAN::MOD_SCANDD_DDOP + * @reasoncode SCAN::RC_INVALID_LENGTH + * @userdata1 SCAN Ring Address + * @userdata2 SCAN ring length + * @devdesc ScanDD::scanPerformOp> Invalid ringlength + * @custdesc A problem occurred during the IPL + * of the system. + */ + l_err = new ERRORLOG::ErrlEntry( + ERRORLOG::ERRL_SEV_UNRECOVERABLE, + SCAN::MOD_SCANDD_DDOP, + SCAN::RC_INVALID_LENGTH, + i_ring, + i_ringlength, + true/*SW Error*/); + //Add this target to the FFDC + ERRORLOG::ErrlUserDetailsTarget(i_target,"Scan Target") + .addToLog(l_err); + + l_err->collectTrace(SCANDD_TRACE_BUF,1024); + break; + } + + // Check to see if invalid RING.. (0xFFFFFFFF - has been used as a + // test ring in fips code so checking for that as well. + if ((i_ring == 0x0) || (i_ring == 0xFFFFFFFF)) + { + TRACFCOMP( g_trac_scandd, ERR_MRK "SCAN:scanPerformOp> Invalid ring i_ring=%.8X for target =%.8X", i_ring, TARGETING::get_huid(i_target) ); + /*@ + * @errortype + * @moduleid SCAN::MOD_SCANDD_DDOP + * @reasoncode SCAN::RC_INVALID_RING_ADDRESS + * @userdata1 SCAN Ring Address + * @userdata2 TARGET + * @devdesc ScanDD::scanPerformOp> Invalid Ring Address + * @custdesc A problem occurred during the IPL + * of the system. + */ + l_err = new ERRORLOG::ErrlEntry( + ERRORLOG::ERRL_SEV_UNRECOVERABLE, + SCAN::MOD_SCANDD_DDOP, + SCAN::RC_INVALID_RING_ADDRESS, + i_ring, + TARGETING::get_huid(i_target), + true/*SW Error*/); + //Add this target to the FFDC + ERRORLOG::ErrlUserDetailsTarget(i_target,"Scan Target") + .addToLog(l_err); + + l_err->collectTrace(SCANDD_TRACE_BUF,1024); + break; + } + + // Check to make sure the buflength is big enough. + // ringlength is in bits, io_buflen is in bytes + if ((i_ringlength) > io_buflen*8) + { + TRACFCOMP( g_trac_scandd, ERR_MRK "SCAN::scanPerformOp> IObuffer not big enough=ringlength = %d, iobuflen = %d for target =%.8X", i_ringlength, io_buflen,TARGETING::get_huid(i_target) ); + /*@ + * @errortype + * @moduleid SCAN::MOD_SCANDD_DDOP + * @reasoncode SCAN::RC_INVALID_BUF_SIZE + * @userdata1 SCAN IO buffer length + * @userdata2 SCAN ring length + * @devdesc ScanDD::scanPerformOp> Invalid IObuf length + * @custdesc A problem occurred during the IPL + * of the system. + */ + l_err = new ERRORLOG::ErrlEntry( + ERRORLOG::ERRL_SEV_UNRECOVERABLE, + SCAN::MOD_SCANDD_DDOP, + SCAN::RC_INVALID_BUF_SIZE, + io_buflen, + i_ringlength, + true/*SW Error*/); + //Add this target to the FFDC + ERRORLOG::ErrlUserDetailsTarget(i_target,"Scan Target") + .addToLog(l_err); + + l_err->collectTrace(SCANDD_TRACE_BUF,1024); + break; + } + + // If a Scan read or Write.. do the scan op. + if((DeviceFW::READ == i_opType) || (DeviceFW::WRITE == i_opType)) + { + l_err = scanDoScan( i_opType, + i_target, + io_buffer, + io_buflen, + i_ring, + i_ringlength, + i_flag ); + + if(l_err) + { + break; + } + + } + else + { + TRACFCOMP( g_trac_scandd, ERR_MRK "SCAN::scanPerformOp> Invalid Op Type = %d for target =%.8X", i_opType, TARGETING::get_huid(i_target) ); + /*@ + * @errortype + * @moduleid SCAN::MOD_SCANDD_DDOP + * @reasoncode SCAN::RC_INVALID_OPERATION + * @userdata1 SCAN Address + * @userdata2 Operation Type (i_opType) + * @devdesc ScanDD::scanPerformOp> Invalid operation type + * @custdesc A problem occurred during the IPL + * of the system. + */ + l_err = new ERRORLOG::ErrlEntry( + ERRORLOG::ERRL_SEV_UNRECOVERABLE, + SCAN::MOD_SCANDD_DDOP, + SCAN::RC_INVALID_OPERATION, + i_ring, + TO_UINT64(i_opType), + true/*SW Error*/); + //Add this target to the FFDC + ERRORLOG::ErrlUserDetailsTarget(i_target,"Scan Target") + .addToLog(l_err); + l_err->collectTrace(SCANDD_TRACE_BUF,1024); + break; + } + + }//else case + }while(0); + + va_end(i_args_copy); // this is needed for sbeScanPerformOp function + + return l_err; } @@ -723,6 +996,4 @@ errlHndl_t scanDoScan( DeviceFW::OperationType i_opType, } - - } diff --git a/src/usr/scan/scandd.H b/src/usr/scan/scandd.H index 548de95b7..e8b410c5b 100644 --- a/src/usr/scan/scandd.H +++ b/src/usr/scan/scandd.H @@ -5,7 +5,9 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* COPYRIGHT International Business Machines Corp. 2011,2014 */ +/* Contributors Listed Below - COPYRIGHT 2012,2016 */ +/* [+] 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. */ @@ -34,6 +36,7 @@ // Includes // ---------------------------------------------- #include <errl/errlentry.H> +#include <sbeio/sbe_psudd.H> namespace SCANDD { @@ -51,6 +54,12 @@ errlHndl_t scanPerformOp( DeviceFW::OperationType i_opType, va_list i_args ); +/// @brief sends Put Ring from Image message to SBE via scan interface +/// @param[in] i_target target includes the target type that is needed +/// @param[in] va_list i_args contains: ringID, RingMode, flags +/// @return errlHndl_t returns non-zero value if there is error. +errlHndl_t sbeScanPerformOp( TARGETING::Target * i_target, va_list i_args ); + errlHndl_t scanDoScan( DeviceFW::OperationType i_opType, TARGETING::Target * i_target, void * io_buffer, @@ -59,7 +68,16 @@ errlHndl_t scanDoScan( DeviceFW::OperationType i_opType, uint64_t i_ringlength, uint64_t i_flag ); +/// @brief translates HB target types to SBE target type groups +/// @param[in] i_hbTarget includes the HB target type +/// @return SBEIO::SBE_TARGET_TYPES returns SBE_TARGET_TYPE_UNKNOWN in error +SBEIO::SBE_TARGET_TYPES + translateToSBETargetType(TARGETING::Target * i_hbTarget); +/// @brief returns a ChipletID for a give target +/// @param[in] i_hbTarget includes the HB target type +/// @return: ChipletID for i_hbTarget target +uint8_t getChipletIDForSBE(TARGETING::Target * i_hbTarget); }; // end SCAN namespace |