1d6fe3150SAndrew Geissler# Phosphor State Manager Documentation 2d6fe3150SAndrew Geissler 3d6fe3150SAndrew GeisslerThis repository contains the software responsible for tracking and controlling 4d6fe3150SAndrew Geisslerthe state of different objects within OpenBMC. This currently includes the 5d6fe3150SAndrew GeisslerBMC, Chassis, and Host. The most critical feature of phosphor-state-manager 6d6fe3150SAndrew Geisslersoftware is its support for requests to power on and off the system by the user. 7d6fe3150SAndrew Geissler 8d6fe3150SAndrew GeisslerThis software also enforces any restore policy (i.e. auto power on system after 9d6fe3150SAndrew Geisslera system power event or bmc reset) and ensures its states are updated correctly 10d6fe3150SAndrew Geisslerin situations where the BMC is rebooted and the chassis or host are in 11d6fe3150SAndrew Geissleron/running states. 12d6fe3150SAndrew Geissler 13d6fe3150SAndrew GeisslerThis repository also provides a command line tool, obmcutil, which provides 14d6fe3150SAndrew Geisslerbasic command line support to query and control phosphor-state-manager 15d6fe3150SAndrew Geisslerapplications running within an OpenBMC system. This tool itself runs within an 16d6fe3150SAndrew GeisslerOpenBMC system and utilizes D-Bus APIs. These D-Bus APIs are used for 17d6fe3150SAndrew Geisslerdevelopment and debug and are not intended for end users. 18d6fe3150SAndrew Geissler 19d6fe3150SAndrew GeisslerAs with all OpenBMC applications, interfaces and properties within 20d6fe3150SAndrew Geisslerphosphor-state-manager are D-Bus interfaces. These interfaces are then used 21d6fe3150SAndrew Geisslerby external interface protocols, such as Redfish and IPMI, to report and 22d6fe3150SAndrew Geisslercontrol state to/by the end user. 23d6fe3150SAndrew Geissler 24d6fe3150SAndrew Geissler## State Tracking and Control 25d6fe3150SAndrew Geissler 26d6fe3150SAndrew Geisslerphosphor-state-manager makes extensive use of systemd. There is a writeup 27d6fe3150SAndrew Geissler[here][1] with an overview of systemd and its use by OpenBMC. 28d6fe3150SAndrew Geissler 29d6fe3150SAndrew Geisslerphosphor-state-manager follows some basics design guidelines in its 30d6fe3150SAndrew Geisslerimplementation and use of systemd: 31d6fe3150SAndrew Geissler- Keep the different objects as independent as possible (host, chassis, bmc) 32d6fe3150SAndrew Geissler- Use systemd targets for everything and keep the code within 33d6fe3150SAndrew Geissler phosphor-state-manager minimal 34d6fe3150SAndrew Geissler- Ensure it can support required external interfaces, but don't necessarily 35d6fe3150SAndrew Geissler create 1x1 mappings otherwise every external interface will end up with its 36d6fe3150SAndrew Geissler own special chassis or host state request 37d6fe3150SAndrew Geissler- If something like a hard power off can be done by just turning off the 38d6fe3150SAndrew Geissler chassis, don't provide a command in the host to do the same thing 39d6fe3150SAndrew Geissler 40d6fe3150SAndrew Geisslerphosphor-state-manager implements states and state requests as defined in 41d6fe3150SAndrew Geisslerphosphor-dbus-interfaces for each object it supports. 42d6fe3150SAndrew Geissler- [bmc][2]: The BMC has very minimal states. It is `Ready` once all services 43d6fe3150SAndrew Geissler within the default.target have executed. The only state change request you 44d6fe3150SAndrew Geissler can make of the BMC is for it to reboot itself. 45d6fe3150SAndrew Geissler - CurrentBMCState: NotReady, Ready 46d6fe3150SAndrew Geissler - RequestedBMCTransition: Reboot 47d6fe3150SAndrew Geissler- [chassis][3]: The chassis represents the physical hardware in which the system 48d6fe3150SAndrew Geissler is contained. It usually has the power supplies, fans, and other hardware 49d6fe3150SAndrew Geissler associated with it. It can be either `On` or `Off`. 50d6fe3150SAndrew Geissler - CurrentPowerState: On, Off 51d6fe3150SAndrew Geissler - RequestedPowerTransition: On, Off 52d6fe3150SAndrew Geissler- [host][4]: The host represents the software running on the system. In most 53d6fe3150SAndrew Geissler cases this is an operating system of some sort. The host can be `Off`, 54c9844634SAndrew Geissler `Running`, `Quiesced`(error condition), or in `DiagnosticMode`(collecting 55c9844634SAndrew Geissler diagnostic data for a failure) 56c9844634SAndrew Geissler - CurrentHostState: Off, Running, Quiesced, DiagnosticMode 57c9844634SAndrew Geissler - RequestedHostTransition: Off, On, Reboot, GracefulWarmReboot, 58c9844634SAndrew Geissler ForceWarmReboot 59d6fe3150SAndrew Geissler 60d6fe3150SAndrew GeisslerAs noted above, phosphor-state-manager provides a command line tool, 61d6fe3150SAndrew Geissler[obmcutil][5], which takes a `state` parameter. This will use D-Bus commands to 62d6fe3150SAndrew Geisslerretrieve the above states and present them to the user. It also provides other 63d6fe3150SAndrew Geisslercommands which will send the appropriate D-Bus commands to the above properties 64d6fe3150SAndrew Geisslerto power on/off the chassis and host (see `obmcutil --help` within an OpenBMC 65d6fe3150SAndrew Geisslersystem). 66d6fe3150SAndrew Geissler 67d6fe3150SAndrew GeisslerThe above objects also implement other D-Bus objects like power on hours, boot 68d6fe3150SAndrew Geisslerprogress, reboot attempts, and operating system status. These D-Bus objects are 69d6fe3150SAndrew Geissleralso defined out in the phosphor-dbus-interfaces repository. 70d6fe3150SAndrew Geissler 71d6fe3150SAndrew Geissler## Restore Policy on Power Events 72d6fe3150SAndrew Geissler 73d6fe3150SAndrew GeisslerThe [RestorePolicy][6] defines the behavior the user wants when the BMC is 74d6fe3150SAndrew Geisslerreset. If the chassis or host is on/running then this service will not run. 75d6fe3150SAndrew GeisslerIf they are off then the `RestorePolicy` will be read and executed by 76d6fe3150SAndrew Geisslerphosphor-state-manager code. 77d6fe3150SAndrew Geissler 78d6fe3150SAndrew Geissler## BMC Reset with Host and/or Chassis On 79d6fe3150SAndrew Geissler 80d6fe3150SAndrew GeisslerIn situations where the BMC is reset and the chassis and host are on and 81d6fe3150SAndrew Geisslerrunning, its critical that the BMC software do two things: 82d6fe3150SAndrew Geissler- Never impact the state of the system (causing a power off of a running system 83d6fe3150SAndrew Geissleris very bad) 84d6fe3150SAndrew Geissler- Ensure the BMC, Chassis, and Host states accurately represent the state of the 85d6fe3150SAndrew Geisslersystem. 86d6fe3150SAndrew Geissler 87d6fe3150SAndrew GeisslerNote that some of this logic is provided via service files in system-specific 88d6fe3150SAndrew Geisslermeta layers. That is because the logic to determine if the chassis is on or 89d6fe3150SAndrew Geisslerif the host is running can vary from system to system. The requirement to 90d6fe3150SAndrew Geisslercreate the files defined below and ensure the common targets go active is a 91d6fe3150SAndrew Geisslermust for anyone wishing to enable this feature. 92d6fe3150SAndrew Geissler 93d6fe3150SAndrew Geisslerphosphor-state-manager discovers state vs. trying to cache and save states. This 94d6fe3150SAndrew Geisslerensure it's always getting the most accurate state information. It discovers the 95d6fe3150SAndrew Geisslerchassis state by checking the `pgood` value from the power application. If it 96d6fe3150SAndrew Geisslerdetermines that power is on then it will do the following: 97d6fe3150SAndrew Geissler- Create a file called /run/openbmc/chassis@0-on 98d6fe3150SAndrew Geissler - The presence of this file tells the services to alter their behavior because 99d6fe3150SAndrew Geissler the chassis is already powered on 100d6fe3150SAndrew Geissler- Start the obmc-chassis-poweron@0.target 101d6fe3150SAndrew Geissler - The majority of services in this target will "fake start" due to the file 102d6fe3150SAndrew Geissler being present. They will report to systemd that they started and ran 103d6fe3150SAndrew Geissler successfully but they actually do nothing. This is what you would want in 104d6fe3150SAndrew Geissler this case. Power is already on so you don't want to run the services to turn 105d6fe3150SAndrew Geissler power on. You do want to get the obmc-chassis-poweron@0.target in the Active 106d6fe3150SAndrew Geissler state though so that the chassis object within phosphor-state-manager will 107d6fe3150SAndrew Geissler correctly report that the chassis is `On` 108d6fe3150SAndrew Geissler- Start a service to check if the host is on 109d6fe3150SAndrew Geissler 110*4a4c1a69SAndrew GeisslerThe chassis@0-on file is removed once the obmc-chassis-poweron@0.target becomes 111*4a4c1a69SAndrew Geissleractive (i.e. all service have been successfully started which are wanted or 112*4a4c1a69SAndrew Geisslerrequired by this target). 113d6fe3150SAndrew Geissler 114d6fe3150SAndrew GeisslerThe logic to check if the host is on sends a command to the host, and if a 115d6fe3150SAndrew Geisslerresponse is received then similar logic to chassis is done: 116d6fe3150SAndrew Geissler- Create a file called /run/openbmc/host@0-on 117d6fe3150SAndrew Geissler- Start the obmc-host-start@0.target 118d6fe3150SAndrew Geissler - Similar to above, most services will not run due to the file being created 119d6fe3150SAndrew Geissler and their service files implementing a 120d6fe3150SAndrew Geissler "ConditionPathExists=!/run/openbmc/host@0-request" 121d6fe3150SAndrew Geissler 122*4a4c1a69SAndrew GeisslerThe host@0-on file is removed once the obmc-host-start@0.target and 123*4a4c1a69SAndrew Geisslerobmc-host-startmin@0.target become active (i.e. all service have been 124*4a4c1a69SAndrew Geisslersuccessfully started which are wanted or required by these targets). 125d6fe3150SAndrew Geissler 126d6fe3150SAndrew Geissler## Building the Code 127d6fe3150SAndrew Geissler``` 1284640d48eSAndrew GeisslerTo build this package, do the following steps: 1294640d48eSAndrew Geissler 1304640d48eSAndrew Geissler 1. meson build 1314640d48eSAndrew Geissler 2. ninja -C build 1324640d48eSAndrew Geissler 1334640d48eSAndrew GeisslerTo clean the repository again run `rm -rf build`. 134d6fe3150SAndrew Geissler``` 135d6fe3150SAndrew Geissler 136a6e7bbf0SGunnar Mills[1]: https://github.com/openbmc/docs/blob/master/architecture/openbmc-systemd.md 137d6fe3150SAndrew Geissler[2]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/State/BMC.interface.yaml 138d6fe3150SAndrew Geissler[3]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/State/Chassis.interface.yaml 139d6fe3150SAndrew Geissler[4]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/State/Host.interface.yaml 140d6fe3150SAndrew Geissler[5]: https://github.com/openbmc/phosphor-state-manager/blob/master/obmcutil 141d6fe3150SAndrew Geissler[6]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Control/Power/RestorePolicy.interface.yaml 142