1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Copyright(c) 2023 Intel Corporation */
4 #define dev_fmt(fmt) "RateLimiting: " fmt
6 #include <linux/dev_printk.h>
8 #include <linux/sysfs.h>
9 #include <linux/types.h>
11 #include "adf_common_drv.h"
13 #include "adf_sysfs_rl.h"
15 #define GET_RL_STRUCT(accel_dev) ((accel_dev)->rate_limiting->user_input)
34 static const char *const rl_services[] = {
35 [ADF_SVC_ASYM] = "asym",
36 [ADF_SVC_SYM] = "sym",
40 static const char *const rl_operations[] = {
48 static int set_param_u(struct device *dev, enum rl_params param, u64 set)
50 struct adf_rl_interface_data *data;
51 struct adf_accel_dev *accel_dev;
54 accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
58 data = &GET_RL_STRUCT(accel_dev);
60 down_write(&data->lock);
63 data->input.rp_mask = set;
66 data->input.cir = set;
69 data->input.pir = set;
72 data->input.srv = set;
75 data->cap_rem_srv = set;
81 up_write(&data->lock);
86 static int set_param_s(struct device *dev, enum rl_params param, int set)
88 struct adf_rl_interface_data *data;
89 struct adf_accel_dev *accel_dev;
91 accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
92 if (!accel_dev || param != ID)
95 data = &GET_RL_STRUCT(accel_dev);
97 down_write(&data->lock);
98 data->input.sla_id = set;
99 up_write(&data->lock);
104 static int get_param_u(struct device *dev, enum rl_params param, u64 *get)
106 struct adf_rl_interface_data *data;
107 struct adf_accel_dev *accel_dev;
110 accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
114 data = &GET_RL_STRUCT(accel_dev);
116 down_read(&data->lock);
119 *get = data->input.rp_mask;
122 *get = data->input.cir;
125 *get = data->input.pir;
128 *get = data->input.srv;
133 up_read(&data->lock);
138 static int get_param_s(struct device *dev, enum rl_params param)
140 struct adf_rl_interface_data *data;
141 struct adf_accel_dev *accel_dev;
144 accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
148 data = &GET_RL_STRUCT(accel_dev);
150 down_read(&data->lock);
152 ret = data->input.sla_id;
153 up_read(&data->lock);
158 static ssize_t rp_show(struct device *dev, struct device_attribute *attr,
164 ret = get_param_u(dev, RP_MASK, &get);
168 return sysfs_emit(buf, "%#llx\n", get);
171 static ssize_t rp_store(struct device *dev, struct device_attribute *attr,
172 const char *buf, size_t count)
177 err = kstrtou64(buf, 16, &val);
181 err = set_param_u(dev, RP_MASK, val);
187 static DEVICE_ATTR_RW(rp);
189 static ssize_t id_show(struct device *dev, struct device_attribute *attr,
192 return sysfs_emit(buf, "%d\n", get_param_s(dev, ID));
195 static ssize_t id_store(struct device *dev, struct device_attribute *attr,
196 const char *buf, size_t count)
201 err = kstrtoint(buf, 10, &val);
205 err = set_param_s(dev, ID, val);
211 static DEVICE_ATTR_RW(id);
213 static ssize_t cir_show(struct device *dev, struct device_attribute *attr,
219 ret = get_param_u(dev, CIR, &get);
223 return sysfs_emit(buf, "%llu\n", get);
226 static ssize_t cir_store(struct device *dev, struct device_attribute *attr,
227 const char *buf, size_t count)
232 err = kstrtouint(buf, 10, &val);
236 err = set_param_u(dev, CIR, val);
242 static DEVICE_ATTR_RW(cir);
244 static ssize_t pir_show(struct device *dev, struct device_attribute *attr,
250 ret = get_param_u(dev, PIR, &get);
254 return sysfs_emit(buf, "%llu\n", get);
257 static ssize_t pir_store(struct device *dev, struct device_attribute *attr,
258 const char *buf, size_t count)
263 err = kstrtouint(buf, 10, &val);
267 err = set_param_u(dev, PIR, val);
273 static DEVICE_ATTR_RW(pir);
275 static ssize_t srv_show(struct device *dev, struct device_attribute *attr,
281 ret = get_param_u(dev, SRV, &get);
285 if (get == ADF_SVC_NONE)
288 return sysfs_emit(buf, "%s\n", rl_services[get]);
291 static ssize_t srv_store(struct device *dev, struct device_attribute *attr,
292 const char *buf, size_t count)
297 ret = sysfs_match_string(rl_services, buf);
302 ret = set_param_u(dev, SRV, val);
308 static DEVICE_ATTR_RW(srv);
310 static ssize_t cap_rem_show(struct device *dev, struct device_attribute *attr,
313 struct adf_rl_interface_data *data;
314 struct adf_accel_dev *accel_dev;
317 accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
321 data = &GET_RL_STRUCT(accel_dev);
323 down_read(&data->lock);
324 rem_cap = adf_rl_get_capability_remaining(accel_dev, data->cap_rem_srv,
326 up_read(&data->lock);
330 ret = sysfs_emit(buf, "%u\n", rem_cap);
335 static ssize_t cap_rem_store(struct device *dev, struct device_attribute *attr,
336 const char *buf, size_t count)
341 ret = sysfs_match_string(rl_services, buf);
346 ret = set_param_u(dev, CAP_REM_SRV, val);
352 static DEVICE_ATTR_RW(cap_rem);
354 static ssize_t sla_op_store(struct device *dev, struct device_attribute *attr,
355 const char *buf, size_t count)
357 struct adf_rl_interface_data *data;
358 struct adf_accel_dev *accel_dev;
361 accel_dev = adf_devmgr_pci_to_accel_dev(to_pci_dev(dev));
365 data = &GET_RL_STRUCT(accel_dev);
367 ret = sysfs_match_string(rl_operations, buf);
371 down_write(&data->lock);
374 data->input.parent_id = RL_PARENT_DEFAULT_ID;
375 data->input.type = RL_LEAF;
376 data->input.sla_id = 0;
377 ret = adf_rl_add_sla(accel_dev, &data->input);
382 ret = adf_rl_update_sla(accel_dev, &data->input);
387 ret = adf_rl_remove_sla(accel_dev, data->input.sla_id);
392 adf_rl_remove_sla_all(accel_dev, false);
395 ret = adf_rl_get_sla(accel_dev, &data->input);
403 up_write(&data->lock);
408 up_write(&data->lock);
412 static DEVICE_ATTR_WO(sla_op);
414 static struct attribute *qat_rl_attrs[] = {
420 &dev_attr_cap_rem.attr,
421 &dev_attr_sla_op.attr,
425 static struct attribute_group qat_rl_group = {
426 .attrs = qat_rl_attrs,
430 int adf_sysfs_rl_add(struct adf_accel_dev *accel_dev)
432 struct adf_rl_interface_data *data;
435 data = &GET_RL_STRUCT(accel_dev);
437 ret = device_add_group(&GET_DEV(accel_dev), &qat_rl_group);
439 dev_err(&GET_DEV(accel_dev),
440 "Failed to create qat_rl attribute group\n");
442 data->cap_rem_srv = ADF_SVC_NONE;
443 data->input.srv = ADF_SVC_NONE;
444 data->sysfs_added = true;
449 void adf_sysfs_rl_rm(struct adf_accel_dev *accel_dev)
451 struct adf_rl_interface_data *data;
453 data = &GET_RL_STRUCT(accel_dev);
454 if (!data->sysfs_added)
457 device_remove_group(&GET_DEV(accel_dev), &qat_rl_group);
458 data->sysfs_added = false;