1 #pragma once 2 3 #include "config.h" 4 5 #include "occ_status.hpp" 6 #include "utils.hpp" 7 8 #include <sdbusplus/bus.hpp> 9 #include <sdbusplus/bus/match.hpp> 10 11 #include <filesystem> 12 13 namespace open_power 14 { 15 namespace occ 16 { 17 namespace powercap 18 { 19 20 namespace sdbusRule = sdbusplus::bus::match::rules; 21 22 /** @class PowerCap 23 * @brief Monitors for changes to the power cap and notifies occ 24 * 25 * The customer power cap is provided to the OCC by host TMGT when the occ 26 * first goes active or is reset. This code is responsible for sending 27 * the power cap to the OCC if the cap is changed while the occ is active. 28 */ 29 30 class PowerCap 31 { 32 public: 33 /** @brief PowerCap object to inform occ of changes to cap 34 * 35 * This object will monitor for changes to the power cap setting and 36 * power cap enable properties. If a change is detected, and the occ 37 * is active, then this object will notify the OCC of the change. 38 * 39 * @param[in] occStatus - The occ status object 40 */ 41 PowerCap(Status& occStatus, 42 const std::string& occMasterName = OCC_MASTER_NAME) : 43 occMasterName(occMasterName), 44 occStatus(occStatus), 45 pcapMatch( 46 utils::getBus(), 47 sdbusRule::member("PropertiesChanged") + 48 sdbusRule::path( 49 "/xyz/openbmc_project/control/host0/power_cap") + 50 sdbusRule::argN(0, "xyz.openbmc_project.Control.Power.Cap") + 51 sdbusRule::interface("org.freedesktop.DBus.Properties"), 52 std::bind(std::mem_fn(&PowerCap::pcapChanged), this, 53 std::placeholders::_1)){}; 54 55 /** @brief Return the appropriate value to write to the OCC 56 * 57 * @param[in] pcap - Current user power cap setting 58 * @param[in] pcapEnabled - Current power cap enable setting 59 * 60 * @return The value to write to the occ user pcap 61 */ 62 uint32_t getOccInput(uint32_t pcap, bool pcapEnabled); 63 64 private: 65 /** @brief Callback for pcap setting changes 66 * 67 * Process change and inform OCC 68 * 69 * @param[in] msg - Data associated with pcap change signal 70 * 71 */ 72 void pcapChanged(sdbusplus::message::message& msg); 73 74 /** @brief Get the power cap property 75 * 76 * @return Power cap, 0 on failure to indicate no pcap 77 */ 78 uint32_t getPcap(); 79 80 /** @brief Get the power cap enable property 81 * 82 * @return Whether power cap enabled, will return false on error 83 */ 84 bool getPcapEnabled(); 85 86 /** @brief Write the input power cap to the occ hwmon entry 87 * 88 * @param[in] pcapValue - Power cap value to write to OCC 89 */ 90 void writeOcc(uint32_t pcapValue); 91 92 /** 93 * @brief Returns the filename to use for the user power cap 94 * 95 * The file is of the form "powerX_cap_user", where X is any 96 * number. 97 * 98 * @param[in] path - The directory to look for the file in 99 * 100 * @return std::string - The filename, or empty string if not found. 101 */ 102 std::string getPcapFilename(const std::filesystem::path& path); 103 104 /** @brief The master occ name */ 105 std::string occMasterName; 106 107 /* @brief OCC Status object */ 108 Status& occStatus; 109 110 /** @brief Used to subscribe to dbus pcap property changes **/ 111 sdbusplus::bus::match_t pcapMatch; 112 }; 113 114 } // namespace powercap 115 116 } // namespace occ 117 118 } // namespace open_power 119