From d24089ecb251fa7b5af0ae6609ba05e754531597 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Orsini Date: Sun, 7 Sep 2014 23:17:27 +0200 Subject: [PATCH] added nvidia fan support --- NEWS | 1 + src/lib/nvidia.c | 102 ++++++++++++++++++++---------------------------------- src/lib/psensor.h | 4 +-- 3 files changed, 40 insertions(+), 67 deletions(-) diff --git a/NEWS b/NEWS index a67d829..fecd19b 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,7 @@ v1.1.2 sensors. * Added NVidia GPU graphics, memory, PCIe and video usage. * Fixed message when the configuration file is missing. +* Added NVidia fan support. v1.1.1 ------ diff --git a/src/lib/nvidia.c b/src/lib/nvidia.c index b9a766a..7352cef 100644 --- a/src/lib/nvidia.c +++ b/src/lib/nvidia.c @@ -132,20 +132,30 @@ static const char *get_nvidia_type_str(int type) { if (type & SENSOR_TYPE_GRAPHICS) return "graphics"; - else if (type & SENSOR_TYPE_VIDEO) + + if (type & SENSOR_TYPE_VIDEO) return "video"; - else if (type & SENSOR_TYPE_MEMORY) + + if (type & SENSOR_TYPE_MEMORY) return "memory"; - else if (type & SENSOR_TYPE_PCIE) + + if (type & SENSOR_TYPE_PCIE) return "PCIe"; - else if (type & SENSOR_TYPE_AMBIENT) + + if (type & SENSOR_TYPE_AMBIENT) return "ambient"; - else if (type & SENSOR_TYPE_TEMP) + + if (type & SENSOR_TYPE_TEMP) return "temp"; - else if (type & SENSOR_TYPE_FAN) - return "fan"; - else - return "unknown"; + + if (type & SENSOR_TYPE_FAN) { + if (type & SENSOR_TYPE_RPM) + return "fan rpm"; + else + return "fan level"; + } + + return "unknown"; } static double get_usage(int id, int type) @@ -189,10 +199,15 @@ static double get_value(int id, int type) 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 */ + if (type & SENSOR_TYPE_RPM) + return get_att(NV_CTRL_TARGET_TYPE_COOLER, + id, + NV_CTRL_THERMAL_COOLER_SPEED); + else /* SENSOR_TYPE_PERCENT */ + return get_att(NV_CTRL_TARGET_TYPE_COOLER, + id, + NV_CTRL_THERMAL_COOLER_LEVEL); + } else { /* SENSOR_TYPE_PERCENT */ return get_usage(id, type); } } @@ -314,9 +329,8 @@ static void add(struct psensor ***sensors, int id, int type, int values_len) struct psensor ** nvidia_psensor_list_add(struct psensor **ss, int values_len) { - int i, n, utype, rpm; + int i, n, utype; Bool ret; - char *str; if (!init()) return ss; @@ -329,7 +343,7 @@ nvidia_psensor_list_add(struct psensor **ss, int values_len) SENSOR_TYPE_GPU | SENSOR_TYPE_TEMP, values_len); - utype = SENSOR_TYPE_GPU | SENSOR_TYPE_USAGE; + 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); @@ -342,60 +356,18 @@ nvidia_psensor_list_add(struct psensor **ss, int values_len) 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); + 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.")); } - 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; } diff --git a/src/lib/psensor.h b/src/lib/psensor.h index 81a8b03..bcdacc5 100644 --- a/src/lib/psensor.h +++ b/src/lib/psensor.h @@ -35,7 +35,7 @@ enum psensor_type { /* type of sensor values */ SENSOR_TYPE_TEMP = 0x00001, SENSOR_TYPE_RPM = 0x00002, - SENSOR_TYPE_USAGE = 0x00004, + SENSOR_TYPE_PERCENT = 0x00004, /* Whether the sensor is remote */ SENSOR_TYPE_REMOTE = 0x00008, @@ -62,7 +62,7 @@ enum psensor_type { /* Combinations */ SENSOR_TYPE_HDD_TEMP = (SENSOR_TYPE_HDD | SENSOR_TYPE_TEMP), - SENSOR_TYPE_CPU_USAGE = (SENSOR_TYPE_CPU | SENSOR_TYPE_USAGE) + SENSOR_TYPE_CPU_USAGE = (SENSOR_TYPE_CPU | SENSOR_TYPE_PERCENT) }; struct psensor { -- 2.7.4