blob: 18d10c1bcc6c440dd1e1f19fcc03b84a766dc99d [file] [log] [blame]
James Feist6ef20402019-01-07 16:45:08 -08001#pragma once
James Feist6ef20402019-01-07 16:45:08 -08002#include <boost/asio/deadline_timer.hpp>
3#include <boost/container/flat_map.hpp>
Ed Tanous8a57ec02020-10-09 12:46:52 -07004#include <sensor.hpp>
James Feist38fb5982020-05-28 10:09:54 -07005
James Feist6ef20402019-01-07 16:45:08 -08006#include <chrono>
7#include <limits>
Patrick Venturefd6ba732019-10-31 14:27:39 -07008#include <memory>
9#include <optional>
10#include <string>
James Feist6ef20402019-01-07 16:45:08 -080011#include <vector>
12
13enum class IpmbType
14{
15 meSensor,
16 PXE1410CVR,
17 IR38363VR,
Vijay Khemka682a5cb2019-07-18 17:34:03 -070018 ADM1278HSC,
James Feist6ef20402019-01-07 16:45:08 -080019 mpsVR
20};
21
Vijay Khemka682a5cb2019-07-18 17:34:03 -070022enum class IpmbSubType
23{
24 temp,
25 curr,
26 power,
Adrian Ambrożewicz45e92772020-06-04 13:59:55 +020027 volt,
28 util
Vijay Khemka682a5cb2019-07-18 17:34:03 -070029};
30
James Feistd7ae29a2020-06-25 15:42:46 -070031enum class ReadingFormat
32{
33 byte0,
34 byte3,
35 elevenBit,
36 elevenBitShift,
Jayashree-D37322572021-03-19 17:40:56 +053037 linearElevenBit
James Feistd7ae29a2020-06-25 15:42:46 -070038};
39
Adrian Ambrożewicz58e02ef2020-08-06 14:42:38 +020040namespace ipmi
41{
42namespace sensor
43{
44constexpr uint8_t netFn = 0x04;
45constexpr uint8_t getSensorReading = 0x2d;
46
47static bool isValid(const std::vector<uint8_t>& data)
48{
Ed Tanous8a57ec02020-10-09 12:46:52 -070049 constexpr auto readingUnavailableBit = 5;
Adrian Ambrożewicz58e02ef2020-08-06 14:42:38 +020050
51 // Proper 'Get Sensor Reading' response has at least 4 bytes, including
52 // Completion Code. Our IPMB stack strips Completion Code from payload so we
53 // compare here against the rest of payload
54 if (data.size() < 3)
55 {
56 return false;
57 }
58
59 // Per IPMI 'Get Sensor Reading' specification
Ed Tanous8a57ec02020-10-09 12:46:52 -070060 if (data[1] & (1 << readingUnavailableBit))
Adrian Ambrożewicz58e02ef2020-08-06 14:42:38 +020061 {
62 return false;
63 }
64
65 return true;
66}
67
68} // namespace sensor
69namespace me_bridge
70{
71constexpr uint8_t netFn = 0x2e;
72constexpr uint8_t sendRawPmbus = 0xd9;
73} // namespace me_bridge
74} // namespace ipmi
75
James Feist6ef20402019-01-07 16:45:08 -080076struct IpmbSensor : public Sensor
77{
James Feistd8705872019-02-08 13:26:09 -080078 IpmbSensor(std::shared_ptr<sdbusplus::asio::connection>& conn,
79 boost::asio::io_service& io, const std::string& name,
80 const std::string& sensorConfiguration,
81 sdbusplus::asio::object_server& objectServer,
82 std::vector<thresholds::Threshold>&& thresholds,
Anoop S832a2c62020-11-20 19:21:22 +000083 uint8_t deviceAddress, uint8_t hostSMbusIndex,
Jayashree-D9f6d4fd2021-04-13 18:27:22 +053084 const float pollRate, std::string& sensorTypeName);
Ed Tanous8a57ec02020-10-09 12:46:52 -070085 ~IpmbSensor() override;
James Feist6ef20402019-01-07 16:45:08 -080086
87 void checkThresholds(void) override;
88 void read(void);
89 void init(void);
Zev Weiss6b6891c2021-04-22 02:46:21 -050090 std::string getSubTypeUnits(void);
James Feist6ef20402019-01-07 16:45:08 -080091 void loadDefaults(void);
James Feistf7e2c5d2019-02-13 17:27:51 -080092 void runInitCmd(void);
James Feist961bf092020-07-01 16:38:12 -070093 bool processReading(const std::vector<uint8_t>& data, double& resp);
James Feist6ef20402019-01-07 16:45:08 -080094
95 IpmbType type;
Vijay Khemka682a5cb2019-07-18 17:34:03 -070096 IpmbSubType subType;
97 double scaleVal;
98 double offsetVal;
James Feist6ef20402019-01-07 16:45:08 -080099 uint8_t commandAddress;
100 uint8_t netfn;
101 uint8_t command;
102 uint8_t deviceAddress;
James Feist551087a2019-12-09 11:17:12 -0800103 uint8_t errorCount;
Anoop S832a2c62020-11-20 19:21:22 +0000104 uint8_t hostSMbusIndex;
James Feist6ef20402019-01-07 16:45:08 -0800105 std::vector<uint8_t> commandData;
106 std::optional<uint8_t> initCommand;
107 std::vector<uint8_t> initData;
Jayashree-D9f6d4fd2021-04-13 18:27:22 +0530108 int sensorPollMs;
James Feist6ef20402019-01-07 16:45:08 -0800109
James Feistd7ae29a2020-06-25 15:42:46 -0700110 ReadingFormat readingFormat;
James Feist6ef20402019-01-07 16:45:08 -0800111
112 private:
James Feistd8705872019-02-08 13:26:09 -0800113 sdbusplus::asio::object_server& objectServer;
James Feist6ef20402019-01-07 16:45:08 -0800114 boost::asio::deadline_timer waitTimer;
Vijay Khemka682a5cb2019-07-18 17:34:03 -0700115};