Lines Matching +full:power +full:- +full:on +full:- +full:hours

2 // Copyright (c) 2018-2025 Intel Corporation
8 // http://www.apache.org/licenses/LICENSE-2.0
11 // distributed under the License is distributed on an "AS IS" BASIS,
19 #include <systemd/sd-journal.h>
28 #include <phosphor-logging/lg2.hpp>
46 static const std::string appName = "power-control";
97 // power control json config
163 // Time between off and on during a power cycle
169 // Time power OK assertion on power-on
171 // Time SIO power good assertion on power-on
173 // Time power-off state save for power loss tracking
181 // Map containing timers used for D-Bus get-property retries
214 conn->async_method_call( in beep()
261 osIface->set_property("OperatingSystemState", in setOperatingSystemState()
270 on, enumerator
286 case PowerState::on: in getPowerStateName()
287 return "On"; in getPowerStateName()
290 return "Wait for Power OK"; in getPowerStateName()
293 return "Wait for SIO Power Good"; in getPowerStateName()
305 return "Power Cycle Off"; in getPowerStateName()
308 return "Transition to Power Cycle Off"; in getPowerStateName()
311 return "Graceful Transition to Power Cycle Off"; in getPowerStateName()
358 return "power OK assert"; in getEventName()
361 return "power OK de-assert"; in getEventName()
364 return "SIO power good assert"; in getEventName()
367 return "SIO power good de-assert"; in getEventName()
373 return "SIO S5 de-assert"; in getEventName()
379 return "PLT_RST de-assert"; in getEventName()
385 return "POST Complete de-assert"; in getEventName()
388 return "power button pressed"; in getEventName()
394 return "power cycle timer expired"; in getEventName()
397 return "power OK watchdog timer expired"; in getEventName()
400 return "SIO power good watchdog timer expired"; in getEventName()
403 return "graceful power-off timer expired"; in getEventName()
406 return "power-on request"; in getEventName()
409 return "power-off request"; in getEventName()
412 return "power-cycle request"; in getEventName()
418 return "graceful power-off request"; in getEventName()
421 return "graceful power-cycle request"; in getEventName()
437 // Power state handlers
453 case PowerState::on: in getPowerStateHandler()
494 lg2::error("Failed to find handler for power state: {STATE}", "STATE", in sendPowerControlEvent()
519 case PowerState::on: in getHostState()
542 case PowerState::on: in getChassisState()
548 return "xyz.openbmc_project.State.Chassis.PowerState.On"; in getChassisState()
564 on, enumerator
572 case SlotPowerState::on: in getSlotState()
573 return "xyz.openbmc_project.State.Chassis.PowerState.On"; in getSlotState()
586 chassisSlotIface->set_property("CurrentPowerState", in setSlotPowerState()
588 chassisSlotIface->set_property("LastStateChangeTime", getCurrentTimeMs()); in setSlotPowerState()
602 lg2::error("Power-state save async_wait failed: {ERROR_MSG}", in savePowerState()
616 hostIface->set_property("CurrentHostState", in setPowerState()
619 chassisIface->set_property("CurrentPowerState", in setPowerState()
621 chassisIface->set_property("LastStateChangeTime", getCurrentTimeMs()); in setPowerState()
623 // Save the power state for the restore policy in setPowerState()
681 restartCauseIface->set_property("RestartCause", cause); in setRestartCauseProperty()
690 conn->async_method_call( in resetACBootProperty()
708 // Determine the actual restart cause based on the set of causes in setRestartCause()
753 "MESSAGE=PowerControl: system power good failed to assert (VR failure)", in systemPowerGoodFailedLog()
761 sd_journal_send("MESSAGE=PowerControl: power okay failed to assert", in powerOKFailedLog()
768 sd_journal_send("MESSAGE=PowerControl: power restore policy applied", in powerRestorePolicyLog()
775 sd_journal_send("MESSAGE=PowerControl: power button pressed", "PRIORITY=%i", in powerButtonPressLog()
803 // create the power control directory if it doesn't exist in PersistentState()
852 return val->get<std::string>(); in get()
894 "xyz.openbmc_project.Control.Power.RestorePolicy";
930 powerRestore->setProperties(properties); in powerRestoreConfigHandler()
941 powerRestore->setProperties(propertiesChanged); in powerRestoreConfigHandler()
974 // Check if it's already on DBus in run()
975 conn->async_method_call( in run()
988 // Check if it's already on DBus in run()
989 conn->async_method_call( in run()
1012 lg2::error("Unable to read Power Restore Policy"); in setProperties()
1022 lg2::error("Unable to read Power Restore Delay"); in setProperties()
1062 int delay = powerRestoreDelay - ubootSeconds; in invokeIfReady()
1067 delay -= info.uptime; in invokeIfReady()
1073 lg2::info("Power Restore delay of {DELAY} seconds started", "DELAY", in invokeIfReady()
1086 "power restore policy async_wait failed: {ERROR_MSG}", in invokeIfReady()
1091 lg2::info("Power Restore delay timer expired"); in invokeIfReady()
1106 // we want to run Power Restore only once in invoke()
1113 lg2::info("Invoking Power Restore Policy {POLICY}", "POLICY", in invoke()
1116 "xyz.openbmc_project.Control.Power.RestorePolicy.Policy.AlwaysOn") in invoke()
1122 "xyz.openbmc_project.Control.Power.RestorePolicy.Policy.Restore") in invoke()
1126 lg2::info("Power was dropped, restoring Host On state"); in invoke()
1133 lg2::info("No power drop, restoring Host Off state"); in invoke()
1136 // We're done with the previous power state for the restore policy, so store in invoke()
1144 return state == "xyz.openbmc_project.State.Chassis.PowerState.On"; in wasPowerDropped()
1159 // TODO: throw here to force power-control to in waitForGPIOEvent()
1283 return -1; in setGPIOOutputForMs()
1319 if (power_control::slotPowerState != power_control::SlotPowerState::on) in slotPowerOn()
1325 setSlotPowerState(SlotPowerState::on); in slotPowerOn()
1326 lg2::info("Slot Power is switched On\n"); in slotPowerOn()
1330 return -1; in slotPowerOn()
1335 lg2::info("Slot Power is already in 'On' state\n"); in slotPowerOn()
1336 return -1; in slotPowerOn()
1350 lg2::info("Slot Power is switched Off\n"); in slotPowerOff()
1354 return -1; in slotPowerOff()
1359 lg2::info("Slot Power is already in 'Off' state\n"); in slotPowerOff()
1360 return -1; in slotPowerOff()
1366 lg2::info("Slot Power Cycle started\n"); in slotPowerCycle()
1376 "Slot Power cycle timer async_wait failed: {ERROR_MSG}", in slotPowerCycle()
1379 lg2::info("Slot Power cycle timer canceled\n"); in slotPowerCycle()
1382 lg2::info("Slot Power cycle timer completed\n"); in slotPowerCycle()
1384 lg2::info("Slot Power Cycle Completed\n"); in slotPowerCycle()
1400 // If the force off timer expires, then the power-button override failed in forcePowerOff()
1408 lg2::error("Force power off async_wait failed: {ERROR_MSG}", in forcePowerOff()
1414 lg2::error("Power-button override failed. Not sure what to do now."); in forcePowerOff()
1425 lg2::info("Graceful power-off timer started"); in gracefulPowerOffTimerStart()
1435 lg2::error("Graceful power-off async_wait failed: {ERROR_MSG}", in gracefulPowerOffTimerStart()
1438 lg2::info("Graceful power-off timer canceled"); in gracefulPowerOffTimerStart()
1441 lg2::info("Graceful power-off timer completed"); in gracefulPowerOffTimerStart()
1448 lg2::info("Power-cycle timer started"); in powerCycleTimerStart()
1458 lg2::error("Power-cycle async_wait failed: {ERROR_MSG}", in powerCycleTimerStart()
1461 lg2::info("Power-cycle timer canceled"); in powerCycleTimerStart()
1464 lg2::info("Power-cycle timer completed"); in powerCycleTimerStart()
1471 lg2::info("power OK watchdog timer started"); in powerOKWatchdogTimerStart()
1481 lg2::error("power OK watchdog async_wait failed: {ERROR_MSG}", in powerOKWatchdogTimerStart()
1484 lg2::info("power OK watchdog timer canceled"); in powerOKWatchdogTimerStart()
1487 lg2::info("power OK watchdog timer expired"); in powerOKWatchdogTimerStart()
1518 // Set the time-out as 1 hour, to align with POH command in ipmid in pohCounterTimerStart()
1519 pohCounterTimer.expires_after(std::chrono::hours(1)); in pohCounterTimerStart()
1540 conn->async_method_call( in pohCounterTimerStart()
1556 conn->async_method_call( in pohCounterTimerStart()
1624 if (properties.begin()->first != "CurrentHostState") in currentHostStateMonitor()
1629 std::get_if<std::string>(&(properties.begin()->second)); in currentHostStateMonitor()
1633 properties.begin()->first); in currentHostStateMonitor()
1643 sd_journal_send("MESSAGE=Host system DC power is on", in currentHostStateMonitor()
1652 // when power state is changed to OFF. This resulted in in currentHostStateMonitor()
1663 sd_journal_send("MESSAGE=Host system DC power is off", in currentHostStateMonitor()
1673 lg2::info("SIO power good watchdog timer started"); in sioPowerGoodWatchdogTimerStart()
1685 "SIO power good watchdog async_wait failed: {ERROR_MSG}", in sioPowerGoodWatchdogTimerStart()
1688 lg2::info("SIO power good watchdog timer canceled"); in sioPowerGoodWatchdogTimerStart()
1691 lg2::info("SIO power good watchdog timer completed"); in sioPowerGoodWatchdogTimerStart()
1703 // DC power is unexpectedly lost, beep in powerStateOn()
1785 setPowerState(PowerState::on); in powerStateWaitForPowerOK()
1795 setPowerState(PowerState::on); in powerStateWaitForPowerOK()
1810 setPowerState(PowerState::on); in powerStateWaitForSIOPowerGood()
1836 setPowerState(PowerState::on); in powerStateOff()
1845 setPowerState(PowerState::on); in powerStateOff()
1888 setPowerState(PowerState::on); in powerStateGracefulTransitionToOff()
1902 setPowerState(PowerState::on); in powerStateGracefulTransitionToOff()
1926 setPowerState(PowerState::on); in powerStateCycleOff()
1979 setPowerState(PowerState::on); in powerStateGracefulTransitionToCycleOff()
1993 setPowerState(PowerState::on); in powerStateGracefulTransitionToCycleOff()
2012 setPowerState(PowerState::on); in powerStateCheckForWarmReset()
2017 // DC power is unexpectedly lost, beep in powerStateCheckForWarmReset()
2059 powerButtonIface->set_property("ButtonPressed", asserted); in powerButtonHandler()
2070 lg2::info("power button press masked"); in powerButtonHandler()
2079 lg2::error("{GPIO_NAME} power button passthrough failed", "GPIO_NAME", in powerButtonHandler()
2088 resetButtonIface->set_property("ButtonPressed", asserted); in resetButtonHandler()
2118 static constexpr auto systemTargetName = "chassis-system-reset.target";
2122 conn->async_method_call( in systemReset()
2137 conn->async_method_call( in nmiSetEnableProperty()
2203 if (propertiesChanged.begin()->first == "Enabled") in nmiSourcePropertyMonitor()
2206 std::get<bool>(propertiesChanged.begin()->second); in nmiSourcePropertyMonitor()
2228 conn->async_method_call( in setNmiSource()
2256 nmiButtonIface->set_property("ButtonPressed", asserted); in nmiButtonHandler()
2274 idButtonIface->set_property("ButtonPressed", asserted); in idButtonHandler()
2342 "/usr/share/x86-power-control/power-config-host" + power_control::node + in loadConfigValues()
2349 return -1; in loadConfigValues()
2355 lg2::error("Power config readings JSON parser failure"); in loadConfigValues()
2356 return -1; in loadConfigValues()
2368 return -1; in loadConfigValues()
2378 "{GPIO_NAME} is not a recognized power-control signal name", in loadConfigValues()
2380 return -1; in loadConfigValues()
2383 // assign the power signal name to the corresponding structure reference in loadConfigValues()
2386 tempGpioData = signalMapIter->second; in loadConfigValues()
2387 tempGpioData->name = gpioName; in loadConfigValues()
2392 return -1; in loadConfigValues()
2398 tempGpioData->type = ConfigType::GPIO; in loadConfigValues()
2402 tempGpioData->type = ConfigType::DBUS; in loadConfigValues()
2406 lg2::error("{TYPE} is not a recognized power-control signal type", in loadConfigValues()
2408 return -1; in loadConfigValues()
2411 if (tempGpioData->type == ConfigType::GPIO) in loadConfigValues()
2415 tempGpioData->lineName = gpioConfig["LineName"]; in loadConfigValues()
2421 return -1; in loadConfigValues()
2428 tempGpioData->polarity = false; in loadConfigValues()
2432 tempGpioData->polarity = true; in loadConfigValues()
2439 return -1; in loadConfigValues()
2445 "GPIO_NAME", tempGpioData->lineName); in loadConfigValues()
2446 return -1; in loadConfigValues()
2460 return -1; in loadConfigValues()
2463 tempGpioData->dbusName = in loadConfigValues()
2465 tempGpioData->path = gpioConfig[dbusParams[DbusConfigType::path]]; in loadConfigValues()
2466 tempGpioData->interface = in loadConfigValues()
2468 tempGpioData->lineName = in loadConfigValues()
2471 // dbus-based inputs must be active-high. in loadConfigValues()
2472 tempGpioData->polarity = true; in loadConfigValues()
2480 tempGpioData->matchRegex = std::regex(*item); in loadConfigValues()
2486 return -1; in loadConfigValues()
2526 event = propertiesChanged.begin()->first; in getMessageValue()
2532 return std::get<T>(propertiesChanged.begin()->second); in getMessageValue()
2594 // D-Bus property read functions
2603 auto method = conn->new_method_call( in getProperty()
2609 auto reply = conn->call(method); in getProperty()
2613 "Error reading {PROPERTY} D-Bus property on interface {INTERFACE} and path {PATH}", in getProperty()
2616 return -1; in getProperty()
2626 return -1; in getProperty()
2632 lg2::error("Error: {PROPERTY} D-Bus property is not the expected type", in getProperty()
2634 return -1; in getProperty()
2643 powerState = (initialValue ? PowerState::on : PowerState::off); in setInitialValue()
2644 hostIface->set_property("CurrentHostState", in setInitialValue()
2649 powerButtonIface->set_property("ButtonPressed", !initialValue); in setInitialValue()
2653 resetButtonIface->set_property("ButtonPressed", !initialValue); in setInitialValue()
2657 nmiButtonIface->set_property("ButtonPressed", !initialValue); in setInitialValue()
2661 idButtonIface->set_property("ButtonPressed", !initialValue); in setInitialValue()
2696 auto& timer = item->second; in reschedulePropertyRead()
2735 lg2::info("Start Chassis power control service for host : {NODE}", "NODE", in main()
2741 if (loadConfigValues() == -1) in main()
2754 conn->request_name(hostDbusName.c_str()); in main()
2755 conn->request_name(chassisDbusName.c_str()); in main()
2756 conn->request_name(osDbusName.c_str()); in main()
2757 conn->request_name(buttonDbusName.c_str()); in main()
2758 conn->request_name(nmiDbusName.c_str()); in main()
2759 conn->request_name(rstCauseDbusName.c_str()); in main()
2770 conn->request_name(hostDbusName.c_str()); in main()
2771 conn->request_name(chassisDbusName.c_str()); in main()
2772 conn->request_name(osDbusName.c_str()); in main()
2773 conn->request_name(buttonDbusName.c_str()); in main()
2774 conn->request_name(nmiDbusName.c_str()); in main()
2775 conn->request_name(rstCauseDbusName.c_str()); in main()
2784 // Request power OK GPIO events in main()
2790 return -1; in main()
2801 return -1; in main()
2813 return -1; in main()
2826 return -1; in main()
2836 return -1; in main()
2849 return -1; in main()
2858 return -1; in main()
2869 return -1; in main()
2879 return -1; in main()
2895 return -1; in main()
2949 return -1; in main()
2962 return -1; in main()
2979 return -1; in main()
2985 return -1; in main()
2993 return -1; in main()
2999 return -1; in main()
3004 // Initialize the power state and operating system state in main()
3007 // Check power good in main()
3015 powerState = PowerState::on; in main()
3022 powerState = PowerState::on; in main()
3025 // Check if we need to start the Power Restore policy in main()
3026 if (powerState != PowerState::on) in main()
3034 lg2::info("Initializing power state."); in main()
3037 // Power Control Service in main()
3041 // Power Control Interface in main()
3046 hostIface->register_property( in main()
3052 // if power button is masked, ignore this in main()
3060 lg2::info("Power Button Masked."); in main()
3066 "xyz.openbmc_project.State.Host.Transition.On") in main()
3068 // if power button is masked, ignore this in main()
3076 lg2::info("Power Button Masked."); in main()
3084 // if power button is masked, ignore this in main()
3092 lg2::info("Power Button Masked."); in main()
3140 hostIface->register_property("CurrentHostState", in main()
3143 hostIface->initialize(); in main()
3154 chassisIface->register_property( in main()
3160 // if power button is masked, ignore this in main()
3168 lg2::info("Power Button Masked."); in main()
3174 "xyz.openbmc_project.State.Chassis.Transition.On") in main()
3176 // if power button is masked, ignore this in main()
3184 lg2::info("Power Button Masked."); in main()
3192 // if power button is masked, ignore this in main()
3200 lg2::info("Power Button Masked."); in main()
3214 chassisIface->register_property("CurrentPowerState", in main()
3216 chassisIface->register_property("LastStateChangeTime", getCurrentTimeMs()); in main()
3218 chassisIface->initialize(); in main()
3230 chassisSysIface->register_property( in main()
3232 std::string("xyz.openbmc_project.State.Chassis.Transition.On"), in main()
3250 chassisSysIface->register_property( in main()
3252 chassisSysIface->register_property("LastStateChangeTime", in main()
3255 chassisSysIface->initialize(); in main()
3261 return -1; in main()
3267 slotPowerState = SlotPowerState::on; in main()
3273 chassisSlotIface->register_property( in main()
3275 std::string("xyz.openbmc_project.State.Chassis.Transition.On"), in main()
3278 "xyz.openbmc_project.State.Chassis.Transition.On") in main()
3304 chassisSlotIface->register_property( in main()
3306 chassisSlotIface->register_property("LastStateChangeTime", in main()
3308 chassisSlotIface->initialize(); in main()
3317 // Power Button Interface in main()
3319 "/xyz/openbmc_project/chassis/buttons/power", in main()
3322 powerButtonIface->register_property( in main()
3337 lg2::info("Power Button Masked."); in main()
3345 lg2::info("Power Button Un-masked"); in main()
3353 // Check power button state in main()
3364 powerButtonIface->register_property("ButtonPressed", in main()
3367 powerButtonIface->initialize(); in main()
3378 resetButtonIface->register_property( in main()
3401 lg2::info("Reset Button Un-masked"); in main()
3420 resetButtonIface->register_property("ButtonPressed", in main()
3423 resetButtonIface->initialize(); in main()
3433 nmiButtonIface->register_property( in main()
3447 lg2::info("NMI Button Un-masked."); in main()
3466 nmiButtonIface->register_property("ButtonPressed", nmiButtonPressed); in main()
3468 nmiButtonIface->initialize(); in main()
3481 nmiOutIface->register_method("NMI", nmiReset); in main()
3482 nmiOutIface->initialize(); in main()
3503 idButtonIface->register_property("ButtonPressed", idButtonPressed); in main()
3505 idButtonIface->initialize(); in main()
3517 // Get the initial OS state based on POST complete in main()
3519 // De-Asserted, OS state is "Inactive" in main()
3534 osIface->register_property( in main()
3538 osIface->initialize(); in main()
3549 restartCauseIface->register_property( in main()
3553 restartCauseIface->register_property( in main()
3575 restartCauseIface->initialize(); in main()
3581 // Set to indicate BMC's power control module is ready to take in main()
3587 return -1; in main()