246
_ipmi_event_get_generating_mc(ipmi_domain_t *domain,
248
const ipmi_event_t *event)
250
ipmi_ipmb_addr_t addr;
251
const unsigned char *data;
252
unsigned int type = ipmi_event_get_type(event);
255
/* It's not a standard IPMI event. */
258
data = ipmi_event_get_data_ptr(event);
259
addr.addr_type = IPMI_IPMB_ADDR_TYPE;
260
/* See if the MC has an OEM handler for this. */
261
if (data[6] == 0x03) {
264
addr.channel = data[5] >> 4;
266
if ((data[4] & 0x01) == 0) {
267
addr.slave_addr = data[4];
269
/* A software ID, assume it comes from the MC where we go it. */
272
ipmi_mc_get_ipmi_address(sel_mc, &iaddr, NULL);
273
addr.slave_addr = ipmi_addr_get_slave_addr(&iaddr);
274
if (addr.slave_addr == 0)
275
/* A system interface, just assume it's the BMC. */
276
addr.slave_addr = 0x20;
282
return _ipmi_find_mc_by_addr(domain, (ipmi_addr_t *) &addr, sizeof(addr));
286
ipmi_event_get_generating_sensor_id(ipmi_domain_t *domain,
288
const ipmi_event_t *event)
292
const unsigned char *data;
293
unsigned int type = ipmi_event_get_type(event);
297
/* It's not a standard IPMI event. */
300
mc = _ipmi_event_get_generating_mc(domain, sel_mc, event);
304
data = ipmi_event_get_data_ptr(event);
305
id.mcid = ipmi_mc_convert_to_id(mc);
306
id.lun = data[5] & 0x3;
307
id.sensor_num = data[8];
314
ipmi_sensor_id_set_invalid(&id);
318
struct ipmi_event_handlers_s
320
ipmi_sensor_threshold_event_cb threshold;
321
ipmi_sensor_discrete_event_cb discrete;
324
ipmi_event_handlers_t *
325
ipmi_event_handlers_alloc(void)
327
ipmi_event_handlers_t *rv;
328
rv = ipmi_mem_alloc(sizeof(*rv));
331
memset(rv, 0, sizeof(*rv));
336
ipmi_event_handlers_free(ipmi_event_handlers_t *handlers)
338
ipmi_mem_free(handlers);
342
ipmi_event_handlers_set_threshold(ipmi_event_handlers_t *handlers,
343
ipmi_sensor_threshold_event_cb handler)
345
handlers->threshold = handler;
349
ipmi_event_handlers_set_discrete(ipmi_event_handlers_t *handlers,
350
ipmi_sensor_discrete_event_cb handler)
352
handlers->discrete = handler;
355
typedef struct event_call_handlers_s
357
ipmi_domain_t *domain;
358
ipmi_event_handlers_t *handlers;
362
} event_call_handlers_t;
365
sensor_event_call(ipmi_sensor_t *sensor, void *cb_data)
367
event_call_handlers_t *info = cb_data;
370
if (ipmi_sensor_get_event_reading_type(sensor)
371
== IPMI_EVENT_READING_TYPE_THRESHOLD)
373
enum ipmi_event_dir_e dir;
374
enum ipmi_thresh_e threshold;
375
enum ipmi_event_value_dir_e high_low;
376
enum ipmi_value_present_e value_present;
377
unsigned int raw_value;
379
const unsigned char *data;
381
data = ipmi_event_get_data_ptr(info->event);
383
threshold = (data[10] >> 1) & 0x07;
384
high_low = data[10] & 1;
385
raw_value = data[11];
388
if ((data[10] >> 6) == 2) {
389
rv = ipmi_sensor_convert_from_raw(sensor, raw_value, &value);
391
value_present = IPMI_RAW_VALUE_PRESENT;
393
value_present = IPMI_BOTH_VALUES_PRESENT;
395
value_present = IPMI_NO_VALUES_PRESENT;
397
if (info->handlers->threshold)
398
info->handlers->threshold(sensor, dir,
409
enum ipmi_event_dir_e dir;
412
int prev_severity = 0;
413
const unsigned char *data;
415
data = ipmi_event_get_data_ptr(info->event);
417
offset = data[10] & 0x0f;
418
if ((data[10] >> 6) == 2) {
419
severity = data[11] >> 4;
420
prev_severity = data[11] & 0xf;
423
if (prev_severity == 0xf)
427
if (info->handlers->discrete)
428
info->handlers->discrete(sensor, dir, offset,
439
sel_mc_handler(ipmi_mc_t *mc, void *cb_data)
441
ipmi_sensor_id_t sensor_id;
442
event_call_handlers_t *info = cb_data;
445
sensor_id = ipmi_event_get_generating_sensor_id(info->domain, mc,
447
rv = ipmi_sensor_pointer_cb(sensor_id, sensor_event_call, info);
453
ipmi_event_call_handler(ipmi_domain_t *domain,
454
ipmi_event_handlers_t *handlers,
460
ipmi_sensor_id_t sensor_id;
461
event_call_handlers_t info;
465
info.domain = domain;
466
info.handlers = handlers;
469
info.cb_data = cb_data;
471
/* We try first to get the MC the event is stored in. If that
472
doesn't work, then just attempt to do the sensor without an MC. */
473
mc_id = ipmi_event_get_mcid(event);
474
if (ipmi_mc_pointer_cb(mc_id, sel_mc_handler, &info) != 0) {
475
sensor_id = ipmi_event_get_generating_sensor_id(domain, NULL, event);
476
rv = ipmi_sensor_pointer_cb(sensor_id, sensor_event_call, &info);