summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Kosenkov <NKosenkov@IBS.RU>2022-06-16 10:31:07 +0300
committerNikita Kosenkov <NKosenkov@IBS.RU>2022-06-16 10:31:07 +0300
commitbac7e5f73ddbbff6c256516c78f480bc140d680e (patch)
tree4a63db1187e6de93c9233fec609260db30635e7d
parent7f3171fcf898cdd84f617f4dd19b83d635f5693a (diff)
downloadopenbmc-bac7e5f73ddbbff6c256516c78f480bc140d680e.tar.xz
x86-power-control: add check BMC restart cause before starting power restore policy
-rw-r--r--meta-ibs/meta-cp2-5422/recipes-x86/chassis/x86-power-control/0001-x86-power-control-added-check-BMC-restart-cause.patch129
-rw-r--r--meta-ibs/meta-cp2-5422/recipes-x86/chassis/x86-power-control_%.bbappend1
2 files changed, 130 insertions, 0 deletions
diff --git a/meta-ibs/meta-cp2-5422/recipes-x86/chassis/x86-power-control/0001-x86-power-control-added-check-BMC-restart-cause.patch b/meta-ibs/meta-cp2-5422/recipes-x86/chassis/x86-power-control/0001-x86-power-control-added-check-BMC-restart-cause.patch
new file mode 100644
index 0000000000..33fee916b2
--- /dev/null
+++ b/meta-ibs/meta-cp2-5422/recipes-x86/chassis/x86-power-control/0001-x86-power-control-added-check-BMC-restart-cause.patch
@@ -0,0 +1,129 @@
+From 4a2780f77c5b1fb21cc89aa7437f22c66f51c3c3 Mon Sep 17 00:00:00 2001
+From: Nikita Kosenkov <NKosenkov@IBS.RU>
+Date: Thu, 16 Jun 2022 09:38:54 +0300
+Subject: [PATCH] x86-power-control: added check BMC restart cause for AlwaysOn
+ policy
+
+---
+ src/power_control.cpp | 81 +++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 79 insertions(+), 2 deletions(-)
+
+diff --git a/src/power_control.cpp b/src/power_control.cpp
+index 05aa45c..5535415 100644
+--- a/src/power_control.cpp
++++ b/src/power_control.cpp
+@@ -31,6 +31,7 @@
+ #include <filesystem>
+ #include <fstream>
+ #include <string_view>
++#include <regex>
+
+ namespace power_control
+ {
+@@ -857,6 +858,74 @@ void PersistentState::saveState()
+ appStateStream << stateData.dump(indentationSize);
+ }
+
++enum class BMCRestartCause
++{
++ power = 1, // After cold BMC boot
++ watchdog, // After warm BMC reboot
++ unknown // Unknown reboot cause
++};
++
++BMCRestartCause getBmcRestartCause()
++{
++ // U-boot write restart cause to bootargs
++ std::string cmdlineFilePath{"/proc/cmdline"};
++ std::ifstream cmdlineFile{cmdlineFilePath};
++ if(!cmdlineFile.is_open())
++ {
++ lg2::error("BMCRestartCause: cannot open {FILE}", "FILE",
++ cmdlineFilePath);
++
++ return BMCRestartCause::unknown;
++ }
++
++ // Read cmd line from file
++ std::stringstream cmdlineBuffer;
++ cmdlineBuffer << cmdlineFile.rdbuf();
++ cmdlineFile.close();
++
++ std::string cmdline{cmdlineBuffer.str()};
++ if(cmdline.size() == 0)
++ {
++ lg2::error("BMCRestartCause: file {FILE} is empty", "FILE",
++ cmdlineFilePath);
++
++ return BMCRestartCause::unknown;
++ }
++
++ // Parse cmdline with regex
++ std::smatch regexResult;
++ std::regex regexExpr("resetreason=((?:power|watchdog))");
++ if (!std::regex_search(cmdline, regexResult, regexExpr))
++ {
++ lg2::error("BMCRestartCause: error parse file {FILE}", "FILE",
++ cmdlineFilePath);
++
++ return BMCRestartCause::unknown;
++ }
++
++ // Initialize restart cause
++ BMCRestartCause bmcRestartCause = BMCRestartCause::unknown;
++
++ if(regexResult.ready())
++ {
++ // The second element is needed
++ // as it contains the result of the second capturing group
++ if(regexResult.str(1) == "power")
++ {
++ bmcRestartCause = BMCRestartCause::power;
++ }
++ else if (regexResult.str(1) == "watchdog")
++ {
++ bmcRestartCause = BMCRestartCause::watchdog;
++ }
++
++ lg2::info("BmcRestartCause: current BMC restart cause={CAUSE}", "CAUSE",
++ regexResult.str(1));
++ }
++
++ return bmcRestartCause;
++}
++
+ static constexpr char const* setingsService = "xyz.openbmc_project.Settings";
+ static constexpr char const* powerRestorePolicyObject =
+ "/xyz/openbmc_project/control/host0/power_restore_policy";
+@@ -1084,7 +1153,8 @@ void PowerRestoreController::invoke()
+ "xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOn")
+ {
+ sendPowerControlEvent(Event::powerOnRequest);
+- setRestartCauseProperty(getRestartCause(RestartCause::powerPolicyOn));
++ setRestartCauseProperty(
++ getRestartCause(RestartCause::powerPolicyOn));
+ }
+ else if (powerRestorePolicy ==
+ "xyz.openbmc_project.Control.Power.RestorePolicy.Policy.Restore")
+@@ -2773,10 +2843,17 @@ int main(int argc, char* argv[])
+ }
+ }
+ // Check if we need to start the Power Restore policy
+- if (powerState != PowerState::on)
++ // and check BMC restart cause and if the BMC is after
++ // a cold boot, then start power restore policy
++ if ((powerState != PowerState::on) &&
++ (getBmcRestartCause() == BMCRestartCause::power))
+ {
+ powerRestore.run();
+ }
++ else
++ {
++ lg2::info("Skip power restore policy.");
++ }
+
+ if (nmiOutLine)
+ nmiSourcePropertyMonitor();
+--
+2.35.1
+
diff --git a/meta-ibs/meta-cp2-5422/recipes-x86/chassis/x86-power-control_%.bbappend b/meta-ibs/meta-cp2-5422/recipes-x86/chassis/x86-power-control_%.bbappend
index d8a4104b65..2024d33987 100644
--- a/meta-ibs/meta-cp2-5422/recipes-x86/chassis/x86-power-control_%.bbappend
+++ b/meta-ibs/meta-cp2-5422/recipes-x86/chassis/x86-power-control_%.bbappend
@@ -1,6 +1,7 @@
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
SRC_URI:append = " \
file://power-config-host0.json \
+ file://0001-x86-power-control-added-check-BMC-restart-cause.patch \
"
RDEPENDS:${PN}:append = " bash"