/** * Copyright © 2020 IBM Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "services.hpp" #include "system.hpp" #include #include #include #include #include #include #include #include #include #include #include #include namespace phosphor::power::regulators { constexpr auto busName = "xyz.openbmc_project.Power.Regulators"; constexpr auto objPath = "/xyz/openbmc_project/power/regulators/manager"; constexpr auto sysDbusObj = "/xyz/openbmc_project/inventory"; constexpr auto sysDbusPath = "/xyz/openbmc_project/inventory/system"; constexpr auto sysDbusIntf = "xyz.openbmc_project.Inventory.Item.System"; constexpr auto sysDbusProp = "Identifier"; using Timer = sdeventplus::utility::Timer; using ManagerObject = sdbusplus::server::object::object< phosphor::power::regulators::interface::ManagerInterface>; class Manager : public ManagerObject { public: Manager() = delete; Manager(const Manager&) = delete; Manager(Manager&&) = delete; Manager& operator=(const Manager&) = delete; Manager& operator=(Manager&&) = delete; ~Manager() = default; /** * Constructor * Creates a manager over the regulators. * * @param bus the D-Bus bus * @param event the sdevent event */ Manager(sdbusplus::bus::bus& bus, const sdeventplus::Event& event); /** * Overridden manager object's configure method */ void configure() override; /** * Overridden manager object's monitor method * * @param enable Enable or disable regulator monitoring */ void monitor(bool enable) override; /** * Timer expired callback function */ void timerExpired(); /** * Callback function to handle receiving a HUP signal * to reload the configuration data. * * @param sigSrc sd_event_source signal wrapper * @param sigInfo signal info on signal fd */ void sighupHandler(sdeventplus::source::Signal& sigSrc, const struct signalfd_siginfo* sigInfo); /** * Callback function to handle interfacesAdded dbus signals * * @param msg Expanded sdbusplus message data */ void signalHandler(sdbusplus::message::message& msg); private: /** * Set the JSON configuration data filename * * @param fName filename without `.json` extension */ inline void setFileName(const std::string& fName) { fileName = fName; if (!fileName.empty()) { // Replace all spaces with underscores std::replace(fileName.begin(), fileName.end(), ' ', '_'); fileName.append(".json"); } }; /** * Get the JSON configuration data filename from dbus * * @return JSON configuration data filename */ const std::string getFileNameDbus(); /** * Finds the JSON configuration file. * * Looks for the config file in the test directory and standard directory. * * Throws an exception if the file cannot be found or a file system error * occurs. * * The base name of the config file must have already been obtained and * stored in the fileName data member. * * @return absolute path to config file */ std::filesystem::path findConfigFile(); /** * Loads the JSON configuration file. * * Looks for the config file in the test directory and standard directory. * * If the config file is found, it is parsed and the resulting information * is stored in the system data member. * * If the config file cannot be found or parsing fails, an error is logged. * * The base name of the config file must have already been obtained and * stored in the fileName data member. */ void loadConfigFile(); /** * The D-Bus bus */ sdbusplus::bus::bus& bus; /** * Event to loop on */ sdeventplus::Event eventLoop; /** * System services like error logging and the journal. */ BMCServices services; /** * List of event timers */ std::vector timers{}; /** * List of dbus signal matches */ std::vector> signals{}; /** * JSON configuration file base name. */ std::string fileName{}; /** * Computer system being controlled and monitored by the BMC. * * Contains the information loaded from the JSON configuration file. * Contains nullptr if the configuration file has not been loaded. */ std::unique_ptr system{}; }; } // namespace phosphor::power::regulators