diff options
author | Nikita Kosenkov <NKosenkov@IBS.RU> | 2022-06-16 10:31:07 +0300 |
---|---|---|
committer | Nikita Kosenkov <NKosenkov@IBS.RU> | 2022-06-16 10:31:07 +0300 |
commit | bac7e5f73ddbbff6c256516c78f480bc140d680e (patch) | |
tree | 4a63db1187e6de93c9233fec609260db30635e7d /meta-ibs | |
parent | 7f3171fcf898cdd84f617f4dd19b83d635f5693a (diff) | |
download | openbmc-bac7e5f73ddbbff6c256516c78f480bc140d680e.tar.xz |
x86-power-control: add check BMC restart cause before starting power restore policy
Diffstat (limited to 'meta-ibs')
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" |