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;
21c74716e5SAndrew 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*76070747SPatrick Williams         HypervisorInherit(bus, objPath,
45*76070747SPatrick Williams                           HypervisorInherit::action::emit_object_added),
46*76070747SPatrick Williams         bus(bus),
47c74716e5SAndrew Geissler         bootProgressChangeSignal(
48c74716e5SAndrew Geissler             bus,
49c74716e5SAndrew Geissler             sdbusRule::propertiesChanged(
50c74716e5SAndrew Geissler                 "/xyz/openbmc_project/state/host0",
51c74716e5SAndrew Geissler                 "xyz.openbmc_project.State.Boot.Progress"),
52c74716e5SAndrew Geissler             std::bind(std::mem_fn(&Hypervisor::bootProgressChangeEvent), this,
53c74716e5SAndrew Geissler                       std::placeholders::_1))
54fe270d35SAndrew Geissler     {}
55fe270d35SAndrew Geissler 
56fe270d35SAndrew Geissler     /** @brief Set value of HostTransition */
57fe270d35SAndrew Geissler     server::Host::Transition
58fe270d35SAndrew Geissler         requestedHostTransition(server::Host::Transition value) override;
59fe270d35SAndrew Geissler 
60fe270d35SAndrew Geissler     /** @brief Set value of CurrentHostState */
61fe270d35SAndrew Geissler     server::Host::HostState
62fe270d35SAndrew Geissler         currentHostState(server::Host::HostState value) override;
63fe270d35SAndrew Geissler 
64c74716e5SAndrew Geissler     /** @brief Return value of CurrentHostState */
65c74716e5SAndrew Geissler     server::Host::HostState currentHostState();
66c74716e5SAndrew Geissler 
67c74716e5SAndrew Geissler     /** @brief Check if BootProgress change affects hypervisor state
68c74716e5SAndrew Geissler      *
69c74716e5SAndrew Geissler      * @param[in]  bootProgress     - BootProgress value to check
70c74716e5SAndrew Geissler      *
71c74716e5SAndrew Geissler      */
72c74716e5SAndrew Geissler     void updateCurrentHostState(std::string& bootProgress);
73c74716e5SAndrew Geissler 
74fe270d35SAndrew Geissler   private:
75c74716e5SAndrew Geissler     /** @brief Process BootProgress property changes
76c74716e5SAndrew Geissler      *
77c74716e5SAndrew Geissler      * Instance specific interface to monitor for changes to the BootProgress
78c74716e5SAndrew Geissler      * property which may impact Hypervisor state.
79c74716e5SAndrew Geissler      *
80c74716e5SAndrew Geissler      * @param[in]  msg              - Data associated with subscribed signal
81c74716e5SAndrew Geissler      *
82c74716e5SAndrew Geissler      */
83c74716e5SAndrew Geissler     void bootProgressChangeEvent(sdbusplus::message::message& msg);
84c74716e5SAndrew Geissler 
85fe270d35SAndrew Geissler     /** @brief Persistent sdbusplus DBus bus connection. */
86fe270d35SAndrew Geissler     sdbusplus::bus::bus& bus;
87c74716e5SAndrew Geissler 
88c74716e5SAndrew Geissler     /** @brief Watch BootProgress changes to know hypervisor state **/
89c74716e5SAndrew Geissler     sdbusplus::bus::match_t bootProgressChangeSignal;
90fe270d35SAndrew Geissler };
91fe270d35SAndrew Geissler 
92fe270d35SAndrew Geissler } // namespace manager
93fe270d35SAndrew Geissler } // namespace state
94fe270d35SAndrew Geissler } // namespace phosphor
95