Blame include/ipmitool/ipmi_sdr.h

Packit Service ed0f68
/*
Packit Service ed0f68
 * Copyright (c) 2003 Sun Microsystems, Inc.  All Rights Reserved.
Packit Service ed0f68
 * 
Packit Service ed0f68
 * Redistribution and use in source and binary forms, with or without
Packit Service ed0f68
 * modification, are permitted provided that the following conditions
Packit Service ed0f68
 * are met:
Packit Service ed0f68
 * 
Packit Service ed0f68
 * Redistribution of source code must retain the above copyright
Packit Service ed0f68
 * notice, this list of conditions and the following disclaimer.
Packit Service ed0f68
 * 
Packit Service ed0f68
 * Redistribution in binary form must reproduce the above copyright
Packit Service ed0f68
 * notice, this list of conditions and the following disclaimer in the
Packit Service ed0f68
 * documentation and/or other materials provided with the distribution.
Packit Service ed0f68
 * 
Packit Service ed0f68
 * Neither the name of Sun Microsystems, Inc. or the names of
Packit Service ed0f68
 * contributors may be used to endorse or promote products derived
Packit Service ed0f68
 * from this software without specific prior written permission.
Packit Service ed0f68
 * 
Packit Service ed0f68
 * This software is provided "AS IS," without a warranty of any kind.
Packit Service ed0f68
 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
Packit Service ed0f68
 * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
Packit Service ed0f68
 * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
Packit Service ed0f68
 * SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
Packit Service ed0f68
 * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
Packit Service ed0f68
 * OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.  IN NO EVENT WILL
Packit Service ed0f68
 * SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
Packit Service ed0f68
 * OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
Packit Service ed0f68
 * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
Packit Service ed0f68
 * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
Packit Service ed0f68
 * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
Packit Service ed0f68
 */
Packit Service ed0f68
Packit Service ed0f68
#ifndef IPMI_SDR_H
Packit Service ed0f68
#define IPMI_SDR_H
Packit Service ed0f68
Packit Service ed0f68
#if HAVE_CONFIG_H
Packit Service ed0f68
# include <config.h>
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
#include <inttypes.h>
Packit Service ed0f68
#include <math.h>
Packit Service ed0f68
#include <ipmitool/bswap.h>
Packit Service ed0f68
#include <ipmitool/ipmi.h>
Packit Service ed0f68
#include <ipmitool/ipmi_entity.h>
Packit Service ed0f68
Packit Service ed0f68
int ipmi_sdr_main(struct ipmi_intf *, int, char **);
Packit Service ed0f68
Packit Service ed0f68
#define tos32(val, bits)    ((val & ((1<<((bits)-1)))) ? (-((val) & (1<<((bits)-1))) | (val)) : (val))
Packit Service ed0f68
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
# define __TO_TOL(mtol)     (uint16_t)(mtol & 0x3f)
Packit Service ed0f68
# define __TO_M(mtol)       (int16_t)(tos32((((mtol & 0xff00) >> 8) | ((mtol & 0xc0) << 2)), 10))
Packit Service ed0f68
# define __TO_B(bacc)       (int32_t)(tos32((((bacc & 0xff000000) >> 24) | ((bacc & 0xc00000) >> 14)), 10))
Packit Service ed0f68
# define __TO_ACC(bacc)     (uint32_t)(((bacc & 0x3f0000) >> 16) | ((bacc & 0xf000) >> 6))
Packit Service ed0f68
# define __TO_ACC_EXP(bacc) (uint32_t)((bacc & 0xc00) >> 10)
Packit Service ed0f68
# define __TO_R_EXP(bacc)   (int32_t)(tos32(((bacc & 0xf0) >> 4), 4))
Packit Service ed0f68
# define __TO_B_EXP(bacc)   (int32_t)(tos32((bacc & 0xf), 4))
Packit Service ed0f68
#else
Packit Service ed0f68
# define __TO_TOL(mtol)     (uint16_t)(BSWAP_16(mtol) & 0x3f)
Packit Service ed0f68
# define __TO_M(mtol)       (int16_t)(tos32((((BSWAP_16(mtol) & 0xff00) >> 8) | ((BSWAP_16(mtol) & 0xc0) << 2)), 10))
Packit Service ed0f68
# define __TO_B(bacc)       (int32_t)(tos32((((BSWAP_32(bacc) & 0xff000000) >> 24) | \
Packit Service ed0f68
                            ((BSWAP_32(bacc) & 0xc00000) >> 14)), 10))
