diff --git a/ipmitool/include/ipmitool/ipmi_sdr.h b/ipmitool/include/ipmitool/ipmi_sdr.h index 4ed3003..f946e0e 100644 --- a/ipmitool/include/ipmitool/ipmi_sdr.h +++ b/ipmitool/include/ipmitool/ipmi_sdr.h @@ -93,12 +93,18 @@ enum { #define SDR_SENSOR_STAT_HI_NR (1<<5) #define GET_SENSOR_FACTORS 0x23 -#define GET_SENSOR_THRES 0x27 +#define GET_SENSOR_FACTORS 0x23 +#define SET_SENSOR_HYSTERESIS 0x24 +#define GET_SENSOR_HYSTERESIS 0x25 +#define SET_SENSOR_THRESHOLDS 0x26 +#define GET_SENSOR_THRESHOLDS 0x27 #define SET_SENSOR_EVENT_ENABLE 0x28 #define GET_SENSOR_EVENT_ENABLE 0x29 #define GET_SENSOR_EVENT_STATUS 0x2b #define GET_SENSOR_READING 0x2d #define GET_SENSOR_TYPE 0x2f +#define GET_SENSOR_READING 0x2d +#define GET_SENSOR_TYPE 0x2f struct sdr_repo_info_rs { uint8_t version; /* SDR version (51h) */ @@ -787,6 +793,8 @@ double sdr_convert_sensor_reading(struct sdr_record_full_sensor * sensor, uint8_ uint8_t sdr_convert_sensor_value_to_raw(struct sdr_record_full_sensor * sensor, double val); struct ipmi_rs * ipmi_sdr_get_sensor_reading(struct ipmi_intf * intf, uint8_t sensor); struct ipmi_rs * ipmi_sdr_get_sensor_reading_ipmb(struct ipmi_intf * intf, uint8_t sensor, uint8_t target); +struct ipmi_rs * ipmi_sdr_get_sensor_thresholds(struct ipmi_intf * intf, uint8_t sensor); +struct ipmi_rs * ipmi_sdr_get_sensor_hysteresis(struct ipmi_intf * intf, uint8_t sensor); const char * ipmi_sdr_get_sensor_type_desc(const uint8_t type); int ipmi_sdr_get_reservation(struct ipmi_intf * intf, uint16_t *reserve_id); @@ -809,6 +817,7 @@ int ipmi_sdr_list_cache_fromfile(struct ipmi_intf * intf, const char * ifile); void ipmi_sdr_list_empty(struct ipmi_intf * intf); int ipmi_sdr_print_info(struct ipmi_intf * intf); void ipmi_sdr_print_discrete_state(const char * desc, uint8_t sensor_type, uint8_t event_type, uint8_t state1, uint8_t state2); +void ipmi_sdr_print_discrete_state_mini(const char * separator, uint8_t sensor_type, uint8_t event_type, uint8_t state1, uint8_t state2); int ipmi_sdr_print_sensor_event_status(struct ipmi_intf * intf, uint8_t sensor_num, uint8_t sensor_type, uint8_t event_type, int numeric_fmt); int ipmi_sdr_print_sensor_event_enable(struct ipmi_intf * intf, uint8_t sensor_num, uint8_t sensor_type, uint8_t event_type, int numeric_fmt); diff --git a/ipmitool/include/ipmitool/ipmi_sensor.h b/ipmitool/include/ipmitool/ipmi_sensor.h index ca5d196..0e64155 100644 --- a/ipmitool/include/ipmitool/ipmi_sensor.h +++ b/ipmitool/include/ipmitool/ipmi_sensor.h @@ -42,13 +42,6 @@ #include #include -/* ipmi sensor commands */ -#define GET_SENSOR_READING 0x2d -#define GET_SENSOR_FACTORS 0x23 -#define SET_SENSOR_THRESHOLDS 0x26 -#define GET_SENSOR_THRESHOLDS 0x27 -#define GET_SENSOR_TYPE 0x2f - /* threshold specification bits for analog sensors for get sensor threshold command * and set sensor threshold command */ diff --git a/ipmitool/lib/ipmi_sdr.c b/ipmitool/lib/ipmi_sdr.c index 9f33ae8..bf5da41 100644 --- a/ipmitool/lib/ipmi_sdr.c +++ b/ipmitool/lib/ipmi_sdr.c @@ -81,6 +81,14 @@ utos(uint32_t val, int bits) return val; } +/* ipmi_sdr_get_unit_string - return units for base/modifier + * + * @type: unit type + * @base: base + * @modifier: modifier + * + * returns pointer to static string + */ char * ipmi_sdr_get_unit_string(uint8_t type, uint8_t base, uint8_t modifier) { @@ -222,6 +230,53 @@ sdr_convert_sensor_value_to_raw(struct sdr_record_full_sensor * sensor, return (uint8_t)result; } + +/* ipmi_sdr_get_sensor_thresholds - return thresholds for sensor + * + * @intf: ipmi interface + * @sensor: sensor number + * + * returns pointer to ipmi response + */ +struct ipmi_rs * +ipmi_sdr_get_sensor_thresholds(struct ipmi_intf * intf, uint8_t sensor) +{ + struct ipmi_rq req; + + memset(&req, 0, sizeof(req)); + req.msg.netfn = IPMI_NETFN_SE; + req.msg.cmd = GET_SENSOR_THRESHOLDS; + req.msg.data = &sensor; + req.msg.data_len = sizeof(sensor); + + return intf->sendrecv(intf, &req); +} + +/* ipmi_sdr_get_sensor_hysteresis - return hysteresis for sensor + * + * @intf: ipmi interface + * @sensor: sensor number + * + * returns pointer to ipmi response + */ +struct ipmi_rs * +ipmi_sdr_get_sensor_hysteresis(struct ipmi_intf * intf, uint8_t sensor) +{ + struct ipmi_rq req; + uint8_t rqdata[2]; + + rqdata[0] = sensor; + rqdata[1] = 0xff; /* reserved */ + + memset(&req, 0, sizeof(req)); + req.msg.netfn = IPMI_NETFN_SE; + req.msg.cmd = GET_SENSOR_HYSTERESIS; + req.msg.data = rqdata; + req.msg.data_len = 2; + + return intf->sendrecv(intf, &req); +} + /* ipmi_sdr_get_sensor_reading - retrieve a raw sensor reading * * @intf: ipmi interface @@ -1151,6 +1206,20 @@ ipmi_sdr_print_sensor_full(struct ipmi_intf * intf, SENSOR_PRINT_THRESH("Lower critical", lower.critical, lcr); SENSOR_PRINT_THRESH("Lower non-critical", lower.non_critical, lnc); + min_reading = (uint8_t)sdr_convert_sensor_reading( + sensor, sensor->threshold.hysteresis.positive); + if (min_reading == 0 || min_reading == 0xff) + printf(" Positive Hysteresis : Unspecified\n"); + else + printf(" Positive Hysteresis : %.3f\n", (double)min_reading); + + min_reading = (uint8_t)sdr_convert_sensor_reading( + sensor, sensor->threshold.hysteresis.negative); + if (min_reading == 0 || min_reading == 0xff) + printf(" Negative Hysteresis : Unspecified\n"); + else + printf(" Negative Hysteresis : %.3f\n", (double)min_reading); + min_reading = (uint8_t)sdr_convert_sensor_reading( sensor, sensor->sensor_min); if ((sensor->unit.analog == 0 && sensor->sensor_min == 0x00) || @@ -1300,9 +1369,10 @@ get_offset(uint8_t x) * * no meaningful return value */ -static void ipmi_sdr_print_discrete_state_mini( - uint8_t sensor_type, uint8_t event_type, - uint8_t state1, uint8_t state2) +void ipmi_sdr_print_discrete_state_mini( + const char * separator, + uint8_t sensor_type, uint8_t event_type, + uint8_t state1, uint8_t state2) { uint8_t typ; struct ipmi_event_sensor_types *evt; @@ -1326,14 +1396,14 @@ static void ipmi_sdr_print_discrete_state_mini( if (evt->offset > 7) { if ((1<<(evt->offset-8)) & state2) { if (pre++ != 0) - printf(", "); - printf("%s ", evt->desc); + printf("%s", separator); + printf("%s", evt->desc); } } else { if ((1<offset) & state1) { if (pre++ != 0) - printf(", "); - printf("%s ", evt->desc); + printf("%s", separator); + printf("%s", evt->desc); } } c++; @@ -1555,7 +1625,8 @@ ipmi_sdr_print_sensor_compact(struct ipmi_intf * intf, } if (dostate) - ipmi_sdr_print_discrete_state_mini(sensor->sensor.type, + ipmi_sdr_print_discrete_state_mini(", ", + sensor->sensor.type, sensor->event_type, rsp->data[2], rsp->data[3]); @@ -3615,7 +3686,6 @@ ipmi_sdr_print_type(struct ipmi_intf * intf, char * type) } - /* ipmi_sdr_print_entity - print entity's for an id/instance * * @intf: ipmi interface @@ -3666,6 +3736,46 @@ ipmi_sdr_print_entity(struct ipmi_intf * intf, char * entitystr) return rc; } + +/* ipmi_sdr_print_entry_byid - print sdr entries identified by sensor id + * + * @intf: ipmi interface + * @argc: number of entries to print + * @argv: list of sensor ids + * + * returns 0 on success + * returns -1 on error + */ +static int +ipmi_sdr_print_entry_byid(struct ipmi_intf * intf, int argc, char ** argv) +{ + struct sdr_record_list * sdr; + int rc = 0; + int v, i; + + if (argc < 1) { + lprintf(LOG_ERR, "No Sensor ID supplied"); + return -1; + } + + v = verbose; + verbose = 1; + + for (i=0; i"); diff --git a/ipmitool/lib/ipmi_sensor.c b/ipmitool/lib/ipmi_sensor.c index 0927777..1d3dcac 100644 --- a/ipmitool/lib/ipmi_sensor.c +++ b/ipmitool/lib/ipmi_sensor.c @@ -49,21 +49,6 @@ extern int verbose; #define READING_UNAVAILABLE 0x20 -static -struct ipmi_rs * -ipmi_sensor_get_sensor_thresholds(struct ipmi_intf * intf, uint8_t sensor) -{ - struct ipmi_rq req; - - memset(&req, 0, sizeof(req)); - req.msg.netfn = IPMI_NETFN_SE; - req.msg.cmd = GET_SENSOR_THRESHOLDS; - req.msg.data = &sensor; - req.msg.data_len = sizeof(sensor); - - return intf->sendrecv(intf, &req); -} - static struct ipmi_rs * ipmi_sensor_set_sensor_thresholds(struct ipmi_intf * intf, @@ -248,7 +233,7 @@ ipmi_sensor_print_full_analog(struct ipmi_intf * intf, /* * Get sensor thresholds */ - rsp = ipmi_sensor_get_sensor_thresholds(intf, sensor->keys.sensor_num); + rsp = ipmi_sdr_get_sensor_thresholds(intf, sensor->keys.sensor_num); if (rsp == NULL) thresh_available = 0;