1// SPDX-License-Identifier: GPL-2.0-only
2/* Copyright(c) 2022 Intel Corporation */
3#include "adf_accel_devices.h"
4#include "adf_cfg.h"
5#include "adf_cfg_strings.h"
6#include "adf_gen2_config.h"
7#include "adf_common_drv.h"
8#include "qat_crypto.h"
9#include "qat_compression.h"
10#include "adf_heartbeat.h"
11#include "adf_transport_access_macros.h"
12
13static int adf_gen2_crypto_dev_config(struct adf_accel_dev *accel_dev)
14{
15	char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
16	int banks = GET_MAX_BANKS(accel_dev);
17	int cpus = num_online_cpus();
18	unsigned long val;
19	int instances;
20	int ret;
21	int i;
22
23	if (adf_hw_dev_has_crypto(accel_dev))
24		instances = min(cpus, banks);
25	else
26		instances = 0;
27
28	for (i = 0; i < instances; i++) {
29		val = i;
30		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_BANK_NUM, i);
31		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
32						  key, &val, ADF_DEC);
33		if (ret)
34			goto err;
35
36		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_BANK_NUM, i);
37		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
38						  key, &val, ADF_DEC);
39		if (ret)
40			goto err;
41
42		snprintf(key, sizeof(key), ADF_CY "%d" ADF_ETRMGR_CORE_AFFINITY,
43			 i);
44		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
45						  key, &val, ADF_DEC);
46		if (ret)
47			goto err;
48
49		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_SIZE, i);
50		val = 128;
51		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
52						  key, &val, ADF_DEC);
53		if (ret)
54			goto err;
55
56		val = 512;
57		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_SIZE, i);
58		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
59						  key, &val, ADF_DEC);
60		if (ret)
61			goto err;
62
63		val = 0;
64		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_TX, i);
65		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
66						  key, &val, ADF_DEC);
67		if (ret)
68			goto err;
69
70		val = 2;
71		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_TX, i);
72		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
73						  key, &val, ADF_DEC);
74		if (ret)
75			goto err;
76
77		val = 8;
78		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_RX, i);
79		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
80						  key, &val, ADF_DEC);
81		if (ret)
82			goto err;
83
84		val = 10;
85		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_RX, i);
86		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
87						  key, &val, ADF_DEC);
88		if (ret)
89			goto err;
90
91		val = ADF_COALESCING_DEF_TIME;
92		snprintf(key, sizeof(key), ADF_ETRMGR_COALESCE_TIMER_FORMAT, i);
93		ret = adf_cfg_add_key_value_param(accel_dev, "Accelerator0",
94						  key, &val, ADF_DEC);
95		if (ret)
96			goto err;
97	}
98
99	val = i;
100	ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_CY,
101					  &val, ADF_DEC);
102	if (ret)
103		goto err;
104
105	return ret;
106
107err:
108	dev_err(&GET_DEV(accel_dev), "Failed to add configuration for crypto\n");
109	return ret;
110}
111
112static int adf_gen2_comp_dev_config(struct adf_accel_dev *accel_dev)
113{
114	char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
115	int banks = GET_MAX_BANKS(accel_dev);
116	int cpus = num_online_cpus();
117	unsigned long val;
118	int instances;
119	int ret;
120	int i;
121
122	if (adf_hw_dev_has_compression(accel_dev))
123		instances = min(cpus, banks);
124	else
125		instances = 0;
126
127	for (i = 0; i < instances; i++) {
128		val = i;
129		snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_BANK_NUM, i);
130		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
131						  key, &val, ADF_DEC);
132		if (ret)
133			goto err;
134
135		val = 512;
136		snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_SIZE, i);
137		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
138						  key, &val, ADF_DEC);
139		if (ret)
140			goto err;
141
142		val = 6;
143		snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_TX, i);
144		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
145						  key, &val, ADF_DEC);
146		if (ret)
147			goto err;
148
149		val = 14;
150		snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_RX, i);
151		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
152						  key, &val, ADF_DEC);
153		if (ret)
154			goto err;
155	}
156
157	val = i;
158	ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_DC,
159					  &val, ADF_DEC);
160	if (ret)
161		return ret;
162
163	return ret;
164
165err:
166	dev_err(&GET_DEV(accel_dev), "Failed to add configuration for compression\n");
167	return ret;
168}
169
170/**
171 * adf_gen2_dev_config() - create dev config required to create instances
172 *
173 * @accel_dev: Pointer to acceleration device.
174 *
175 * Function creates device configuration required to create instances
176 *
177 * Return: 0 on success, error code otherwise.
178 */
179int adf_gen2_dev_config(struct adf_accel_dev *accel_dev)
180{
181	int ret;
182
183	ret = adf_cfg_section_add(accel_dev, ADF_KERNEL_SEC);
184	if (ret)
185		goto err;
186
187	ret = adf_cfg_section_add(accel_dev, "Accelerator0");
188	if (ret)
189		goto err;
190
191	ret = adf_gen2_crypto_dev_config(accel_dev);
192	if (ret)
193		goto err;
194
195	ret = adf_gen2_comp_dev_config(accel_dev);
196	if (ret)
197		goto err;
198
199	ret = adf_cfg_section_add(accel_dev, ADF_GENERAL_SEC);
200	if (ret)
201		goto err;
202
203	adf_heartbeat_save_cfg_param(accel_dev, ADF_CFG_HB_TIMER_DEFAULT_MS);
204
205	set_bit(ADF_STATUS_CONFIGURED, &accel_dev->status);
206
207	return ret;
208
209err:
210	dev_err(&GET_DEV(accel_dev), "Failed to configure QAT driver\n");
211	return ret;
212}
213EXPORT_SYMBOL_GPL(adf_gen2_dev_config);
214