xref: /openbmc/fb-ipmi-oem/include/sdrutils.hpp (revision 1b6fae3f)
1*1b6fae3fSVijay Khemka #pragma once
2*1b6fae3fSVijay Khemka 
3*1b6fae3fSVijay Khemka #include <ipmid/types.hpp>
4*1b6fae3fSVijay Khemka 
5*1b6fae3fSVijay Khemka #include <ipmid/api.h>
6*1b6fae3fSVijay Khemka #include <stdint.h>
7*1b6fae3fSVijay Khemka 
8*1b6fae3fSVijay Khemka /**
9*1b6fae3fSVijay Khemka  * Get SDR
10*1b6fae3fSVijay Khemka  */
11*1b6fae3fSVijay Khemka namespace get_sdr
12*1b6fae3fSVijay Khemka {
13*1b6fae3fSVijay Khemka 
14*1b6fae3fSVijay Khemka // Response
15*1b6fae3fSVijay Khemka struct GetSdrResp
16*1b6fae3fSVijay Khemka {
17*1b6fae3fSVijay Khemka     uint8_t next_record_id_lsb;
18*1b6fae3fSVijay Khemka     uint8_t next_record_id_msb;
19*1b6fae3fSVijay Khemka     uint8_t record_data[64];
20*1b6fae3fSVijay Khemka } __attribute__((packed));
21*1b6fae3fSVijay Khemka 
22*1b6fae3fSVijay Khemka // Record header
23*1b6fae3fSVijay Khemka struct SensorDataRecordHeader
24*1b6fae3fSVijay Khemka {
25*1b6fae3fSVijay Khemka     uint8_t record_id_lsb;
26*1b6fae3fSVijay Khemka     uint8_t record_id_msb;
27*1b6fae3fSVijay Khemka     uint8_t sdr_version;
28*1b6fae3fSVijay Khemka     uint8_t record_type;
29*1b6fae3fSVijay Khemka     uint8_t record_length; // Length not counting the header
30*1b6fae3fSVijay Khemka } __attribute__((packed));
31*1b6fae3fSVijay Khemka 
32*1b6fae3fSVijay Khemka enum SensorDataRecordType
33*1b6fae3fSVijay Khemka {
34*1b6fae3fSVijay Khemka     SENSOR_DATA_FULL_RECORD = 0x1,
35*1b6fae3fSVijay Khemka     SENSOR_DATA_FRU_RECORD = 0x11,
36*1b6fae3fSVijay Khemka     SENSOR_DATA_ENTITY_RECORD = 0x8,
37*1b6fae3fSVijay Khemka };
38*1b6fae3fSVijay Khemka 
39*1b6fae3fSVijay Khemka // Record key
40*1b6fae3fSVijay Khemka struct SensorDataRecordKey
41*1b6fae3fSVijay Khemka {
42*1b6fae3fSVijay Khemka     uint8_t owner_id;
43*1b6fae3fSVijay Khemka     uint8_t owner_lun;
44*1b6fae3fSVijay Khemka     uint8_t sensor_number;
45*1b6fae3fSVijay Khemka } __attribute__((packed));
46*1b6fae3fSVijay Khemka 
47*1b6fae3fSVijay Khemka /** @struct SensorDataFruRecordKey
48*1b6fae3fSVijay Khemka  *
49*1b6fae3fSVijay Khemka  *  FRU Device Locator Record(key) - SDR Type 11
50*1b6fae3fSVijay Khemka  */
51*1b6fae3fSVijay Khemka struct SensorDataFruRecordKey
52*1b6fae3fSVijay Khemka {
53*1b6fae3fSVijay Khemka     uint8_t deviceAddress;
54*1b6fae3fSVijay Khemka     uint8_t fruID;
55*1b6fae3fSVijay Khemka     uint8_t accessLun;
56*1b6fae3fSVijay Khemka     uint8_t channelNumber;
57*1b6fae3fSVijay Khemka } __attribute__((packed));
58*1b6fae3fSVijay Khemka 
59*1b6fae3fSVijay Khemka // Body - full record
60*1b6fae3fSVijay Khemka #define FULL_RECORD_ID_STR_MAX_LENGTH 16
61*1b6fae3fSVijay Khemka 
62*1b6fae3fSVijay Khemka static const int FRU_RECORD_DEVICE_ID_MAX_LENGTH = 16;
63*1b6fae3fSVijay Khemka 
64*1b6fae3fSVijay Khemka struct SensorDataFullRecordBody
65*1b6fae3fSVijay Khemka {
66*1b6fae3fSVijay Khemka     uint8_t entity_id;
67*1b6fae3fSVijay Khemka     uint8_t entity_instance;
68*1b6fae3fSVijay Khemka     uint8_t sensor_initialization;
69*1b6fae3fSVijay Khemka     uint8_t sensor_capabilities; // no macro support
70*1b6fae3fSVijay Khemka     uint8_t sensor_type;
71*1b6fae3fSVijay Khemka     uint8_t event_reading_type;
72*1b6fae3fSVijay Khemka     uint8_t supported_assertions[2];          // no macro support
73*1b6fae3fSVijay Khemka     uint8_t supported_deassertions[2];        // no macro support
74*1b6fae3fSVijay Khemka     uint8_t discrete_reading_setting_mask[2]; // no macro support
75*1b6fae3fSVijay Khemka     uint8_t sensor_units_1;
76*1b6fae3fSVijay Khemka     uint8_t sensor_units_2_base;
77*1b6fae3fSVijay Khemka     uint8_t sensor_units_3_modifier;
78*1b6fae3fSVijay Khemka     uint8_t linearization;
79*1b6fae3fSVijay Khemka     uint8_t m_lsb;
80*1b6fae3fSVijay Khemka     uint8_t m_msb_and_tolerance;
81*1b6fae3fSVijay Khemka     uint8_t b_lsb;
82*1b6fae3fSVijay Khemka     uint8_t b_msb_and_accuracy_lsb;
83*1b6fae3fSVijay Khemka     uint8_t accuracy_and_sensor_direction;
84*1b6fae3fSVijay Khemka     uint8_t r_b_exponents;
85*1b6fae3fSVijay Khemka     uint8_t analog_characteristic_flags; // no macro support
86*1b6fae3fSVijay Khemka     uint8_t nominal_reading;
87*1b6fae3fSVijay Khemka     uint8_t normal_max;
88*1b6fae3fSVijay Khemka     uint8_t normal_min;
89*1b6fae3fSVijay Khemka     uint8_t sensor_max;
90*1b6fae3fSVijay Khemka     uint8_t sensor_min;
91*1b6fae3fSVijay Khemka     uint8_t upper_nonrecoverable_threshold;
92*1b6fae3fSVijay Khemka     uint8_t upper_critical_threshold;
93*1b6fae3fSVijay Khemka     uint8_t upper_noncritical_threshold;
94*1b6fae3fSVijay Khemka     uint8_t lower_nonrecoverable_threshold;
95*1b6fae3fSVijay Khemka     uint8_t lower_critical_threshold;
96*1b6fae3fSVijay Khemka     uint8_t lower_noncritical_threshold;
97*1b6fae3fSVijay Khemka     uint8_t positive_threshold_hysteresis;
98*1b6fae3fSVijay Khemka     uint8_t negative_threshold_hysteresis;
99*1b6fae3fSVijay Khemka     uint16_t reserved;
100*1b6fae3fSVijay Khemka     uint8_t oem_reserved;
101*1b6fae3fSVijay Khemka     uint8_t id_string_info;
102*1b6fae3fSVijay Khemka     char id_string[FULL_RECORD_ID_STR_MAX_LENGTH];
103*1b6fae3fSVijay Khemka } __attribute__((packed));
104*1b6fae3fSVijay Khemka 
105*1b6fae3fSVijay Khemka /** @struct SensorDataFruRecordBody
106*1b6fae3fSVijay Khemka  *
107*1b6fae3fSVijay Khemka  *  FRU Device Locator Record(body) - SDR Type 11
108*1b6fae3fSVijay Khemka  */
109*1b6fae3fSVijay Khemka struct SensorDataFruRecordBody
110*1b6fae3fSVijay Khemka {
111*1b6fae3fSVijay Khemka     uint8_t reserved;
112*1b6fae3fSVijay Khemka     uint8_t deviceType;
113*1b6fae3fSVijay Khemka     uint8_t deviceTypeModifier;
114*1b6fae3fSVijay Khemka     uint8_t entityID;
115*1b6fae3fSVijay Khemka     uint8_t entityInstance;
116*1b6fae3fSVijay Khemka     uint8_t oem;
117*1b6fae3fSVijay Khemka     uint8_t deviceIDLen;
118*1b6fae3fSVijay Khemka     char deviceID[FRU_RECORD_DEVICE_ID_MAX_LENGTH];
119*1b6fae3fSVijay Khemka } __attribute__((packed));
120*1b6fae3fSVijay Khemka 
121*1b6fae3fSVijay Khemka struct SensorDataFullRecord
122*1b6fae3fSVijay Khemka {
123*1b6fae3fSVijay Khemka     SensorDataRecordHeader header;
124*1b6fae3fSVijay Khemka     SensorDataRecordKey key;
125*1b6fae3fSVijay Khemka     SensorDataFullRecordBody body;
126*1b6fae3fSVijay Khemka } __attribute__((packed));
127*1b6fae3fSVijay Khemka 
128*1b6fae3fSVijay Khemka /** @struct SensorDataFruRecord
129*1b6fae3fSVijay Khemka  *
130*1b6fae3fSVijay Khemka  *  FRU Device Locator Record - SDR Type 11
131*1b6fae3fSVijay Khemka  */
132*1b6fae3fSVijay Khemka struct SensorDataFruRecord
133*1b6fae3fSVijay Khemka {
134*1b6fae3fSVijay Khemka     SensorDataRecordHeader header;
135*1b6fae3fSVijay Khemka     SensorDataFruRecordKey key;
136*1b6fae3fSVijay Khemka     SensorDataFruRecordBody body;
137*1b6fae3fSVijay Khemka } __attribute__((packed));
138*1b6fae3fSVijay Khemka 
139*1b6fae3fSVijay Khemka } // namespace get_sdr
140