discover_system_state: apply power restore delay
Introduce option `apply-power-policy-bmc-ready` to control power
restore policy application timing. When enabled (default), BMC
waits until BMC_READY before applying power policy. When disabled,
BMC waits for the PowerRestoreDelay before applying power policy.
This change maintains backward compatibility while allowing more
flexible power restoration behavior.
Tested:
1) PSM builds fine
2) When `apply-power-policy-bmc-ready` is disabled,
discovery_system_state waits for PowerRestoreDelay as specified by
the user.
Change-Id: Ib2381612bdb8cb6960f126228d25d8d43fed1d92
Signed-off-by: Prithvi Pai <ppai@nvidia.com>
diff --git a/discover_system_state.cpp b/discover_system_state.cpp
index cadaedd..f6542ef 100644
--- a/discover_system_state.cpp
+++ b/discover_system_state.cpp
@@ -175,7 +175,11 @@
info(
"power_policy=ALWAYS_POWER_ON, powering host on ({DELAY}s delay)",
"DELAY", powerRestoreDelaySec.count());
+#ifdef APPLY_POWER_POLICY_WHEN_BMC_READY
utils::waitBmcReady(bus, powerRestoreDelaySec);
+#else
+ std::this_thread::sleep_for(powerRestoreDelayUsec);
+#endif
phosphor::state::manager::utils::setProperty(
bus, hostPath, HostState::interface, "RestartCause",
convertForMessage(
@@ -201,7 +205,11 @@
info(
"power_policy=ALWAYS_POWER_OFF, set requested state to off ({DELAY}s delay)",
"DELAY", powerRestoreDelaySec.count());
+#ifdef APPLY_POWER_POLICY_WHEN_BMC_READY
utils::waitBmcReady(bus, powerRestoreDelaySec);
+#else
+ std::this_thread::sleep_for(powerRestoreDelayUsec);
+#endif
// Read last requested state and re-request it to execute it
auto hostReqState = phosphor::state::manager::utils::getProperty(
bus, hostPath, HostState::interface, "RequestedHostTransition");
@@ -219,7 +227,11 @@
{
info("power_policy=RESTORE, restoring last state ({DELAY}s delay)",
"DELAY", powerRestoreDelaySec.count());
+#ifdef APPLY_POWER_POLICY_WHEN_BMC_READY
utils::waitBmcReady(bus, powerRestoreDelaySec);
+#else
+ std::this_thread::sleep_for(powerRestoreDelayUsec);
+#endif
// Read last requested state and re-request it to execute it
auto hostReqState = phosphor::state::manager::utils::getProperty(
bus, hostPath, HostState::interface, "RequestedHostTransition");
diff --git a/meson.build b/meson.build
index d51a86f..e9e5729 100644
--- a/meson.build
+++ b/meson.build
@@ -77,6 +77,10 @@
add_project_arguments('-DENABLE_FORCE_WARM_REBOOT', language: 'cpp')
endif
+if (get_option('apply-power-policy-bmc-ready').allowed())
+ add_project_arguments('-DAPPLY_POWER_POLICY_WHEN_BMC_READY', language: 'cpp')
+endif
+
nlohmann_json_dep = dependency('nlohmann_json', include_type: 'system')
sdbusplus = dependency('sdbusplus')
sdeventplus = dependency('sdeventplus')
diff --git a/meson.options b/meson.options
index 73d9e71..b4e1ad4 100644
--- a/meson.options
+++ b/meson.options
@@ -146,3 +146,10 @@
value: 'enabled',
description: 'Only do transition request when no firmware being updated',
)
+
+option(
+ 'apply-power-policy-bmc-ready',
+ type: 'feature',
+ value: 'enabled',
+ description: 'Apply the Power policy right after BMC_READY',
+)