diff --git a/src/include/runtime/interface.h b/src/include/runtime/interface.h index 638bf8b890c..2d54dd1f3a2 100644 --- a/src/include/runtime/interface.h +++ b/src/include/runtime/interface.h @@ -1124,6 +1124,11 @@ struct postInitCalls_t */ void (*callCommitRsvdTraceBufErrl)(); + /** + * @brief Sends current NV_STATUS to host + * + */ + void (*callSendNvStatus)(); }; extern hostInterfaces_t* g_hostInterfaces; diff --git a/src/include/usr/isteps/nvdimm/nvdimm.H b/src/include/usr/isteps/nvdimm/nvdimm.H index 136e5cda176..97655b24b76 100644 --- a/src/include/usr/isteps/nvdimm/nvdimm.H +++ b/src/include/usr/isteps/nvdimm/nvdimm.H @@ -271,6 +271,12 @@ bool nvDimmNvmCheckHealthStatus(const TARGETING::TargetHandleList */ bool nvDimmNvmCheckHealthStatusOnSystem(); + +/** + * @brief Send NV_STATUS to host + */ +void nvdimmSendNvStatus(); + #endif /** @@ -299,6 +305,7 @@ enum nvdimm_protection_t NVDIMM_ENCRYPTION_ERROR = 6, ENCRYPTION_ENABLED = 7, ENCRYPTION_DISABLED = 8, + SEND_NV_STATUS = 11, /* deprecated, still used by PRD */ UNPROTECTED_BECAUSE_ERROR = 4, }; diff --git a/src/runtime/rt_main.C b/src/runtime/rt_main.C index b8f37e46c58..3aa2931e6fd 100644 --- a/src/runtime/rt_main.C +++ b/src/runtime/rt_main.C @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2013,2018 */ +/* Contributors Listed Below - COPYRIGHT 2013,2019 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -166,6 +166,11 @@ runtimeInterfaces_t* rt_start(hostInterfaces_t* intf) // (HTMGT not compiled in by default) } +#ifdef CONFIG_NVDIMM + // Update hose with current NV_STATUS + rtPost->callSendNvStatus(); +#endif + // do any version mismatch fixups rt_version_fixup(); diff --git a/src/usr/isteps/nvdimm/nvdimm.C b/src/usr/isteps/nvdimm/nvdimm.C index 3c6c1a05512..6576b5a63d6 100644 --- a/src/usr/isteps/nvdimm/nvdimm.C +++ b/src/usr/isteps/nvdimm/nvdimm.C @@ -3660,6 +3660,10 @@ errlHndl_t notifyNvdimmProtectionChange(Target* i_target, break; case ENCRYPTION_DISABLED: l_clr_encryption = true; + break; + case SEND_NV_STATUS: + // no action, just send status + break; } // Set the attribute and send it to the FSP if needed diff --git a/src/usr/isteps/nvdimm/runtime/nvdimm_rt.C b/src/usr/isteps/nvdimm/runtime/nvdimm_rt.C index 32c4dd18fe6..f22c7d33a42 100644 --- a/src/usr/isteps/nvdimm/runtime/nvdimm_rt.C +++ b/src/usr/isteps/nvdimm/runtime/nvdimm_rt.C @@ -1021,4 +1021,36 @@ bool nvDimmNvmCheckHealthStatusOnSystem() } // end nvDimmCheckHealthStatusOnSystem +/** + * @brief Send NV_STATUS to host + */ +void nvdimmSendNvStatus() +{ + // Send NV_STATUS for all nvdimms + TargetHandleList l_nvdimmTargetList; + nvdimm_getNvdimmList(l_nvdimmTargetList); + for (const auto & l_nvdimm : l_nvdimmTargetList) + { + errlHndl_t l_err = nullptr; + l_err = notifyNvdimmProtectionChange(l_nvdimm,SEND_NV_STATUS); + if (l_err) + { + errlCommit(l_err, NVDIMM_COMP_ID); + } + } +} + + +struct registerNvdimmRt +{ + registerNvdimmRt() + { + // Register function to call at end of RT init + postInitCalls_t * rt_post = getPostInitCalls(); + rt_post->callSendNvStatus = &nvdimmSendNvStatus; + } +}; + +registerNvdimmRt g_registerNvdimmRt; + } // end NVDIMM namespace