gallium/hud: Add power sensor support
Implement support for power based sensors, reporting units in milli-watts and watts. Also, minor cleanup - change the related if block to a switch. Tested with two different power sensors, including the nouveau 'power1' sensors on a GTX950 card. Signed-off-by: Steven Toth <stoth@kernellabs.com> Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
@@ -261,6 +261,7 @@ number_to_human_readable(uint64_t num, uint64_t max_value,
|
||||
static const char *temperature_units[] = {" C"};
|
||||
static const char *volt_units[] = {" mV", " V"};
|
||||
static const char *amp_units[] = {" mA", " A"};
|
||||
static const char *watt_units[] = {" mW", " W"};
|
||||
|
||||
const char **units;
|
||||
unsigned max_unit;
|
||||
@@ -301,6 +302,10 @@ number_to_human_readable(uint64_t num, uint64_t max_value,
|
||||
max_unit = ARRAY_SIZE(hz_units)-1;
|
||||
units = hz_units;
|
||||
break;
|
||||
case PIPE_DRIVER_QUERY_TYPE_WATTS:
|
||||
max_unit = ARRAY_SIZE(watt_units)-1;
|
||||
units = watt_units;
|
||||
break;
|
||||
default:
|
||||
if (max_value == 100) {
|
||||
max_unit = ARRAY_SIZE(percent_units)-1;
|
||||
@@ -1067,6 +1072,11 @@ hud_parse_env_var(struct hud_context *hud, const char *env)
|
||||
SENSORS_CURRENT_CURRENT);
|
||||
pane->type = PIPE_DRIVER_QUERY_TYPE_AMPS;
|
||||
}
|
||||
else if (sscanf(name, "sensors_pow_cu-%s", arg_name) == 1) {
|
||||
hud_sensors_temp_graph_install(pane, arg_name,
|
||||
SENSORS_POWER_CURRENT);
|
||||
pane->type = PIPE_DRIVER_QUERY_TYPE_WATTS;
|
||||
}
|
||||
#endif
|
||||
else if (strcmp(name, "samples-passed") == 0 &&
|
||||
has_occlusion_query(hud->pipe->screen)) {
|
||||
|
||||
@@ -124,6 +124,7 @@ int hud_get_num_sensors(bool displayhelp);
|
||||
#define SENSORS_TEMP_CRITICAL 2
|
||||
#define SENSORS_VOLTAGE_CURRENT 3
|
||||
#define SENSORS_CURRENT_CURRENT 4
|
||||
#define SENSORS_POWER_CURRENT 5
|
||||
void hud_sensors_temp_graph_install(struct hud_pane *pane, const char *dev_name,
|
||||
unsigned int mode);
|
||||
#endif
|
||||
|
||||
@@ -119,6 +119,15 @@ get_sensor_values(struct sensors_temp_info *sti)
|
||||
if (sf)
|
||||
sti->critical = get_value(sti->chip, sf);
|
||||
break;
|
||||
case SENSORS_POWER_CURRENT:
|
||||
sf = sensors_get_subfeature(sti->chip, sti->feature,
|
||||
SENSORS_SUBFEATURE_POWER_INPUT);
|
||||
if (sf) {
|
||||
/* Sensors API returns in WATTs, even though driver is reporting mW,
|
||||
* convert back to mW */
|
||||
sti->current = get_value(sti->chip, sf) * 1000;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
sf = sensors_get_subfeature(sti->chip, sti->feature,
|
||||
@@ -173,6 +182,9 @@ query_sti_load(struct hud_graph *gr)
|
||||
case SENSORS_CURRENT_CURRENT:
|
||||
hud_graph_add_value(gr, (uint64_t) sti->current);
|
||||
break;
|
||||
case SENSORS_POWER_CURRENT:
|
||||
hud_graph_add_value(gr, (uint64_t) sti->current);
|
||||
break;
|
||||
}
|
||||
|
||||
sti->last_time = now;
|
||||
@@ -217,6 +229,7 @@ hud_sensors_temp_graph_install(struct hud_pane *pane, const char *dev_name,
|
||||
mode == SENSORS_VOLTAGE_CURRENT ? "VOLTS" :
|
||||
mode == SENSORS_CURRENT_CURRENT ? "AMPS" :
|
||||
mode == SENSORS_TEMP_CURRENT ? "CU" :
|
||||
mode == SENSORS_POWER_CURRENT ? "POWER" :
|
||||
mode == SENSORS_TEMP_CRITICAL ? "CR" : "UNDEFINED");
|
||||
#endif
|
||||
|
||||
@@ -234,6 +247,7 @@ hud_sensors_temp_graph_install(struct hud_pane *pane, const char *dev_name,
|
||||
sti->mode == SENSORS_VOLTAGE_CURRENT ? "Volts" :
|
||||
sti->mode == SENSORS_CURRENT_CURRENT ? "Amps" :
|
||||
sti->mode == SENSORS_TEMP_CURRENT ? "Curr" :
|
||||
sti->mode == SENSORS_POWER_CURRENT ? "Pow" :
|
||||
sti->mode == SENSORS_TEMP_CRITICAL ? "Crit" : "Unkn");
|
||||
|
||||
gr->query_data = sti;
|
||||
@@ -256,6 +270,9 @@ hud_sensors_temp_graph_install(struct hud_pane *pane, const char *dev_name,
|
||||
case SENSORS_CURRENT_CURRENT:
|
||||
hud_pane_set_max_value(pane, 5000);
|
||||
break;
|
||||
case SENSORS_POWER_CURRENT:
|
||||
hud_pane_set_max_value(pane, 5000 /* mW */);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -303,19 +320,27 @@ build_sensor_list(void)
|
||||
/* Create a 'current' and 'critical' object pair.
|
||||
* Ignore sensor if its not temperature based.
|
||||
*/
|
||||
if (feature->type == SENSORS_FEATURE_TEMP) {
|
||||
switch(feature->type) {
|
||||
case SENSORS_FEATURE_TEMP:
|
||||
create_object(name, featurename, chip, feature,
|
||||
SENSORS_TEMP_CURRENT);
|
||||
create_object(name, featurename, chip, feature,
|
||||
SENSORS_TEMP_CRITICAL);
|
||||
}
|
||||
if (feature->type == SENSORS_FEATURE_IN) {
|
||||
break;
|
||||
case SENSORS_FEATURE_IN:
|
||||
create_object(name, featurename, chip, feature,
|
||||
SENSORS_VOLTAGE_CURRENT);
|
||||
}
|
||||
if (feature->type == SENSORS_FEATURE_CURR) {
|
||||
break;
|
||||
case SENSORS_FEATURE_CURR:
|
||||
create_object(name, featurename, chip, feature,
|
||||
SENSORS_CURRENT_CURRENT);
|
||||
break;
|
||||
case SENSORS_FEATURE_POWER:
|
||||
create_object(name, featurename, chip, feature,
|
||||
SENSORS_POWER_CURRENT);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
free(featurename);
|
||||
}
|
||||
@@ -362,6 +387,9 @@ hud_get_num_sensors(bool displayhelp)
|
||||
case SENSORS_CURRENT_CURRENT:
|
||||
snprintf(line, sizeof(line), " sensors_curr_cu-%s", sti->name);
|
||||
break;
|
||||
case SENSORS_POWER_CURRENT:
|
||||
snprintf(line, sizeof(line), " sensors_pow_cu-%s", sti->name);
|
||||
break;
|
||||
}
|
||||
|
||||
puts(line);
|
||||
|
||||
@@ -969,6 +969,7 @@ enum pipe_driver_query_type
|
||||
PIPE_DRIVER_QUERY_TYPE_TEMPERATURE,
|
||||
PIPE_DRIVER_QUERY_TYPE_VOLTS,
|
||||
PIPE_DRIVER_QUERY_TYPE_AMPS,
|
||||
PIPE_DRIVER_QUERY_TYPE_WATTS,
|
||||
};
|
||||
|
||||
/* Whether an average value per frame or a cumulative value should be
|
||||
|
||||
Reference in New Issue
Block a user