Packit Service ed0f68
# define __TO_ACC(bacc)     (uint32_t)(((BSWAP_32(bacc) & 0x3f0000) >> 16) | ((BSWAP_32(bacc) & 0xf000) >> 6))
Packit Service ed0f68
# define __TO_ACC_EXP(bacc) (uint32_t)((BSWAP_32(bacc) & 0xc00) >> 10)
Packit Service ed0f68
# define __TO_R_EXP(bacc)   (int32_t)(tos32(((BSWAP_32(bacc) & 0xf0) >> 4), 4))
Packit Service ed0f68
# define __TO_B_EXP(bacc)   (int32_t)(tos32((BSWAP_32(bacc) & 0xf), 4))
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
enum {
Packit Service ed0f68
	ANALOG_SENSOR,
Packit Service ed0f68
	DISCRETE_SENSOR,
Packit Service ed0f68
};
Packit Service ed0f68
Packit Service ed0f68
#define READING_UNAVAILABLE	0x20
Packit Service ed0f68
#define SCANNING_DISABLED	0x40
Packit Service ed0f68
#define EVENT_MSG_DISABLED	0x80
Packit Service ed0f68
Packit Service ed0f68
#define IS_READING_UNAVAILABLE(val)	((val) & READING_UNAVAILABLE)
Packit Service ed0f68
#define IS_SCANNING_DISABLED(val)	(!((val) & SCANNING_DISABLED))
Packit Service ed0f68
#define IS_EVENT_MSG_DISABLED(val)	(!((val) & EVENT_MSG_DISABLED))
Packit Service ed0f68
Packit Service ed0f68
#define GET_SDR_REPO_INFO	0x20
Packit Service ed0f68
#define GET_SDR_ALLOC_INFO	0x21
Packit Service ed0f68
Packit Service ed0f68
#define SDR_SENSOR_STAT_LO_NC	(1<<0)
Packit Service ed0f68
#define SDR_SENSOR_STAT_LO_CR	(1<<1)
Packit Service ed0f68
#define SDR_SENSOR_STAT_LO_NR	(1<<2)
Packit Service ed0f68
#define SDR_SENSOR_STAT_HI_NC	(1<<3)
Packit Service ed0f68
#define SDR_SENSOR_STAT_HI_CR	(1<<4)
Packit Service ed0f68
#define SDR_SENSOR_STAT_HI_NR	(1<<5)
Packit Service ed0f68
Packit Service ed0f68
#define GET_DEVICE_SDR_INFO      0x20
Packit Service ed0f68
#define GET_DEVICE_SDR           0x21
Packit Service ed0f68
#define GET_SENSOR_FACTORS      0x23
Packit Service ed0f68
#define GET_SENSOR_FACTORS      0x23
Packit Service ed0f68
#define SET_SENSOR_HYSTERESIS	0x24
Packit Service ed0f68
#define GET_SENSOR_HYSTERESIS	0x25
Packit Service ed0f68
#define SET_SENSOR_THRESHOLDS   0x26
Packit Service ed0f68
#define GET_SENSOR_THRESHOLDS   0x27
Packit Service ed0f68
#define SET_SENSOR_EVENT_ENABLE	0x28
Packit Service ed0f68
#define GET_SENSOR_EVENT_ENABLE 0x29
Packit Service ed0f68
#define GET_SENSOR_EVENT_STATUS	0x2b
Packit Service ed0f68
#define GET_SENSOR_READING	0x2d
Packit Service ed0f68
#define GET_SENSOR_TYPE		0x2f
Packit Service ed0f68
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(1)
Packit Service ed0f68
#endif
Packit Service ed0f68
struct sdr_repo_info_rs {
Packit Service ed0f68
	uint8_t version;	/* SDR version (51h) */
Packit Service ed0f68
	uint16_t count;		/* number of records */
Packit Service ed0f68
	uint16_t free;		/* free space in SDR */
Packit Service ed0f68
	uint32_t add_stamp;	/* last add timestamp */
Packit Service ed0f68
	uint32_t erase_stamp;	/* last del timestamp */
Packit Service ed0f68
	uint8_t op_support;	/* supported operations */
Packit Service ed0f68
} ATTRIBUTE_PACKING;
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(0)
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(1)
Packit Service ed0f68
#endif
Packit Service ed0f68
/* builtin (device) sdrs support */
Packit Service ed0f68
struct sdr_device_info_rs {
Packit Service ed0f68
	unsigned char count;	/* number of records */
Packit Service ed0f68
	unsigned char flags;	/* flags */
Packit Service ed0f68
	unsigned char popChangeInd[3];	/* free space in SDR */
Packit Service ed0f68
} ATTRIBUTE_PACKING;
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(0)
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(1)
Packit Service ed0f68
#endif
Packit Service ed0f68
#define GET_SDR_RESERVE_REPO	0x22
Packit Service ed0f68
struct sdr_reserve_repo_rs {
Packit Service ed0f68
	uint16_t reserve_id;	/* reservation ID */
Packit Service ed0f68
} ATTRIBUTE_PACKING;
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(0)
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(1)
Packit Service ed0f68
#endif
Packit Service ed0f68
#define GET_SDR		0x23
Packit Service ed0f68
struct sdr_get_rq {
Packit Service ed0f68
	uint16_t reserve_id;	/* reservation ID */
Packit Service ed0f68
	uint16_t id;		/* record ID */
Packit Service ed0f68
	uint8_t offset;		/* offset into SDR */
Packit Service ed0f68
#define GET_SDR_ENTIRE_RECORD	0xff
Packit Service ed0f68
	uint8_t length;		/* length to read */
Packit Service ed0f68
} ATTRIBUTE_PACKING;
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(0)
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(1)
Packit Service ed0f68
#endif
Packit Service ed0f68
struct sdr_get_rs {
Packit Service ed0f68
	uint16_t next;		/* next record id */
Packit Service ed0f68
	uint16_t id;		/* record ID */
Packit Service ed0f68
	uint8_t version;	/* SDR version (51h) */
Packit Service ed0f68
#define SDR_RECORD_TYPE_FULL_SENSOR		0x01
Packit Service ed0f68
#define SDR_RECORD_TYPE_COMPACT_SENSOR		0x02
Packit Service ed0f68
#define SDR_RECORD_TYPE_EVENTONLY_SENSOR	0x03
Packit Service ed0f68
#define SDR_RECORD_TYPE_ENTITY_ASSOC		0x08
Packit Service ed0f68
#define SDR_RECORD_TYPE_DEVICE_ENTITY_ASSOC	0x09
Packit Service ed0f68
#define SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR	0x10
Packit Service ed0f68
#define SDR_RECORD_TYPE_FRU_DEVICE_LOCATOR	0x11
Packit Service ed0f68
#define SDR_RECORD_TYPE_MC_DEVICE_LOCATOR	0x12
Packit Service ed0f68
#define SDR_RECORD_TYPE_MC_CONFIRMATION		0x13
Packit Service ed0f68
#define SDR_RECORD_TYPE_BMC_MSG_CHANNEL_INFO	0x14
Packit Service ed0f68
#define SDR_RECORD_TYPE_OEM			0xc0
Packit Service ed0f68
	uint8_t type;		/* record type */
Packit Service ed0f68
	uint8_t length;		/* remaining record bytes */
Packit Service ed0f68
} ATTRIBUTE_PACKING;
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(0)
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(1)
Packit Service ed0f68
#endif
Packit Service ed0f68
struct sdr_record_mask {
Packit Service ed0f68
	union {
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint16_t assert_event;	/* assertion event mask */
Packit Service ed0f68
			uint16_t deassert_event;	/* de-assertion event mask */
Packit Service ed0f68
			uint16_t read;	/* discrete reading mask */
Packit Service ed0f68
		} ATTRIBUTE_PACKING discrete;
Packit Service ed0f68
		struct {
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
			uint16_t reserved:1;
Packit Service ed0f68
			uint16_t status_lnr:1;
Packit Service ed0f68
			uint16_t status_lcr:1;
Packit Service ed0f68
			uint16_t status_lnc:1;
Packit Service ed0f68
			uint16_t assert_unr_high:1;
Packit Service ed0f68
			uint16_t assert_unr_low:1;
Packit Service ed0f68
			uint16_t assert_ucr_high:1;
Packit Service ed0f68
			uint16_t assert_ucr_low:1;
Packit Service ed0f68
			uint16_t assert_unc_high:1;
Packit Service ed0f68
			uint16_t assert_unc_low:1;
Packit Service ed0f68
			uint16_t assert_lnr_high:1;
Packit Service ed0f68
			uint16_t assert_lnr_low:1;
Packit Service ed0f68
			uint16_t assert_lcr_high:1;
Packit Service ed0f68
			uint16_t assert_lcr_low:1;
Packit Service ed0f68
			uint16_t assert_lnc_high:1;
Packit Service ed0f68
			uint16_t assert_lnc_low:1;
Packit Service ed0f68
#else
Packit Service ed0f68
			uint16_t assert_lnc_low:1;
Packit Service ed0f68
			uint16_t assert_lnc_high:1;
Packit Service ed0f68
			uint16_t assert_lcr_low:1;
Packit Service ed0f68
			uint16_t assert_lcr_high:1;
Packit Service ed0f68
			uint16_t assert_lnr_low:1;
Packit Service ed0f68
			uint16_t assert_lnr_high:1;
Packit Service ed0f68
			uint16_t assert_unc_low:1;
Packit Service ed0f68
			uint16_t assert_unc_high:1;
Packit Service ed0f68
			uint16_t assert_ucr_low:1;
Packit Service ed0f68
			uint16_t assert_ucr_high:1;
Packit Service ed0f68
			uint16_t assert_unr_low:1;
Packit Service ed0f68
			uint16_t assert_unr_high:1;
Packit Service ed0f68
			uint16_t status_lnc:1;
Packit Service ed0f68
			uint16_t status_lcr:1;
Packit Service ed0f68
			uint16_t status_lnr:1;
Packit Service ed0f68
			uint16_t reserved:1;
Packit Service ed0f68
#endif
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
			uint16_t reserved_2:1;
Packit Service ed0f68
			uint16_t status_unr:1;
Packit Service ed0f68
			uint16_t status_ucr:1;
Packit Service ed0f68
			uint16_t status_unc:1;
Packit Service ed0f68
			uint16_t deassert_unr_high:1;
Packit Service ed0f68
			uint16_t deassert_unr_low:1;
Packit Service ed0f68
			uint16_t deassert_ucr_high:1;
Packit Service ed0f68
			uint16_t deassert_ucr_low:1;
Packit Service ed0f68
			uint16_t deassert_unc_high:1;
Packit Service ed0f68
			uint16_t deassert_unc_low:1;
Packit Service ed0f68
			uint16_t deassert_lnr_high:1;
Packit Service ed0f68
			uint16_t deassert_lnr_low:1;
Packit Service ed0f68
			uint16_t deassert_lcr_high:1;
Packit Service ed0f68
			uint16_t deassert_lcr_low:1;
Packit Service ed0f68
			uint16_t deassert_lnc_high:1;
Packit Service ed0f68
			uint16_t deassert_lnc_low:1;
Packit Service ed0f68
#else
Packit Service ed0f68
			uint16_t deassert_lnc_low:1;
Packit Service ed0f68
			uint16_t deassert_lnc_high:1;
Packit Service ed0f68
			uint16_t deassert_lcr_low:1;
Packit Service ed0f68
			uint16_t deassert_lcr_high:1;
Packit Service ed0f68
			uint16_t deassert_lnr_low:1;
Packit Service ed0f68
			uint16_t deassert_lnr_high:1;
Packit Service ed0f68
			uint16_t deassert_unc_low:1;
Packit Service ed0f68
			uint16_t deassert_unc_high:1;
Packit Service ed0f68
			uint16_t deassert_ucr_low:1;
Packit Service ed0f68
			uint16_t deassert_ucr_high:1;
Packit Service ed0f68
			uint16_t deassert_unr_low:1;
Packit Service ed0f68
			uint16_t deassert_unr_high:1;
Packit Service ed0f68
			uint16_t status_unc:1;
Packit Service ed0f68
			uint16_t status_ucr:1;
Packit Service ed0f68
			uint16_t status_unr:1;
Packit Service ed0f68
			uint16_t reserved_2:1;
Packit Service ed0f68
#endif
Packit Service ed0f68
			union {
Packit Service ed0f68
				struct {
Packit Service ed0f68
#if WORDS_BIGENDIAN			/* settable threshold mask */
Packit Service ed0f68
					uint16_t reserved:2;
Packit Service ed0f68
					uint16_t unr:1;
Packit Service ed0f68
					uint16_t ucr:1;
Packit Service ed0f68
					uint16_t unc:1;
Packit Service ed0f68
					uint16_t lnr:1;
Packit Service ed0f68
					uint16_t lcr:1;
Packit Service ed0f68
					uint16_t lnc:1;
Packit Service ed0f68
					/* padding lower 8 bits */
Packit Service ed0f68
					uint16_t readable:8;
Packit Service ed0f68
#else
Packit Service ed0f68
					uint16_t readable:8;
Packit Service ed0f68
					uint16_t lnc:1;
Packit Service ed0f68
					uint16_t lcr:1;
Packit Service ed0f68
					uint16_t lnr:1;
Packit Service ed0f68
					uint16_t unc:1;
Packit Service ed0f68
					uint16_t ucr:1;
Packit Service ed0f68
					uint16_t unr:1;
Packit Service ed0f68
					uint16_t reserved:2;
Packit Service ed0f68
#endif
Packit Service ed0f68
				} ATTRIBUTE_PACKING set;
Packit Service ed0f68
				struct {
Packit Service ed0f68
#if WORDS_BIGENDIAN			/* readable threshold mask */
Packit Service ed0f68
					/* padding upper 8 bits */
Packit Service ed0f68
					uint16_t settable:8;
Packit Service ed0f68
					uint16_t reserved:2;
Packit Service ed0f68
					uint16_t unr:1;
Packit Service ed0f68
					uint16_t ucr:1;
Packit Service ed0f68
					uint16_t unc:1;
Packit Service ed0f68
					uint16_t lnr:1;
Packit Service ed0f68
					uint16_t lcr:1;
Packit Service ed0f68
					uint16_t lnc:1;
Packit Service ed0f68
#else
Packit Service ed0f68
					uint16_t lnc:1;
Packit Service ed0f68
					uint16_t lcr:1;
Packit Service ed0f68
					uint16_t lnr:1;
Packit Service ed0f68
					uint16_t unc:1;
Packit Service ed0f68
					uint16_t ucr:1;
Packit Service ed0f68
					uint16_t unr:1;
Packit Service ed0f68
					uint16_t reserved:2;
Packit Service ed0f68
					uint16_t settable:8;
Packit Service ed0f68
#endif
Packit Service ed0f68
				} ATTRIBUTE_PACKING read;
Packit Service ed0f68
			} ATTRIBUTE_PACKING;
Packit Service ed0f68
		} ATTRIBUTE_PACKING threshold;
Packit Service ed0f68
	} ATTRIBUTE_PACKING type;
