Commit cd13244f authored by Kalesh AP's avatar Kalesh AP Committed by David S. Miller
Browse files

bnxt_en: Expose threshold temperatures through hwmon

HWRM_TEMP_MONITOR_QUERY response now indicates various
threshold temperatures. Expose these threshold temperatures
through the hwmon sysfs using this mapping:

hwmon_temp_max : bp->warn_thresh_temp
hwmon_temp_crit : bp->crit_thresh_temp
hwmon_temp_emergency : bp->fatal_thresh_temp

hwmon_temp_max_alarm : temp >= bp->warn_thresh_temp
hwmon_temp_crit_alarm : temp >= bp->crit_thresh_temp
hwmon_temp_emergency_alarm : temp >= bp->fatal_thresh_temp

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
Signed-off-by: default avatarKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Acked-by: default avatarGuenter Roeck <linux@roeck-us.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 847da8b1
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -2013,6 +2013,7 @@ struct bnxt {
	#define BNXT_FW_CAP_RING_MONITOR		BIT_ULL(30)
	#define BNXT_FW_CAP_DBG_QCAPS			BIT_ULL(31)
	#define BNXT_FW_CAP_PTP				BIT_ULL(32)
	#define BNXT_FW_CAP_THRESHOLD_TEMP_SUPPORTED	BIT_ULL(33)

	u32			fw_dbg_cap;

@@ -2185,7 +2186,13 @@ struct bnxt {
	struct bnxt_tc_info	*tc_info;
	struct list_head	tc_indr_block_list;
	struct dentry		*debugfs_pdev;
#ifdef CONFIG_BNXT_HWMON
	struct device		*hwmon_dev;
	u8			warn_thresh_temp;
	u8			crit_thresh_temp;
	u8			fatal_thresh_temp;
	u8			shutdown_thresh_temp;
#endif
	enum board_idx		board_idx;
};

+50 −7
Original line number Diff line number Diff line
@@ -32,8 +32,16 @@ static int bnxt_hwrm_temp_query(struct bnxt *bp, u8 *temp)
	if (rc)
		goto drop_req;

	if (temp) {
		*temp = resp->temp;

	} else if (resp->flags &
		   TEMP_MONITOR_QUERY_RESP_FLAGS_THRESHOLD_VALUES_AVAILABLE) {
		bp->fw_cap |= BNXT_FW_CAP_THRESHOLD_TEMP_SUPPORTED;
		bp->warn_thresh_temp = resp->warn_threshold;
		bp->crit_thresh_temp = resp->critical_threshold;
		bp->fatal_thresh_temp = resp->fatal_threshold;
		bp->shutdown_thresh_temp = resp->shutdown_threshold;
	}
drop_req:
	hwrm_req_drop(bp, req);
	return rc;
@@ -42,12 +50,23 @@ static int bnxt_hwrm_temp_query(struct bnxt *bp, u8 *temp)
static umode_t bnxt_hwmon_is_visible(const void *_data, enum hwmon_sensor_types type,
				     u32 attr, int channel)
{
	const struct bnxt *bp = _data;

	if (type != hwmon_temp)
		return 0;

	switch (attr) {
	case hwmon_temp_input:
		return 0444;
	case hwmon_temp_max:
	case hwmon_temp_crit:
	case hwmon_temp_emergency:
	case hwmon_temp_max_alarm:
	case hwmon_temp_crit_alarm:
	case hwmon_temp_emergency_alarm:
		if (!(bp->fw_cap & BNXT_FW_CAP_THRESHOLD_TEMP_SUPPORTED))
			return 0;
		return 0444;
	default:
		return 0;
	}
@@ -66,13 +85,39 @@ static int bnxt_hwmon_read(struct device *dev, enum hwmon_sensor_types type, u32
		if (!rc)
			*val = temp * 1000;
		return rc;
	case hwmon_temp_max:
		*val = bp->warn_thresh_temp * 1000;
		return 0;
	case hwmon_temp_crit:
		*val = bp->crit_thresh_temp * 1000;
		return 0;
	case hwmon_temp_emergency:
		*val = bp->fatal_thresh_temp * 1000;
		return 0;
	case hwmon_temp_max_alarm:
		rc = bnxt_hwrm_temp_query(bp, &temp);
		if (!rc)
			*val = temp >= bp->warn_thresh_temp;
		return rc;
	case hwmon_temp_crit_alarm:
		rc = bnxt_hwrm_temp_query(bp, &temp);
		if (!rc)
			*val = temp >= bp->crit_thresh_temp;
		return rc;
	case hwmon_temp_emergency_alarm:
		rc = bnxt_hwrm_temp_query(bp, &temp);
		if (!rc)
			*val = temp >= bp->fatal_thresh_temp;
		return rc;
	default:
		return -EOPNOTSUPP;
	}
}

static const struct hwmon_channel_info *bnxt_hwmon_info[] = {
	HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT),
	HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT |
			   HWMON_T_EMERGENCY | HWMON_T_MAX_ALARM |
			   HWMON_T_CRIT_ALARM | HWMON_T_EMERGENCY_ALARM),
	NULL
};

@@ -96,13 +141,11 @@ void bnxt_hwmon_uninit(struct bnxt *bp)

void bnxt_hwmon_init(struct bnxt *bp)
{
	struct hwrm_temp_monitor_query_input *req;
	struct pci_dev *pdev = bp->pdev;
	int rc;

	rc = hwrm_req_init(bp, req, HWRM_TEMP_MONITOR_QUERY);
	if (!rc)
		rc = hwrm_req_send_silent(bp, req);
	/* temp1_xxx is only sensor, ensure not registered if it will fail */
	rc = bnxt_hwrm_temp_query(bp, NULL);
	if (rc == -EACCES || rc == -EOPNOTSUPP) {
		bnxt_hwmon_uninit(bp);
		return;