From 113e296347e58ba082fe470df37be718bb551f1d Mon Sep 17 00:00:00 2001 From: moosecrap Date: Fri, 31 Jan 2025 22:20:13 -0800 Subject: [PATCH] Added compact sensor display option --- evga-card.h | 1 + evga-icx.c | 30 ++++++++---- icx3.c | 139 ++++++++++++++++++++++++++++++++++------------------ icx3.h | 6 ++- 4 files changed, 118 insertions(+), 58 deletions(-) diff --git a/evga-card.h b/evga-card.h index 164fd33..6a0569c 100644 --- a/evga-card.h +++ b/evga-card.h @@ -84,6 +84,7 @@ struct card_info { char *card_name; char *pci_id; char *i2c_dev_path; + int fd; }; struct gpu_pci_info { diff --git a/evga-icx.c b/evga-icx.c index dd5444a..b6d7b32 100644 --- a/evga-icx.c +++ b/evga-icx.c @@ -19,15 +19,17 @@ static const char helpstring[] = "Available options:\n" " N to set the fan to that manual % speed\n" " [+/-]N to set that fan to an RPM offset from the GPU-controlled speed\n" "--reset : Reset all fans to their default mode\n" - "--sensors : Print sensor readings even if setting a fan speed \n"; + "--sensors : Print sensor readings even if setting a fan speed \n" + "--compact : Print sensor reading in a compact one-line per card format\n"; -void print_gpu_info(int gpu_num, struct card_info gpus[]); +void print_gpu_info(int gpu_num, struct card_info gpus[], int compact); int main (int argc, char **argv) { struct card_info gpus[MAX_GPUS]; int gpu_count; int print_info = 0; + int compact = 0; int gpu_num = -1; /* Card to control */ char *fan_speed[ICX3_MAX_FANS] = {NULL}; @@ -65,6 +67,8 @@ int main (int argc, char **argv) fan_speed[j] = "auto"; } else if (strcmp(argv[i], "--sensors") == 0) { print_info = 1; + } else if (strcmp(argv[i], "--compact") == 0) { + compact = 1; } else { printf(helpstring); return 0; @@ -117,19 +121,27 @@ int main (int argc, char **argv) if (print_info) { if (gpu_num == -1) { for (int i = 0; i < gpu_count; i++){ - print_gpu_info(i, gpus); + print_gpu_info(i, gpus, compact); } } else if (gpu_num <= gpu_count - 1) { - print_gpu_info(gpu_num, gpus); + print_gpu_info(gpu_num, gpus, compact); } } } -void print_gpu_info(int gpu_num, struct card_info gpus[]) { - printf("#%d: %s (%s) @ %s\n", gpu_num, gpus[gpu_num].card_name, gpus[gpu_num].i2c_dev_path, gpus[gpu_num].pci_id); - print_icx3_fans(gpus[gpu_num].i2c_dev_path); - print_icx3_temps(gpus[gpu_num].i2c_dev_path); - printf("\n"); +void print_gpu_info(int gpu_num, struct card_info gpus[], int compact) { + if (compact) { + printf("#%d ", gpu_num); + print_icx3_fans_oneline(gpus[gpu_num].i2c_dev_path); + print_icx3_temps_oneline(gpus[gpu_num].i2c_dev_path); + printf("\n"); + } else { + printf("#%d: %s (%s) @ %s\n", gpu_num, gpus[gpu_num].card_name, gpus[gpu_num].i2c_dev_path, gpus[gpu_num].pci_id); + print_icx3_fans(gpus[gpu_num].i2c_dev_path); + print_icx3_temps(gpus[gpu_num].i2c_dev_path); + printf("\n"); + } + } diff --git a/icx3.c b/icx3.c index 96a965e..17f5d4b 100644 --- a/icx3.c +++ b/icx3.c @@ -33,72 +33,59 @@ enum icx3_product_id check_for_icx3(char *i2c_dev_path) void print_icx3_fans(char *i2c_dev_path) { - char data[I2C_SMBUS_BLOCK_MAX] = {}; - int fd, read_result; + struct icx3_fan_control fans[ICX3_MAX_FANS]; + get_fan_status(fans, i2c_dev_path); - struct icx3_fan_control *fan_status; - - /* First thing is to check for the product ID to figure out how many fans we have */ - char fans_avail[ICX3_MAX_FANS] = {0}; - get_available_fans(i2c_dev_path, fans_avail); - - fd = open_i2c_dev(i2c_dev_path); - if (fd == -1) - return; - - for (int i=0; i < ICX3_MAX_FANS; i++) { - if (!fans_avail[i]) - continue; - - read_result = i2c_smbus_read_i2c_block_data(fd, ICX3_REG_FANCONTROL + i, ICX3_FANCONTROL_SIZE, data); - if (read_result != ICX3_FANCONTROL_SIZE) { - close(fd); - return; - } - fan_status = (struct icx3_fan_control*) &data; + for (int i=0; i < ICX3_MAX_FANS; i++) { printf("%s: %d RPM (%d/%d%%, %s)\n", icx3_fan_names[i], - fan_status->rpm_status, - fan_status->duty_status, - fan_status->duty, - icx3_fan_mode_names[fan_status->fanmode] + fans[i].rpm_status, + fans[i].duty_status, + fans[i].duty, + icx3_fan_mode_names[fans[i].fanmode] ); } +} + +void print_icx3_fans_oneline(char *i2c_dev_path) +{ + struct icx3_fan_control fans[ICX3_MAX_FANS]; + get_fan_status(fans, i2c_dev_path); - close(fd); + printf("FAN"); + for (int i=0; i < ICX3_MAX_FANS; i++) { + printf(" %3d", fans[i].duty_status); + } + printf("%%"); } void print_icx3_temps(char *i2c_dev_path) { - char data[I2C_SMBUS_BLOCK_MAX] = {}; - int fd, read_result; - struct icx3_temp_sensors *temp_sensors; + float temps[ICX3_NUM_TEMP_SENSORS]; - fd = open_i2c_dev(i2c_dev_path); - if (fd == -1) - return; - - read_result = i2c_smbus_read_i2c_block_data(fd, ICX3_REG_TEMPSENSOR, ICX3_TEMPSENSOR_SIZE, data); - if (read_result != ICX3_TEMPSENSOR_SIZE) { - close(fd); - return; - } - temp_sensors = (struct icx3_temp_sensors*) &data; - - float cur_temp; - short cur_data; + get_temp_sensors(temps, i2c_dev_path); for (int i=0; idata[2*i+1] << 8) | (short)(temp_sensors->data[2*i]); - /* temp is reported in tenths of deg C */ - cur_temp = (float)cur_data/10; printf("%s: %+.1f°C\n", icx3_temp_sensor_names[i], - cur_temp); + temps[i]); } } +void print_icx3_temps_oneline(char *i2c_dev_path) +{ + float temps[ICX3_NUM_TEMP_SENSORS]; + + get_temp_sensors(temps, i2c_dev_path); + + for (int i=0; idata[2*i+1] << 8) | (short)(temp_sensors->data[2*i]); + /* temp is reported in tenths of deg C */ + temps[i] = (float)cur_data/10; + } +} + int open_i2c_dev(char *i2c_dev_path) { int fd = open(i2c_dev_path, O_RDONLY); diff --git a/icx3.h b/icx3.h index 030beaf..08c3e60 100644 --- a/icx3.h +++ b/icx3.h @@ -113,8 +113,12 @@ static char *icx3_temp_sensor_names[] = { enum icx3_product_id check_for_icx3(char *i2c_dev_path); void print_icx3_fans(char *i2c_dev_path); +void print_icx3_fans_oneline(char *i2c_dev_path); void print_icx3_temps(char *i2c_dev_path); +void print_icx3_temps_oneline(char *i2c_dev_path); void get_available_fans(char *i2c_dev_path, char *fans_avail); +void get_fan_status(struct icx3_fan_control *fans, char *i2c_dev_path); +void get_temp_sensors(float *temps, char *i2c_dev_path); int open_i2c_dev(char *i2c_dev_path); void enable_write(int enable, char *i2c_dev_path); -void set_fan(int fan, char *setting, char *i2c_dev_path); \ No newline at end of file +void set_fan(int fan, char *setting, char *i2c_dev_path);