Packit Service ed0f68
} ATTRIBUTE_PACKING;
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(0)
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(1)
Packit Service ed0f68
#endif
Packit Service ed0f68
struct sdr_record_common_sensor {
Packit Service ed0f68
	struct {
Packit Service ed0f68
		uint8_t owner_id;
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
		uint8_t channel:4;	/* channel number */
Packit Service ed0f68
		uint8_t __reserved:2;
Packit Service ed0f68
		uint8_t lun:2;	/* sensor owner lun */
Packit Service ed0f68
#else
Packit Service ed0f68
		uint8_t lun:2;	/* sensor owner lun */
Packit Service ed0f68
		uint8_t __reserved:2;
Packit Service ed0f68
		uint8_t channel:4;	/* channel number */
Packit Service ed0f68
#endif
Packit Service ed0f68
		uint8_t sensor_num;	/* unique sensor number */
Packit Service ed0f68
	} ATTRIBUTE_PACKING keys;
Packit Service ed0f68
Packit Service ed0f68
	struct entity_id entity;
Packit Service ed0f68
Packit Service ed0f68
	struct {
Packit Service ed0f68
		struct {
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
			uint8_t __reserved:1;
Packit Service ed0f68
			uint8_t scanning:1;
Packit Service ed0f68
			uint8_t events:1;
Packit Service ed0f68
			uint8_t thresholds:1;
Packit Service ed0f68
			uint8_t hysteresis:1;
Packit Service ed0f68
			uint8_t type:1;
Packit Service ed0f68
			uint8_t event_gen:1;
Packit Service ed0f68
			uint8_t sensor_scan:1;
Packit Service ed0f68
#else
Packit Service ed0f68
			uint8_t sensor_scan:1;
Packit Service ed0f68
			uint8_t event_gen:1;
Packit Service ed0f68
			uint8_t type:1;
Packit Service ed0f68
			uint8_t hysteresis:1;
Packit Service ed0f68
			uint8_t thresholds:1;
Packit Service ed0f68
			uint8_t events:1;
Packit Service ed0f68
			uint8_t scanning:1;
Packit Service ed0f68
			uint8_t __reserved:1;
Packit Service ed0f68
#endif
Packit Service ed0f68
		} ATTRIBUTE_PACKING init;
Packit Service ed0f68
		struct {
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
			uint8_t ignore:1;
Packit Service ed0f68
			uint8_t rearm:1;
Packit Service ed0f68
			uint8_t hysteresis:2;
Packit Service ed0f68
			uint8_t threshold:2;
Packit Service ed0f68
			uint8_t event_msg:2;
Packit Service ed0f68
#else
Packit Service ed0f68
			uint8_t event_msg:2;
Packit Service ed0f68
			uint8_t threshold:2;
Packit Service ed0f68
			uint8_t hysteresis:2;
Packit Service ed0f68
			uint8_t rearm:1;
Packit Service ed0f68
			uint8_t ignore:1;
Packit Service ed0f68
#endif
Packit Service ed0f68
		} ATTRIBUTE_PACKING capabilities;
Packit Service ed0f68
		uint8_t type;
Packit Service ed0f68
	} ATTRIBUTE_PACKING sensor;
Packit Service ed0f68
Packit Service ed0f68
	uint8_t event_type;	/* event/reading type code */
Packit Service ed0f68
Packit Service ed0f68
	struct sdr_record_mask mask;
Packit Service ed0f68
Packit Service ed0f68
	struct {
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
		uint8_t analog:2;
Packit Service ed0f68
		uint8_t rate:3;
Packit Service ed0f68
		uint8_t modifier:2;
Packit Service ed0f68
		uint8_t pct:1;
Packit Service ed0f68
#else
Packit Service ed0f68
		uint8_t pct:1;
Packit Service ed0f68
		uint8_t modifier:2;
Packit Service ed0f68
		uint8_t rate:3;
Packit Service ed0f68
		uint8_t analog:2;
Packit Service ed0f68
#endif
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint8_t base;
Packit Service ed0f68
			uint8_t modifier;
Packit Service ed0f68
		} ATTRIBUTE_PACKING type;
Packit Service ed0f68
	} ATTRIBUTE_PACKING unit;
