xref: /openbmc/openpower-occ-control/powermode.hpp (revision cde7bea3d41e51204dad61761d46af70b34a787a)
178e86012SChris Cain #pragma once
278e86012SChris Cain 
378e86012SChris Cain #include "config.h"
478e86012SChris Cain 
5bddcf853SGeorge Liu #ifdef POWER10
636f9cdedSChris Cain #include "occ_command.hpp"
778e86012SChris Cain 
836f9cdedSChris Cain #include <cereal/archives/json.hpp>
936f9cdedSChris Cain //#include <cereal/archives/binary.hpp>
1036f9cdedSChris Cain #include <cereal/cereal.hpp>
1136f9cdedSChris Cain #include <cereal/types/string.hpp>
1236f9cdedSChris Cain #include <cereal/types/tuple.hpp>
1336f9cdedSChris Cain #include <cereal/types/vector.hpp>
1478e86012SChris Cain #include <sdbusplus/bus.hpp>
1578e86012SChris Cain #include <sdbusplus/bus/match.hpp>
161be4337bSChris Cain #include <xyz/openbmc_project/Control/Power/IdlePowerSaver/server.hpp>
171be4337bSChris Cain #include <xyz/openbmc_project/Control/Power/Mode/server.hpp>
1878e86012SChris Cain 
19bcef3b48SGeorge Liu #include <filesystem>
20b5ca1015SGeorge Liu 
2178e86012SChris Cain namespace open_power
2278e86012SChris Cain {
2378e86012SChris Cain namespace occ
2478e86012SChris Cain {
2536f9cdedSChris Cain 
2636f9cdedSChris Cain class Manager;
2736f9cdedSChris Cain 
2878e86012SChris Cain namespace powermode
2978e86012SChris Cain {
301be4337bSChris Cain namespace Base = sdbusplus::xyz::openbmc_project::Control::Power::server;
311be4337bSChris Cain using ModeInterface = sdbusplus::server::object::object<Base::Mode>;
321be4337bSChris Cain using IpsInterface = sdbusplus::server::object::object<Base::IdlePowerSaver>;
331be4337bSChris Cain using namespace std::literals::string_literals;
3478e86012SChris Cain 
3578e86012SChris Cain constexpr auto PMODE_PATH = "/xyz/openbmc_project/control/host0/power_mode";
3678e86012SChris Cain constexpr auto PMODE_INTERFACE = "xyz.openbmc_project.Control.Power.Mode";
3778e86012SChris Cain constexpr auto POWER_MODE_PROP = "PowerMode";
3878e86012SChris Cain 
391d51da29SChris Cain constexpr auto PIPS_PATH = "/xyz/openbmc_project/control/host0/power_ips";
401d51da29SChris Cain constexpr auto PIPS_INTERFACE =
411d51da29SChris Cain     "xyz.openbmc_project.Control.Power.IdlePowerSaver";
421d51da29SChris Cain constexpr auto IPS_ENABLED_PROP = "Enabled";
431d51da29SChris Cain constexpr auto IPS_ENTER_UTIL = "EnterUtilizationPercent";
441d51da29SChris Cain constexpr auto IPS_ENTER_TIME = "EnterDwellTime";
451d51da29SChris Cain constexpr auto IPS_EXIT_UTIL = "ExitUtilizationPercent";
461d51da29SChris Cain constexpr auto IPS_EXIT_TIME = "ExitDwellTime";
471d51da29SChris Cain 
481be4337bSChris Cain const auto PMODE_DEFAULT_INTERFACE =
491be4337bSChris Cain     "xyz.openbmc_project.Configuration.PowerModeProperties"s;
501be4337bSChris Cain 
5136f9cdedSChris Cain /** @brief Query the current Hypervisor target
5236f9cdedSChris Cain  * @return true if the current Hypervisor target is PowerVM
5336f9cdedSChris Cain  */
5436f9cdedSChris Cain bool isPowerVM();
5536f9cdedSChris Cain 
5678e86012SChris Cain /** @brief Convert power mode string to OCC SysPwrMode value
5778e86012SChris Cain  *
5878e86012SChris Cain  * @param[in] i_modeString - power mode string
5978e86012SChris Cain  *
6078e86012SChris Cain  * @return  SysPwrMode or SysPwrMode::NO_CHANGE if not found
6178e86012SChris Cain  */
6278e86012SChris Cain SysPwrMode convertStringToMode(const std::string& i_modeString);
6378e86012SChris Cain 
641be4337bSChris Cain struct PowerModeData
6536f9cdedSChris Cain {
661be4337bSChris Cain     bool modeInitialized = false;
671be4337bSChris Cain     SysPwrMode mode = SysPwrMode::NO_CHANGE;
681be4337bSChris Cain     uint16_t oemModeData = 0x0000;
691be4337bSChris Cain     bool ipsInitialized = false;
701be4337bSChris Cain     bool ipsEnabled = true;
711be4337bSChris Cain     uint8_t ipsEnterUtil = 0;
721be4337bSChris Cain     uint16_t ipsEnterTime = 0;
731be4337bSChris Cain     uint8_t ipsExitUtil = 0;
741be4337bSChris Cain     uint16_t ipsExitTime = 0;
7536f9cdedSChris Cain 
7636f9cdedSChris Cain     /** @brief Function specifying data to archive for cereal.
7736f9cdedSChris Cain      */
7836f9cdedSChris Cain     template <class Archive>
7936f9cdedSChris Cain     void serialize(Archive& archive)
8036f9cdedSChris Cain     {
811be4337bSChris Cain         archive(modeInitialized, mode, oemModeData, ipsInitialized, ipsEnabled,
821be4337bSChris Cain                 ipsEnterUtil, ipsEnterTime, ipsExitUtil, ipsExitTime);
8336f9cdedSChris Cain     }
8436f9cdedSChris Cain };
8536f9cdedSChris Cain 
8636f9cdedSChris Cain /** @class OccPersistData
8736f9cdedSChris Cain  *  @brief Provides persistent container to store data for OCC
8836f9cdedSChris Cain  *
8936f9cdedSChris Cain  * Data is stored via cereal
9036f9cdedSChris Cain  */
9136f9cdedSChris Cain class OccPersistData
9236f9cdedSChris Cain {
9336f9cdedSChris Cain   public:
9436f9cdedSChris Cain     ~OccPersistData() = default;
9536f9cdedSChris Cain     OccPersistData(const OccPersistData&) = default;
9636f9cdedSChris Cain     OccPersistData& operator=(const OccPersistData&) = default;
9736f9cdedSChris Cain     OccPersistData(OccPersistData&&) = default;
9836f9cdedSChris Cain     OccPersistData& operator=(OccPersistData&&) = default;
9936f9cdedSChris Cain 
1001be4337bSChris Cain     /** @brief Loads any saved power mode data */
10136f9cdedSChris Cain     OccPersistData()
10236f9cdedSChris Cain     {
10336f9cdedSChris Cain         load();
10436f9cdedSChris Cain     }
10536f9cdedSChris Cain 
10636f9cdedSChris Cain     /** @brief Save Power Mode data to persistent file
10736f9cdedSChris Cain      *
1081be4337bSChris Cain      *  @param[in] newMode - desired System Power Mode
1091be4337bSChris Cain      *  @param[in] oemModeData - data required by some OEM Power Modes
11036f9cdedSChris Cain      */
1111be4337bSChris Cain     void updateMode(const SysPwrMode newMode, const uint16_t oemModeData)
11236f9cdedSChris Cain     {
1131be4337bSChris Cain         modeData.mode = newMode;
1141be4337bSChris Cain         modeData.oemModeData = oemModeData;
1151be4337bSChris Cain         modeData.modeInitialized = true;
11636f9cdedSChris Cain         save();
11736f9cdedSChris Cain     }
11836f9cdedSChris Cain 
1191be4337bSChris Cain     /** @brief Write Idle Power Saver parameters to persistent file
12036f9cdedSChris Cain      *
1211be4337bSChris Cain      *  @param[in] enabled - Idle Power Save status (true = enabled)
1221be4337bSChris Cain      *  @param[in] enterUtil - IPS Enter Utilization (%)
1231be4337bSChris Cain      *  @param[in] enterTime - IPS Enter Time (seconds)
1241be4337bSChris Cain      *  @param[in] exitUtil - IPS Exit Utilization (%)
1251be4337bSChris Cain      *  @param[in] exitTime - IPS Exit Time (seconds)
12636f9cdedSChris Cain      */
1271be4337bSChris Cain     void updateIPS(const bool enabled, const uint8_t enterUtil,
1281be4337bSChris Cain                    const uint16_t enterTime, const uint8_t exitUtil,
1291be4337bSChris Cain                    const uint16_t exitTime)
13036f9cdedSChris Cain     {
1311be4337bSChris Cain         modeData.ipsEnabled = enabled;
1321be4337bSChris Cain         modeData.ipsEnterUtil = enterUtil;
1331be4337bSChris Cain         modeData.ipsEnterTime = enterTime;
1341be4337bSChris Cain         modeData.ipsExitUtil = exitUtil;
1351be4337bSChris Cain         modeData.ipsExitTime = exitTime;
1361be4337bSChris Cain         modeData.ipsInitialized = true;
1371be4337bSChris Cain         save();
1381be4337bSChris Cain     }
1391be4337bSChris Cain 
1401be4337bSChris Cain     /** @brief Return the Power Mode and mode data
1411be4337bSChris Cain      *
1421be4337bSChris Cain      *  @param[out] mode - current system power mode
1431be4337bSChris Cain      *  @param[out] oemModeData - frequency data for some OEM mode
1441be4337bSChris Cain      *
1451be4337bSChris Cain      *  @returns true if mode was available
1461be4337bSChris Cain      */
1471be4337bSChris Cain     bool getMode(SysPwrMode& mode, uint16_t& oemModeData) const
1481be4337bSChris Cain     {
1491be4337bSChris Cain         if (!modeData.modeInitialized)
15036f9cdedSChris Cain         {
15136f9cdedSChris Cain             return false;
15236f9cdedSChris Cain         }
15336f9cdedSChris Cain 
1541be4337bSChris Cain         mode = modeData.mode;
1551be4337bSChris Cain         oemModeData = modeData.oemModeData;
15636f9cdedSChris Cain         return true;
15736f9cdedSChris Cain     }
15836f9cdedSChris Cain 
1591be4337bSChris Cain     /** @brief Get the Idle Power Saver properties from DBus
1601be4337bSChris Cain      *
1611be4337bSChris Cain      *  @param[out] enabled - Idle Power Save status (true = enabled)
1621be4337bSChris Cain      *  @param[out] enterUtil - IPS Enter Utilization (%)
1631be4337bSChris Cain      *  @param[out] enterTime - IPS Enter Time (seconds)
1641be4337bSChris Cain      *  @param[out] exitUtil - IPS Exit Utilization (%)
1651be4337bSChris Cain      *  @param[out] exitTime - IPS Exit Time (seconds)
1661be4337bSChris Cain      *
1671be4337bSChris Cain      * @return true if parameters were read successfully
1681be4337bSChris Cain      */
1691be4337bSChris Cain     bool getIPS(bool& enabled, uint8_t& enterUtil, uint16_t& enterTime,
1701be4337bSChris Cain                 uint8_t& exitUtil, uint16_t& exitTime)
1711be4337bSChris Cain     {
1721be4337bSChris Cain         if (!modeData.ipsInitialized)
1731be4337bSChris Cain         {
1741be4337bSChris Cain             return false;
1751be4337bSChris Cain         }
1761be4337bSChris Cain 
1771be4337bSChris Cain         enabled = modeData.ipsEnabled;
1781be4337bSChris Cain         enterUtil = modeData.ipsEnterUtil;
1791be4337bSChris Cain         enterTime = modeData.ipsEnterTime;
1801be4337bSChris Cain         exitUtil = modeData.ipsExitUtil;
1811be4337bSChris Cain         exitTime = modeData.ipsExitTime;
1821be4337bSChris Cain         return true;
1831be4337bSChris Cain     }
1841be4337bSChris Cain 
1851be4337bSChris Cain     /** @brief Return true if the power mode is available */
1861be4337bSChris Cain     bool modeAvailable()
1871be4337bSChris Cain     {
1881be4337bSChris Cain         return (modeData.modeInitialized);
1891be4337bSChris Cain     }
1901be4337bSChris Cain 
191*cde7bea3SChris Cain     /** @brief Return true if the IPS data is available */
1921be4337bSChris Cain     bool ipsAvailable()
1931be4337bSChris Cain     {
1941be4337bSChris Cain         return (modeData.ipsInitialized);
1951be4337bSChris Cain     }
1961be4337bSChris Cain 
19736f9cdedSChris Cain     /** @brief Saves the Power Mode data in the filesystem using cereal. */
19836f9cdedSChris Cain     void save();
19936f9cdedSChris Cain 
2001be4337bSChris Cain     /** @brief Trace the Power Mode and IPS parameters. */
2011be4337bSChris Cain     void print();
20236f9cdedSChris Cain 
20336f9cdedSChris Cain   private:
2041be4337bSChris Cain     /** @brief Power Mode data filename to store persistent data */
2051be4337bSChris Cain     static constexpr auto powerModeFilename = "powerModeData";
20636f9cdedSChris Cain 
2071be4337bSChris Cain     /** @brief Power Mode data object to be persisted */
2081be4337bSChris Cain     PowerModeData modeData;
20936f9cdedSChris Cain 
21036f9cdedSChris Cain     /** @brief Loads the OEM mode data in the filesystem using cereal. */
21136f9cdedSChris Cain     void load();
21236f9cdedSChris Cain };
21336f9cdedSChris Cain 
21478e86012SChris Cain /** @class PowerMode
21578e86012SChris Cain  *  @brief Monitors for changes to the power mode and notifies occ
21678e86012SChris Cain  *
21778e86012SChris Cain  *  The customer power mode is provided to the OCC by host TMGT when the occ
21878e86012SChris Cain  *  first goes active or is reset.  This code is responsible for sending
21978e86012SChris Cain  *  the power mode to the OCC if the mode is changed while the occ is active.
22078e86012SChris Cain  */
22178e86012SChris Cain 
2221be4337bSChris Cain class PowerMode : public ModeInterface, public IpsInterface
22378e86012SChris Cain {
22478e86012SChris Cain   public:
22578e86012SChris Cain     /** @brief PowerMode object to inform occ of changes to mode
22678e86012SChris Cain      *
22778e86012SChris Cain      * This object will monitor for changes to the power mode setting.
22878e86012SChris Cain      * If a change is detected, and the occ is active, then this object will
22978e86012SChris Cain      * notify the OCC of the change.
23078e86012SChris Cain      *
2311be4337bSChris Cain      * @param[in] managerRef - manager object reference
2321be4337bSChris Cain      * @param[in] modePath - Power Mode dbus path
2331be4337bSChris Cain      * @param[in] ipsPath - Idle Power Saver dbus path
23478e86012SChris Cain      */
2351be4337bSChris Cain     explicit PowerMode(const Manager& managerRef, const char* modePath,
2361be4337bSChris Cain                        const char* ipsPath) :
2371be4337bSChris Cain         ModeInterface(utils::getBus(), modePath, false),
2381be4337bSChris Cain         IpsInterface(utils::getBus(), ipsPath, false), manager(managerRef),
23978e86012SChris Cain         pmodeMatch(utils::getBus(),
24078e86012SChris Cain                    sdbusplus::bus::match::rules::propertiesChanged(
24178e86012SChris Cain                        PMODE_PATH, PMODE_INTERFACE),
24236f9cdedSChris Cain                    [this](auto& msg) { this->modeChanged(msg); }),
24336f9cdedSChris Cain         ipsMatch(utils::getBus(),
24436f9cdedSChris Cain                  sdbusplus::bus::match::rules::propertiesChanged(
24536f9cdedSChris Cain                      PIPS_PATH, PIPS_INTERFACE),
24636f9cdedSChris Cain                  [this](auto& msg) { this->ipsChanged(msg); }),
2471be4337bSChris Cain         defaultsUpdateMatch(
2481be4337bSChris Cain             utils::getBus(),
2491be4337bSChris Cain             sdbusplus::bus::match::rules::propertiesChangedNamespace(
2501be4337bSChris Cain                 "/xyz/openbmc_project/inventory", PMODE_DEFAULT_INTERFACE),
2511be4337bSChris Cain             [this](auto& msg) { this->defaultsReady(msg); }),
2521be4337bSChris Cain         masterOccSet(false), masterActive(false)
2531be4337bSChris Cain     {
2541be4337bSChris Cain         // restore Power Mode to DBus
2551be4337bSChris Cain         SysPwrMode currentMode;
2561be4337bSChris Cain         uint16_t oemModeData = 0;
2571be4337bSChris Cain         if (getMode(currentMode, oemModeData))
2581be4337bSChris Cain         {
2591be4337bSChris Cain             updateDbusMode(currentMode);
2601be4337bSChris Cain         }
2611be4337bSChris Cain         // restore Idle Power Saver parameters to DBus
2621be4337bSChris Cain         uint8_t enterUtil, exitUtil;
2631be4337bSChris Cain         uint16_t enterTime, exitTime;
2641be4337bSChris Cain         bool ipsEnabled;
2651be4337bSChris Cain         if (getIPSParms(ipsEnabled, enterUtil, enterTime, exitUtil, exitTime))
2661be4337bSChris Cain         {
2671be4337bSChris Cain             updateDbusIPS(ipsEnabled, enterUtil, enterTime, exitUtil, exitTime);
2681be4337bSChris Cain         }
2691be4337bSChris Cain     };
27036f9cdedSChris Cain 
2711be4337bSChris Cain     /** @brief Initialize the persistent data with default values
2721be4337bSChris Cain      *
2731be4337bSChris Cain      * @return true if initialization completed
2741be4337bSChris Cain      */
2751be4337bSChris Cain     bool initPersistentData();
2761be4337bSChris Cain 
2771be4337bSChris Cain     /** @brief Set the current power mode property
2781be4337bSChris Cain      *
2791be4337bSChris Cain      * @param[in] newMode     - desired system power mode
2801be4337bSChris Cain      * @param[in] oemModeData - data required by some OEM Power Modes
2811be4337bSChris Cain      *
2821be4337bSChris Cain      * @return true if mode accepted
2831be4337bSChris Cain      */
2841be4337bSChris Cain     bool setMode(const SysPwrMode newMode, const uint16_t oemModeData);
28536f9cdedSChris Cain 
28636f9cdedSChris Cain     /** @brief Send mode change command to the master OCC
28736f9cdedSChris Cain      *  @return SUCCESS on success
28836f9cdedSChris Cain      */
28936f9cdedSChris Cain     CmdStatus sendModeChange();
29036f9cdedSChris Cain 
29136f9cdedSChris Cain     /** @brief Send Idle Power Saver config data to the master OCC
29236f9cdedSChris Cain      *  @return SUCCESS on success
29336f9cdedSChris Cain      */
29436f9cdedSChris Cain     CmdStatus sendIpsData();
29536f9cdedSChris Cain 
2966fa848a9SChris Cain     /** @brief Set the master OCC path
2976fa848a9SChris Cain      *
2986fa848a9SChris Cain      * @param[in]  occPath - hwmon path for master OCC
2996fa848a9SChris Cain      */
3006fa848a9SChris Cain     void setMasterOcc(const std::string& occPath);
3016fa848a9SChris Cain 
30236f9cdedSChris Cain     /** @brief Notify object of master OCC state.  If not acitve, no
30336f9cdedSChris Cain      * commands will be sent to the master OCC
30436f9cdedSChris Cain      *
30536f9cdedSChris Cain      * @param[in]  isActive - true when master OCC is active
30636f9cdedSChris Cain      */
30736f9cdedSChris Cain     void setMasterActive(const bool isActive = true)
30836f9cdedSChris Cain     {
30936f9cdedSChris Cain         masterActive = isActive;
31036f9cdedSChris Cain     };
31178e86012SChris Cain 
31278e86012SChris Cain   private:
31336f9cdedSChris Cain     /** @brief OCC manager object */
31436f9cdedSChris Cain     const Manager& manager;
31536f9cdedSChris Cain 
31636f9cdedSChris Cain     /** @brief Pass-through occ path on the bus */
31736f9cdedSChris Cain     std::string path;
31836f9cdedSChris Cain 
31936f9cdedSChris Cain     /** @brief OCC instance number */
32036f9cdedSChris Cain     int occInstance;
32136f9cdedSChris Cain 
32236f9cdedSChris Cain     /** @brief Object to send commands to the OCC */
3236fa848a9SChris Cain     std::unique_ptr<open_power::occ::OccCommand> occCmd;
32436f9cdedSChris Cain 
32536f9cdedSChris Cain     /** @brief Used to subscribe to dbus pmode property changes **/
32636f9cdedSChris Cain     sdbusplus::bus::match_t pmodeMatch;
32736f9cdedSChris Cain 
32836f9cdedSChris Cain     /** @brief Used to subscribe to dbus IPS property changes **/
32936f9cdedSChris Cain     sdbusplus::bus::match_t ipsMatch;
33036f9cdedSChris Cain 
3311be4337bSChris Cain     /** @brief Used to subscribe to dbus defaults property changes **/
3321be4337bSChris Cain     sdbusplus::bus::match_t defaultsUpdateMatch;
3331be4337bSChris Cain 
33436f9cdedSChris Cain     OccPersistData persistedData;
33536f9cdedSChris Cain 
3366fa848a9SChris Cain     /** @brief True when the master OCC has been established */
3376fa848a9SChris Cain     bool masterOccSet;
3386fa848a9SChris Cain 
3396fa848a9SChris Cain     /** @brief True when the master OCC is active */
34036f9cdedSChris Cain     bool masterActive;
34136f9cdedSChris Cain 
34278e86012SChris Cain     /** @brief Callback for pmode setting changes
34378e86012SChris Cain      *
34478e86012SChris Cain      * Process change and inform OCC
34578e86012SChris Cain      *
34678e86012SChris Cain      * @param[in]  msg       - Data associated with pmode change signal
34778e86012SChris Cain      *
34878e86012SChris Cain      */
34978e86012SChris Cain     void modeChanged(sdbusplus::message::message& msg);
35078e86012SChris Cain 
3511be4337bSChris Cain     /** @brief Get the current power mode property
3521be4337bSChris Cain      *
3531be4337bSChris Cain      * @param[out] currentMode - current system power mode
3541be4337bSChris Cain      * @param[out] oemModeData - frequency data for some OEM mode
3551be4337bSChris Cain      *
3561be4337bSChris Cain      * @return true if data read successfully
3571d51da29SChris Cain      */
3581be4337bSChris Cain     bool getMode(SysPwrMode& currentMode, uint16_t& oemModeData);
3591d51da29SChris Cain 
36036f9cdedSChris Cain     /** @brief Update the power mode property on DBus
36136f9cdedSChris Cain      *
36236f9cdedSChris Cain      * @param[in]  newMode - desired power mode
36336f9cdedSChris Cain      *
36436f9cdedSChris Cain      * @return true on success
36536f9cdedSChris Cain      */
36636f9cdedSChris Cain     bool updateDbusMode(const SysPwrMode newMode);
36736f9cdedSChris Cain 
3681d51da29SChris Cain     /** @brief Callback for IPS setting changes
3691d51da29SChris Cain      *
3701d51da29SChris Cain      * Process change and inform OCC
3711d51da29SChris Cain      *
3721d51da29SChris Cain      * @param[in]  msg - Data associated with IPS change signal
3731d51da29SChris Cain      *
3741d51da29SChris Cain      */
3751d51da29SChris Cain     void ipsChanged(sdbusplus::message::message& msg);
3761d51da29SChris Cain 
3771be4337bSChris Cain     /** @brief Get the Idle Power Saver properties
3781be4337bSChris Cain      *
3791be4337bSChris Cain      *  @param[out] enabled - Idle Power Save status (true = enabled)
3801be4337bSChris Cain      *  @param[out] enterUtil - IPS Enter Utilization (%)
3811be4337bSChris Cain      *  @param[out] enterTime - IPS Enter Time (seconds)
3821be4337bSChris Cain      *  @param[out] exitUtil - IPS Exit Utilization (%)
3831be4337bSChris Cain      *  @param[out] exitTime - IPS Exit Time (seconds)
3841be4337bSChris Cain      *
3851be4337bSChris Cain      * @return true if data read successfully
38636f9cdedSChris Cain      */
3871be4337bSChris Cain     bool getIPSParms(bool& enabled, uint8_t& enterUtil, uint16_t& enterTime,
3881be4337bSChris Cain                      uint8_t& exitUtil, uint16_t& exitTime);
3891be4337bSChris Cain 
3901be4337bSChris Cain     /** Update the Idle Power Saver data on DBus
3911be4337bSChris Cain      *
3921be4337bSChris Cain      *  @param[in] enabled - Idle Power Save status (true = enabled)
3931be4337bSChris Cain      *  @param[in] enterUtil - IPS Enter Utilization (%)
3941be4337bSChris Cain      *  @param[in] enterTime - IPS Enter Time (seconds)
3951be4337bSChris Cain      *  @param[in] exitUtil - IPS Exit Utilization (%)
3961be4337bSChris Cain      *  @param[in] exitTime - IPS Exit Time (seconds)
3971be4337bSChris Cain      *
3981be4337bSChris Cain      *  @return true if parameters were set successfully
3991be4337bSChris Cain      */
4001be4337bSChris Cain     bool updateDbusIPS(const bool enabled, const uint8_t enterUtil,
4011be4337bSChris Cain                        const uint16_t enterTime, const uint8_t exitUtil,
4021be4337bSChris Cain                        const uint16_t exitTime);
4031be4337bSChris Cain 
4041be4337bSChris Cain     /** @brief Callback for entity manager default changes
4051be4337bSChris Cain      *
4061be4337bSChris Cain      * Called when PowerModeProperties defaults are available
4071be4337bSChris Cain      */
4081be4337bSChris Cain     void defaultsReady(sdbusplus::message::message& msg);
4091be4337bSChris Cain 
4101be4337bSChris Cain     /** @brief Get the default power mode property for this system type
4111be4337bSChris Cain      *
4121be4337bSChris Cain      * @param[out] defaultMode - default system power mode
4131be4337bSChris Cain      *
4141be4337bSChris Cain      * @return true if data read successfully
4151be4337bSChris Cain      */
4161be4337bSChris Cain     bool getDefaultMode(SysPwrMode& defaultMode);
4171be4337bSChris Cain 
4181be4337bSChris Cain     /** @brief Get the default Idle Power Saver properties for this system type
4191be4337bSChris Cain      *
4201be4337bSChris Cain      *  @param[out] enabled - Idle Power Save status (true = enabled)
4211be4337bSChris Cain      *  @param[out] enterUtil - IPS Enter Utilization (%)
4221be4337bSChris Cain      *  @param[out] enterTime - IPS Enter Time (seconds)
4231be4337bSChris Cain      *  @param[out] exitUtil - IPS Exit Utilization (%)
4241be4337bSChris Cain      *  @param[out] exitTime - IPS Exit Time (seconds)
4251be4337bSChris Cain      *
4261be4337bSChris Cain      *  @return true if parameters were read successfully
4271be4337bSChris Cain      */
4281be4337bSChris Cain     bool getDefaultIPSParms(bool& enabled, uint8_t& enterUtil,
4291be4337bSChris Cain                             uint16_t& enterTime, uint8_t& exitUtil,
43036f9cdedSChris Cain                             uint16_t& exitTime);
431*cde7bea3SChris Cain 
432*cde7bea3SChris Cain     /** @brief Read the default Idle Power Saver parameters and save them to the
433*cde7bea3SChris Cain      * DBUS so they will get used
434*cde7bea3SChris Cain      *
435*cde7bea3SChris Cain      * @return true if restore was successful
436*cde7bea3SChris Cain      */
437*cde7bea3SChris Cain     bool useDefaultIPSParms();
4381d51da29SChris Cain };
4391d51da29SChris Cain 
44078e86012SChris Cain } // namespace powermode
44178e86012SChris Cain 
44278e86012SChris Cain } // namespace occ
44378e86012SChris Cain 
44478e86012SChris Cain } // namespace open_power
44578e86012SChris Cain #endif
446