xref: /openbmc/phosphor-power/phosphor-power-supply/chassis_manager.hpp (revision 9ed0f38e1d59564106c6020b854416ece6753776)
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