xref: /freebsd/sys/dev/qat/qat_common/adf_cfg.c (revision 71625ec9)
178ee8d1cSJulian Grajkowski /* SPDX-License-Identifier: BSD-3-Clause */
278ee8d1cSJulian Grajkowski /* Copyright(c) 2007-2022 Intel Corporation */
378ee8d1cSJulian Grajkowski #include "adf_accel_devices.h"
478ee8d1cSJulian Grajkowski #include "adf_cfg.h"
578ee8d1cSJulian Grajkowski #include "adf_common_drv.h"
678ee8d1cSJulian Grajkowski #include "adf_cfg_dev_dbg.h"
7266b0663SKrzysztof Zdziarski #include "adf_cfg_device.h"
8266b0663SKrzysztof Zdziarski #include "adf_cfg_sysctl.h"
978ee8d1cSJulian Grajkowski #include "adf_heartbeat_dbg.h"
1078ee8d1cSJulian Grajkowski #include "adf_ver_dbg.h"
1178ee8d1cSJulian Grajkowski #include "adf_fw_counters.h"
1278ee8d1cSJulian Grajkowski #include "adf_cnvnr_freq_counters.h"
1378ee8d1cSJulian Grajkowski 
1478ee8d1cSJulian Grajkowski /**
1578ee8d1cSJulian Grajkowski  * adf_cfg_dev_add() - Create an acceleration device configuration table.
1678ee8d1cSJulian Grajkowski  * @accel_dev:  Pointer to acceleration device.
1778ee8d1cSJulian Grajkowski  *
1878ee8d1cSJulian Grajkowski  * Function creates a configuration table for the given acceleration device.
1978ee8d1cSJulian Grajkowski  * The table stores device specific config values.
2078ee8d1cSJulian Grajkowski  * To be used by QAT device specific drivers.
2178ee8d1cSJulian Grajkowski  *
2278ee8d1cSJulian Grajkowski  * Return: 0 on success, error code otherwise.
2378ee8d1cSJulian Grajkowski  */
2478ee8d1cSJulian Grajkowski int
adf_cfg_dev_add(struct adf_accel_dev * accel_dev)2578ee8d1cSJulian Grajkowski adf_cfg_dev_add(struct adf_accel_dev *accel_dev)
2678ee8d1cSJulian Grajkowski {
2778ee8d1cSJulian Grajkowski 	struct adf_cfg_device_data *dev_cfg_data;
2878ee8d1cSJulian Grajkowski 
2978ee8d1cSJulian Grajkowski 	dev_cfg_data = malloc(sizeof(*dev_cfg_data), M_QAT, M_WAITOK | M_ZERO);
3078ee8d1cSJulian Grajkowski 	INIT_LIST_HEAD(&dev_cfg_data->sec_list);
3178ee8d1cSJulian Grajkowski 	sx_init(&dev_cfg_data->lock, "qat cfg data");
3278ee8d1cSJulian Grajkowski 	accel_dev->cfg = dev_cfg_data;
3378ee8d1cSJulian Grajkowski 
34266b0663SKrzysztof Zdziarski 	/* Default device configuration initialization */
35266b0663SKrzysztof Zdziarski 	if (!accel_dev->is_vf) {
36266b0663SKrzysztof Zdziarski 
37266b0663SKrzysztof Zdziarski 		if (IS_QAT_GEN4(pci_get_device(GET_DEV(accel_dev)))) {
38266b0663SKrzysztof Zdziarski 			dev_cfg_data->num_user_processes =
39266b0663SKrzysztof Zdziarski 			    ADF_CFG_STATIC_CONF_USER_PROCESSES_NUM;
40266b0663SKrzysztof Zdziarski 
41266b0663SKrzysztof Zdziarski 			strncpy(dev_cfg_data->cfg_mode,
42266b0663SKrzysztof Zdziarski 				ADF_CFG_KERNEL_USER,
43266b0663SKrzysztof Zdziarski 				ADF_CFG_MAX_VAL);
44266b0663SKrzysztof Zdziarski 
45266b0663SKrzysztof Zdziarski 			if (accel_dev->accel_id % 2 == 0) {
46266b0663SKrzysztof Zdziarski 				strncpy(dev_cfg_data->cfg_services,
47266b0663SKrzysztof Zdziarski 					ADF_CFG_SYM_ASYM,
48266b0663SKrzysztof Zdziarski 					ADF_CFG_MAX_VAL);
49266b0663SKrzysztof Zdziarski 			} else {
50266b0663SKrzysztof Zdziarski 				strncpy(dev_cfg_data->cfg_services,
51266b0663SKrzysztof Zdziarski 					ADF_CFG_DC,
52266b0663SKrzysztof Zdziarski 					ADF_CFG_MAX_VAL);
53266b0663SKrzysztof Zdziarski 			}
54266b0663SKrzysztof Zdziarski 		} else {
55266b0663SKrzysztof Zdziarski 			strncpy(dev_cfg_data->cfg_mode,
56266b0663SKrzysztof Zdziarski 				ADF_CFG_KERNEL,
57266b0663SKrzysztof Zdziarski 				ADF_CFG_MAX_VAL);
58266b0663SKrzysztof Zdziarski 			dev_cfg_data->num_user_processes = 0;
59266b0663SKrzysztof Zdziarski 			strncpy(dev_cfg_data->cfg_services,
60266b0663SKrzysztof Zdziarski 				ADF_CFG_SYM_DC,
61266b0663SKrzysztof Zdziarski 				ADF_CFG_MAX_VAL);
62266b0663SKrzysztof Zdziarski 		}
63266b0663SKrzysztof Zdziarski 	} else {
64266b0663SKrzysztof Zdziarski 		dev_cfg_data->num_user_processes =
65266b0663SKrzysztof Zdziarski 		    ADF_CFG_STATIC_CONF_USER_PROCESSES_NUM;
66266b0663SKrzysztof Zdziarski 
67266b0663SKrzysztof Zdziarski 		strncpy(dev_cfg_data->cfg_mode,
68266b0663SKrzysztof Zdziarski 			ADF_CFG_KERNEL,
69266b0663SKrzysztof Zdziarski 			ADF_CFG_MAX_VAL);
70266b0663SKrzysztof Zdziarski 
71266b0663SKrzysztof Zdziarski 		strncpy(dev_cfg_data->cfg_services,
72266b0663SKrzysztof Zdziarski 			"sym;asym",
73266b0663SKrzysztof Zdziarski 			ADF_CFG_MAX_VAL);
74266b0663SKrzysztof Zdziarski 	}
75266b0663SKrzysztof Zdziarski 
76266b0663SKrzysztof Zdziarski 	if (adf_cfg_sysctl_add(accel_dev))
77266b0663SKrzysztof Zdziarski 		goto err;
78266b0663SKrzysztof Zdziarski 
7978ee8d1cSJulian Grajkowski 	if (adf_cfg_dev_dbg_add(accel_dev))
8078ee8d1cSJulian Grajkowski 		goto err;
81266b0663SKrzysztof Zdziarski 
8278ee8d1cSJulian Grajkowski 	if (!accel_dev->is_vf) {
8378ee8d1cSJulian Grajkowski 		if (adf_heartbeat_dbg_add(accel_dev))
8478ee8d1cSJulian Grajkowski 			goto err;
8578ee8d1cSJulian Grajkowski 
8678ee8d1cSJulian Grajkowski 		if (adf_ver_dbg_add(accel_dev))
8778ee8d1cSJulian Grajkowski 			goto err;
8878ee8d1cSJulian Grajkowski 
8978ee8d1cSJulian Grajkowski 		if (adf_fw_counters_add(accel_dev))
9078ee8d1cSJulian Grajkowski 			goto err;
9178ee8d1cSJulian Grajkowski 
9278ee8d1cSJulian Grajkowski 		if (adf_cnvnr_freq_counters_add(accel_dev))
9378ee8d1cSJulian Grajkowski 			goto err;
9478ee8d1cSJulian Grajkowski 	}
9578ee8d1cSJulian Grajkowski 	return 0;
9678ee8d1cSJulian Grajkowski 
9778ee8d1cSJulian Grajkowski err:
9878ee8d1cSJulian Grajkowski 	free(dev_cfg_data, M_QAT);
9978ee8d1cSJulian Grajkowski 	accel_dev->cfg = NULL;
10078ee8d1cSJulian Grajkowski 	return EFAULT;
10178ee8d1cSJulian Grajkowski }
10278ee8d1cSJulian Grajkowski 
10378ee8d1cSJulian Grajkowski static void adf_cfg_section_del_all(struct list_head *head);
10478ee8d1cSJulian Grajkowski 
10578ee8d1cSJulian Grajkowski void
adf_cfg_del_all(struct adf_accel_dev * accel_dev)10678ee8d1cSJulian Grajkowski adf_cfg_del_all(struct adf_accel_dev *accel_dev)
10778ee8d1cSJulian Grajkowski {
10878ee8d1cSJulian Grajkowski 	struct adf_cfg_device_data *dev_cfg_data = accel_dev->cfg;
10978ee8d1cSJulian Grajkowski 
11078ee8d1cSJulian Grajkowski 	sx_xlock(&dev_cfg_data->lock);
11178ee8d1cSJulian Grajkowski 	adf_cfg_section_del_all(&dev_cfg_data->sec_list);
11278ee8d1cSJulian Grajkowski 	sx_xunlock(&dev_cfg_data->lock);
11378ee8d1cSJulian Grajkowski 	clear_bit(ADF_STATUS_CONFIGURED, &accel_dev->status);
11478ee8d1cSJulian Grajkowski }
11578ee8d1cSJulian Grajkowski 
11678ee8d1cSJulian Grajkowski void
adf_cfg_depot_del_all(struct list_head * head)11778ee8d1cSJulian Grajkowski adf_cfg_depot_del_all(struct list_head *head)
11878ee8d1cSJulian Grajkowski {
11978ee8d1cSJulian Grajkowski 	adf_cfg_section_del_all(head);
12078ee8d1cSJulian Grajkowski }
12178ee8d1cSJulian Grajkowski 
12278ee8d1cSJulian Grajkowski /**
12378ee8d1cSJulian Grajkowski  * adf_cfg_dev_remove() - Clears acceleration device configuration table.
12478ee8d1cSJulian Grajkowski  * @accel_dev:  Pointer to acceleration device.
12578ee8d1cSJulian Grajkowski  *
12678ee8d1cSJulian Grajkowski  * Function removes configuration table from the given acceleration device
12778ee8d1cSJulian Grajkowski  * and frees all allocated memory.
12878ee8d1cSJulian Grajkowski  * To be used by QAT device specific drivers.
12978ee8d1cSJulian Grajkowski  *
13078ee8d1cSJulian Grajkowski  * Return: void
13178ee8d1cSJulian Grajkowski  */
13278ee8d1cSJulian Grajkowski void
adf_cfg_dev_remove(struct adf_accel_dev * accel_dev)13378ee8d1cSJulian Grajkowski adf_cfg_dev_remove(struct adf_accel_dev *accel_dev)
13478ee8d1cSJulian Grajkowski {
13578ee8d1cSJulian Grajkowski 	struct adf_cfg_device_data *dev_cfg_data = accel_dev->cfg;
13678ee8d1cSJulian Grajkowski 
13778ee8d1cSJulian Grajkowski 	if (!dev_cfg_data)
13878ee8d1cSJulian Grajkowski 		return;
13978ee8d1cSJulian Grajkowski 
14078ee8d1cSJulian Grajkowski 	sx_xlock(&dev_cfg_data->lock);
14178ee8d1cSJulian Grajkowski 	adf_cfg_section_del_all(&dev_cfg_data->sec_list);
14278ee8d1cSJulian Grajkowski 	sx_xunlock(&dev_cfg_data->lock);
14378ee8d1cSJulian Grajkowski 
144266b0663SKrzysztof Zdziarski 	adf_cfg_sysctl_remove(accel_dev);
14578ee8d1cSJulian Grajkowski 	adf_cfg_dev_dbg_remove(accel_dev);
14678ee8d1cSJulian Grajkowski 	if (!accel_dev->is_vf) {
14778ee8d1cSJulian Grajkowski 		adf_ver_dbg_del(accel_dev);
14878ee8d1cSJulian Grajkowski 		adf_heartbeat_dbg_del(accel_dev);
14978ee8d1cSJulian Grajkowski 		adf_fw_counters_remove(accel_dev);
15078ee8d1cSJulian Grajkowski 		adf_cnvnr_freq_counters_remove(accel_dev);
15178ee8d1cSJulian Grajkowski 	}
15278ee8d1cSJulian Grajkowski 
15378ee8d1cSJulian Grajkowski 	free(dev_cfg_data, M_QAT);
15478ee8d1cSJulian Grajkowski 	accel_dev->cfg = NULL;
15578ee8d1cSJulian Grajkowski }
15678ee8d1cSJulian Grajkowski 
15778ee8d1cSJulian Grajkowski static void
adf_cfg_keyval_add(struct adf_cfg_key_val * new,struct adf_cfg_section * sec)15878ee8d1cSJulian Grajkowski adf_cfg_keyval_add(struct adf_cfg_key_val *new, struct adf_cfg_section *sec)
15978ee8d1cSJulian Grajkowski {
16078ee8d1cSJulian Grajkowski 	list_add_tail(&new->list, &sec->param_head);
16178ee8d1cSJulian Grajkowski }
16278ee8d1cSJulian Grajkowski 
16378ee8d1cSJulian Grajkowski static void
adf_cfg_keyval_remove(const char * key,struct adf_cfg_section * sec)16478ee8d1cSJulian Grajkowski adf_cfg_keyval_remove(const char *key, struct adf_cfg_section *sec)
16578ee8d1cSJulian Grajkowski {
16678ee8d1cSJulian Grajkowski 	struct list_head *list_ptr, *tmp;
16778ee8d1cSJulian Grajkowski 	struct list_head *head = &sec->param_head;
16878ee8d1cSJulian Grajkowski 
16978ee8d1cSJulian Grajkowski 	list_for_each_prev_safe(list_ptr, tmp, head)
17078ee8d1cSJulian Grajkowski 	{
17178ee8d1cSJulian Grajkowski 		struct adf_cfg_key_val *ptr =
17278ee8d1cSJulian Grajkowski 		    list_entry(list_ptr, struct adf_cfg_key_val, list);
17378ee8d1cSJulian Grajkowski 
17478ee8d1cSJulian Grajkowski 		if (strncmp(ptr->key, key, sizeof(ptr->key)) != 0)
17578ee8d1cSJulian Grajkowski 			continue;
17678ee8d1cSJulian Grajkowski 
17778ee8d1cSJulian Grajkowski 		list_del(list_ptr);
17878ee8d1cSJulian Grajkowski 		free(ptr, M_QAT);
17978ee8d1cSJulian Grajkowski 		break;
18078ee8d1cSJulian Grajkowski 	}
18178ee8d1cSJulian Grajkowski }
18278ee8d1cSJulian Grajkowski 
18378ee8d1cSJulian Grajkowski static int
adf_cfg_section_restore_all(struct adf_accel_dev * accel_dev,struct adf_cfg_depot_list * cfg_depot_list)18478ee8d1cSJulian Grajkowski adf_cfg_section_restore_all(struct adf_accel_dev *accel_dev,
18578ee8d1cSJulian Grajkowski 			    struct adf_cfg_depot_list *cfg_depot_list)
18678ee8d1cSJulian Grajkowski {
18778ee8d1cSJulian Grajkowski 	struct adf_cfg_section *ptr_sec, *iter_sec;
18878ee8d1cSJulian Grajkowski 	struct adf_cfg_key_val *ptr_key;
18978ee8d1cSJulian Grajkowski 	struct list_head *list, *tmp;
19078ee8d1cSJulian Grajkowski 	struct list_head *restore_list = &accel_dev->cfg->sec_list;
19178ee8d1cSJulian Grajkowski 	struct list_head *head = &cfg_depot_list[accel_dev->accel_id].sec_list;
19278ee8d1cSJulian Grajkowski 
19378ee8d1cSJulian Grajkowski 	INIT_LIST_HEAD(restore_list);
19478ee8d1cSJulian Grajkowski 
19578ee8d1cSJulian Grajkowski 	list_for_each_prev_safe(list, tmp, head)
19678ee8d1cSJulian Grajkowski 	{
19778ee8d1cSJulian Grajkowski 		ptr_sec = list_entry(list, struct adf_cfg_section, list);
19878ee8d1cSJulian Grajkowski 		iter_sec = malloc(sizeof(*iter_sec), M_QAT, M_WAITOK | M_ZERO);
19978ee8d1cSJulian Grajkowski 
20078ee8d1cSJulian Grajkowski 		strlcpy(iter_sec->name, ptr_sec->name, sizeof(iter_sec->name));
20178ee8d1cSJulian Grajkowski 
20278ee8d1cSJulian Grajkowski 		INIT_LIST_HEAD(&iter_sec->param_head);
20378ee8d1cSJulian Grajkowski 
20478ee8d1cSJulian Grajkowski 		/* now we restore all the parameters */
20578ee8d1cSJulian Grajkowski 		list_for_each_entry(ptr_key, &ptr_sec->param_head, list)
20678ee8d1cSJulian Grajkowski 		{
20778ee8d1cSJulian Grajkowski 			struct adf_cfg_key_val *key_val;
20878ee8d1cSJulian Grajkowski 
20978ee8d1cSJulian Grajkowski 			key_val =
21078ee8d1cSJulian Grajkowski 			    malloc(sizeof(*key_val), M_QAT, M_WAITOK | M_ZERO);
21178ee8d1cSJulian Grajkowski 
21278ee8d1cSJulian Grajkowski 			memcpy(key_val, ptr_key, sizeof(*key_val));
21378ee8d1cSJulian Grajkowski 			list_add_tail(&key_val->list, &iter_sec->param_head);
21478ee8d1cSJulian Grajkowski 		}
21578ee8d1cSJulian Grajkowski 		list_add_tail(&iter_sec->list, restore_list);
21678ee8d1cSJulian Grajkowski 	}
21778ee8d1cSJulian Grajkowski 	adf_cfg_section_del_all(head);
21878ee8d1cSJulian Grajkowski 	return 0;
21978ee8d1cSJulian Grajkowski }
22078ee8d1cSJulian Grajkowski 
22178ee8d1cSJulian Grajkowski int
adf_cfg_depot_restore_all(struct adf_accel_dev * accel_dev,struct adf_cfg_depot_list * cfg_depot_list)22278ee8d1cSJulian Grajkowski adf_cfg_depot_restore_all(struct adf_accel_dev *accel_dev,
22378ee8d1cSJulian Grajkowski 			  struct adf_cfg_depot_list *cfg_depot_list)
22478ee8d1cSJulian Grajkowski {
22578ee8d1cSJulian Grajkowski 	struct adf_cfg_device_data *dev_cfg_data = accel_dev->cfg;
22678ee8d1cSJulian Grajkowski 	int ret = 0;
22778ee8d1cSJulian Grajkowski 
22878ee8d1cSJulian Grajkowski 	sx_xlock(&dev_cfg_data->lock);
22978ee8d1cSJulian Grajkowski 	ret = adf_cfg_section_restore_all(accel_dev, cfg_depot_list);
23078ee8d1cSJulian Grajkowski 	sx_xunlock(&dev_cfg_data->lock);
23178ee8d1cSJulian Grajkowski 
23278ee8d1cSJulian Grajkowski 	return ret;
23378ee8d1cSJulian Grajkowski }
23478ee8d1cSJulian Grajkowski 
23578ee8d1cSJulian Grajkowski /**
23678ee8d1cSJulian Grajkowski  * adf_cfg_section_del() - Delete config section entry to config table.
23778ee8d1cSJulian Grajkowski  * @accel_dev:  Pointer to acceleration device.
23878ee8d1cSJulian Grajkowski  * @name: Name of the section
23978ee8d1cSJulian Grajkowski  *
24078ee8d1cSJulian Grajkowski  * Function deletes configuration section where key - value entries
24178ee8d1cSJulian Grajkowski  * will be stored.
24278ee8d1cSJulian Grajkowski  * To be used by QAT device specific drivers.
24378ee8d1cSJulian Grajkowski  */
24478ee8d1cSJulian Grajkowski static void
adf_cfg_section_del(struct adf_accel_dev * accel_dev,const char * name)24578ee8d1cSJulian Grajkowski adf_cfg_section_del(struct adf_accel_dev *accel_dev, const char *name)
24678ee8d1cSJulian Grajkowski {
24778ee8d1cSJulian Grajkowski 	struct adf_cfg_section *sec = adf_cfg_sec_find(accel_dev, name);
24878ee8d1cSJulian Grajkowski 
24978ee8d1cSJulian Grajkowski 	if (!sec)
25078ee8d1cSJulian Grajkowski 		return;
25178ee8d1cSJulian Grajkowski 	adf_cfg_keyval_del_all(&sec->param_head);
25278ee8d1cSJulian Grajkowski 	list_del(&sec->list);
25378ee8d1cSJulian Grajkowski 	free(sec, M_QAT);
25478ee8d1cSJulian Grajkowski }
25578ee8d1cSJulian Grajkowski 
25678ee8d1cSJulian Grajkowski void
adf_cfg_keyval_del_all(struct list_head * head)25778ee8d1cSJulian Grajkowski adf_cfg_keyval_del_all(struct list_head *head)
25878ee8d1cSJulian Grajkowski {
25978ee8d1cSJulian Grajkowski 	struct list_head *list_ptr, *tmp;
26078ee8d1cSJulian Grajkowski 
26178ee8d1cSJulian Grajkowski 	list_for_each_prev_safe(list_ptr, tmp, head)
26278ee8d1cSJulian Grajkowski 	{
26378ee8d1cSJulian Grajkowski 		struct adf_cfg_key_val *ptr =
26478ee8d1cSJulian Grajkowski 		    list_entry(list_ptr, struct adf_cfg_key_val, list);
26578ee8d1cSJulian Grajkowski 		list_del(list_ptr);
26678ee8d1cSJulian Grajkowski 		free(ptr, M_QAT);
26778ee8d1cSJulian Grajkowski 	}
26878ee8d1cSJulian Grajkowski }
26978ee8d1cSJulian Grajkowski 
27078ee8d1cSJulian Grajkowski static void
adf_cfg_section_del_all(struct list_head * head)27178ee8d1cSJulian Grajkowski adf_cfg_section_del_all(struct list_head *head)
27278ee8d1cSJulian Grajkowski {
27378ee8d1cSJulian Grajkowski 	struct adf_cfg_section *ptr;
27478ee8d1cSJulian Grajkowski 	struct list_head *list, *tmp;
27578ee8d1cSJulian Grajkowski 
27678ee8d1cSJulian Grajkowski 	list_for_each_prev_safe(list, tmp, head)
27778ee8d1cSJulian Grajkowski 	{
27878ee8d1cSJulian Grajkowski 		ptr = list_entry(list, struct adf_cfg_section, list);
27978ee8d1cSJulian Grajkowski 		adf_cfg_keyval_del_all(&ptr->param_head);
28078ee8d1cSJulian Grajkowski 		list_del(list);
28178ee8d1cSJulian Grajkowski 		free(ptr, M_QAT);
28278ee8d1cSJulian Grajkowski 	}
28378ee8d1cSJulian Grajkowski }
28478ee8d1cSJulian Grajkowski 
28578ee8d1cSJulian Grajkowski static struct adf_cfg_key_val *
adf_cfg_key_value_find(struct adf_cfg_section * s,const char * key)28678ee8d1cSJulian Grajkowski adf_cfg_key_value_find(struct adf_cfg_section *s, const char *key)
28778ee8d1cSJulian Grajkowski {
28878ee8d1cSJulian Grajkowski 	struct list_head *list;
28978ee8d1cSJulian Grajkowski 
29078ee8d1cSJulian Grajkowski 	list_for_each(list, &s->param_head)
29178ee8d1cSJulian Grajkowski 	{
29278ee8d1cSJulian Grajkowski 		struct adf_cfg_key_val *ptr =
29378ee8d1cSJulian Grajkowski 		    list_entry(list, struct adf_cfg_key_val, list);
29478ee8d1cSJulian Grajkowski 		if (!strncmp(ptr->key, key, sizeof(ptr->key)))
29578ee8d1cSJulian Grajkowski 			return ptr;
29678ee8d1cSJulian Grajkowski 	}
29778ee8d1cSJulian Grajkowski 	return NULL;
29878ee8d1cSJulian Grajkowski }
29978ee8d1cSJulian Grajkowski 
30078ee8d1cSJulian Grajkowski struct adf_cfg_section *
adf_cfg_sec_find(struct adf_accel_dev * accel_dev,const char * sec_name)30178ee8d1cSJulian Grajkowski adf_cfg_sec_find(struct adf_accel_dev *accel_dev, const char *sec_name)
30278ee8d1cSJulian Grajkowski {
30378ee8d1cSJulian Grajkowski 	struct adf_cfg_device_data *cfg = accel_dev->cfg;
30478ee8d1cSJulian Grajkowski 	struct list_head *list;
30578ee8d1cSJulian Grajkowski 
30678ee8d1cSJulian Grajkowski 	list_for_each(list, &cfg->sec_list)
30778ee8d1cSJulian Grajkowski 	{
30878ee8d1cSJulian Grajkowski 		struct adf_cfg_section *ptr =
30978ee8d1cSJulian Grajkowski 		    list_entry(list, struct adf_cfg_section, list);
31078ee8d1cSJulian Grajkowski 		if (!strncmp(ptr->name, sec_name, sizeof(ptr->name)))
31178ee8d1cSJulian Grajkowski 			return ptr;
31278ee8d1cSJulian Grajkowski 	}
31378ee8d1cSJulian Grajkowski 	return NULL;
31478ee8d1cSJulian Grajkowski }
31578ee8d1cSJulian Grajkowski 
31678ee8d1cSJulian Grajkowski static int
adf_cfg_key_val_get(struct adf_accel_dev * accel_dev,const char * sec_name,const char * key_name,char * val)31778ee8d1cSJulian Grajkowski adf_cfg_key_val_get(struct adf_accel_dev *accel_dev,
31878ee8d1cSJulian Grajkowski 		    const char *sec_name,
31978ee8d1cSJulian Grajkowski 		    const char *key_name,
32078ee8d1cSJulian Grajkowski 		    char *val)
32178ee8d1cSJulian Grajkowski {
32278ee8d1cSJulian Grajkowski 	struct adf_cfg_section *sec = adf_cfg_sec_find(accel_dev, sec_name);
32378ee8d1cSJulian Grajkowski 	struct adf_cfg_key_val *keyval = NULL;
32478ee8d1cSJulian Grajkowski 
32578ee8d1cSJulian Grajkowski 	if (sec)
32678ee8d1cSJulian Grajkowski 		keyval = adf_cfg_key_value_find(sec, key_name);
32778ee8d1cSJulian Grajkowski 	if (keyval) {
32878ee8d1cSJulian Grajkowski 		memcpy(val, keyval->val, ADF_CFG_MAX_VAL_LEN_IN_BYTES);
32978ee8d1cSJulian Grajkowski 		return 0;
33078ee8d1cSJulian Grajkowski 	}
33178ee8d1cSJulian Grajkowski 	return -1;
33278ee8d1cSJulian Grajkowski }
33378ee8d1cSJulian Grajkowski 
33478ee8d1cSJulian Grajkowski /**
33578ee8d1cSJulian Grajkowski  * adf_cfg_add_key_value_param() - Add key-value config entry to config table.
33678ee8d1cSJulian Grajkowski  * @accel_dev:  Pointer to acceleration device.
33778ee8d1cSJulian Grajkowski  * @section_name: Name of the section where the param will be added
33878ee8d1cSJulian Grajkowski  * @key: The key string
33978ee8d1cSJulian Grajkowski  * @val: Value pain for the given @key
34078ee8d1cSJulian Grajkowski  * @type: Type - string, int or address
34178ee8d1cSJulian Grajkowski  *
34278ee8d1cSJulian Grajkowski  * Function adds configuration key - value entry in the appropriate section
34378ee8d1cSJulian Grajkowski  * in the given acceleration device
34478ee8d1cSJulian Grajkowski  * To be used by QAT device specific drivers.
34578ee8d1cSJulian Grajkowski  *
34678ee8d1cSJulian Grajkowski  * Return: 0 on success, error code otherwise.
34778ee8d1cSJulian Grajkowski  */
34878ee8d1cSJulian Grajkowski int
adf_cfg_add_key_value_param(struct adf_accel_dev * accel_dev,const char * section_name,const char * key,const void * val,enum adf_cfg_val_type type)34978ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(struct adf_accel_dev *accel_dev,
35078ee8d1cSJulian Grajkowski 			    const char *section_name,
35178ee8d1cSJulian Grajkowski 			    const char *key,
35278ee8d1cSJulian Grajkowski 			    const void *val,
35378ee8d1cSJulian Grajkowski 			    enum adf_cfg_val_type type)
35478ee8d1cSJulian Grajkowski {
35578ee8d1cSJulian Grajkowski 	char temp_val[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
35678ee8d1cSJulian Grajkowski 	struct adf_cfg_device_data *cfg = accel_dev->cfg;
35778ee8d1cSJulian Grajkowski 	struct adf_cfg_key_val *key_val;
35878ee8d1cSJulian Grajkowski 	struct adf_cfg_section *section =
35978ee8d1cSJulian Grajkowski 	    adf_cfg_sec_find(accel_dev, section_name);
36078ee8d1cSJulian Grajkowski 	if (!section)
36178ee8d1cSJulian Grajkowski 		return EFAULT;
36278ee8d1cSJulian Grajkowski 
36378ee8d1cSJulian Grajkowski 	key_val = malloc(sizeof(*key_val), M_QAT, M_WAITOK | M_ZERO);
36478ee8d1cSJulian Grajkowski 
36578ee8d1cSJulian Grajkowski 	INIT_LIST_HEAD(&key_val->list);
36678ee8d1cSJulian Grajkowski 	strlcpy(key_val->key, key, sizeof(key_val->key));
36778ee8d1cSJulian Grajkowski 
36878ee8d1cSJulian Grajkowski 	if (type == ADF_DEC) {
36978ee8d1cSJulian Grajkowski 		snprintf(key_val->val,
37078ee8d1cSJulian Grajkowski 			 ADF_CFG_MAX_VAL_LEN_IN_BYTES,
37178ee8d1cSJulian Grajkowski 			 "%ld",
37278ee8d1cSJulian Grajkowski 			 (*((const long *)val)));
37378ee8d1cSJulian Grajkowski 	} else if (type == ADF_STR) {
37478ee8d1cSJulian Grajkowski 		strlcpy(key_val->val, (const char *)val, sizeof(key_val->val));
37578ee8d1cSJulian Grajkowski 	} else if (type == ADF_HEX) {
37678ee8d1cSJulian Grajkowski 		snprintf(key_val->val,
37778ee8d1cSJulian Grajkowski 			 ADF_CFG_MAX_VAL_LEN_IN_BYTES,
37878ee8d1cSJulian Grajkowski 			 "0x%lx",
37978ee8d1cSJulian Grajkowski 			 (unsigned long)val);
38078ee8d1cSJulian Grajkowski 	} else {
38178ee8d1cSJulian Grajkowski 		device_printf(GET_DEV(accel_dev), "Unknown type given.\n");
38278ee8d1cSJulian Grajkowski 		free(key_val, M_QAT);
38378ee8d1cSJulian Grajkowski 		return -1;
38478ee8d1cSJulian Grajkowski 	}
38578ee8d1cSJulian Grajkowski 	key_val->type = type;
38678ee8d1cSJulian Grajkowski 
38778ee8d1cSJulian Grajkowski 	/* Add the key-value pair as below policy:
38878ee8d1cSJulian Grajkowski 	 *     1. If the key doesn't exist, add it,
38978ee8d1cSJulian Grajkowski 	 *     2. If the key already exists with a different value
39078ee8d1cSJulian Grajkowski 	 *        then delete it,
39178ee8d1cSJulian Grajkowski 	 *     3. If the key exists with the same value, then return
39278ee8d1cSJulian Grajkowski 	 *        without doing anything.
39378ee8d1cSJulian Grajkowski 	 */
39478ee8d1cSJulian Grajkowski 	if (adf_cfg_key_val_get(accel_dev, section_name, key, temp_val) == 0) {
39578ee8d1cSJulian Grajkowski 		if (strncmp(temp_val, key_val->val, sizeof(temp_val)) != 0) {
39678ee8d1cSJulian Grajkowski 			adf_cfg_keyval_remove(key, section);
39778ee8d1cSJulian Grajkowski 		} else {
39878ee8d1cSJulian Grajkowski 			free(key_val, M_QAT);
39978ee8d1cSJulian Grajkowski 			return 0;
40078ee8d1cSJulian Grajkowski 		}
40178ee8d1cSJulian Grajkowski 	}
40278ee8d1cSJulian Grajkowski 
40378ee8d1cSJulian Grajkowski 	sx_xlock(&cfg->lock);
40478ee8d1cSJulian Grajkowski 	adf_cfg_keyval_add(key_val, section);
40578ee8d1cSJulian Grajkowski 	sx_xunlock(&cfg->lock);
40678ee8d1cSJulian Grajkowski 	return 0;
40778ee8d1cSJulian Grajkowski }
40878ee8d1cSJulian Grajkowski 
40978ee8d1cSJulian Grajkowski int
adf_cfg_save_section(struct adf_accel_dev * accel_dev,const char * name,struct adf_cfg_section * section)41078ee8d1cSJulian Grajkowski adf_cfg_save_section(struct adf_accel_dev *accel_dev,
41178ee8d1cSJulian Grajkowski 		     const char *name,
41278ee8d1cSJulian Grajkowski 		     struct adf_cfg_section *section)
41378ee8d1cSJulian Grajkowski {
41478ee8d1cSJulian Grajkowski 	struct adf_cfg_key_val *ptr;
41578ee8d1cSJulian Grajkowski 	struct adf_cfg_section *sec = adf_cfg_sec_find(accel_dev, name);
41678ee8d1cSJulian Grajkowski 
41778ee8d1cSJulian Grajkowski 	if (!sec) {
41878ee8d1cSJulian Grajkowski 		device_printf(GET_DEV(accel_dev),
41978ee8d1cSJulian Grajkowski 			      "Couldn't find section %s\n",
42078ee8d1cSJulian Grajkowski 			      name);
42178ee8d1cSJulian Grajkowski 		return EFAULT;
42278ee8d1cSJulian Grajkowski 	}
42378ee8d1cSJulian Grajkowski 
42478ee8d1cSJulian Grajkowski 	strlcpy(section->name, name, sizeof(section->name));
42578ee8d1cSJulian Grajkowski 	INIT_LIST_HEAD(&section->param_head);
42678ee8d1cSJulian Grajkowski 
42778ee8d1cSJulian Grajkowski 	/* now we save all the parameters */
42878ee8d1cSJulian Grajkowski 	list_for_each_entry(ptr, &sec->param_head, list)
42978ee8d1cSJulian Grajkowski 	{
43078ee8d1cSJulian Grajkowski 		struct adf_cfg_key_val *key_val;
43178ee8d1cSJulian Grajkowski 
43278ee8d1cSJulian Grajkowski 		key_val = malloc(sizeof(*key_val), M_QAT, M_WAITOK | M_ZERO);
43378ee8d1cSJulian Grajkowski 
43478ee8d1cSJulian Grajkowski 		memcpy(key_val, ptr, sizeof(*key_val));
43578ee8d1cSJulian Grajkowski 		list_add_tail(&key_val->list, &section->param_head);
43678ee8d1cSJulian Grajkowski 	}
43778ee8d1cSJulian Grajkowski 	return 0;
43878ee8d1cSJulian Grajkowski }
43978ee8d1cSJulian Grajkowski 
44078ee8d1cSJulian Grajkowski static int
adf_cfg_section_save_all(struct adf_accel_dev * accel_dev,struct adf_cfg_depot_list * cfg_depot_list)44178ee8d1cSJulian Grajkowski adf_cfg_section_save_all(struct adf_accel_dev *accel_dev,
44278ee8d1cSJulian Grajkowski 			 struct adf_cfg_depot_list *cfg_depot_list)
44378ee8d1cSJulian Grajkowski {
44478ee8d1cSJulian Grajkowski 	struct adf_cfg_section *ptr_sec, *iter_sec;
44578ee8d1cSJulian Grajkowski 	struct list_head *list, *tmp, *save_list;
44678ee8d1cSJulian Grajkowski 	struct list_head *head = &accel_dev->cfg->sec_list;
44778ee8d1cSJulian Grajkowski 
44878ee8d1cSJulian Grajkowski 	save_list = &cfg_depot_list[accel_dev->accel_id].sec_list;
44978ee8d1cSJulian Grajkowski 
45078ee8d1cSJulian Grajkowski 	list_for_each_prev_safe(list, tmp, head)
45178ee8d1cSJulian Grajkowski 	{
45278ee8d1cSJulian Grajkowski 		ptr_sec = list_entry(list, struct adf_cfg_section, list);
45378ee8d1cSJulian Grajkowski 		iter_sec = malloc(sizeof(*iter_sec), M_QAT, M_WAITOK | M_ZERO);
45478ee8d1cSJulian Grajkowski 
45578ee8d1cSJulian Grajkowski 		adf_cfg_save_section(accel_dev, ptr_sec->name, iter_sec);
45678ee8d1cSJulian Grajkowski 		list_add_tail(&iter_sec->list, save_list);
45778ee8d1cSJulian Grajkowski 	}
45878ee8d1cSJulian Grajkowski 	return 0;
45978ee8d1cSJulian Grajkowski }
46078ee8d1cSJulian Grajkowski 
46178ee8d1cSJulian Grajkowski int
adf_cfg_depot_save_all(struct adf_accel_dev * accel_dev,struct adf_cfg_depot_list * cfg_depot_list)46278ee8d1cSJulian Grajkowski adf_cfg_depot_save_all(struct adf_accel_dev *accel_dev,
46378ee8d1cSJulian Grajkowski 		       struct adf_cfg_depot_list *cfg_depot_list)
46478ee8d1cSJulian Grajkowski {
46578ee8d1cSJulian Grajkowski 	struct adf_cfg_device_data *dev_cfg_data = accel_dev->cfg;
46678ee8d1cSJulian Grajkowski 	int ret = 0;
46778ee8d1cSJulian Grajkowski 
46878ee8d1cSJulian Grajkowski 	sx_xlock(&dev_cfg_data->lock);
46978ee8d1cSJulian Grajkowski 	ret = adf_cfg_section_save_all(accel_dev, cfg_depot_list);
47078ee8d1cSJulian Grajkowski 	sx_xunlock(&dev_cfg_data->lock);
47178ee8d1cSJulian Grajkowski 
47278ee8d1cSJulian Grajkowski 	return ret;
47378ee8d1cSJulian Grajkowski }
47478ee8d1cSJulian Grajkowski 
47578ee8d1cSJulian Grajkowski /**
47678ee8d1cSJulian Grajkowski  * adf_cfg_remove_key_param() - remove config entry in config table.
47778ee8d1cSJulian Grajkowski  * @accel_dev:  Pointer to acceleration device.
47878ee8d1cSJulian Grajkowski  * @section_name: Name of the section where the param will be added
47978ee8d1cSJulian Grajkowski  * @key: The key string
48078ee8d1cSJulian Grajkowski  *
48178ee8d1cSJulian Grajkowski  * Function remove configuration key
48278ee8d1cSJulian Grajkowski  * To be used by QAT device specific drivers.
48378ee8d1cSJulian Grajkowski  *
48478ee8d1cSJulian Grajkowski  * Return: 0 on success, error code otherwise.
48578ee8d1cSJulian Grajkowski  */
48678ee8d1cSJulian Grajkowski int
adf_cfg_remove_key_param(struct adf_accel_dev * accel_dev,const char * section_name,const char * key)48778ee8d1cSJulian Grajkowski adf_cfg_remove_key_param(struct adf_accel_dev *accel_dev,
48878ee8d1cSJulian Grajkowski 			 const char *section_name,
48978ee8d1cSJulian Grajkowski 			 const char *key)
49078ee8d1cSJulian Grajkowski {
49178ee8d1cSJulian Grajkowski 	struct adf_cfg_device_data *cfg = accel_dev->cfg;
49278ee8d1cSJulian Grajkowski 	struct adf_cfg_section *section =
49378ee8d1cSJulian Grajkowski 	    adf_cfg_sec_find(accel_dev, section_name);
49478ee8d1cSJulian Grajkowski 	if (!section)
49578ee8d1cSJulian Grajkowski 		return EFAULT;
49678ee8d1cSJulian Grajkowski 
49778ee8d1cSJulian Grajkowski 	sx_xlock(&cfg->lock);
49878ee8d1cSJulian Grajkowski 	adf_cfg_keyval_remove(key, section);
49978ee8d1cSJulian Grajkowski 	sx_xunlock(&cfg->lock);
50078ee8d1cSJulian Grajkowski 	return 0;
50178ee8d1cSJulian Grajkowski }
50278ee8d1cSJulian Grajkowski 
50378ee8d1cSJulian Grajkowski /**
50478ee8d1cSJulian Grajkowski  * adf_cfg_section_add() - Add config section entry to config table.
50578ee8d1cSJulian Grajkowski  * @accel_dev:  Pointer to acceleration device.
50678ee8d1cSJulian Grajkowski  * @name: Name of the section
50778ee8d1cSJulian Grajkowski  *
50878ee8d1cSJulian Grajkowski  * Function adds configuration section where key - value entries
50978ee8d1cSJulian Grajkowski  * will be stored.
51078ee8d1cSJulian Grajkowski  * To be used by QAT device specific drivers.
51178ee8d1cSJulian Grajkowski  *
51278ee8d1cSJulian Grajkowski  * Return: 0 on success, error code otherwise.
51378ee8d1cSJulian Grajkowski  */
51478ee8d1cSJulian Grajkowski int
adf_cfg_section_add(struct adf_accel_dev * accel_dev,const char * name)51578ee8d1cSJulian Grajkowski adf_cfg_section_add(struct adf_accel_dev *accel_dev, const char *name)
51678ee8d1cSJulian Grajkowski {
51778ee8d1cSJulian Grajkowski 	struct adf_cfg_device_data *cfg = accel_dev->cfg;
51878ee8d1cSJulian Grajkowski 	struct adf_cfg_section *sec = adf_cfg_sec_find(accel_dev, name);
51978ee8d1cSJulian Grajkowski 
52078ee8d1cSJulian Grajkowski 	if (sec)
52178ee8d1cSJulian Grajkowski 		return 0;
52278ee8d1cSJulian Grajkowski 
52378ee8d1cSJulian Grajkowski 	sec = malloc(sizeof(*sec), M_QAT, M_WAITOK | M_ZERO);
52478ee8d1cSJulian Grajkowski 
52578ee8d1cSJulian Grajkowski 	strlcpy(sec->name, name, sizeof(sec->name));
52678ee8d1cSJulian Grajkowski 	INIT_LIST_HEAD(&sec->param_head);
52778ee8d1cSJulian Grajkowski 	sx_xlock(&cfg->lock);
52878ee8d1cSJulian Grajkowski 	list_add_tail(&sec->list, &cfg->sec_list);
52978ee8d1cSJulian Grajkowski 	sx_xunlock(&cfg->lock);
53078ee8d1cSJulian Grajkowski 	return 0;
53178ee8d1cSJulian Grajkowski }
53278ee8d1cSJulian Grajkowski 
53378ee8d1cSJulian Grajkowski /* need to differentiate derived section with the original section */
53478ee8d1cSJulian Grajkowski int
adf_cfg_derived_section_add(struct adf_accel_dev * accel_dev,const char * name)53578ee8d1cSJulian Grajkowski adf_cfg_derived_section_add(struct adf_accel_dev *accel_dev, const char *name)
53678ee8d1cSJulian Grajkowski {
53778ee8d1cSJulian Grajkowski 	struct adf_cfg_device_data *cfg = accel_dev->cfg;
53878ee8d1cSJulian Grajkowski 	struct adf_cfg_section *sec = NULL;
53978ee8d1cSJulian Grajkowski 
54078ee8d1cSJulian Grajkowski 	if (adf_cfg_section_add(accel_dev, name))
54178ee8d1cSJulian Grajkowski 		return EFAULT;
54278ee8d1cSJulian Grajkowski 
54378ee8d1cSJulian Grajkowski 	sec = adf_cfg_sec_find(accel_dev, name);
54478ee8d1cSJulian Grajkowski 	if (!sec)
54578ee8d1cSJulian Grajkowski 		return EFAULT;
54678ee8d1cSJulian Grajkowski 
54778ee8d1cSJulian Grajkowski 	sx_xlock(&cfg->lock);
54878ee8d1cSJulian Grajkowski 	sec->is_derived = true;
54978ee8d1cSJulian Grajkowski 	sx_xunlock(&cfg->lock);
55078ee8d1cSJulian Grajkowski 	return 0;
55178ee8d1cSJulian Grajkowski }
55278ee8d1cSJulian Grajkowski 
55378ee8d1cSJulian Grajkowski static int
adf_cfg_restore_key_value_param(struct adf_accel_dev * accel_dev,const char * section_name,const char * key,const char * val,enum adf_cfg_val_type type)55478ee8d1cSJulian Grajkowski adf_cfg_restore_key_value_param(struct adf_accel_dev *accel_dev,
55578ee8d1cSJulian Grajkowski 				const char *section_name,
55678ee8d1cSJulian Grajkowski 				const char *key,
55778ee8d1cSJulian Grajkowski 				const char *val,
55878ee8d1cSJulian Grajkowski 				enum adf_cfg_val_type type)
55978ee8d1cSJulian Grajkowski {
56078ee8d1cSJulian Grajkowski 	struct adf_cfg_device_data *cfg = accel_dev->cfg;
56178ee8d1cSJulian Grajkowski 	struct adf_cfg_key_val *key_val;
56278ee8d1cSJulian Grajkowski 	struct adf_cfg_section *section =
56378ee8d1cSJulian Grajkowski 	    adf_cfg_sec_find(accel_dev, section_name);
56478ee8d1cSJulian Grajkowski 	if (!section)
56578ee8d1cSJulian Grajkowski 		return EFAULT;
56678ee8d1cSJulian Grajkowski 
56778ee8d1cSJulian Grajkowski 	key_val = malloc(sizeof(*key_val), M_QAT, M_WAITOK | M_ZERO);
56878ee8d1cSJulian Grajkowski 
56978ee8d1cSJulian Grajkowski 	INIT_LIST_HEAD(&key_val->list);
57078ee8d1cSJulian Grajkowski 
57178ee8d1cSJulian Grajkowski 	strlcpy(key_val->key, key, sizeof(key_val->key));
57278ee8d1cSJulian Grajkowski 	strlcpy(key_val->val, val, sizeof(key_val->val));
57378ee8d1cSJulian Grajkowski 	key_val->type = type;
57478ee8d1cSJulian Grajkowski 	sx_xlock(&cfg->lock);
57578ee8d1cSJulian Grajkowski 	adf_cfg_keyval_add(key_val, section);
57678ee8d1cSJulian Grajkowski 	sx_xunlock(&cfg->lock);
57778ee8d1cSJulian Grajkowski 	return 0;
57878ee8d1cSJulian Grajkowski }
57978ee8d1cSJulian Grajkowski 
58078ee8d1cSJulian Grajkowski int
adf_cfg_restore_section(struct adf_accel_dev * accel_dev,struct adf_cfg_section * section)58178ee8d1cSJulian Grajkowski adf_cfg_restore_section(struct adf_accel_dev *accel_dev,
58278ee8d1cSJulian Grajkowski 			struct adf_cfg_section *section)
58378ee8d1cSJulian Grajkowski {
58478ee8d1cSJulian Grajkowski 	struct adf_cfg_key_val *ptr;
58578ee8d1cSJulian Grajkowski 	int ret = 0;
58678ee8d1cSJulian Grajkowski 
58778ee8d1cSJulian Grajkowski 	ret = adf_cfg_section_add(accel_dev, section->name);
58878ee8d1cSJulian Grajkowski 	if (ret)
58978ee8d1cSJulian Grajkowski 		goto err;
59078ee8d1cSJulian Grajkowski 
59178ee8d1cSJulian Grajkowski 	list_for_each_entry(ptr, &section->param_head, list)
59278ee8d1cSJulian Grajkowski 	{
59378ee8d1cSJulian Grajkowski 		ret = adf_cfg_restore_key_value_param(
59478ee8d1cSJulian Grajkowski 		    accel_dev, section->name, ptr->key, ptr->val, ptr->type);
59578ee8d1cSJulian Grajkowski 		if (ret)
59678ee8d1cSJulian Grajkowski 			goto err_remove_sec;
59778ee8d1cSJulian Grajkowski 	}
59878ee8d1cSJulian Grajkowski 	return 0;
59978ee8d1cSJulian Grajkowski 
60078ee8d1cSJulian Grajkowski err_remove_sec:
60178ee8d1cSJulian Grajkowski 	adf_cfg_section_del(accel_dev, section->name);
60278ee8d1cSJulian Grajkowski err:
60378ee8d1cSJulian Grajkowski 	device_printf(GET_DEV(accel_dev),
60478ee8d1cSJulian Grajkowski 		      "Failed to restore section %s\n",
60578ee8d1cSJulian Grajkowski 		      section->name);
60678ee8d1cSJulian Grajkowski 	return ret;
60778ee8d1cSJulian Grajkowski }
60878ee8d1cSJulian Grajkowski 
60978ee8d1cSJulian Grajkowski int
adf_cfg_get_param_value(struct adf_accel_dev * accel_dev,const char * section,const char * name,char * value)61078ee8d1cSJulian Grajkowski adf_cfg_get_param_value(struct adf_accel_dev *accel_dev,
61178ee8d1cSJulian Grajkowski 			const char *section,
61278ee8d1cSJulian Grajkowski 			const char *name,
61378ee8d1cSJulian Grajkowski 			char *value)
61478ee8d1cSJulian Grajkowski {
61578ee8d1cSJulian Grajkowski 	struct adf_cfg_device_data *cfg = accel_dev->cfg;
61678ee8d1cSJulian Grajkowski 	int ret;
61778ee8d1cSJulian Grajkowski 
61878ee8d1cSJulian Grajkowski 	sx_slock(&cfg->lock);
61978ee8d1cSJulian Grajkowski 	ret = adf_cfg_key_val_get(accel_dev, section, name, value);
62078ee8d1cSJulian Grajkowski 	sx_sunlock(&cfg->lock);
62178ee8d1cSJulian Grajkowski 	return ret;
62278ee8d1cSJulian Grajkowski }
623