1 #pragma once
2 
3 #ifdef POWER10
4 #include "config.h"
5 
6 #include "occ_status.hpp"
7 
8 #include <experimental/filesystem>
9 #include <sdbusplus/bus.hpp>
10 #include <sdbusplus/bus/match.hpp>
11 
12 namespace open_power
13 {
14 namespace occ
15 {
16 namespace powermode
17 {
18 
19 constexpr auto PMODE_PATH = "/xyz/openbmc_project/control/host0/power_mode";
20 constexpr auto PMODE_INTERFACE = "xyz.openbmc_project.Control.Power.Mode";
21 constexpr auto POWER_MODE_PROP = "PowerMode";
22 
23 /** @brief Convert power mode string to OCC SysPwrMode value
24  *
25  * @param[in] i_modeString - power mode string
26  *
27  * @return  SysPwrMode or SysPwrMode::NO_CHANGE if not found
28  */
29 SysPwrMode convertStringToMode(const std::string& i_modeString);
30 
31 /** @class PowerMode
32  *  @brief Monitors for changes to the power mode and notifies occ
33  *
34  *  The customer power mode is provided to the OCC by host TMGT when the occ
35  *  first goes active or is reset.  This code is responsible for sending
36  *  the power mode to the OCC if the mode is changed while the occ is active.
37  */
38 
39 class PowerMode
40 {
41   public:
42     /** @brief PowerMode object to inform occ of changes to mode
43      *
44      * This object will monitor for changes to the power mode setting.
45      * If a change is detected, and the occ is active, then this object will
46      * notify the OCC of the change.
47      *
48      * @param[in] occStatus - The occ status object
49      */
50     PowerMode(Status& occStatus) :
51         occStatus(occStatus),
52         pmodeMatch(utils::getBus(),
53                    sdbusplus::bus::match::rules::propertiesChanged(
54                        PMODE_PATH, PMODE_INTERFACE),
55                    [this](auto& msg) { this->modeChanged(msg); }){};
56 
57   private:
58     /** @brief Callback for pmode setting changes
59      *
60      * Process change and inform OCC
61      *
62      * @param[in]  msg       - Data associated with pmode change signal
63      *
64      */
65     void modeChanged(sdbusplus::message::message& msg);
66 
67     /* @brief OCC Status object */
68     Status& occStatus;
69 
70     /** @brief Used to subscribe to dbus pmode property changes **/
71     sdbusplus::bus::match_t pmodeMatch;
72 };
73 
74 } // namespace powermode
75 
76 } // namespace occ
77 
78 } // namespace open_power
79 #endif
80