Packit Service ed0f68
} ATTRIBUTE_PACKING;
Packit Service ed0f68
Packit Service ed0f68
/* SDR Record Common Sensor header macros */
Packit Service ed0f68
#define IS_THRESHOLD_SENSOR(s)	((s)->event_type == 1)
Packit Service ed0f68
#define UNITS_ARE_DISCRETE(s)	((s)->unit.analog == 3)
Packit Service ed0f68
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(0)
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(1)
Packit Service ed0f68
#endif
Packit Service ed0f68
struct sdr_record_compact_sensor {
Packit Service ed0f68
	struct sdr_record_common_sensor cmn;
Packit Service ed0f68
	struct {
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
		uint8_t __reserved:2;
Packit Service ed0f68
		uint8_t mod_type:2;
Packit Service ed0f68
		uint8_t count:4;
Packit Service ed0f68
#else
Packit Service ed0f68
		uint8_t count:4;
Packit Service ed0f68
		uint8_t mod_type:2;
Packit Service ed0f68
		uint8_t __reserved:2;
Packit Service ed0f68
#endif
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
		uint8_t entity_inst:1;
Packit Service ed0f68
		uint8_t mod_offset:7;
Packit Service ed0f68
#else
Packit Service ed0f68
		uint8_t mod_offset:7;
Packit Service ed0f68
		uint8_t entity_inst:1;
Packit Service ed0f68
#endif
Packit Service ed0f68
	} ATTRIBUTE_PACKING share;
Packit Service ed0f68
Packit Service ed0f68
	struct {
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint8_t positive;
Packit Service ed0f68
			uint8_t negative;
Packit Service ed0f68
		} ATTRIBUTE_PACKING hysteresis;
Packit Service ed0f68
	} ATTRIBUTE_PACKING threshold;
Packit Service ed0f68
Packit Service ed0f68
	uint8_t __reserved[3];
Packit Service ed0f68
	uint8_t oem;		/* reserved for OEM use */
Packit Service ed0f68
	uint8_t id_code;	/* sensor ID string type/length code */
Packit Service ed0f68
	uint8_t id_string[16];	/* sensor ID string bytes, only if id_code != 0 */
Packit Service ed0f68
} ATTRIBUTE_PACKING;
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(0)
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(1)
Packit Service ed0f68
#endif
Packit Service ed0f68
struct sdr_record_eventonly_sensor {
Packit Service ed0f68
	struct {
Packit Service ed0f68
		uint8_t owner_id;
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
		uint8_t channel:4;	/* channel number */
Packit Service ed0f68
		uint8_t fru_owner:2;	/* fru device owner lun */
Packit Service ed0f68
		uint8_t lun:2;	/* sensor owner lun */
Packit Service ed0f68
#else
Packit Service ed0f68
		uint8_t lun:2;	/* sensor owner lun */
Packit Service ed0f68
		uint8_t fru_owner:2;	/* fru device owner lun */
Packit Service ed0f68
		uint8_t channel:4;	/* channel number */
Packit Service ed0f68
#endif
Packit Service ed0f68
		uint8_t sensor_num;	/* unique sensor number */
Packit Service ed0f68
	} ATTRIBUTE_PACKING keys;
Packit Service ed0f68
Packit Service ed0f68
	struct entity_id entity;
Packit Service ed0f68
Packit Service ed0f68
	uint8_t sensor_type;	/* sensor type */
Packit Service ed0f68
	uint8_t event_type;	/* event/reading type code */
Packit Service ed0f68
Packit Service ed0f68
	struct {
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
		uint8_t __reserved:2;
Packit Service ed0f68
		uint8_t mod_type:2;
Packit Service ed0f68
		uint8_t count:4;
Packit Service ed0f68
#else
Packit Service ed0f68
		uint8_t count:4;
Packit Service ed0f68
		uint8_t mod_type:2;
Packit Service ed0f68
		uint8_t __reserved:2;
Packit Service ed0f68
#endif
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
		uint8_t entity_inst:1;
Packit Service ed0f68
		uint8_t mod_offset:7;
Packit Service ed0f68
#else
Packit Service ed0f68
		uint8_t mod_offset:7;
Packit Service ed0f68
		uint8_t entity_inst:1;
Packit Service ed0f68
#endif
Packit Service ed0f68
	} ATTRIBUTE_PACKING share;
Packit Service ed0f68
Packit Service ed0f68
	uint8_t __reserved;
Packit Service ed0f68
	uint8_t oem;		/* reserved for OEM use */
Packit Service ed0f68
	uint8_t id_code;	/* sensor ID string type/length code */
Packit Service ed0f68
	uint8_t id_string[16];	/* sensor ID string bytes, only if id_code != 0 */
Packit Service ed0f68
Packit Service ed0f68
} ATTRIBUTE_PACKING;
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(0)
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(1)
Packit Service ed0f68
#endif
Packit Service ed0f68
struct sdr_record_full_sensor {
Packit Service ed0f68
	struct sdr_record_common_sensor cmn;
Packit Service ed0f68
Packit Service ed0f68
#define SDR_SENSOR_L_LINEAR     0x00
Packit Service ed0f68
#define SDR_SENSOR_L_LN         0x01
Packit Service ed0f68
#define SDR_SENSOR_L_LOG10      0x02
Packit Service ed0f68
#define SDR_SENSOR_L_LOG2       0x03
Packit Service ed0f68
#define SDR_SENSOR_L_E          0x04
Packit Service ed0f68
#define SDR_SENSOR_L_EXP10      0x05
Packit Service ed0f68
#define SDR_SENSOR_L_EXP2       0x06
Packit Service ed0f68
#define SDR_SENSOR_L_1_X        0x07
Packit Service ed0f68
#define SDR_SENSOR_L_SQR        0x08
Packit Service ed0f68
#define SDR_SENSOR_L_CUBE       0x09
Packit Service ed0f68
#define SDR_SENSOR_L_SQRT       0x0a
Packit Service ed0f68
#define SDR_SENSOR_L_CUBERT     0x0b
Packit Service ed0f68
#define SDR_SENSOR_L_NONLINEAR  0x70
Packit Service ed0f68
Packit Service ed0f68
	uint8_t linearization;	/* 70h=non linear, 71h-7Fh=non linear, OEM */
Packit Service ed0f68
	uint16_t mtol;		/* M, tolerance */
Packit Service ed0f68
	uint32_t bacc;		/* accuracy, B, Bexp, Rexp */
Packit Service ed0f68
Packit Service ed0f68
	struct {
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
		uint8_t __reserved:5;
Packit Service ed0f68
		uint8_t normal_min:1;	/* normal min field specified */
Packit Service ed0f68
		uint8_t normal_max:1;	/* normal max field specified */
Packit Service ed0f68
		uint8_t nominal_read:1;	/* nominal reading field specified */
Packit Service ed0f68
#else
Packit Service ed0f68
		uint8_t nominal_read:1;	/* nominal reading field specified */
Packit Service ed0f68
		uint8_t normal_max:1;	/* normal max field specified */
Packit Service ed0f68
		uint8_t normal_min:1;	/* normal min field specified */
Packit Service ed0f68
		uint8_t __reserved:5;
Packit Service ed0f68
#endif
Packit Service ed0f68
	} ATTRIBUTE_PACKING analog_flag;
Packit Service ed0f68
Packit Service ed0f68
	uint8_t nominal_read;	/* nominal reading, raw value */
Packit Service ed0f68
	uint8_t normal_max;	/* normal maximum, raw value */
Packit Service ed0f68
	uint8_t normal_min;	/* normal minimum, raw value */
Packit Service ed0f68
	uint8_t sensor_max;	/* sensor maximum, raw value */
Packit Service ed0f68
	uint8_t sensor_min;	/* sensor minimum, raw value */
Packit Service ed0f68
Packit Service ed0f68
	struct {
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint8_t non_recover;
Packit Service ed0f68
			uint8_t critical;
Packit Service ed0f68
			uint8_t non_critical;
Packit Service ed0f68
		} ATTRIBUTE_PACKING upper;
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint8_t non_recover;
Packit Service ed0f68
			uint8_t critical;
Packit Service ed0f68
			uint8_t non_critical;
Packit Service ed0f68
		} ATTRIBUTE_PACKING lower;
