From f062c3fb09dc7d734d49923cb35a2c9af5597940 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Fri, 12 Oct 2007 08:16:23 +0000 Subject: [PATCH] This patchset adds support for the new fschmd driver, while keeping compatibility with the old: -The feature lists for the fscpos, fscscy and fscher have been extended to include the new features exported by the fschmd driver -Feature lists for the fschmd and fschrc have been added -The print functions in "sensors" for the fscpos, fscscy and fscher have been modified to detect on which driver they run, on the old driver behaviour is unmodified, on the new driver the non sysfs-interface compliant attributes are not used and the extra features exported by the new driver are shown. -print functions for the fschmd and fschrc have been added to "sensors" -mapping from the non standard sysfs attr name fan#_ripple used by the old fscpos, fscscy and fscher drivers to the standard fan#_div used by the fschmd driver has been added to getsysname() using altsysname. git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@4939 7894878c-1315-0410-8ee3-d5d059ff63e0 --- lib/chips.c | 168 +++++++++++++++++++++++++++++++++++++++++ lib/chips.h | 22 ++++++ lib/proc.c | 14 +++- prog/sensors/chips.c | 175 +++++++++++++++++++++++++++++++++++++++++-- prog/sensors/chips.h | 4 + prog/sensors/main.c | 2 + 6 files changed, 376 insertions(+), 9 deletions(-) diff --git a/lib/chips.c b/lib/chips.c index 52ef7a0e..a1e2d7a7 100644 --- a/lib/chips.c +++ b/lib/chips.c @@ -4301,6 +4301,31 @@ static sensors_chip_feature fscpos_features[] = { { SENSORS_FSCPOS_WDOG_CONTROL, "wdog_control", SENSORS_FSCPOS_WDOG_PRESET, SENSORS_FSCPOS_WDOG_PRESET, RW }, FSCPOS_SYSCTL_WDOG, VALUE(3), 0 }, + /* below this line are features only exported with the new fschmd drv */ + { { SENSORS_FSCHMD_TEMP_ALARM(1), "temp1_alarm", SENSORS_FSCPOS_TEMP1, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_ALARM(2), "temp2_alarm", SENSORS_FSCPOS_TEMP2, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_ALARM(3), "temp3_alarm", SENSORS_FSCPOS_TEMP3, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_FAULT(1), "temp1_fault", SENSORS_FSCPOS_TEMP1, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_FAULT(2), "temp2_fault", SENSORS_FSCPOS_TEMP2, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_FAULT(3), "temp3_fault", SENSORS_FSCPOS_TEMP3, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_ALARM(1), "fan1_alarm", SENSORS_FSCPOS_FAN1, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_ALARM(2), "fan2_alarm", SENSORS_FSCPOS_FAN2, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_ALARM(3), "fan3_alarm", SENSORS_FSCPOS_FAN3, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_FAULT(1), "fan1_fault", SENSORS_FSCPOS_FAN1, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_FAULT(2), "fan2_fault", SENSORS_FSCPOS_FAN2, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_FAULT(3), "fan3_fault", SENSORS_FSCPOS_FAN3, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, { { 0 }, 0 } }; @@ -4448,6 +4473,47 @@ static sensors_chip_feature fscscy_features[] = { { SENSORS_FSCSCY_WDOG_CONTROL, "wdog_control", SENSORS_FSCSCY_WDOG_PRESET, SENSORS_FSCSCY_WDOG_PRESET, RW }, FSCSCY_SYSCTL_WDOG, VALUE(3), 0 }, + /* below this line are features only exported with the new fschmd drv */ + { { SENSORS_FSCHMD_TEMP_ALARM(1), "temp1_alarm", SENSORS_FSCSCY_TEMP1, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_ALARM(2), "temp2_alarm", SENSORS_FSCSCY_TEMP2, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_ALARM(3), "temp3_alarm", SENSORS_FSCSCY_TEMP3, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_ALARM(4), "temp4_alarm", SENSORS_FSCSCY_TEMP4, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_FAULT(1), "temp1_fault", SENSORS_FSCSCY_TEMP1, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_FAULT(2), "temp2_fault", SENSORS_FSCSCY_TEMP2, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_FAULT(3), "temp3_fault", SENSORS_FSCSCY_TEMP3, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_FAULT(4), "temp4_fault", SENSORS_FSCSCY_TEMP4, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_ALARM(1), "fan1_alarm", SENSORS_FSCSCY_FAN1, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_ALARM(2), "fan2_alarm", SENSORS_FSCSCY_FAN2, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_ALARM(3), "fan3_alarm", SENSORS_FSCSCY_FAN3, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_ALARM(4), "fan4_alarm", SENSORS_FSCSCY_FAN4, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_ALARM(5), "fan5_alarm", SENSORS_FSCSCY_FAN5, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_ALARM(6), "fan6_alarm", SENSORS_FSCSCY_FAN6, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_FAULT(1), "fan1_fault", SENSORS_FSCSCY_FAN1, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_FAULT(2), "fan2_fault", SENSORS_FSCSCY_FAN2, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_FAULT(3), "fan3_fault", SENSORS_FSCSCY_FAN3, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_FAULT(4), "fan4_fault", SENSORS_FSCSCY_FAN4, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_FAULT(5), "fan5_fault", SENSORS_FSCSCY_FAN5, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_FAULT(6), "fan6_fault", SENSORS_FSCSCY_FAN6, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, { { 0 }, 0 } }; @@ -4518,6 +4584,40 @@ static sensors_chip_feature fscscy_features[] = { { SENSORS_FSCHER_WDOG_CONTROL, "wdog_control", SENSORS_FSCHER_WDOG_PRESET, SENSORS_FSCHER_WDOG_PRESET, RW }, FSCHER_SYSCTL_WDOG, VALUE(3), 0 }, + /* below this line are features only exported with the new fschmd drv */ + { { SENSORS_FSCHMD_TEMP_MAX(1), "temp1_max", SENSORS_FSCHER_TEMP1, + SENSORS_FSCHER_TEMP1, RW }, + NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_MAX(2), "temp2_max", SENSORS_FSCHER_TEMP2, + SENSORS_FSCHER_TEMP2, RW }, + NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_MAX(3), "temp3_max", SENSORS_FSCHER_TEMP3, + SENSORS_FSCHER_TEMP3, RW }, + NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_ALARM(1), "temp1_alarm", SENSORS_FSCHER_TEMP1, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_ALARM(2), "temp2_alarm", SENSORS_FSCHER_TEMP2, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_ALARM(3), "temp3_alarm", SENSORS_FSCHER_TEMP3, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_FAULT(1), "temp1_fault", SENSORS_FSCHER_TEMP1, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_FAULT(2), "temp2_fault", SENSORS_FSCHER_TEMP2, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_TEMP_FAULT(3), "temp3_fault", SENSORS_FSCHER_TEMP3, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_ALARM(1), "fan1_alarm", SENSORS_FSCHER_FAN1, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_ALARM(2), "fan2_alarm", SENSORS_FSCHER_FAN2, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_ALARM(3), "fan3_alarm", SENSORS_FSCHER_FAN3, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_FAULT(1), "fan1_fault", SENSORS_FSCHER_FAN1, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_FAULT(2), "fan2_fault", SENSORS_FSCHER_FAN2, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, + { { SENSORS_FSCHMD_FAN_FAULT(3), "fan3_fault", SENSORS_FSCHER_FAN3, + NOMAP, R }, NOSYSCTL, VALUE(1), 0 }, { { 0 }, 0 } }; @@ -6218,6 +6318,72 @@ static sensors_chip_feature f71882fg_features[] = { { 0 }, 0 } }; +#define SENSORS_FSCHMD_IN_FEATURES(nr) \ + { { SENSORS_FSCHMD_IN(nr), "in" #nr, \ + NOMAP, NOMAP, R }, \ + NOSYSCTL, VALUE(3), 3 } + +#define SENSORS_FSCHMD_TEMP_FEATURES(nr) \ + { { SENSORS_FSCHMD_TEMP(nr), "temp" #nr, \ + NOMAP, NOMAP, R }, \ + NOSYSCTL, VALUE(3), 3 }, \ + { { SENSORS_FSCHMD_TEMP_MAX(nr), "temp" #nr "_max", \ + SENSORS_FSCHMD_TEMP(nr), SENSORS_FSCHMD_TEMP(nr), RW }, \ + NOSYSCTL, VALUE(1), 3 }, \ + { { SENSORS_FSCHMD_TEMP_ALARM(nr), "temp" #nr "_alarm", \ + SENSORS_FSCHMD_TEMP(nr), NOMAP, R }, \ + NOSYSCTL, VALUE(1), 0 }, \ + { { SENSORS_FSCHMD_TEMP_FAULT(nr), "temp" #nr "_fault", \ + SENSORS_FSCHMD_TEMP(nr), NOMAP, R }, \ + NOSYSCTL, VALUE(2), 0 } + +#define SENSORS_FSCHMD_FAN_FEATURES(nr) \ + { { SENSORS_FSCHMD_FAN(nr), "fan" #nr, \ + NOMAP, NOMAP, R }, \ + NOSYSCTL, VALUE(2), 0 }, \ + { { SENSORS_FSCHMD_FAN_DIV(nr), "fan" #nr "_div", \ + SENSORS_FSCHMD_FAN(nr), NOMAP, R }, \ + NOSYSCTL, VALUE(1), 0 }, \ + { { SENSORS_FSCHMD_FAN_ALARM(nr), "fan" #nr "_alarm", \ + SENSORS_FSCHMD_FAN(nr), NOMAP, R }, \ + NOSYSCTL, VALUE(1), 0 }, \ + { { SENSORS_FSCHMD_FAN_FAULT(nr), "fan" #nr "_fault", \ + SENSORS_FSCHMD_FAN(nr), NOMAP, R }, \ + NOSYSCTL, VALUE(1), 0 } + +static sensors_chip_feature fschmd_features[] = +{ + SENSORS_FSCHMD_IN_FEATURES(0), + SENSORS_FSCHMD_IN_FEATURES(1), + SENSORS_FSCHMD_IN_FEATURES(2), + SENSORS_FSCHMD_TEMP_FEATURES(1), + SENSORS_FSCHMD_TEMP_FEATURES(2), + SENSORS_FSCHMD_TEMP_FEATURES(3), + SENSORS_FSCHMD_TEMP_FEATURES(4), + SENSORS_FSCHMD_TEMP_FEATURES(5), + SENSORS_FSCHMD_FAN_FEATURES(1), + SENSORS_FSCHMD_FAN_FEATURES(2), + SENSORS_FSCHMD_FAN_FEATURES(3), + SENSORS_FSCHMD_FAN_FEATURES(4), + SENSORS_FSCHMD_FAN_FEATURES(5), + { { 0 }, 0 } +}; + +static sensors_chip_feature fschrc_features[] = +{ + SENSORS_FSCHMD_IN_FEATURES(0), + SENSORS_FSCHMD_IN_FEATURES(1), + SENSORS_FSCHMD_IN_FEATURES(2), + SENSORS_FSCHMD_TEMP_FEATURES(1), + SENSORS_FSCHMD_TEMP_FEATURES(2), + SENSORS_FSCHMD_TEMP_FEATURES(3), + SENSORS_FSCHMD_FAN_FEATURES(1), + SENSORS_FSCHMD_FAN_FEATURES(2), + SENSORS_FSCHMD_FAN_FEATURES(3), + SENSORS_FSCHMD_FAN_FEATURES(4), + { { 0 }, 0 } +}; + sensors_chip_features sensors_chip_features_list[] = { { SENSORS_LM78_PREFIX, lm78_features }, @@ -6336,5 +6502,7 @@ sensors_chip_features sensors_chip_features_list[] = { SENSORS_SCH311X_PREFIX, dme1737_features }, { SENSORS_APPLESMC_PREFIX, applesmc_features }, { SENSORS_F71882FG_PREFIX, f71882fg_features }, + { SENSORS_FSCHMD_PREFIX, fschmd_features }, + { SENSORS_FSCHRC_PREFIX, fschrc_features }, { 0 } }; diff --git a/lib/chips.h b/lib/chips.h index e9483384..5492462f 100644 --- a/lib/chips.h +++ b/lib/chips.h @@ -2341,4 +2341,26 @@ #define SENSORS_F71882FG_TEMP_FAULT(n) (140 + (n)) #define SENSORS_F71882FG_TEMP_TYPE(n) (150 + (n)) +/* Fujitsu Siemens Computers Heimdal and Heracles */ +#define SENSORS_FSCHMD_PREFIX "fscher" +#define SENSORS_FSCHRC_PREFIX "fscher" + +/* Note, we start with feature numbers of 60+ to not have any overlapping + features with the old FSCPOS, FSCSCY and FSCHER feature lists, as the + FSCHMD feature defines for features only exported by the new FSCHMD driver + are reused in the feature lists of the FSCPOS, FSCSCY and FSCHER */ + +/* in n from 0 to 3 */ +#define SENSORS_FSCHMD_IN(n) (60 + (n)) +/* fan n from 1 to 5 (4 for the hrc) */ +#define SENSORS_FSCHMD_FAN(n) (70 + (n)) +#define SENSORS_FSCHMD_FAN_DIV(n) (80 + (n)) +#define SENSORS_FSCHMD_FAN_ALARM(n) (90 + (n)) +#define SENSORS_FSCHMD_FAN_FAULT(n) (100 + (n)) +/* temp n from 1 to 5 (3 for the hrc) */ +#define SENSORS_FSCHMD_TEMP(n) (110 + (n)) +#define SENSORS_FSCHMD_TEMP_MAX(n) (120 + (n)) +#define SENSORS_FSCHMD_TEMP_ALARM(n) (130 + (n)) +#define SENSORS_FSCHMD_TEMP_FAULT(n) (140 + (n)) + #endif /* def LIB_SENSORS_CHIPS_H */ diff --git a/lib/proc.c b/lib/proc.c index 4a7656f5..22944555 100644 --- a/lib/proc.c +++ b/lib/proc.c @@ -272,7 +272,8 @@ static const struct match matches[] = { Common magnitudes are #defined above. Common conversions are as follows: fan%d_min -> fan%d_min (for magnitude) - fan%d_state -> fan%d_status + fan%d_state -> fan%d_status (for old fscxxx drv) + fan%d_ripple -> fan%d_div (for old fscxxx drv, alt. name) fan%d -> fan%d_input pwm%d -> fan%d_pwm (alt. name) pwm%d_enable -> fan%d_pwm_enable (alt. name) @@ -289,7 +290,7 @@ static const struct match matches[] = { temp%d_min -> temp%d_min (for magnitude) temp%d_low -> temp%d_min temp%d_crit -> temp%d_crit (for magnitude) - temp%d_state -> temp%d_status + temp%d_state -> temp%d_status (for old fscxxx drv) temp%d_offset -> temp%d_offset (for magnitude) temp%d -> temp%d_input sensor%d -> temp%d_type @@ -346,6 +347,12 @@ static int getsysname(const sensors_chip_feature *feature, char *sysname, *sysmag = 0; return 0; } + if(sscanf(name, "fan%d_rippl%c%c", &num, &last, &check) == 2 && last == 'e') { + strcpy(sysname, name); + sprintf(altsysname, "fan%d_div", num); + *sysmag = 0; + return 0; + } if(sscanf(name, "fan%d%c", &num, &check) == 1) { sprintf(sysname, "fan%d_input", num); *sysmag = FANMAG; @@ -448,7 +455,8 @@ static int getsysname(const sensors_chip_feature *feature, char *sysname, /* give up, use old name (probably won't work though...) */ /* known to be the same: - "alarms", "beep_enable", "vrm", "fan%d_div" + "alarms", "beep_enable", "vrm", "fan%d_div" (except old fscxxx drivers + which use fan%d_ripple, fixed using altsysname for new drv. GRR) */ strcpy(sysname, name); *sysmag = feature->scaling; diff --git a/prog/sensors/chips.c b/prog/sensors/chips.c index 3df50a2f..8ac2bef7 100644 --- a/prog/sensors/chips.c +++ b/prog/sensors/chips.c @@ -3517,9 +3517,16 @@ void print_fscpos(const sensors_chip_name *name) double voltage, temp, state, fan; int valid; + /* Check for the non standard temp1_state sysfs attr the old driver uses + if it isn't present we are talking to the new fschmd driver */ + if (sensors_get_feature(*name,SENSORS_FSCPOS_TEMP1_STATE,&state) != 0) { + print_fscpos_fschmd(name); + return; + } + + /* no need to read TEMP1_STATE, as we just successfully did that above */ if (!sensors_get_label_and_valid(*name,SENSORS_FSCPOS_TEMP1,&label,&valid) && - !sensors_get_feature(*name,SENSORS_FSCPOS_TEMP1,&temp) && - !sensors_get_feature(*name,SENSORS_FSCPOS_TEMP1_STATE,&state)) { + !sensors_get_feature(*name,SENSORS_FSCPOS_TEMP1,&temp)) { if (valid) { print_label(label,10); if((int) state & 0x01) @@ -3637,11 +3644,18 @@ void print_fscscy(const sensors_chip_name *name) char *label; double voltage, temp, templim, state, fan; int valid; + + /* Check for the non standard temp1_state sysfs attr the old driver uses + if it isn't present we are talking to the new fschmd driver */ + if (sensors_get_feature(*name,SENSORS_FSCSCY_TEMP1_STATE,&state) != 0) { + print_fscscy_fschmd(name); + return; + } + /* no need to read TEMP1_STATE, as we just successfully did that above */ if (!sensors_get_label_and_valid(*name,SENSORS_FSCSCY_TEMP1,&label,&valid) && !sensors_get_feature(*name,SENSORS_FSCSCY_TEMP1,&temp) && - !sensors_get_feature(*name,SENSORS_FSCSCY_TEMP1_LIM,&templim) && - !sensors_get_feature(*name,SENSORS_FSCSCY_TEMP1_STATE,&state)) { + !sensors_get_feature(*name,SENSORS_FSCSCY_TEMP1_LIM,&templim)) { if (valid) { print_label(label,10); if((int) state & 0x01) @@ -3819,9 +3833,16 @@ void print_fscher(const sensors_chip_name *name) double voltage, temp, state, fan; int valid; + /* Check for the non standard temp1_state sysfs attr the old driver uses + if it isn't present we are talking to the new fschmd driver */ + if (sensors_get_feature(*name,SENSORS_FSCHER_TEMP1_STATE,&state) != 0) { + print_fscher_fschmd(name); + return; + } + + /* no need to read TEMP1_STATE, as we just successfully did that above */ if (!sensors_get_label_and_valid(*name,SENSORS_FSCHER_TEMP1,&label,&valid) - && !sensors_get_feature(*name,SENSORS_FSCHER_TEMP1,&temp) - && !sensors_get_feature(*name,SENSORS_FSCHER_TEMP1_STATE,&state)) { + && !sensors_get_feature(*name,SENSORS_FSCHER_TEMP1,&temp)) { if (valid) { print_label(label,10); if((int) state & 0x01) @@ -6282,6 +6303,148 @@ void print_thmc50(const sensors_chip_name *name) free(label); } +static void print_fschmd_in(const sensors_chip_name *name, int i, + int in_feature) +{ + char *label; + double cur; + int valid; + + if (!sensors_get_label_and_valid(*name, in_feature, &label, &valid) && + !sensors_get_feature(*name, in_feature, &cur)) { + if (valid) { + print_label(label, 10); + printf("%+6.2f V\n", cur); + } + } else { + printf("ERROR: Can't get in%d data!\n", i); + } + free(label); +} + +static void print_fschmd_fan(const sensors_chip_name *name, int i, + int fan_feature, int fan_div_feature) +{ + char *label; + double cur, div, alarm, fault; + int valid; + + if (!sensors_get_label_and_valid(*name, fan_feature, &label, &valid) && + !sensors_get_feature(*name, fan_feature, &cur) && + !sensors_get_feature(*name, fan_div_feature, &div) && + !sensors_get_feature(*name, SENSORS_FSCHMD_FAN_ALARM(i), &alarm) && + !sensors_get_feature(*name, SENSORS_FSCHMD_FAN_FAULT(i), &fault)) { + if (valid) { + print_label(label, 10); + if (fault) + printf(" FAULT\n"); + else + printf("%4.0f RPM (div = %1.0f) %s\n", cur, div, + alarm ? "ALARM" : ""); + } + } + /* no error on failure as we get used for various FSC chips and not all + have the same amount of fan sensors */ + + free(label); +} + +static void print_fschmd_temp(const sensors_chip_name *name, int i, + int temp_feature, int temp_max_feature) +{ + char *label; + double cur, max, alarm, fault; + int valid; + + if (!sensors_get_label_and_valid(*name, temp_feature, &label, &valid) && + !sensors_get_feature(*name, temp_feature, &cur) && + (!temp_max_feature || + !sensors_get_feature(*name, temp_max_feature, &max)) && + !sensors_get_feature(*name, SENSORS_FSCHMD_TEMP_ALARM(i), &alarm) && + !sensors_get_feature(*name, SENSORS_FSCHMD_TEMP_FAULT(i), &fault)) { + if (valid) { + print_label(label, 10); + if (fault) + printf(" FAULT\n"); + else { + /* The fscpos doesn't have max temp limits */ + if (temp_max_feature) + print_temp_info(cur, max, 0, MAXONLY, 1, 1); + else + print_temp_info(cur, 0, 0, SINGLE, 1, 1); + printf("%s\n", alarm ? "ALARM" : ""); + } + } + } + /* no error on failure as we get used for various FSC chips and not all + have the same amount of temp sensors */ + + free(label); +} + +void print_fschmd(const sensors_chip_name *name) +{ + int i; + + for (i = 0; i <= 2; i++) + print_fschmd_in(name, i, SENSORS_FSCHMD_IN(i)); + + for (i = 1; i <= 6; i++) + print_fschmd_fan(name, i, SENSORS_FSCHMD_FAN(i), + SENSORS_FSCHMD_FAN_DIV(i)); + + for (i = 1; i <= 5; i++) + print_fschmd_temp(name, i, SENSORS_FSCHMD_TEMP(i), + SENSORS_FSCHMD_TEMP_MAX(i)); +} + +void print_fscpos_fschmd(const sensors_chip_name *name) +{ + int i; + + for (i = 0; i < 3; i++) + print_fschmd_in(name, i, SENSORS_FSCPOS_VOLTAGE1 + i); + + for (i = 0; i < 3; i++) + print_fschmd_fan(name, i + 1, SENSORS_FSCPOS_FAN1 + i, + SENSORS_FSCPOS_FAN1_RIPPLE + i); + + for (i = 0; i < 3; i++) + print_fschmd_temp(name, i + 1, SENSORS_FSCPOS_TEMP1 + i, 0); +} + +void print_fscscy_fschmd(const sensors_chip_name *name) +{ + int i; + + for (i = 0; i < 3; i++) + print_fschmd_in(name, i, SENSORS_FSCSCY_VOLTAGE1 + i); + + for (i = 0; i < 6; i++) + print_fschmd_fan(name, i + 1, SENSORS_FSCSCY_FAN1 + i, + SENSORS_FSCSCY_FAN1_RIPPLE + i); + + for (i = 0; i < 4; i++) + print_fschmd_temp(name, i + 1, SENSORS_FSCSCY_TEMP1 + i, + SENSORS_FSCSCY_TEMP1_MAX + i); +} + +void print_fscher_fschmd(const sensors_chip_name *name) +{ + int i; + + for (i = 0; i < 3; i++) + print_fschmd_in(name, i, SENSORS_FSCHER_VOLTAGE1 + i); + + for (i = 0; i < 3; i++) + print_fschmd_fan(name, i + 1, SENSORS_FSCHER_FAN1 + i, + SENSORS_FSCHER_FAN1_RIPPLE + i); + + for (i = 0; i < 3; i++) + print_fschmd_temp(name, i + 1, SENSORS_FSCHER_TEMP1 + i, + SENSORS_FSCHMD_TEMP_MAX(i + 1)); +} + void print_unknown_chip(const sensors_chip_name *name) { int a,b,valid; diff --git a/prog/sensors/chips.h b/prog/sensors/chips.h index 9531633f..6448277f 100644 --- a/prog/sensors/chips.h +++ b/prog/sensors/chips.h @@ -81,5 +81,9 @@ extern void print_dme1737(const sensors_chip_name *name); extern void print_applesmc(const sensors_chip_name *name); extern void print_f71882fg(const sensors_chip_name *name); extern void print_thmc50(const sensors_chip_name *name); +extern void print_fschmd(const sensors_chip_name *name); +extern void print_fscpos_fschmd(const sensors_chip_name *name); +extern void print_fscscy_fschmd(const sensors_chip_name *name); +extern void print_fscher_fschmd(const sensors_chip_name *name); #endif /* def PROG_SENSORS_CHIPS_H */ diff --git a/prog/sensors/main.c b/prog/sensors/main.c index 2f480dea..b1a7daa5 100644 --- a/prog/sensors/main.c +++ b/prog/sensors/main.c @@ -429,6 +429,8 @@ static struct match matches[] = { { "f71882fg", print_f71882fg }, { "thmc50", print_thmc50 }, { "adm1022", print_thmc50 }, + { "fschmd", print_fschmd }, + { "fschrc", print_fschmd }, { NULL, NULL } };