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