bnxt_en: Use non-standard attribute to expose shutdown temperature
authorKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Wed, 27 Sep 2023 03:57:31 +0000 (20:57 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 4 Oct 2023 10:23:01 +0000 (11:23 +0100)
Implement the sysfs attributes directly in the driver for
shutdown threshold temperature and pass an extra attribute group
to the hwmon core when registering the hwmon device.

Link: https://lore.kernel.org/netdev/20230815045658.80494-12-michael.chan@broadcom.com/
Cc: Jean Delvare <jdelvare@suse.com>
Cc: Guenter Roeck <linux@roeck-us.net>
Cc: linux-hwmon@vger.kernel.org
Reviewed-by: Andy Gospodarek <andrew.gospodarek@broadcom.com>
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt_hwmon.c

index 6a2cad5cc159470c970c7fdd143124cad9210b06..6d36158df26e4a62789de0b9ac0fd65afbce3b6d 100644 (file)
@@ -131,6 +131,57 @@ static const struct hwmon_chip_info bnxt_hwmon_chip_info = {
        .info   = bnxt_hwmon_info,
 };
 
+static ssize_t temp1_shutdown_show(struct device *dev,
+                                  struct device_attribute *attr, char *buf)
+{
+       struct bnxt *bp = dev_get_drvdata(dev);
+
+       return sysfs_emit(buf, "%u\n", bp->shutdown_thresh_temp * 1000);
+}
+
+static ssize_t temp1_shutdown_alarm_show(struct device *dev,
+                                        struct device_attribute *attr, char *buf)
+{
+       struct bnxt *bp = dev_get_drvdata(dev);
+       u8 temp;
+       int rc;
+
+       rc = bnxt_hwrm_temp_query(bp, &temp);
+       if (rc)
+               return -EIO;
+
+       return sysfs_emit(buf, "%u\n", temp >= bp->shutdown_thresh_temp);
+}
+
+static DEVICE_ATTR_RO(temp1_shutdown);
+static DEVICE_ATTR_RO(temp1_shutdown_alarm);
+
+static struct attribute *bnxt_temp_extra_attrs[] = {
+       &dev_attr_temp1_shutdown.attr,
+       &dev_attr_temp1_shutdown_alarm.attr,
+       NULL,
+};
+
+static umode_t bnxt_temp_extra_attrs_visible(struct kobject *kobj,
+                                            struct attribute *attr, int index)
+{
+       struct device *dev = kobj_to_dev(kobj);
+       struct bnxt *bp = dev_get_drvdata(dev);
+
+       /* Shutdown temperature setting in NVM is optional */
+       if (!(bp->fw_cap & BNXT_FW_CAP_THRESHOLD_TEMP_SUPPORTED) ||
+           !bp->shutdown_thresh_temp)
+               return 0;
+
+       return attr->mode;
+}
+
+static const struct attribute_group bnxt_temp_extra_group = {
+       .attrs          = bnxt_temp_extra_attrs,
+       .is_visible     = bnxt_temp_extra_attrs_visible,
+};
+__ATTRIBUTE_GROUPS(bnxt_temp_extra);
+
 void bnxt_hwmon_uninit(struct bnxt *bp)
 {
        if (bp->hwmon_dev) {
@@ -156,7 +207,8 @@ void bnxt_hwmon_init(struct bnxt *bp)
 
        bp->hwmon_dev = hwmon_device_register_with_info(&pdev->dev,
                                                        DRV_MODULE_NAME, bp,
-                                                       &bnxt_hwmon_chip_info, NULL);
+                                                       &bnxt_hwmon_chip_info,
+                                                       bnxt_temp_extra_groups);
        if (IS_ERR(bp->hwmon_dev)) {
                bp->hwmon_dev = NULL;
                dev_warn(&pdev->dev, "Cannot register hwmon device\n");