From e3d535e54acdd2f88ef924cbad8beb95a1598a16 Mon Sep 17 00:00:00 2001 From: crgeddes Date: Tue, 28 Mar 2017 13:15:16 -0500 Subject: [PATCH] Add Support for sbe_continueMPIPL FIFO Chip op Hostboot needs an interface to request for the continueMPIPL procedure on each slave proc. Change-Id: I6d43985aa4c2657c60ed30aac7bd2e9b98e4bd8d Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/38540 Tested-by: Jenkins Server Tested-by: Jenkins OP Build CI Tested-by: FSP CI Jenkins Reviewed-by: Dzuy Nguyen Reviewed-by: Martin Gloff Reviewed-by: William G. Hoffa --- src/include/usr/sbeio/sbeioreasoncodes.H | 1 + src/usr/sbeio/makefile | 1 + src/usr/sbeio/sbe_continueMpipl.C | 116 +++++++++++++++++++++++ src/usr/sbeio/sbe_fifodd.H | 41 ++++++++ 4 files changed, 159 insertions(+) create mode 100644 src/usr/sbeio/sbe_continueMpipl.C diff --git a/src/include/usr/sbeio/sbeioreasoncodes.H b/src/include/usr/sbeio/sbeioreasoncodes.H index c76a3d75f7d..0cff071ba01 100644 --- a/src/include/usr/sbeio/sbeioreasoncodes.H +++ b/src/include/usr/sbeio/sbeioreasoncodes.H @@ -46,6 +46,7 @@ enum sbeioModuleId SBEIO_PSU = 0x01, SBEIO_FIFO = 0x02, SBEIO_FFDC_PARSER = 0x03, + SBEIO_FIFO_CONTINUE_MPIPL = 0x04, }; /** diff --git a/src/usr/sbeio/makefile b/src/usr/sbeio/makefile index 2690ec0d781..b6e7e18709b 100644 --- a/src/usr/sbeio/makefile +++ b/src/usr/sbeio/makefile @@ -35,6 +35,7 @@ EXTRAINCDIR += ${ROOTPATH}/src/import/chips/p9/procedures/hwp/ffdc OBJS += sbe_psudd.o OBJS += sbe_coreStateControl.o OBJS += sbe_psuQuiesce.o +OBJS += sbe_continueMpipl.o OBJS += sbe_systemConfig.o OBJS += sbe_fifodd.o OBJS += sbe_scomAccess.o diff --git a/src/usr/sbeio/sbe_continueMpipl.C b/src/usr/sbeio/sbe_continueMpipl.C new file mode 100644 index 00000000000..d791fce1a21 --- /dev/null +++ b/src/usr/sbeio/sbe_continueMpipl.C @@ -0,0 +1,116 @@ +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/usr/sbeio/sbe_continueMpipl.C $ */ +/* */ +/* OpenPOWER HostBoot Project */ +/* */ +/* Contributors Listed Below - COPYRIGHT 2012,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 */ +/** +* @file sbe_systemConfig.C +* @brief System Configuartion Setup Messages to inform the SBE of other + procs in the system. +*/ + +#include +#include +#include +#include +#include "sbe_fifodd.H" +#include +#include + +extern trace_desc_t* g_trac_sbeio; + +#define SBE_TRACD(printf_string,args...) \ +TRACDCOMP(g_trac_sbeio,"continueMPIPL: " printf_string,##args) + +#define SBE_TRACF(printf_string,args...) \ +TRACFCOMP(g_trac_sbeio,"continueMPIPL: " printf_string,##args) + + +namespace SBEIO +{ + + /** + * @brief Set the system configuration on the SBE so it is aware of + * the other procs in the system + * + * @param[in] i_procChip The proc you would like to request continueMPIPL to + * NOTE: HB should only be sending this to slave procs + * + * @return errlHndl_t Error log handle on failure. + * + */ + + errlHndl_t sendContinueMpiplRequest(TARGETING::Target * i_procChip) + { + errlHndl_t errl = nullptr; + // check for master proc + TARGETING::Target * l_master = nullptr; + (void)TARGETING::targetService().masterProcChipTargetHandle(l_master); + + do + { + // look for NULL + if( nullptr == i_procChip || + TARGETING::MASTER_PROCESSOR_CHIP_TARGET_SENTINEL == i_procChip || + i_procChip == l_master) + { + /*@ + * @errortype + * @moduleid SBEIO_FIFO_CONTINUE_MPIPL + * @reasoncode SBEIO_FIFO_SENTINEL_TARGET + * @devdesc Attempted FIFO chip op on Master Proc + * @custdesc Firmware error communicating with boot device + */ + errl = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE, + SBEIO_FIFO_CONTINUE_MPIPL, + SBEIO_FIFO_MASTER_TARGET, + 0, + 0, + true /*SW error*/); + errl->collectTrace(SBEIO_COMP_NAME); + break; + } + + SBE_TRACD(ENTER_MRK "requesting continueMPIPL on proc %d HB -> SBE ", + i_procChip->getAttr()); + + SbeFifo::fifoContinueMpiplRequest l_fifoRequest; + SbeFifo::fifoContinueMpiplResponse l_fifoResponse; + + l_fifoRequest.commandClass = SbeFifo::SBE_FIFO_CLASS_MPIPL_COMMANDS; + l_fifoRequest.command = SbeFifo::SBE_FIFO_CMD_CONTINUE_MPIPL; + + + errl = SbeFifo::getTheInstance().performFifoChipOp(i_procChip, + (uint32_t *)&l_fifoRequest, + (uint32_t *)&l_fifoResponse, + sizeof(SbeFifo::fifoContinueMpiplResponse)); + + SBE_TRACD(EXIT_MRK "sendContinueMpiplRequest"); + + }while(0); + + return errl; + }; + +} //end namespace SBEIO + diff --git a/src/usr/sbeio/sbe_fifodd.H b/src/usr/sbeio/sbe_fifodd.H index ba52dd6f062..dd23e3c5427 100644 --- a/src/usr/sbeio/sbe_fifodd.H +++ b/src/usr/sbeio/sbe_fifodd.H @@ -91,6 +91,33 @@ class SbeFifo SBE_FIFO_CMD_PUT_SCOM_UNDER_MASK = 0x04, }; + /** + * @brief enums for FIFO MPIPL Messages + */ + enum fifoMpiplMessage + { + SBE_FIFO_CMD_ENTER_MPIPL = 0x01, + SBE_FIFO_CMD_CONTINUE_MPIPL = 0x02, + SBE_FIFO_CMD_STOP_CLOCKS = 0x03, + }; + + /** + * @brief Struct for FIFO Continue MPIPL request + * + */ + struct fifoContinueMpiplRequest + { + uint32_t wordCnt; + uint16_t reserved; + uint8_t commandClass; + uint8_t command; + fifoContinueMpiplRequest() : + wordCnt(2), + reserved(0) + { + } + } PACKED; + /** * @brief Struct for FIFO Get SCOM request * @@ -194,6 +221,20 @@ class SbeFifo fifoGetScomResponse() {} } PACKED; + /** + * @brief Struct for FIFO Continue MPIPL response + * + * The actual number of returned words varies based on whether there was + * an error. + */ + struct fifoContinueMpiplResponse + { + statusHeader status; + struct fapi2::ffdc_struct ffdc; // ffdc data + uint32_t status_distance; // distance to status + fifoContinueMpiplResponse() {} + } PACKED; + /** * @Brief perform SBE FIFO chip-op *