added debug information about VCSC information
[psensor.git] / src / lib / nvidia.c
index 20f4c54..b9a766a 100644 (file)
 
 Display *display;
 
-static char *get_product_name(int id)
+static char *get_product_name(int id, int type)
 {
        char *name;
        Bool res;
 
+       if (type & SENSOR_TYPE_FAN)
+               return strdup("NVIDIA");
+
        res = XNVCTRLQueryTargetStringAttribute(display,
                                                NV_CTRL_TARGET_TYPE_GPU,
                                                id,
@@ -139,6 +142,8 @@ static const char *get_nvidia_type_str(int type)
                return "ambient";
        else if (type & SENSOR_TYPE_TEMP)
                return "temp";
+       else if (type & SENSOR_TYPE_FAN)
+               return "fan";
        else
                return "unknown";
 }
@@ -183,6 +188,10 @@ static double get_value(int id, int type)
                        att = NV_CTRL_GPU_CORE_TEMPERATURE;
 
                return get_att(NV_CTRL_TARGET_TYPE_GPU, id, att);
+       } else if (type & SENSOR_TYPE_FAN) {
+               return get_att(NV_CTRL_TARGET_TYPE_COOLER,
+                              id,
+                              NV_CTRL_THERMAL_COOLER_SPEED);
        } else { /* SENSOR_TYPE_USAGE */
                return get_usage(id, type);
        }
@@ -235,7 +244,7 @@ static struct psensor *create_nvidia_sensor(int id, int subtype, int value_len)
        if (!check_sensor(id, type))
                return NULL;
 
-       pname = get_product_name(id);
+       pname = get_product_name(id, type);
        strnid = i2str(id);
        stype = get_nvidia_type_str(type);
 
@@ -255,15 +264,9 @@ static struct psensor *create_nvidia_sensor(int id, int subtype, int value_len)
        return s;
 }
 
-/*
-  Opens connection to X server and returns the number
-  of NVIDIA GPUs.
-
-  Return 0 if no NVIDIA gpus or cannot get information.
-*/
 static int init()
 {
-       int evt, err, n;
+       int evt, err;
 
        display = XOpenDisplay(NULL);
 
@@ -272,10 +275,8 @@ static int init()
                return 0;
        }
 
-       if (XNVCTRLQueryExtension(display, &evt, &err) &&
-           XNVCTRLQueryTargetCount(display, NV_CTRL_TARGET_TYPE_GPU, &n)) {
-               return n;
-       }
+       if (XNVCTRLQueryExtension(display, &evt, &err))
+               return 1;
 
        log_err(_("Failed to retrieve NVIDIA information."));
 
@@ -311,44 +312,88 @@ static void add(struct psensor ***sensors, int id, int type, int values_len)
 }
 
 struct psensor **
-nvidia_psensor_list_add(struct psensor **sensors, int values_len)
+nvidia_psensor_list_add(struct psensor **ss, int values_len)
 {
-       int i, n;
-       struct psensor **ss;
+       int i, n, utype, rpm;
+       Bool ret;
+       char *str;
 
-       n = init();
+       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_USAGE;
+                       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);
+               }
+       }
 
-       ss = sensors;
-       for (i = 0; i < n; i++) {
-               add(&ss,
-                   i,
-                   SENSOR_TYPE_GPU | SENSOR_TYPE_GPU | SENSOR_TYPE_TEMP,
-                   values_len);
-
-               add(&ss,
-                   i,
-                   SENSOR_TYPE_GPU | SENSOR_TYPE_USAGE | SENSOR_TYPE_AMBIENT,
-                   values_len);
-
-               add(&ss,
-                   i,
-                   SENSOR_TYPE_GPU | SENSOR_TYPE_USAGE | SENSOR_TYPE_GRAPHICS,
-                   values_len);
-
-               add(&ss,
-                   i,
-                   SENSOR_TYPE_GPU | SENSOR_TYPE_USAGE | SENSOR_TYPE_VIDEO,
-                   values_len);
-
-               add(&ss,
-                   i,
-                   SENSOR_TYPE_GPU | SENSOR_TYPE_USAGE | SENSOR_TYPE_MEMORY,
-                   values_len);
-
-               add(&ss,
-                   i,
-                   SENSOR_TYPE_GPU | SENSOR_TYPE_USAGE | 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++) {
+                       ret = XNVCTRLQueryTargetAttribute
+                               (display,
+                                NV_CTRL_TARGET_TYPE_COOLER,
+                                i,
+                                0,
+                                NV_CTRL_THERMAL_COOLER_SPEED, &rpm);
+                       if (ret == True)
+                               log_debug("NVIDIA: fan speed %d %d", i, rpm);
+                       else
+                               log_err(_("NVIDIA: "
+                                         "failed to retrieve fan speed %d"),
+                                       i);
+
+                       ret = XNVCTRLQueryTargetAttribute
+                               (display,
+                                NV_CTRL_TARGET_TYPE_COOLER,
+                                i,
+                                0,
+                                NV_CTRL_THERMAL_COOLER_LEVEL, &rpm);
+                       if (ret == True)
+                               log_debug("NVIDIA: fan level %d %d", i, rpm);
+                       else
+                               log_err(_("NVIDIA: "
+                                         "failed to retrieve fan level %d"),
+                                       i);
+
+
+                       add(&ss, i, SENSOR_TYPE_FAN, values_len);
+               }
+       } else {
+               log_err(_("NVIDIA: failed to retrieve number of fans."));
+       }
+
+       ret = XNVCTRLQueryTargetCount(display, NV_CTRL_TARGET_TYPE_VCSC, &n);
+       if (ret == True) {
+               log_debug("NVIDIA: number of VCSC: %d", n);
+               for (i = 0; i < n; i++) {
+                       ret = XNVCTRLQueryTargetStringAttribute
+                               (display,
+                                NV_CTRL_TARGET_TYPE_VCSC,
+                                i,
+                                0,
+                                NV_CTRL_STRING_VCSC_FAN_STATUS, &str);
+                       if (ret == True)
+                               log_debug("NVIDIA: vcsc fan %d %s", i, str);
+                       else
+                               log_err(_("NVIDIA: "
+                                         "failed to retrieve vcsc fan info %d"),
+                                       i);
+
+                       add(&ss, i, SENSOR_TYPE_FAN, values_len);
+               }
        }
 
        return ss;