blob: 0d337dc68d2b45f8f9b1a58aa2f274a995157407 [file] [log] [blame]
#pragma once
#include "config.h"
#ifdef POWER10
#include "occ_status.hpp"
#include <sdbusplus/bus.hpp>
#include <sdbusplus/bus/match.hpp>
#include <filesystem>
namespace open_power
{
namespace occ
{
namespace powermode
{
constexpr auto PMODE_PATH = "/xyz/openbmc_project/control/host0/power_mode";
constexpr auto PMODE_INTERFACE = "xyz.openbmc_project.Control.Power.Mode";
constexpr auto POWER_MODE_PROP = "PowerMode";
constexpr auto PIPS_PATH = "/xyz/openbmc_project/control/host0/power_ips";
constexpr auto PIPS_INTERFACE =
"xyz.openbmc_project.Control.Power.IdlePowerSaver";
constexpr auto IPS_ENABLED_PROP = "Enabled";
constexpr auto IPS_ENTER_UTIL = "EnterUtilizationPercent";
constexpr auto IPS_ENTER_TIME = "EnterDwellTime";
constexpr auto IPS_EXIT_UTIL = "ExitUtilizationPercent";
constexpr auto IPS_EXIT_TIME = "ExitDwellTime";
/** @brief Convert power mode string to OCC SysPwrMode value
*
* @param[in] i_modeString - power mode string
*
* @return SysPwrMode or SysPwrMode::NO_CHANGE if not found
*/
SysPwrMode convertStringToMode(const std::string& i_modeString);
/** @class PowerMode
* @brief Monitors for changes to the power mode and notifies occ
*
* The customer power mode is provided to the OCC by host TMGT when the occ
* first goes active or is reset. This code is responsible for sending
* the power mode to the OCC if the mode is changed while the occ is active.
*/
class PowerMode
{
public:
/** @brief PowerMode object to inform occ of changes to mode
*
* This object will monitor for changes to the power mode setting.
* If a change is detected, and the occ is active, then this object will
* notify the OCC of the change.
*
* @param[in] occStatus - The occ status object
*/
explicit PowerMode(Status& occStatus) :
occStatus(occStatus),
pmodeMatch(utils::getBus(),
sdbusplus::bus::match::rules::propertiesChanged(
PMODE_PATH, PMODE_INTERFACE),
[this](auto& msg) { this->modeChanged(msg); }){};
private:
/** @brief Callback for pmode setting changes
*
* Process change and inform OCC
*
* @param[in] msg - Data associated with pmode change signal
*
*/
void modeChanged(sdbusplus::message::message& msg);
/* @brief OCC Status object */
Status& occStatus;
/** @brief Used to subscribe to dbus pmode property changes **/
sdbusplus::bus::match_t pmodeMatch;
};
class PowerIPS
{
public:
/** @brief PowerIPS object to inform occ of changes to Idle Power Saver
* parms
*
* This object will monitor for changes to the Idle Power Saver settings.
* If a change is detected, and the occ is active, then this object will
* notify the OCC of the change.
*
* @param[in] occStatus - The occ status object
*/
explicit PowerIPS(Status& occStatus) :
occStatus(occStatus),
ipsMatch(utils::getBus(),
sdbusplus::bus::match::rules::propertiesChanged(
PIPS_PATH, PIPS_INTERFACE),
[this](auto& msg) { this->ipsChanged(msg); }){};
private:
/** @brief Callback for IPS setting changes
*
* Process change and inform OCC
*
* @param[in] msg - Data associated with IPS change signal
*
*/
void ipsChanged(sdbusplus::message::message& msg);
/* @brief OCC Status object */
Status& occStatus;
/** @brief Used to subscribe to dbus IPS property changes **/
sdbusplus::bus::match_t ipsMatch;
};
} // namespace powermode
} // namespace occ
} // namespace open_power
#endif