cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ixgbe_sysfs.c (5599B)


      1// SPDX-License-Identifier: GPL-2.0
      2/* Copyright(c) 1999 - 2018 Intel Corporation. */
      3
      4#include "ixgbe.h"
      5#include "ixgbe_common.h"
      6#include "ixgbe_type.h"
      7
      8#include <linux/module.h>
      9#include <linux/types.h>
     10#include <linux/sysfs.h>
     11#include <linux/kobject.h>
     12#include <linux/device.h>
     13#include <linux/netdevice.h>
     14#include <linux/hwmon.h>
     15
     16/* hwmon callback functions */
     17static ssize_t ixgbe_hwmon_show_location(struct device *dev,
     18					 struct device_attribute *attr,
     19					 char *buf)
     20{
     21	struct hwmon_attr *ixgbe_attr = container_of(attr, struct hwmon_attr,
     22						     dev_attr);
     23	return sprintf(buf, "loc%u\n",
     24		       ixgbe_attr->sensor->location);
     25}
     26
     27static ssize_t ixgbe_hwmon_show_temp(struct device *dev,
     28				     struct device_attribute *attr,
     29				     char *buf)
     30{
     31	struct hwmon_attr *ixgbe_attr = container_of(attr, struct hwmon_attr,
     32						     dev_attr);
     33	unsigned int value;
     34
     35	/* reset the temp field */
     36	ixgbe_attr->hw->mac.ops.get_thermal_sensor_data(ixgbe_attr->hw);
     37
     38	value = ixgbe_attr->sensor->temp;
     39
     40	/* display millidegree */
     41	value *= 1000;
     42
     43	return sprintf(buf, "%u\n", value);
     44}
     45
     46static ssize_t ixgbe_hwmon_show_cautionthresh(struct device *dev,
     47				     struct device_attribute *attr,
     48				     char *buf)
     49{
     50	struct hwmon_attr *ixgbe_attr = container_of(attr, struct hwmon_attr,
     51						     dev_attr);
     52	unsigned int value = ixgbe_attr->sensor->caution_thresh;
     53
     54	/* display millidegree */
     55	value *= 1000;
     56
     57	return sprintf(buf, "%u\n", value);
     58}
     59
     60static ssize_t ixgbe_hwmon_show_maxopthresh(struct device *dev,
     61				     struct device_attribute *attr,
     62				     char *buf)
     63{
     64	struct hwmon_attr *ixgbe_attr = container_of(attr, struct hwmon_attr,
     65						     dev_attr);
     66	unsigned int value = ixgbe_attr->sensor->max_op_thresh;
     67
     68	/* display millidegree */
     69	value *= 1000;
     70
     71	return sprintf(buf, "%u\n", value);
     72}
     73
     74/**
     75 * ixgbe_add_hwmon_attr - Create hwmon attr table for a hwmon sysfs file.
     76 * @adapter: pointer to the adapter structure
     77 * @offset: offset in the eeprom sensor data table
     78 * @type: type of sensor data to display
     79 *
     80 * For each file we want in hwmon's sysfs interface we need a device_attribute
     81 * This is included in our hwmon_attr struct that contains the references to
     82 * the data structures we need to get the data to display.
     83 */
     84static int ixgbe_add_hwmon_attr(struct ixgbe_adapter *adapter,
     85				unsigned int offset, int type) {
     86	int rc;
     87	unsigned int n_attr;
     88	struct hwmon_attr *ixgbe_attr;
     89
     90	n_attr = adapter->ixgbe_hwmon_buff->n_hwmon;
     91	ixgbe_attr = &adapter->ixgbe_hwmon_buff->hwmon_list[n_attr];
     92
     93	switch (type) {
     94	case IXGBE_HWMON_TYPE_LOC:
     95		ixgbe_attr->dev_attr.show = ixgbe_hwmon_show_location;
     96		snprintf(ixgbe_attr->name, sizeof(ixgbe_attr->name),
     97			 "temp%u_label", offset + 1);
     98		break;
     99	case IXGBE_HWMON_TYPE_TEMP:
    100		ixgbe_attr->dev_attr.show = ixgbe_hwmon_show_temp;
    101		snprintf(ixgbe_attr->name, sizeof(ixgbe_attr->name),
    102			 "temp%u_input", offset + 1);
    103		break;
    104	case IXGBE_HWMON_TYPE_CAUTION:
    105		ixgbe_attr->dev_attr.show = ixgbe_hwmon_show_cautionthresh;
    106		snprintf(ixgbe_attr->name, sizeof(ixgbe_attr->name),
    107			 "temp%u_max", offset + 1);
    108		break;
    109	case IXGBE_HWMON_TYPE_MAX:
    110		ixgbe_attr->dev_attr.show = ixgbe_hwmon_show_maxopthresh;
    111		snprintf(ixgbe_attr->name, sizeof(ixgbe_attr->name),
    112			 "temp%u_crit", offset + 1);
    113		break;
    114	default:
    115		rc = -EPERM;
    116		return rc;
    117	}
    118
    119	/* These always the same regardless of type */
    120	ixgbe_attr->sensor =
    121		&adapter->hw.mac.thermal_sensor_data.sensor[offset];
    122	ixgbe_attr->hw = &adapter->hw;
    123	ixgbe_attr->dev_attr.store = NULL;
    124	ixgbe_attr->dev_attr.attr.mode = 0444;
    125	ixgbe_attr->dev_attr.attr.name = ixgbe_attr->name;
    126	sysfs_attr_init(&ixgbe_attr->dev_attr.attr);
    127
    128	adapter->ixgbe_hwmon_buff->attrs[n_attr] = &ixgbe_attr->dev_attr.attr;
    129
    130	++adapter->ixgbe_hwmon_buff->n_hwmon;
    131
    132	return 0;
    133}
    134
    135static void ixgbe_sysfs_del_adapter(struct ixgbe_adapter *adapter)
    136{
    137}
    138
    139/* called from ixgbe_main.c */
    140void ixgbe_sysfs_exit(struct ixgbe_adapter *adapter)
    141{
    142	ixgbe_sysfs_del_adapter(adapter);
    143}
    144
    145/* called from ixgbe_main.c */
    146int ixgbe_sysfs_init(struct ixgbe_adapter *adapter)
    147{
    148	struct hwmon_buff *ixgbe_hwmon;
    149	struct device *hwmon_dev;
    150	unsigned int i;
    151	int rc = 0;
    152
    153	/* If this method isn't defined we don't support thermals */
    154	if (adapter->hw.mac.ops.init_thermal_sensor_thresh == NULL) {
    155		goto exit;
    156	}
    157
    158	/* Don't create thermal hwmon interface if no sensors present */
    159	if (adapter->hw.mac.ops.init_thermal_sensor_thresh(&adapter->hw))
    160		goto exit;
    161
    162	ixgbe_hwmon = devm_kzalloc(&adapter->pdev->dev, sizeof(*ixgbe_hwmon),
    163				   GFP_KERNEL);
    164	if (ixgbe_hwmon == NULL) {
    165		rc = -ENOMEM;
    166		goto exit;
    167	}
    168	adapter->ixgbe_hwmon_buff = ixgbe_hwmon;
    169
    170	for (i = 0; i < IXGBE_MAX_SENSORS; i++) {
    171		/*
    172		 * Only create hwmon sysfs entries for sensors that have
    173		 * meaningful data for.
    174		 */
    175		if (adapter->hw.mac.thermal_sensor_data.sensor[i].location == 0)
    176			continue;
    177
    178		/* Bail if any hwmon attr struct fails to initialize */
    179		rc = ixgbe_add_hwmon_attr(adapter, i, IXGBE_HWMON_TYPE_CAUTION);
    180		if (rc)
    181			goto exit;
    182		rc = ixgbe_add_hwmon_attr(adapter, i, IXGBE_HWMON_TYPE_LOC);
    183		if (rc)
    184			goto exit;
    185		rc = ixgbe_add_hwmon_attr(adapter, i, IXGBE_HWMON_TYPE_TEMP);
    186		if (rc)
    187			goto exit;
    188		rc = ixgbe_add_hwmon_attr(adapter, i, IXGBE_HWMON_TYPE_MAX);
    189		if (rc)
    190			goto exit;
    191	}
    192
    193	ixgbe_hwmon->groups[0] = &ixgbe_hwmon->group;
    194	ixgbe_hwmon->group.attrs = ixgbe_hwmon->attrs;
    195
    196	hwmon_dev = devm_hwmon_device_register_with_groups(&adapter->pdev->dev,
    197							   "ixgbe",
    198							   ixgbe_hwmon,
    199							   ixgbe_hwmon->groups);
    200	if (IS_ERR(hwmon_dev))
    201		rc = PTR_ERR(hwmon_dev);
    202exit:
    203	return rc;
    204}
    205