From bac7e5f73ddbbff6c256516c78f480bc140d680e Mon Sep 17 00:00:00 2001 From: Nikita Kosenkov Date: Thu, 16 Jun 2022 10:31:07 +0300 Subject: x86-power-control: add check BMC restart cause before starting power restore policy --- ...wer-control-added-check-BMC-restart-cause.patch | 129 +++++++++++++++++++++ .../chassis/x86-power-control_%.bbappend | 1 + 2 files changed, 130 insertions(+) create mode 100644 meta-ibs/meta-cp2-5422/recipes-x86/chassis/x86-power-control/0001-x86-power-control-added-check-BMC-restart-cause.patch 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 +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 + #include + #include ++#include + + 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" -- cgit v1.2.3