psu-ng: Put input voltage rating on D-Bus
IBM systems must tell the BIOS (called hostboot) the power supply input
voltage rating during a boot, where the rating is 110 or 220. This is
done via PLDM BIOS attributes where the attribute is backed by a D-Bus
property.
This commit adds support for that by putting the input voltage rating
of each PS on D-Bus using the Value property of the
xyz.openbmc_project.Sensor.Value interface. The path is like
/xyz/openbmc_project/sensors/voltage/ps0_input_voltage_rating.
$ busctl get-property xyz.openbmc_project.Power.PSUMonitor \
/xyz/openbmc_project/sensors/voltage/ps0_input_voltage_rating \
xyz.openbmc_project.Sensor.Value Value
d 220
$ busctl get-property xyz.openbmc_project.Power.PSUMonitor \
/xyz/openbmc_project/sensors/voltage/ps0_input_voltage_rating \
xyz.openbmc_project.Sensor.Value Unit
s "xyz.openbmc_project.Sensor.Value.Unit.Volts"
These D-Bus objects won't have any associations, unlike normal sensors,
so they will not show up in any Redfish output as a sensor.
The interface is only created for present power supplies, and is only
updated when the application starts up and when the boot starts.
If a power supply is hot added or removed after that, the D-Bus property
doesn't need to be updated as hostboot has already consumed it.
Change-Id: I277516e8d86f1ba1a75b75fe76c67f192d911f88
Signed-off-by: Matt Spinler <spinler@us.ibm.com>
diff --git a/phosphor-power-supply/power_supply.cpp b/phosphor-power-supply/power_supply.cpp
index 9d884f3..cea2ba2 100644
--- a/phosphor-power-supply/power_supply.cpp
+++ b/phosphor-power-supply/power_supply.cpp
@@ -96,6 +96,8 @@
updateInventory();
setupInputHistory();
}
+
+ setInputVoltageRating();
}
void PowerSupply::bindOrUnbindDriver(bool present)
@@ -1181,4 +1183,37 @@
}
}
+void PowerSupply::setInputVoltageRating()
+{
+ if (!present)
+ {
+ return;
+ }
+
+ double inputVoltageValue{};
+ int inputVoltageRating{};
+ getInputVoltage(inputVoltageValue, inputVoltageRating);
+
+ if (!inputVoltageRatingIface)
+ {
+ auto path = fmt::format(
+ "/xyz/openbmc_project/sensors/voltage/ps{}_input_voltage_rating",
+ shortName.back());
+
+ inputVoltageRatingIface = std::make_unique<SensorObject>(
+ bus, path.c_str(), SensorObject::action::defer_emit);
+
+ // Leave other properties at their defaults
+ inputVoltageRatingIface->unit(SensorInterface::Unit::Volts, true);
+ inputVoltageRatingIface->value(static_cast<double>(inputVoltageRating),
+ true);
+
+ inputVoltageRatingIface->emit_object_added();
+ }
+ else
+ {
+ inputVoltageRatingIface->value(static_cast<double>(inputVoltageRating));
+ }
+}
+
} // namespace phosphor::power::psu