| Vishwanatha Subbanna | 2180b2d | 2017-06-28 14:05:57 +0530 | [diff] [blame] | 1 | #pragma once | 
 | 2 |  | 
| Vishwanatha Subbanna | 2180b2d | 2017-06-28 14:05:57 +0530 | [diff] [blame] | 3 | #include "occ_pass_through.hpp" | 
| Vishwanatha Subbanna | 307d80b | 2017-06-28 15:56:09 +0530 | [diff] [blame] | 4 | #include "occ_status.hpp" | 
| Tom Joseph | 815f9f5 | 2020-07-27 12:12:13 +0530 | [diff] [blame] | 5 | #ifdef PLDM | 
 | 6 | #include "pldm.hpp" | 
| Eddie James | cbad219 | 2021-10-07 09:39:39 -0500 | [diff] [blame] | 7 |  | 
 | 8 | #include <libphal.H> | 
| Tom Joseph | 815f9f5 | 2020-07-27 12:12:13 +0530 | [diff] [blame] | 9 | #endif | 
| Chris Cain | 40501a2 | 2022-03-14 17:33:27 -0500 | [diff] [blame] | 10 | #include "powercap.hpp" | 
| George Liu | f3b7514 | 2021-06-10 11:22:50 +0800 | [diff] [blame] | 11 | #include "utils.hpp" | 
| Chris Cain | 78e8601 | 2021-03-04 16:15:31 -0600 | [diff] [blame] | 12 | #ifdef POWER10 | 
 | 13 | #include "powermode.hpp" | 
 | 14 | #endif | 
| Vishwanatha Subbanna | 2180b2d | 2017-06-28 14:05:57 +0530 | [diff] [blame] | 15 |  | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 16 | #include <sdbusplus/bus.hpp> | 
| Chris Cain | a8857c5 | 2021-01-27 11:53:05 -0600 | [diff] [blame] | 17 | #include <sdeventplus/event.hpp> | 
 | 18 | #include <sdeventplus/utility/timer.hpp> | 
| George Liu | b5ca101 | 2021-09-10 12:53:11 +0800 | [diff] [blame] | 19 |  | 
 | 20 | #include <cstring> | 
 | 21 | #include <functional> | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 22 | #include <vector> | 
 | 23 |  | 
