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