]> Git Repo - J-linux.git/blob - drivers/crypto/intel/qat/qat_common/adf_gen4_config.c
Merge tag 'kbuild-v6.9' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy...
[J-linux.git] / drivers / crypto / intel / qat / qat_common / adf_gen4_config.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Copyright(c) 2023 Intel Corporation */
3 #include "adf_accel_devices.h"
4 #include "adf_cfg.h"
5 #include "adf_cfg_services.h"
6 #include "adf_cfg_strings.h"
7 #include "adf_common_drv.h"
8 #include "adf_gen4_config.h"
9 #include "adf_heartbeat.h"
10 #include "adf_transport_access_macros.h"
11 #include "qat_compression.h"
12 #include "qat_crypto.h"
13
14 static int adf_crypto_dev_config(struct adf_accel_dev *accel_dev)
15 {
16         char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
17         int banks = GET_MAX_BANKS(accel_dev);
18         int cpus = num_online_cpus();
19         unsigned long bank, val;
20         int instances;
21         int ret;
22         int i;
23
24         if (adf_hw_dev_has_crypto(accel_dev))
25                 instances = min(cpus, banks / 2);
26         else
27                 instances = 0;
28
29         for (i = 0; i < instances; i++) {
30                 val = i;
31                 bank = i * 2;
32                 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_BANK_NUM, i);
33                 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
34                                                   key, &bank, ADF_DEC);
35                 if (ret)
36                         goto err;
37
38                 bank += 1;
39                 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_BANK_NUM, i);
40                 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
41                                                   key, &bank, ADF_DEC);
42                 if (ret)
43                         goto err;
44
45                 snprintf(key, sizeof(key), ADF_CY "%d" ADF_ETRMGR_CORE_AFFINITY,
46                          i);
47                 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
48                                                   key, &val, ADF_DEC);
49                 if (ret)
50                         goto err;
51
52                 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_SIZE, i);
53                 val = 128;
54                 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
55                                                   key, &val, ADF_DEC);
56                 if (ret)
57                         goto err;
58
59                 val = 512;
60                 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_SIZE, i);
61                 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
62                                                   key, &val, ADF_DEC);
63                 if (ret)
64                         goto err;
65
66                 val = 0;
67                 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_TX, i);
68                 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
69                                                   key, &val, ADF_DEC);
70                 if (ret)
71                         goto err;
72
73                 val = 0;
74                 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_TX, i);
75                 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
76                                                   key, &val, ADF_DEC);
77                 if (ret)
78                         goto err;
79
80                 val = 1;
81                 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_RX, i);
82                 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
83                                                   key, &val, ADF_DEC);
84                 if (ret)
85                         goto err;
86
87                 val = 1;
88                 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_RX, i);
89                 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
90                                                   key, &val, ADF_DEC);
91                 if (ret)
92                         goto err;
93
94                 val = ADF_COALESCING_DEF_TIME;
95                 snprintf(key, sizeof(key), ADF_ETRMGR_COALESCE_TIMER_FORMAT, i);
96                 ret = adf_cfg_add_key_value_param(accel_dev, "Accelerator0",
97                                                   key, &val, ADF_DEC);
98                 if (ret)
99                         goto err;
100         }
101
102         val = i;
103         ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_CY,
104                                           &val, ADF_DEC);
105         if (ret)
106                 goto err;
107
108         val = 0;
109         ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_DC,
110                                           &val, ADF_DEC);
111         if (ret)
112                 goto err;
113
114         return 0;
115 err:
116         dev_err(&GET_DEV(accel_dev), "Failed to add configuration for crypto\n");
117         return ret;
118 }
119
120 static int adf_comp_dev_config(struct adf_accel_dev *accel_dev)
121 {
122         char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
123         int banks = GET_MAX_BANKS(accel_dev);
124         int cpus = num_online_cpus();
125         unsigned long val;
126         int instances;
127         int ret;
128         int i;
129
130         if (adf_hw_dev_has_compression(accel_dev))
131                 instances = min(cpus, banks);
132         else
133                 instances = 0;
134
135         for (i = 0; i < instances; i++) {
136                 val = i;
137                 snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_BANK_NUM, i);
138                 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
139                                                   key, &val, ADF_DEC);
140                 if (ret)
141                         goto err;
142
143                 val = 512;
144                 snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_SIZE, i);
145                 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
146                                                   key, &val, ADF_DEC);
147                 if (ret)
148                         goto err;
149
150                 val = 0;
151                 snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_TX, i);
152                 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
153                                                   key, &val, ADF_DEC);
154                 if (ret)
155                         goto err;
156
157                 val = 1;
158                 snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_RX, i);
159                 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
160                                                   key, &val, ADF_DEC);
161                 if (ret)
162                         goto err;
163
164                 val = ADF_COALESCING_DEF_TIME;
165                 snprintf(key, sizeof(key), ADF_ETRMGR_COALESCE_TIMER_FORMAT, i);
166                 ret = adf_cfg_add_key_value_param(accel_dev, "Accelerator0",
167                                                   key, &val, ADF_DEC);
168                 if (ret)
169                         goto err;
170         }
171
172         val = i;
173         ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_DC,
174                                           &val, ADF_DEC);
175         if (ret)
176                 goto err;
177
178         val = 0;
179         ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_CY,
180                                           &val, ADF_DEC);
181         if (ret)
182                 goto err;
183
184         return 0;
185 err:
186         dev_err(&GET_DEV(accel_dev), "Failed to add configuration for compression\n");
187         return ret;
188 }
189
190 static int adf_no_dev_config(struct adf_accel_dev *accel_dev)
191 {
192         unsigned long val;
193         int ret;
194
195         val = 0;
196         ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_DC,
197                                           &val, ADF_DEC);
198         if (ret)
199                 return ret;
200
201         return adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_CY,
202                                           &val, ADF_DEC);
203 }
204
205 /**
206  * adf_gen4_dev_config() - create dev config required to create instances
207  *
208  * @accel_dev: Pointer to acceleration device.
209  *
210  * Function creates device configuration required to create instances
211  *
212  * Return: 0 on success, error code otherwise.
213  */
214 int adf_gen4_dev_config(struct adf_accel_dev *accel_dev)
215 {
216         char services[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = {0};
217         int ret;
218
219         ret = adf_cfg_section_add(accel_dev, ADF_KERNEL_SEC);
220         if (ret)
221                 goto err;
222
223         ret = adf_cfg_section_add(accel_dev, "Accelerator0");
224         if (ret)
225                 goto err;
226
227         ret = adf_cfg_get_param_value(accel_dev, ADF_GENERAL_SEC,
228                                       ADF_SERVICES_ENABLED, services);
229         if (ret)
230                 goto err;
231
232         ret = sysfs_match_string(adf_cfg_services, services);
233         if (ret < 0)
234                 goto err;
235
236         switch (ret) {
237         case SVC_CY:
238         case SVC_CY2:
239                 ret = adf_crypto_dev_config(accel_dev);
240                 break;
241         case SVC_DC:
242         case SVC_DCC:
243                 ret = adf_comp_dev_config(accel_dev);
244                 break;
245         default:
246                 ret = adf_no_dev_config(accel_dev);
247                 break;
248         }
249
250         if (ret)
251                 goto err;
252
253         set_bit(ADF_STATUS_CONFIGURED, &accel_dev->status);
254
255         return ret;
256
257 err:
258         dev_err(&GET_DEV(accel_dev), "Failed to configure QAT driver\n");
259         return ret;
260 }
261 EXPORT_SYMBOL_GPL(adf_gen4_dev_config);
262
263 int adf_gen4_cfg_dev_init(struct adf_accel_dev *accel_dev)
264 {
265         const char *config;
266         int ret;
267
268         config = accel_dev->accel_id % 2 ? ADF_CFG_DC : ADF_CFG_CY;
269
270         ret = adf_cfg_section_add(accel_dev, ADF_GENERAL_SEC);
271         if (ret)
272                 return ret;
273
274         /* Default configuration is crypto only for even devices
275          * and compression for odd devices
276          */
277         ret = adf_cfg_add_key_value_param(accel_dev, ADF_GENERAL_SEC,
278                                           ADF_SERVICES_ENABLED, config,
279                                           ADF_STR);
280         if (ret)
281                 return ret;
282
283         adf_heartbeat_save_cfg_param(accel_dev, ADF_CFG_HB_TIMER_MIN_MS);
284
285         return 0;
286 }
287 EXPORT_SYMBOL_GPL(adf_gen4_cfg_dev_init);
This page took 0.046166 seconds and 4 git commands to generate.