From 6a87d050c8ab421393c8ed55f60dfe3e204e6219 Mon Sep 17 00:00:00 2001 From: brandonchuang Date: Tue, 30 May 2023 14:41:55 +0800 Subject: [PATCH] [Edgecore][as4224/as4564] Modify fan driver to support sensors command Currently, fan information is not shown with the 'sensors' command. This patch will migrate the fan folder under 'hwmon', so that sensors can detect the fan and display its information. sensors output: as4224_fan-isa-0000 Adapter: ISA adapter fan1: 8587 RPM (min = 0 RPM, max = 20500 RPM) fan2: 8667 RPM (min = 0 RPM, max = 20500 RPM) fan3: 8667 RPM (min = 0 RPM, max = 20500 RPM) fan4: 8587 RPM (min = 0 RPM, max = 20500 RPM) fan5: 8746 RPM (min = 0 RPM, max = 20500 RPM) fan6: 8746 RPM (min = 0 RPM, max = 20500 RPM) as4564_fan-isa-0000 Adapter: ISA adapter fan1: 1470 RPM (min = 0 RPM, max = 10670 RPM) fan2: 1510 RPM (min = 0 RPM, max = 10670 RPM) Changes are listed below: - Add min/max fan attributes - Create sysfs attributes under hwmon folder - Modify fani.c/sysi.c accordingly Signed-off-by: Brandon Chuang --- .../src/arm64_accton_as4224/module/src/fani.c | 6 +- .../module/src/platform_lib.c | 2 +- .../src/arm64_accton_as4224/module/src/sysi.c | 2 +- .../src/modules/arm64-accton-as4224-fan.c | 69 +++++++++++++++---- .../builds/src/arm64-accton-as4564-26p-fan.c | 51 ++++++++++---- .../arm64_accton_as4564_26p/module/src/fani.c | 6 +- .../arm64_accton_as4564_26p/module/src/sysi.c | 2 +- 7 files changed, 102 insertions(+), 36 deletions(-) diff --git a/packages/platforms/accton/arm64/as4224/src/arm64_accton_as4224/module/src/fani.c b/packages/platforms/accton/arm64/as4224/src/arm64_accton_as4224/module/src/fani.c index df190d9df..eaa1b3809 100644 --- a/packages/platforms/accton/arm64/as4224/src/arm64_accton_as4224/module/src/fani.c +++ b/packages/platforms/accton/arm64/as4224/src/arm64_accton_as4224/module/src/fani.c @@ -75,7 +75,7 @@ onlp_fani_get_fan_attr_int(int fid, char *fmt, int *value) { char attr_name[32] = {0}; sprintf(attr_name, fmt, fid); - return onlp_file_read_int(value, "%s%s", FAN_SYSFS_PATH, attr_name); + return onlp_file_read_int(value, "%s*%s", FAN_SYSFS_PATH, attr_name); } int @@ -83,7 +83,7 @@ onlp_fani_set_fan_attr_int(int fid, char *fmt, int value) { char attr_name[32] = {0}; sprintf(attr_name, fmt, fid); - return onlp_file_write_int(value, "%s%s", FAN_SYSFS_PATH, attr_name); + return onlp_file_write_int(value, "%s*%s", FAN_SYSFS_PATH, attr_name); } static int @@ -125,7 +125,7 @@ _onlp_fani_info_get_fan(int fid, onlp_fan_info_t* info) /* get speed percentage from rpm */ - ret = onlp_file_read_int(&value, "%s%s", FAN_SYSFS_PATH, "fan_max_rpm"); + ret = onlp_file_read_int(&value, "%s*%s", FAN_SYSFS_PATH, "fan_max_rpm"); if (ret < 0) { return ONLP_STATUS_E_INTERNAL; } diff --git a/packages/platforms/accton/arm64/as4224/src/arm64_accton_as4224/module/src/platform_lib.c b/packages/platforms/accton/arm64/as4224/src/arm64_accton_as4224/module/src/platform_lib.c index 826f8a63f..8581e0e9f 100644 --- a/packages/platforms/accton/arm64/as4224/src/arm64_accton_as4224/module/src/platform_lib.c +++ b/packages/platforms/accton/arm64/as4224/src/arm64_accton_as4224/module/src/platform_lib.c @@ -55,7 +55,7 @@ int platform_fan_count(void) { int ret = 0; int value = 0; - ret = onlp_file_read_int(&value, "%s%s", FAN_SYSFS_PATH, "fan_count"); + ret = onlp_file_read_int(&value, "%s*%s", FAN_SYSFS_PATH, "fan_count"); return (ret < 0) ? 0 : value; } diff --git a/packages/platforms/accton/arm64/as4224/src/arm64_accton_as4224/module/src/sysi.c b/packages/platforms/accton/arm64/as4224/src/arm64_accton_as4224/module/src/sysi.c index 5e1062145..4ab4ea775 100644 --- a/packages/platforms/accton/arm64/as4224/src/arm64_accton_as4224/module/src/sysi.c +++ b/packages/platforms/accton/arm64/as4224/src/arm64_accton_as4224/module/src/sysi.c @@ -205,7 +205,7 @@ sysi_fanctrl_thermal_sensor_policy(onlp_fan_info_t fi[MAX_CHASSIS_FAN_COUNT], *adjusted = 0; - if (onlp_file_read_int(&fanduty, "%s%s", FAN_SYSFS_PATH, "fan2_duty_cycle_percentage") < 0) { + if (onlp_file_read_int(&fanduty, "%s*%s", FAN_SYSFS_PATH, "fan2_duty_cycle_percentage") < 0) { *adjusted = 1; return sysi_fanctrl_fan_set_duty(FAN_DUTY_MAX, num_of_fan); } diff --git a/packages/platforms/accton/arm64/as4224/src/modules/arm64-accton-as4224-fan.c b/packages/platforms/accton/arm64/as4224/src/modules/arm64-accton-as4224-fan.c index 15610c1ab..7c3a1c192 100644 --- a/packages/platforms/accton/arm64/as4224/src/modules/arm64-accton-as4224-fan.c +++ b/packages/platforms/accton/arm64/as4224/src/modules/arm64-accton-as4224-fan.c @@ -116,6 +116,18 @@ enum sysfs_fan_attributes { FAN5_FAULT, FAN6_FAULT, FAN_MAX_RPM, + FAN1_SPEED_MAX, + FAN2_SPEED_MAX, + FAN3_SPEED_MAX, + FAN4_SPEED_MAX, + FAN5_SPEED_MAX, + FAN6_SPEED_MAX, + FAN1_SPEED_MIN, + FAN2_SPEED_MIN, + FAN3_SPEED_MIN, + FAN4_SPEED_MIN, + FAN5_SPEED_MIN, + FAN6_SPEED_MIN, FAN_COUNT, WTD_CLOCK, WTD_COUNTER, @@ -151,18 +163,24 @@ static struct attribute *fan_attributes_common[] = { #define FAN_ATTRS_COMMON() { .attrs = fan_attributes_common } #define FAN_ATTRS(fid) \ -static SENSOR_DEVICE_ATTR(fan##fid##_duty_cycle_percentage, \ - S_IWUSR | S_IRUGO, fan_show_value, set_duty_cycle, \ - FAN##fid##_PWM); \ -static SENSOR_DEVICE_ATTR(fan##fid##_input, S_IRUGO, fan_show_value, \ - NULL, FAN##fid##_SPEED_RPM); \ -static SENSOR_DEVICE_ATTR(fan##fid##_fault, S_IRUGO, fan_show_value, \ - NULL, FAN##fid##_FAULT); \ -static struct attribute *fan_attributes##fid[] = { \ - &sensor_dev_attr_fan##fid##_duty_cycle_percentage.dev_attr.attr, \ - &sensor_dev_attr_fan##fid##_input.dev_attr.attr, \ - &sensor_dev_attr_fan##fid##_fault.dev_attr.attr, \ - NULL \ + static SENSOR_DEVICE_ATTR(fan##fid##_duty_cycle_percentage, \ + S_IWUSR | S_IRUGO, fan_show_value, set_duty_cycle, \ + FAN##fid##_PWM); \ + static SENSOR_DEVICE_ATTR(fan##fid##_input, S_IRUGO, fan_show_value, \ + NULL, FAN##fid##_SPEED_RPM); \ + static SENSOR_DEVICE_ATTR(fan##fid##_fault, S_IRUGO, fan_show_value, \ + NULL, FAN##fid##_FAULT); \ + static SENSOR_DEVICE_ATTR(fan##fid##_max, S_IRUGO, fan_show_value, \ + NULL, FAN##fid##_SPEED_MAX); \ + static SENSOR_DEVICE_ATTR(fan##fid##_min, S_IRUGO, fan_show_value, \ + NULL, FAN##fid##_SPEED_MIN); \ + static struct attribute *fan_attributes##fid[] = { \ + &sensor_dev_attr_fan##fid##_duty_cycle_percentage.dev_attr.attr, \ + &sensor_dev_attr_fan##fid##_input.dev_attr.attr, \ + &sensor_dev_attr_fan##fid##_fault.dev_attr.attr, \ + &sensor_dev_attr_fan##fid##_max.dev_attr.attr, \ + &sensor_dev_attr_fan##fid##_min.dev_attr.attr, \ + NULL \ } FAN_ATTRS(1); @@ -293,8 +311,22 @@ static ssize_t fan_show_value(struct device *dev, struct device_attribute *da, is_fan_fault(data, attr->index - FAN1_FAULT)); break; case FAN_MAX_RPM: + case FAN1_SPEED_MAX: + case FAN2_SPEED_MAX: + case FAN3_SPEED_MAX: + case FAN4_SPEED_MAX: + case FAN5_SPEED_MAX: + case FAN6_SPEED_MAX: ret = sprintf(buf, "%d\n", MAX_FAN_SPEED_RPM); break; + case FAN1_SPEED_MIN: + case FAN2_SPEED_MIN: + case FAN3_SPEED_MIN: + case FAN4_SPEED_MIN: + case FAN5_SPEED_MIN: + case FAN6_SPEED_MIN: + ret = sprintf(buf, "0\n"); + break; case FAN_COUNT: ret = sprintf(buf, "%d\n", data->fan_count); break; @@ -510,23 +542,31 @@ static int as4224_fan_probe(struct platform_device *pdev) int status = -1; int i = 0; + data->hwmon_dev = hwmon_device_register_with_groups(&pdev->dev, + DRVNAME, NULL, NULL); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + return status; + } + /* Register sysfs hooks */ for (i = 0; i < (data->fan_count + 1); i++) { /* Register sysfs hooks */ - status = sysfs_create_group(&pdev->dev.kobj, &fan_group[i]); + status = sysfs_create_group(&data->hwmon_dev->kobj, &fan_group[i]); if (status) { goto exit; } } dev_info(&pdev->dev, "device created\n"); - return 0; exit: for (--i; i >= 0; i--) { sysfs_remove_group(&pdev->dev.kobj, &fan_group[i]); } + + hwmon_device_unregister(data->hwmon_dev); return status; } @@ -538,6 +578,7 @@ static int as4224_fan_remove(struct platform_device *pdev) sysfs_remove_group(&pdev->dev.kobj, &fan_group[i]); } + hwmon_device_unregister(data->hwmon_dev); return 0; } diff --git a/packages/platforms/accton/arm64/as4564-26p/modules/builds/src/arm64-accton-as4564-26p-fan.c b/packages/platforms/accton/arm64/as4564-26p/modules/builds/src/arm64-accton-as4564-26p-fan.c index 699a37bbf..c8937d75f 100644 --- a/packages/platforms/accton/arm64/as4564-26p/modules/builds/src/arm64-accton-as4564-26p-fan.c +++ b/packages/platforms/accton/arm64/as4564-26p/modules/builds/src/arm64-accton-as4564-26p-fan.c @@ -91,6 +91,10 @@ enum sysfs_fan_attributes { FAN1_FAULT, FAN2_FAULT, FAN_MAX_RPM, + FAN1_SPEED_MAX, + FAN2_SPEED_MAX, + FAN1_SPEED_MIN, + FAN2_SPEED_MIN, WTD_CLOCK, WTD_COUNTER, WTD_ENABLE, @@ -123,17 +127,23 @@ static struct attribute *fan_attributes_common[] = { #define FAN_ATTRS_COMMON() { .attrs = fan_attributes_common } #define FAN_ATTRS(fid) \ -static SENSOR_DEVICE_ATTR(fan##fid##_pwm, \ - S_IWUSR | S_IRUGO, fan_show_value, set_duty_cycle, \ - FAN##fid##_PWM); \ -static SENSOR_DEVICE_ATTR(fan##fid##_input, S_IRUGO, fan_show_value, \ - NULL, FAN##fid##_SPEED_RPM); \ -static SENSOR_DEVICE_ATTR(fan##fid##_fault, S_IRUGO, fan_show_value, \ - NULL, FAN##fid##_FAULT); \ -static struct attribute *fan_attributes##fid[] = { \ - &sensor_dev_attr_fan##fid##_pwm.dev_attr.attr, \ - &sensor_dev_attr_fan##fid##_input.dev_attr.attr, \ - &sensor_dev_attr_fan##fid##_fault.dev_attr.attr, \ + static SENSOR_DEVICE_ATTR(fan##fid##_pwm, \ + S_IWUSR | S_IRUGO, fan_show_value, set_duty_cycle, \ + FAN##fid##_PWM); \ + static SENSOR_DEVICE_ATTR(fan##fid##_input, S_IRUGO, fan_show_value, \ + NULL, FAN##fid##_SPEED_RPM); \ + static SENSOR_DEVICE_ATTR(fan##fid##_fault, S_IRUGO, fan_show_value, \ + NULL, FAN##fid##_FAULT); \ + static SENSOR_DEVICE_ATTR(fan##fid##_max, S_IRUGO, fan_show_value, \ + NULL, FAN##fid##_SPEED_MAX); \ + static SENSOR_DEVICE_ATTR(fan##fid##_min, S_IRUGO, fan_show_value, \ + NULL, FAN##fid##_SPEED_MIN); \ + static struct attribute *fan_attributes##fid[] = { \ + &sensor_dev_attr_fan##fid##_pwm.dev_attr.attr, \ + &sensor_dev_attr_fan##fid##_input.dev_attr.attr, \ + &sensor_dev_attr_fan##fid##_fault.dev_attr.attr, \ + &sensor_dev_attr_fan##fid##_max.dev_attr.attr, \ + &sensor_dev_attr_fan##fid##_min.dev_attr.attr, \ NULL \ } @@ -242,8 +252,14 @@ static ssize_t fan_show_value(struct device *dev, struct device_attribute *da, is_fan_fault(data, attr->index - FAN1_FAULT)); break; case FAN_MAX_RPM: + case FAN1_SPEED_MAX: + case FAN2_SPEED_MAX: ret = sprintf(buf, "%d\n", MAX_FAN_SPEED_RPM); break; + case FAN1_SPEED_MIN: + case FAN2_SPEED_MIN: + ret = sprintf(buf, "0\n"); + break; default: break; } @@ -440,23 +456,31 @@ static int as4564_fan_probe(struct platform_device *pdev) int status = -1; int i = 0; + data->hwmon_dev = hwmon_device_register_with_info(&pdev->dev, + DRVNAME, NULL, NULL, NULL); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + return status; + } + /* Register sysfs hooks */ for (i = 0; i < ARRAY_SIZE(fan_group); i++) { /* Register sysfs hooks */ - status = sysfs_create_group(&pdev->dev.kobj, &fan_group[i]); + status = sysfs_create_group(&data->hwmon_dev->kobj, &fan_group[i]); if (status) { goto exit; } } dev_info(&pdev->dev, "device created\n"); - return 0; exit: for (--i; i >= 0; i--) { sysfs_remove_group(&pdev->dev.kobj, &fan_group[i]); } + + hwmon_device_unregister(data->hwmon_dev); return status; } @@ -468,6 +492,7 @@ static int as4564_fan_remove(struct platform_device *pdev) sysfs_remove_group(&pdev->dev.kobj, &fan_group[i]); } + hwmon_device_unregister(data->hwmon_dev); return 0; } diff --git a/packages/platforms/accton/arm64/as4564-26p/onlp/builds/arm64_accton_as4564_26p/module/src/fani.c b/packages/platforms/accton/arm64/as4564-26p/onlp/builds/arm64_accton_as4564_26p/module/src/fani.c index 1eb9dcba6..68fdbe5a2 100644 --- a/packages/platforms/accton/arm64/as4564-26p/onlp/builds/arm64_accton_as4564_26p/module/src/fani.c +++ b/packages/platforms/accton/arm64/as4564-26p/onlp/builds/arm64_accton_as4564_26p/module/src/fani.c @@ -69,7 +69,7 @@ onlp_fani_get_fan_attr_int(int fid, char *fmt, int *value) { char attr_name[32] = {0}; sprintf(attr_name, fmt, fid); - return onlp_file_read_int(value, "%s%s", FAN_SYSFS_PATH, attr_name); + return onlp_file_read_int(value, "%s*%s", FAN_SYSFS_PATH, attr_name); } int @@ -77,7 +77,7 @@ onlp_fani_set_fan_attr_int(int fid, char *fmt, int value) { char attr_name[32] = {0}; sprintf(attr_name, fmt, fid); - return onlp_file_write_int(value, "%s%s", FAN_SYSFS_PATH, attr_name); + return onlp_file_write_int(value, "%s*%s", FAN_SYSFS_PATH, attr_name); } static int @@ -119,7 +119,7 @@ _onlp_fani_info_get_fan(int fid, onlp_fan_info_t* info) /* get speed percentage from rpm */ - ret = onlp_file_read_int(&value, "%s%s", FAN_SYSFS_PATH, "fan_max_rpm"); + ret = onlp_file_read_int(&value, "%s*%s", FAN_SYSFS_PATH, "fan_max_rpm"); if (ret < 0) { return ONLP_STATUS_E_INTERNAL; } diff --git a/packages/platforms/accton/arm64/as4564-26p/onlp/builds/arm64_accton_as4564_26p/module/src/sysi.c b/packages/platforms/accton/arm64/as4564-26p/onlp/builds/arm64_accton_as4564_26p/module/src/sysi.c index 7940137c7..eb2f1314b 100644 --- a/packages/platforms/accton/arm64/as4564-26p/onlp/builds/arm64_accton_as4564_26p/module/src/sysi.c +++ b/packages/platforms/accton/arm64/as4564-26p/onlp/builds/arm64_accton_as4564_26p/module/src/sysi.c @@ -200,7 +200,7 @@ sysi_fanctrl_thermal_sensor_policy(onlp_fan_info_t fi[CHASSIS_FAN_COUNT], *adjusted = 0; - if (onlp_file_read_int(&fanduty, "%s%s", FAN_SYSFS_PATH, "fan1_pwm") < 0) { + if (onlp_file_read_int(&fanduty, "%s*%s", FAN_SYSFS_PATH, "fan1_pwm") < 0) { *adjusted = 1; return sysi_fanctrl_fan_set_duty(FAN_DUTY_MAX, num_of_fan); }