summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/include/usr/sbeio/runtime/sbe_msg_passing.H3
-rw-r--r--src/include/usr/sbeio/runtime/sbeio_nvdimm_operation.H58
-rw-r--r--src/include/usr/util/runtime/rt_fwnotify.H45
-rw-r--r--src/usr/sbeio/runtime/makefile3
-rw-r--r--src/usr/sbeio/runtime/rt_sbeio.C7
-rw-r--r--src/usr/sbeio/runtime/sbeio_nvdimm_operation.C64
-rw-r--r--src/usr/util/runtime/rt_fwnotify.C14
7 files changed, 189 insertions, 5 deletions
diff --git a/src/include/usr/sbeio/runtime/sbe_msg_passing.H b/src/include/usr/sbeio/runtime/sbe_msg_passing.H
index e50b4493e..e280e3e2f 100644
--- a/src/include/usr/sbeio/runtime/sbe_msg_passing.H
+++ b/src/include/usr/sbeio/runtime/sbe_msg_passing.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2017,2018 */
+/* Contributors Listed Below - COPYRIGHT 2017,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -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
};
diff --git a/src/include/usr/sbeio/runtime/sbeio_nvdimm_operation.H b/src/include/usr/sbeio/runtime/sbeio_nvdimm_operation.H
new file mode 100644
index 000000000..2b650bfae
--- /dev/null
+++ b/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
diff --git a/src/include/usr/util/runtime/rt_fwnotify.H b/src/include/usr/util/runtime/rt_fwnotify.H
new file mode 100644
index 000000000..1f6bc7efb
--- /dev/null
+++ b/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
diff --git a/src/usr/sbeio/runtime/makefile b/src/usr/sbeio/runtime/makefile
index 37792b554..e50153946 100644
--- a/src/usr/sbeio/runtime/makefile
+++ b/src/usr/sbeio/runtime/makefile
@@ -5,7 +5,7 @@
#
# OpenPOWER HostBoot Project
#
-# Contributors Listed Below - COPYRIGHT 2017,2018
+# Contributors Listed Below - COPYRIGHT 2017,2019
# [+] International Business Machines Corp.
#
#
@@ -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
diff --git a/src/usr/sbeio/runtime/rt_sbeio.C b/src/usr/sbeio/runtime/rt_sbeio.C
index 3aed96db6..360a144cd 100644
--- a/src/usr/sbeio/runtime/rt_sbeio.C
+++ b/src/usr/sbeio/runtime/rt_sbeio.C
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2017,2018 */
+/* Contributors Listed Below - COPYRIGHT 2017,2019 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -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>
@@ -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
}
};
diff --git a/src/usr/sbeio/runtime/sbeio_nvdimm_operation.C b/src/usr/sbeio/runtime/sbeio_nvdimm_operation.C
new file mode 100644
index 000000000..f41cd01a5
--- /dev/null
+++ b/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
diff --git a/src/usr/util/runtime/rt_fwnotify.C b/src/usr/util/runtime/rt_fwnotify.C
index 252876524..a96b24bba 100644
--- a/src/usr/util/runtime/rt_fwnotify.C
+++ b/src/usr/util/runtime/rt_fwnotify.C
@@ -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.");
@@ -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;
}
@@ -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;
}
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -640,6 +649,7 @@ void doNvDimmOperation(const hostInterfaces::nvdimm_operation_t& i_nvDimmOp)
#endif
TRACFCOMP(g_trac_runtime, EXIT_MRK"doNvDimmOperation")
+ return rc;
}
/**
OpenPOWER on IntegriCloud