Blame opae-libs/plugins/xfpga/metrics/bmc/bmcinfo.h

Packit 534379
// Copyright(c) 2018, Intel Corporation
Packit 534379
//
Packit 534379
// Redistribution  and  use  in source  and  binary  forms,  with  or  without
Packit 534379
// modification, are permitted provided that the following conditions are met:
Packit 534379
//
Packit 534379
// * Redistributions of  source code  must retain the  above copyright notice,
Packit 534379
//   this list of conditions and the following disclaimer.
Packit 534379
// * Redistributions in binary form must reproduce the above copyright notice,
Packit 534379
//   this list of conditions and the following disclaimer in the documentation
Packit 534379
//   and/or other materials provided with the distribution.
Packit 534379
// * Neither the name  of Intel Corporation  nor the names of its contributors
Packit 534379
//   may be used to  endorse or promote  products derived  from this  software
Packit 534379
//   without specific prior written permission.
Packit 534379
//
Packit 534379
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Packit 534379
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,  BUT NOT LIMITED TO,  THE
Packit 534379
// IMPLIED WARRANTIES OF  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit 534379
// ARE DISCLAIMED.  IN NO EVENT  SHALL THE COPYRIGHT OWNER  OR CONTRIBUTORS BE
Packit 534379
// LIABLE  FOR  ANY  DIRECT,  INDIRECT,  INCIDENTAL,  SPECIAL,  EXEMPLARY,  OR
Packit 534379
// CONSEQUENTIAL  DAMAGES  (INCLUDING,  BUT  NOT LIMITED  TO,  PROCUREMENT  OF
Packit 534379
// SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE,  DATA, OR PROFITS;  OR BUSINESS
Packit 534379
// INTERRUPTION)  HOWEVER CAUSED  AND ON ANY THEORY  OF LIABILITY,  WHETHER IN
Packit 534379
// CONTRACT,  STRICT LIABILITY,  OR TORT  (INCLUDING NEGLIGENCE  OR OTHERWISE)
Packit 534379
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,  EVEN IF ADVISED OF THE
Packit 534379
// POSSIBILITY OF SUCH DAMAGE.
Packit 534379
/*
Packit 534379
 * @file bmcinfo.h
Packit 534379
 *
Packit 534379
 * @brief
Packit 534379
 */
