| /** |
| * 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 "device.hpp" |
| #include "id_map.hpp" |
| #include "services.hpp" |
| |
| #include <memory> |
| #include <stdexcept> |
| #include <string> |
| #include <utility> |
| #include <vector> |
| |
| namespace phosphor::power::regulators |
| { |
| |
| // Forward declarations to avoid circular dependencies |
| class System; |
| |
| /** |
| * @class Chassis |
| * |
| * A chassis within the system. |
| * |
| * Chassis are large enclosures that can be independently powered off and on by |
| * the BMC. Small and mid-sized systems may contain a single chassis. In a |
| * large rack-mounted system, each drawer may correspond to a chassis. |
| * |
| * A C++ Chassis object only needs to be created if the physical chassis |
| * contains regulators that need to be configured or monitored. |
| */ |
| class Chassis |
| { |
| public: |
| // Specify which compiler-generated methods we want |
| Chassis() = delete; |
| Chassis(const Chassis&) = delete; |
| Chassis(Chassis&&) = delete; |
| Chassis& operator=(const Chassis&) = delete; |
| Chassis& operator=(Chassis&&) = delete; |
| ~Chassis() = default; |
| |
| /** |
| * Constructor. |
| * |
| * Throws an exception if any of the input parameters are invalid. |
| * |
| * @param number Chassis number within the system. Chassis numbers start at |
| * 1 because chassis 0 represents the entire system. |
| * @param inventoryPath D-Bus inventory path for this chassis |
| * @param devices Devices within this chassis, if any. The vector should |
| * contain regulator devices and any related devices required |
| * to perform regulator operations. |
| */ |
| explicit Chassis(unsigned int number, const std::string& inventoryPath, |
| std::vector<std::unique_ptr<Device>> devices = |
| std::vector<std::unique_ptr<Device>>{}) : |
| number{number}, inventoryPath{inventoryPath}, |
| devices{std::move(devices)} |
| { |
| if (number < 1) |
| { |
| throw std::invalid_argument{ |
| "Invalid chassis number: " + std::to_string(number)}; |
| } |
| } |
| |
| /** |
| * Adds the Device and Rail objects in this chassis to the specified IDMap. |
| * |
| * @param idMap mapping from IDs to the associated Device/Rail/Rule objects |
| */ |
| void addToIDMap(IDMap& idMap); |
| |
| /** |
| * Clear any cached data about hardware devices. |
| */ |
| void clearCache(); |
| |
| /** |
| * Clears all error history. |
| * |
| * All data on previously logged errors will be deleted. If errors occur |
| * again in the future they will be logged again. |
| * |
| * This method is normally called when the system is being powered on. |
| */ |
| void clearErrorHistory(); |
| |
| /** |
| * Close the devices within this chassis, if any. |
| * |
| * @param services system services like error logging and the journal |
| */ |
| void closeDevices(Services& services); |
| |
| /** |
| * Configure the devices within this chassis, if any. |
| * |
| * This method should be called during the boot before regulators are |
| * enabled. |
| * |
| * @param services system services like error logging and the journal |
| * @param system system that contains this chassis |
| */ |
| void configure(Services& services, System& system); |
| |
| /** |
| * Detect redundant phase faults in regulator devices in this chassis. |
| * |
| * This method should be called repeatedly based on a timer. |
| * |
| * @param services system services like error logging and the journal |
| * @param system system that contains this chassis |
| */ |
| void detectPhaseFaults(Services& services, System& system); |
| |
| /** |
| * Returns the devices within this chassis, if any. |
| * |
| * The vector contains regulator devices and any related devices |
| * required to perform regulator operations. |
| * |
| * @return devices in chassis |
| */ |
| const std::vector<std::unique_ptr<Device>>& getDevices() const |
| { |
| return devices; |
| } |
| |
| /** |
| * Returns the D-Bus inventory path for this chassis. |
| * |
| * @return inventory path |
| */ |
| const std::string& getInventoryPath() const |
| { |
| return inventoryPath; |
| } |
| |
| /** |
| * Returns the chassis number within the system. |
| * |
| * @return chassis number |
| */ |
| unsigned int getNumber() const |
| { |
| return number; |
| } |
| |
| /** |
| * Monitors the sensors for the voltage rails produced by this chassis, if |
| * any. |
| * |
| * This method should be called repeatedly based on a timer. |
| * |
| * @param services system services like error logging and the journal |
| * @param system system that contains the chassis |
| */ |
| void monitorSensors(Services& services, System& system); |
| |
| private: |
| /** |
| * Chassis number within the system. |
| * |
| * Chassis numbers start at 1 because chassis 0 represents the entire |
| * system. |
| */ |
| const unsigned int number{}; |
| |
| /** |
| * D-Bus inventory path for this chassis. |
| */ |
| const std::string inventoryPath{}; |
| |
| /** |
| * Devices within this chassis, if any. |
| * |
| * The vector contains regulator devices and any related devices |
| * required to perform regulator operations. |
| */ |
| std::vector<std::unique_ptr<Device>> devices{}; |
| }; |
| |
| } // namespace phosphor::power::regulators |