Skip to content

Commit

Permalink
Send IPL status codes to BMC over LPC port 81h/82h
Browse files Browse the repository at this point in the history
Tested on Talos II with modified BMC firmware
This resolves open-power#14

Signed-off-by: Timothy Pearson <[email protected]>
  • Loading branch information
madscientist159 authored and Raptor Engineering Development Team committed Apr 24, 2019
1 parent 249671d commit 63aa1d2
Show file tree
Hide file tree
Showing 9 changed files with 170 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/build/img_defs.mk
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,10 @@ ifdef SBE_CONSOLE_SUPPORT
GCC-DEFS += -DSBE_CONSOLE_SUPPORT
endif

ifdef SBE_IPL_STATUS_LPC_SUPPORT
GCC-DEFS += -DSBE_IPL_STATUS_LPC_SUPPORT
endif

DEFS += $(GCC-DEFS)
###########################################################################

Expand Down
1 change: 1 addition & 0 deletions src/build/power_defs.mk
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ HOST_INTERFACE_AVAILABLE = 1
PERIODIC_IO_TOGGLE_SUPPORTED = 1

SBE_CONSOLE_SUPPORT = 1
SBE_IPL_STATUS_LPC_SUPPORT = 1

export SBE_S0_SUPPORT = 1
export PIBMEM_REPAIR_SCOM_P9 = 1
Expand Down
3 changes: 3 additions & 0 deletions src/sbefw/app/power/ipl_table.C
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@
#include "p9_fbc_utils.H"
#include "sbeSecureMemRegionManager.H"

#include "sbeIPLStatusLPC.H"
#include "sbeConsole.H"
#include "sbecmdflushnvdimm.H"

Expand Down Expand Up @@ -398,6 +399,7 @@ ReturnCode istepLpcInit( voidfuncptr_t i_hwp)
Target<TARGET_TYPE_PROC_CHIP > proc = plat_getChipTarget();
assert( NULL != i_hwp );
SBE_EXEC_HWP(rc, reinterpret_cast<sbeIstepHwpProc_t>( i_hwp ), proc)
SBE_ISTEP_LPC_INIT;
SBE_UART_INIT;
SBE_MSG_CONSOLE( SBE_CONSOLE_WELCOME_MSG );

Expand Down Expand Up @@ -661,6 +663,7 @@ ReturnCode istepStartInstruction( voidfuncptr_t i_hwp)
ReturnCode rc = FAPI2_RC_SUCCESS;

SBE_MSG_CONSOLE("SBE starting hostboot");
SBE_ISTEP_LPC_DISABLE;
SBE_UART_DISABLE;
rc = istepWithCore(i_hwp);
if(rc == FAPI2_RC_SUCCESS)
Expand Down
3 changes: 3 additions & 0 deletions src/sbefw/core/corefiles.mk
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ endif
ifeq ($(SBE_CONSOLE_SUPPORT), 1)
CORESEEPROM-CPP-SOURCES += sbeConsole.C
endif
ifeq ($(SBE_IPL_STATUS_LPC_SUPPORT), 1)
CORESEEPROM-CPP-SOURCES += sbeIPLStatusLPC.C
endif

CORESEEPROM-C-SOURCES =
CORESEEPROM-S-SOURCES =
Expand Down
2 changes: 2 additions & 0 deletions src/sbefw/core/ipl.C
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

#include "ipl.H"
#include "sbeConsole.H"
#include "sbeIPLStatusLPC.H"
#include "sbeglobals.H"

#include "p9n2_perv_scom_addresses.H"
Expand Down Expand Up @@ -122,6 +123,7 @@ void sbeDoContinuousIpl()
auto istepMap = &istepTableEntry->istepMinorArr[step-1];
if(istepMap->istepWrapper != NULL)
{
SBE_PUT_ISTEP_LPC(istepTableEntry->istepMajorNum, step);
SBE_MSG_CONSOLE("istep ", istepTableEntry->istepMajorNum, ".", step);
rc = istepMap->istepWrapper(istepMap->istepHwp);
}
Expand Down
91 changes: 91 additions & 0 deletions src/sbefw/core/sbeIPLStatusLPC.C
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/sbefw/core/sbeConsole.C $ */
/* */
/* OpenPOWER sbe Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2018-2019 */
/* [+] International Business Machines Corp. */
/* [+] Raptor Engineering, LLC */
/* */
/* */
/* 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 */
#include "sbetrace.H"
#include "fapi2.H"

