The label field for temperature sensors is decimal
It turns out that the OCC driver displays the value of the
tempX_label file as a decimal as opposed to the hex format we just
speculated it would be.
For example, a 0xC0000001 value will read as 3221225473.
Change the code to read that as a uint32_t and then extract that type
and instance fields directly from it.
Signed-off-by: Matt Spinler <spinler@us.ibm.com>
Change-Id: I64db4670cf8a48030cca041fad8892de6188f89e
diff --git a/configure.ac b/configure.ac
index 32a6ecc..96b23f0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -140,12 +140,12 @@
AC_DEFINE_UNQUOTED([OCC_MASTER_NAME], ["$OCC_MASTER_NAME"], [The OCC master object name])
AC_ARG_VAR(OCC_CPU_TEMP_SENSOR_TYPE, [The CPU temp sensor type])
-AS_IF([test "x$OCC_CPU_TEMP_SENSOR_TYPE" == "x"], [OCC_CPU_TEMP_SENSOR_TYPE="C0"])
-AC_DEFINE_UNQUOTED([OCC_CPU_TEMP_SENSOR_TYPE], ["$OCC_CPU_TEMP_SENSOR_TYPE"], [The CPU temp sensor type])
+AS_IF([test "x$OCC_CPU_TEMP_SENSOR_TYPE" == "x"], [OCC_CPU_TEMP_SENSOR_TYPE=0xC0])
+AC_DEFINE_UNQUOTED([OCC_CPU_TEMP_SENSOR_TYPE], [$OCC_CPU_TEMP_SENSOR_TYPE], [The CPU temp sensor type])
AC_ARG_VAR(OCC_DIMM_TEMP_SENSOR_TYPE, [The dimm temp sensor type])
-AS_IF([test "x$OCC_DIMM_TEMP_SENSOR_TYPE" == "x"], [OCC_DIMM_TEMP_SENSOR_TYPE="D0"])
-AC_DEFINE_UNQUOTED([OCC_DIMM_TEMP_SENSOR_TYPE], ["$OCC_DIMM_TEMP_SENSOR_TYPE"], [The dimm temp sensor type])
+AS_IF([test "x$OCC_DIMM_TEMP_SENSOR_TYPE" == "x"], [OCC_DIMM_TEMP_SENSOR_TYPE=0xD0])
+AC_DEFINE_UNQUOTED([OCC_DIMM_TEMP_SENSOR_TYPE], [$OCC_DIMM_TEMP_SENSOR_TYPE], [The dimm temp sensor type])
AC_ARG_VAR(OCC_HWMON_PATH, [The OCC hwmon path])
AC_ARG_VAR(DEV_PATH, [The device path])
diff --git a/occ_manager.cpp b/occ_manager.cpp
index 4b5df04..a6d18ac 100644
--- a/occ_manager.cpp
+++ b/occ_manager.cpp
@@ -220,7 +220,7 @@
continue;
}
- std::string labelValue;
+ uint32_t labelValue{0};
fileOpen >> labelValue;
fileOpen.close();
@@ -250,13 +250,8 @@
}
else
{
- auto sensorTypeID =
- open_power::occ::utils::checkLabelValue(labelValue);
- if (sensorTypeID == std::nullopt)
- {
- continue;
- }
- auto& [type, instanceID] = *sensorTypeID;
+ uint16_t type = (labelValue & 0xFF000000) >> 24;
+ uint16_t instanceID = labelValue & 0x0000FFFF;
if (type == OCC_DIMM_TEMP_SENSOR_TYPE)
{
diff --git a/test/utest.cpp b/test/utest.cpp
index ff75a60..704c5c6 100644
--- a/test/utest.cpp
+++ b/test/utest.cpp
@@ -68,17 +68,3 @@
EXPECT_STREQ(parsed.c_str(), "bar");
}
-
-TEST(VerifyLabelValue, checkLabelValue)
-{
- const std::string value = "D0000002";
-
- auto labelValue = checkLabelValue(value);
- EXPECT_NE(labelValue, std::nullopt);
-
- std::string reType = "D0";
- uint16_t reID = 2;
- auto& [type, instanceID] = *labelValue;
- EXPECT_EQ(type, reType);
- EXPECT_EQ(instanceID, reID);
-}
diff --git a/utils.cpp b/utils.cpp
index b1fd8b6..9a412a3 100644
--- a/utils.cpp
+++ b/utils.cpp
@@ -75,40 +75,6 @@
return value;
}
-std::optional<LABELVALUE> checkLabelValue(const std::string& value)
-{
- // The ID 0xD0000002 is only 4 bytes long, but when converted to a string it
- // is 8 characters long
- // eg: Dimm2, the lable file is `D0000002` so value
- // length = 2 byte(type) + 2 byte(reserve) + 4 byte(instace ID)
- size_t valueLen = value.length();
- size_t typeLen = 2;
- size_t reserveLen = 2;
- size_t instanceIDLen = 4;
- if (valueLen != typeLen + reserveLen + instanceIDLen)
- {
- return std::nullopt;
- }
-
- size_t offset = 0;
- std::string type = value.substr(offset, typeLen);
- offset += typeLen;
- std::string reserve = value.substr(offset, reserveLen);
- offset += reserveLen;
-
- if ("00" != reserve)
- {
- return std::nullopt;
- }
-
- const char* start = value.data() + offset;
- uint16_t instanceID = static_cast<uint16_t>(std::strtol(start, NULL, 16));
-
- LABELVALUE labelValue{type, instanceID};
-
- return std::make_optional(std::move(labelValue));
-}
-
} // namespace utils
} // namespace occ
} // namespace open_power
diff --git a/utils.hpp b/utils.hpp
index 6254ed7..b1da8c0 100644
--- a/utils.hpp
+++ b/utils.hpp
@@ -12,8 +12,6 @@
namespace utils
{
-using LABELVALUE = std::tuple<std::string, uint16_t>;
-
constexpr auto MAPPER_BUSNAME = "xyz.openbmc_project.ObjectMapper";
constexpr auto MAPPER_OBJ_PATH = "/xyz/openbmc_project/object_mapper";
constexpr auto MAPPER_IFACE = "xyz.openbmc_project.ObjectMapper";
@@ -55,15 +53,6 @@
const std::string& interface,
const std::string& propertyName);
-/**
- * @brief Check the value of the `tempX_label` file
- *
- * @param[in] value - the value of the `tempX_label` file
- *
- * @return Sensors type and Sensors ID
- */
-std::optional<LABELVALUE> checkLabelValue(const std::string& value);
-
} // namespace utils
} // namespace occ
} // namespace open_power