Esempio n. 1
0
static int insert_events_to_ipmi_event_state(
		ipmi_sensor_t		*sensor,
		ipmi_event_state_t	*state,
		SaHpiEventStateT	a_mask,
		SaHpiEventStateT	d_mask,
		unsigned int		a_sup,
		unsigned int		d_sup)
{
	int i;  

	if (ipmi_sensor_get_event_support(sensor) !=
			IPMI_EVENT_SUPPORT_PER_STATE) {
		return 0;
	}

	if (ipmi_sensor_get_event_reading_type(sensor) !=
			IPMI_EVENT_READING_TYPE_THRESHOLD) {
		// discrete sensor. map states 1:1
		if ((a_mask &~a_sup) || (d_mask & ~d_sup)) {
			return 1;
		}
		for (i = 0; i < 15; i++) {
			if (a_mask & (1 << i)) {
				ipmi_discrete_event_set(state, i,
					IPMI_ASSERTION);
			}
			if (d_mask & (1 << i)) {
				ipmi_discrete_event_set(state, i,
					IPMI_DEASSERTION);
			}
		}
		return 0;
	}

	// threhold sensor;
		// set assertion mask
	if (a_mask & SAHPI_ES_LOWER_MINOR) {
		if (a_sup & OHOI_THS_LMINL) {
			ipmi_threshold_event_set(state, IPMI_LOWER_NON_CRITICAL,
				IPMI_GOING_LOW, IPMI_ASSERTION);
		} else if (d_sup & OHOI_THS_LMINH) {
			ipmi_threshold_event_set(state, IPMI_LOWER_NON_CRITICAL,
				IPMI_GOING_HIGH, IPMI_DEASSERTION);
		} else {
			return 1;
		}
	}

	if (a_mask & SAHPI_ES_LOWER_MAJOR) {
		if (a_sup & OHOI_THS_LMAJL) {
			ipmi_threshold_event_set(state, IPMI_LOWER_CRITICAL,
				IPMI_GOING_LOW, IPMI_ASSERTION);
		} else if (d_sup & OHOI_THS_LMAJH) {
			ipmi_threshold_event_set(state, IPMI_LOWER_CRITICAL,
				IPMI_GOING_HIGH, IPMI_DEASSERTION);
		} else {
			return 1;
		}
	}

	if (a_mask & SAHPI_ES_LOWER_CRIT) {
		if (a_sup & OHOI_THS_LCRTL) {
			ipmi_threshold_event_set(state,
				IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_LOW,
				IPMI_ASSERTION);
		} else if (d_sup & OHOI_THS_LCRTH) {
			ipmi_threshold_event_set(state,
				IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_HIGH,
				IPMI_DEASSERTION);
		} else {
			return 1;
		}
	}


	if (a_mask & SAHPI_ES_UPPER_MINOR) {
		if (a_sup & OHOI_THS_UMINH) {
			ipmi_threshold_event_set(state,
				IPMI_UPPER_NON_CRITICAL, IPMI_GOING_HIGH,
				IPMI_ASSERTION);
		} else if (d_sup & OHOI_THS_UMINL) {
			ipmi_threshold_event_set(state,
				IPMI_UPPER_NON_CRITICAL, IPMI_GOING_LOW,
				IPMI_DEASSERTION);
		} else {
			return 1;
		}
	}

	if (a_mask & SAHPI_ES_UPPER_MAJOR) {
		if (a_sup & OHOI_THS_UMAJH) {
			ipmi_threshold_event_set(state, IPMI_UPPER_CRITICAL,
				IPMI_GOING_HIGH, IPMI_ASSERTION);
		} else if (d_sup & OHOI_THS_UMAJL) {
			ipmi_threshold_event_set(state, IPMI_UPPER_CRITICAL,
				IPMI_GOING_LOW, IPMI_DEASSERTION);
		} else {
			return 1;
		}
	}

	if (a_mask & SAHPI_ES_UPPER_CRIT) {
		if (a_sup & OHOI_THS_UCRTH) {
			ipmi_threshold_event_set(state,
				IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_HIGH,
				IPMI_ASSERTION);
		} else if (d_sup & OHOI_THS_UCRTL) {
			ipmi_threshold_event_set(state, IPMI_GOING_LOW,
				IPMI_UPPER_NON_RECOVERABLE, IPMI_DEASSERTION);
		} else {
			return 1;
		}
	}

		// set deassertion mask
	if (d_mask & SAHPI_ES_LOWER_MINOR) {
		if (d_sup & OHOI_THS_LMINL) {
			ipmi_threshold_event_set(state,
				IPMI_LOWER_NON_CRITICAL, IPMI_GOING_LOW,
				IPMI_DEASSERTION);
		} else if (a_sup & OHOI_THS_LMINH) {
			ipmi_threshold_event_set(state,
				IPMI_LOWER_NON_CRITICAL, IPMI_GOING_HIGH,
				IPMI_ASSERTION);
		} else {
			return 1;
		}
	}

	if (d_mask & SAHPI_ES_LOWER_MAJOR) {
		if (d_sup & OHOI_THS_LMAJL) {
			ipmi_threshold_event_set(state,
				IPMI_LOWER_CRITICAL, IPMI_GOING_LOW,
				IPMI_DEASSERTION);
		} else if (a_sup & OHOI_THS_LMAJH) {
			ipmi_threshold_event_set(state, IPMI_GOING_HIGH,
				IPMI_LOWER_CRITICAL, IPMI_ASSERTION);
		} else {
			return 1;
		}
	}

	if (d_mask & SAHPI_ES_LOWER_CRIT) {
		if (d_sup & OHOI_THS_LCRTL) {
			ipmi_threshold_event_set(state,
				IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_LOW,
				IPMI_DEASSERTION);
		} else if (a_sup & OHOI_THS_LCRTH) {
			ipmi_threshold_event_set(state,
				IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_HIGH,
				IPMI_ASSERTION);
		} else {
			return 1;
		}
	}


	if (d_mask & SAHPI_ES_UPPER_MINOR) {
		if (d_sup & OHOI_THS_UMINH) {
			ipmi_threshold_event_set(state,
				IPMI_UPPER_NON_CRITICAL, IPMI_GOING_HIGH,
				IPMI_DEASSERTION);
		} else if (a_sup & OHOI_THS_UMINL) {
			ipmi_threshold_event_set(state,
				IPMI_UPPER_NON_CRITICAL, IPMI_GOING_LOW,
				IPMI_ASSERTION);
		} else {
			return 1;
		}
	}

	if (d_mask & SAHPI_ES_UPPER_MAJOR) {
		if (d_sup & OHOI_THS_UMAJH) {
			ipmi_threshold_event_set(state,
				IPMI_UPPER_CRITICAL, IPMI_GOING_HIGH,
				IPMI_DEASSERTION);
		} else if (a_sup & OHOI_THS_UMAJL) {
			ipmi_threshold_event_set(state, IPMI_GOING_LOW,
				IPMI_UPPER_CRITICAL, IPMI_ASSERTION);
		} else {
			return 1;
		}
	}

	if (d_mask & SAHPI_ES_UPPER_CRIT) {
		if (d_sup & OHOI_THS_UCRTH) {
			ipmi_threshold_event_set(state,
				IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_HIGH,
				IPMI_DEASSERTION);
		} else if (a_sup & OHOI_THS_UCRTL) {
			ipmi_threshold_event_set(state,
				IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_LOW,
				IPMI_ASSERTION);
		} else {
			return 1;
		}
	}

	return 0;
}
Esempio n. 2
0
static void
mod_event_enables(ipmi_sensor_t *sensor, void *cb_data, enum ev_en_kind kind)
{
    ipmi_cmd_info_t    *cmd_info = cb_data;
    ipmi_cmdlang_t     *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
    int                rv;
    int                curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
    int                argc = ipmi_cmdlang_get_argc(cmd_info);
    char               **argv = ipmi_cmdlang_get_argv(cmd_info);
    ipmi_event_state_t *s = NULL;

    if ((argc - curr_arg) < 2) {
	/* Not enough parameters */
	cmdlang->errstr = "Not enough parameters";
	cmdlang->err = EINVAL;
	goto out_err;
    }

    s = ipmi_mem_alloc(ipmi_states_size());
    if (!s) {
	cmdlang->errstr = "Out of memory";
	cmdlang->err = ENOMEM;
	goto out_err;
    }
    ipmi_event_state_init(s);

    if (strcmp(argv[curr_arg], "msg") == 0)
	ipmi_event_state_set_events_enabled(s, 1);
    else if (strcmp(argv[curr_arg], "nomsg") == 0)
	ipmi_event_state_set_events_enabled(s, 0);
    else {
	cmdlang->errstr = "Invalid message enable setting";
	cmdlang->err = EINVAL;
	goto out_err;
    }
    curr_arg++;

    if (strcmp(argv[curr_arg], "scan") == 0)
	ipmi_event_state_set_scanning_enabled(s, 1);
    else if (strcmp(argv[curr_arg], "noscan") == 0)
	ipmi_event_state_set_scanning_enabled(s, 0);
    else {
	cmdlang->errstr = "Invalid scanning enable setting";
	cmdlang->err = EINVAL;
	goto out_err;
    }
    curr_arg++;

    if (ipmi_sensor_get_event_reading_type(sensor)
	== IPMI_EVENT_READING_TYPE_THRESHOLD)
    {
	while (curr_arg < argc) {
	    enum ipmi_thresh_e          thresh;
	    enum ipmi_event_value_dir_e value_dir;
	    enum ipmi_event_dir_e       dir;

	    ipmi_cmdlang_get_threshold_ev(argv[curr_arg], &thresh,
					  &value_dir, &dir, cmd_info);
	    if (cmdlang->err) {
		goto out_err;
	    }
	    ipmi_threshold_event_set(s, thresh, value_dir, dir);
	    curr_arg++;
	}
    } else {
	while (curr_arg < argc) {
	    int                   offset;
	    enum ipmi_event_dir_e dir;

	    ipmi_cmdlang_get_discrete_ev(argv[curr_arg], &offset,
					 &dir, cmd_info);
	    if (cmdlang->err) {
		goto out_err;
	    }
	    ipmi_discrete_event_set(s, offset, dir);
	    curr_arg++;
	}
    }

    ipmi_cmdlang_cmd_info_get(cmd_info);
    switch (kind) {
    case ev_en_set:
	rv = ipmi_sensor_set_event_enables(sensor, s,
					   sensor_set_event_enables_done,
					   cmd_info);
	break;
    case ev_en_enable:
	rv = ipmi_sensor_enable_events(sensor, s,
				       sensor_set_event_enables_done,
				       cmd_info);
	break;
    case ev_en_disable:
	rv = ipmi_sensor_disable_events(sensor, s,
					sensor_set_event_enables_done,
					cmd_info);
	break;
    default:
	rv = EINVAL;
    }

    if (rv) {
	ipmi_cmdlang_cmd_info_put(cmd_info);
	cmdlang->err = rv;
	cmdlang->errstr = "Error setting event enables";
	goto out_err;
    }
    ipmi_mem_free(s);
    return;

 out_err:
    ipmi_sensor_get_name(sensor, cmdlang->objstr,
			 cmdlang->objstr_len);
    cmdlang->location = "cmd_sensor.c(sensor_set_event_enables)";
    if (s)
	ipmi_mem_free(s);
}
Esempio n. 3
0
static void
sensor_rearm(ipmi_sensor_t *sensor, void *cb_data)
{
    ipmi_cmd_info_t    *cmd_info = cb_data;
    ipmi_cmdlang_t     *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
    int                rv;
    int                curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
    int                argc = ipmi_cmdlang_get_argc(cmd_info);
    char               **argv = ipmi_cmdlang_get_argv(cmd_info);
    int                global;
    ipmi_event_state_t *s = NULL;

    if ((argc - curr_arg) < 1) {
	cmdlang->errstr = "Not enough parameters";
	cmdlang->err = EINVAL;
	goto out_err;
    }

    if (strcmp(argv[curr_arg], "global") == 0) {
	global = 1;
    } else {
	global = 0;
	s = ipmi_mem_alloc(ipmi_event_state_size());
	if (!s) {
	    cmdlang->errstr = "Out of memory";
	    cmdlang->err = ENOMEM;
	    goto out_err;
	}
	ipmi_event_state_init(s);

	if (ipmi_sensor_get_event_reading_type(sensor)
	    == IPMI_EVENT_READING_TYPE_THRESHOLD)
	{
	    enum ipmi_thresh_e          thresh;
	    enum ipmi_event_value_dir_e value_dir;
	    enum ipmi_event_dir_e       dir;

	    while (curr_arg < argc) {
		ipmi_cmdlang_get_threshold_ev(argv[curr_arg], &thresh,
					      &value_dir, &dir, cmd_info);
		if (cmdlang->err) {
		    goto out_err;
		}
		ipmi_threshold_event_set(s, thresh, value_dir, dir);
		curr_arg++;
	    }
	} else {
	    int                   offset;
	    enum ipmi_event_dir_e dir;
	    
	    while (curr_arg < argc) {
		ipmi_cmdlang_get_discrete_ev(argv[curr_arg], &offset,
					     &dir, cmd_info);
		if (cmdlang->err) {
		    goto out_err;
		}
		ipmi_discrete_event_set(s, offset, dir);
		curr_arg++;
	    }
	}
    }

    ipmi_cmdlang_cmd_info_get(cmd_info);
    rv = ipmi_sensor_rearm(sensor, global, s, sensor_rearm_done, cmd_info);
    if (rv) {
	ipmi_cmdlang_cmd_info_put(cmd_info);
	cmdlang->err = rv;
	cmdlang->errstr = "Error rearming sensor";
	goto out_err;
    }

    if (s)
	ipmi_mem_free(s);
    return;

 out_err:
    ipmi_sensor_get_name(sensor, cmdlang->objstr,
			 cmdlang->objstr_len);
    cmdlang->location = "cmd_sensor.c(sensor_rearm)";
    if (s)
	ipmi_mem_free(s);
}
Esempio n. 4
0
static void
got_events(ipmi_sensor_t      *sensor,
	   int                err,
	   ipmi_event_state_t *states,
	   void               *cb_data)
{
    sdata_t *sdata = cb_data;
    int     rv;

    if (err) {
	printf("Error 0x%x getting events for sensor %s\n", err, sdata->name);
	goto out_err;
    }

    /* Turn on the general events for a sensor, since this at
       least supports per-sensor enables. */
    ipmi_event_state_set_events_enabled(sdata->es, 1);
    ipmi_event_state_set_scanning_enabled(sdata->es, 1);

    printf("Sensor %s event settings:\n", sdata->name);
    if (sdata->state_sup != IPMI_EVENT_SUPPORT_PER_STATE) {
	/* No per-state sensors, just do the global enable. */
    } else if (ipmi_sensor_get_event_reading_type(sensor)
	       == IPMI_EVENT_READING_TYPE_THRESHOLD)
    {
	/* Check each event, print out the current state, and turn it
	   on in the events to set if it is available. */
	enum ipmi_event_value_dir_e value_dir;
	enum ipmi_event_dir_e       dir;
	enum ipmi_thresh_e          thresh;
	int                         val;
	for (value_dir=IPMI_GOING_LOW; value_dir<=IPMI_GOING_HIGH; value_dir++)
	{
	    for (dir=IPMI_ASSERTION; dir<=IPMI_DEASSERTION; dir++) {
		for (thresh=IPMI_LOWER_NON_CRITICAL;
		     thresh<=IPMI_UPPER_NON_RECOVERABLE;
		     thresh++)
		{
		    char *v;
			    
		    rv = ipmi_sensor_threshold_event_supported
			(sensor, thresh, value_dir, dir, &val);
		    if (rv || !val)
			continue;
		    
		    if (ipmi_is_threshold_event_set(states, thresh,
						    value_dir, dir))
			v = "";
		    else
			v = " not";
		    
		    printf("  %s %s %s was%s enabled\n",
			   ipmi_get_threshold_string(thresh),
			   ipmi_get_value_dir_string(value_dir),
			   ipmi_get_event_dir_string(dir),
			   v);
		    
		    ipmi_threshold_event_set(sdata->es, thresh,
					     value_dir, dir);
		}
	    }
	}
    } else {
	/* Check each event, print out the current state, and turn it
	   on in the events to set if it is available. */
	enum ipmi_event_dir_e dir;
	int                   i;

	for (dir=IPMI_ASSERTION; dir<=IPMI_DEASSERTION; dir++) {
	    for (i=0; i<15; i++) {
		char *v;
		int  val;
			    
		rv = ipmi_sensor_discrete_event_supported
		    (sensor, i, dir, &val);
		if (rv || !val)
		    continue;
		    
		if (ipmi_is_discrete_event_set(states, i, dir))
		    v = "";
		else
		    v = " not";
		    
		printf("  bit %d %s was%s enabled\n",
		       i,
		       ipmi_get_event_dir_string(dir),
		       v);
		    
		ipmi_discrete_event_set(sdata->es, i, dir);
	    }
	}
    }

    rv = ipmi_sensor_set_event_enables(sensor, sdata->es,
				       event_set_done, sdata);
    if (rv) {
	printf("Error 0x%x enabling events for sensor %s\n", err, sdata->name);
	goto out_err;
    }

    return;

 out_err:
    release_sdata(sdata);
}