Packit Service ed0f68
		struct {
Packit Service ed0f68
			uint8_t positive;
Packit Service ed0f68
			uint8_t negative;
Packit Service ed0f68
		} ATTRIBUTE_PACKING hysteresis;
Packit Service ed0f68
	} ATTRIBUTE_PACKING threshold;
Packit Service ed0f68
	uint8_t __reserved[2];
Packit Service ed0f68
	uint8_t oem;		/* reserved for OEM use */
Packit Service ed0f68
	uint8_t id_code;	/* sensor ID string type/length code */
Packit Service ed0f68
	uint8_t id_string[16];	/* sensor ID string bytes, only if id_code != 0 */
Packit Service ed0f68
} ATTRIBUTE_PACKING;
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(0)
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(1)
Packit Service ed0f68
#endif
Packit Service ed0f68
struct sdr_record_mc_locator {
Packit Service ed0f68
	uint8_t dev_slave_addr;
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
	uint8_t __reserved2:4;
Packit Service ed0f68
	uint8_t channel_num:4;
Packit Service ed0f68
#else
Packit Service ed0f68
	uint8_t channel_num:4;
Packit Service ed0f68
	uint8_t __reserved2:4;
Packit Service ed0f68
#endif
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
	uint8_t pwr_state_notif:3;
Packit Service ed0f68
	uint8_t __reserved3:1;
Packit Service ed0f68
	uint8_t global_init:4;
Packit Service ed0f68
#else
Packit Service ed0f68
	uint8_t global_init:4;
Packit Service ed0f68
	uint8_t __reserved3:1;
Packit Service ed0f68
	uint8_t pwr_state_notif:3;
Packit Service ed0f68
#endif
Packit Service ed0f68
	uint8_t dev_support;
Packit Service ed0f68
	uint8_t __reserved4[3];
Packit Service ed0f68
	struct entity_id entity;
Packit Service ed0f68
	uint8_t oem;
Packit Service ed0f68
	uint8_t id_code;
Packit Service ed0f68
	uint8_t id_string[16];
Packit Service ed0f68
} ATTRIBUTE_PACKING;
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(0)
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
struct sdr_record_fru_locator {
Packit Service ed0f68
	uint8_t dev_slave_addr;
Packit Service ed0f68
	uint8_t device_id;
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
	uint8_t logical:1;
Packit Service ed0f68
	uint8_t __reserved2:2;
Packit Service ed0f68
	uint8_t lun:2;
Packit Service ed0f68
	uint8_t bus:3;
Packit Service ed0f68
#else
Packit Service ed0f68
	uint8_t bus:3;
Packit Service ed0f68
	uint8_t lun:2;
Packit Service ed0f68
	uint8_t __reserved2:2;
Packit Service ed0f68
	uint8_t logical:1;
Packit Service ed0f68
#endif
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
	uint8_t channel_num:4;
Packit Service ed0f68
	uint8_t __reserved3:4;
Packit Service ed0f68
#else
Packit Service ed0f68
	uint8_t __reserved3:4;
Packit Service ed0f68
	uint8_t channel_num:4;
Packit Service ed0f68
#endif
Packit Service ed0f68
	uint8_t __reserved4;
Packit Service ed0f68
	uint8_t dev_type;
Packit Service ed0f68
	uint8_t dev_type_modifier;
Packit Service ed0f68
	struct entity_id entity;
Packit Service ed0f68
	uint8_t oem;
Packit Service ed0f68
	uint8_t id_code;
Packit Service ed0f68
	uint8_t id_string[16];
Packit Service ed0f68
} ATTRIBUTE_PACKING;
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(0)
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(1)
Packit Service ed0f68
#endif
Packit Service ed0f68
struct sdr_record_generic_locator {
Packit Service ed0f68
	uint8_t dev_access_addr;
Packit Service ed0f68
	uint8_t dev_slave_addr;
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
	uint8_t channel_num:3;
Packit Service ed0f68
	uint8_t lun:2;
Packit Service ed0f68
	uint8_t bus:3;
Packit Service ed0f68
#else
Packit Service ed0f68
	uint8_t bus:3;
Packit Service ed0f68
	uint8_t lun:2;
Packit Service ed0f68
	uint8_t channel_num:3;
Packit Service ed0f68
#endif
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
	uint8_t addr_span:3;
Packit Service ed0f68
	uint8_t __reserved1:5;
Packit Service ed0f68
#else
Packit Service ed0f68
	uint8_t __reserved1:5;
Packit Service ed0f68
	uint8_t addr_span:3;
Packit Service ed0f68
#endif
Packit Service ed0f68
	uint8_t __reserved2;
Packit Service ed0f68
	uint8_t dev_type;
Packit Service ed0f68
	uint8_t dev_type_modifier;
Packit Service ed0f68
	struct entity_id entity;
Packit Service ed0f68
	uint8_t oem;
Packit Service ed0f68
	uint8_t id_code;
Packit Service ed0f68
	uint8_t id_string[16];
Packit Service ed0f68
} ATTRIBUTE_PACKING;
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(0)
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(1)
Packit Service ed0f68
#endif
Packit Service ed0f68
struct sdr_record_entity_assoc {
Packit Service ed0f68
	struct entity_id entity;	/* container entity ID and instance */
Packit Service ed0f68
	struct {
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
		uint8_t isrange:1;
Packit Service ed0f68
		uint8_t islinked:1;
Packit Service ed0f68
		uint8_t isaccessable:1;
Packit Service ed0f68
		uint8_t __reserved:5;
Packit Service ed0f68
#else
Packit Service ed0f68
		uint8_t __reserved:5;
Packit Service ed0f68
		uint8_t isaccessable:1;
Packit Service ed0f68
		uint8_t islinked:1;
Packit Service ed0f68
		uint8_t isrange:1;
Packit Service ed0f68
#endif
Packit Service ed0f68
	} flags;
Packit Service ed0f68
	uint8_t entity_id_1;	/* entity ID 1    |  range 1 entity */
Packit Service ed0f68
	uint8_t entity_inst_1;	/* entity inst 1  |  range 1 first instance */
Packit Service ed0f68
	uint8_t entity_id_2;	/* entity ID 2    |  range 1 entity */
Packit Service ed0f68
	uint8_t entity_inst_2;	/* entity inst 2  |  range 1 last instance */
Packit Service ed0f68
	uint8_t entity_id_3;	/* entity ID 3    |  range 2 entity */
Packit Service ed0f68
	uint8_t entity_inst_3;	/* entity inst 3  |  range 2 first instance */
Packit Service ed0f68
	uint8_t entity_id_4;	/* entity ID 4    |  range 2 entity */
Packit Service ed0f68
	uint8_t entity_inst_4;	/* entity inst 4  |  range 2 last instance */
Packit Service ed0f68
} ATTRIBUTE_PACKING;
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(0)
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
struct sdr_record_oem {
Packit Service ed0f68
	uint8_t *data;
Packit Service ed0f68
	int data_len;
Packit Service ed0f68
};
Packit Service ed0f68
Packit Service ed0f68
/*
Packit Service ed0f68
 * The Get SDR Repository Info response structure
Packit Service ed0f68
 * From table 33-3 of the IPMI v2.0 spec
Packit Service ed0f68
 */
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(1)
Packit Service ed0f68
#endif
Packit Service ed0f68
struct get_sdr_repository_info_rsp {
Packit Service ed0f68
	uint8_t sdr_version;
Packit Service ed0f68
	uint8_t record_count_lsb;
Packit Service ed0f68
	uint8_t record_count_msb;
Packit Service ed0f68
	uint8_t free_space[2];
Packit Service ed0f68
	uint8_t most_recent_addition_timestamp[4];
Packit Service ed0f68
	uint8_t most_recent_erase_timestamp[4];
Packit Service ed0f68
#if WORDS_BIGENDIAN
Packit Service ed0f68
	uint8_t overflow_flag:1;
Packit Service ed0f68
	uint8_t modal_update_support:2;
Packit Service ed0f68
	uint8_t __reserved1:1;
Packit Service ed0f68
	uint8_t delete_sdr_supported:1;
Packit Service ed0f68
	uint8_t partial_add_sdr_supported:1;
Packit Service ed0f68
	uint8_t reserve_sdr_repository_supported:1;
Packit Service ed0f68
	uint8_t get_sdr_repository_allo_info_supported:1;
Packit Service ed0f68
#else
Packit Service ed0f68
	uint8_t get_sdr_repository_allo_info_supported:1;
Packit Service ed0f68
	uint8_t reserve_sdr_repository_supported:1;
Packit Service ed0f68
	uint8_t partial_add_sdr_supported:1;
Packit Service ed0f68
	uint8_t delete_sdr_supported:1;
Packit Service ed0f68
	uint8_t __reserved1:1;
Packit Service ed0f68
	uint8_t modal_update_support:2;
Packit Service ed0f68
	uint8_t overflow_flag:1;
Packit Service ed0f68
#endif
Packit Service ed0f68
} ATTRIBUTE_PACKING;
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(0)
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
struct ipmi_sdr_iterator {
Packit Service ed0f68
	uint16_t reservation;
Packit Service ed0f68
	int total;
Packit Service ed0f68
	int next;
Packit Service ed0f68
	int use_built_in;
Packit Service ed0f68
};
Packit Service ed0f68
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(1)
Packit Service ed0f68
#endif
Packit Service ed0f68
struct sdr_record_list {
Packit Service ed0f68
	uint16_t id;
Packit Service ed0f68
	uint8_t version;
Packit Service ed0f68
	uint8_t type;
Packit Service ed0f68
	uint8_t length;
Packit Service ed0f68
	uint8_t *raw;
Packit Service ed0f68
	struct sdr_record_list *next;
Packit Service ed0f68
	union {
Packit Service ed0f68
		struct sdr_record_common_sensor *common;
Packit Service ed0f68
		struct sdr_record_full_sensor *full;
Packit Service ed0f68
		struct sdr_record_compact_sensor *compact;
Packit Service ed0f68
		struct sdr_record_eventonly_sensor *eventonly;
Packit Service ed0f68
		struct sdr_record_generic_locator *genloc;
Packit Service ed0f68
		struct sdr_record_fru_locator *fruloc;
Packit Service ed0f68
		struct sdr_record_mc_locator *mcloc;
Packit Service ed0f68
		struct sdr_record_entity_assoc *entassoc;
Packit Service ed0f68
		struct sdr_record_oem *oem;
Packit Service ed0f68
	} ATTRIBUTE_PACKING  record;
Packit Service ed0f68
} ATTRIBUTE_PACKING;
Packit Service ed0f68
#ifdef HAVE_PRAGMA_PACK
Packit Service ed0f68
#pragma pack(0)
Packit Service ed0f68
#endif
Packit Service ed0f68
Packit Service ed0f68
Packit Service ed0f68
/* unit description codes (IPMI v1.5 section 37.16) */
Packit Service ed0f68
#define UNIT_MAX	0x90
Packit Service ed0f68
static const char *unit_desc[] __attribute__ ((unused)) = {
Packit Service ed0f68
"unspecified",
Packit Service ed0f68
	    "degrees C", "degrees F", "degrees K",
Packit Service ed0f68
	    "Volts", "Amps", "Watts", "Joules",
Packit Service ed0f68
	    "Coulombs", "VA", "Nits",
Packit Service ed0f68
	    "lumen", "lux", "Candela",
Packit Service ed0f68
	    "kPa", "PSI", "Newton",
Packit Service ed0f68
	    "CFM", "RPM", "Hz",
Packit Service ed0f68
	    "microsecond", "millisecond", "second", "minute", "hour",
Packit Service ed0f68
	    "day", "week", "mil", "inches", "feet", "cu in", "cu feet",
Packit Service ed0f68
	    "mm", "cm", "m", "cu cm", "cu m", "liters", "fluid ounce",
Packit Service ed0f68
	    "radians", "steradians", "revolutions", "cycles",
Packit Service ed0f68
	    "gravities", "ounce", "pound", "ft-lb", "oz-in", "gauss",
Packit Service ed0f68
	    "gilberts", "henry", "millihenry", "farad", "microfarad",
Packit Service ed0f68
	    "ohms", "siemens", "mole", "becquerel", "PPM", "reserved",
Packit Service ed0f68
	    "Decibels", "DbA", "DbC", "gray", "sievert",
Packit Service ed0f68
	    "color temp deg K", "bit", "kilobit", "megabit", "gigabit",
Packit Service ed0f68
	    "byte", "kilobyte", "megabyte", "gigabyte", "word", "dword",
Packit Service ed0f68
	    "qword", "line", "hit", "miss", "retry", "reset",
Packit Service ed0f68
	    "overflow", "underrun", "collision", "packets", "messages",
Packit Service ed0f68
	    "characters", "error", "correctable error", "uncorrectable error",};
