1307d80b3SVishwanatha Subbanna #pragma once 2bddcf853SGeorge Liu #include "config.h" 3307d80b3SVishwanatha Subbanna 494df8c90SGunnar Mills #include "i2c_occ.hpp" 5a8857c50SChris Cain #include "occ_command.hpp" 694df8c90SGunnar Mills #include "occ_device.hpp" 794df8c90SGunnar Mills #include "occ_events.hpp" 85d66a0aaSChris Cain #include "powercap.hpp" 936f9cdedSChris Cain #include "powermode.hpp" 10f3b7514eSGeorge Liu #include "utils.hpp" 1194df8c90SGunnar Mills 1294df8c90SGunnar Mills #include <org/open_power/Control/Host/server.hpp> 1394df8c90SGunnar Mills #include <org/open_power/OCC/Status/server.hpp> 14307d80b3SVishwanatha Subbanna #include <sdbusplus/bus.hpp> 15307d80b3SVishwanatha Subbanna #include <sdbusplus/server/object.hpp> 16a7b74dc3SChris Cain #ifdef POWER10 17a7b74dc3SChris Cain #include <sdeventplus/event.hpp> 18a7b74dc3SChris Cain #include <sdeventplus/utility/timer.hpp> 19a7b74dc3SChris Cain #endif 20c86d80faSChris Cain #include <xyz/openbmc_project/Control/Power/Throttle/server.hpp> 210ab90ca7SLei YU 22b5ca1015SGeorge Liu #include <functional> 23b5ca1015SGeorge Liu 24307d80b3SVishwanatha Subbanna namespace open_power 25307d80b3SVishwanatha Subbanna { 26307d80b3SVishwanatha Subbanna namespace occ 27307d80b3SVishwanatha Subbanna { 28307d80b3SVishwanatha Subbanna 29636577f4SEdward A. James class Manager; 30307d80b3SVishwanatha Subbanna namespace Base = sdbusplus::org::open_power::OCC::server; 31af40808fSPatrick Williams using Interface = sdbusplus::server::object_t<Base::Status>; 32307d80b3SVishwanatha Subbanna 33c86d80faSChris Cain namespace xyzBase = sdbusplus::xyz::openbmc_project::Control::Power::server; 34c86d80faSChris Cain using ThrottleInterface = sdbusplus::server::object_t<xyzBase::Throttle>; 35c86d80faSChris Cain 3630e329adSVishwanatha Subbanna // IPMID's host control application 3730e329adSVishwanatha Subbanna namespace Control = sdbusplus::org::open_power::Control::server; 3830e329adSVishwanatha Subbanna 3930e329adSVishwanatha Subbanna // For waiting on signals 4030e329adSVishwanatha Subbanna namespace sdbusRule = sdbusplus::bus::match::rules; 4130e329adSVishwanatha Subbanna 426add0b81SVishwanatha Subbanna // OCC status instance. Ex. for "occ0", the instance is 0 437e374fb4SChris Cain using instanceID = unsigned int; 446add0b81SVishwanatha Subbanna 456add0b81SVishwanatha Subbanna // IPMI sensor ID for a given OCC instance 466add0b81SVishwanatha Subbanna using sensorID = uint8_t; 476add0b81SVishwanatha Subbanna 481d69e192SAlexander Filippov // Human readable sensor name for DBus tree. E.g. "CPU0_OCC" 491d69e192SAlexander Filippov using sensorName = std::string; 501d69e192SAlexander Filippov 511d69e192SAlexander Filippov // OCC sensors definitions in the map 521d69e192SAlexander Filippov using sensorDefs = std::tuple<sensorID, sensorName>; 531d69e192SAlexander Filippov 54e7d976b4SEddie James // OCC sysfs name prefix 55e7d976b4SEddie James const std::string sysfsName = "occ-hwmon"; 56e7d976b4SEddie James 57c86d80faSChris Cain const uint8_t THROTTLED_NONE = 0x00; 58c86d80faSChris Cain const uint8_t THROTTLED_POWER = 0x01; 59c86d80faSChris Cain const uint8_t THROTTLED_THERMAL = 0x02; 60c86d80faSChris Cain const uint8_t THROTTLED_SAFE = 0x04; 61c86d80faSChris Cain const uint8_t THROTTLED_ALL = 0xFF; 62c86d80faSChris Cain 63307d80b3SVishwanatha Subbanna /** @class Status 64307d80b3SVishwanatha Subbanna * @brief Implementation of OCC Active Status 65307d80b3SVishwanatha Subbanna */ 66307d80b3SVishwanatha Subbanna class Status : public Interface 67307d80b3SVishwanatha Subbanna { 68307d80b3SVishwanatha Subbanna public: 69307d80b3SVishwanatha Subbanna Status() = delete; 70307d80b3SVishwanatha Subbanna ~Status() = default; 71307d80b3SVishwanatha Subbanna Status(const Status&) = delete; 72307d80b3SVishwanatha Subbanna Status& operator=(const Status&) = delete; 73307d80b3SVishwanatha Subbanna Status(Status&&) = default; 74307d80b3SVishwanatha Subbanna Status& operator=(Status&&) = default; 75307d80b3SVishwanatha Subbanna 76ee4d83dfSVishwanatha Subbanna /** @brief Constructs the Status object and 77ee4d83dfSVishwanatha Subbanna * the underlying device object 78307d80b3SVishwanatha Subbanna * 792dc9b1a2SVishwanatha Subbanna * @param[in] event - sd_event unique pointer reference 80307d80b3SVishwanatha Subbanna * @param[in] path - DBus object path 81636577f4SEdward A. James * @param[in] manager - OCC manager instance 822dc9b1a2SVishwanatha Subbanna * @param[in] callBack - Callback handler to invoke during 832dc9b1a2SVishwanatha Subbanna * property change 8400325238STom Joseph * @param[in] resetCallBack - callback handler to invoke for resetting the 8500325238STom Joseph * OCC if PLDM is the host communication 8600325238STom Joseph * protocol 87307d80b3SVishwanatha Subbanna */ Status(EventPtr & event,const char * path,Manager & managerRef,std::unique_ptr<powermode::PowerMode> & powerModeRef,std::function<void (instanceID,bool)> callBack=nullptr,std::function<void (instanceID)> resetCallBack=nullptr)8817257673SChris Cain Status(EventPtr& event, const char* path, Manager& managerRef, 8936f9cdedSChris Cain #ifdef POWER10 905d66a0aaSChris Cain std::unique_ptr<powermode::PowerMode>& powerModeRef, 9136f9cdedSChris Cain #endif 92373af757SSheldon Bailey std::function<void(instanceID, bool)> callBack = nullptr 9300325238STom Joseph #ifdef PLDM 9400325238STom Joseph , 9500325238STom Joseph std::function<void(instanceID)> resetCallBack = nullptr 9600325238STom Joseph #endif 9700325238STom Joseph ) : 9800325238STom Joseph 991923a752SPatrick Williams Interface(utils::getBus(), getDbusPath(path).c_str(), 1001923a752SPatrick Williams Interface::action::defer_emit), 1011be4337bSChris Cain path(path), managerCallBack(callBack), instance(getInstance(path)), 10217257673SChris Cain manager(managerRef), 10336f9cdedSChris Cain #ifdef POWER10 10436f9cdedSChris Cain pmode(powerModeRef), 10536f9cdedSChris Cain #endif 106ee4d83dfSVishwanatha Subbanna device(event, 1070ab90ca7SLei YU #ifdef I2C_OCC 108774f9af9SEddie James fs::path(DEV_PATH) / i2c_occ::getI2cDeviceName(path), 1090ab90ca7SLei YU #else 110774f9af9SEddie James fs::path(DEV_PATH) / 111774f9af9SEddie James fs::path(sysfsName + "." + std::to_string(instance + 1)), 1120ab90ca7SLei YU #endif 113ea2b22ebSSheldon Bailey managerRef, *this, 114ea2b22ebSSheldon Bailey #ifdef POWER10 115ea2b22ebSSheldon Bailey powerModeRef, 116ea2b22ebSSheldon Bailey #endif 117ea2b22ebSSheldon Bailey instance), 11830e329adSVishwanatha Subbanna hostControlSignal( 119f3b7514eSGeorge Liu utils::getBus(), 12094df8c90SGunnar Mills sdbusRule::type::signal() + sdbusRule::member("CommandComplete") + 12130e329adSVishwanatha Subbanna sdbusRule::path("/org/open_power/control/host0") + 12230e329adSVishwanatha Subbanna sdbusRule::interface("org.open_power.Control.Host") + 12330e329adSVishwanatha Subbanna sdbusRule::argN(0, Control::convertForMessage( 12430e329adSVishwanatha Subbanna Control::Host::Command::OCCReset)), 12594df8c90SGunnar Mills std::bind(std::mem_fn(&Status::hostControlEvent), this, 126a8857c50SChris Cain std::placeholders::_1)), 127f3b7514eSGeorge Liu occCmd(instance, (fs::path(OCC_CONTROL_ROOT) / 128a8857c50SChris Cain (std::string(OCC_NAME) + std::to_string(instance))) 129a8857c50SChris Cain .c_str()) 130a7b74dc3SChris Cain #ifdef POWER10 131a7b74dc3SChris Cain , 132a7b74dc3SChris Cain sdpEvent(sdeventplus::Event::get_default()), 133a7b74dc3SChris Cain safeStateDelayTimer( 134a7b74dc3SChris Cain sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic>( 135*f0295f52SChris Cain sdpEvent, std::bind(&Status::safeStateDelayExpired, this))) 136a7b74dc3SChris Cain #endif 137373af757SSheldon Bailey 13800325238STom Joseph #ifdef PLDM 13900325238STom Joseph , 14000325238STom Joseph resetCallBack(resetCallBack) 14100325238STom Joseph #endif 142307d80b3SVishwanatha Subbanna { 143b57f1510SVishwanatha Subbanna // Announce that we are ready 144b57f1510SVishwanatha Subbanna this->emit_object_added(); 145307d80b3SVishwanatha Subbanna } 146307d80b3SVishwanatha Subbanna 14732e84e98SVishwanatha Subbanna /** @brief Since we are overriding the setter-occActive but not the 14832e84e98SVishwanatha Subbanna * getter-occActive, we need to have this using in order to 14932e84e98SVishwanatha Subbanna * allow passthrough usage of the getter-occActive 15032e84e98SVishwanatha Subbanna */ 15132e84e98SVishwanatha Subbanna using Base::Status::occActive; 15232e84e98SVishwanatha Subbanna 153307d80b3SVishwanatha Subbanna /** @brief SET OccActive to True or False 154307d80b3SVishwanatha Subbanna * 155307d80b3SVishwanatha Subbanna * @param[in] value - Intended value 156307d80b3SVishwanatha Subbanna * 157307d80b3SVishwanatha Subbanna * @return - Updated value of the property 158307d80b3SVishwanatha Subbanna */ 159307d80b3SVishwanatha Subbanna bool occActive(bool value) override; 16032e84e98SVishwanatha Subbanna 1612dc9b1a2SVishwanatha Subbanna /** @brief Starts OCC error detection */ addErrorWatch()1622dc9b1a2SVishwanatha Subbanna inline void addErrorWatch() 1632dc9b1a2SVishwanatha Subbanna { 1642dc9b1a2SVishwanatha Subbanna return device.addErrorWatch(); 1652dc9b1a2SVishwanatha Subbanna } 1662dc9b1a2SVishwanatha Subbanna 1672dc9b1a2SVishwanatha Subbanna /** @brief Stops OCC error detection */ removeErrorWatch()1682dc9b1a2SVishwanatha Subbanna inline void removeErrorWatch() 1692dc9b1a2SVishwanatha Subbanna { 1702dc9b1a2SVishwanatha Subbanna return device.removeErrorWatch(); 1712dc9b1a2SVishwanatha Subbanna } 1722dc9b1a2SVishwanatha Subbanna 173dae2d940SEddie James /** @brief Starts to watch how many OCCs are present on the master */ addPresenceWatchMaster()174dae2d940SEddie James inline void addPresenceWatchMaster() 175dae2d940SEddie James { 176dae2d940SEddie James return device.addPresenceWatchMaster(); 177dae2d940SEddie James } 178dae2d940SEddie James 179bb895cb8SChicago Duan /** @brief Gets the occ instance number */ getOccInstanceID()180bb895cb8SChicago Duan unsigned int getOccInstanceID() 181bb895cb8SChicago Duan { 182bb895cb8SChicago Duan return instance; 183bb895cb8SChicago Duan } 184bb895cb8SChicago Duan 185bb895cb8SChicago Duan /** @brief Is this OCC the master OCC */ isMasterOcc()186bb895cb8SChicago Duan bool isMasterOcc() 187bb895cb8SChicago Duan { 188bb895cb8SChicago Duan return device.master(); 189bb895cb8SChicago Duan } 190bb895cb8SChicago Duan 191a8857c50SChris Cain /** @brief Read OCC state (will trigger kernel to poll the OCC) */ 192a8857c50SChris Cain void readOccState(); 193a8857c50SChris Cain 1949789e71fSEddie James /** @brief Called when device errors are detected 1959789e71fSEddie James * 1969789e71fSEddie James * @param[in] d - description of the error that occurred 1979789e71fSEddie James */ 1989789e71fSEddie James void deviceError(Error::Descriptor d = Error::Descriptor()); 199cbad219eSEddie James 20078e86012SChris Cain #ifdef POWER10 20178e86012SChris Cain /** @brief Handle additional tasks when the OCCs reach active state */ 20278e86012SChris Cain void occsWentActive(); 20378e86012SChris Cain 20417257673SChris Cain /** @brief Send Ambient & Altitude data to OCC 20517257673SChris Cain * 20617257673SChris Cain * @param[in] ambient - temperature to send (0xFF will force read 20717257673SChris Cain * of current temperature and altitude) 20817257673SChris Cain * @param[in] altitude - altitude to send (0xFFFF = unavailable) 20917257673SChris Cain * 21017257673SChris Cain * @return SUCCESS on success 21117257673SChris Cain */ 21217257673SChris Cain CmdStatus sendAmbient(const uint8_t ambient = 0xFF, 21317257673SChris Cain const uint16_t altitude = 0xFFFF); 214733b201fSChris Cain 215733b201fSChris Cain /** @brief Set flag indicating if PLDM sensor has been received 216733b201fSChris Cain * 217733b201fSChris Cain * @param[in] wasReceived - true if PLDM sensor was read 218733b201fSChris Cain */ setPldmSensorReceived(const bool wasReceived)219733b201fSChris Cain void setPldmSensorReceived(const bool wasReceived) 220733b201fSChris Cain { 221733b201fSChris Cain pldmSensorStateReceived = wasReceived; 222733b201fSChris Cain } 223733b201fSChris Cain 224733b201fSChris Cain /** @brief Read flag indicating if PLDM sensor has been read 225733b201fSChris Cain * 226733b201fSChris Cain * @return true if sensor has been read 227733b201fSChris Cain */ getPldmSensorReceived()228733b201fSChris Cain bool getPldmSensorReceived() 229733b201fSChris Cain { 230733b201fSChris Cain return pldmSensorStateReceived; 231733b201fSChris Cain } 23278e86012SChris Cain #endif // POWER10 23378e86012SChris Cain 2345d66a0aaSChris Cain /** @brief Return the HWMON path for this OCC 2355d66a0aaSChris Cain * 2365d66a0aaSChris Cain * @return path or empty path if not found 2375d66a0aaSChris Cain */ 238e2d0a43cSChris Cain fs::path getHwmonPath(); 2395d66a0aaSChris Cain 240c86d80faSChris Cain /** @brief Update the processor path associated with this OCC 241c86d80faSChris Cain */ updateProcAssociation()242c86d80faSChris Cain void updateProcAssociation() 243c86d80faSChris Cain { 244c86d80faSChris Cain readProcAssociation(); 245c86d80faSChris Cain if (nullptr != throttleHandle) 246c86d80faSChris Cain { 247c86d80faSChris Cain throttleHandle.reset(); 248c86d80faSChris Cain } 249c86d80faSChris Cain if (!procPath.empty()) 250c86d80faSChris Cain { 251c86d80faSChris Cain throttleHandle = std::make_unique<ThrottleInterface>( 252c86d80faSChris Cain utils::getBus(), procPath.c_str()); 253c86d80faSChris Cain } 254c86d80faSChris Cain } 255c86d80faSChris Cain 256c86d80faSChris Cain /** @brief Update the processor throttle status on dbus 257c86d80faSChris Cain */ 258c86d80faSChris Cain void updateThrottle(const bool isThrottled, const uint8_t reason); 259c86d80faSChris Cain 26032e84e98SVishwanatha Subbanna private: 26132e84e98SVishwanatha Subbanna /** @brief OCC dbus object path */ 26232e84e98SVishwanatha Subbanna std::string path; 26332e84e98SVishwanatha Subbanna 264c86d80faSChris Cain /** @brief Processor path associated with this OCC */ 265c86d80faSChris Cain std::string procPath; 266c86d80faSChris Cain 2672dc9b1a2SVishwanatha Subbanna /** @brief Callback handler to be invoked during property change. 2682dc9b1a2SVishwanatha Subbanna * This is a handler in Manager class 2692dc9b1a2SVishwanatha Subbanna */ 270373af757SSheldon Bailey std::function<void(instanceID, bool)> managerCallBack; 2712dc9b1a2SVishwanatha Subbanna 2726add0b81SVishwanatha Subbanna /** @brief OCC instance number. Ex, 0,1, etc */ 273a8857c50SChris Cain unsigned int instance; 274a8857c50SChris Cain 275a8857c50SChris Cain /** @brief The last state read from the OCC */ 276a8857c50SChris Cain unsigned int lastState = 0; 2776add0b81SVishwanatha Subbanna 278*f0295f52SChris Cain /** @brief The last OCC read status (0 = no error) */ 279*f0295f52SChris Cain int lastOccReadStatus = 0; 280*f0295f52SChris Cain 281373af757SSheldon Bailey /** @brief Number of retry attempts to open file and update state. */ 282373af757SSheldon Bailey const unsigned int occReadRetries = 1; 283373af757SSheldon Bailey 284373af757SSheldon Bailey /** @brief Current number of retries attempted towards occReadRetries. */ 285373af757SSheldon Bailey size_t currentOccReadRetriesCount = 0; 286373af757SSheldon Bailey 287373af757SSheldon Bailey /** @brief The Trigger to indicate OCC State is valid or not. */ 288373af757SSheldon Bailey bool stateValid = false; 289373af757SSheldon Bailey 2901d69e192SAlexander Filippov /** @brief OCC instance to Sensor definitions mapping */ 2911d69e192SAlexander Filippov static const std::map<instanceID, sensorDefs> sensorMap; 2926add0b81SVishwanatha Subbanna 29317257673SChris Cain /** @brief OCC manager object */ 29417257673SChris Cain const Manager& manager; 29517257673SChris Cain 29636f9cdedSChris Cain #ifdef POWER10 29736f9cdedSChris Cain /** @brief OCC PowerMode object */ 2985d66a0aaSChris Cain std::unique_ptr<powermode::PowerMode>& pmode; 29936f9cdedSChris Cain #endif 30036f9cdedSChris Cain 30132e84e98SVishwanatha Subbanna /** @brief OCC device object to do bind and unbind */ 30232e84e98SVishwanatha Subbanna Device device; 303ee4d83dfSVishwanatha Subbanna 30430e329adSVishwanatha Subbanna /** @brief Subscribe to host control signal 30530e329adSVishwanatha Subbanna * 30630e329adSVishwanatha Subbanna * Once the OCC reset is requested, BMC sends that message to host. 30730e329adSVishwanatha Subbanna * If the host does not ack the message, then there would be a timeout 30830e329adSVishwanatha Subbanna * and we need to catch that to log an error 30930e329adSVishwanatha Subbanna **/ 31030e329adSVishwanatha Subbanna sdbusplus::bus::match_t hostControlSignal; 31130e329adSVishwanatha Subbanna 312a8857c50SChris Cain /** @brief Command object to send commands to the OCC */ 313a8857c50SChris Cain OccCommand occCmd; 314a8857c50SChris Cain 315a7b74dc3SChris Cain #ifdef POWER10 316a7b74dc3SChris Cain /** @brief timer event */ 317a7b74dc3SChris Cain sdeventplus::Event sdpEvent; 318a7b74dc3SChris Cain #endif 319a7b74dc3SChris Cain 320e2d0a43cSChris Cain /** @brief hwmon path for this OCC */ 321e2d0a43cSChris Cain fs::path hwmonPath; 322e2d0a43cSChris Cain 323733b201fSChris Cain /** @brief flag indicating if the OCC sensor has been received */ 324733b201fSChris Cain bool pldmSensorStateReceived = false; 325733b201fSChris Cain 32630e329adSVishwanatha Subbanna /** @brief Callback function on host control signals 32730e329adSVishwanatha Subbanna * 32830e329adSVishwanatha Subbanna * @param[in] msg - Data associated with subscribed signal 32930e329adSVishwanatha Subbanna */ 330af40808fSPatrick Williams void hostControlEvent(sdbusplus::message_t& msg); 33130e329adSVishwanatha Subbanna 33230e329adSVishwanatha Subbanna /** @brief Sends a message to host control command handler to reset OCC 33330e329adSVishwanatha Subbanna */ 33430e329adSVishwanatha Subbanna void resetOCC(); 3351d69e192SAlexander Filippov 3361d69e192SAlexander Filippov /** @brief Determines the instance ID by specified object path. 3371d69e192SAlexander Filippov * @param[in] path Estimated OCC Dbus object path 3381d69e192SAlexander Filippov * @return Instance number 3391d69e192SAlexander Filippov */ getInstance(const std::string & path)3401d69e192SAlexander Filippov static int getInstance(const std::string& path) 3411d69e192SAlexander Filippov { 3421d69e192SAlexander Filippov return (path.empty() ? 0 : path.back() - '0'); 3431d69e192SAlexander Filippov } 3441d69e192SAlexander Filippov 34578e86012SChris Cain #ifdef POWER10 346a7b74dc3SChris Cain /** 347a7b74dc3SChris Cain * @brief Timer that is started when OCC is detected to be in safe mode 348a7b74dc3SChris Cain */ 349a7b74dc3SChris Cain sdeventplus::utility::Timer<sdeventplus::ClockId::Monotonic> 350a7b74dc3SChris Cain safeStateDelayTimer; 351a7b74dc3SChris Cain 352a7b74dc3SChris Cain /** @brief Callback for timer that is started when OCC was detected to be in 353a7b74dc3SChris Cain * safe mode. Called to verify and then disable and reset the OCCs. 354a7b74dc3SChris Cain */ 355a7b74dc3SChris Cain void safeStateDelayExpired(); 35678e86012SChris Cain #endif // POWER10 357*f0295f52SChris Cain 358373af757SSheldon Bailey /** @brief Callback for timer that is started when OCC state 359373af757SSheldon Bailey * was not able to be read. Called to attempt another read when needed. 360373af757SSheldon Bailey */ 361373af757SSheldon Bailey void occReadStateNow(); 36278e86012SChris Cain 3631d69e192SAlexander Filippov /** @brief Override the sensor name with name from the definition. 3641d69e192SAlexander Filippov * @param[in] estimatedPath - Estimated OCC Dbus object path 3651d69e192SAlexander Filippov * @return Fixed OCC DBus object path 3661d69e192SAlexander Filippov */ getDbusPath(const std::string & estimatedPath)3671d69e192SAlexander Filippov static std::string getDbusPath(const std::string& estimatedPath) 3681d69e192SAlexander Filippov { 3691d69e192SAlexander Filippov if (!estimatedPath.empty()) 3701d69e192SAlexander Filippov { 3711d69e192SAlexander Filippov auto it = sensorMap.find(getInstance(estimatedPath)); 3721d69e192SAlexander Filippov if (sensorMap.end() != it) 3731d69e192SAlexander Filippov { 3741d69e192SAlexander Filippov auto& name = std::get<1>(it->second); 3751d69e192SAlexander Filippov if (!name.empty() && name != "None") 3761d69e192SAlexander Filippov { 377f3a4a69fSGeorge Liu auto objectPath = fs::path(estimatedPath); 378f3a4a69fSGeorge Liu objectPath.replace_filename(name); 379f3a4a69fSGeorge Liu return objectPath.string(); 3801d69e192SAlexander Filippov } 3811d69e192SAlexander Filippov } 3821d69e192SAlexander Filippov } 3831d69e192SAlexander Filippov 3841d69e192SAlexander Filippov return estimatedPath; 3851d69e192SAlexander Filippov } 38600325238STom Joseph #ifdef PLDM 38700325238STom Joseph std::function<void(instanceID)> resetCallBack = nullptr; 38800325238STom Joseph #endif 389c86d80faSChris Cain 390c86d80faSChris Cain /** @brief Current throttle reason(s) for this processor */ 391c86d80faSChris Cain uint8_t throttleCause = THROTTLED_NONE; 392c86d80faSChris Cain 393c86d80faSChris Cain /** @brief Throttle interface for the processor associated with this OCC */ 394c86d80faSChris Cain std::unique_ptr<ThrottleInterface> throttleHandle; 395c86d80faSChris Cain 396c86d80faSChris Cain /** @brief Read the processor path associated with this OCC */ 397c86d80faSChris Cain void readProcAssociation(); 398307d80b3SVishwanatha Subbanna }; 399307d80b3SVishwanatha Subbanna 400307d80b3SVishwanatha Subbanna } // namespace occ 401307d80b3SVishwanatha Subbanna } // namespace open_power 402