blob: d8026656b2823a072fc19640b3bb5fc29a45cf8a [file] [log] [blame]
/**
* 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 "action.hpp"
#include "services.hpp"
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <vector>
namespace phosphor::power::regulators
{
// Forward declarations to avoid circular dependencies
class Chassis;
class Device;
class Rail;
class System;
/**
* @class Configuration
*
* Configuration changes that should be applied to a device or regulator rail.
* These changes usually override hardware default settings.
*
* The most common configuration change is setting the output voltage for a
* regulator rail. Other examples include modifying pgood thresholds and
* overcurrent settings.
*
* The configuration changes are applied during the boot before regulators are
* enabled.
*
* The configuration changes are applied by executing one or more actions.
*
* An output voltage value can be specified if necessary. The value will be
* stored in the ActionEnvironment when the actions are executed. Actions that
* require a volts value, such as PMBusWriteVoutCommandAction, can obtain it
* from the ActionEnvironment.
*/
class Configuration
{
public:
// Specify which compiler-generated methods we want
Configuration() = delete;
Configuration(const Configuration&) = delete;
Configuration(Configuration&&) = delete;
Configuration& operator=(const Configuration&) = delete;
Configuration& operator=(Configuration&&) = delete;
~Configuration() = default;
/**
* Constructor.
*
* @param volts optional output voltage value
* @param actions actions that configure the device/rail
*/
explicit Configuration(std::optional<double> volts,
std::vector<std::unique_ptr<Action>> actions) :
volts{volts}, actions{std::move(actions)}
{}
/**
* Executes the actions to configure the specified device.
*
* 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 the chassis
* @param chassis chassis that contains the device
* @param device device to configure
*/
void execute(Services& services, System& system, Chassis& chassis,
Device& device);
/**
* Executes the actions to configure the specified rail.
*
* 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 the chassis
* @param chassis chassis that contains the device
* @param device device that contains the rail
* @param rail rail to configure
*/
void execute(Services& services, System& system, Chassis& chassis,
Device& device, Rail& rail);
/**
* Returns the actions that configure the device/rail.
*
* @return actions
*/
const std::vector<std::unique_ptr<Action>>& getActions() const
{
return actions;
}
/**
* Returns the optional output voltage value.
*
* @return optional volts value
*/
std::optional<double> getVolts() const
{
return volts;
}
private:
/**
* Executes the actions to configure a device or rail.
*
* @param services system services like error logging and the journal
* @param system system that contains the chassis
* @param chassis chassis that contains the device
* @param device device to configure or that contains rail to configure
* @param deviceOrRailID ID of the device or rail to configure
*/
void execute(Services& services, System& system, Chassis& chassis,
Device& device, const std::string& deviceOrRailID);
/**
* Optional output voltage value.
*/
const std::optional<double> volts{};
/**
* Actions that configure the device/rail.
*/
std::vector<std::unique_ptr<Action>> actions{};
};
} // namespace phosphor::power::regulators