Packit Service ed0f68
Packit Service ed0f68
/* sensor type codes (IPMI v1.5 table 36.3) 
Packit Service ed0f68
  / Updated to v2.0 Table 42-3, Sensor Type Codes */
Packit Service ed0f68
#define SENSOR_TYPE_MAX 0x2C
Packit Service ed0f68
static const char *sensor_type_desc[] __attribute__ ((unused)) = {
Packit Service ed0f68
"reserved",
Packit Service ed0f68
	    "Temperature", "Voltage", "Current", "Fan",
Packit Service ed0f68
	    "Physical Security", "Platform Security", "Processor",
Packit Service ed0f68
	    "Power Supply", "Power Unit", "Cooling Device", "Other",
Packit Service ed0f68
	    "Memory", "Drive Slot / Bay", "POST Memory Resize",
Packit Service ed0f68
	    "System Firmwares", "Event Logging Disabled", "Watchdog1",
Packit Service ed0f68
	    "System Event", "Critical Interrupt", "Button",
Packit Service ed0f68
	    "Module / Board", "Microcontroller", "Add-in Card",
Packit Service ed0f68
	    "Chassis", "Chip Set", "Other FRU", "Cable / Interconnect",
Packit Service ed0f68
	    "Terminator", "System Boot Initiated", "Boot Error",
Packit Service ed0f68
	    "OS Boot", "OS Critical Stop", "Slot / Connector",
Packit Service ed0f68
	    "System ACPI Power State", "Watchdog2", "Platform Alert",
Packit Service ed0f68
	    "Entity Presence", "Monitor ASIC", "LAN",
Packit Service ed0f68
	    "Management Subsys Health", "Battery", "Session Audit",
Packit Service ed0f68
	    "Version Change", "FRU State" };
