blob: c528698799a64512d07f453eb056827d0ef4d2ed [file] [log] [blame]
Jayashree Dhanapal3746c552022-03-21 14:45:52 +05301#pragma once
2
Ed Tanous18b61862025-01-30 10:56:28 -08003#include <sdbusplus/asio/connection.hpp>
4
5#include <cstdint>
6#include <map>
7#include <memory>
8#include <string>
9#include <tuple>
10#include <vector>
Jayashree Dhanapal3746c552022-03-21 14:45:52 +053011
12using IpmbMethodType =
13 std::tuple<int, uint8_t, uint8_t, uint8_t, uint8_t, std::vector<uint8_t>>;
14
15enum class SDRType
16{
17 sdrType01 = 1,
18 sdrType02 = 2,
19 sdrType03 = 3
20};
21
22namespace sdr
23{
24// IPMB Commands
25static constexpr uint8_t netfnStorageReq = 0x0a;
26static constexpr uint8_t cmdStorageGetSdrInfo = 0x20;
27static constexpr uint8_t cmdStorageReserveSdr = 0x22;
28static constexpr uint8_t cmdStorageGetSdr = 0x23;
29
30// Get SDR Commands
31static constexpr uint8_t sdrNxtRecLSB = 0;
32static constexpr uint8_t sdrNxtRecMSB = 1;
33static constexpr uint8_t perCountByte = 16;
34
35// Sensor Record Bytes
36static constexpr uint8_t sdrType = 5;
37static constexpr uint8_t dataLengthByte = 6;
38static constexpr uint8_t sdrSensorNum = 9;
39
40} // namespace sdr
41
42namespace sdrtype01
43{
44// Negative Handle Commands
45static constexpr uint8_t maxPosReadingMargin = 127;
46static constexpr uint8_t twosCompVal = 128;
47static constexpr double thermalConst = 256;
48
49static constexpr uint8_t sdrSensNoThres = 0;
50static constexpr uint8_t sensorCapability = 13;
51static constexpr uint8_t sdrNegHandle = 24;
52static constexpr uint8_t sdrUnitType = 25;
53static constexpr uint8_t sdrLinearByte = 27;
54
55// SDR Type 1 Thresholds Commands
56static constexpr uint8_t mDataByte = 28;
57static constexpr uint8_t mTolDataByte = 29;
58static constexpr uint8_t bDataByte = 30;
59static constexpr uint8_t bAcuDataByte = 31;
60static constexpr uint8_t rbExpDataByte = 33;
61static constexpr uint8_t upperCriticalThreshold = 43;
62static constexpr uint8_t lowerCriticalThreshold = 46;
63static constexpr uint8_t nameLengthByte = 53;
64
65} // namespace sdrtype01
66
67struct SensorInfo
68{
69 std::string sensorReadName;
70 uint8_t sensorUnit = 0;
71 double thresUpperCri = 0;
72 double thresLowerCri = 0;
73 uint8_t sensorNumber = 0;
74 uint8_t sensCap = 0;
75};
76
77struct SensorValConversion
78{
79 uint16_t mValue = 0;
80 double bValue = 0;
81 double expoVal = 0;
82 uint8_t negRead = 0;
83};
84
85inline std::map<int, std::vector<SensorInfo>> sensorRecord;
86inline std::map<int, std::map<uint8_t, SensorValConversion>> sensorValRecord;
87
88class IpmbSDRDevice : public std::enable_shared_from_this<IpmbSDRDevice>
89{
90 public:
91 IpmbSDRDevice(std::shared_ptr<sdbusplus::asio::connection>& dbusConnection,
92 uint8_t cmdAddr);
93
94 uint8_t commandAddress = 0;
95 int hostIndex = 0;
96
97 std::shared_ptr<sdbusplus::asio::connection> conn;
98
99 std::vector<uint8_t> sdrData;
100 uint16_t validRecordCount = 1;
101 uint8_t iCnt = 0;
102 uint8_t nextRecordIDLSB = 0;
103 uint8_t nextRecordIDMSB = 0;
104
Ed Tanous739ab192024-04-03 18:50:37 -0700105 std::vector<uint8_t> sdrCommandData;
Jayashree Dhanapal3746c552022-03-21 14:45:52 +0530106
107 void getSDRRepositoryInfo();
108
109 void reserveSDRRepository(uint16_t recordCount);
110
111 void getSDRSensorData(uint16_t recordCount, uint8_t resrvIDLSB,
112 uint8_t resrvIDMSB);
113
114 void handleSDRData(const std::vector<uint8_t>& data, uint16_t recordCount,
115 uint8_t resrvIDLSB, uint8_t resrvIDMSB);
116
117 void checkSDRData(std::vector<uint8_t>& sdrDataBytes,
118 uint8_t dataLength) const;
119
120 static void checkSDRType01Threshold(std::vector<uint8_t>& sdrDataBytes,
121 int busIndex, std::string tempName);
122
123 inline static double sensorValCalculation(uint16_t mValue, double bValue,
124 double expValue, double value);
125};