Skip to content

Commit

Permalink
HBRT command from SBE to trigger NVDIMM operations
Browse files Browse the repository at this point in the history
Add support for calling NVDIMM operations through
the SBE message passing interface

Change-Id: Iae94166a411f134771f461dd3a63806721904368
RTC:211725
Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/80856
Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com>
Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com>
Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com>
Reviewed-by: Matt Derksen <mderkse1@us.ibm.com>
Reviewed-by: Glenn Miles <milesg@ibm.com>
Reviewed-by: Roland Veloz <rveloz@us.ibm.com>
Reviewed-by: Daniel M Crowell <dcrowell@us.ibm.com>
  • Loading branch information
cvswen authored and dcrowell77 committed Aug 19, 2019
1 parent e05083b commit f691dc2
Show file tree
Hide file tree
Showing 7 changed files with 189 additions and 5 deletions.
3 changes: 2 additions & 1 deletion src/include/usr/sbeio/runtime/sbe_msg_passing.H
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2017,2018 */
/* Contributors Listed Below - COPYRIGHT 2017,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand Down Expand Up @@ -90,6 +90,7 @@ namespace SBE_MSG
PASSTHRU_HBRT_GET_PSTATE = 0x00E10001, // HBRT Get PState Table
PASSTHRU_HBRT_OVERRIDE_ATTR = 0x00E10002, // HBRT Apply Override
// attributes
PASSTHRU_HBRT_NVDIMM_OP = 0x00E10003, // HBRT NVDIMM operation
};


Expand Down
58 changes: 58 additions & 0 deletions src/include/usr/sbeio/runtime/sbeio_nvdimm_operation.H
@@ -0,0 +1,58 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/include/usr/sbeio/runtime/sbeio_nvdimm_operation.H $ */
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2017,2019 */
/* [+] 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 */
#ifndef __SBE_MSG_SBEIO_NVDIMM_OPERATION_H
#define __SBE_MSG_SBEIO_NVDIMM_OPERATION_H

#include <errl/errlentry.H>
#include <targeting/common/target.H>

namespace SBE_MSG
{

/**
* @brief SBE pass-through command for executing nvdimm operations at runtime.
* This command acts as a bridge between sbe pass-through and the
* runtime doNvDimmOperation function.
*
* @param[in] i_targetHandle - The target of the request.
* @param[in] i_reqDataSize - Size of the nvdimm operation blob.
* @param[in] i_reqData - NVDIMM operation data.
* @param[out] o_rspStatus - The return value from doNvDimmOperation
* @param[out] o_rspDataSize - Set to 0 on return.
* @param[out] o_rspData - Not Used.
*
* @return nullptr upon success, pointer to ErrlEntry if an error occurred.
*
*/
errlHndl_t sbeNvdimmOperation( TARGETING::TargetHandle_t i_targetHandle,
uint32_t i_reqDataSize,
uint8_t * i_reqData,
uint32_t * o_rspStatus,
uint32_t * o_rspDataSize,
uint8_t * o_rspData );

}

#endif
45 changes: 45 additions & 0 deletions src/include/usr/util/runtime/rt_fwnotify.H
@@ -0,0 +1,45 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/include/usr/util/runtime/rt_fwnotify.H $ */
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2010,2019 */
/* [+] 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 */
#ifndef __RUNTIME_FWNOTIFY_H
#define __RUNTIME_FWNOTIFY_H

#include <runtime/interface.h>

/**
* @brief Perform an NVDIMM operation
* @param[in] nvDimmOp - A struct that contains the operation(s) to perform
* and a flag indicating whether to perform operation
* on all processors or a given single processor.
* @Note The operations below are in the order of which they should be
* performed. If a new operation is added, make sure it inserted in the
* correct order.
* The current order is: disarm -> disable encryption -> remove keys ->
* enable encryption -> arm
**/
int doNvDimmOperation(const hostInterfaces::nvdimm_operation_t& nvDimmOp);



#endif // __RUNTIME_FWNOTIFY_H
3 changes: 2 additions & 1 deletion src/usr/sbeio/runtime/makefile
Expand Up @@ -5,7 +5,7 @@
#
# OpenPOWER HostBoot Project
#
# Contributors Listed Below - COPYRIGHT 2017,2018
# Contributors Listed Below - COPYRIGHT 2017,2019
# [+] International Business Machines Corp.
#
#
Expand Down Expand Up @@ -37,6 +37,7 @@ include ../common/common.mk
## Objects unique to HBRT
OBJS += rt_sbeio.o
OBJS += sbeio_attr_override.o
OBJS += sbeio_nvdimm_operation.o
OBJS += sbeio_vital_attn.o

## sbeio_rt's sub directories
Expand Down
7 changes: 6 additions & 1 deletion src/usr/sbeio/runtime/rt_sbeio.C
Expand Up @@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2017,2018 */
/* Contributors Listed Below - COPYRIGHT 2017,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
Expand All @@ -29,6 +29,7 @@
#include <sys/misc.h>
#include <sbeio/runtime/sbe_msg_passing.H>
#include <sbeio/runtime/sbeio_attr_override.H>
#include <sbeio/runtime/sbeio_nvdimm_operation.H>
#include <sbeio/sbeioreasoncodes.H>
#include <errno.h>
#include <errl/errlentry.H>
Expand Down Expand Up @@ -782,6 +783,10 @@ namespace RT_SBEIO
#endif
SBE_MSG::setProcessCmdFunction(PASSTHRU_HBRT_OVERRIDE_ATTR,
sbeApplyAttrOverrides);
#ifdef CONFIG_NVDIMM
SBE_MSG::setProcessCmdFunction(PASSTHRU_HBRT_NVDIMM_OP,
sbeNvdimmOperation);
#endif
}
};

Expand Down
64 changes: 64 additions & 0 deletions src/usr/sbeio/runtime/sbeio_nvdimm_operation.C
@@ -0,0 +1,64 @@
/* IBM_PROLOG_BEGIN_TAG */
/* This is an automatically generated prolog. */
/* */
/* $Source: src/usr/sbeio/runtime/sbeio_nvdimm_operation.C $ */
/* */
/* OpenPOWER HostBoot Project */
/* */
/* Contributors Listed Below - COPYRIGHT 2017,2019 */
/* [+] 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 */
#include <sbeio/runtime/sbeio_nvdimm_operation.H>