#include "sbeIPLStatusLPC.H"

#include "p9_perv_scom_addresses.H"
#include "p9_perv_scom_addresses_fld.H"
#include "p9_misc_scom_addresses.H"
#include "p9_misc_scom_addresses_fld.H"

#include "sberegaccess.H"
#include "sbeglobals.H"
#include "p9_lpc_utils.H"

using namespace fapi2;

static uint32_t writeLPCReg(uint8_t i_addr,
uint8_t i_data)
{
uint32_t rc = SBE_SEC_OPERATION_SUCCESSFUL;

do {
Target<TARGET_TYPE_PROC_CHIP > proc = plat_getChipTarget();

buffer<uint32_t> data = 0;
data.insert(i_data, 0, 8);

ReturnCode fapiRc = lpc_rw(proc,
LPC_IO_SPACE + i_addr,
sizeof(uint8_t),
false,
false,
data);
if(fapiRc != FAPI2_RC_SUCCESS)
{
rc = SBE_SEC_LPC_ACCESS_FAILED;
break;
}
} while(0);

return rc;
}

void postPutIStep(char major, char minor)
{
#define SBE_FUNC "postPutIStep"
uint32_t rc = SBE_SEC_OPERATION_SUCCESSFUL;
do {
rc = writeLPCReg(0x81, major);
if(rc != SBE_SEC_OPERATION_SUCCESSFUL)
{
SBE_ERROR(SBE_FUNC " failure to write IPL status 1");
break;
}

rc = writeLPCReg(0x82, minor);
if(rc != SBE_SEC_OPERATION_SUCCESSFUL)
{
SBE_ERROR(SBE_FUNC " failure to write IPL status 2");
break;
}

} while(0);

#undef SBE_FUNC
}
58 changes: 58 additions & 0 deletions src/sbefw/core/sbeIPLStatusLPC.H
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/sbefw/core/sbeConsole.H $ */
/* */
/* OpenPOWER sbe Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2018 */
/* [+] International Business Machines Corp. */
/* [+] Raptor Engineering, LLC */
/* */
/* */
/* 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 */
#pragma once

#include "sbe_sp_intf.H"
#include "sbe_build_info.H"

#ifndef SBE_IPL_STATUS_LPC_SUPPORT

#define SBE_ISTEP_LPC_INIT
#define SBE_ISTEP_LPC_DISABLE
#define SBE_PUT_ISTEP_LPC(major, minor)

#else

#define SBE_ISTEP_LPC_INIT { \
SBE_GLOBAL->sbeLPCActive = true; \
}

#define SBE_ISTEP_LPC_DISABLE { \
SBE_GLOBAL->sbeLPCActive = false; \
}

#define SBE_PUT_ISTEP_LPC(major, minor) \
if(SBE_GLOBAL->sbeLPCActive) \
{ \
postPutIStep(major, minor); \
}

#define LPC_IO_SPACE 0xD0010000
#define LPC_MAX_IO_SPACE (64*1024)

void postPutIStep(char major, char minor);

#endif // SBE_IPL_STATUS_LPC_SUPPORT
4 changes: 4 additions & 0 deletions src/sbefw/core/sbeglobals.C
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,10 @@ uint8_t SBEGlobalsSingleton::failedCmd = 0;

bool SBEGlobalsSingleton::isHreset = false;

#ifdef SBE_IPL_STATUS_LPC_SUPPORT
bool SBEGlobalsSingleton::sbeLPCActive = false;
#endif

#ifdef SBE_CONSOLE_SUPPORT
bool SBEGlobalsSingleton::sbeUartActive = false;
#endif
4 changes: 4 additions & 0 deletions src/sbefw/core/sbeglobals.H
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@ class SBEGlobalsSingleton
*/
PkSemaphore sbeSemAsyncProcess;

#ifdef SBE_IPL_STATUS_LPC_SUPPORT
static bool sbeLPCActive;
#endif

#ifdef SBE_CONSOLE_SUPPORT
// Binary semaphore to protect uart access
PkSemaphore sbeUartBinSem;
Expand Down

0 comments on commit 63aa1d2

Please sign in to comment.