- ss = sensors;
- for (i = 0; i < n; i++) {
- s = create_temp_sensor(i, 0, values_len);
- tmp = psensor_list_add(ss, s);
- if (ss != tmp)
- free(ss);
-
- ss = tmp;
- s = create_temp_sensor(i, SENSOR_TYPE_AMBIENT, values_len);
- tmp = psensor_list_add(ss, s);
- if (ss != tmp)
- free(ss);
-
- ss = tmp;
- s = create_usage_sensor(i, SENSOR_TYPE_GRAPHICS, values_len);
- tmp = psensor_list_add(ss, s);
- if (ss != tmp)
- free(ss);
-
- ss = tmp;
- s = create_usage_sensor(i, SENSOR_TYPE_VIDEO, values_len);
- tmp = psensor_list_add(ss, s);
- if (ss != tmp)
- free(ss);
-
- ss = tmp;
- s = create_usage_sensor(i, SENSOR_TYPE_MEMORY, values_len);
- tmp = psensor_list_add(ss, s);
- if (ss != tmp)
- free(ss);
-
- ss = tmp;
- s = create_usage_sensor(i, SENSOR_TYPE_PCIE, values_len);
- tmp = psensor_list_add(ss, s);
- if (ss != tmp)
- free(ss);
-
- ss = tmp;
+ if (s) {
+ tmp = psensor_list_add(*sensors, s);
+ free(*sensors);
+ *sensors = tmp;
+ }
+}
+
+struct psensor **
+nvidia_psensor_list_add(struct psensor **ss, int values_len)
+{
+ int i, n, utype;
+ Bool ret;
+
+ if (!init())
+ return ss;
+
+ ret = XNVCTRLQueryTargetCount(display, NV_CTRL_TARGET_TYPE_GPU, &n);
+ if (ret == True) {
+ for (i = 0; i < n; i++) {
+ add(&ss,
+ i,
+ SENSOR_TYPE_GPU | SENSOR_TYPE_TEMP,
+ values_len);
+
+ utype = SENSOR_TYPE_GPU | SENSOR_TYPE_PERCENT;
+ add(&ss, i, utype | SENSOR_TYPE_AMBIENT, values_len);
+ add(&ss, i, utype | SENSOR_TYPE_GRAPHICS, values_len);
+ add(&ss, i, utype | SENSOR_TYPE_VIDEO, values_len);
+ add(&ss, i, utype | SENSOR_TYPE_MEMORY, values_len);
+ add(&ss, i, utype | SENSOR_TYPE_PCIE, values_len);
+ }
+ }
+
+ ret = XNVCTRLQueryTargetCount(display, NV_CTRL_TARGET_TYPE_COOLER, &n);
+ if (ret == True) {
+ log_debug("NVIDIA: number of fans: %d", n);
+ for (i = 0; i < n; i++) {
+ utype = SENSOR_TYPE_FAN | SENSOR_TYPE_RPM;
+ if (check_sensor(i, utype))
+ add(&ss, i, utype, values_len);
+
+ utype = SENSOR_TYPE_FAN | SENSOR_TYPE_PERCENT;
+ if (check_sensor(i, utype))
+ add(&ss, i, utype, values_len);
+ }
+ } else {
+ log_err(_("NVIDIA: failed to retrieve number of fans."));