brintos

brintos / linux-shallow public Read only

0
0
Text · 2.9 KiB · e97c67c Raw
118 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/* Copyright(c) 2023 Intel Corporation */3 4#include <linux/sysfs.h>5#include <linux/pci.h>6#include <linux/string.h>7 8#include "adf_common_drv.h"9#include "adf_sysfs_ras_counters.h"10 11static ssize_t errors_correctable_show(struct device *dev,12				       struct device_attribute *dev_attr,13				       char *buf)14{15	struct adf_accel_dev *accel_dev;16	unsigned long counter;17 18	accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));19	if (!accel_dev)20		return -EINVAL;21 22	counter = ADF_RAS_ERR_CTR_READ(accel_dev->ras_errors, ADF_RAS_CORR);23	return scnprintf(buf, PAGE_SIZE, "%ld\n", counter);24}25 26static ssize_t errors_nonfatal_show(struct device *dev,27				    struct device_attribute *dev_attr,28				    char *buf)29{30	struct adf_accel_dev *accel_dev;31	unsigned long counter;32 33	accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));34	if (!accel_dev)35		return -EINVAL;36 37	counter = ADF_RAS_ERR_CTR_READ(accel_dev->ras_errors, ADF_RAS_UNCORR);38	return scnprintf(buf, PAGE_SIZE, "%ld\n", counter);39}40 41static ssize_t errors_fatal_show(struct device *dev,42				 struct device_attribute *dev_attr,43				 char *buf)44{45	struct adf_accel_dev *accel_dev;46	unsigned long counter;47 48	accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));49	if (!accel_dev)50		return -EINVAL;51 52	counter = ADF_RAS_ERR_CTR_READ(accel_dev->ras_errors, ADF_RAS_FATAL);53	return scnprintf(buf, PAGE_SIZE, "%ld\n", counter);54}55 56static ssize_t reset_error_counters_store(struct device *dev,57					  struct device_attribute *dev_attr,58					  const char *buf, size_t count)59{60	struct adf_accel_dev *accel_dev;61 62	if (buf[0] != '1' || count != 2)63		return -EINVAL;64 65	accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));66	if (!accel_dev)67		return -EINVAL;68 69	ADF_RAS_ERR_CTR_CLEAR(accel_dev->ras_errors);70 71	return count;72}73 74static DEVICE_ATTR_RO(errors_correctable);75static DEVICE_ATTR_RO(errors_nonfatal);76static DEVICE_ATTR_RO(errors_fatal);77static DEVICE_ATTR_WO(reset_error_counters);78 79static struct attribute *qat_ras_attrs[] = {80	&dev_attr_errors_correctable.attr,81	&dev_attr_errors_nonfatal.attr,82	&dev_attr_errors_fatal.attr,83	&dev_attr_reset_error_counters.attr,84	NULL,85};86 87static struct attribute_group qat_ras_group = {88	.attrs = qat_ras_attrs,89	.name = "qat_ras",90};91 92void adf_sysfs_start_ras(struct adf_accel_dev *accel_dev)93{94	if (!accel_dev->ras_errors.enabled)95		return;96 97	ADF_RAS_ERR_CTR_CLEAR(accel_dev->ras_errors);98 99	if (device_add_group(&GET_DEV(accel_dev), &qat_ras_group))100		dev_err(&GET_DEV(accel_dev),101			"Failed to create qat_ras attribute group.\n");102 103	accel_dev->ras_errors.sysfs_added = true;104}105 106void adf_sysfs_stop_ras(struct adf_accel_dev *accel_dev)107{108	if (!accel_dev->ras_errors.enabled)109		return;110 111	if (accel_dev->ras_errors.sysfs_added) {112		device_remove_group(&GET_DEV(accel_dev), &qat_ras_group);113		accel_dev->ras_errors.sysfs_added = false;114	}115 116	ADF_RAS_ERR_CTR_CLEAR(accel_dev->ras_errors);117}118