xref: /openbmc/phosphor-host-ipmid/sensorhandler.hpp (revision 3325024067487320abddbf0ffb5a528b1743122a)
146470a38SPatrick Venture #pragma once
246470a38SPatrick Venture 
3194375f2SWilliam A. Kennington III #include <ipmid/api.h>
446470a38SPatrick Venture #include <stdint.h>
546470a38SPatrick Venture 
6*33250240SVernon Mauery #include <ipmid/types.hpp>
7*33250240SVernon Mauery 
846470a38SPatrick Venture // IPMI commands for net functions.
946470a38SPatrick Venture enum ipmi_netfn_sen_cmds
1046470a38SPatrick Venture {
113342a8e0SJia, Chunhui     IPMI_CMD_PLATFORM_EVENT = 0x2,
1246470a38SPatrick Venture     IPMI_CMD_GET_DEVICE_SDR_INFO = 0x20,
1346470a38SPatrick Venture     IPMI_CMD_GET_DEVICE_SDR = 0x21,
1446470a38SPatrick Venture     IPMI_CMD_RESERVE_DEVICE_SDR_REPO = 0x22,
1546470a38SPatrick Venture     IPMI_CMD_GET_SENSOR_READING = 0x2D,
1646470a38SPatrick Venture     IPMI_CMD_GET_SENSOR_TYPE = 0x2F,
1746470a38SPatrick Venture     IPMI_CMD_SET_SENSOR = 0x30,
1846470a38SPatrick Venture     IPMI_CMD_GET_SENSOR_THRESHOLDS = 0x27,
1946470a38SPatrick Venture };
2046470a38SPatrick Venture 
2146470a38SPatrick Venture /**
2246470a38SPatrick Venture  * @enum device_type
2346470a38SPatrick Venture  * IPMI FRU device types
2446470a38SPatrick Venture  */
2546470a38SPatrick Venture enum device_type
2646470a38SPatrick Venture {
2746470a38SPatrick Venture     IPMI_PHYSICAL_FRU = 0x00,
2846470a38SPatrick Venture     IPMI_LOGICAL_FRU = 0x80,
2946470a38SPatrick Venture };
3046470a38SPatrick Venture 
3146470a38SPatrick Venture // Discrete sensor types.
3246470a38SPatrick Venture enum ipmi_sensor_types
3346470a38SPatrick Venture {
3446470a38SPatrick Venture     IPMI_SENSOR_TEMP = 0x01,
3546470a38SPatrick Venture     IPMI_SENSOR_VOLTAGE = 0x02,
3646470a38SPatrick Venture     IPMI_SENSOR_CURRENT = 0x03,
3746470a38SPatrick Venture     IPMI_SENSOR_FAN = 0x04,
3846470a38SPatrick Venture     IPMI_SENSOR_TPM = 0xCC,
3946470a38SPatrick Venture };
4046470a38SPatrick Venture 
4146470a38SPatrick Venture #define MAX_DBUS_PATH 128
4246470a38SPatrick Venture struct dbus_interface_t
4346470a38SPatrick Venture {
4446470a38SPatrick Venture     uint8_t sensornumber;
4546470a38SPatrick Venture     uint8_t sensortype;
4646470a38SPatrick Venture 
4746470a38SPatrick Venture     char bus[MAX_DBUS_PATH];
4846470a38SPatrick Venture     char path[MAX_DBUS_PATH];
4946470a38SPatrick Venture     char interface[MAX_DBUS_PATH];
5046470a38SPatrick Venture };
5146470a38SPatrick Venture 
523342a8e0SJia, Chunhui struct PlatformEventRequest
533342a8e0SJia, Chunhui {
543342a8e0SJia, Chunhui     uint8_t eventMessageRevision;
553342a8e0SJia, Chunhui     uint8_t sensorType;
563342a8e0SJia, Chunhui     uint8_t sensorNumber;
573342a8e0SJia, Chunhui     uint8_t eventDirectionType;
583342a8e0SJia, Chunhui     uint8_t data[3];
593342a8e0SJia, Chunhui };
603342a8e0SJia, Chunhui 
613342a8e0SJia, Chunhui static constexpr char const* ipmiSELPath = "/xyz/openbmc_project/Logging/IPMI";
623342a8e0SJia, Chunhui static constexpr char const* ipmiSELAddInterface =
633342a8e0SJia, Chunhui     "xyz.openbmc_project.Logging.IPMI";
643342a8e0SJia, Chunhui static const std::string ipmiSELAddMessage = "SEL Entry";
653342a8e0SJia, Chunhui 
663342a8e0SJia, Chunhui static constexpr int selSystemEventSizeWith3Bytes = 8;
673342a8e0SJia, Chunhui static constexpr int selSystemEventSizeWith2Bytes = 7;
683342a8e0SJia, Chunhui static constexpr int selSystemEventSizeWith1Bytes = 6;
693342a8e0SJia, Chunhui static constexpr int selIPMBEventSize = 7;
703342a8e0SJia, Chunhui static constexpr uint8_t directionMask = 0x80;
713342a8e0SJia, Chunhui static constexpr uint8_t byte3EnableMask = 0x30;
723342a8e0SJia, Chunhui static constexpr uint8_t byte2EnableMask = 0xC0;
733342a8e0SJia, Chunhui 
7446470a38SPatrick Venture int set_sensor_dbus_state_s(uint8_t, const char*, const char*);
7546470a38SPatrick Venture int set_sensor_dbus_state_y(uint8_t, const char*, const uint8_t);
7646470a38SPatrick Venture int find_openbmc_path(uint8_t, dbus_interface_t*);
7746470a38SPatrick Venture 
7846470a38SPatrick Venture ipmi_ret_t ipmi_sen_get_sdr(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
7946470a38SPatrick Venture                             ipmi_request_t request, ipmi_response_t response,
8046470a38SPatrick Venture                             ipmi_data_len_t data_len, ipmi_context_t context);
8146470a38SPatrick Venture 
8246470a38SPatrick Venture ipmi_ret_t ipmi_sen_reserve_sdr(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
8346470a38SPatrick Venture                                 ipmi_request_t request,
8446470a38SPatrick Venture                                 ipmi_response_t response,
8546470a38SPatrick Venture                                 ipmi_data_len_t data_len,
8646470a38SPatrick Venture                                 ipmi_context_t context);
8746470a38SPatrick Venture 
8846470a38SPatrick Venture static const uint16_t FRU_RECORD_ID_START = 256;
899c11894eSJaghathiswari Rankappagounder Natarajan static const uint16_t ENTITY_RECORD_ID_START = 512;
9046470a38SPatrick Venture static const uint8_t SDR_VERSION = 0x51;
9146470a38SPatrick Venture static const uint16_t END_OF_RECORD = 0xFFFF;
9246470a38SPatrick Venture static const uint8_t LENGTH_MASK = 0x1F;
9346470a38SPatrick Venture 
9446470a38SPatrick Venture /**
9546470a38SPatrick Venture  * Get SDR Info
9646470a38SPatrick Venture  */
9746470a38SPatrick Venture 
9846470a38SPatrick Venture namespace get_sdr_info
9946470a38SPatrick Venture {
10046470a38SPatrick Venture namespace request
10146470a38SPatrick Venture {
10246470a38SPatrick Venture // Note: for some reason the ipmi_request_t appears to be the
10346470a38SPatrick Venture // raw value for this call.
10446470a38SPatrick Venture inline bool get_count(void* req)
10546470a38SPatrick Venture {
10646470a38SPatrick Venture     return (bool)((uint64_t)(req)&1);
10746470a38SPatrick Venture }
10846470a38SPatrick Venture } // namespace request
10946470a38SPatrick Venture 
11046470a38SPatrick Venture namespace response
11146470a38SPatrick Venture {
11246470a38SPatrick Venture #define SDR_INFO_RESP_SIZE 2
11346470a38SPatrick Venture inline void set_lun_present(int lun, uint8_t* resp)
11446470a38SPatrick Venture {
11546470a38SPatrick Venture     *resp |= 1 << lun;
11646470a38SPatrick Venture }
11746470a38SPatrick Venture inline void set_lun_not_present(int lun, uint8_t* resp)
11846470a38SPatrick Venture {
11946470a38SPatrick Venture     *resp &= ~(1 << lun);
12046470a38SPatrick Venture }
12146470a38SPatrick Venture inline void set_dynamic_population(uint8_t* resp)
12246470a38SPatrick Venture {
12346470a38SPatrick Venture     *resp |= 1 << 7;
12446470a38SPatrick Venture }
12546470a38SPatrick Venture inline void set_static_population(uint8_t* resp)
12646470a38SPatrick Venture {
12746470a38SPatrick Venture     *resp &= ~(1 << 7);
12846470a38SPatrick Venture }
12946470a38SPatrick Venture } // namespace response
13046470a38SPatrick Venture 
13146470a38SPatrick Venture struct GetSdrInfoResp
13246470a38SPatrick Venture {
13346470a38SPatrick Venture     uint8_t count;
13446470a38SPatrick Venture     uint8_t luns_and_dynamic_population;
13546470a38SPatrick Venture };
13646470a38SPatrick Venture 
13746470a38SPatrick Venture } // namespace get_sdr_info
13846470a38SPatrick Venture 
13946470a38SPatrick Venture /**
14046470a38SPatrick Venture  * Get SDR
14146470a38SPatrick Venture  */
14246470a38SPatrick Venture namespace get_sdr
14346470a38SPatrick Venture {
14446470a38SPatrick Venture 
14546470a38SPatrick Venture struct GetSdrReq
14646470a38SPatrick Venture {
14746470a38SPatrick Venture     uint8_t reservation_id_lsb;
14846470a38SPatrick Venture     uint8_t reservation_id_msb;
14946470a38SPatrick Venture     uint8_t record_id_lsb;
15046470a38SPatrick Venture     uint8_t record_id_msb;
15146470a38SPatrick Venture     uint8_t offset;
15246470a38SPatrick Venture     uint8_t bytes_to_read;
15346470a38SPatrick Venture } __attribute__((packed));
15446470a38SPatrick Venture 
15546470a38SPatrick Venture namespace request
15646470a38SPatrick Venture {
15746470a38SPatrick Venture 
15846470a38SPatrick Venture inline uint8_t get_reservation_id(GetSdrReq* req)
15946470a38SPatrick Venture {
16046470a38SPatrick Venture     return (req->reservation_id_lsb + (req->reservation_id_msb << 8));
16146470a38SPatrick Venture };
16246470a38SPatrick Venture 
16346470a38SPatrick Venture inline uint16_t get_record_id(GetSdrReq* req)
16446470a38SPatrick Venture {
16546470a38SPatrick Venture     return (req->record_id_lsb + (req->record_id_msb << 8));
16646470a38SPatrick Venture };
16746470a38SPatrick Venture 
16846470a38SPatrick Venture } // namespace request
16946470a38SPatrick Venture 
17046470a38SPatrick Venture // Response
17146470a38SPatrick Venture struct GetSdrResp
17246470a38SPatrick Venture {
17346470a38SPatrick Venture     uint8_t next_record_id_lsb;
17446470a38SPatrick Venture     uint8_t next_record_id_msb;
17546470a38SPatrick Venture     uint8_t record_data[64];
17646470a38SPatrick Venture } __attribute__((packed));
17746470a38SPatrick Venture 
17846470a38SPatrick Venture namespace response
17946470a38SPatrick Venture {
18046470a38SPatrick Venture 
18146470a38SPatrick Venture inline void set_next_record_id(uint16_t next, GetSdrResp* resp)
18246470a38SPatrick Venture {
18346470a38SPatrick Venture     resp->next_record_id_lsb = next & 0xff;
18446470a38SPatrick Venture     resp->next_record_id_msb = (next >> 8) & 0xff;
18546470a38SPatrick Venture };
18646470a38SPatrick Venture 
18746470a38SPatrick Venture } // namespace response
18846470a38SPatrick Venture 
18946470a38SPatrick Venture // Record header
19046470a38SPatrick Venture struct SensorDataRecordHeader
19146470a38SPatrick Venture {
19246470a38SPatrick Venture     uint8_t record_id_lsb;
19346470a38SPatrick Venture     uint8_t record_id_msb;
19446470a38SPatrick Venture     uint8_t sdr_version;
19546470a38SPatrick Venture     uint8_t record_type;
19646470a38SPatrick Venture     uint8_t record_length; // Length not counting the header
19746470a38SPatrick Venture } __attribute__((packed));
19846470a38SPatrick Venture 
19946470a38SPatrick Venture namespace header
20046470a38SPatrick Venture {
20146470a38SPatrick Venture 
20246470a38SPatrick Venture inline void set_record_id(int id, SensorDataRecordHeader* hdr)
20346470a38SPatrick Venture {
20446470a38SPatrick Venture     hdr->record_id_lsb = (id & 0xFF);
20546470a38SPatrick Venture     hdr->record_id_msb = (id >> 8) & 0xFF;
20646470a38SPatrick Venture };
20746470a38SPatrick Venture 
20846470a38SPatrick Venture } // namespace header
20946470a38SPatrick Venture 
21046470a38SPatrick Venture enum SensorDataRecordType
21146470a38SPatrick Venture {
21246470a38SPatrick Venture     SENSOR_DATA_FULL_RECORD = 0x1,
21346470a38SPatrick Venture     SENSOR_DATA_FRU_RECORD = 0x11,
2149c11894eSJaghathiswari Rankappagounder Natarajan     SENSOR_DATA_ENTITY_RECORD = 0x8,
21546470a38SPatrick Venture };
21646470a38SPatrick Venture 
21746470a38SPatrick Venture // Record key
21846470a38SPatrick Venture struct SensorDataRecordKey
21946470a38SPatrick Venture {
22046470a38SPatrick Venture     uint8_t owner_id;
22146470a38SPatrick Venture     uint8_t owner_lun;
22246470a38SPatrick Venture     uint8_t sensor_number;
22346470a38SPatrick Venture } __attribute__((packed));
22446470a38SPatrick Venture 
22546470a38SPatrick Venture /** @struct SensorDataFruRecordKey
22646470a38SPatrick Venture  *
22746470a38SPatrick Venture  *  FRU Device Locator Record(key) - SDR Type 11
22846470a38SPatrick Venture  */
22946470a38SPatrick Venture struct SensorDataFruRecordKey
23046470a38SPatrick Venture {
23146470a38SPatrick Venture     uint8_t deviceAddress;
23246470a38SPatrick Venture     uint8_t fruID;
23346470a38SPatrick Venture     uint8_t accessLun;
23446470a38SPatrick Venture     uint8_t channelNumber;
23546470a38SPatrick Venture } __attribute__((packed));
23646470a38SPatrick Venture 
2379c11894eSJaghathiswari Rankappagounder Natarajan /** @struct SensorDataEntityRecordKey
2389c11894eSJaghathiswari Rankappagounder Natarajan  *
2399c11894eSJaghathiswari Rankappagounder Natarajan  *  Entity Association Record(key) - SDR Type 8
2409c11894eSJaghathiswari Rankappagounder Natarajan  */
2419c11894eSJaghathiswari Rankappagounder Natarajan struct SensorDataEntityRecordKey
2429c11894eSJaghathiswari Rankappagounder Natarajan {
2439c11894eSJaghathiswari Rankappagounder Natarajan     uint8_t containerEntityId;
2449c11894eSJaghathiswari Rankappagounder Natarajan     uint8_t containerEntityInstance;
2459c11894eSJaghathiswari Rankappagounder Natarajan     uint8_t flags;
2469c11894eSJaghathiswari Rankappagounder Natarajan     uint8_t entityId1;
2479c11894eSJaghathiswari Rankappagounder Natarajan     uint8_t entityInstance1;
2489c11894eSJaghathiswari Rankappagounder Natarajan } __attribute__((packed));
2499c11894eSJaghathiswari Rankappagounder Natarajan 
25046470a38SPatrick Venture namespace key
25146470a38SPatrick Venture {
25246470a38SPatrick Venture 
2539c11894eSJaghathiswari Rankappagounder Natarajan static constexpr uint8_t listOrRangeBit = 7;
2549c11894eSJaghathiswari Rankappagounder Natarajan static constexpr uint8_t linkedBit = 6;
2559c11894eSJaghathiswari Rankappagounder Natarajan 
25646470a38SPatrick Venture inline void set_owner_id_ipmb(SensorDataRecordKey* key)
25746470a38SPatrick Venture {
25846470a38SPatrick Venture     key->owner_id &= ~0x01;
25946470a38SPatrick Venture };
26046470a38SPatrick Venture 
26146470a38SPatrick Venture inline void set_owner_id_system_sw(SensorDataRecordKey* key)
26246470a38SPatrick Venture {
26346470a38SPatrick Venture     key->owner_id |= 0x01;
26446470a38SPatrick Venture };
26546470a38SPatrick Venture 
26646470a38SPatrick Venture inline void set_owner_id_bmc(SensorDataRecordKey* key)
26746470a38SPatrick Venture {
26846470a38SPatrick Venture     key->owner_id |= 0x20;
26946470a38SPatrick Venture };
27046470a38SPatrick Venture 
27146470a38SPatrick Venture inline void set_owner_id_address(uint8_t addr, SensorDataRecordKey* key)
27246470a38SPatrick Venture {
27346470a38SPatrick Venture     key->owner_id &= 0x01;
27446470a38SPatrick Venture     key->owner_id |= addr << 1;
27546470a38SPatrick Venture };
27646470a38SPatrick Venture 
27746470a38SPatrick Venture inline void set_owner_lun(uint8_t lun, SensorDataRecordKey* key)
27846470a38SPatrick Venture {
27946470a38SPatrick Venture     key->owner_lun &= ~0x03;
28046470a38SPatrick Venture     key->owner_lun |= (lun & 0x03);
28146470a38SPatrick Venture };
28246470a38SPatrick Venture 
28346470a38SPatrick Venture inline void set_owner_lun_channel(uint8_t channel, SensorDataRecordKey* key)
28446470a38SPatrick Venture {
28546470a38SPatrick Venture     key->owner_lun &= 0x0f;
28646470a38SPatrick Venture     key->owner_lun |= ((channel & 0xf) << 4);
28746470a38SPatrick Venture };
28846470a38SPatrick Venture 
2899c11894eSJaghathiswari Rankappagounder Natarajan inline void set_flags(bool isList, bool isLinked,
2909c11894eSJaghathiswari Rankappagounder Natarajan                       SensorDataEntityRecordKey* key)
2919c11894eSJaghathiswari Rankappagounder Natarajan {
2929c11894eSJaghathiswari Rankappagounder Natarajan     key->flags = 0x00;
2939c11894eSJaghathiswari Rankappagounder Natarajan     if (!isList)
2949c11894eSJaghathiswari Rankappagounder Natarajan         key->flags |= 1 << listOrRangeBit;
2959c11894eSJaghathiswari Rankappagounder Natarajan 
2969c11894eSJaghathiswari Rankappagounder Natarajan     if (isLinked)
2979c11894eSJaghathiswari Rankappagounder Natarajan         key->flags |= 1 << linkedBit;
2989c11894eSJaghathiswari Rankappagounder Natarajan };
2999c11894eSJaghathiswari Rankappagounder Natarajan 
30046470a38SPatrick Venture } // namespace key
30146470a38SPatrick Venture 
30246470a38SPatrick Venture /** @struct GetSensorThresholdsResponse
30346470a38SPatrick Venture  *
30446470a38SPatrick Venture  *  Response structure for Get Sensor Thresholds command
30546470a38SPatrick Venture  */
30646470a38SPatrick Venture struct GetSensorThresholdsResponse
30746470a38SPatrick Venture {
30846470a38SPatrick Venture     uint8_t validMask;           //!< valid mask
30946470a38SPatrick Venture     uint8_t lowerNonCritical;    //!< lower non-critical threshold
31046470a38SPatrick Venture     uint8_t lowerCritical;       //!< lower critical threshold
31146470a38SPatrick Venture     uint8_t lowerNonRecoverable; //!< lower non-recoverable threshold
31246470a38SPatrick Venture     uint8_t upperNonCritical;    //!< upper non-critical threshold
31346470a38SPatrick Venture     uint8_t upperCritical;       //!< upper critical threshold
31446470a38SPatrick Venture     uint8_t upperNonRecoverable; //!< upper non-recoverable threshold
31546470a38SPatrick Venture } __attribute__((packed));
31646470a38SPatrick Venture 
31746470a38SPatrick Venture // Body - full record
31846470a38SPatrick Venture #define FULL_RECORD_ID_STR_MAX_LENGTH 16
31946470a38SPatrick Venture 
32046470a38SPatrick Venture static const int FRU_RECORD_DEVICE_ID_MAX_LENGTH = 16;
32146470a38SPatrick Venture 
32246470a38SPatrick Venture struct SensorDataFullRecordBody
32346470a38SPatrick Venture {
32446470a38SPatrick Venture     uint8_t entity_id;
32546470a38SPatrick Venture     uint8_t entity_instance;
32646470a38SPatrick Venture     uint8_t sensor_initialization;
32746470a38SPatrick Venture     uint8_t sensor_capabilities; // no macro support
32846470a38SPatrick Venture     uint8_t sensor_type;
32946470a38SPatrick Venture     uint8_t event_reading_type;
33046470a38SPatrick Venture     uint8_t supported_assertions[2];          // no macro support
33146470a38SPatrick Venture     uint8_t supported_deassertions[2];        // no macro support
33246470a38SPatrick Venture     uint8_t discrete_reading_setting_mask[2]; // no macro support
33346470a38SPatrick Venture     uint8_t sensor_units_1;
33446470a38SPatrick Venture     uint8_t sensor_units_2_base;
33546470a38SPatrick Venture     uint8_t sensor_units_3_modifier;
33646470a38SPatrick Venture     uint8_t linearization;
33746470a38SPatrick Venture     uint8_t m_lsb;
33846470a38SPatrick Venture     uint8_t m_msb_and_tolerance;
33946470a38SPatrick Venture     uint8_t b_lsb;
34046470a38SPatrick Venture     uint8_t b_msb_and_accuracy_lsb;
34146470a38SPatrick Venture     uint8_t accuracy_and_sensor_direction;
34246470a38SPatrick Venture     uint8_t r_b_exponents;
34346470a38SPatrick Venture     uint8_t analog_characteristic_flags; // no macro support
34446470a38SPatrick Venture     uint8_t nominal_reading;
34546470a38SPatrick Venture     uint8_t normal_max;
34646470a38SPatrick Venture     uint8_t normal_min;
34746470a38SPatrick Venture     uint8_t sensor_max;
34846470a38SPatrick Venture     uint8_t sensor_min;
34946470a38SPatrick Venture     uint8_t upper_nonrecoverable_threshold;
35046470a38SPatrick Venture     uint8_t upper_critical_threshold;
35146470a38SPatrick Venture     uint8_t upper_noncritical_threshold;
35246470a38SPatrick Venture     uint8_t lower_nonrecoverable_threshold;
35346470a38SPatrick Venture     uint8_t lower_critical_threshold;
35446470a38SPatrick Venture     uint8_t lower_noncritical_threshold;
35546470a38SPatrick Venture     uint8_t positive_threshold_hysteresis;
35646470a38SPatrick Venture     uint8_t negative_threshold_hysteresis;
35746470a38SPatrick Venture     uint16_t reserved;
35846470a38SPatrick Venture     uint8_t oem_reserved;
35946470a38SPatrick Venture     uint8_t id_string_info;
36046470a38SPatrick Venture     char id_string[FULL_RECORD_ID_STR_MAX_LENGTH];
36146470a38SPatrick Venture } __attribute__((packed));
36246470a38SPatrick Venture 
36346470a38SPatrick Venture /** @struct SensorDataFruRecordBody
36446470a38SPatrick Venture  *
36546470a38SPatrick Venture  *  FRU Device Locator Record(body) - SDR Type 11
36646470a38SPatrick Venture  */
36746470a38SPatrick Venture struct SensorDataFruRecordBody
36846470a38SPatrick Venture {
36946470a38SPatrick Venture     uint8_t reserved;
37046470a38SPatrick Venture     uint8_t deviceType;
37146470a38SPatrick Venture     uint8_t deviceTypeModifier;
37246470a38SPatrick Venture     uint8_t entityID;
37346470a38SPatrick Venture     uint8_t entityInstance;
37446470a38SPatrick Venture     uint8_t oem;
37546470a38SPatrick Venture     uint8_t deviceIDLen;
37646470a38SPatrick Venture     char deviceID[FRU_RECORD_DEVICE_ID_MAX_LENGTH];
37746470a38SPatrick Venture } __attribute__((packed));
37846470a38SPatrick Venture 
3799c11894eSJaghathiswari Rankappagounder Natarajan /** @struct SensorDataEntityRecordBody
3809c11894eSJaghathiswari Rankappagounder Natarajan  *
3819c11894eSJaghathiswari Rankappagounder Natarajan  *  Entity Association Record(body) - SDR Type 8
3829c11894eSJaghathiswari Rankappagounder Natarajan  */
3839c11894eSJaghathiswari Rankappagounder Natarajan struct SensorDataEntityRecordBody
3849c11894eSJaghathiswari Rankappagounder Natarajan {
3859c11894eSJaghathiswari Rankappagounder Natarajan     uint8_t entityId2;
3869c11894eSJaghathiswari Rankappagounder Natarajan     uint8_t entityInstance2;
3879c11894eSJaghathiswari Rankappagounder Natarajan     uint8_t entityId3;
3889c11894eSJaghathiswari Rankappagounder Natarajan     uint8_t entityInstance3;
3899c11894eSJaghathiswari Rankappagounder Natarajan     uint8_t entityId4;
3909c11894eSJaghathiswari Rankappagounder Natarajan     uint8_t entityInstance4;
3919c11894eSJaghathiswari Rankappagounder Natarajan } __attribute__((packed));
3929c11894eSJaghathiswari Rankappagounder Natarajan 
39346470a38SPatrick Venture namespace body
39446470a38SPatrick Venture {
39546470a38SPatrick Venture 
39646470a38SPatrick Venture inline void set_entity_instance_number(uint8_t n,
39746470a38SPatrick Venture                                        SensorDataFullRecordBody* body)
39846470a38SPatrick Venture {
39946470a38SPatrick Venture     body->entity_instance &= 1 << 7;
40046470a38SPatrick Venture     body->entity_instance |= (n & ~(1 << 7));
40146470a38SPatrick Venture };
40246470a38SPatrick Venture inline void set_entity_physical_entity(SensorDataFullRecordBody* body)
40346470a38SPatrick Venture {
40446470a38SPatrick Venture     body->entity_instance &= ~(1 << 7);
40546470a38SPatrick Venture };
40646470a38SPatrick Venture inline void set_entity_logical_container(SensorDataFullRecordBody* body)
40746470a38SPatrick Venture {
40846470a38SPatrick Venture     body->entity_instance |= 1 << 7;
40946470a38SPatrick Venture };
41046470a38SPatrick Venture 
41146470a38SPatrick Venture inline void sensor_scanning_state(bool enabled, SensorDataFullRecordBody* body)
41246470a38SPatrick Venture {
41346470a38SPatrick Venture     if (enabled)
41446470a38SPatrick Venture     {
41546470a38SPatrick Venture         body->sensor_initialization |= 1 << 0;
41646470a38SPatrick Venture     }
41746470a38SPatrick Venture     else
41846470a38SPatrick Venture     {
41946470a38SPatrick Venture         body->sensor_initialization &= ~(1 << 0);
42046470a38SPatrick Venture     };
42146470a38SPatrick Venture };
42246470a38SPatrick Venture inline void event_generation_state(bool enabled, SensorDataFullRecordBody* body)
42346470a38SPatrick Venture {
42446470a38SPatrick Venture     if (enabled)
42546470a38SPatrick Venture     {
42646470a38SPatrick Venture         body->sensor_initialization |= 1 << 1;
42746470a38SPatrick Venture     }
42846470a38SPatrick Venture     else
42946470a38SPatrick Venture     {
43046470a38SPatrick Venture         body->sensor_initialization &= ~(1 << 1);
43146470a38SPatrick Venture     }
43246470a38SPatrick Venture };
43346470a38SPatrick Venture inline void init_types_state(bool enabled, SensorDataFullRecordBody* body)
43446470a38SPatrick Venture {
43546470a38SPatrick Venture     if (enabled)
43646470a38SPatrick Venture     {
43746470a38SPatrick Venture         body->sensor_initialization |= 1 << 2;
43846470a38SPatrick Venture     }
43946470a38SPatrick Venture     else
44046470a38SPatrick Venture     {
44146470a38SPatrick Venture         body->sensor_initialization &= ~(1 << 2);
44246470a38SPatrick Venture     }
44346470a38SPatrick Venture };
44446470a38SPatrick Venture inline void init_hyst_state(bool enabled, SensorDataFullRecordBody* body)
44546470a38SPatrick Venture {
44646470a38SPatrick Venture     if (enabled)
44746470a38SPatrick Venture     {
44846470a38SPatrick Venture         body->sensor_initialization |= 1 << 3;
44946470a38SPatrick Venture     }
45046470a38SPatrick Venture     else
45146470a38SPatrick Venture     {
45246470a38SPatrick Venture         body->sensor_initialization &= ~(1 << 3);
45346470a38SPatrick Venture     }
45446470a38SPatrick Venture };
45546470a38SPatrick Venture inline void init_thresh_state(bool enabled, SensorDataFullRecordBody* body)
45646470a38SPatrick Venture {
45746470a38SPatrick Venture     if (enabled)
45846470a38SPatrick Venture     {
45946470a38SPatrick Venture         body->sensor_initialization |= 1 << 4;
46046470a38SPatrick Venture     }
46146470a38SPatrick Venture     else
46246470a38SPatrick Venture     {
46346470a38SPatrick Venture         body->sensor_initialization &= ~(1 << 4);
46446470a38SPatrick Venture     }
46546470a38SPatrick Venture };
46646470a38SPatrick Venture inline void init_events_state(bool enabled, SensorDataFullRecordBody* body)
46746470a38SPatrick Venture {
46846470a38SPatrick Venture     if (enabled)
46946470a38SPatrick Venture     {
47046470a38SPatrick Venture         body->sensor_initialization |= 1 << 5;
47146470a38SPatrick Venture     }
47246470a38SPatrick Venture     else
47346470a38SPatrick Venture     {
47446470a38SPatrick Venture         body->sensor_initialization &= ~(1 << 5);
47546470a38SPatrick Venture     }
47646470a38SPatrick Venture };
47746470a38SPatrick Venture inline void init_scanning_state(bool enabled, SensorDataFullRecordBody* body)
47846470a38SPatrick Venture {
47946470a38SPatrick Venture     if (enabled)
48046470a38SPatrick Venture     {
48146470a38SPatrick Venture         body->sensor_initialization |= 1 << 6;
48246470a38SPatrick Venture     }
48346470a38SPatrick Venture     else
48446470a38SPatrick Venture     {
48546470a38SPatrick Venture         body->sensor_initialization &= ~(1 << 6);
48646470a38SPatrick Venture     }
48746470a38SPatrick Venture };
48846470a38SPatrick Venture inline void init_settable_state(bool enabled, SensorDataFullRecordBody* body)
48946470a38SPatrick Venture {
49046470a38SPatrick Venture     if (enabled)
49146470a38SPatrick Venture     {
49246470a38SPatrick Venture         body->sensor_initialization |= 1 << 7;
49346470a38SPatrick Venture     }
49446470a38SPatrick Venture     else
49546470a38SPatrick Venture     {
49646470a38SPatrick Venture         body->sensor_initialization &= ~(1 << 7);
49746470a38SPatrick Venture     }
49846470a38SPatrick Venture };
49946470a38SPatrick Venture 
50046470a38SPatrick Venture inline void set_percentage(SensorDataFullRecordBody* body)
50146470a38SPatrick Venture {
50246470a38SPatrick Venture     body->sensor_units_1 |= 1 << 0;
50346470a38SPatrick Venture };
50446470a38SPatrick Venture inline void unset_percentage(SensorDataFullRecordBody* body)
50546470a38SPatrick Venture {
50646470a38SPatrick Venture     body->sensor_units_1 &= ~(1 << 0);
50746470a38SPatrick Venture };
50846470a38SPatrick Venture inline void set_modifier_operation(uint8_t op, SensorDataFullRecordBody* body)
50946470a38SPatrick Venture {
51046470a38SPatrick Venture     body->sensor_units_1 &= ~(3 << 1);
51146470a38SPatrick Venture     body->sensor_units_1 |= (op & 0x3) << 1;
51246470a38SPatrick Venture };
51346470a38SPatrick Venture inline void set_rate_unit(uint8_t unit, SensorDataFullRecordBody* body)
51446470a38SPatrick Venture {
51546470a38SPatrick Venture     body->sensor_units_1 &= ~(7 << 3);
51646470a38SPatrick Venture     body->sensor_units_1 |= (unit & 0x7) << 3;
51746470a38SPatrick Venture };
51846470a38SPatrick Venture inline void set_analog_data_format(uint8_t format,
51946470a38SPatrick Venture                                    SensorDataFullRecordBody* body)
52046470a38SPatrick Venture {
52146470a38SPatrick Venture     body->sensor_units_1 &= ~(3 << 6);
52246470a38SPatrick Venture     body->sensor_units_1 |= (format & 0x3) << 6;
52346470a38SPatrick Venture };
52446470a38SPatrick Venture 
52546470a38SPatrick Venture inline void set_m(uint16_t m, SensorDataFullRecordBody* body)
52646470a38SPatrick Venture {
52746470a38SPatrick Venture     body->m_lsb = m & 0xff;
52846470a38SPatrick Venture     body->m_msb_and_tolerance &= ~(3 << 6);
52946470a38SPatrick Venture     body->m_msb_and_tolerance |= ((m & (3 << 8)) >> 2);
53046470a38SPatrick Venture };
53146470a38SPatrick Venture inline void set_tolerance(uint8_t tol, SensorDataFullRecordBody* body)
53246470a38SPatrick Venture {
53346470a38SPatrick Venture     body->m_msb_and_tolerance &= ~0x3f;
53446470a38SPatrick Venture     body->m_msb_and_tolerance |= tol & 0x3f;
53546470a38SPatrick Venture };
53646470a38SPatrick Venture 
53746470a38SPatrick Venture inline void set_b(uint16_t b, SensorDataFullRecordBody* body)
53846470a38SPatrick Venture {
53946470a38SPatrick Venture     body->b_lsb = b & 0xff;
54046470a38SPatrick Venture     body->b_msb_and_accuracy_lsb &= ~(3 << 6);
54146470a38SPatrick Venture     body->b_msb_and_accuracy_lsb |= ((b & (3 << 8)) >> 2);
54246470a38SPatrick Venture };
54346470a38SPatrick Venture inline void set_accuracy(uint16_t acc, SensorDataFullRecordBody* body)
54446470a38SPatrick Venture {
54546470a38SPatrick Venture     // bottom 6 bits
54646470a38SPatrick Venture     body->b_msb_and_accuracy_lsb &= ~0x3f;
54746470a38SPatrick Venture     body->b_msb_and_accuracy_lsb |= acc & 0x3f;
54846470a38SPatrick Venture     // top 4 bits
54946470a38SPatrick Venture     body->accuracy_and_sensor_direction &= 0x0f;
55046470a38SPatrick Venture     body->accuracy_and_sensor_direction |= ((acc >> 6) & 0xf) << 4;
55146470a38SPatrick Venture };
55246470a38SPatrick Venture inline void set_accuracy_exp(uint8_t exp, SensorDataFullRecordBody* body)
55346470a38SPatrick Venture {
55446470a38SPatrick Venture     body->accuracy_and_sensor_direction &= ~(3 << 2);
55546470a38SPatrick Venture     body->accuracy_and_sensor_direction |= (exp & 3) << 2;
55646470a38SPatrick Venture };
55746470a38SPatrick Venture inline void set_sensor_dir(uint8_t dir, SensorDataFullRecordBody* body)
55846470a38SPatrick Venture {
55946470a38SPatrick Venture     body->accuracy_and_sensor_direction &= ~(3 << 0);
56046470a38SPatrick Venture     body->accuracy_and_sensor_direction |= (dir & 3);
56146470a38SPatrick Venture };
56246470a38SPatrick Venture 
56346470a38SPatrick Venture inline void set_b_exp(uint8_t exp, SensorDataFullRecordBody* body)
56446470a38SPatrick Venture {
56546470a38SPatrick Venture     body->r_b_exponents &= 0xf0;
56646470a38SPatrick Venture     body->r_b_exponents |= exp & 0x0f;
56746470a38SPatrick Venture };
56846470a38SPatrick Venture inline void set_r_exp(uint8_t exp, SensorDataFullRecordBody* body)
56946470a38SPatrick Venture {
57046470a38SPatrick Venture     body->r_b_exponents &= 0x0f;
57146470a38SPatrick Venture     body->r_b_exponents |= (exp & 0x0f) << 4;
57246470a38SPatrick Venture };
57346470a38SPatrick Venture 
57446470a38SPatrick Venture inline void set_id_strlen(uint8_t len, SensorDataFullRecordBody* body)
57546470a38SPatrick Venture {
57646470a38SPatrick Venture     body->id_string_info &= ~(0x1f);
57746470a38SPatrick Venture     body->id_string_info |= len & 0x1f;
57846470a38SPatrick Venture };
57946470a38SPatrick Venture inline uint8_t get_id_strlen(SensorDataFullRecordBody* body)
58046470a38SPatrick Venture {
58146470a38SPatrick Venture     return body->id_string_info & 0x1f;
58246470a38SPatrick Venture };
58346470a38SPatrick Venture inline void set_id_type(uint8_t type, SensorDataFullRecordBody* body)
58446470a38SPatrick Venture {
58546470a38SPatrick Venture     body->id_string_info &= ~(3 << 6);
58646470a38SPatrick Venture     body->id_string_info |= (type & 0x3) << 6;
58746470a38SPatrick Venture };
58846470a38SPatrick Venture 
58946470a38SPatrick Venture inline void set_device_id_strlen(uint8_t len, SensorDataFruRecordBody* body)
59046470a38SPatrick Venture {
59146470a38SPatrick Venture     body->deviceIDLen &= ~(LENGTH_MASK);
59246470a38SPatrick Venture     body->deviceIDLen |= len & LENGTH_MASK;
59346470a38SPatrick Venture };
59446470a38SPatrick Venture 
59546470a38SPatrick Venture inline uint8_t get_device_id_strlen(SensorDataFruRecordBody* body)
59646470a38SPatrick Venture {
59746470a38SPatrick Venture     return body->deviceIDLen & LENGTH_MASK;
59846470a38SPatrick Venture };
59946470a38SPatrick Venture 
60046470a38SPatrick Venture inline void set_readable_mask(uint8_t mask, SensorDataFullRecordBody* body)
60146470a38SPatrick Venture {
60246470a38SPatrick Venture     body->discrete_reading_setting_mask[1] = mask & 0x3F;
60346470a38SPatrick Venture }
60446470a38SPatrick Venture 
60546470a38SPatrick Venture } // namespace body
60646470a38SPatrick Venture 
60746470a38SPatrick Venture // More types contained in section 43.17 Sensor Unit Type Codes,
60846470a38SPatrick Venture // IPMI spec v2 rev 1.1
60946470a38SPatrick Venture enum SensorUnitTypeCodes
61046470a38SPatrick Venture {
61146470a38SPatrick Venture     SENSOR_UNIT_UNSPECIFIED = 0,
61246470a38SPatrick Venture     SENSOR_UNIT_DEGREES_C = 1,
61346470a38SPatrick Venture     SENSOR_UNIT_VOLTS = 4,
61446470a38SPatrick Venture     SENSOR_UNIT_AMPERES = 5,
61546470a38SPatrick Venture     SENSOR_UNIT_WATTS = 6,
61646470a38SPatrick Venture     SENSOR_UNIT_JOULES = 7,
617812e44c7SKirill Pakhomov     SENSOR_UNIT_RPM = 18,
61846470a38SPatrick Venture     SENSOR_UNIT_METERS = 34,
61946470a38SPatrick Venture     SENSOR_UNIT_REVOLUTIONS = 41,
62046470a38SPatrick Venture };
62146470a38SPatrick Venture 
62246470a38SPatrick Venture struct SensorDataFullRecord
62346470a38SPatrick Venture {
62446470a38SPatrick Venture     SensorDataRecordHeader header;
62546470a38SPatrick Venture     SensorDataRecordKey key;
62646470a38SPatrick Venture     SensorDataFullRecordBody body;
62746470a38SPatrick Venture } __attribute__((packed));
62846470a38SPatrick Venture 
62946470a38SPatrick Venture /** @struct SensorDataFruRecord
63046470a38SPatrick Venture  *
63146470a38SPatrick Venture  *  FRU Device Locator Record - SDR Type 11
63246470a38SPatrick Venture  */
63346470a38SPatrick Venture struct SensorDataFruRecord
63446470a38SPatrick Venture {
63546470a38SPatrick Venture     SensorDataRecordHeader header;
63646470a38SPatrick Venture     SensorDataFruRecordKey key;
63746470a38SPatrick Venture     SensorDataFruRecordBody body;
63846470a38SPatrick Venture } __attribute__((packed));
63946470a38SPatrick Venture 
6409c11894eSJaghathiswari Rankappagounder Natarajan /** @struct SensorDataEntityRecord
6419c11894eSJaghathiswari Rankappagounder Natarajan  *
6429c11894eSJaghathiswari Rankappagounder Natarajan  *  Entity Association Record - SDR Type 8
6439c11894eSJaghathiswari Rankappagounder Natarajan  */
6449c11894eSJaghathiswari Rankappagounder Natarajan struct SensorDataEntityRecord
6459c11894eSJaghathiswari Rankappagounder Natarajan {
6469c11894eSJaghathiswari Rankappagounder Natarajan     SensorDataRecordHeader header;
6479c11894eSJaghathiswari Rankappagounder Natarajan     SensorDataEntityRecordKey key;
6489c11894eSJaghathiswari Rankappagounder Natarajan     SensorDataEntityRecordBody body;
6499c11894eSJaghathiswari Rankappagounder Natarajan } __attribute__((packed));
6509c11894eSJaghathiswari Rankappagounder Natarajan 
65146470a38SPatrick Venture } // namespace get_sdr
65246470a38SPatrick Venture 
65346470a38SPatrick Venture namespace ipmi
65446470a38SPatrick Venture {
65546470a38SPatrick Venture 
65646470a38SPatrick Venture namespace sensor
65746470a38SPatrick Venture {
65846470a38SPatrick Venture 
65946470a38SPatrick Venture /**
66046470a38SPatrick Venture  * @brief Map offset to the corresponding bit in the assertion byte.
66146470a38SPatrick Venture  *
66246470a38SPatrick Venture  * The discrete sensors support up to 14 states. 0-7 offsets are stored in one
66346470a38SPatrick Venture  * byte and offsets 8-14 in the second byte.
66446470a38SPatrick Venture  *
66546470a38SPatrick Venture  * @param[in] offset - offset number.
66646470a38SPatrick Venture  * @param[in/out] resp - get sensor reading response.
66746470a38SPatrick Venture  */
66846470a38SPatrick Venture inline void setOffset(uint8_t offset, ipmi::sensor::GetReadingResponse* resp)
66946470a38SPatrick Venture {
67046470a38SPatrick Venture     if (offset > 7)
67146470a38SPatrick Venture     {
67246470a38SPatrick Venture         resp->assertOffset8_14 |= 1 << (offset - 8);
67346470a38SPatrick Venture     }
67446470a38SPatrick Venture     else
67546470a38SPatrick Venture     {
67646470a38SPatrick Venture         resp->assertOffset0_7 |= 1 << offset;
67746470a38SPatrick Venture     }
67846470a38SPatrick Venture }
67946470a38SPatrick Venture 
68046470a38SPatrick Venture /**
68146470a38SPatrick Venture  * @brief Set the reading field in the response.
68246470a38SPatrick Venture  *
68346470a38SPatrick Venture  * @param[in] offset - offset number.
68446470a38SPatrick Venture  * @param[in/out] resp - get sensor reading response.
68546470a38SPatrick Venture  */
68646470a38SPatrick Venture inline void setReading(uint8_t value, ipmi::sensor::GetReadingResponse* resp)
68746470a38SPatrick Venture {
68846470a38SPatrick Venture     resp->reading = value;
68946470a38SPatrick Venture }
69046470a38SPatrick Venture 
69146470a38SPatrick Venture /**
69246470a38SPatrick Venture  * @brief Map the value to the assertion bytes. The assertion states are stored
69346470a38SPatrick Venture  *        in 2 bytes.
69446470a38SPatrick Venture  *
69546470a38SPatrick Venture  * @param[in] value - value to mapped to the assertion byte.
69646470a38SPatrick Venture  * @param[in/out] resp - get sensor reading response.
69746470a38SPatrick Venture  */
69846470a38SPatrick Venture inline void setAssertionBytes(uint16_t value,
69946470a38SPatrick Venture                               ipmi::sensor::GetReadingResponse* resp)
70046470a38SPatrick Venture {
70146470a38SPatrick Venture     resp->assertOffset0_7 = static_cast<uint8_t>(value & 0x00FF);
70246470a38SPatrick Venture     resp->assertOffset8_14 = static_cast<uint8_t>(value >> 8);
70346470a38SPatrick Venture }
70446470a38SPatrick Venture 
70546470a38SPatrick Venture /**
70646470a38SPatrick Venture  * @brief Set the scanning enabled bit in the response.
70746470a38SPatrick Venture  *
70846470a38SPatrick Venture  * @param[in/out] resp - get sensor reading response.
70946470a38SPatrick Venture  */
71046470a38SPatrick Venture inline void enableScanning(ipmi::sensor::GetReadingResponse* resp)
71146470a38SPatrick Venture {
71246470a38SPatrick Venture     resp->operation = 1 << 6;
71346470a38SPatrick Venture }
71446470a38SPatrick Venture 
71546470a38SPatrick Venture } // namespace sensor
71646470a38SPatrick Venture 
71746470a38SPatrick Venture } // namespace ipmi
718