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