1 /*
2 This file is provided under a dual BSD/GPLv2 license. When using or
3 redistributing this file, you may do so under either license.
4
5 GPL LICENSE SUMMARY
6 Copyright(c) 2014 Intel Corporation.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of version 2 of the GNU General Public License as
9 published by the Free Software Foundation.
10
11 This program is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
15
16 Contact Information:
17 qat-linux@intel.com
18
19 BSD LICENSE
20 Copyright(c) 2014 Intel Corporation.
21 Redistribution and use in source and binary forms, with or without
22 modification, are permitted provided that the following conditions
23 are met:
24
25 * Redistributions of source code must retain the above copyright
26 notice, this list of conditions and the following disclaimer.
27 * Redistributions in binary form must reproduce the above copyright
28 notice, this list of conditions and the following disclaimer in
29 the documentation and/or other materials provided with the
30 distribution.
31 * Neither the name of Intel Corporation nor the names of its
32 contributors may be used to endorse or promote products derived
33 from this software without specific prior written permission.
34
35 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
36 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
37 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
38 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
39 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
42 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
43 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
44 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
45 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
46 */
47 #include <linux/delay.h>
48 #include "adf_accel_devices.h"
49 #include "adf_transport_internal.h"
50 #include "adf_transport_access_macros.h"
51 #include "adf_cfg.h"
52 #include "adf_common_drv.h"
53
adf_modulo(uint32_t data,uint32_t shift)54 static inline uint32_t adf_modulo(uint32_t data, uint32_t shift)
55 {
56 uint32_t div = data >> shift;
57 uint32_t mult = div << shift;
58
59 return data - mult;
60 }
61
adf_check_ring_alignment(uint64_t addr,uint64_t size)62 static inline int adf_check_ring_alignment(uint64_t addr, uint64_t size)
63 {
64 if (((size - 1) & addr) != 0)
65 return -EFAULT;
66 return 0;
67 }
68
adf_verify_ring_size(uint32_t msg_size,uint32_t msg_num)69 static int adf_verify_ring_size(uint32_t msg_size, uint32_t msg_num)
70 {
71 int i = ADF_MIN_RING_SIZE;
72
73 for (; i <= ADF_MAX_RING_SIZE; i++)
74 if ((msg_size * msg_num) == ADF_SIZE_TO_RING_SIZE_IN_BYTES(i))
75 return i;
76
77 return ADF_DEFAULT_RING_SIZE;
78 }
79
adf_reserve_ring(struct adf_etr_bank_data * bank,uint32_t ring)80 static int adf_reserve_ring(struct adf_etr_bank_data *bank, uint32_t ring)
81 {
82 spin_lock(&bank->lock);
83 if (bank->ring_mask & (1 << ring)) {
84 spin_unlock(&bank->lock);
85 return -EFAULT;
86 }
87 bank->ring_mask |= (1 << ring);
88 spin_unlock(&bank->lock);
89 return 0;
90 }
91
adf_unreserve_ring(struct adf_etr_bank_data * bank,uint32_t ring)92 static void adf_unreserve_ring(struct adf_etr_bank_data *bank, uint32_t ring)
93 {
94 spin_lock(&bank->lock);
95 bank->ring_mask &= ~(1 << ring);
96 spin_unlock(&bank->lock);
97 }
98
adf_enable_ring_irq(struct adf_etr_bank_data * bank,uint32_t ring)99 static void adf_enable_ring_irq(struct adf_etr_bank_data *bank, uint32_t ring)
100 {
101 spin_lock_bh(&bank->lock);
102 bank->irq_mask |= (1 << ring);
103 spin_unlock_bh(&bank->lock);
104 WRITE_CSR_INT_COL_EN(bank->csr_addr, bank->bank_number, bank->irq_mask);
105 WRITE_CSR_INT_COL_CTL(bank->csr_addr, bank->bank_number,
106 bank->irq_coalesc_timer);
107 }
108
adf_disable_ring_irq(struct adf_etr_bank_data * bank,uint32_t ring)109 static void adf_disable_ring_irq(struct adf_etr_bank_data *bank, uint32_t ring)
110 {
111 spin_lock_bh(&bank->lock);
112 bank->irq_mask &= ~(1 << ring);
113 spin_unlock_bh(&bank->lock);
114 WRITE_CSR_INT_COL_EN(bank->csr_addr, bank->bank_number, bank->irq_mask);
115 }
116
adf_send_message(struct adf_etr_ring_data * ring,uint32_t * msg)117 int adf_send_message(struct adf_etr_ring_data *ring, uint32_t *msg)
118 {
119 if (atomic_add_return(1, ring->inflights) >
120 ADF_MAX_INFLIGHTS(ring->ring_size, ring->msg_size)) {
121 atomic_dec(ring->inflights);
122 return -EAGAIN;
123 }
124 spin_lock_bh(&ring->lock);
125 memcpy((void *)((uintptr_t)ring->base_addr + ring->tail), msg,
126 ADF_MSG_SIZE_TO_BYTES(ring->msg_size));
127
128 ring->tail = adf_modulo(ring->tail +
129 ADF_MSG_SIZE_TO_BYTES(ring->msg_size),
130 ADF_RING_SIZE_MODULO(ring->ring_size));
131 WRITE_CSR_RING_TAIL(ring->bank->csr_addr, ring->bank->bank_number,
132 ring->ring_number, ring->tail);
133 spin_unlock_bh(&ring->lock);
134 return 0;
135 }
136
adf_handle_response(struct adf_etr_ring_data * ring)137 static int adf_handle_response(struct adf_etr_ring_data *ring)
138 {
139 uint32_t msg_counter = 0;
140 uint32_t *msg = (uint32_t *)((uintptr_t)ring->base_addr + ring->head);
141
142 while (*msg != ADF_RING_EMPTY_SIG) {
143 ring->callback((uint32_t *)msg);
144 atomic_dec(ring->inflights);
145 *msg = ADF_RING_EMPTY_SIG;
146 ring->head = adf_modulo(ring->head +
147 ADF_MSG_SIZE_TO_BYTES(ring->msg_size),
148 ADF_RING_SIZE_MODULO(ring->ring_size));
149 msg_counter++;
150 msg = (uint32_t *)((uintptr_t)ring->base_addr + ring->head);
151 }
152 if (msg_counter > 0)
153 WRITE_CSR_RING_HEAD(ring->bank->csr_addr,
154 ring->bank->bank_number,
155 ring->ring_number, ring->head);
156 return 0;
157 }
158
adf_configure_tx_ring(struct adf_etr_ring_data * ring)159 static void adf_configure_tx_ring(struct adf_etr_ring_data *ring)
160 {
161 uint32_t ring_config = BUILD_RING_CONFIG(ring->ring_size);
162
163 WRITE_CSR_RING_CONFIG(ring->bank->csr_addr, ring->bank->bank_number,
164 ring->ring_number, ring_config);
165 }
166
adf_configure_rx_ring(struct adf_etr_ring_data * ring)167 static void adf_configure_rx_ring(struct adf_etr_ring_data *ring)
168 {
169 uint32_t ring_config =
170 BUILD_RESP_RING_CONFIG(ring->ring_size,
171 ADF_RING_NEAR_WATERMARK_512,
172 ADF_RING_NEAR_WATERMARK_0);
173
174 WRITE_CSR_RING_CONFIG(ring->bank->csr_addr, ring->bank->bank_number,
175 ring->ring_number, ring_config);
176 }
177
adf_init_ring(struct adf_etr_ring_data * ring)178 static int adf_init_ring(struct adf_etr_ring_data *ring)
179 {
180 struct adf_etr_bank_data *bank = ring->bank;
181 struct adf_accel_dev *accel_dev = bank->accel_dev;
182 struct adf_hw_device_data *hw_data = accel_dev->hw_device;
183 uint64_t ring_base;
184 uint32_t ring_size_bytes =
185 ADF_SIZE_TO_RING_SIZE_IN_BYTES(ring->ring_size);
186
187 ring_size_bytes = ADF_RING_SIZE_BYTES_MIN(ring_size_bytes);
188 ring->base_addr = dma_alloc_coherent(&GET_DEV(accel_dev),
189 ring_size_bytes, &ring->dma_addr,
190 GFP_KERNEL);
191 if (!ring->base_addr)
192 return -ENOMEM;
193
194 memset(ring->base_addr, 0x7F, ring_size_bytes);
195 /* The base_addr has to be aligned to the size of the buffer */
196 if (adf_check_ring_alignment(ring->dma_addr, ring_size_bytes)) {
197 dev_err(&GET_DEV(accel_dev), "Ring address not aligned\n");
198 dma_free_coherent(&GET_DEV(accel_dev), ring_size_bytes,
199 ring->base_addr, ring->dma_addr);
200 return -EFAULT;
201 }
202
203 if (hw_data->tx_rings_mask & (1 << ring->ring_number))
204 adf_configure_tx_ring(ring);
205
206 else
207 adf_configure_rx_ring(ring);
208
209 ring_base = BUILD_RING_BASE_ADDR(ring->dma_addr, ring->ring_size);
210 WRITE_CSR_RING_BASE(ring->bank->csr_addr, ring->bank->bank_number,
211 ring->ring_number, ring_base);
212 spin_lock_init(&ring->lock);
213 return 0;
214 }
215
adf_cleanup_ring(struct adf_etr_ring_data * ring)216 static void adf_cleanup_ring(struct adf_etr_ring_data *ring)
217 {
218 uint32_t ring_size_bytes =
219 ADF_SIZE_TO_RING_SIZE_IN_BYTES(ring->ring_size);
220 ring_size_bytes = ADF_RING_SIZE_BYTES_MIN(ring_size_bytes);
221
222 if (ring->base_addr) {
223 memset(ring->base_addr, 0x7F, ring_size_bytes);
224 dma_free_coherent(&GET_DEV(ring->bank->accel_dev),
225 ring_size_bytes, ring->base_addr,
226 ring->dma_addr);
227 }
228 }
229
adf_create_ring(struct adf_accel_dev * accel_dev,const char * section,uint32_t bank_num,uint32_t num_msgs,uint32_t msg_size,const char * ring_name,adf_callback_fn callback,int poll_mode,struct adf_etr_ring_data ** ring_ptr)230 int adf_create_ring(struct adf_accel_dev *accel_dev, const char *section,
231 uint32_t bank_num, uint32_t num_msgs,
232 uint32_t msg_size, const char *ring_name,
233 adf_callback_fn callback, int poll_mode,
234 struct adf_etr_ring_data **ring_ptr)
235 {
236 struct adf_etr_data *transport_data = accel_dev->transport;
237 struct adf_etr_bank_data *bank;
238 struct adf_etr_ring_data *ring;
239 char val[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
240 uint32_t ring_num;
241 int ret;
242
243 if (bank_num >= GET_MAX_BANKS(accel_dev)) {
244 dev_err(&GET_DEV(accel_dev), "Invalid bank number\n");
245 return -EFAULT;
246 }
247 if (msg_size > ADF_MSG_SIZE_TO_BYTES(ADF_MAX_MSG_SIZE)) {
248 dev_err(&GET_DEV(accel_dev), "Invalid msg size\n");
249 return -EFAULT;
250 }
251 if (ADF_MAX_INFLIGHTS(adf_verify_ring_size(msg_size, num_msgs),
252 ADF_BYTES_TO_MSG_SIZE(msg_size)) < 2) {
253 dev_err(&GET_DEV(accel_dev),
254 "Invalid ring size for given msg size\n");
255 return -EFAULT;
256 }
257 if (adf_cfg_get_param_value(accel_dev, section, ring_name, val)) {
258 dev_err(&GET_DEV(accel_dev), "Section %s, no such entry : %s\n",
259 section, ring_name);
260 return -EFAULT;
261 }
262 if (kstrtouint(val, 10, &ring_num)) {
263 dev_err(&GET_DEV(accel_dev), "Can't get ring number\n");
264 return -EFAULT;
265 }
266 if (ring_num >= ADF_ETR_MAX_RINGS_PER_BANK) {
267 dev_err(&GET_DEV(accel_dev), "Invalid ring number\n");
268 return -EFAULT;
269 }
270
271 bank = &transport_data->banks[bank_num];
272 if (adf_reserve_ring(bank, ring_num)) {
273 dev_err(&GET_DEV(accel_dev), "Ring %d, %s already exists.\n",
274 ring_num, ring_name);
275 return -EFAULT;
276 }
277 ring = &bank->rings[ring_num];
278 ring->ring_number = ring_num;
279 ring->bank = bank;
280 ring->callback = callback;
281 ring->msg_size = ADF_BYTES_TO_MSG_SIZE(msg_size);
282 ring->ring_size = adf_verify_ring_size(msg_size, num_msgs);
283 ring->head = 0;
284 ring->tail = 0;
285 atomic_set(ring->inflights, 0);
286 ret = adf_init_ring(ring);
287 if (ret)
288 goto err;
289
290 /* Enable HW arbitration for the given ring */
291 adf_update_ring_arb(ring);
292
293 if (adf_ring_debugfs_add(ring, ring_name)) {
294 dev_err(&GET_DEV(accel_dev),
295 "Couldn't add ring debugfs entry\n");
296 ret = -EFAULT;
297 goto err;
298 }
299
300 /* Enable interrupts if needed */
301 if (callback && (!poll_mode))
302 adf_enable_ring_irq(bank, ring->ring_number);
303 *ring_ptr = ring;
304 return 0;
305 err:
306 adf_cleanup_ring(ring);
307 adf_unreserve_ring(bank, ring_num);
308 adf_update_ring_arb(ring);
309 return ret;
310 }
311
adf_remove_ring(struct adf_etr_ring_data * ring)312 void adf_remove_ring(struct adf_etr_ring_data *ring)
313 {
314 struct adf_etr_bank_data *bank = ring->bank;
315
316 /* Disable interrupts for the given ring */
317 adf_disable_ring_irq(bank, ring->ring_number);
318
319 /* Clear PCI config space */
320 WRITE_CSR_RING_CONFIG(bank->csr_addr, bank->bank_number,
321 ring->ring_number, 0);
322 WRITE_CSR_RING_BASE(bank->csr_addr, bank->bank_number,
323 ring->ring_number, 0);
324 adf_ring_debugfs_rm(ring);
325 adf_unreserve_ring(bank, ring->ring_number);
326 /* Disable HW arbitration for the given ring */
327 adf_update_ring_arb(ring);
328 adf_cleanup_ring(ring);
329 }
330
adf_ring_response_handler(struct adf_etr_bank_data * bank)331 static void adf_ring_response_handler(struct adf_etr_bank_data *bank)
332 {
333 uint32_t empty_rings, i;
334
335 empty_rings = READ_CSR_E_STAT(bank->csr_addr, bank->bank_number);
336 empty_rings = ~empty_rings & bank->irq_mask;
337
338 for (i = 0; i < ADF_ETR_MAX_RINGS_PER_BANK; ++i) {
339 if (empty_rings & (1 << i))
340 adf_handle_response(&bank->rings[i]);
341 }
342 }
343
adf_response_handler(uintptr_t bank_addr)344 void adf_response_handler(uintptr_t bank_addr)
345 {
346 struct adf_etr_bank_data *bank = (void *)bank_addr;
347
348 /* Handle all the responses and reenable IRQs */
349 adf_ring_response_handler(bank);
350 WRITE_CSR_INT_FLAG_AND_COL(bank->csr_addr, bank->bank_number,
351 bank->irq_mask);
352 }
353
adf_get_cfg_int(struct adf_accel_dev * accel_dev,const char * section,const char * format,uint32_t key,uint32_t * value)354 static inline int adf_get_cfg_int(struct adf_accel_dev *accel_dev,
355 const char *section, const char *format,
356 uint32_t key, uint32_t *value)
357 {
358 char key_buf[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
359 char val_buf[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
360
361 snprintf(key_buf, ADF_CFG_MAX_KEY_LEN_IN_BYTES, format, key);
362
363 if (adf_cfg_get_param_value(accel_dev, section, key_buf, val_buf))
364 return -EFAULT;
365
366 if (kstrtouint(val_buf, 10, value))
367 return -EFAULT;
368 return 0;
369 }
370
adf_get_coalesc_timer(struct adf_etr_bank_data * bank,const char * section,uint32_t bank_num_in_accel)371 static void adf_get_coalesc_timer(struct adf_etr_bank_data *bank,
372 const char *section,
373 uint32_t bank_num_in_accel)
374 {
375 if (adf_get_cfg_int(bank->accel_dev, section,
376 ADF_ETRMGR_COALESCE_TIMER_FORMAT,
377 bank_num_in_accel, &bank->irq_coalesc_timer))
378 bank->irq_coalesc_timer = ADF_COALESCING_DEF_TIME;
379
380 if (ADF_COALESCING_MAX_TIME < bank->irq_coalesc_timer ||
381 ADF_COALESCING_MIN_TIME > bank->irq_coalesc_timer)
382 bank->irq_coalesc_timer = ADF_COALESCING_DEF_TIME;
383 }
384
adf_init_bank(struct adf_accel_dev * accel_dev,struct adf_etr_bank_data * bank,uint32_t bank_num,void __iomem * csr_addr)385 static int adf_init_bank(struct adf_accel_dev *accel_dev,
386 struct adf_etr_bank_data *bank,
387 uint32_t bank_num, void __iomem *csr_addr)
388 {
389 struct adf_hw_device_data *hw_data = accel_dev->hw_device;
390 struct adf_etr_ring_data *ring;
391 struct adf_etr_ring_data *tx_ring;
392 uint32_t i, coalesc_enabled = 0;
393
394 memset(bank, 0, sizeof(*bank));
395 bank->bank_number = bank_num;
396 bank->csr_addr = csr_addr;
397 bank->accel_dev = accel_dev;
398 spin_lock_init(&bank->lock);
399
400 /* Enable IRQ coalescing always. This will allow to use
401 * the optimised flag and coalesc register.
402 * If it is disabled in the config file just use min time value */
403 if ((adf_get_cfg_int(accel_dev, "Accelerator0",
404 ADF_ETRMGR_COALESCING_ENABLED_FORMAT, bank_num,
405 &coalesc_enabled) == 0) && coalesc_enabled)
406 adf_get_coalesc_timer(bank, "Accelerator0", bank_num);
407 else
408 bank->irq_coalesc_timer = ADF_COALESCING_MIN_TIME;
409
410 for (i = 0; i < ADF_ETR_MAX_RINGS_PER_BANK; i++) {
411 WRITE_CSR_RING_CONFIG(csr_addr, bank_num, i, 0);
412 WRITE_CSR_RING_BASE(csr_addr, bank_num, i, 0);
413 ring = &bank->rings[i];
414 if (hw_data->tx_rings_mask & (1 << i)) {
415 ring->inflights =
416 kzalloc_node(sizeof(atomic_t),
417 GFP_KERNEL,
418 dev_to_node(&GET_DEV(accel_dev)));
419 if (!ring->inflights)
420 goto err;
421 } else {
422 if (i < hw_data->tx_rx_gap) {
423 dev_err(&GET_DEV(accel_dev),
424 "Invalid tx rings mask config\n");
425 goto err;
426 }
427 tx_ring = &bank->rings[i - hw_data->tx_rx_gap];
428 ring->inflights = tx_ring->inflights;
429 }
430 }
431 if (adf_bank_debugfs_add(bank)) {
432 dev_err(&GET_DEV(accel_dev),
433 "Failed to add bank debugfs entry\n");
434 goto err;
435 }
436
437 WRITE_CSR_INT_FLAG(csr_addr, bank_num, ADF_BANK_INT_FLAG_CLEAR_MASK);
438 WRITE_CSR_INT_SRCSEL(csr_addr, bank_num);
439 return 0;
440 err:
441 for (i = 0; i < ADF_ETR_MAX_RINGS_PER_BANK; i++) {
442 ring = &bank->rings[i];
443 if (hw_data->tx_rings_mask & (1 << i))
444 kfree(ring->inflights);
445 }
446 return -ENOMEM;
447 }
448
449 /**
450 * adf_init_etr_data() - Initialize transport rings for acceleration device
451 * @accel_dev: Pointer to acceleration device.
452 *
453 * Function is the initializes the communications channels (rings) to the
454 * acceleration device accel_dev.
455 * To be used by QAT device specific drivers.
456 *
457 * Return: 0 on success, error code otherwise.
458 */
adf_init_etr_data(struct adf_accel_dev * accel_dev)459 int adf_init_etr_data(struct adf_accel_dev *accel_dev)
460 {
461 struct adf_etr_data *etr_data;
462 struct adf_hw_device_data *hw_data = accel_dev->hw_device;
463 void __iomem *csr_addr;
464 uint32_t size;
465 uint32_t num_banks = 0;
466 int i, ret;
467
468 etr_data = kzalloc_node(sizeof(*etr_data), GFP_KERNEL,
469 dev_to_node(&GET_DEV(accel_dev)));
470 if (!etr_data)
471 return -ENOMEM;
472
473 num_banks = GET_MAX_BANKS(accel_dev);
474 size = num_banks * sizeof(struct adf_etr_bank_data);
475 etr_data->banks = kzalloc_node(size, GFP_KERNEL,
476 dev_to_node(&GET_DEV(accel_dev)));
477 if (!etr_data->banks) {
478 ret = -ENOMEM;
479 goto err_bank;
480 }
481
482 accel_dev->transport = etr_data;
483 i = hw_data->get_etr_bar_id(hw_data);
484 csr_addr = accel_dev->accel_pci_dev.pci_bars[i].virt_addr;
485
486 /* accel_dev->debugfs_dir should always be non-NULL here */
487 etr_data->debug = debugfs_create_dir("transport",
488 accel_dev->debugfs_dir);
489 if (!etr_data->debug) {
490 dev_err(&GET_DEV(accel_dev),
491 "Unable to create transport debugfs entry\n");
492 ret = -ENOENT;
493 goto err_bank_debug;
494 }
495
496 for (i = 0; i < num_banks; i++) {
497 ret = adf_init_bank(accel_dev, &etr_data->banks[i], i,
498 csr_addr);
499 if (ret)
500 goto err_bank_all;
501 }
502
503 return 0;
504
505 err_bank_all:
506 debugfs_remove(etr_data->debug);
507 err_bank_debug:
508 kfree(etr_data->banks);
509 err_bank:
510 kfree(etr_data);
511 accel_dev->transport = NULL;
512 return ret;
513 }
514 EXPORT_SYMBOL_GPL(adf_init_etr_data);
515
cleanup_bank(struct adf_etr_bank_data * bank)516 static void cleanup_bank(struct adf_etr_bank_data *bank)
517 {
518 uint32_t i;
519
520 for (i = 0; i < ADF_ETR_MAX_RINGS_PER_BANK; i++) {
521 struct adf_accel_dev *accel_dev = bank->accel_dev;
522 struct adf_hw_device_data *hw_data = accel_dev->hw_device;
523 struct adf_etr_ring_data *ring = &bank->rings[i];
524
525 if (bank->ring_mask & (1 << i))
526 adf_cleanup_ring(ring);
527
528 if (hw_data->tx_rings_mask & (1 << i))
529 kfree(ring->inflights);
530 }
531 adf_bank_debugfs_rm(bank);
532 memset(bank, 0, sizeof(*bank));
533 }
534
adf_cleanup_etr_handles(struct adf_accel_dev * accel_dev)535 static void adf_cleanup_etr_handles(struct adf_accel_dev *accel_dev)
536 {
537 struct adf_etr_data *etr_data = accel_dev->transport;
538 uint32_t i, num_banks = GET_MAX_BANKS(accel_dev);
539
540 for (i = 0; i < num_banks; i++)
541 cleanup_bank(&etr_data->banks[i]);
542 }
543
544 /**
545 * adf_cleanup_etr_data() - Clear transport rings for acceleration device
546 * @accel_dev: Pointer to acceleration device.
547 *
548 * Function is the clears the communications channels (rings) of the
549 * acceleration device accel_dev.
550 * To be used by QAT device specific drivers.
551 *
552 * Return: void
553 */
adf_cleanup_etr_data(struct adf_accel_dev * accel_dev)554 void adf_cleanup_etr_data(struct adf_accel_dev *accel_dev)
555 {
556 struct adf_etr_data *etr_data = accel_dev->transport;
557
558 if (etr_data) {
559 adf_cleanup_etr_handles(accel_dev);
560 debugfs_remove(etr_data->debug);
561 kfree(etr_data->banks);
562 kfree(etr_data);
563 accel_dev->transport = NULL;
564 }
565 }
566 EXPORT_SYMBOL_GPL(adf_cleanup_etr_data);
567