1fe270d35SAndrew Geissler #pragma once
2fe270d35SAndrew Geissler 
3fe270d35SAndrew Geissler #include "config.h"
4fe270d35SAndrew Geissler 
5fe270d35SAndrew Geissler #include "settings.hpp"
6fe270d35SAndrew Geissler #include "xyz/openbmc_project/State/Host/server.hpp"
7fe270d35SAndrew Geissler 
8fe270d35SAndrew Geissler #include <sdbusplus/bus.hpp>
9fe270d35SAndrew Geissler 
10fe270d35SAndrew Geissler namespace phosphor
11fe270d35SAndrew Geissler {
12fe270d35SAndrew Geissler namespace state
13fe270d35SAndrew Geissler {
14fe270d35SAndrew Geissler namespace manager
15fe270d35SAndrew Geissler {
16fe270d35SAndrew Geissler 
17fe270d35SAndrew Geissler using HypervisorInherit = sdbusplus::server::object::object<
18fe270d35SAndrew Geissler     sdbusplus::xyz::openbmc_project::State::server::Host>;
19fe270d35SAndrew Geissler 
20fe270d35SAndrew Geissler namespace server = sdbusplus::xyz::openbmc_project::State::server;
21*c74716e5SAndrew Geissler namespace sdbusRule = sdbusplus::bus::match::rules;
22fe270d35SAndrew Geissler 
23fe270d35SAndrew Geissler /** @class Host
24fe270d35SAndrew Geissler  *  @brief OpenBMC host state management implementation.
25fe270d35SAndrew Geissler  *  @details A concrete implementation for xyz.openbmc_project.State.Host
26fe270d35SAndrew Geissler  *  DBus API.
27fe270d35SAndrew Geissler  */
28fe270d35SAndrew Geissler class Hypervisor : public HypervisorInherit
29fe270d35SAndrew Geissler {
30fe270d35SAndrew Geissler   public:
31fe270d35SAndrew Geissler     Hypervisor() = delete;
32fe270d35SAndrew Geissler     Hypervisor(const Hypervisor&) = delete;
33fe270d35SAndrew Geissler     Hypervisor& operator=(const Hypervisor&) = delete;
34fe270d35SAndrew Geissler     Hypervisor(Hypervisor&&) = delete;
35fe270d35SAndrew Geissler     Hypervisor& operator=(Hypervisor&&) = delete;
36fe270d35SAndrew Geissler     virtual ~Hypervisor() = default;
37fe270d35SAndrew Geissler 
38fe270d35SAndrew Geissler     /** @brief Constructs Hypervisor State Manager
39fe270d35SAndrew Geissler      *
40fe270d35SAndrew Geissler      * @param[in] bus       - The Dbus bus object
41fe270d35SAndrew Geissler      * @param[in] objPath   - The Dbus object path
42fe270d35SAndrew Geissler      */
43fe270d35SAndrew Geissler     Hypervisor(sdbusplus::bus::bus& bus, const char* objPath) :
44*c74716e5SAndrew Geissler         HypervisorInherit(bus, objPath, false), bus(bus),
45*c74716e5SAndrew Geissler         bootProgressChangeSignal(
46*c74716e5SAndrew Geissler             bus,
47*c74716e5SAndrew Geissler             sdbusRule::propertiesChanged(
48*c74716e5SAndrew Geissler                 "/xyz/openbmc_project/state/host0",
49*c74716e5SAndrew Geissler                 "xyz.openbmc_project.State.Boot.Progress"),
50*c74716e5SAndrew Geissler             std::bind(std::mem_fn(&Hypervisor::bootProgressChangeEvent), this,
51*c74716e5SAndrew Geissler                       std::placeholders::_1))
52fe270d35SAndrew Geissler     {}
53fe270d35SAndrew Geissler 
54fe270d35SAndrew Geissler     /** @brief Set value of HostTransition */
55fe270d35SAndrew Geissler     server::Host::Transition
56fe270d35SAndrew Geissler         requestedHostTransition(server::Host::Transition value) override;
57fe270d35SAndrew Geissler 
58fe270d35SAndrew Geissler     /** @brief Set value of CurrentHostState */
59fe270d35SAndrew Geissler     server::Host::HostState
60fe270d35SAndrew Geissler         currentHostState(server::Host::HostState value) override;
61fe270d35SAndrew Geissler 
62*c74716e5SAndrew Geissler     /** @brief Return value of CurrentHostState */
63*c74716e5SAndrew Geissler     server::Host::HostState currentHostState();
64*c74716e5SAndrew Geissler 
65*c74716e5SAndrew Geissler     /** @brief Check if BootProgress change affects hypervisor state
66*c74716e5SAndrew Geissler      *
67*c74716e5SAndrew Geissler      * @param[in]  bootProgress     - BootProgress value to check
68*c74716e5SAndrew Geissler      *
69*c74716e5SAndrew Geissler      */
70*c74716e5SAndrew Geissler     void updateCurrentHostState(std::string& bootProgress);
71*c74716e5SAndrew Geissler 
72fe270d35SAndrew Geissler   private:
73*c74716e5SAndrew Geissler     /** @brief Process BootProgress property changes
74*c74716e5SAndrew Geissler      *
75*c74716e5SAndrew Geissler      * Instance specific interface to monitor for changes to the BootProgress
76*c74716e5SAndrew Geissler      * property which may impact Hypervisor state.
77*c74716e5SAndrew Geissler      *
78*c74716e5SAndrew Geissler      * @param[in]  msg              - Data associated with subscribed signal
79*c74716e5SAndrew Geissler      *
80*c74716e5SAndrew Geissler      */
81*c74716e5SAndrew Geissler     void bootProgressChangeEvent(sdbusplus::message::message& msg);
82*c74716e5SAndrew Geissler 
83fe270d35SAndrew Geissler     /** @brief Persistent sdbusplus DBus bus connection. */
84fe270d35SAndrew Geissler     sdbusplus::bus::bus& bus;
85*c74716e5SAndrew Geissler 
86*c74716e5SAndrew Geissler     /** @brief Watch BootProgress changes to know hypervisor state **/
87*c74716e5SAndrew Geissler     sdbusplus::bus::match_t bootProgressChangeSignal;
88fe270d35SAndrew Geissler };
89fe270d35SAndrew Geissler 
90fe270d35SAndrew Geissler } // namespace manager
91fe270d35SAndrew Geissler } // namespace state
92fe270d35SAndrew Geissler } // namespace phosphor
93