xref: /openbmc/fb-ipmi-oem/include/sdrutils.hpp (revision 63c99be4)
11b6fae3fSVijay Khemka #pragma once
21b6fae3fSVijay Khemka 
31b6fae3fSVijay Khemka #include <ipmid/api.h>
41b6fae3fSVijay Khemka #include <stdint.h>
51b6fae3fSVijay Khemka 
6*63c99be4SVijay Khemka #include <ipmid/types.hpp>
7*63c99be4SVijay Khemka 
81b6fae3fSVijay Khemka /**
91b6fae3fSVijay Khemka  * Get SDR
101b6fae3fSVijay Khemka  */
111b6fae3fSVijay Khemka namespace get_sdr
121b6fae3fSVijay Khemka {
131b6fae3fSVijay Khemka 
141b6fae3fSVijay Khemka // Response
151b6fae3fSVijay Khemka struct GetSdrResp
161b6fae3fSVijay Khemka {
171b6fae3fSVijay Khemka     uint8_t next_record_id_lsb;
181b6fae3fSVijay Khemka     uint8_t next_record_id_msb;
191b6fae3fSVijay Khemka     uint8_t record_data[64];
201b6fae3fSVijay Khemka } __attribute__((packed));
211b6fae3fSVijay Khemka 
221b6fae3fSVijay Khemka // Record header
231b6fae3fSVijay Khemka struct SensorDataRecordHeader
241b6fae3fSVijay Khemka {
251b6fae3fSVijay Khemka     uint8_t record_id_lsb;
261b6fae3fSVijay Khemka     uint8_t record_id_msb;
271b6fae3fSVijay Khemka     uint8_t sdr_version;
281b6fae3fSVijay Khemka     uint8_t record_type;
291b6fae3fSVijay Khemka     uint8_t record_length; // Length not counting the header
301b6fae3fSVijay Khemka } __attribute__((packed));
311b6fae3fSVijay Khemka 
321b6fae3fSVijay Khemka enum SensorDataRecordType
331b6fae3fSVijay Khemka {
341b6fae3fSVijay Khemka     SENSOR_DATA_FULL_RECORD = 0x1,
351b6fae3fSVijay Khemka     SENSOR_DATA_FRU_RECORD = 0x11,
361b6fae3fSVijay Khemka     SENSOR_DATA_ENTITY_RECORD = 0x8,
371b6fae3fSVijay Khemka };
381b6fae3fSVijay Khemka 
391b6fae3fSVijay Khemka // Record key
401b6fae3fSVijay Khemka struct SensorDataRecordKey
411b6fae3fSVijay Khemka {
421b6fae3fSVijay Khemka     uint8_t owner_id;
431b6fae3fSVijay Khemka     uint8_t owner_lun;
441b6fae3fSVijay Khemka     uint8_t sensor_number;
451b6fae3fSVijay Khemka } __attribute__((packed));
461b6fae3fSVijay Khemka 
471b6fae3fSVijay Khemka /** @struct SensorDataFruRecordKey
481b6fae3fSVijay Khemka  *
491b6fae3fSVijay Khemka  *  FRU Device Locator Record(key) - SDR Type 11
501b6fae3fSVijay Khemka  */
511b6fae3fSVijay Khemka struct SensorDataFruRecordKey
521b6fae3fSVijay Khemka {
531b6fae3fSVijay Khemka     uint8_t deviceAddress;
541b6fae3fSVijay Khemka     uint8_t fruID;
551b6fae3fSVijay Khemka     uint8_t accessLun;
561b6fae3fSVijay Khemka     uint8_t channelNumber;
571b6fae3fSVijay Khemka } __attribute__((packed));
581b6fae3fSVijay Khemka 
591b6fae3fSVijay Khemka // Body - full record
601b6fae3fSVijay Khemka #define FULL_RECORD_ID_STR_MAX_LENGTH 16
611b6fae3fSVijay Khemka 
621b6fae3fSVijay Khemka static const int FRU_RECORD_DEVICE_ID_MAX_LENGTH = 16;
631b6fae3fSVijay Khemka 
641b6fae3fSVijay Khemka struct SensorDataFullRecordBody
651b6fae3fSVijay Khemka {
661b6fae3fSVijay Khemka     uint8_t entity_id;
671b6fae3fSVijay Khemka     uint8_t entity_instance;
681b6fae3fSVijay Khemka     uint8_t sensor_initialization;
691b6fae3fSVijay Khemka     uint8_t sensor_capabilities; // no macro support
701b6fae3fSVijay Khemka     uint8_t sensor_type;
711b6fae3fSVijay Khemka     uint8_t event_reading_type;
721b6fae3fSVijay Khemka     uint8_t supported_assertions[2];          // no macro support
731b6fae3fSVijay Khemka     uint8_t supported_deassertions[2];        // no macro support
741b6fae3fSVijay Khemka     uint8_t discrete_reading_setting_mask[2]; // no macro support
751b6fae3fSVijay Khemka     uint8_t sensor_units_1;
761b6fae3fSVijay Khemka     uint8_t sensor_units_2_base;
771b6fae3fSVijay Khemka     uint8_t sensor_units_3_modifier;
781b6fae3fSVijay Khemka     uint8_t linearization;
791b6fae3fSVijay Khemka     uint8_t m_lsb;
801b6fae3fSVijay Khemka     uint8_t m_msb_and_tolerance;
811b6fae3fSVijay Khemka     uint8_t b_lsb;
821b6fae3fSVijay Khemka     uint8_t b_msb_and_accuracy_lsb;
831b6fae3fSVijay Khemka     uint8_t accuracy_and_sensor_direction;
841b6fae3fSVijay Khemka     uint8_t r_b_exponents;
851b6fae3fSVijay Khemka     uint8_t analog_characteristic_flags; // no macro support
861b6fae3fSVijay Khemka     uint8_t nominal_reading;
871b6fae3fSVijay Khemka     uint8_t normal_max;
881b6fae3fSVijay Khemka     uint8_t normal_min;
891b6fae3fSVijay Khemka     uint8_t sensor_max;
901b6fae3fSVijay Khemka     uint8_t sensor_min;
911b6fae3fSVijay Khemka     uint8_t upper_nonrecoverable_threshold;
921b6fae3fSVijay Khemka     uint8_t upper_critical_threshold;
931b6fae3fSVijay Khemka     uint8_t upper_noncritical_threshold;
941b6fae3fSVijay Khemka     uint8_t lower_nonrecoverable_threshold;
951b6fae3fSVijay Khemka     uint8_t lower_critical_threshold;
961b6fae3fSVijay Khemka     uint8_t lower_noncritical_threshold;
971b6fae3fSVijay Khemka     uint8_t positive_threshold_hysteresis;
981b6fae3fSVijay Khemka     uint8_t negative_threshold_hysteresis;
991b6fae3fSVijay Khemka     uint16_t reserved;
1001b6fae3fSVijay Khemka     uint8_t oem_reserved;
1011b6fae3fSVijay Khemka     uint8_t id_string_info;
1021b6fae3fSVijay Khemka     char id_string[FULL_RECORD_ID_STR_MAX_LENGTH];
1031b6fae3fSVijay Khemka } __attribute__((packed));
1041b6fae3fSVijay Khemka 
1051b6fae3fSVijay Khemka /** @struct SensorDataFruRecordBody
1061b6fae3fSVijay Khemka  *
1071b6fae3fSVijay Khemka  *  FRU Device Locator Record(body) - SDR Type 11
1081b6fae3fSVijay Khemka  */
1091b6fae3fSVijay Khemka struct SensorDataFruRecordBody
1101b6fae3fSVijay Khemka {
1111b6fae3fSVijay Khemka     uint8_t reserved;
1121b6fae3fSVijay Khemka     uint8_t deviceType;
1131b6fae3fSVijay Khemka     uint8_t deviceTypeModifier;
1141b6fae3fSVijay Khemka     uint8_t entityID;
1151b6fae3fSVijay Khemka     uint8_t entityInstance;
1161b6fae3fSVijay Khemka     uint8_t oem;
1171b6fae3fSVijay Khemka     uint8_t deviceIDLen;
1181b6fae3fSVijay Khemka     char deviceID[FRU_RECORD_DEVICE_ID_MAX_LENGTH];
1191b6fae3fSVijay Khemka } __attribute__((packed));
1201b6fae3fSVijay Khemka 
1211b6fae3fSVijay Khemka struct SensorDataFullRecord
1221b6fae3fSVijay Khemka {
1231b6fae3fSVijay Khemka     SensorDataRecordHeader header;
1241b6fae3fSVijay Khemka     SensorDataRecordKey key;
1251b6fae3fSVijay Khemka     SensorDataFullRecordBody body;
1261b6fae3fSVijay Khemka } __attribute__((packed));
1271b6fae3fSVijay Khemka 
1281b6fae3fSVijay Khemka /** @struct SensorDataFruRecord
1291b6fae3fSVijay Khemka  *
1301b6fae3fSVijay Khemka  *  FRU Device Locator Record - SDR Type 11
1311b6fae3fSVijay Khemka  */
1321b6fae3fSVijay Khemka struct SensorDataFruRecord
1331b6fae3fSVijay Khemka {
1341b6fae3fSVijay Khemka     SensorDataRecordHeader header;
1351b6fae3fSVijay Khemka     SensorDataFruRecordKey key;
1361b6fae3fSVijay Khemka     SensorDataFruRecordBody body;
1371b6fae3fSVijay Khemka } __attribute__((packed));
1381b6fae3fSVijay Khemka 
1391b6fae3fSVijay Khemka } // namespace get_sdr
140