1348168b6SFaisal Awada #pragma once 2348168b6SFaisal Awada 3348168b6SFaisal Awada #include "chassis.hpp" 4348168b6SFaisal Awada #include "types.hpp" 5348168b6SFaisal Awada #include "utility.hpp" 6348168b6SFaisal Awada 7348168b6SFaisal Awada #include <sdbusplus/bus/match.hpp> 8348168b6SFaisal Awada #include <sdbusplus/server/manager.hpp> 9348168b6SFaisal Awada #include <sdbusplus/server/object.hpp> 10348168b6SFaisal Awada #include <sdeventplus/event.hpp> 11348168b6SFaisal Awada #include <sdeventplus/utility/timer.hpp> 12348168b6SFaisal Awada #include <xyz/openbmc_project/State/Decorator/PowerSystemInputs/server.hpp> 13348168b6SFaisal Awada 14348168b6SFaisal Awada using namespace phosphor::power::psu; 15348168b6SFaisal Awada 16348168b6SFaisal Awada namespace phosphor::power::chassis_manager 17348168b6SFaisal Awada { 18348168b6SFaisal Awada 19348168b6SFaisal Awada // Validation timeout. Allow 30s to detect if new EM interfaces show up in D-Bus 20348168b6SFaisal Awada // before performing the validation. 21348168b6SFaisal Awada constexpr auto validationTimeout = std::chrono::seconds(30); 22348168b6SFaisal Awada 23348168b6SFaisal Awada /** 24348168b6SFaisal Awada * @class ChassisManager 25348168b6SFaisal Awada * 26348168b6SFaisal Awada * @brief Manages and monitors power supply devices for the chassis. 27348168b6SFaisal Awada * 28348168b6SFaisal Awada * @detail This class interacts with D-Bus to detect chassis power supply, 29348168b6SFaisal Awada * subscribe to Entity Manager interface changes. 30348168b6SFaisal Awada */ 31348168b6SFaisal Awada class ChassisManager 32348168b6SFaisal Awada { 33348168b6SFaisal Awada public: 34348168b6SFaisal Awada ChassisManager() = delete; 35348168b6SFaisal Awada ~ChassisManager() = default; 36348168b6SFaisal Awada ChassisManager(const ChassisManager&) = delete; 37348168b6SFaisal Awada ChassisManager& operator=(const ChassisManager&) = delete; 38348168b6SFaisal Awada ChassisManager(ChassisManager&&) = delete; 39348168b6SFaisal Awada ChassisManager& operator=(ChassisManager&&) = delete; 40348168b6SFaisal Awada 41348168b6SFaisal Awada /** 42348168b6SFaisal Awada * @brief Constructs a ChassisManager instance. 43348168b6SFaisal Awada * 44348168b6SFaisal Awada * @details Sets up D-Bus interfaces, creates timer for power supply 45348168b6SFaisal Awada * validation and monitoring, and subscribes to entity-manager interfaces. 46348168b6SFaisal Awada * 47348168b6SFaisal Awada * @param[in] bus - Reference to the system D-Bus object. 48348168b6SFaisal Awada * @param[in] e - Reference to event loop. 49348168b6SFaisal Awada */ 50348168b6SFaisal Awada ChassisManager(sdbusplus::bus_t& bus, const sdeventplus::Event& e); 51348168b6SFaisal Awada 52348168b6SFaisal Awada /** 53348168b6SFaisal Awada * @brief Starts the main event loop for monitoring. 54348168b6SFaisal Awada * 55348168b6SFaisal Awada * @return int Returns the result the result of the event loop execution. 56348168b6SFaisal Awada */ run()57348168b6SFaisal Awada int run() 58348168b6SFaisal Awada { 59348168b6SFaisal Awada return timer->get_event().loop(); 60348168b6SFaisal Awada } 61348168b6SFaisal Awada 62348168b6SFaisal Awada private: 63348168b6SFaisal Awada /** 64348168b6SFaisal Awada * @brief The D-Bus object 65348168b6SFaisal Awada */ 66348168b6SFaisal Awada sdbusplus::bus_t& bus; 67348168b6SFaisal Awada 68348168b6SFaisal Awada /** 69348168b6SFaisal Awada * @brief The timer that runs to periodically check the power supplies. 70348168b6SFaisal Awada */ 71348168b6SFaisal Awada std::unique_ptr< 72348168b6SFaisal Awada sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>> 73348168b6SFaisal Awada timer; 74348168b6SFaisal Awada 75348168b6SFaisal Awada /** 76348168b6SFaisal Awada * @brief Used to subscribe to Entity Manager interfaces added 77348168b6SFaisal Awada */ 78348168b6SFaisal Awada std::unique_ptr<sdbusplus::bus::match_t> entityManagerIfacesAddedMatch; 79348168b6SFaisal Awada 80348168b6SFaisal Awada /** 81348168b6SFaisal Awada * @brief List of chassis objects populated dynamically. 82348168b6SFaisal Awada */ 83348168b6SFaisal Awada std::vector<std::unique_ptr<phosphor::power::chassis::Chassis>> 84348168b6SFaisal Awada listOfChassis; 85348168b6SFaisal Awada 86348168b6SFaisal Awada /** 87348168b6SFaisal Awada * @brief Declares a constant reference to an sdeventplus::Envent to manage 88348168b6SFaisal Awada * async processing. 89348168b6SFaisal Awada */ 90348168b6SFaisal Awada const sdeventplus::Event& eventLoop; 91348168b6SFaisal Awada 92348168b6SFaisal Awada /** 93348168b6SFaisal Awada * @brief Callback for entity-manager interface added 94348168b6SFaisal Awada * 95348168b6SFaisal Awada * @details Process the information from the supported configuration and 96348168b6SFaisal Awada * or IBM CFFPS Connector interface being added. 97348168b6SFaisal Awada * 98348168b6SFaisal Awada * @param[in] msg - D-Bus message containing the interface details. 99348168b6SFaisal Awada */ 100348168b6SFaisal Awada void entityManagerIfaceAdded(sdbusplus::message_t& msg); 101348168b6SFaisal Awada 102348168b6SFaisal Awada /** 103348168b6SFaisal Awada * @brief Invoke the PSU analysis method in each chassis on the system. 104348168b6SFaisal Awada * 105348168b6SFaisal Awada * @details Scan the system for chassis and analyze each chassis power 106348168b6SFaisal Awada * supplies and log any detected errors. 107348168b6SFaisal Awada */ 108348168b6SFaisal Awada void analyze(); 109348168b6SFaisal Awada 110348168b6SFaisal Awada /** 111348168b6SFaisal Awada * @brief Initialize the list of chassis object from the inventory, scans 112348168b6SFaisal Awada * the D-Bus subtree for chassis and creates Chassis instances. 113348168b6SFaisal Awada */ 114348168b6SFaisal Awada void initializeChassisList(); 115348168b6SFaisal Awada 116348168b6SFaisal Awada /** 117348168b6SFaisal Awada * @brief Retrieves a pointer to a Chassis object matching the given ID. 118348168b6SFaisal Awada * 119348168b6SFaisal Awada * @param[in] chassisId - Unique identifier of the chassis to search for. 120348168b6SFaisal Awada * @return Raw pointer to the matching Chassis object if found, otherwise a 121348168b6SFaisal Awada * nullptr. 122348168b6SFaisal Awada */ 123348168b6SFaisal Awada phosphor::power::chassis::Chassis* getMatchingChassisPtr( 124348168b6SFaisal Awada uint64_t chassisId); 125*9ed0f38eSFaisal Awada 126*9ed0f38eSFaisal Awada /** 127*9ed0f38eSFaisal Awada * @brief Initialize chassis power monitoring. 128*9ed0f38eSFaisal Awada */ 129*9ed0f38eSFaisal Awada void initChassisPowerMonitoring(); 130348168b6SFaisal Awada }; 131348168b6SFaisal Awada 132348168b6SFaisal Awada } // namespace phosphor::power::chassis_manager 133