#pragma once #include #include #include #include #include "occ_pass_through.hpp" #include "occ_status.hpp" #include "powercap.hpp" namespace sdbusRule = sdbusplus::bus::match::rules; namespace open_power { namespace occ { /** @class Manager * @brief Builds and manages OCC objects */ struct Manager { public: Manager() = delete; Manager(const Manager&) = delete; Manager& operator=(const Manager&) = delete; Manager(Manager&&) = delete; Manager& operator=(Manager&&) = delete; ~Manager() = default; /** @brief Adds OCC pass-through and status objects on the bus * when corresponding CPU inventory is created. * * @param[in] bus - handle to the bus * @param[in] event - Unique ptr reference to sd_event */ Manager(sdbusplus::bus::bus& bus, EventPtr& event) : bus(bus), event(event) { #ifdef I2C_OCC // I2C OCC status objects are initialized directly initStatusObjects(); #else findAndCreateObjects(); #endif } inline auto getNumOCCs() const { return activeCount; } private: /** @brief Checks if the CPU inventory is present and if so, creates * the occ D-Bus objects. Else, registers a handler to be * called when inventory is created. */ void findAndCreateObjects(); /** @brief Callback that responds to cpu creation in the inventory - * by creating the needed objects. * * @param[in] msg - bus message * * @returns 0 to indicate success */ int cpuCreated(sdbusplus::message::message& msg); /** @brief Create child OCC objects. * * @param[in] occ - the occ name, such as occ0. */ void createObjects(const std::string& occ); /** @brief Callback handler invoked by Status object when the OccActive * property is changed. This is needed to make sure that the * error detection is started only after all the OCCs are bound. * Similarly, when one of the OCC gets its OccActive property * un-set, then the OCC error detection needs to be stopped on * all the OCCs * * @param[in] status - OccActive status */ void statusCallBack(bool status); /** @brief Sends a Heartbeat command to host control command handler */ void sendHeartBeat(); /** @brief reference to the bus */ sdbusplus::bus::bus& bus; /** @brief reference to sd_event wrapped in unique_ptr */ EventPtr& event; /** @brief OCC pass-through objects */ std::vector> passThroughObjects; /** @brief OCC Status objects */ std::vector> statusObjects; /** @brief Power cap monitor and occ notification object */ std::unique_ptr pcap; /** @brief sbdbusplus match objects */ std::vector cpuMatches; /** @brief Number of OCCs that are bound */ uint8_t activeCount = 0; #ifdef I2C_OCC /** @brief Init Status objects for I2C OCC devices * * It iterates in /sys/bus/i2c/devices, finds all occ hwmon devices * and creates status objects. */ void initStatusObjects(); #endif }; } // namespace occ } // namespace open_power