Packit 534379
#ifndef BMCINFO_H
Packit 534379
#define BMCINFO_H
Packit 534379
Packit 534379
#include <opae/fpga.h>
Packit 534379
#include <wchar.h>
Packit 534379
#include "bmc_types.h"
Packit 534379
Packit 534379
#ifdef __cplusplus
Packit 534379
extern "C" {
Packit 534379
#endif
Packit 534379
Packit 534379
#ifdef DEBUG
Packit 534379
#define DBG_PRINT(...)                                                         \
Packit 534379
	do {                                                                   \
Packit 534379
		fprintf(stderr, __VA_ARGS__);                                  \
Packit 534379
		fflush(stdout);                                                \
Packit 534379
		fflush(stderr);                                                \
Packit 534379
	} while (0)
Packit 534379
#else
Packit 534379
#define DBG_PRINT(...)                                                         \
Packit 534379
	do {                                                                   \
Packit 534379
		fflush(stdout);                                                \
Packit 534379
		fflush(stderr);                                                \
Packit 534379
	} while (0)
Packit 534379
#endif
Packit 534379
Packit 534379
#define SYSFS_PATH_MAX 256
Packit 534379
Packit 534379
// sysfs file names for power and temperature
Packit 534379
#define SYSFS_SDR_FILE "avmmi-bmc.*.auto/bmc_info/sdr"
Packit 534379
#define SYSFS_SENSOR_FILE "avmmi-bmc.*.auto/bmc_info/sensors"
Packit 534379
#define SYSFS_DEVID_FILE "avmmi-bmc.*.auto/bmc_info/device_id"
Packit 534379
#define SYSFS_RESET_FILE "avmmi-bmc.*.auto/bmc_info/reset_cause"
Packit 534379
#define SYSFS_PWRDN_FILE "avmmi-bmc.*.auto/bmc_info/power_down_cause"
Packit 534379
#define SYSFS_AVMMI_DIR "avmmi-bmc.*.auto"
Packit 534379
#define SYSFS_THERMAL_FILE "thermal_mgmt/temperature"
Packit 534379
Packit 534379
#pragma pack(push, 1)
Packit 534379
Packit 534379
// Structures used to read and decode Sensor Data Records (SDR)
Packit 534379
typedef struct _sdr_header {
Packit 534379
	uint16_t record_id;
Packit 534379
	uint8_t sdr_version;
Packit 534379
	uint8_t record_type;
Packit 534379
	uint8_t record_length;
Packit 534379
} sdr_header;
Packit 534379
Packit 534379
typedef struct _sdr_key {
Packit 534379
	uint8_t sensor_owner_id;
Packit 534379
	uint8_t sensor_owner_lun;
Packit 534379
	uint8_t sensor_number;
Packit 534379
} sdr_key;
Packit 534379
Packit 534379
typedef struct _sdr_body {
Packit 534379
	uint8_t entity_id;
Packit 534379
Packit 534379
	union _entity_instance {
Packit 534379
		struct {
Packit 534379
			uint8_t instance_number : 7;
Packit 534379
			uint8_t physical_logical : 1;
Packit 534379
		} bits;
Packit 534379
		uint8_t _value;
Packit 534379
	} entity_instance;
Packit 534379
Packit 534379
	union _sensor_initialization {
Packit 534379
		struct {
Packit 534379
			uint8_t scanning_enabled : 1;
Packit 534379
			uint8_t events_enabled : 1;
Packit 534379
			uint8_t init_sensor_type : 1;
Packit 534379
			uint8_t init_hysteresis : 1;
Packit 534379
			uint8_t init_thresholds : 1;
Packit 534379
			uint8_t init_events : 1;
Packit 534379
			uint8_t init_scanning : 1;
Packit 534379
			uint8_t settable_sensor : 1;
Packit 534379
		} bits;
Packit 534379
		uint8_t _value;
Packit 534379
	} sensor_initialization;
Packit 534379
Packit 534379
	union _sensor_capabilities {
Packit 534379
		struct {
Packit 534379
			uint8_t msg_control_support : 2;
Packit 534379
			uint8_t threshold_access_support : 2;
Packit 534379
			uint8_t hysteresis_support : 2;
Packit 534379
			uint8_t auto_rearm : 1;
Packit 534379
			uint8_t ignore_sensor : 1;
Packit 534379
		} bits;
Packit 534379
		uint8_t _value;
Packit 534379
	} sensor_capabilities;
Packit 534379
Packit 534379
	uint8_t sensor_type;
Packit 534379
#define SDR_SENSOR_IS_TEMP(psdr) ((psdr)->sensor_type == 0x1)
Packit 534379
#define SDR_SENSOR_IS_POWER(psdr)                                              \
Packit 534379
	(((psdr)->sensor_type == 0x2) || ((psdr)->sensor_type == 0x3)          \
Packit 534379
	 || ((psdr)->sensor_type == 0x8))
Packit 534379
Packit 534379
	uint8_t event_reading_type_code;
Packit 534379
Packit 534379
	union _assertion_event_lower_threshold_mask {
Packit 534379
		struct {
Packit 534379
			uint16_t event_offset_0 : 1;
Packit 534379
			uint16_t event_offset_1 : 1;
Packit 534379
			uint16_t event_offset_2 : 1;
Packit 534379
			uint16_t event_offset_3 : 1;
Packit 534379
			uint16_t event_offset_4 : 1;
Packit 534379
			uint16_t event_offset_5 : 1;
Packit 534379
			uint16_t event_offset_6 : 1;
Packit 534379
			uint16_t event_offset_7 : 1;
Packit 534379
			uint16_t event_offset_8 : 1;
Packit 534379
			uint16_t event_offset_9 : 1;
Packit 534379
			uint16_t event_offset_10 : 1;
Packit 534379
			uint16_t event_offset_11 : 1;
Packit 534379
			uint16_t event_offset_12 : 1;
Packit 534379
			uint16_t event_offset_13 : 1;
Packit 534379
			uint16_t event_offset_14 : 1;
Packit 534379
			uint16_t _reserved : 1;
Packit 534379
		} assertion_event_mask;
Packit 534379
		struct {
Packit 534379
			uint16_t _unused : 12;
Packit 534379
			uint16_t lower_nc_thresh_comparison : 1;
Packit 534379
			uint16_t lower_c_thresh_comparison : 1;
Packit 534379
			uint16_t lower_nr_thresh_comparison : 1;
Packit 534379
			uint16_t _reserved : 1;
Packit 534379
		} lower_threshold_mask;
Packit 534379
		struct {
Packit 534379
			uint16_t
Packit 534379
				assertion_event_lower_nc_going_low_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				assertion_event_lower_nc_going_high_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				assertion_event_lower_c_going_low_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				assertion_event_lower_c_going_high_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				assertion_event_lower_nr_going_low_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				assertion_event_lower_nr_going_high_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				assertion_event_upper_nc_going_low_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				assertion_event_upper_nc_going_high_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				assertion_event_upper_c_going_low_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				assertion_event_upper_c_going_high_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				assertion_event_upper_nr_going_low_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				assertion_event_upper_nr_going_high_supported : 1;
Packit 534379
			uint16_t _unused : 4;
Packit 534379
		} threshold_assertion_event_mask;
Packit 534379
		uint16_t _value;
Packit 534379
	} assertion_event_lower_threshold_mask;
Packit 534379
Packit 534379
	union _deassertion_event_upper_threshold_mask {
Packit 534379
		struct {
Packit 534379
			uint16_t event_offset_0 : 1;
Packit 534379
			uint16_t event_offset_1 : 1;
Packit 534379
			uint16_t event_offset_2 : 1;
Packit 534379
			uint16_t event_offset_3 : 1;
Packit 534379
			uint16_t event_offset_4 : 1;
Packit 534379
			uint16_t event_offset_5 : 1;
Packit 534379
			uint16_t event_offset_6 : 1;
Packit 534379
			uint16_t event_offset_7 : 1;
Packit 534379
			uint16_t event_offset_8 : 1;
Packit 534379
			uint16_t event_offset_9 : 1;
Packit 534379
			uint16_t event_offset_10 : 1;
Packit 534379
			uint16_t event_offset_11 : 1;
Packit 534379
			uint16_t event_offset_12 : 1;
Packit 534379
			uint16_t event_offset_13 : 1;
Packit 534379
			uint16_t event_offset_14 : 1;
Packit 534379
			uint16_t _reserved : 1;
Packit 534379
		} deassertion_event_mask;
Packit 534379
		struct {
Packit 534379
			uint16_t _unused : 12;
Packit 534379
			uint16_t upper_nc_thresh_comparison : 1;
Packit 534379
			uint16_t upper_c_thresh_comparison : 1;
Packit 534379
			uint16_t upper_nr_thresh_comparison : 1;
Packit 534379
			uint16_t _reserved : 1;
Packit 534379
		} upper_threshold_mask;
Packit 534379
		struct {
Packit 534379
			uint16_t
Packit 534379
				deassertion_event_lower_nc_going_low_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				deassertion_event_lower_nc_going_high_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				deassertion_event_lower_c_going_low_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				deassertion_event_lower_c_going_high_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				deassertion_event_lower_nr_going_low_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				deassertion_event_lower_nr_going_high_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				deassertion_event_upper_nc_going_low_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				deassertion_event_upper_nc_going_high_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				deassertion_event_upper_c_going_low_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				deassertion_event_upper_c_going_high_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				deassertion_event_upper_nr_going_low_supported : 1;
Packit 534379
			uint16_t
Packit 534379
				deassertion_event_upper_nr_going_high_supported : 1;
Packit 534379
			uint16_t _unused : 4;
Packit 534379
		} threshold_deassertion_event_mask;
Packit 534379
		uint16_t _value;
Packit 534379
	} deassertion_event_upper_threshold_mask;
Packit 534379
Packit 534379
	union _discrete_settable_readable_threshold_mask {
Packit 534379
		struct {
Packit 534379
			uint16_t discrete_state_enable_0 : 1;
Packit 534379
			uint16_t discrete_state_enable_1 : 1;
Packit 534379
			uint16_t discrete_state_enable_2 : 1;
Packit 534379
			uint16_t discrete_state_enable_3 : 1;
Packit 534379
			uint16_t discrete_state_enable_4 : 1;
Packit 534379
			uint16_t discrete_state_enable_5 : 1;
Packit 534379
			uint16_t discrete_state_enable_6 : 1;
Packit 534379
			uint16_t discrete_state_enable_7 : 1;
Packit 534379
			uint16_t discrete_state_enable_8 : 1;
Packit 534379
			uint16_t discrete_state_enable_9 : 1;
Packit 534379
			uint16_t discrete_state_enable_10 : 1;
Packit 534379
			uint16_t discrete_state_enable_11 : 1;
Packit 534379
			uint16_t discrete_state_enable_12 : 1;
Packit 534379
			uint16_t discrete_state_enable_13 : 1;
Packit 534379
			uint16_t discrete_state_enable_14 : 1;
Packit 534379
			uint16_t _reserved : 1;
Packit 534379
		} discrete_reading_mask;
Packit 534379
		struct {
Packit 534379
			uint16_t _unused : 8;
Packit 534379
			uint16_t lower_nc_thresh_settable : 1;
Packit 534379
			uint16_t lower_c_thresh_settable : 1;
Packit 534379
			uint16_t lower_nr_thresh_settable : 1;
Packit 534379
			uint16_t upper_nc_thresh_settable : 1;
Packit 534379
			uint16_t upper_c_thresh_settable : 1;
Packit 534379
			uint16_t upper_nr_thresh_settable : 1;
Packit 534379
			uint16_t _reserved : 2;
Packit 534379
		} settable_threshold_mask;
Packit 534379
		struct {
Packit 534379
			uint16_t lower_nc_thresh_readable : 1;
Packit 534379
			uint16_t lower_c_thresh_readable : 1;
Packit 534379
			uint16_t lower_nr_thresh_readable : 1;
Packit 534379
			uint16_t upper_nc_thresh_readable : 1;
Packit 534379
			uint16_t upper_c_thresh_readable : 1;
Packit 534379
			uint16_t upper_nr_thresh_readable : 1;
Packit 534379
			uint16_t _unused : 10;
Packit 534379
		} readable_threshold_mask;
Packit 534379
		uint16_t _value;
Packit 534379
	} discrete_settable_readable_threshold_mask;
Packit 534379
Packit 534379
	union _sensor_units_1 {
Packit 534379
		struct {
Packit 534379
			uint8_t percentage : 1;
Packit 534379
			uint8_t modifier_unit : 2;
Packit 534379
			uint8_t rate_unit : 3;
Packit 534379
			uint8_t analog_data_format : 2;
Packit 534379
		} bits;
Packit 534379
		uint8_t _value;
Packit 534379
	} sensor_units_1;
Packit 534379
Packit 534379
	uint8_t sensor_units_2;
Packit 534379
	uint8_t sensor_units_3;
Packit 534379
Packit 534379
	union _linearization {
Packit 534379
		struct {
Packit 534379
			uint8_t linearity_enum : 7;
Packit 534379
			uint8_t _reserved : 1;
Packit 534379
		} bits;
Packit 534379
		uint8_t _value;
Packit 534379
	} linearization;
Packit 534379
Packit 534379
	uint8_t M_8_lsb;
Packit 534379
Packit 534379
	union _M_tolerance {
Packit 534379
		struct {
Packit 534379
			uint8_t tolerance : 6;
Packit 534379
			uint8_t M_2_msb : 2;
Packit 534379
		} bits;
Packit 534379
		uint8_t _value;
Packit 534379
	} M_tolerance;
Packit 534379
Packit 534379
	uint8_t B_8_lsb;
Packit 534379
Packit 534379
	union _B_accuracy {
Packit 534379
		struct {
Packit 534379
			uint8_t accuracy_6_lsb : 6;
Packit 534379
			uint8_t B_2_msb : 2;
Packit 534379
		} bits;
Packit 534379
		uint8_t _value;
Packit 534379
	} B_accuracy;
Packit 534379
Packit 534379
	union _accuracy_accexp_sensor_direction {
Packit 534379
		struct {
Packit 534379
			uint8_t sensor_direction : 2;
Packit 534379
			uint8_t accuracy_exp : 2;
Packit 534379
			uint8_t accuracy_4_msb : 4;
Packit 534379
		} bits;
Packit 534379
		uint8_t _value;
Packit 534379
	} accuracy_accexp_sensor_direction;
Packit 534379
Packit 534379
	union _R_exp_B_exp {
Packit 534379
		struct {
Packit 534379
			uint8_t B_exp : 4;
Packit 534379
			uint8_t R_exp : 4;
Packit 534379
		} bits;
Packit 534379
		uint8_t _value;
Packit 534379
	} R_exp_B_exp;
Packit 534379
Packit 534379
	union _analog_characteristic_flags {
Packit 534379
		struct {
Packit 534379
			uint8_t nominal_reading_specified : 1;
Packit 534379
			uint8_t normal_max_specified : 1;
Packit 534379
			uint8_t normal_min_specified : 1;
Packit 534379
			uint8_t _reserved : 5;
Packit 534379
		} bits;
Packit 534379
		uint8_t _value;
Packit 534379
	} analog_characteristic_flags;
Packit 534379
Packit 534379
	uint8_t nominal_reading;
Packit 534379
	uint8_t normal_maximum;
Packit 534379
	uint8_t normal_minimum;
Packit 534379
	uint8_t sensor_maximum_reading;
Packit 534379
	uint8_t sensor_minimum_reading;
Packit 534379
	uint8_t upper_nr_threshold;
Packit 534379
	uint8_t upper_c_threshold;
Packit 534379
	uint8_t upper_nc_threshold;
Packit 534379
	uint8_t lower_nr_threshold;
Packit 534379
	uint8_t lower_c_threshold;
Packit 534379
	uint8_t lower_nc_threshold;
Packit 534379
	uint8_t pos_going_threshold_hysteresis_val;
Packit 534379
	uint8_t neg_going_threshold_hysteresis_val;
Packit 534379
Packit 534379
	uint8_t _reserved0;
Packit 534379
	uint8_t _reserved1;
Packit 534379
	uint8_t oem;
Packit 534379
Packit 534379
	union _id_string_type_length_code {
Packit 534379
		struct {
Packit 534379
			uint8_t len_in_characters : 5; // 11111b reserved,
Packit 534379
						       // 00000b means none
Packit 534379
						       // following
Packit 534379
			uint8_t _reserved : 1;
Packit 534379
			uint8_t format : 2; // using TLC_FORMAT enum
Packit 534379
		} bits;
Packit 534379
		uint8_t _value;
Packit 534379
	} id_string_type_length_code;
Packit 534379
Packit 534379
	uint8_t string_bytes[26]; // Interpreted based on type/length code
Packit 534379
} sdr_body;
Packit 534379
Packit 534379
typedef enum _TLC_FORMAT {
Packit 534379
	unicode = 0x0,
Packit 534379
	BCD_plus = 0x1,
Packit 534379
	ASCII_6 = 0x2, // packed
Packit 534379
	ASCII_8 = 0x3
Packit 534379
} TLC_FORMAT;
Packit 534379
Packit 534379
extern uint8_t bcd_plus[];
Packit 534379
Packit 534379
extern uint8_t ASCII_6_bit_translation[];
Packit 534379
Packit 534379
typedef struct _sensor_reading {
Packit 534379
	uint8_t _header[3]; // Ignored
Packit 534379
	uint8_t completion_code;
Packit 534379
	uint8_t sens_reading;
Packit 534379
	union {
Packit 534379
		struct {
Packit 534379
			uint8_t _unused : 5;
Packit 534379
			uint8_t reading_state_unavailable : 1;
Packit 534379
			uint8_t sensor_scanning_disabled : 1;
Packit 534379
			uint8_t event_messages_disabled : 1;
Packit 534379
		} sensor_state;
Packit 534379
		uint8_t _value;
Packit 534379
	} sensor_validity;
Packit 534379
	union {
Packit 534379
		struct {
Packit 534379
			uint8_t at_or_below_lower_nc_threshold : 1;
Packit 534379
			uint8_t at_or_below_lower_c_threshold : 1;
Packit 534379
			uint8_t at_or_below_lower_nr_threshold : 1;
Packit 534379
			uint8_t at_or_above_upper_nc_threshold : 1;
Packit 534379
			uint8_t at_or_above_upper_c_threshold : 1;
Packit 534379
			uint8_t at_or_above_upper_nr_threshold : 1;
Packit 534379
			uint8_t _unused : 2;
Packit 534379
		} threshold_sensors;
Packit 534379
		struct {
Packit 534379
			uint8_t state_asserted_0 : 1;
Packit 534379
			uint8_t state_asserted_1 : 1;
Packit 534379
			uint8_t state_asserted_2 : 1;
Packit 534379
			uint8_t state_asserted_3 : 1;
Packit 534379
			uint8_t state_asserted_4 : 1;
Packit 534379
			uint8_t state_asserted_5 : 1;
Packit 534379
			uint8_t state_asserted_6 : 1;
Packit 534379
			uint8_t state_asserted_7 : 1;
Packit 534379
		} discrete_sensors;
Packit 534379
		uint8_t _value;
Packit 534379
	} threshold_events;
Packit 534379
} sensor_reading;
Packit 534379
Packit 534379
typedef struct _device_id {
Packit 534379
	uint8_t _header[3]; // Ignored
Packit 534379
	uint8_t completion_code;
Packit 534379
	uint8_t device_id;
Packit 534379
	union {
Packit 534379
		struct {
Packit 534379
			uint8_t device_revision : 3;
Packit 534379
			uint8_t _unused : 3;
Packit 534379
			uint8_t provides_sdrs : 2;
Packit 534379
		} bits;
Packit 534379
		uint8_t _value;
Packit 534379
	} device_revision;
Packit 534379
	union {
Packit 534379
		struct {
Packit 534379
			uint8_t device_available : 7;
Packit 534379
			uint8_t major_fw_revision : 1;
Packit 534379
		} bits;
Packit 534379
		uint8_t _value;
Packit 534379
	} firmware_revision_1;
Packit 534379
	uint8_t firmware_revision_2;
Packit 534379
	uint8_t ipmi_version;
Packit 534379
	union {
Packit 534379
		struct {
Packit 534379
			uint8_t sensor_device : 1;
Packit 534379
			uint8_t sdr_repository_device : 1;
Packit 534379
			uint8_t sel_device : 1;
Packit 534379
			uint8_t fru_inventory_device : 1;
Packit 534379
			uint8_t ipmb_event_receiver : 1;
Packit 534379
			uint8_t ipmb_event_generator : 1;
Packit 534379
			uint8_t bridge : 1;
Packit 534379
			uint8_t chassis_device : 1;
Packit 534379
		} bits;
Packit 534379
		uint8_t _value;
Packit 534379
	} additional_device_support;
Packit 534379
	uint8_t manufacturer_id_0_7;
Packit 534379
	uint8_t manufacturer_id_8_15;
Packit 534379
	uint8_t manufacturer_id_16_23;
Packit 534379
	uint8_t product_id_0_7;
Packit 534379
	uint8_t product_id_8_15;
Packit 534379
	uint8_t aux_fw_rev_0_7;
Packit 534379
	uint8_t aux_fw_rev_8_15;
Packit 534379
	uint8_t aux_fw_rev_16_23;
Packit 534379
	uint8_t aux_fw_rev_24_31;
Packit 534379
} device_id;
Packit 534379
Packit 534379
typedef struct _powerdown_cause {
Packit 534379
	uint8_t _header[3]; // Ignored
Packit 534379
	uint8_t completion_code;
Packit 534379
	uint8_t iana[3];
Packit 534379
	uint8_t count;
Packit 534379
	uint8_t message[40];
Packit 534379
} powerdown_cause;
Packit 534379
Packit 534379
typedef struct _reset_cause {
Packit 534379
	uint8_t _header[3]; // Ignored
Packit 534379
	uint8_t completion_code;
Packit 534379
	uint8_t iana[3];
Packit 534379
	uint8_t reset_cause; // * TODO: Not sure about this
Packit 534379
} reset_cause;
Packit 534379
Packit 534379
struct _sdr_content {
Packit 534379
	sdr_header header;
Packit 534379
	sdr_key key;
Packit 534379
	sdr_body body;
Packit 534379
};
Packit 534379
Packit 534379
#pragma pack(pop)
Packit 534379
Packit 534379
typedef enum { SENSOR_INT, SENSOR_FLOAT } sensor_value_type;
Packit 534379
Packit 534379
typedef struct _Values {
Packit 534379
	struct _Values *next;
Packit 534379
	char *name;
Packit 534379
	wchar_t *units;
Packit 534379
	char *annotation_1;
Packit 534379
	char *annotation_2;
Packit 534379
	char *annotation_3;
Packit 534379
	uint8_t raw_value;
Packit 534379
	uint8_t is_valid;
Packit 534379
	uint32_t tolerance;
Packit 534379
	double accuracy;
Packit 534379
	double M;
Packit 534379
	double B;
Packit 534379
	int32_t A_exp;
Packit 534379
	int32_t result_exp;
Packit 534379
	union {
Packit 534379
		double f_val;
Packit 534379
		uint64_t i_val;
Packit 534379
	} value;
Packit 534379
	uint8_t sensor_number;
Packit 534379
	BMC_SENSOR_TYPE sensor_type;
Packit 534379
	sensor_value_type val_type;
Packit 534379
	struct _sdr_content *sdr;
Packit 534379
} Values;
Packit 534379
Packit 534379
#define BMC_SDR_MAGIC (0x4922ab56)
Packit 534379
Packit 534379
struct _sdr_rec {
Packit 534379
	uint32_t magic;
Packit 534379
	fpga_token token;
Packit 534379
	uint32_t num_records;
Packit 534379
	char sysfs_path[SYSFS_PATH_MAX];
Packit 534379
	struct _sdr_content *contents;
Packit 534379
};
Packit 534379
Packit 534379
#define BMC_VALUES_MAGIC (0x493afb56)
Packit 534379
Packit 534379
struct _bmc_values {
Packit 534379
	uint32_t magic;
Packit 534379
	uint32_t num_records;
Packit 534379
	sensor_reading *contents;
Packit 534379
	Values **values;
Packit 534379
};
Packit 534379
Packit 534379
Values *bmc_build_values(sensor_reading *reading, sdr_header *header,
Packit 534379
			 sdr_key *key, sdr_body *body);
Packit 534379
Packit 534379
#ifdef __cplusplus
Packit 534379
}
Packit 534379
#endif
Packit 534379
Packit 534379
#endif /* !BMCINFO_H */