#include <runtime/interface.h>
#include <util/runtime/rt_fwnotify.H>
#include <sbeio/sbeioreasoncodes.H>
#include <errl/errlentry.H>

extern trace_desc_t* g_trac_sbeio;

using namespace ERRORLOG;

namespace SBE_MSG
{

//-------------------------------------------------------------------------
errlHndl_t sbeNvdimmOperation( TARGETING::TargetHandle_t i_procTgt,
uint32_t i_reqDataSize,
uint8_t * i_reqData,
uint32_t * o_rspStatus,
uint32_t * o_rspDataSize,
uint8_t * o_rspData )
{
errlHndl_t errl{};

do
{
*o_rspDataSize = 0; //No return data
o_rspData = nullptr;

// doNvDimmOperation will take care of handling errors it encounters.
hostInterfaces::nvdimm_operation_t* l_nvdimmOp =
reinterpret_cast<hostInterfaces::nvdimm_operation_t*>(i_reqData);
*o_rspStatus = doNvDimmOperation(*l_nvdimmOp);
}
while(0);

return errl;
}

}//End namespace
14 changes: 12 additions & 2 deletions src/usr/util/runtime/rt_fwnotify.C
Expand Up @@ -438,8 +438,9 @@ void set_ATTR_NVDIMM_ENCRYPTION_ENABLE(
* The current order is: disarm -> disable encryption -> remove keys ->
* enable encryption -> arm
**/
void doNvDimmOperation(const hostInterfaces::nvdimm_operation_t& i_nvDimmOp)
int doNvDimmOperation(const hostInterfaces::nvdimm_operation_t& i_nvDimmOp)
{
int rc = 0;
#ifndef CONFIG_NVDIMM
TRACFCOMP(g_trac_runtime, ENTER_MRK"doNvDimmOperation: not an "
"NVDIMM configuration, this call becomes a noop.");
Expand Down Expand Up @@ -478,7 +479,7 @@ void doNvDimmOperation(const hostInterfaces::nvdimm_operation_t& i_nvDimmOp)
"HB Target from processor ID 0x%0X, "
"exiting ...",
i_nvDimmOp.procId);

rc = -1;
break;
}

Expand All @@ -491,6 +492,7 @@ void doNvDimmOperation(const hostInterfaces::nvdimm_operation_t& i_nvDimmOp)
{
TRACFCOMP(g_trac_runtime, "doNvDimmOperation: No NVDIMMs found, "
"exiting ...");
rc = -1;
break;
}

Expand All @@ -507,6 +509,7 @@ void doNvDimmOperation(const hostInterfaces::nvdimm_operation_t& i_nvDimmOp)
TRACFCOMP(g_trac_runtime, "doNvDimmOperation: "
"Call to disarm failed. Will not perform any "
"more arming/disarming calls, if they exist");
rc = -1;
break;
}
else
Expand All @@ -531,6 +534,7 @@ void doNvDimmOperation(const hostInterfaces::nvdimm_operation_t& i_nvDimmOp)
// Clear the encryption enable attribute
set_ATTR_NVDIMM_ENCRYPTION_ENABLE(0);

rc = -1;
break;
}
else
Expand All @@ -552,6 +556,7 @@ void doNvDimmOperation(const hostInterfaces::nvdimm_operation_t& i_nvDimmOp)
TRACFCOMP(g_trac_runtime, "doNvDimmOperation: "
"Call to remove keys failed. Will not perform "
"any more arming/disarming calls, if they exist");
rc = -1;
break;
}
else
Expand All @@ -575,6 +580,7 @@ void doNvDimmOperation(const hostInterfaces::nvdimm_operation_t& i_nvDimmOp)
"Call to generate keys failed, unable to enable "
"encryption. Will not perform any more "
"arming/disarming calls, if they exist");
rc = -1;
break;
}
else
Expand All @@ -586,6 +592,7 @@ void doNvDimmOperation(const hostInterfaces::nvdimm_operation_t& i_nvDimmOp)
"Call to enable encryption failed. "
"Will not perform any more arming/disarming "
"calls, if they exist");
rc = -1;
break;
}
else
Expand All @@ -604,6 +611,7 @@ void doNvDimmOperation(const hostInterfaces::nvdimm_operation_t& i_nvDimmOp)
{
TRACFCOMP(g_trac_runtime, "doNvDimmOperation: "
"Call to arm failed.");
rc = -1;
break;
}
else
Expand All @@ -621,6 +629,7 @@ void doNvDimmOperation(const hostInterfaces::nvdimm_operation_t& i_nvDimmOp)
{
TRACFCOMP(g_trac_runtime, "doNvDimmOperation: "
"Call to do a health check failed.");
rc = -1;
break;
}
else
Expand All @@ -640,6 +649,7 @@ void doNvDimmOperation(const hostInterfaces::nvdimm_operation_t& i_nvDimmOp)
#endif

TRACFCOMP(g_trac_runtime, EXIT_MRK"doNvDimmOperation")
return rc;
}

/**
Expand Down

0 comments on commit f691dc2

Please sign in to comment.