| Vishwanatha Subbanna | 2180b2d | 2017-06-28 14:05:57 +0530 | [diff] [blame] | 24 | namespace sdbusRule = sdbusplus::bus::match::rules; | 
| Vishwanatha Subbanna | 2180b2d | 2017-06-28 14:05:57 +0530 | [diff] [blame] | 25 | namespace open_power | 
 | 26 | { | 
 | 27 | namespace occ | 
 | 28 | { | 
 | 29 |  | 
| Chicago Duan | bb895cb | 2021-06-18 19:37:16 +0800 | [diff] [blame] | 30 | #ifdef READ_OCC_SENSORS | 
 | 31 | enum occFruType | 
 | 32 | { | 
 | 33 |     processorCore = 0, | 
 | 34 |     internalMemCtlr = 1, | 
 | 35 |     dimm = 2, | 
 | 36 |     memCtrlAndDimm = 3, | 
 | 37 |     VRMVdd = 6, | 
 | 38 |     PMIC = 7, | 
| Matt Spinler | ace67d8 | 2021-10-18 13:41:57 -0500 | [diff] [blame] | 39 |     memCtlrExSensor = 8, | 
 | 40 |     processorIoRing = 9 | 
| Chicago Duan | bb895cb | 2021-06-18 19:37:16 +0800 | [diff] [blame] | 41 | }; | 
 | 42 | #endif | 
 | 43 |  | 
| Chris Cain | a8857c5 | 2021-01-27 11:53:05 -0600 | [diff] [blame] | 44 | /** @brief Default time, in seconds, between OCC poll commands */ | 
| Matt Spinler | 3792346 | 2021-09-24 11:38:05 -0500 | [diff] [blame] | 45 | #ifndef POWER10 | 
| Chicago Duan | bb895cb | 2021-06-18 19:37:16 +0800 | [diff] [blame] | 46 | constexpr unsigned int defaultPollingInterval = 1; | 
| Matt Spinler | 3792346 | 2021-09-24 11:38:05 -0500 | [diff] [blame] | 47 | #else | 
 | 48 | constexpr unsigned int defaultPollingInterval = 5; | 
 | 49 | #endif | 
| Chris Cain | a8857c5 | 2021-01-27 11:53:05 -0600 | [diff] [blame] | 50 |  | 
| Chris Cain | 1725767 | 2021-10-22 13:41:03 -0500 | [diff] [blame] | 51 | constexpr auto AMBIENT_PATH = | 
 | 52 |     "/xyz/openbmc_project/sensors/temperature/Ambient_Virtual_Temp"; | 
 | 53 | constexpr auto AMBIENT_INTERFACE = "xyz.openbmc_project.Sensor.Value"; | 
 | 54 | constexpr auto AMBIENT_PROP = "Value"; | 
 | 55 | constexpr auto ALTITUDE_PATH = "/xyz/openbmc_project/sensors/altitude/Altitude"; | 
 | 56 | constexpr auto ALTITUDE_INTERFACE = "xyz.openbmc_project.Sensor.Value"; | 
 | 57 | constexpr auto ALTITUDE_PROP = "Value"; | 
 | 58 |  | 
| Vishwanatha Subbanna | 2180b2d | 2017-06-28 14:05:57 +0530 | [diff] [blame] | 59 | /** @class Manager | 
 | 60 |  *  @brief Builds and manages OCC objects | 
 | 61 |  */ | 
 | 62 | struct Manager | 
 | 63 | { | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 64 |   public: | 
 | 65 |     Manager() = delete; | 
 | 66 |     Manager(const Manager&) = delete; | 
 | 67 |     Manager& operator=(const Manager&) = delete; | 
 | 68 |     Manager(Manager&&) = delete; | 
 | 69 |     Manager& operator=(Manager&&) = delete; | 
 | 70 |     ~Manager() = default; | 
| Vishwanatha Subbanna | 2180b2d | 2017-06-28 14:05:57 +0530 | [diff] [blame] | 71 |  | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 72 |     /** @brief Adds OCC pass-through and status objects on the bus | 
 | 73 |      *         when corresponding CPU inventory is created. | 
 | 74 |      * | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 75 |      *  @param[in] event - Unique ptr reference to sd_event | 
 | 76 |      */ | 
| George Liu | f3a4a69 | 2021-12-28 13:59:51 +0800 | [diff] [blame] | 77 |     explicit Manager(EventPtr& event) : | 
| George Liu | f3b7514 | 2021-06-10 11:22:50 +0800 | [diff] [blame] | 78 |         event(event), pollInterval(defaultPollingInterval), | 
| Chris Cain | a8857c5 | 2021-01-27 11:53:05 -0600 | [diff] [blame] | 79 |         sdpEvent(sdeventplus::Event::get_default()), | 
 | 80 |         _pollTimer( | 
 | 81 |             std::make_unique< | 
 | 82 |                 sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>>( | 
| Chris Cain | 1725767 | 2021-10-22 13:41:03 -0500 | [diff] [blame] | 83 |                 sdpEvent, std::bind(&Manager::pollerTimerExpired, this))), | 
 | 84 |         ambientPropChanged( | 
 | 85 |             utils::getBus(), | 
 | 86 |             sdbusRule::member("PropertiesChanged") + | 
 | 87 |                 sdbusRule::path(AMBIENT_PATH) + | 
 | 88 |                 sdbusRule::argN(0, AMBIENT_INTERFACE) + | 
 | 89 |                 sdbusRule::interface("org.freedesktop.DBus.Properties"), | 
 | 90 |             std::bind(&Manager::ambientCallback, this, std::placeholders::_1)) | 
| Tom Joseph | 815f9f5 | 2020-07-27 12:12:13 +0530 | [diff] [blame] | 91 | #ifdef PLDM | 
 | 92 |         , | 
 | 93 |         pldmHandle(std::make_unique<pldm::Interface>( | 
| George Liu | f3b7514 | 2021-06-10 11:22:50 +0800 | [diff] [blame] | 94 |             std::bind(std::mem_fn(&Manager::updateOCCActive), this, | 
| Eddie James | cbad219 | 2021-10-07 09:39:39 -0500 | [diff] [blame] | 95 |                       std::placeholders::_1, std::placeholders::_2), | 
 | 96 |             std::bind(std::mem_fn(&Manager::sbeHRESETResult), this, | 
| Chris Cain | bae4d07 | 2022-02-28 09:46:50 -0600 | [diff] [blame] | 97 |                       std::placeholders::_1, std::placeholders::_2), | 
| Sheldon Bailey | 31a2f13 | 2022-05-20 11:31:52 -0500 | [diff] [blame] | 98 |             std::bind(std::mem_fn(&Manager::updateOccSafeMode), this, | 
 | 99 |                       std::placeholders::_1), | 
| Chris Cain | bae4d07 | 2022-02-28 09:46:50 -0600 | [diff] [blame] | 100 |             event)) | 
| Tom Joseph | 815f9f5 | 2020-07-27 12:12:13 +0530 | [diff] [blame] | 101 | #endif | 
| Matt Spinler | d267cec | 2021-09-01 14:49:19 -0500 | [diff] [blame] | 102 | #ifdef POWER10 | 
 | 103 |         , | 
 | 104 |         discoverTimer( | 
 | 105 |             std::make_unique< | 
 | 106 |                 sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>>( | 
| Chris Cain | a7b74dc | 2021-11-10 17:03:43 -0600 | [diff] [blame] | 107 |                 sdpEvent, std::bind(&Manager::findAndCreateObjects, this))), | 
 | 108 |         waitForAllOccsTimer( | 
 | 109 |             std::make_unique< | 
 | 110 |                 sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>>( | 
 | 111 |                 sdpEvent, std::bind(&Manager::occsNotAllRunning, this))) | 
| Matt Spinler | d267cec | 2021-09-01 14:49:19 -0500 | [diff] [blame] | 112 | #endif | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 113 |     { | 
| Lei YU | 0ab90ca | 2017-07-13 17:02:23 +0800 | [diff] [blame] | 114 | #ifdef I2C_OCC | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 115 |         // I2C OCC status objects are initialized directly | 
 | 116 |         initStatusObjects(); | 
| Lei YU | 0ab90ca | 2017-07-13 17:02:23 +0800 | [diff] [blame] | 117 | #else | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 118 |         findAndCreateObjects(); | 
| Lei YU | 0ab90ca | 2017-07-13 17:02:23 +0800 | [diff] [blame] | 119 | #endif | 
| Chris Cain | 1725767 | 2021-10-22 13:41:03 -0500 | [diff] [blame] | 120 |         readAltitude(); | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 121 |     } | 
| Vishwanatha Subbanna | 2180b2d | 2017-06-28 14:05:57 +0530 | [diff] [blame] | 122 |  | 
| Chris Cain | a8857c5 | 2021-01-27 11:53:05 -0600 | [diff] [blame] | 123 |     /** @brief Return the number of bound OCCs */ | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 124 |     inline auto getNumOCCs() const | 
 | 125 |     { | 
 | 126 |         return activeCount; | 
 | 127 |     } | 
| Edward A. James | 636577f | 2017-10-06 10:53:55 -0500 | [diff] [blame] | 128 |  | 
| Eddie James | cbad219 | 2021-10-07 09:39:39 -0500 | [diff] [blame] | 129 | #ifdef PLDM | 
 | 130 |     /** @brief Called by a Device to report that the SBE timed out | 
 | 131 |      *         and appropriate action should be taken | 
 | 132 |      * | 
 | 133 |      * @param[in] instance - the OCC instance id | 
 | 134 |      */ | 
 | 135 |     void sbeTimeout(unsigned int instance); | 
 | 136 | #endif | 
 | 137 |  | 
| Chris Cain | 1725767 | 2021-10-22 13:41:03 -0500 | [diff] [blame] | 138 |     /** @brief Return the latest ambient and altitude readings | 
 | 139 |      * | 
 | 140 |      *  @param[out] ambientValid - true if ambientTemp is valid | 
 | 141 |      *  @param[out] ambient - ambient temperature in degrees C | 
 | 142 |      *  @param[out] altitude - altitude in meters | 
 | 143 |      */ | 
 | 144 |     void getAmbientData(bool& ambientValid, uint8_t& ambientTemp, | 
 | 145 |                         uint16_t& altitude) const; | 
 | 146 |  | 
| Chris Cain | 40501a2 | 2022-03-14 17:33:27 -0500 | [diff] [blame] | 147 |     /** @brief Notify pcap object to update bounds */ | 
 | 148 |     void updatePcapBounds() const; | 
 | 149 |  | 
| Sheldon Bailey | c8dd459 | 2022-05-12 10:15:14 -0500 | [diff] [blame] | 150 |     /** | 
 | 151 |      * @brief Set all sensor values of this OCC to NaN. | 
 | 152 |      * @param[in] id - Id of the OCC. | 
 | 153 |      * */ | 
 | 154 |     void setSensorValueToNaN(uint32_t id) const; | 
 | 155 |  | 
| Sheldon Bailey | 373af75 | 2022-02-21 15:14:00 -0600 | [diff] [blame] | 156 |     /** @brief Set all sensor values of this OCC to NaN and non functional. | 
 | 157 |      * | 
 | 158 |      *  @param[in] id - Id of the OCC. | 
 | 159 |      */ | 
 | 160 |     void setSensorValueToNonFunctional(uint32_t id) const; | 
 | 161 |  | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 162 |   private: | 
| Matt Spinler | d267cec | 2021-09-01 14:49:19 -0500 | [diff] [blame] | 163 |     /** @brief Creates the OCC D-Bus objects. | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 164 |      */ | 
 | 165 |     void findAndCreateObjects(); | 
| Vishwanatha Subbanna | dfc7ec7 | 2017-09-07 18:18:01 +0530 | [diff] [blame] | 166 |  | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 167 |     /** @brief Callback that responds to cpu creation in the inventory - | 
 | 168 |      *         by creating the needed objects. | 
 | 169 |      * | 
 | 170 |      *  @param[in] msg - bus message | 
 | 171 |      * | 
 | 172 |      *  @returns 0 to indicate success | 
 | 173 |      */ | 
 | 174 |     int cpuCreated(sdbusplus::message::message& msg); | 
| Deepak Kodihalli | 5f031f3 | 2017-07-26 08:25:59 -0500 | [diff] [blame] | 175 |  | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 176 |     /** @brief Create child OCC objects. | 
 | 177 |      * | 
 | 178 |      *  @param[in] occ - the occ name, such as occ0. | 
 | 179 |      */ | 
 | 180 |     void createObjects(const std::string& occ); | 
| Vishwanatha Subbanna | 2180b2d | 2017-06-28 14:05:57 +0530 | [diff] [blame] | 181 |  | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 182 |     /** @brief Callback handler invoked by Status object when the OccActive | 
 | 183 |      *         property is changed. This is needed to make sure that the | 
 | 184 |      *         error detection is started only after all the OCCs are bound. | 
 | 185 |      *         Similarly, when one of the OCC gets its OccActive property | 
 | 186 |      *         un-set, then the OCC error detection needs to be stopped on | 
 | 187 |      *         all the OCCs | 
 | 188 |      * | 
 | 189 |      *  @param[in] status - OccActive status | 
 | 190 |      */ | 
| Sheldon Bailey | 373af75 | 2022-02-21 15:14:00 -0600 | [diff] [blame] | 191 |     void statusCallBack(instanceID instance, bool status); | 
| Vishwanatha Subbanna | 2dc9b1a | 2017-08-18 18:29:41 +0530 | [diff] [blame] | 192 |  | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 193 |     /** @brief Sends a Heartbeat command to host control command handler */ | 
 | 194 |     void sendHeartBeat(); | 
| Vishwanatha Subbanna | 2dc9b1a | 2017-08-18 18:29:41 +0530 | [diff] [blame] | 195 |  | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 196 |     /** @brief reference to sd_event wrapped in unique_ptr */ | 
 | 197 |     EventPtr& event; | 
| Vishwanatha Subbanna | ee4d83d | 2017-06-29 18:35:00 +0530 | [diff] [blame] | 198 |  | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 199 |     /** @brief OCC pass-through objects */ | 
 | 200 |     std::vector<std::unique_ptr<PassThrough>> passThroughObjects; | 
| Vishwanatha Subbanna | 307d80b | 2017-06-28 15:56:09 +0530 | [diff] [blame] | 201 |  | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 202 |     /** @brief OCC Status objects */ | 
 | 203 |     std::vector<std::unique_ptr<Status>> statusObjects; | 
| Vishwanatha Subbanna | 2180b2d | 2017-06-28 14:05:57 +0530 | [diff] [blame] | 204 |  | 
| Chris Cain | 40501a2 | 2022-03-14 17:33:27 -0500 | [diff] [blame] | 205 |     /** @brief Power cap monitor and occ notification object */ | 
 | 206 |     std::unique_ptr<open_power::occ::powercap::PowerCap> pcap; | 
 | 207 |  | 
| Chris Cain | 78e8601 | 2021-03-04 16:15:31 -0600 | [diff] [blame] | 208 | #ifdef POWER10 | 
 | 209 |     /** @brief Power mode monitor and notification object */ | 
 | 210 |     std::unique_ptr<open_power::occ::powermode::PowerMode> pmode; | 
 | 211 | #endif | 
 | 212 |  | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 213 |     /** @brief sbdbusplus match objects */ | 
 | 214 |     std::vector<sdbusplus::bus::match_t> cpuMatches; | 
| Vishwanatha Subbanna | 2dc9b1a | 2017-08-18 18:29:41 +0530 | [diff] [blame] | 215 |  | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 216 |     /** @brief Number of OCCs that are bound */ | 
 | 217 |     uint8_t activeCount = 0; | 
| Lei YU | 0ab90ca | 2017-07-13 17:02:23 +0800 | [diff] [blame] | 218 |  | 
| Chris Cain | a8857c5 | 2021-01-27 11:53:05 -0600 | [diff] [blame] | 219 |     /** @brief Number of seconds between poll commands */ | 
 | 220 |     uint8_t pollInterval; | 
 | 221 |  | 
| Chris Cain | 1725767 | 2021-10-22 13:41:03 -0500 | [diff] [blame] | 222 |     /** @brief Ambient temperature of the system in degrees C */ | 
 | 223 |     uint8_t ambient = 0xFF; // default: not available | 
 | 224 |  | 
 | 225 |     /** @brief Altitude of the system in meters */ | 
 | 226 |     uint16_t altitude = 0xFFFF; // default: not available | 
 | 227 |  | 
| Chris Cain | a8857c5 | 2021-01-27 11:53:05 -0600 | [diff] [blame] | 228 |     /** @brief Poll timer event */ | 
 | 229 |     sdeventplus::Event sdpEvent; | 
 | 230 |  | 
| Chris Cain | bae4d07 | 2022-02-28 09:46:50 -0600 | [diff] [blame] | 231 |     /** @brief Flags to indicate if waiting for all of the OCC active sensors to | 
 | 232 |      * come online */ | 
 | 233 |     bool waitingForAllOccActiveSensors = false; | 
 | 234 |  | 
| Chris Cain | bd551de | 2022-04-26 13:41:16 -0500 | [diff] [blame] | 235 |     /** @brief Set containing intance numbers of any OCCs that became active | 
 | 236 |      *         while waiting for status objects to be created */ | 
 | 237 |     std::set<uint8_t> queuedActiveState; | 
 | 238 |  | 
| Chris Cain | a8857c5 | 2021-01-27 11:53:05 -0600 | [diff] [blame] | 239 |     /** | 
 | 240 |      * @brief The timer to be used once the OCC goes active.  When it expires, | 
 | 241 |      *        a POLL command will be sent to the OCC and then timer restarted. | 
 | 242 |      */ | 
 | 243 |     std::unique_ptr< | 
 | 244 |         sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>> | 
 | 245 |         _pollTimer; | 
 | 246 |  | 
| Chris Cain | 1725767 | 2021-10-22 13:41:03 -0500 | [diff] [blame] | 247 |     /** @brief Subscribe to ambient temperature changed events */ | 
 | 248 |     sdbusplus::bus::match_t ambientPropChanged; | 
 | 249 |  | 
| Lei YU | 0ab90ca | 2017-07-13 17:02:23 +0800 | [diff] [blame] | 250 | #ifdef I2C_OCC | 
| Gunnar Mills | 94df8c9 | 2018-09-14 14:50:03 -0500 | [diff] [blame] | 251 |     /** @brief Init Status objects for I2C OCC devices | 
 | 252 |      * | 
 | 253 |      * It iterates in /sys/bus/i2c/devices, finds all occ hwmon devices | 
 | 254 |      * and creates status objects. | 
 | 255 |      */ | 
 | 256 |     void initStatusObjects(); | 
| Lei YU | 0ab90ca | 2017-07-13 17:02:23 +0800 | [diff] [blame] | 257 | #endif | 
| Tom Joseph | 815f9f5 | 2020-07-27 12:12:13 +0530 | [diff] [blame] | 258 |  | 
 | 259 | #ifdef PLDM | 
 | 260 |     /** @brief Callback handler invoked by the PLDM event handler when state of | 
 | 261 |      *         the OCC is toggled by the host. The caller passes the instance | 
 | 262 |      *         of the OCC and state of the OCC. | 
 | 263 |      * | 
 | 264 |      *  @param[in] instance - instance of the OCC | 
 | 265 |      *  @param[in] status - true when the OCC goes active and false when the OCC | 
 | 266 |      *                      goes inactive | 
 | 267 |      * | 
 | 268 |      *  @return true if setting the state of OCC is successful and false if it | 
 | 269 |      *          fails. | 
 | 270 |      */ | 
 | 271 |     bool updateOCCActive(instanceID instance, bool status); | 
 | 272 |  | 
| Sheldon Bailey | 31a2f13 | 2022-05-20 11:31:52 -0500 | [diff] [blame] | 273 |     /** @brief Callback handler invoked by the PLDM event handler when mode of | 
 | 274 |      *         the OCC SAFE MODE is inacted or cleared. | 
 | 275 |      */ | 
 | 276 |     void updateOccSafeMode(bool safeState); | 
 | 277 |  | 
| Eddie James | cbad219 | 2021-10-07 09:39:39 -0500 | [diff] [blame] | 278 |     /** @brief Callback handler invoked by PLDM sensor change when | 
 | 279 |      *         the HRESET succeeds or fails. | 
 | 280 |      * | 
 | 281 |      *  @param[in] instance - the SBE instance id | 
 | 282 |      *  @param[in] success - true if the HRESET succeeded, otherwise false | 
 | 283 |      */ | 
 | 284 |     void sbeHRESETResult(instanceID instance, bool success); | 
 | 285 |  | 
 | 286 |     /** @brief Helper function to check whether an SBE dump should be collected | 
 | 287 |      *         now. | 
 | 288 |      * | 
 | 289 |      *  @param[in] instance - the SBE instance id | 
 | 290 |      * | 
 | 291 |      *  @return true if an SBE dump should be collected and false if not | 
 | 292 |      */ | 
 | 293 |     bool sbeCanDump(unsigned int instance); | 
 | 294 |  | 
 | 295 |     /** @brief Helper function to set the SBE state through PDBG/PHAL | 
 | 296 |      * | 
 | 297 |      * @param[in] instance - instance of the SBE | 
 | 298 |      * @param[in] state - the state to which the SBE should be set | 
 | 299 |      * | 
 | 300 |      */ | 
 | 301 |     void setSBEState(unsigned int instance, enum sbe_state state); | 
 | 302 |  | 
 | 303 |     /** @brief Helper function to get the SBE instance PDBG processor target | 
 | 304 |      * | 
 | 305 |      * @param[in] instance - the SBE instance id | 
 | 306 |      * | 
 | 307 |      * @return a pointer to the PDBG target | 
 | 308 |      */ | 
 | 309 |     struct pdbg_target* getPdbgTarget(unsigned int instance); | 
 | 310 |  | 
 | 311 |     /** @brief Whether pdbg_targets_init has been called */ | 
 | 312 |     bool pdbgInitialized = false; | 
 | 313 |  | 
| Tom Joseph | 815f9f5 | 2020-07-27 12:12:13 +0530 | [diff] [blame] | 314 |     std::unique_ptr<pldm::Interface> pldmHandle = nullptr; | 
 | 315 | #endif | 
| Chris Cain | a8857c5 | 2021-01-27 11:53:05 -0600 | [diff] [blame] | 316 |  | 
| Matt Spinler | d267cec | 2021-09-01 14:49:19 -0500 | [diff] [blame] | 317 | #ifdef POWER10 | 
 | 318 |     /** | 
 | 319 |      * @brief Timer used when discovering OCCs in /dev. | 
 | 320 |      */ | 
 | 321 |     std::unique_ptr< | 
 | 322 |         sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>> | 
 | 323 |         discoverTimer; | 
 | 324 |  | 
 | 325 |     /** | 
 | 326 |      * @brief Used when discovering /dev/occ objects to know if | 
 | 327 |      *        any were added since the last check. | 
 | 328 |      */ | 
 | 329 |     std::vector<int> prevOCCSearch; | 
| Chris Cain | a7b74dc | 2021-11-10 17:03:43 -0600 | [diff] [blame] | 330 |  | 
 | 331 |     /** | 
 | 332 |      * @brief Timer used when waiting for OCCs to go active. | 
 | 333 |      */ | 
 | 334 |     std::unique_ptr< | 
 | 335 |         sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>> | 
 | 336 |         waitForAllOccsTimer; | 
 | 337 |  | 
 | 338 |     /** @brief Called when code times out waiting for all OCCs to be running or | 
 | 339 |      *         after the app is restarted (Status does not callback into | 
 | 340 |      * Manager). | 
 | 341 |      */ | 
 | 342 |     void occsNotAllRunning(); | 
| Chris Cain | bae4d07 | 2022-02-28 09:46:50 -0600 | [diff] [blame] | 343 |  | 
 | 344 |     /** @brief Check if all of the OCC Active sensors are available and if not | 
 | 345 |      * restart the discoverTimer | 
 | 346 |      */ | 
 | 347 |     void checkAllActiveSensors(); | 
| Matt Spinler | d267cec | 2021-09-01 14:49:19 -0500 | [diff] [blame] | 348 | #endif | 
 | 349 |  | 
| Chris Cain | a8857c5 | 2021-01-27 11:53:05 -0600 | [diff] [blame] | 350 |     /** | 
 | 351 |      * @brief Called when poll timer expires and forces a POLL command to the | 
 | 352 |      * OCC. The poll timer will then be restarted. | 
 | 353 |      * */ | 
 | 354 |     void pollerTimerExpired(); | 
| Chicago Duan | bb895cb | 2021-06-18 19:37:16 +0800 | [diff] [blame] | 355 |  | 
| Matt Spinler | d267cec | 2021-09-01 14:49:19 -0500 | [diff] [blame] | 356 |     /** | 
 | 357 |      * @brief Finds the OCC devices in /dev | 
 | 358 |      * | 
 | 359 |      * @return The IDs of the OCCs - 0, 1, etc. | 
 | 360 |      */ | 
 | 361 |     std::vector<int> findOCCsInDev(); | 
 | 362 |  | 
| Chicago Duan | bb895cb | 2021-06-18 19:37:16 +0800 | [diff] [blame] | 363 | #ifdef READ_OCC_SENSORS | 
 | 364 |     /** | 
 | 365 |      * @brief Gets the occ sensor values. | 
| Chris Cain | 5d66a0a | 2022-02-09 08:52:10 -0600 | [diff] [blame] | 366 |      * @param[in] occ - pointer to OCCs Status object | 
| Chicago Duan | bb895cb | 2021-06-18 19:37:16 +0800 | [diff] [blame] | 367 |      * */ | 
| Chris Cain | 5d66a0a | 2022-02-09 08:52:10 -0600 | [diff] [blame] | 368 |     void getSensorValues(std::unique_ptr<Status>& occ); | 
| Chicago Duan | bb895cb | 2021-06-18 19:37:16 +0800 | [diff] [blame] | 369 |  | 
 | 370 |     /** | 
 | 371 |      * @brief Trigger OCC driver to read the temperature sensors. | 
 | 372 |      * @param[in] path - path of the OCC sensors. | 
 | 373 |      * @param[in] id - Id of the OCC. | 
 | 374 |      * */ | 
 | 375 |     void readTempSensors(const fs::path& path, uint32_t id); | 
 | 376 |  | 
 | 377 |     /** | 
 | 378 |      * @brief Trigger OCC driver to read the power sensors. | 
 | 379 |      * @param[in] path - path of the OCC sensors. | 
 | 380 |      * @param[in] id - Id of the OCC. | 
 | 381 |      * */ | 
 | 382 |     void readPowerSensors(const fs::path& path, uint32_t id); | 
 | 383 |  | 
| Chicago Duan | bb895cb | 2021-06-18 19:37:16 +0800 | [diff] [blame] | 384 |     /** @brief Store the existing OCC sensors on D-BUS */ | 
 | 385 |     std::map<std::string, uint32_t> existingSensors; | 
 | 386 |  | 
 | 387 |     /** @brief Get FunctionID from the `powerX_label` file. | 
 | 388 |      *  @param[in] value - the value of the `powerX_label` file. | 
 | 389 |      *  @returns FunctionID of the power sensors. | 
 | 390 |      */ | 
 | 391 |     std::optional<std::string> | 
 | 392 |         getPowerLabelFunctionID(const std::string& value); | 
 | 393 |  | 
 | 394 |     /** @brief The power sensor names map */ | 
 | 395 |     const std::map<std::string, std::string> powerSensorName = { | 
 | 396 |         {"system", "total_power"}, {"1", "p0_mem_power"}, | 
 | 397 |         {"2", "p1_mem_power"},     {"3", "p2_mem_power"}, | 
 | 398 |         {"4", "p3_mem_power"},     {"5", "p0_power"}, | 
 | 399 |         {"6", "p1_power"},         {"7", "p2_power"}, | 
 | 400 |         {"8", "p3_power"},         {"9", "p0_cache_power"}, | 
 | 401 |         {"10", "p1_cache_power"},  {"11", "p2_cache_power"}, | 
 | 402 |         {"12", "p3_cache_power"},  {"13", "io_a_power"}, | 
 | 403 |         {"14", "io_b_power"},      {"15", "io_c_power"}, | 
 | 404 |         {"16", "fans_a_power"},    {"17", "fans_b_power"}, | 
 | 405 |         {"18", "storage_a_power"}, {"19", "storage_b_power"}, | 
 | 406 |         {"23", "mem_cache_power"}, {"25", "p0_mem_0_power"}, | 
| Sheldon Bailey | 11fd131 | 2022-04-19 10:16:58 -0500 | [diff] [blame] | 407 |         {"26", "p0_mem_1_power"},  {"27", "p0_mem_2_power"}, | 
 | 408 |         {"35", "pcie_dcm0_power"}, {"36", "pcie_dcm1_power"}, | 
 | 409 |         {"37", "pcie_dcm2_power"}, {"38", "pcie_dcm3_power"}, | 
 | 410 |         {"39", "io_dcm0_power"},   {"40", "io_dcm1_power"}, | 
 | 411 |         {"41", "io_dcm2_power"},   {"42", "io_dcm3_power"}, | 
 | 412 |         {"43", "avdd_total_power"}}; | 
| Chicago Duan | bb895cb | 2021-06-18 19:37:16 +0800 | [diff] [blame] | 413 |  | 
| Sheldon Bailey | 11fd131 | 2022-04-19 10:16:58 -0500 | [diff] [blame] | 414 |     /** @brief The dimm temperature sensor names map  */ | 
| Chicago Duan | bb895cb | 2021-06-18 19:37:16 +0800 | [diff] [blame] | 415 |     const std::map<uint32_t, std::string> dimmTempSensorName = { | 
 | 416 |         {internalMemCtlr, "_intmb_temp"}, | 
 | 417 |         {dimm, "_dram_temp"}, | 
 | 418 |         {memCtrlAndDimm, "_dram_extmb_temp"}, | 
 | 419 |         {PMIC, "_pmic_temp"}, | 
 | 420 |         {memCtlrExSensor, "_extmb_temp"}}; | 
 | 421 | #endif | 
| Chris Cain | 1725767 | 2021-10-22 13:41:03 -0500 | [diff] [blame] | 422 |  | 
 | 423 |     /** @brief Read the altitude from DBus */ | 
 | 424 |     void readAltitude(); | 
 | 425 |  | 
 | 426 |     /** @brief Callback function when ambient temperature changes | 
 | 427 |      * | 
 | 428 |      *  @param[in]  msg - Data associated with subscribed signal | 
 | 429 |      */ | 
 | 430 |     void ambientCallback(sdbusplus::message::message& msg); | 
| Chris Cain | a7b74dc | 2021-11-10 17:03:43 -0600 | [diff] [blame] | 431 |  | 
 | 432 |     /** @brief Confirm that a single OCC master was found and start presence | 
 | 433 |      * monitoring | 
 | 434 |      */ | 
 | 435 |     void validateOccMaster(); | 
| Vishwanatha Subbanna | 2180b2d | 2017-06-28 14:05:57 +0530 | [diff] [blame] | 436 | }; | 
 | 437 |  | 
 | 438 | } // namespace occ | 
 | 439 | } // namespace open_power |