Packit Service ed0f68
Packit Service ed0f68
struct sensor_reading {
Packit Service cd7cb0
	char		s_id[33];		/* name of the sensor */
Packit Service ed0f68
	struct sdr_record_full_sensor    *full;
Packit Service ed0f68
	struct sdr_record_compact_sensor *compact;
Packit Service ed0f68
	uint8_t		s_reading_valid;	/* read value valididity */
Packit Service ed0f68
	uint8_t		s_scanning_disabled;	/* read of value disabled */
Packit Service ed0f68
	uint8_t		s_reading_unavailable;	/* read value unavailable */
Packit Service ed0f68
	uint8_t		s_reading;		/* value which was read */
Packit Service ed0f68
	uint8_t		s_data2;		/* data2 value read */
Packit Service ed0f68
	uint8_t		s_data3;		/* data3 value read */
Packit Service ed0f68
	uint8_t		s_has_analog_value;	/* sensor has analog value */
Packit Service ed0f68
	double		s_a_val;		/* read value converted to analog */
Packit Service ed0f68
	char		s_a_str[16];		/* analog value as a string */
Packit Service ed0f68
	const char	*s_a_units;		/* analog value units string */
Packit Service ed0f68
};
Packit Service ed0f68
Packit Service ed0f68
/*
Packit Service ed0f68
 * Determine if bridging is necessary to address a sensor at the given
Packit Service ed0f68
 * address (_addr) and (_chan) via the interface (_intf).
Packit Service ed0f68
 *
Packit Service ed0f68
 * If the sensor is being addressed on channel zero, it resides on
Packit Service ed0f68
 * IPMB-0.  If the interface target IPMB-0 address is exactly the same as
Packit Service ed0f68
 * the sensor address then the sensor resides on the target IPMB-0
Packit Service ed0f68
 * so we don't need extra levels of bridging to address  the sensor.
Packit Service ed0f68
 *	Or
Packit Service ed0f68
 * If the sensor target address and channel match the interface target address
Packit Service ed0f68
 * and channel then there is no extra levels of bridging required.
Packit Service ed0f68
 *
Packit Service ed0f68
 * Note:
Packit Service ed0f68
 *	The target IPMB-0 address is the address of the SDR repository that was
Packit Service ed0f68
 *	accessed using the user specified bridging command line arguments.
Packit Service ed0f68
 *	Access to any sensor on the target IPMB-0 can be addressed using the
Packit Service ed0f68
 *	target address and transit address in the interface.
Packit Service ed0f68
 */
Packit Service ed0f68
#define BRIDGE_TO_SENSOR(_intf, _addr, _chan)			\
Packit Service ed0f68
 ( !((_chan == 0 && _intf->target_ipmb_addr &&			\
Packit Service ed0f68
			     _intf->target_ipmb_addr == _addr)  ||	\
Packit Service ed0f68
    (_addr == _intf->target_addr && _chan == _intf->target_channel)) )
Packit Service ed0f68
Packit Service ed0f68
Packit Service ed0f68
struct ipmi_sdr_iterator *ipmi_sdr_start(struct ipmi_intf *intf,
Packit Service ed0f68
                                         int use_builtin);
Packit Service ed0f68
struct sdr_get_rs *ipmi_sdr_get_next_header(struct ipmi_intf *intf,
Packit Service ed0f68
					    struct ipmi_sdr_iterator *i);
Packit Service ed0f68
uint8_t *ipmi_sdr_get_record(struct ipmi_intf *intf, struct sdr_get_rs *header,
Packit Service ed0f68
			     struct ipmi_sdr_iterator *i);
Packit Service ed0f68
void ipmi_sdr_end(struct ipmi_intf *intf, struct ipmi_sdr_iterator *i);
Packit Service ed0f68
int ipmi_sdr_print_sdr(struct ipmi_intf *intf, uint8_t type);
Packit Service ed0f68
Packit Service ed0f68
int ipmi_sdr_print_name_from_rawentry(struct ipmi_intf *intf,uint16_t id,
Packit Service ed0f68
                                      uint8_t type,uint8_t * raw);
Packit Service ed0f68
int ipmi_sdr_print_rawentry(struct ipmi_intf *intf, uint8_t type, uint8_t * raw,
Packit Service ed0f68
			    int len);
