146470a38SPatrick Venture #pragma once 246470a38SPatrick Venture 346470a38SPatrick Venture #include <stdint.h> 446470a38SPatrick Venture 5e08fbffcSVernon Mauery #include <ipmid/api.hpp> 633250240SVernon Mauery #include <ipmid/types.hpp> 733250240SVernon Mauery 8fbc6c9d7SPatrick Williams #include <exception> 9fbc6c9d7SPatrick Williams 1046470a38SPatrick Venture // IPMI commands for net functions. 1146470a38SPatrick Venture enum ipmi_netfn_sen_cmds 1246470a38SPatrick Venture { 133342a8e0SJia, Chunhui IPMI_CMD_PLATFORM_EVENT = 0x2, 1446470a38SPatrick Venture IPMI_CMD_GET_DEVICE_SDR_INFO = 0x20, 1546470a38SPatrick Venture IPMI_CMD_GET_DEVICE_SDR = 0x21, 1646470a38SPatrick Venture IPMI_CMD_RESERVE_DEVICE_SDR_REPO = 0x22, 1746470a38SPatrick Venture IPMI_CMD_GET_SENSOR_READING = 0x2D, 1846470a38SPatrick Venture IPMI_CMD_GET_SENSOR_TYPE = 0x2F, 1946470a38SPatrick Venture IPMI_CMD_SET_SENSOR = 0x30, 2046470a38SPatrick Venture IPMI_CMD_GET_SENSOR_THRESHOLDS = 0x27, 2146470a38SPatrick Venture }; 2246470a38SPatrick Venture 2346470a38SPatrick Venture /** 2446470a38SPatrick Venture * @enum device_type 2546470a38SPatrick Venture * IPMI FRU device types 2646470a38SPatrick Venture */ 2746470a38SPatrick Venture enum device_type 2846470a38SPatrick Venture { 2946470a38SPatrick Venture IPMI_PHYSICAL_FRU = 0x00, 3046470a38SPatrick Venture IPMI_LOGICAL_FRU = 0x80, 3146470a38SPatrick Venture }; 3246470a38SPatrick Venture 3346470a38SPatrick Venture // Discrete sensor types. 3446470a38SPatrick Venture enum ipmi_sensor_types 3546470a38SPatrick Venture { 3646470a38SPatrick Venture IPMI_SENSOR_TEMP = 0x01, 3746470a38SPatrick Venture IPMI_SENSOR_VOLTAGE = 0x02, 3846470a38SPatrick Venture IPMI_SENSOR_CURRENT = 0x03, 3946470a38SPatrick Venture IPMI_SENSOR_FAN = 0x04, 4046470a38SPatrick Venture IPMI_SENSOR_TPM = 0xCC, 4146470a38SPatrick Venture }; 4246470a38SPatrick Venture 439cf85627SBrandon Kim /** @brief Custom exception for reading sensors that are not funcitonal. 449cf85627SBrandon Kim */ 459cf85627SBrandon Kim struct SensorFunctionalError : public std::exception 469cf85627SBrandon Kim { 479cf85627SBrandon Kim const char* what() const noexcept 489cf85627SBrandon Kim { 499cf85627SBrandon Kim return "Sensor not functional"; 509cf85627SBrandon Kim } 519cf85627SBrandon Kim }; 529cf85627SBrandon Kim 5346470a38SPatrick Venture #define MAX_DBUS_PATH 128 5446470a38SPatrick Venture struct dbus_interface_t 5546470a38SPatrick Venture { 5646470a38SPatrick Venture uint8_t sensornumber; 5746470a38SPatrick Venture uint8_t sensortype; 5846470a38SPatrick Venture 5946470a38SPatrick Venture char bus[MAX_DBUS_PATH]; 6046470a38SPatrick Venture char path[MAX_DBUS_PATH]; 6146470a38SPatrick Venture char interface[MAX_DBUS_PATH]; 6246470a38SPatrick Venture }; 6346470a38SPatrick Venture 643342a8e0SJia, Chunhui struct PlatformEventRequest 653342a8e0SJia, Chunhui { 663342a8e0SJia, Chunhui uint8_t eventMessageRevision; 673342a8e0SJia, Chunhui uint8_t sensorType; 683342a8e0SJia, Chunhui uint8_t sensorNumber; 693342a8e0SJia, Chunhui uint8_t eventDirectionType; 703342a8e0SJia, Chunhui uint8_t data[3]; 713342a8e0SJia, Chunhui }; 723342a8e0SJia, Chunhui 73fbc6c9d7SPatrick Williams static constexpr const char* ipmiSELPath = "/xyz/openbmc_project/Logging/IPMI"; 74fbc6c9d7SPatrick Williams static constexpr const char* ipmiSELAddInterface = 753342a8e0SJia, Chunhui "xyz.openbmc_project.Logging.IPMI"; 76*b5160f5cSKonstantin Aladyshev static const std::string ipmiSELAddMessage = "IPMI generated SEL Entry"; 773342a8e0SJia, Chunhui 783342a8e0SJia, Chunhui static constexpr int selSystemEventSizeWith3Bytes = 8; 793342a8e0SJia, Chunhui static constexpr int selSystemEventSizeWith2Bytes = 7; 803342a8e0SJia, Chunhui static constexpr int selSystemEventSizeWith1Bytes = 6; 813342a8e0SJia, Chunhui static constexpr int selIPMBEventSize = 7; 823342a8e0SJia, Chunhui static constexpr uint8_t directionMask = 0x80; 833342a8e0SJia, Chunhui static constexpr uint8_t byte3EnableMask = 0x30; 843342a8e0SJia, Chunhui static constexpr uint8_t byte2EnableMask = 0xC0; 853342a8e0SJia, Chunhui 8646470a38SPatrick Venture int set_sensor_dbus_state_s(uint8_t, const char*, const char*); 8746470a38SPatrick Venture int set_sensor_dbus_state_y(uint8_t, const char*, const uint8_t); 8846470a38SPatrick Venture int find_openbmc_path(uint8_t, dbus_interface_t*); 8946470a38SPatrick Venture 9046470a38SPatrick Venture ipmi_ret_t ipmi_sen_get_sdr(ipmi_netfn_t netfn, ipmi_cmd_t cmd, 9146470a38SPatrick Venture ipmi_request_t request, ipmi_response_t response, 9246470a38SPatrick Venture ipmi_data_len_t data_len, ipmi_context_t context); 9346470a38SPatrick Venture 94d957823eSjayaprakash Mutyala ipmi::RspType<uint16_t> ipmiSensorReserveSdr(); 9546470a38SPatrick Venture 9646470a38SPatrick Venture static const uint16_t FRU_RECORD_ID_START = 256; 979c11894eSJaghathiswari Rankappagounder Natarajan static const uint16_t ENTITY_RECORD_ID_START = 512; 9846470a38SPatrick Venture static const uint8_t SDR_VERSION = 0x51; 9946470a38SPatrick Venture static const uint16_t END_OF_RECORD = 0xFFFF; 10046470a38SPatrick Venture static const uint8_t LENGTH_MASK = 0x1F; 10146470a38SPatrick Venture 10246470a38SPatrick Venture /** 10346470a38SPatrick Venture * Get SDR Info 10446470a38SPatrick Venture */ 10546470a38SPatrick Venture 10646470a38SPatrick Venture namespace get_sdr_info 10746470a38SPatrick Venture { 10846470a38SPatrick Venture namespace request 10946470a38SPatrick Venture { 11046470a38SPatrick Venture // Note: for some reason the ipmi_request_t appears to be the 11146470a38SPatrick Venture // raw value for this call. 11246470a38SPatrick Venture inline bool get_count(void* req) 11346470a38SPatrick Venture { 11446470a38SPatrick Venture return (bool)((uint64_t)(req) & 1); 11546470a38SPatrick Venture } 11646470a38SPatrick Venture } // namespace request 11746470a38SPatrick Venture } // namespace get_sdr_info 11846470a38SPatrick Venture 11946470a38SPatrick Venture /** 12046470a38SPatrick Venture * Get SDR 12146470a38SPatrick Venture */ 12246470a38SPatrick Venture namespace get_sdr 12346470a38SPatrick Venture { 12446470a38SPatrick Venture 12546470a38SPatrick Venture struct GetSdrReq 12646470a38SPatrick Venture { 12746470a38SPatrick Venture uint8_t reservation_id_lsb; 12846470a38SPatrick Venture uint8_t reservation_id_msb; 12946470a38SPatrick Venture uint8_t record_id_lsb; 13046470a38SPatrick Venture uint8_t record_id_msb; 13146470a38SPatrick Venture uint8_t offset; 13246470a38SPatrick Venture uint8_t bytes_to_read; 13346470a38SPatrick Venture } __attribute__((packed)); 13446470a38SPatrick Venture 13546470a38SPatrick Venture namespace request 13646470a38SPatrick Venture { 13746470a38SPatrick Venture 138e5c9d2fbSEmily Shaffer inline uint16_t get_reservation_id(GetSdrReq* req) 13946470a38SPatrick Venture { 14046470a38SPatrick Venture return (req->reservation_id_lsb + (req->reservation_id_msb << 8)); 14146470a38SPatrick Venture }; 14246470a38SPatrick Venture 14346470a38SPatrick Venture inline uint16_t get_record_id(GetSdrReq* req) 14446470a38SPatrick Venture { 14546470a38SPatrick Venture return (req->record_id_lsb + (req->record_id_msb << 8)); 14646470a38SPatrick Venture }; 14746470a38SPatrick Venture 14846470a38SPatrick Venture } // namespace request 14946470a38SPatrick Venture 15046470a38SPatrick Venture // Response 15146470a38SPatrick Venture struct GetSdrResp 15246470a38SPatrick Venture { 15346470a38SPatrick Venture uint8_t next_record_id_lsb; 15446470a38SPatrick Venture uint8_t next_record_id_msb; 15546470a38SPatrick Venture uint8_t record_data[64]; 15646470a38SPatrick Venture } __attribute__((packed)); 15746470a38SPatrick Venture 15846470a38SPatrick Venture namespace response 15946470a38SPatrick Venture { 16046470a38SPatrick Venture 16146470a38SPatrick Venture inline void set_next_record_id(uint16_t next, GetSdrResp* resp) 16246470a38SPatrick Venture { 16346470a38SPatrick Venture resp->next_record_id_lsb = next & 0xff; 16446470a38SPatrick Venture resp->next_record_id_msb = (next >> 8) & 0xff; 16546470a38SPatrick Venture }; 16646470a38SPatrick Venture 16746470a38SPatrick Venture } // namespace response 16846470a38SPatrick Venture 16946470a38SPatrick Venture // Record header 17046470a38SPatrick Venture struct SensorDataRecordHeader 17146470a38SPatrick Venture { 17246470a38SPatrick Venture uint8_t record_id_lsb; 17346470a38SPatrick Venture uint8_t record_id_msb; 17446470a38SPatrick Venture uint8_t sdr_version; 17546470a38SPatrick Venture uint8_t record_type; 17646470a38SPatrick Venture uint8_t record_length; // Length not counting the header 17746470a38SPatrick Venture } __attribute__((packed)); 17846470a38SPatrick Venture 17946470a38SPatrick Venture namespace header 18046470a38SPatrick Venture { 18146470a38SPatrick Venture 18246470a38SPatrick Venture inline void set_record_id(int id, SensorDataRecordHeader* hdr) 18346470a38SPatrick Venture { 18446470a38SPatrick Venture hdr->record_id_lsb = (id & 0xFF); 18546470a38SPatrick Venture hdr->record_id_msb = (id >> 8) & 0xFF; 18646470a38SPatrick Venture }; 18746470a38SPatrick Venture 18846470a38SPatrick Venture } // namespace header 18946470a38SPatrick Venture 19046470a38SPatrick Venture enum SensorDataRecordType 19146470a38SPatrick Venture { 19246470a38SPatrick Venture SENSOR_DATA_FULL_RECORD = 0x1, 1937b2e5504Sselvaganapathi SENSOR_DATA_COMPACT_RECORD = 0x2, 194da06d15cSHao Jiang SENSOR_DATA_EVENT_RECORD = 0x3, 1959c11894eSJaghathiswari Rankappagounder Natarajan SENSOR_DATA_ENTITY_RECORD = 0x8, 196a3476273SHarvey Wu SENSOR_DATA_FRU_RECORD = 0x11, 197a3476273SHarvey Wu SENSOR_DATA_MGMT_CTRL_LOCATOR = 0x12, 19846470a38SPatrick Venture }; 19946470a38SPatrick Venture 20046470a38SPatrick Venture // Record key 20146470a38SPatrick Venture struct SensorDataRecordKey 20246470a38SPatrick Venture { 20346470a38SPatrick Venture uint8_t owner_id; 20446470a38SPatrick Venture uint8_t owner_lun; 20546470a38SPatrick Venture uint8_t sensor_number; 20646470a38SPatrick Venture } __attribute__((packed)); 20746470a38SPatrick Venture 20846470a38SPatrick Venture /** @struct SensorDataFruRecordKey 20946470a38SPatrick Venture * 21046470a38SPatrick Venture * FRU Device Locator Record(key) - SDR Type 11 21146470a38SPatrick Venture */ 21246470a38SPatrick Venture struct SensorDataFruRecordKey 21346470a38SPatrick Venture { 21446470a38SPatrick Venture uint8_t deviceAddress; 21546470a38SPatrick Venture uint8_t fruID; 21646470a38SPatrick Venture uint8_t accessLun; 21746470a38SPatrick Venture uint8_t channelNumber; 21846470a38SPatrick Venture } __attribute__((packed)); 21946470a38SPatrick Venture 2209c11894eSJaghathiswari Rankappagounder Natarajan /** @struct SensorDataEntityRecordKey 2219c11894eSJaghathiswari Rankappagounder Natarajan * 2229c11894eSJaghathiswari Rankappagounder Natarajan * Entity Association Record(key) - SDR Type 8 2239c11894eSJaghathiswari Rankappagounder Natarajan */ 2249c11894eSJaghathiswari Rankappagounder Natarajan struct SensorDataEntityRecordKey 2259c11894eSJaghathiswari Rankappagounder Natarajan { 2269c11894eSJaghathiswari Rankappagounder Natarajan uint8_t containerEntityId; 2279c11894eSJaghathiswari Rankappagounder Natarajan uint8_t containerEntityInstance; 2289c11894eSJaghathiswari Rankappagounder Natarajan uint8_t flags; 2299c11894eSJaghathiswari Rankappagounder Natarajan uint8_t entityId1; 2309c11894eSJaghathiswari Rankappagounder Natarajan uint8_t entityInstance1; 2319c11894eSJaghathiswari Rankappagounder Natarajan } __attribute__((packed)); 2329c11894eSJaghathiswari Rankappagounder Natarajan 23346470a38SPatrick Venture namespace key 23446470a38SPatrick Venture { 23546470a38SPatrick Venture 2369c11894eSJaghathiswari Rankappagounder Natarajan static constexpr uint8_t listOrRangeBit = 7; 2379c11894eSJaghathiswari Rankappagounder Natarajan static constexpr uint8_t linkedBit = 6; 2389c11894eSJaghathiswari Rankappagounder Natarajan 23946470a38SPatrick Venture inline void set_owner_id_ipmb(SensorDataRecordKey* key) 24046470a38SPatrick Venture { 24146470a38SPatrick Venture key->owner_id &= ~0x01; 24246470a38SPatrick Venture }; 24346470a38SPatrick Venture 24446470a38SPatrick Venture inline void set_owner_id_system_sw(SensorDataRecordKey* key) 24546470a38SPatrick Venture { 24646470a38SPatrick Venture key->owner_id |= 0x01; 24746470a38SPatrick Venture }; 24846470a38SPatrick Venture 24946470a38SPatrick Venture inline void set_owner_id_bmc(SensorDataRecordKey* key) 25046470a38SPatrick Venture { 25146470a38SPatrick Venture key->owner_id |= 0x20; 25246470a38SPatrick Venture }; 25346470a38SPatrick Venture 25446470a38SPatrick Venture inline void set_owner_id_address(uint8_t addr, SensorDataRecordKey* key) 25546470a38SPatrick Venture { 25646470a38SPatrick Venture key->owner_id &= 0x01; 25746470a38SPatrick Venture key->owner_id |= addr << 1; 25846470a38SPatrick Venture }; 25946470a38SPatrick Venture 26046470a38SPatrick Venture inline void set_owner_lun(uint8_t lun, SensorDataRecordKey* key) 26146470a38SPatrick Venture { 26246470a38SPatrick Venture key->owner_lun &= ~0x03; 26346470a38SPatrick Venture key->owner_lun |= (lun & 0x03); 26446470a38SPatrick Venture }; 26546470a38SPatrick Venture 26646470a38SPatrick Venture inline void set_owner_lun_channel(uint8_t channel, SensorDataRecordKey* key) 26746470a38SPatrick Venture { 26846470a38SPatrick Venture key->owner_lun &= 0x0f; 26946470a38SPatrick Venture key->owner_lun |= ((channel & 0xf) << 4); 27046470a38SPatrick Venture }; 27146470a38SPatrick Venture 2729c11894eSJaghathiswari Rankappagounder Natarajan inline void set_flags(bool isList, bool isLinked, 2739c11894eSJaghathiswari Rankappagounder Natarajan SensorDataEntityRecordKey* key) 2749c11894eSJaghathiswari Rankappagounder Natarajan { 2759c11894eSJaghathiswari Rankappagounder Natarajan key->flags = 0x00; 2769c11894eSJaghathiswari Rankappagounder Natarajan if (!isList) 2779c11894eSJaghathiswari Rankappagounder Natarajan key->flags |= 1 << listOrRangeBit; 2789c11894eSJaghathiswari Rankappagounder Natarajan 2799c11894eSJaghathiswari Rankappagounder Natarajan if (isLinked) 2809c11894eSJaghathiswari Rankappagounder Natarajan key->flags |= 1 << linkedBit; 2819c11894eSJaghathiswari Rankappagounder Natarajan }; 2829c11894eSJaghathiswari Rankappagounder Natarajan 28346470a38SPatrick Venture } // namespace key 28446470a38SPatrick Venture 28546470a38SPatrick Venture /** @struct GetSensorThresholdsResponse 28646470a38SPatrick Venture * 28746470a38SPatrick Venture * Response structure for Get Sensor Thresholds command 28846470a38SPatrick Venture */ 28946470a38SPatrick Venture struct GetSensorThresholdsResponse 29046470a38SPatrick Venture { 29146470a38SPatrick Venture uint8_t validMask; //!< valid mask 29246470a38SPatrick Venture uint8_t lowerNonCritical; //!< lower non-critical threshold 29346470a38SPatrick Venture uint8_t lowerCritical; //!< lower critical threshold 29446470a38SPatrick Venture uint8_t lowerNonRecoverable; //!< lower non-recoverable threshold 29546470a38SPatrick Venture uint8_t upperNonCritical; //!< upper non-critical threshold 29646470a38SPatrick Venture uint8_t upperCritical; //!< upper critical threshold 29746470a38SPatrick Venture uint8_t upperNonRecoverable; //!< upper non-recoverable threshold 29846470a38SPatrick Venture } __attribute__((packed)); 29946470a38SPatrick Venture 30046470a38SPatrick Venture // Body - full record 30146470a38SPatrick Venture #define FULL_RECORD_ID_STR_MAX_LENGTH 16 30246470a38SPatrick Venture 30346470a38SPatrick Venture static const int FRU_RECORD_DEVICE_ID_MAX_LENGTH = 16; 30446470a38SPatrick Venture 30546470a38SPatrick Venture struct SensorDataFullRecordBody 30646470a38SPatrick Venture { 30746470a38SPatrick Venture uint8_t entity_id; 30846470a38SPatrick Venture uint8_t entity_instance; 30946470a38SPatrick Venture uint8_t sensor_initialization; 31046470a38SPatrick Venture uint8_t sensor_capabilities; // no macro support 31146470a38SPatrick Venture uint8_t sensor_type; 31246470a38SPatrick Venture uint8_t event_reading_type; 31346470a38SPatrick Venture uint8_t supported_assertions[2]; // no macro support 31446470a38SPatrick Venture uint8_t supported_deassertions[2]; // no macro support 31546470a38SPatrick Venture uint8_t discrete_reading_setting_mask[2]; // no macro support 31646470a38SPatrick Venture uint8_t sensor_units_1; 31746470a38SPatrick Venture uint8_t sensor_units_2_base; 31846470a38SPatrick Venture uint8_t sensor_units_3_modifier; 31946470a38SPatrick Venture uint8_t linearization; 32046470a38SPatrick Venture uint8_t m_lsb; 32146470a38SPatrick Venture uint8_t m_msb_and_tolerance; 32246470a38SPatrick Venture uint8_t b_lsb; 32346470a38SPatrick Venture uint8_t b_msb_and_accuracy_lsb; 32446470a38SPatrick Venture uint8_t accuracy_and_sensor_direction; 32546470a38SPatrick Venture uint8_t r_b_exponents; 32646470a38SPatrick Venture uint8_t analog_characteristic_flags; // no macro support 32746470a38SPatrick Venture uint8_t nominal_reading; 32846470a38SPatrick Venture uint8_t normal_max; 32946470a38SPatrick Venture uint8_t normal_min; 33046470a38SPatrick Venture uint8_t sensor_max; 33146470a38SPatrick Venture uint8_t sensor_min; 33246470a38SPatrick Venture uint8_t upper_nonrecoverable_threshold; 33346470a38SPatrick Venture uint8_t upper_critical_threshold; 33446470a38SPatrick Venture uint8_t upper_noncritical_threshold; 33546470a38SPatrick Venture uint8_t lower_nonrecoverable_threshold; 33646470a38SPatrick Venture uint8_t lower_critical_threshold; 33746470a38SPatrick Venture uint8_t lower_noncritical_threshold; 33846470a38SPatrick Venture uint8_t positive_threshold_hysteresis; 33946470a38SPatrick Venture uint8_t negative_threshold_hysteresis; 34046470a38SPatrick Venture uint16_t reserved; 34146470a38SPatrick Venture uint8_t oem_reserved; 34246470a38SPatrick Venture uint8_t id_string_info; 34346470a38SPatrick Venture char id_string[FULL_RECORD_ID_STR_MAX_LENGTH]; 34446470a38SPatrick Venture } __attribute__((packed)); 34546470a38SPatrick Venture 3467b2e5504Sselvaganapathi /** @struct SensorDataCompactRecord 3477b2e5504Sselvaganapathi * 3487b2e5504Sselvaganapathi * Compact Sensor Record(body) - SDR Type 2 3497b2e5504Sselvaganapathi */ 3507b2e5504Sselvaganapathi struct SensorDataCompactRecordBody 3517b2e5504Sselvaganapathi { 3527b2e5504Sselvaganapathi uint8_t entity_id; 3537b2e5504Sselvaganapathi uint8_t entity_instance; 3547b2e5504Sselvaganapathi uint8_t sensor_initialization; 3557b2e5504Sselvaganapathi uint8_t sensor_capabilities; // no macro support 3567b2e5504Sselvaganapathi uint8_t sensor_type; 3577b2e5504Sselvaganapathi uint8_t event_reading_type; 3587b2e5504Sselvaganapathi uint8_t supported_assertions[2]; // no macro support 3597b2e5504Sselvaganapathi uint8_t supported_deassertions[2]; // no macro support 3607b2e5504Sselvaganapathi uint8_t discrete_reading_setting_mask[2]; // no macro support 3617b2e5504Sselvaganapathi uint8_t sensor_units_1; 3627b2e5504Sselvaganapathi uint8_t sensor_units_2_base; 3637b2e5504Sselvaganapathi uint8_t sensor_units_3_modifier; 3647b2e5504Sselvaganapathi uint8_t record_sharing[2]; 3657b2e5504Sselvaganapathi uint8_t positive_threshold_hysteresis; 3667b2e5504Sselvaganapathi uint8_t negative_threshold_hysteresis; 3677b2e5504Sselvaganapathi uint8_t reserved[3]; 3687b2e5504Sselvaganapathi uint8_t oem_reserved; 3697b2e5504Sselvaganapathi uint8_t id_string_info; 3707b2e5504Sselvaganapathi char id_string[FULL_RECORD_ID_STR_MAX_LENGTH]; 3717b2e5504Sselvaganapathi } __attribute__((packed)); 3727b2e5504Sselvaganapathi 373da06d15cSHao Jiang /** @struct SensorDataEventRecord 374da06d15cSHao Jiang * 375da06d15cSHao Jiang * Event Only Sensor Record(body) - SDR Type 3 376da06d15cSHao Jiang */ 377da06d15cSHao Jiang struct SensorDataEventRecordBody 378da06d15cSHao Jiang { 379da06d15cSHao Jiang uint8_t entity_id; 380da06d15cSHao Jiang uint8_t entity_instance; 381da06d15cSHao Jiang uint8_t sensor_type; 382da06d15cSHao Jiang uint8_t event_reading_type; 383da06d15cSHao Jiang uint8_t sensor_record_sharing_1; 384da06d15cSHao Jiang uint8_t sensor_record_sharing_2; 385da06d15cSHao Jiang uint8_t reserved; 386da06d15cSHao Jiang uint8_t oem_reserved; 387da06d15cSHao Jiang uint8_t id_string_info; 388da06d15cSHao Jiang char id_string[FULL_RECORD_ID_STR_MAX_LENGTH]; 389da06d15cSHao Jiang } __attribute__((packed)); 390da06d15cSHao Jiang 39146470a38SPatrick Venture /** @struct SensorDataFruRecordBody 39246470a38SPatrick Venture * 39346470a38SPatrick Venture * FRU Device Locator Record(body) - SDR Type 11 39446470a38SPatrick Venture */ 39546470a38SPatrick Venture struct SensorDataFruRecordBody 39646470a38SPatrick Venture { 39746470a38SPatrick Venture uint8_t reserved; 39846470a38SPatrick Venture uint8_t deviceType; 39946470a38SPatrick Venture uint8_t deviceTypeModifier; 40046470a38SPatrick Venture uint8_t entityID; 40146470a38SPatrick Venture uint8_t entityInstance; 40246470a38SPatrick Venture uint8_t oem; 40346470a38SPatrick Venture uint8_t deviceIDLen; 40446470a38SPatrick Venture char deviceID[FRU_RECORD_DEVICE_ID_MAX_LENGTH]; 40546470a38SPatrick Venture } __attribute__((packed)); 40646470a38SPatrick Venture 4079c11894eSJaghathiswari Rankappagounder Natarajan /** @struct SensorDataEntityRecordBody 4089c11894eSJaghathiswari Rankappagounder Natarajan * 4099c11894eSJaghathiswari Rankappagounder Natarajan * Entity Association Record(body) - SDR Type 8 4109c11894eSJaghathiswari Rankappagounder Natarajan */ 4119c11894eSJaghathiswari Rankappagounder Natarajan struct SensorDataEntityRecordBody 4129c11894eSJaghathiswari Rankappagounder Natarajan { 4139c11894eSJaghathiswari Rankappagounder Natarajan uint8_t entityId2; 4149c11894eSJaghathiswari Rankappagounder Natarajan uint8_t entityInstance2; 4159c11894eSJaghathiswari Rankappagounder Natarajan uint8_t entityId3; 4169c11894eSJaghathiswari Rankappagounder Natarajan uint8_t entityInstance3; 4179c11894eSJaghathiswari Rankappagounder Natarajan uint8_t entityId4; 4189c11894eSJaghathiswari Rankappagounder Natarajan uint8_t entityInstance4; 4199c11894eSJaghathiswari Rankappagounder Natarajan } __attribute__((packed)); 4209c11894eSJaghathiswari Rankappagounder Natarajan 42146470a38SPatrick Venture namespace body 42246470a38SPatrick Venture { 42346470a38SPatrick Venture 42446470a38SPatrick Venture inline void set_entity_instance_number(uint8_t n, 42546470a38SPatrick Venture SensorDataFullRecordBody* body) 42646470a38SPatrick Venture { 42746470a38SPatrick Venture body->entity_instance &= 1 << 7; 42846470a38SPatrick Venture body->entity_instance |= (n & ~(1 << 7)); 42946470a38SPatrick Venture }; 43046470a38SPatrick Venture inline void set_entity_physical_entity(SensorDataFullRecordBody* body) 43146470a38SPatrick Venture { 43246470a38SPatrick Venture body->entity_instance &= ~(1 << 7); 43346470a38SPatrick Venture }; 43446470a38SPatrick Venture inline void set_entity_logical_container(SensorDataFullRecordBody* body) 43546470a38SPatrick Venture { 43646470a38SPatrick Venture body->entity_instance |= 1 << 7; 43746470a38SPatrick Venture }; 43846470a38SPatrick Venture 43946470a38SPatrick Venture inline void sensor_scanning_state(bool enabled, SensorDataFullRecordBody* body) 44046470a38SPatrick Venture { 44146470a38SPatrick Venture if (enabled) 44246470a38SPatrick Venture { 44346470a38SPatrick Venture body->sensor_initialization |= 1 << 0; 44446470a38SPatrick Venture } 44546470a38SPatrick Venture else 44646470a38SPatrick Venture { 44746470a38SPatrick Venture body->sensor_initialization &= ~(1 << 0); 44846470a38SPatrick Venture }; 44946470a38SPatrick Venture }; 45046470a38SPatrick Venture inline void event_generation_state(bool enabled, SensorDataFullRecordBody* body) 45146470a38SPatrick Venture { 45246470a38SPatrick Venture if (enabled) 45346470a38SPatrick Venture { 45446470a38SPatrick Venture body->sensor_initialization |= 1 << 1; 45546470a38SPatrick Venture } 45646470a38SPatrick Venture else 45746470a38SPatrick Venture { 45846470a38SPatrick Venture body->sensor_initialization &= ~(1 << 1); 45946470a38SPatrick Venture } 46046470a38SPatrick Venture }; 46146470a38SPatrick Venture inline void init_types_state(bool enabled, SensorDataFullRecordBody* body) 46246470a38SPatrick Venture { 46346470a38SPatrick Venture if (enabled) 46446470a38SPatrick Venture { 46546470a38SPatrick Venture body->sensor_initialization |= 1 << 2; 46646470a38SPatrick Venture } 46746470a38SPatrick Venture else 46846470a38SPatrick Venture { 46946470a38SPatrick Venture body->sensor_initialization &= ~(1 << 2); 47046470a38SPatrick Venture } 47146470a38SPatrick Venture }; 47246470a38SPatrick Venture inline void init_hyst_state(bool enabled, SensorDataFullRecordBody* body) 47346470a38SPatrick Venture { 47446470a38SPatrick Venture if (enabled) 47546470a38SPatrick Venture { 47646470a38SPatrick Venture body->sensor_initialization |= 1 << 3; 47746470a38SPatrick Venture } 47846470a38SPatrick Venture else 47946470a38SPatrick Venture { 48046470a38SPatrick Venture body->sensor_initialization &= ~(1 << 3); 48146470a38SPatrick Venture } 48246470a38SPatrick Venture }; 48346470a38SPatrick Venture inline void init_thresh_state(bool enabled, SensorDataFullRecordBody* body) 48446470a38SPatrick Venture { 48546470a38SPatrick Venture if (enabled) 48646470a38SPatrick Venture { 48746470a38SPatrick Venture body->sensor_initialization |= 1 << 4; 48846470a38SPatrick Venture } 48946470a38SPatrick Venture else 49046470a38SPatrick Venture { 49146470a38SPatrick Venture body->sensor_initialization &= ~(1 << 4); 49246470a38SPatrick Venture } 49346470a38SPatrick Venture }; 49446470a38SPatrick Venture inline void init_events_state(bool enabled, SensorDataFullRecordBody* body) 49546470a38SPatrick Venture { 49646470a38SPatrick Venture if (enabled) 49746470a38SPatrick Venture { 49846470a38SPatrick Venture body->sensor_initialization |= 1 << 5; 49946470a38SPatrick Venture } 50046470a38SPatrick Venture else 50146470a38SPatrick Venture { 50246470a38SPatrick Venture body->sensor_initialization &= ~(1 << 5); 50346470a38SPatrick Venture } 50446470a38SPatrick Venture }; 50546470a38SPatrick Venture inline void init_scanning_state(bool enabled, SensorDataFullRecordBody* body) 50646470a38SPatrick Venture { 50746470a38SPatrick Venture if (enabled) 50846470a38SPatrick Venture { 50946470a38SPatrick Venture body->sensor_initialization |= 1 << 6; 51046470a38SPatrick Venture } 51146470a38SPatrick Venture else 51246470a38SPatrick Venture { 51346470a38SPatrick Venture body->sensor_initialization &= ~(1 << 6); 51446470a38SPatrick Venture } 51546470a38SPatrick Venture }; 51646470a38SPatrick Venture inline void init_settable_state(bool enabled, SensorDataFullRecordBody* body) 51746470a38SPatrick Venture { 51846470a38SPatrick Venture if (enabled) 51946470a38SPatrick Venture { 52046470a38SPatrick Venture body->sensor_initialization |= 1 << 7; 52146470a38SPatrick Venture } 52246470a38SPatrick Venture else 52346470a38SPatrick Venture { 52446470a38SPatrick Venture body->sensor_initialization &= ~(1 << 7); 52546470a38SPatrick Venture } 52646470a38SPatrick Venture }; 52746470a38SPatrick Venture 52846470a38SPatrick Venture inline void set_percentage(SensorDataFullRecordBody* body) 52946470a38SPatrick Venture { 53046470a38SPatrick Venture body->sensor_units_1 |= 1 << 0; 53146470a38SPatrick Venture }; 53246470a38SPatrick Venture inline void unset_percentage(SensorDataFullRecordBody* body) 53346470a38SPatrick Venture { 53446470a38SPatrick Venture body->sensor_units_1 &= ~(1 << 0); 53546470a38SPatrick Venture }; 53646470a38SPatrick Venture inline void set_modifier_operation(uint8_t op, SensorDataFullRecordBody* body) 53746470a38SPatrick Venture { 53846470a38SPatrick Venture body->sensor_units_1 &= ~(3 << 1); 53946470a38SPatrick Venture body->sensor_units_1 |= (op & 0x3) << 1; 54046470a38SPatrick Venture }; 54146470a38SPatrick Venture inline void set_rate_unit(uint8_t unit, SensorDataFullRecordBody* body) 54246470a38SPatrick Venture { 54346470a38SPatrick Venture body->sensor_units_1 &= ~(7 << 3); 54446470a38SPatrick Venture body->sensor_units_1 |= (unit & 0x7) << 3; 54546470a38SPatrick Venture }; 54646470a38SPatrick Venture inline void set_analog_data_format(uint8_t format, 54746470a38SPatrick Venture SensorDataFullRecordBody* body) 54846470a38SPatrick Venture { 54946470a38SPatrick Venture body->sensor_units_1 &= ~(3 << 6); 55046470a38SPatrick Venture body->sensor_units_1 |= (format & 0x3) << 6; 55146470a38SPatrick Venture }; 55246470a38SPatrick Venture 55346470a38SPatrick Venture inline void set_m(uint16_t m, SensorDataFullRecordBody* body) 55446470a38SPatrick Venture { 55546470a38SPatrick Venture body->m_lsb = m & 0xff; 55646470a38SPatrick Venture body->m_msb_and_tolerance &= ~(3 << 6); 55746470a38SPatrick Venture body->m_msb_and_tolerance |= ((m & (3 << 8)) >> 2); 55846470a38SPatrick Venture }; 55946470a38SPatrick Venture inline void set_tolerance(uint8_t tol, SensorDataFullRecordBody* body) 56046470a38SPatrick Venture { 56146470a38SPatrick Venture body->m_msb_and_tolerance &= ~0x3f; 56246470a38SPatrick Venture body->m_msb_and_tolerance |= tol & 0x3f; 56346470a38SPatrick Venture }; 56446470a38SPatrick Venture 56546470a38SPatrick Venture inline void set_b(uint16_t b, SensorDataFullRecordBody* body) 56646470a38SPatrick Venture { 56746470a38SPatrick Venture body->b_lsb = b & 0xff; 56846470a38SPatrick Venture body->b_msb_and_accuracy_lsb &= ~(3 << 6); 56946470a38SPatrick Venture body->b_msb_and_accuracy_lsb |= ((b & (3 << 8)) >> 2); 57046470a38SPatrick Venture }; 57146470a38SPatrick Venture inline void set_accuracy(uint16_t acc, SensorDataFullRecordBody* body) 57246470a38SPatrick Venture { 57346470a38SPatrick Venture // bottom 6 bits 57446470a38SPatrick Venture body->b_msb_and_accuracy_lsb &= ~0x3f; 57546470a38SPatrick Venture body->b_msb_and_accuracy_lsb |= acc & 0x3f; 57646470a38SPatrick Venture // top 4 bits 57746470a38SPatrick Venture body->accuracy_and_sensor_direction &= 0x0f; 57846470a38SPatrick Venture body->accuracy_and_sensor_direction |= ((acc >> 6) & 0xf) << 4; 57946470a38SPatrick Venture }; 58046470a38SPatrick Venture inline void set_accuracy_exp(uint8_t exp, SensorDataFullRecordBody* body) 58146470a38SPatrick Venture { 58246470a38SPatrick Venture body->accuracy_and_sensor_direction &= ~(3 << 2); 58346470a38SPatrick Venture body->accuracy_and_sensor_direction |= (exp & 3) << 2; 58446470a38SPatrick Venture }; 58546470a38SPatrick Venture inline void set_sensor_dir(uint8_t dir, SensorDataFullRecordBody* body) 58646470a38SPatrick Venture { 58746470a38SPatrick Venture body->accuracy_and_sensor_direction &= ~(3 << 0); 58846470a38SPatrick Venture body->accuracy_and_sensor_direction |= (dir & 3); 58946470a38SPatrick Venture }; 59046470a38SPatrick Venture 59146470a38SPatrick Venture inline void set_b_exp(uint8_t exp, SensorDataFullRecordBody* body) 59246470a38SPatrick Venture { 59346470a38SPatrick Venture body->r_b_exponents &= 0xf0; 59446470a38SPatrick Venture body->r_b_exponents |= exp & 0x0f; 59546470a38SPatrick Venture }; 59646470a38SPatrick Venture inline void set_r_exp(uint8_t exp, SensorDataFullRecordBody* body) 59746470a38SPatrick Venture { 59846470a38SPatrick Venture body->r_b_exponents &= 0x0f; 59946470a38SPatrick Venture body->r_b_exponents |= (exp & 0x0f) << 4; 60046470a38SPatrick Venture }; 60146470a38SPatrick Venture 60246470a38SPatrick Venture inline void set_id_strlen(uint8_t len, SensorDataFullRecordBody* body) 60346470a38SPatrick Venture { 60446470a38SPatrick Venture body->id_string_info &= ~(0x1f); 60546470a38SPatrick Venture body->id_string_info |= len & 0x1f; 60646470a38SPatrick Venture }; 607eae8859cSWilly Tu inline void set_id_strlen(uint8_t len, SensorDataEventRecordBody* body) 608eae8859cSWilly Tu { 609eae8859cSWilly Tu body->id_string_info &= ~(0x1f); 610eae8859cSWilly Tu body->id_string_info |= len & 0x1f; 611eae8859cSWilly Tu }; 61246470a38SPatrick Venture inline uint8_t get_id_strlen(SensorDataFullRecordBody* body) 61346470a38SPatrick Venture { 61446470a38SPatrick Venture return body->id_string_info & 0x1f; 61546470a38SPatrick Venture }; 61646470a38SPatrick Venture inline void set_id_type(uint8_t type, SensorDataFullRecordBody* body) 61746470a38SPatrick Venture { 61846470a38SPatrick Venture body->id_string_info &= ~(3 << 6); 61946470a38SPatrick Venture body->id_string_info |= (type & 0x3) << 6; 62046470a38SPatrick Venture }; 621eae8859cSWilly Tu inline void set_id_type(uint8_t type, SensorDataEventRecordBody* body) 622eae8859cSWilly Tu { 623eae8859cSWilly Tu body->id_string_info &= ~(3 << 6); 624eae8859cSWilly Tu body->id_string_info |= (type & 0x3) << 6; 625eae8859cSWilly Tu }; 62646470a38SPatrick Venture 62746470a38SPatrick Venture inline void set_device_id_strlen(uint8_t len, SensorDataFruRecordBody* body) 62846470a38SPatrick Venture { 62946470a38SPatrick Venture body->deviceIDLen &= ~(LENGTH_MASK); 63046470a38SPatrick Venture body->deviceIDLen |= len & LENGTH_MASK; 63146470a38SPatrick Venture }; 63246470a38SPatrick Venture 63346470a38SPatrick Venture inline uint8_t get_device_id_strlen(SensorDataFruRecordBody* body) 63446470a38SPatrick Venture { 63546470a38SPatrick Venture return body->deviceIDLen & LENGTH_MASK; 63646470a38SPatrick Venture }; 63746470a38SPatrick Venture 63846470a38SPatrick Venture inline void set_readable_mask(uint8_t mask, SensorDataFullRecordBody* body) 63946470a38SPatrick Venture { 64046470a38SPatrick Venture body->discrete_reading_setting_mask[1] = mask & 0x3F; 64146470a38SPatrick Venture } 64246470a38SPatrick Venture 64346470a38SPatrick Venture } // namespace body 64446470a38SPatrick Venture 64546470a38SPatrick Venture // More types contained in section 43.17 Sensor Unit Type Codes, 64646470a38SPatrick Venture // IPMI spec v2 rev 1.1 64746470a38SPatrick Venture enum SensorUnitTypeCodes 64846470a38SPatrick Venture { 64946470a38SPatrick Venture SENSOR_UNIT_UNSPECIFIED = 0, 65046470a38SPatrick Venture SENSOR_UNIT_DEGREES_C = 1, 65146470a38SPatrick Venture SENSOR_UNIT_VOLTS = 4, 65246470a38SPatrick Venture SENSOR_UNIT_AMPERES = 5, 65346470a38SPatrick Venture SENSOR_UNIT_WATTS = 6, 65446470a38SPatrick Venture SENSOR_UNIT_JOULES = 7, 655812e44c7SKirill Pakhomov SENSOR_UNIT_RPM = 18, 65646470a38SPatrick Venture SENSOR_UNIT_METERS = 34, 65746470a38SPatrick Venture SENSOR_UNIT_REVOLUTIONS = 41, 65846470a38SPatrick Venture }; 65946470a38SPatrick Venture 66046470a38SPatrick Venture struct SensorDataFullRecord 66146470a38SPatrick Venture { 66246470a38SPatrick Venture SensorDataRecordHeader header; 66346470a38SPatrick Venture SensorDataRecordKey key; 66446470a38SPatrick Venture SensorDataFullRecordBody body; 66546470a38SPatrick Venture } __attribute__((packed)); 66646470a38SPatrick Venture 6677b2e5504Sselvaganapathi /** @struct SensorDataComapactRecord 6687b2e5504Sselvaganapathi * 6697b2e5504Sselvaganapathi * Compact Sensor Record - SDR Type 2 6707b2e5504Sselvaganapathi */ 6717b2e5504Sselvaganapathi struct SensorDataCompactRecord 6727b2e5504Sselvaganapathi { 6737b2e5504Sselvaganapathi SensorDataRecordHeader header; 6747b2e5504Sselvaganapathi SensorDataRecordKey key; 6757b2e5504Sselvaganapathi SensorDataCompactRecordBody body; 6767b2e5504Sselvaganapathi } __attribute__((packed)); 6777b2e5504Sselvaganapathi 678da06d15cSHao Jiang /** @struct SensorDataEventRecord 679da06d15cSHao Jiang * 680da06d15cSHao Jiang * Event Only Sensor Record - SDR Type 3 681da06d15cSHao Jiang */ 682da06d15cSHao Jiang struct SensorDataEventRecord 683da06d15cSHao Jiang { 684da06d15cSHao Jiang SensorDataRecordHeader header; 685da06d15cSHao Jiang SensorDataRecordKey key; 686da06d15cSHao Jiang SensorDataEventRecordBody body; 687da06d15cSHao Jiang } __attribute__((packed)); 688da06d15cSHao Jiang 68946470a38SPatrick Venture /** @struct SensorDataFruRecord 69046470a38SPatrick Venture * 69146470a38SPatrick Venture * FRU Device Locator Record - SDR Type 11 69246470a38SPatrick Venture */ 69346470a38SPatrick Venture struct SensorDataFruRecord 69446470a38SPatrick Venture { 69546470a38SPatrick Venture SensorDataRecordHeader header; 69646470a38SPatrick Venture SensorDataFruRecordKey key; 69746470a38SPatrick Venture SensorDataFruRecordBody body; 69846470a38SPatrick Venture } __attribute__((packed)); 69946470a38SPatrick Venture 7009c11894eSJaghathiswari Rankappagounder Natarajan /** @struct SensorDataEntityRecord 7019c11894eSJaghathiswari Rankappagounder Natarajan * 7029c11894eSJaghathiswari Rankappagounder Natarajan * Entity Association Record - SDR Type 8 7039c11894eSJaghathiswari Rankappagounder Natarajan */ 7049c11894eSJaghathiswari Rankappagounder Natarajan struct SensorDataEntityRecord 7059c11894eSJaghathiswari Rankappagounder Natarajan { 7069c11894eSJaghathiswari Rankappagounder Natarajan SensorDataRecordHeader header; 7079c11894eSJaghathiswari Rankappagounder Natarajan SensorDataEntityRecordKey key; 7089c11894eSJaghathiswari Rankappagounder Natarajan SensorDataEntityRecordBody body; 7099c11894eSJaghathiswari Rankappagounder Natarajan } __attribute__((packed)); 7109c11894eSJaghathiswari Rankappagounder Natarajan 71146470a38SPatrick Venture } // namespace get_sdr 71246470a38SPatrick Venture 71346470a38SPatrick Venture namespace ipmi 71446470a38SPatrick Venture { 71546470a38SPatrick Venture 71646470a38SPatrick Venture namespace sensor 71746470a38SPatrick Venture { 71846470a38SPatrick Venture 71946470a38SPatrick Venture /** 72046470a38SPatrick Venture * @brief Map offset to the corresponding bit in the assertion byte. 72146470a38SPatrick Venture * 72246470a38SPatrick Venture * The discrete sensors support up to 14 states. 0-7 offsets are stored in one 72346470a38SPatrick Venture * byte and offsets 8-14 in the second byte. 72446470a38SPatrick Venture * 72546470a38SPatrick Venture * @param[in] offset - offset number. 72646470a38SPatrick Venture * @param[in/out] resp - get sensor reading response. 72746470a38SPatrick Venture */ 7284cc42556SSui Chen inline void setOffset(uint8_t offset, ipmi::sensor::GetSensorResponse* resp) 72946470a38SPatrick Venture { 73046470a38SPatrick Venture if (offset > 7) 73146470a38SPatrick Venture { 7324cc42556SSui Chen resp->discreteReadingSensorStates |= 1 << (offset - 8); 73346470a38SPatrick Venture } 73446470a38SPatrick Venture else 73546470a38SPatrick Venture { 7364cc42556SSui Chen resp->thresholdLevelsStates |= 1 << offset; 73746470a38SPatrick Venture } 73846470a38SPatrick Venture } 73946470a38SPatrick Venture 74046470a38SPatrick Venture /** 74146470a38SPatrick Venture * @brief Set the reading field in the response. 74246470a38SPatrick Venture * 74346470a38SPatrick Venture * @param[in] offset - offset number. 74446470a38SPatrick Venture * @param[in/out] resp - get sensor reading response. 74546470a38SPatrick Venture */ 7464cc42556SSui Chen inline void setReading(uint8_t value, ipmi::sensor::GetSensorResponse* resp) 74746470a38SPatrick Venture { 74846470a38SPatrick Venture resp->reading = value; 74946470a38SPatrick Venture } 75046470a38SPatrick Venture 75146470a38SPatrick Venture /** 75246470a38SPatrick Venture * @brief Map the value to the assertion bytes. The assertion states are stored 75346470a38SPatrick Venture * in 2 bytes. 75446470a38SPatrick Venture * 75546470a38SPatrick Venture * @param[in] value - value to mapped to the assertion byte. 75646470a38SPatrick Venture * @param[in/out] resp - get sensor reading response. 75746470a38SPatrick Venture */ 75846470a38SPatrick Venture inline void setAssertionBytes(uint16_t value, 7594cc42556SSui Chen ipmi::sensor::GetSensorResponse* resp) 76046470a38SPatrick Venture { 7614cc42556SSui Chen resp->thresholdLevelsStates = static_cast<uint8_t>(value & 0x00FF); 7624cc42556SSui Chen resp->discreteReadingSensorStates = static_cast<uint8_t>(value >> 8); 76346470a38SPatrick Venture } 76446470a38SPatrick Venture 76546470a38SPatrick Venture /** 76646470a38SPatrick Venture * @brief Set the scanning enabled bit in the response. 76746470a38SPatrick Venture * 76846470a38SPatrick Venture * @param[in/out] resp - get sensor reading response. 76946470a38SPatrick Venture */ 7704cc42556SSui Chen inline void enableScanning(ipmi::sensor::GetSensorResponse* resp) 77146470a38SPatrick Venture { 7724cc42556SSui Chen resp->readingOrStateUnavailable = false; 7734cc42556SSui Chen resp->scanningEnabled = true; 7744cc42556SSui Chen resp->allEventMessagesEnabled = false; 77546470a38SPatrick Venture } 77646470a38SPatrick Venture 77746470a38SPatrick Venture } // namespace sensor 77846470a38SPatrick Venture 77946470a38SPatrick Venture } // namespace ipmi 780