From 9f0b66b6c8beccb8b27225576453de3989c06cc7 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Orsini Date: Tue, 2 Sep 2014 13:00:04 +0200 Subject: [PATCH] Added NVidia GPU graphics, memory, PCIe and video usage. --- NEWS | 2 +- src/lib/nvidia.c | 47 +++++++++++++++++++++++++++++++++++++++-------- src/lib/psensor.c | 12 +++++++++--- src/lib/psensor.h | 5 +++++ 4 files changed, 54 insertions(+), 12 deletions(-) diff --git a/NEWS b/NEWS index 1b6e8be..e2af3a5 100644 --- a/NEWS +++ b/NEWS @@ -11,7 +11,7 @@ v1.1.2 * List of sensors UI defined in glade file instead of code. * Fixed graph enabled setting not saved when toggle in the list of sensors. -* Added NVidia GPU usage. +* Added NVidia GPU graphics, memory, PCIe and video usage. v1.1.1 ------ diff --git a/src/lib/nvidia.c b/src/lib/nvidia.c index 99df996..4c135d5 100644 --- a/src/lib/nvidia.c +++ b/src/lib/nvidia.c @@ -116,8 +116,16 @@ static int get_usage(struct psensor *sensor) NV_CTRL_STRING_GPU_UTILIZATION, &temp); - if (res == True) - return get_usage_att(temp, "graphics"); + if (res == True) { + if (sensor->type & SENSOR_TYPE_GRAPHICS) + return get_usage_att(temp, "graphics"); + else if (sensor->type & SENSOR_TYPE_VIDEO) + return get_usage_att(temp, "video"); + else if (sensor->type & SENSOR_TYPE_MEMORY) + return get_usage_att(temp, "memory"); + else if (sensor->type & SENSOR_TYPE_PCIE) + return get_usage_att(temp, "PCIe"); + } log_debug(_("NVIDIA proprietary driver not used or cannot " "retrieve NVIDIA GPU usage.")); @@ -149,19 +157,29 @@ static struct psensor *create_temp_sensor(int id, int values_len) return s; } -static struct psensor *create_usage_sensor(int id, int values_len) +static struct psensor *create_usage_sensor(int id, + int subtype, + int values_len) { char name[200]; char *sid; struct psensor *s; int t; - sprintf(name, "GPU%d graphics", id); + if (subtype & SENSOR_TYPE_GRAPHICS) + sprintf(name, "GPU%d graphics", id); + else if (subtype & SENSOR_TYPE_MEMORY) + sprintf(name, "GPU%d memory", id); + else if (subtype & SENSOR_TYPE_VIDEO) + sprintf(name, "GPU%d video", id); + else /* if (subtype & SENSOR_TYPE_PCIE) */ + sprintf(name, "GPU%d PCIe", id); + sid = malloc(strlen("NVIDIA") + 1 + strlen(name) + 1); sprintf(sid, "NVIDIA %s", name); - t = SENSOR_TYPE_NVCTRL | SENSOR_TYPE_GPU | SENSOR_TYPE_USAGE; + t = SENSOR_TYPE_NVCTRL | SENSOR_TYPE_GPU | SENSOR_TYPE_USAGE | subtype; s = psensor_create(sid, strdup(name), @@ -230,18 +248,31 @@ struct psensor **nvidia_psensor_list_add(struct psensor **sensors, ss = sensors; for (i = 0; i < n; i++) { s = create_temp_sensor(i, 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); - s = create_usage_sensor(i, values_len); + 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); diff --git a/src/lib/psensor.c b/src/lib/psensor.c index 29dd185..ec145b2 100644 --- a/src/lib/psensor.c +++ b/src/lib/psensor.c @@ -430,9 +430,15 @@ const char *psensor_type_to_str(unsigned int type) { if (type & SENSOR_TYPE_NVCTRL) { if (type & SENSOR_TYPE_TEMP) - return "NVIDIA GPU Temperature"; - else if (type & SENSOR_TYPE_USAGE) - return "NVIDIA GPU Usage"; + return "Temperature"; + else if (type & SENSOR_TYPE_GRAPHICS) + return "Graphics usage"; + else if (type & SENSOR_TYPE_VIDEO) + return "Video usage"; + else if (type & SENSOR_TYPE_MEMORY) + return "Memory usage"; + else if (type & SENSOR_TYPE_PCIE) + return "PCIe usage"; else return "NVIDIA GPU"; } diff --git a/src/lib/psensor.h b/src/lib/psensor.h index b7d73b4..a62aeb5 100644 --- a/src/lib/psensor.h +++ b/src/lib/psensor.h @@ -54,6 +54,11 @@ enum psensor_type { SENSOR_TYPE_GPU = 0x10000, SENSOR_TYPE_FAN = 0x20000, + SENSOR_TYPE_GRAPHICS = 0x40000, + SENSOR_TYPE_VIDEO = 0x80000, + SENSOR_TYPE_PCIE = 0x100000, + SENSOR_TYPE_MEMORY = 0x200000, + /* Combinations */ SENSOR_TYPE_HDD_TEMP = (SENSOR_TYPE_HDD | SENSOR_TYPE_TEMP), SENSOR_TYPE_CPU_USAGE = (SENSOR_TYPE_CPU | SENSOR_TYPE_USAGE) -- 2.7.4