blob: d0fd1939b78d7a237dce7bceb16c49a1b0bae25f [file] [log] [blame]
Andrew Geisslerfe270d32021-01-27 14:06:46 -06001#include "config.h"
2
3#include "hypervisor_state_manager.hpp"
4
Andrew Geisslerfe270d32021-01-27 14:06:46 -06005#include <phosphor-logging/elog-errors.hpp>
Andrew Geissler8ffdb262021-09-20 15:25:19 -05006#include <phosphor-logging/lg2.hpp>
Andrew Geisslerfe270d32021-01-27 14:06:46 -06007#include <sdbusplus/exception.hpp>
8#include <sdbusplus/server.hpp>
9
10#include <fstream>
11#include <iostream>
12#include <map>
13#include <string>
14
15namespace phosphor
16{
17namespace state
18{
19namespace manager
20{
21
Andrew Geissler8ffdb262021-09-20 15:25:19 -050022PHOSPHOR_LOG2_USING;
23
Andrew Geisslerfe270d32021-01-27 14:06:46 -060024// When you see server:: you know we're referencing our base class
25namespace server = sdbusplus::xyz::openbmc_project::State::server;
26using namespace phosphor::logging;
Andrew Geisslerfe270d32021-01-27 14:06:46 -060027
28server::Host::Transition Hypervisor::requestedHostTransition(Transition value)
29{
Andrew Geissler8ffdb262021-09-20 15:25:19 -050030 info("Hypervisor state transition request of {TRAN_REQUEST}",
31 "TRAN_REQUEST", value);
Andrew Geisslerfe270d32021-01-27 14:06:46 -060032
33 // Only support the transition to On
34 if (value != server::Host::Transition::On)
35 {
Andrew Geissler8ffdb262021-09-20 15:25:19 -050036 error("Hypervisor state only supports a transition to On");
Andrew Geisslerfe270d32021-01-27 14:06:46 -060037 // TODO raise appropriate error exception
38 return server::Host::Transition::Off;
39 }
40
41 // This property is monitored by a separate application (for example PLDM)
42 // which is responsible for propagating the On request to the hypervisor
43
44 return server::Host::requestedHostTransition(value);
45}
46
Andrew Geisslerfe270d32021-01-27 14:06:46 -060047server::Host::HostState Hypervisor::currentHostState(HostState value)
48{
Andrew Geissler8ffdb262021-09-20 15:25:19 -050049 info("Change to Hypervisor State: {HYP_STATE}", "HYP_STATE", value);
Andrew Geisslerfe270d32021-01-27 14:06:46 -060050 return server::Host::currentHostState(value);
51}
52
Andrew Geisslerc74716e2021-02-09 15:11:10 -060053server::Host::HostState Hypervisor::currentHostState()
54{
55 return server::Host::currentHostState();
56}
57
58void Hypervisor::updateCurrentHostState(std::string& bootProgress)
59{
Andrew Geissler8ffdb262021-09-20 15:25:19 -050060 debug("New BootProgress: {BOOTPROGRESS}", "BOOTPROGRESS", bootProgress);
Andrew Geisslerc74716e2021-02-09 15:11:10 -060061
62 if (bootProgress == "xyz.openbmc_project.State.Boot.Progress."
63 "ProgressStages.SystemInitComplete")
64 {
65 currentHostState(server::Host::HostState::Standby);
66 }
67 else if (bootProgress == "xyz.openbmc_project.State.Boot.Progress."
68 "ProgressStages.OSStart")
69 {
70 currentHostState(server::Host::HostState::TransitioningToRunning);
71 }
72 else if (bootProgress == "xyz.openbmc_project.State.Boot.Progress."
73 "ProgressStages.OSRunning")
74 {
75 currentHostState(server::Host::HostState::Running);
76 }
Andrew Geissler75f38ee2021-02-10 13:50:21 -060077 else if (bootProgress == "xyz.openbmc_project.State.Boot.Progress."
78 "ProgressStages.Unspecified")
79 {
80 // Unspecified is set when the system is powered off so
81 // set the state to off and reset the requested host state
82 // back to its default
83 currentHostState(server::Host::HostState::Off);
84 server::Host::requestedHostTransition(server::Host::Transition::Off);
85 }
Andrew Geisslerc74716e2021-02-09 15:11:10 -060086 else
87 {
88 // BootProgress changed and it is not one of the above so
89 // set hypervisor state to off
90 currentHostState(server::Host::HostState::Off);
91 }
92}
93
94void Hypervisor::bootProgressChangeEvent(sdbusplus::message::message& msg)
95{
96 std::string statusInterface;
97 std::map<std::string, std::variant<std::string>> msgData;
98 msg.read(statusInterface, msgData);
99
100 auto propertyMap = msgData.find("BootProgress");
101 if (propertyMap != msgData.end())
102 {
103 // Extract the BootProgress
104 auto& bootProgress = std::get<std::string>(propertyMap->second);
105 updateCurrentHostState(bootProgress);
106 }
107}
108
Andrew Geisslerfe270d32021-01-27 14:06:46 -0600109} // namespace manager
110} // namespace state
111} // namespace phosphor