Packit Service ed0f68
int ipmi_sdr_print_listentry(struct ipmi_intf *intf,
Packit Service ed0f68
			     struct sdr_record_list *entry);
Packit Service ed0f68
void ipmi_sdr_print_sensor_hysteresis(struct sdr_record_common_sensor *sensor,
Packit Service ed0f68
		 struct sdr_record_full_sensor   *full,
Packit Service ed0f68
		 uint8_t hysteresis_value,
Packit Service ed0f68
		 const char *hdrstr);
Packit Service ed0f68
const char *ipmi_sdr_get_unit_string(uint8_t pct, uint8_t type,
Packit Service ed0f68
				      uint8_t base, uint8_t modifier);
Packit Service ed0f68
struct sensor_reading *
Packit Service ed0f68
ipmi_sdr_read_sensor_value(struct ipmi_intf *intf,
Packit Service ed0f68
		struct sdr_record_common_sensor *sensor,
Packit Service ed0f68
		uint8_t sdr_record_type, int precision);
Packit Service ed0f68
const char *ipmi_sdr_get_thresh_status(struct sensor_reading *sr,
Packit Service ed0f68
					const char *invalidstr);
Packit Service ed0f68
const char *ipmi_sdr_get_status(int, const char *, uint8_t stat);
Packit Service ed0f68
double sdr_convert_sensor_tolerance(struct sdr_record_full_sensor *sensor,
Packit Service ed0f68
				  uint8_t val);
Packit Service ed0f68
double sdr_convert_sensor_reading(struct sdr_record_full_sensor *sensor,
Packit Service ed0f68
				  uint8_t val);
Packit Service ed0f68
double sdr_convert_sensor_hysterisis(struct sdr_record_full_sensor *sensor,
Packit Service ed0f68
				  uint8_t val);
Packit Service ed0f68
uint8_t sdr_convert_sensor_value_to_raw(struct sdr_record_full_sensor *sensor,
Packit Service ed0f68
					double val);
Packit Service ed0f68
struct ipmi_rs *ipmi_sdr_get_sensor_reading(struct ipmi_intf *intf,
Packit Service ed0f68
					    uint8_t sensor);
Packit Service ed0f68
struct ipmi_rs *ipmi_sdr_get_sensor_reading_ipmb(struct ipmi_intf *intf,
Packit Service ed0f68
						 uint8_t sensor,
Packit Service ed0f68
						 uint8_t target,
Packit Service ed0f68
						 uint8_t lun,
Packit Service ed0f68
						 uint8_t channel);
Packit Service ed0f68
struct ipmi_rs *ipmi_sdr_get_sensor_thresholds(struct ipmi_intf *intf,
Packit Service ed0f68
					       uint8_t sensor,
Packit Service ed0f68
					       uint8_t target, uint8_t lun, uint8_t channel);
Packit Service ed0f68
struct ipmi_rs *ipmi_sdr_get_sensor_hysteresis(struct ipmi_intf *intf,
Packit Service ed0f68
					       uint8_t sensor,
Packit Service ed0f68
					       uint8_t target, uint8_t lun, uint8_t channel);
Packit Service ed0f68
int ipmi_sdr_get_reservation(struct ipmi_intf *intf, int use_builtin,
Packit Service ed0f68
                             uint16_t * reserve_id);
Packit Service ed0f68
Packit Service ed0f68
int ipmi_sdr_print_sensor_eventonly(struct ipmi_intf *intf,
Packit Service ed0f68
				    struct sdr_record_eventonly_sensor *sensor);
Packit Service ed0f68
int ipmi_sdr_print_sensor_generic_locator(struct ipmi_intf *intf,
Packit Service ed0f68
					  struct sdr_record_generic_locator
Packit Service ed0f68
					  *fru);
Packit Service ed0f68
int ipmi_sdr_print_sensor_fru_locator(struct ipmi_intf *intf,
Packit Service ed0f68
				      struct sdr_record_fru_locator *fru);
Packit Service ed0f68
int ipmi_sdr_print_sensor_mc_locator(struct ipmi_intf *intf,
Packit Service ed0f68
				     struct sdr_record_mc_locator *mc);
Packit Service ed0f68
int ipmi_sdr_print_sensor_entity_assoc(struct ipmi_intf *intf,
Packit Service ed0f68
				       struct sdr_record_entity_assoc *assoc);
Packit Service ed0f68
Packit Service ed0f68
struct sdr_record_list *ipmi_sdr_find_sdr_byentity(struct ipmi_intf *intf,
Packit Service ed0f68
						   struct entity_id *entity);
Packit Service ed0f68
struct sdr_record_list *ipmi_sdr_find_sdr_bynumtype(struct ipmi_intf *intf,
Packit Service ed0f68
					uint16_t gen_id, uint8_t num, uint8_t type);
Packit Service ed0f68
struct sdr_record_list *ipmi_sdr_find_sdr_bysensortype(struct ipmi_intf *intf,
Packit Service ed0f68
						       uint8_t type);
Packit Service ed0f68
struct sdr_record_list *ipmi_sdr_find_sdr_byid(struct ipmi_intf *intf,
Packit Service ed0f68
					       char *id);
Packit Service ed0f68
struct sdr_record_list *ipmi_sdr_find_sdr_bytype(struct ipmi_intf *intf,
Packit Service ed0f68
						 uint8_t type);
Packit Service ed0f68
int ipmi_sdr_list_cache(struct ipmi_intf *intf);
Packit Service ed0f68
int ipmi_sdr_list_cache_fromfile(struct ipmi_intf *intf, const char *ifile);
Packit Service ed0f68
void ipmi_sdr_list_empty(struct ipmi_intf *intf);
Packit Service ed0f68
int ipmi_sdr_print_info(struct ipmi_intf *intf);
Packit Service ed0f68
void ipmi_sdr_print_discrete_state(struct ipmi_intf *intf,
Packit Service ed0f68
				const char *desc, uint8_t sensor_type,
Packit Service ed0f68
				uint8_t event_type, uint8_t state1,
Packit Service ed0f68
				uint8_t state2);
Packit Service ed0f68
void ipmi_sdr_print_discrete_state_mini(struct ipmi_intf *intf,
Packit Service ed0f68
					const char *header, const char *separator,
Packit Service ed0f68
					uint8_t sensor_type, uint8_t event_type,
Packit Service ed0f68
					uint8_t state1, uint8_t state2);
Packit Service ed0f68
int ipmi_sdr_print_sensor_event_status(struct ipmi_intf *intf,
Packit Service ed0f68
				       uint8_t sensor_num, uint8_t sensor_type,
Packit Service ed0f68
				       uint8_t event_type, int numeric_fmt,
Packit Service ed0f68
				       uint8_t target, uint8_t lun, uint8_t channel);
Packit Service ed0f68
int ipmi_sdr_print_sensor_event_enable(struct ipmi_intf *intf,
Packit Service ed0f68
				       uint8_t sensor_num, uint8_t sensor_type,
Packit Service ed0f68
				       uint8_t event_type, int numeric_fmt,
Packit Service ed0f68
				       uint8_t target, uint8_t lun, uint8_t channel);
Packit Service ed0f68
Packit Service ed0f68
#endif				/* IPMI_SDR_H */