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< 18*7e969cb9SPatrick Williams sdbusplus::server::xyz::openbmc_project::state::Host>; 19fe270d35SAndrew Geissler 20*7e969cb9SPatrick 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), 479e5cd389SPatrick Williams bootProgressChangeSignal(bus, 48c74716e5SAndrew Geissler sdbusRule::propertiesChanged( 49c74716e5SAndrew Geissler "/xyz/openbmc_project/state/host0", 50c74716e5SAndrew Geissler "xyz.openbmc_project.State.Boot.Progress"), 519e5cd389SPatrick Williams [this](sdbusplus::message_t& m) { 529e5cd389SPatrick Williams bootProgressChangeEvent(m); 539e5cd389SPatrick Williams }) 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 */ 65e4a39de3SAndrew Geissler server::Host::HostState currentHostState() const override; 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 */ 83f053e6feSPatrick Williams void bootProgressChangeEvent(sdbusplus::message_t& msg); 84c74716e5SAndrew Geissler 85fe270d35SAndrew Geissler /** @brief Persistent sdbusplus DBus bus connection. */ 86f053e6feSPatrick Williams sdbusplus::bus_t& 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