dbus-sdr: Initial Dynamic Sensor Stack
Migrate intel-ipmi-oem dynamic sensor stack into
phosphor-host-ipmid for more general use.
The files are copied from
https://gerrit.openbmc-project.xyz/c/openbmc/intel-ipmi-oem/+/39743
https://gerrit.openbmc-project.xyz/plugins/gitiles/openbmc/intel-ipmi-oem/+/b910987a7d832e38e9342f0946aeb555a48f9cb0
Created `libdynamiccmds` to enable dynamic sensor stack.
Minor changes in the migration include:
1, Removing the use of `commandutils.hpp` in all files since it is only used
for
```
static constexpr bool debug = false;
```
It is added to `sdrutils.hpp` instead.
2, Update lastWriteAddr to size_t to match the vector.size() type
during comparison.
3, Renamed the sensorcommand unit test to sensorcommands_unitest.cpp
4, Removed unused variables.
- sensorcommands
```
constexpr uint8_t thresholdMask = 0xFF;
```
- sensorcommands_unitest
```
double yError = std::abs(y - yRoundtrip);
```
5, Removed Intel Specific Changes
- Redfish logs
- node manager/ME
- BIOS to SEL event
6, Removed externing a global variable for sensorTree.
- Replaced it with a method that returns a singleton
- auto& sensorTree = getSensorTree(); for access
7, Replaced intel_oem namespace with dynamic_sensors
8, Removed types.hpp and use `ipmid/types.hpp` directly
- Updated the types to match ipmid/types
- Added Association and std::vector<Association>> under Value.
9, Add cpp files for sdrutils and sensorutils.
10, link libipmid as it is required for getManagedObjects needed
by sensorcommands.cpp
Signed-off-by: Willy Tu <wltu@google.com>
Change-Id: If944620c895ecf4c9f4c3efe72479f4de276f4fb
Signed-off-by: Vijay Khemka <vijaykhemkalinux@gmail.com>
diff --git a/include/dbus-sdr/sensorcommands.hpp b/include/dbus-sdr/sensorcommands.hpp
new file mode 100644
index 0000000..b9c845f
--- /dev/null
+++ b/include/dbus-sdr/sensorcommands.hpp
@@ -0,0 +1,168 @@
+/*
+// Copyright (c) 2017 2018 Intel 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 <cstdint>
+#include <dbus-sdr/sdrutils.hpp>
+
+#pragma pack(push, 1)
+
+struct SensorThresholdResp
+{
+ uint8_t readable;
+ uint8_t lowernc;
+ uint8_t lowercritical;
+ uint8_t lowernonrecoverable;
+ uint8_t uppernc;
+ uint8_t uppercritical;
+ uint8_t uppernonrecoverable;
+};
+
+#pragma pack(pop)
+
+enum class IPMIThresholdRespBits
+{
+ lowerNonCritical,
+ lowerCritical,
+ lowerNonRecoverable,
+ upperNonCritical,
+ upperCritical,
+ upperNonRecoverable
+};
+
+enum class IPMISensorReadingByte2 : uint8_t
+{
+ eventMessagesEnable = (1 << 7),
+ sensorScanningEnable = (1 << 6),
+ readingStateUnavailable = (1 << 5),
+};
+
+enum class IPMISensorReadingByte3 : uint8_t
+{
+ upperNonRecoverable = (1 << 5),
+ upperCritical = (1 << 4),
+ upperNonCritical = (1 << 3),
+ lowerNonRecoverable = (1 << 2),
+ lowerCritical = (1 << 1),
+ lowerNonCritical = (1 << 0),
+};
+
+enum class IPMISensorEventEnableByte2 : uint8_t
+{
+ eventMessagesEnable = (1 << 7),
+ sensorScanningEnable = (1 << 6),
+};
+
+enum class IPMISensorEventEnableThresholds : uint8_t
+{
+ nonRecoverableThreshold = (1 << 6),
+ criticalThreshold = (1 << 5),
+ nonCriticalThreshold = (1 << 4),
+ upperNonRecoverableGoingHigh = (1 << 3),
+ upperNonRecoverableGoingLow = (1 << 2),
+ upperCriticalGoingHigh = (1 << 1),
+ upperCriticalGoingLow = (1 << 0),
+ upperNonCriticalGoingHigh = (1 << 7),
+ upperNonCriticalGoingLow = (1 << 6),
+ lowerNonRecoverableGoingHigh = (1 << 5),
+ lowerNonRecoverableGoingLow = (1 << 4),
+ lowerCriticalGoingHigh = (1 << 3),
+ lowerCriticalGoingLow = (1 << 2),
+ lowerNonCriticalGoingHigh = (1 << 1),
+ lowerNonCriticalGoingLow = (1 << 0),
+};
+
+enum class IPMIGetSensorEventEnableThresholds : uint8_t
+{
+ lowerNonCriticalGoingLow = 0,
+ lowerNonCriticalGoingHigh = 1,
+ lowerCriticalGoingLow = 2,
+ lowerCriticalGoingHigh = 3,
+ lowerNonRecoverableGoingLow = 4,
+ lowerNonRecoverableGoingHigh = 5,
+ upperNonCriticalGoingLow = 6,
+ upperNonCriticalGoingHigh = 7,
+ upperCriticalGoingLow = 8,
+ upperCriticalGoingHigh = 9,
+ upperNonRecoverableGoingLow = 10,
+ upperNonRecoverableGoingHigh = 11,
+};
+
+enum class IPMINetfnSensorCmds : ipmi_cmd_t
+{
+ ipmiCmdGetDeviceSDRInfo = 0x20,
+ ipmiCmdGetDeviceSDR = 0x21,
+ ipmiCmdReserveDeviceSDRRepo = 0x22,
+ ipmiCmdSetSensorThreshold = 0x26,
+ ipmiCmdGetSensorThreshold = 0x27,
+ ipmiCmdGetSensorEventEnable = 0x29,
+ ipmiCmdGetSensorEventStatus = 0x2B,
+ ipmiCmdGetSensorReading = 0x2D,
+ ipmiCmdGetSensorType = 0x2F,
+ ipmiCmdSetSensorReadingAndEventStatus = 0x30,
+};
+
+namespace ipmi
+{
+
+SensorSubTree& getSensorTree()
+{
+ static SensorSubTree sensorTree;
+ return sensorTree;
+}
+
+static ipmi_ret_t getSensorConnection(ipmi::Context::ptr ctx, uint8_t sensnum,
+ std::string& connection,
+ std::string& path)
+{
+ auto& sensorTree = getSensorTree();
+ if (sensorTree.empty() && !getSensorSubtree(sensorTree))
+ {
+ return IPMI_CC_RESPONSE_ERROR;
+ }
+
+ if (ctx == nullptr)
+ {
+ return IPMI_CC_RESPONSE_ERROR;
+ }
+
+ path = getPathFromSensorNumber((ctx->lun << 8) | sensnum);
+ if (path.empty())
+ {
+ return IPMI_CC_INVALID_FIELD_REQUEST;
+ }
+
+ for (const auto& sensor : sensorTree)
+ {
+ if (path == sensor.first)
+ {
+ connection = sensor.second.begin()->first;
+ break;
+ }
+ }
+
+ return 0;
+}
+
+struct IPMIThresholds
+{
+ std::optional<uint8_t> warningLow;
+ std::optional<uint8_t> warningHigh;
+ std::optional<uint8_t> criticalLow;
+ std::optional<uint8_t> criticalHigh;
+};
+
+} // namespace ipmi