/*
* Copyright (C) 2010-2011 thgreasi@gmail.com, jeanfi@gmail.com
- * Copyright (C) 2010-2013 jeanfi@gmail.com
+ * Copyright (C) 2012-2014 jeanfi@gmail.com
*
* GPU usage is a contribution of MestreLion
*
return dlsym(plibrary, name);
}
-/*
- Returns the temperature (Celcius) of an AMD/ATI GPU.
-*/
+/* Returns the temperature (Celsius) of an AMD/ATI GPU. */
static double get_temp(struct psensor *sensor)
{
ADLTemperature v;
v.iSize = sizeof(ADLTemperature);
v.iTemperature = -273;
+
if (ADL_OK == adl_od5_temperature_get(sensor->amd_id, 0, &v))
return v.iTemperature/1000;
- else
- return UNKNOWN_DBL_VALUE;
+
+ return UNKNOWN_DBL_VALUE;
}
static double get_fanspeed(struct psensor *sensor)
v.iSize = sizeof(ADLFanSpeedValue);
v.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_RPM;
v.iFanSpeed = -1;
+
if (ADL_OK == adl_od5_fanspeed_get(sensor->amd_id, 0, &v))
return v.iFanSpeed;
- else
- return UNKNOWN_DBL_VALUE;
+
+ return UNKNOWN_DBL_VALUE;
}
static double get_usage(struct psensor *sensor)
ADLPMActivity v;
v.iSize = sizeof(ADLPMActivity);
+
if (ADL_OK == adl_od5_currentactivity_get(sensor->amd_id, &v))
return v.iActivityPercent;
- else
- return UNKNOWN_DBL_VALUE;
+
+ return UNKNOWN_DBL_VALUE;
}
static struct psensor *create_sensor(int id, int type, int values_len)
/* GPU Usage (Activity/Load %) */
case 2:
sprintf(name, "AMD GPU%d Usage", id);
- sensor_type |= SENSOR_TYPE_GPU | SENSOR_TYPE_USAGE;
+ sensor_type |= SENSOR_TYPE_GPU | SENSOR_TYPE_PERCENT;
break;
}
psensor_set_current_value(s, get_temp(s));
else if (s->type & SENSOR_TYPE_RPM)
psensor_set_current_value(s, get_fanspeed(s));
- else if (s->type & SENSOR_TYPE_USAGE)
+ else if (s->type & SENSOR_TYPE_PERCENT)
psensor_set_current_value(s, get_usage(s));
}
}
/* Entry point for AMD sensors */
-struct psensor * *
-amd_psensor_list_add(struct psensor **sensors, int values_len)
+void amd_psensor_list_append(struct psensor ***sensors, int values_len)
{
int i, j, n;
- struct psensor **tmp, **ss, *s;
+ struct psensor *s;
n = init();
- ss = sensors;
for (i = 0; i < n; i++)
/* Each GPU Adapter has 3 sensors: temp, fan speed and usage */
for (j = 0; j < 3; j++) {
s = create_sensor(i, j, values_len);
- tmp = psensor_list_add(ss, s);
-
- if (ss != tmp)
- free(ss);
-
- ss = tmp;
+ psensor_list_append(sensors, s);
}
-
- return ss;
}
void amd_cleanup()