Read proc temps and dimm temps
This commit uses openpower-occ-control to monitor the temperature and
power sensors, and create sensors on D-BUS. In the loop, read the
sensor values every 1 seconds.
Tested:
I use virtual data to get sensor values:
busctl tree org.open_power.OCC.Control
|-/org
| `-/org/open_power
| `-/org/open_power/control
| |-/org/open_power/control/occ0
| `-/org/open_power/control/occ1
`-/xyz
`-/xyz/openbmc_project
`-/xyz/openbmc_project/sensors
|-/xyz/openbmc_project/sensors/power
| |-/xyz/openbmc_project/sensors/power/p0_mem_2_power
| |-/xyz/openbmc_project/sensors/power/p0_mem_power
| |-/xyz/openbmc_project/sensors/power/p0_power
| |-/xyz/openbmc_project/sensors/power/p1_mem_power
| |-/xyz/openbmc_project/sensors/power/p1_power
| |-/xyz/openbmc_project/sensors/power/p2_mem_power
| |-/xyz/openbmc_project/sensors/power/p2_power
| |-/xyz/openbmc_project/sensors/power/p3_mem_power
| |-/xyz/openbmc_project/sensors/power/p3_power
| `-/xyz/openbmc_project/sensors/power/total_power
`-/xyz/openbmc_project/sensors/temperature
|-/xyz/openbmc_project/sensors/temperature/dimm5_dram_temp
|-/xyz/openbmc_project/sensors/temperature/dimm9_dram_temp
|-/xyz/openbmc_project/sensors/temperature/proc0_core2_temp
|-/xyz/openbmc_project/sensors/temperature/proc0_core3_temp
|-/xyz/openbmc_project/sensors/temperature/proc1_core2_temp
|-/xyz/openbmc_project/sensors/temperature/proc1_core3_temp
|-/xyz/openbmc_project/sensors/temperature/vrm_vdd0_temp
`-/xyz/openbmc_project/sensors/temperature/vrm_vdd1_temp
busctl introspect org.open_power.OCC.Control
/xyz/openbmc_project/sensors/temperature/proc0_core3_temp
NAME TYPE SIGNATURE RESULT/VALUE
org.freedesktop.DBus.Introspectable interface - -
.Introspect method - s
org.freedesktop.DBus.Peer interface - -
.GetMachineId method - s
.Ping method - -
org.freedesktop.DBus.Properties interface - -
.Get method ss v
.GetAll method s a{sv}
.Set method ssv -
.PropertiesChanged signal sa{sv}as -
xyz.openbmc_project.Sensor.Value interface - -
.MaxValue property d 0
.MinValue property d 0
.Unit property s "xyz.openbmc...
.Value property d 49
xyz.openbmc_project.State.Decorator.OperationalStatus interface - -
.Functional property b true
busctl introspect org.open_power.OCC.Control
/xyz/openbmc_project/sensors/power/total_power
NAME TYPE SIGNATURE RESULT/VALUE
org.freedesktop.DBus.Introspectable interface - -
.Introspect method - s
org.freedesktop.DBus.Peer interface - -
.GetMachineId method - s
.Ping method - -
org.freedesktop.DBus.Properties interface - -
.Get method ss v
.GetAll method s a
.Set method ssv -
.PropertiesChanged signal sa{sv}as -
xyz.openbmc_project.Sensor.Value interface - -
.MaxValue property d 0
.MinValue property d 0
.Unit property s "xyz.openbmc...
.Value property d 83
xyz.openbmc_project.State.Decorator.OperationalStatus interface - -
.Functional property b true
Signed-off-by: Chicago Duan <duanzhijia01@inspur.com>
Change-Id: Iff30ab51745dab500fa19aa4c35b07e0052ac665
diff --git a/occ_manager.hpp b/occ_manager.hpp
index ece7fb7..e6e8cbb 100644
--- a/occ_manager.hpp
+++ b/occ_manager.hpp
@@ -24,8 +24,21 @@
namespace occ
{
+#ifdef READ_OCC_SENSORS
+enum occFruType
+{
+ processorCore = 0,
+ internalMemCtlr = 1,
+ dimm = 2,
+ memCtrlAndDimm = 3,
+ VRMVdd = 6,
+ PMIC = 7,
+ memCtlrExSensor = 8
+};
+#endif
+
/** @brief Default time, in seconds, between OCC poll commands */
-constexpr unsigned int defaultPollingInterval = 10;
+constexpr unsigned int defaultPollingInterval = 1;
/** @class Manager
* @brief Builds and manages OCC objects
@@ -178,6 +191,68 @@
* OCC. The poll timer will then be restarted.
* */
void pollerTimerExpired();
+
+#ifdef READ_OCC_SENSORS
+ /**
+ * @brief Gets the occ sensor values.
+ * @param[in] id - Id of the OCC.
+ * @param[in] masterOcc - Is this OCC the master OCC.
+ * */
+ void getSensorValues(uint32_t id, bool masterOcc);
+
+ /**
+ * @brief Trigger OCC driver to read the temperature sensors.
+ * @param[in] path - path of the OCC sensors.
+ * @param[in] id - Id of the OCC.
+ * */
+ void readTempSensors(const fs::path& path, uint32_t id);
+
+ /**
+ * @brief Trigger OCC driver to read the power sensors.
+ * @param[in] path - path of the OCC sensors.
+ * @param[in] id - Id of the OCC.
+ * */
+ void readPowerSensors(const fs::path& path, uint32_t id);
+
+ /**
+ * @brief Set all sensor values of this OCC to NaN.
+ * @param[in] id - Id of the OCC.
+ * */
+ void setSensorValueToNaN(uint32_t id);
+
+ /** @brief Store the existing OCC sensors on D-BUS */
+ std::map<std::string, uint32_t> existingSensors;
+
+ /** @brief Get FunctionID from the `powerX_label` file.
+ * @param[in] value - the value of the `powerX_label` file.
+ * @returns FunctionID of the power sensors.
+ */
+ std::optional<std::string>
+ getPowerLabelFunctionID(const std::string& value);
+
+ /** @brief The power sensor names map */
+ const std::map<std::string, std::string> powerSensorName = {
+ {"system", "total_power"}, {"1", "p0_mem_power"},
+ {"2", "p1_mem_power"}, {"3", "p2_mem_power"},
+ {"4", "p3_mem_power"}, {"5", "p0_power"},
+ {"6", "p1_power"}, {"7", "p2_power"},
+ {"8", "p3_power"}, {"9", "p0_cache_power"},
+ {"10", "p1_cache_power"}, {"11", "p2_cache_power"},
+ {"12", "p3_cache_power"}, {"13", "io_a_power"},
+ {"14", "io_b_power"}, {"15", "io_c_power"},
+ {"16", "fans_a_power"}, {"17", "fans_b_power"},
+ {"18", "storage_a_power"}, {"19", "storage_b_power"},
+ {"23", "mem_cache_power"}, {"25", "p0_mem_0_power"},
+ {"26", "p0_mem_1_power"}, {"27", "p0_mem_2_power"}};
+
+ /** @brief The dimm temperature sensor names map */
+ const std::map<uint32_t, std::string> dimmTempSensorName = {
+ {internalMemCtlr, "_intmb_temp"},
+ {dimm, "_dram_temp"},
+ {memCtrlAndDimm, "_dram_extmb_temp"},
+ {PMIC, "_pmic_temp"},
+ {memCtlrExSensor, "_extmb_temp"}};
+#endif
};
} // namespace occ