1 // SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only)
2 /* Copyright(c) 2022 Intel Corporation */
3 #include <linux/device.h>
4 #include <linux/errno.h>
6 #include "adf_accel_devices.h"
8 #include "adf_common_drv.h"
10 static const char * const state_operations[] = {
15 static ssize_t state_show(struct device *dev, struct device_attribute *attr,
18 struct adf_accel_dev *accel_dev;
21 accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
25 state = adf_dev_started(accel_dev) ? "up" : "down";
26 return sysfs_emit(buf, "%s\n", state);
29 static ssize_t state_store(struct device *dev, struct device_attribute *attr,
30 const char *buf, size_t count)
32 struct adf_accel_dev *accel_dev;
36 accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
40 accel_id = accel_dev->accel_id;
42 if (adf_devmgr_in_reset(accel_dev) || adf_dev_in_use(accel_dev)) {
43 dev_info(dev, "Device qat_dev%d is busy\n", accel_id);
47 ret = sysfs_match_string(state_operations, buf);
53 dev_info(dev, "Stopping device qat_dev%d\n", accel_id);
55 if (!adf_dev_started(accel_dev)) {
56 dev_info(&GET_DEV(accel_dev), "Device qat_dev%d already down\n",
62 ret = adf_dev_down(accel_dev, true);
68 dev_info(dev, "Starting device qat_dev%d\n", accel_id);
70 ret = adf_dev_up(accel_dev, true);
72 dev_err(dev, "Failed to start device qat_dev%d\n",
74 adf_dev_down(accel_dev, true);
85 static const char * const services_operations[] = {
97 static ssize_t cfg_services_show(struct device *dev, struct device_attribute *attr,
100 char services[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = {0};
101 struct adf_accel_dev *accel_dev;
104 accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
108 ret = adf_cfg_get_param_value(accel_dev, ADF_GENERAL_SEC,
109 ADF_SERVICES_ENABLED, services);
113 return sysfs_emit(buf, "%s\n", services);
116 static int adf_sysfs_update_dev_config(struct adf_accel_dev *accel_dev,
117 const char *services)
119 return adf_cfg_add_key_value_param(accel_dev, ADF_GENERAL_SEC,
120 ADF_SERVICES_ENABLED, services,
124 static ssize_t cfg_services_store(struct device *dev, struct device_attribute *attr,
125 const char *buf, size_t count)
127 struct adf_hw_device_data *hw_data;
128 struct adf_accel_dev *accel_dev;
131 ret = sysfs_match_string(services_operations, buf);
135 accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
139 if (adf_dev_started(accel_dev)) {
140 dev_info(dev, "Device qat_dev%d must be down to reconfigure the service.\n",
141 accel_dev->accel_id);
145 ret = adf_sysfs_update_dev_config(accel_dev, services_operations[ret]);
149 hw_data = GET_HW_DATA(accel_dev);
151 /* Update capabilities mask after change in configuration.
152 * A call to this function is required as capabilities are, at the
153 * moment, tied to configuration
155 hw_data->accel_capabilities_mask = hw_data->get_accel_cap(accel_dev);
156 if (!hw_data->accel_capabilities_mask)
162 static ssize_t pm_idle_enabled_show(struct device *dev, struct device_attribute *attr,
165 char pm_idle_enabled[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = {};
166 struct adf_accel_dev *accel_dev;
169 accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
173 ret = adf_cfg_get_param_value(accel_dev, ADF_GENERAL_SEC,
174 ADF_PM_IDLE_SUPPORT, pm_idle_enabled);
176 return sysfs_emit(buf, "1\n");
178 return sysfs_emit(buf, "%s\n", pm_idle_enabled);
181 static ssize_t pm_idle_enabled_store(struct device *dev, struct device_attribute *attr,
182 const char *buf, size_t count)
184 unsigned long pm_idle_enabled_cfg_val;
185 struct adf_accel_dev *accel_dev;
186 bool pm_idle_enabled;
189 ret = kstrtobool(buf, &pm_idle_enabled);
193 pm_idle_enabled_cfg_val = pm_idle_enabled;
194 accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
198 if (adf_dev_started(accel_dev)) {
199 dev_info(dev, "Device qat_dev%d must be down to set pm_idle_enabled.\n",
200 accel_dev->accel_id);
204 ret = adf_cfg_add_key_value_param(accel_dev, ADF_GENERAL_SEC,
205 ADF_PM_IDLE_SUPPORT, &pm_idle_enabled_cfg_val,
212 static DEVICE_ATTR_RW(pm_idle_enabled);
214 static DEVICE_ATTR_RW(state);
215 static DEVICE_ATTR_RW(cfg_services);
217 static struct attribute *qat_attrs[] = {
218 &dev_attr_state.attr,
219 &dev_attr_cfg_services.attr,
220 &dev_attr_pm_idle_enabled.attr,
224 static struct attribute_group qat_group = {
229 int adf_sysfs_init(struct adf_accel_dev *accel_dev)
233 ret = devm_device_add_group(&GET_DEV(accel_dev), &qat_group);
235 dev_err(&GET_DEV(accel_dev),
236 "Failed to create qat attribute group: %d\n", ret);
241 EXPORT_SYMBOL_GPL(adf_sysfs_init);