xref: /openbmc/x86-power-control/src/power_control.hpp (revision cea510b70811f8555d517efbf5e706903177ca85)
150fe8ee3SAndrei Kartashev /*
250fe8ee3SAndrei Kartashev  * SPDX-License-Identifier: Apache-2.0
350fe8ee3SAndrei Kartashev  * Copyright (C) 2021-2022 YADRO.
450fe8ee3SAndrei Kartashev  */
550fe8ee3SAndrei Kartashev 
650fe8ee3SAndrei Kartashev #pragma once
750fe8ee3SAndrei Kartashev 
8744e9a98SEd Tanous #include <boost/asio/io_context.hpp>
999e8f9dfSAndrei Kartashev #include <boost/asio/steady_timer.hpp>
1099e8f9dfSAndrei Kartashev #include <boost/container/flat_map.hpp>
1150fe8ee3SAndrei Kartashev #include <nlohmann/json.hpp>
1299e8f9dfSAndrei Kartashev #include <sdbusplus/asio/object_server.hpp>
1350fe8ee3SAndrei Kartashev 
1450fe8ee3SAndrei Kartashev #include <filesystem>
15*cea510b7SEd Tanous #include <list>
1650fe8ee3SAndrei Kartashev #include <string_view>
1750fe8ee3SAndrei Kartashev 
1850fe8ee3SAndrei Kartashev namespace power_control
1950fe8ee3SAndrei Kartashev {
2050fe8ee3SAndrei Kartashev 
2150fe8ee3SAndrei Kartashev /**
2250fe8ee3SAndrei Kartashev  * @brief Persistent State Manager
2350fe8ee3SAndrei Kartashev  *
2450fe8ee3SAndrei Kartashev  * This manager supposed to store runtime parameters that supposed to be
2550fe8ee3SAndrei Kartashev  * persistent over BMC reboot. It provides simple Get/Set interface and handle
2650fe8ee3SAndrei Kartashev  * default values, hardcoded in getDefault() method.
2750fe8ee3SAndrei Kartashev  * @note: currently only string parameters supported
2850fe8ee3SAndrei Kartashev  */
2999e8f9dfSAndrei Kartashev using dbusPropertiesList =
3099e8f9dfSAndrei Kartashev     boost::container::flat_map<std::string,
3199e8f9dfSAndrei Kartashev                                std::variant<std::string, uint64_t>>;
3299e8f9dfSAndrei Kartashev /**
3399e8f9dfSAndrei Kartashev  * @brief The class contains functions to invoke power restore policy.
3499e8f9dfSAndrei Kartashev  *
3599e8f9dfSAndrei Kartashev  * This class only exists to unite all PowerRestore-related code. It supposed
3699e8f9dfSAndrei Kartashev  * to run only once on application startup.
3799e8f9dfSAndrei Kartashev  */
3899e8f9dfSAndrei Kartashev class PowerRestoreController
3999e8f9dfSAndrei Kartashev {
4099e8f9dfSAndrei Kartashev   public:
PowerRestoreController(boost::asio::io_context & io)41744e9a98SEd Tanous     PowerRestoreController(boost::asio::io_context& io) :
4299e8f9dfSAndrei Kartashev         policyInvoked(false), powerRestoreDelay(-1), powerRestoreTimer(io),
4399e8f9dfSAndrei Kartashev         timerFired(false)
4499e8f9dfSAndrei Kartashev     {}
4599e8f9dfSAndrei Kartashev     /**
4699e8f9dfSAndrei Kartashev      * @brief Power Restore entry point.
4799e8f9dfSAndrei Kartashev      *
4899e8f9dfSAndrei Kartashev      * Call this to start Power Restore algorithm.
4999e8f9dfSAndrei Kartashev      */
5099e8f9dfSAndrei Kartashev     void run();
5199e8f9dfSAndrei Kartashev     /**
5299e8f9dfSAndrei Kartashev      * @brief Initialize configuration parameters.
5399e8f9dfSAndrei Kartashev      *
5499e8f9dfSAndrei Kartashev      * Parse list of properties, received from dbus, to set Power Restore
5599e8f9dfSAndrei Kartashev      * algorithm configuration.
5699e8f9dfSAndrei Kartashev      * @param props - map of property names and values
5799e8f9dfSAndrei Kartashev      */
5899e8f9dfSAndrei Kartashev     void setProperties(const dbusPropertiesList& props);
5999e8f9dfSAndrei Kartashev 
6099e8f9dfSAndrei Kartashev   private:
6199e8f9dfSAndrei Kartashev     bool policyInvoked;
6299e8f9dfSAndrei Kartashev     std::string powerRestorePolicy;
6399e8f9dfSAndrei Kartashev     int powerRestoreDelay;
64439b9c3aSPatrick Williams     std::list<sdbusplus::bus::match_t> matches;
6599e8f9dfSAndrei Kartashev     boost::asio::steady_timer powerRestoreTimer;
6699e8f9dfSAndrei Kartashev     bool timerFired;
6799e8f9dfSAndrei Kartashev #ifdef USE_ACBOOT
6899e8f9dfSAndrei Kartashev     std::string acBoot;
6999e8f9dfSAndrei Kartashev #endif // USE_ACBOOT
7099e8f9dfSAndrei Kartashev 
7199e8f9dfSAndrei Kartashev     /**
7299e8f9dfSAndrei Kartashev      * @brief Check if all required algorithms parameters are set
7399e8f9dfSAndrei Kartashev      *
7499e8f9dfSAndrei Kartashev      * Call this after set any of Power Restore algorithm parameters. Once all
7599e8f9dfSAndrei Kartashev      * parameters are set this will run invoke() function.
7699e8f9dfSAndrei Kartashev      */
7799e8f9dfSAndrei Kartashev     void invokeIfReady();
7899e8f9dfSAndrei Kartashev     /**
7999e8f9dfSAndrei Kartashev      * @brief Actually perform power restore actions.
8099e8f9dfSAndrei Kartashev      *
8199e8f9dfSAndrei Kartashev      * Take Power Restore actions according to Policy and other parameters.
8299e8f9dfSAndrei Kartashev      */
8399e8f9dfSAndrei Kartashev     void invoke();
8499e8f9dfSAndrei Kartashev     /**
8599e8f9dfSAndrei Kartashev      * @brief Check if power was dropped.
8699e8f9dfSAndrei Kartashev      *
8799e8f9dfSAndrei Kartashev      * Read last saved power state to determine if host power was enabled before
8899e8f9dfSAndrei Kartashev      * last BMC reboot.
8999e8f9dfSAndrei Kartashev      */
9099e8f9dfSAndrei Kartashev     bool wasPowerDropped();
9199e8f9dfSAndrei Kartashev };
9299e8f9dfSAndrei Kartashev 
9350fe8ee3SAndrei Kartashev class PersistentState
9450fe8ee3SAndrei Kartashev {
9550fe8ee3SAndrei Kartashev   public:
9650fe8ee3SAndrei Kartashev     /**
9750fe8ee3SAndrei Kartashev      * List of all supported parameters
9850fe8ee3SAndrei Kartashev      */
9950fe8ee3SAndrei Kartashev     enum class Params
10050fe8ee3SAndrei Kartashev     {
10150fe8ee3SAndrei Kartashev         PowerState,
10250fe8ee3SAndrei Kartashev     };
10350fe8ee3SAndrei Kartashev 
10450fe8ee3SAndrei Kartashev     /**
10550fe8ee3SAndrei Kartashev      * @brief Persistent storage initialization
10650fe8ee3SAndrei Kartashev      *
10750fe8ee3SAndrei Kartashev      * Class constructor automatically load last state from JSON file
10850fe8ee3SAndrei Kartashev      */
10950fe8ee3SAndrei Kartashev     PersistentState();
11050fe8ee3SAndrei Kartashev     /**
11150fe8ee3SAndrei Kartashev      * @brief Persistent storage cleanup
11250fe8ee3SAndrei Kartashev      *
11350fe8ee3SAndrei Kartashev      * Class destructor automatically save state to JSON file
11450fe8ee3SAndrei Kartashev      */
11550fe8ee3SAndrei Kartashev     ~PersistentState();
11650fe8ee3SAndrei Kartashev     /**
11750fe8ee3SAndrei Kartashev      * @brief Get parameter value from the storage
11850fe8ee3SAndrei Kartashev      *
11950fe8ee3SAndrei Kartashev      * Get the parameter from cached storage. Default value returned, if
12050fe8ee3SAndrei Kartashev      * parameter was not set before.
12150fe8ee3SAndrei Kartashev      * @param parameter - parameter to get
12250fe8ee3SAndrei Kartashev      * @return parameter value
12350fe8ee3SAndrei Kartashev      */
12450fe8ee3SAndrei Kartashev     const std::string get(Params parameter);
12550fe8ee3SAndrei Kartashev     /**
12650fe8ee3SAndrei Kartashev      * @brief Store parameter value
12750fe8ee3SAndrei Kartashev      *
12850fe8ee3SAndrei Kartashev      * Set the parameter value in cached storage and dump it to disk.
12950fe8ee3SAndrei Kartashev      * @param parameter - parameter to set
13050fe8ee3SAndrei Kartashev      * @param value - parameter value to assign
13150fe8ee3SAndrei Kartashev      */
13250fe8ee3SAndrei Kartashev     void set(Params parameter, const std::string& value);
13350fe8ee3SAndrei Kartashev 
13450fe8ee3SAndrei Kartashev   private:
13550fe8ee3SAndrei Kartashev     nlohmann::json stateData;
13650fe8ee3SAndrei Kartashev     const std::filesystem::path powerControlDir = "/var/lib/power-control";
13750fe8ee3SAndrei Kartashev     const std::string_view stateFile = "state.json";
13850fe8ee3SAndrei Kartashev     const int indentationSize = 2;
13950fe8ee3SAndrei Kartashev 
14050fe8ee3SAndrei Kartashev     /**
14150fe8ee3SAndrei Kartashev      * @brief Covert parameter ID to name
14250fe8ee3SAndrei Kartashev      *
14350fe8ee3SAndrei Kartashev      * Get the name corresponding to the given parameter.
14450fe8ee3SAndrei Kartashev      * String name only used by the manager internal to generate human-readable
14550fe8ee3SAndrei Kartashev      * JSON.
14650fe8ee3SAndrei Kartashev      * @param parameter - parameter to convert
14750fe8ee3SAndrei Kartashev      * @return parameter name
14850fe8ee3SAndrei Kartashev      */
14950fe8ee3SAndrei Kartashev     const std::string getName(const Params parameter);
15050fe8ee3SAndrei Kartashev     /**
15150fe8ee3SAndrei Kartashev      * @brief Get default parameter value
15250fe8ee3SAndrei Kartashev      *
15350fe8ee3SAndrei Kartashev      * Get the default value, associated with given parameter.
15450fe8ee3SAndrei Kartashev      * @param parameter - parameter to get
15550fe8ee3SAndrei Kartashev      * @return parameter default value
15650fe8ee3SAndrei Kartashev      */
15750fe8ee3SAndrei Kartashev     const std::string getDefault(const Params parameter);
15850fe8ee3SAndrei Kartashev     /**
15950fe8ee3SAndrei Kartashev      * @brief Save cache to file on disk
16050fe8ee3SAndrei Kartashev      */
16150fe8ee3SAndrei Kartashev     void saveState();
16250fe8ee3SAndrei Kartashev };
16350fe8ee3SAndrei Kartashev 
16450fe8ee3SAndrei Kartashev } // namespace power_control
165