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