crypto/nitrox: add software queue management
[dpdk.git] / drivers / crypto / nitrox / nitrox_qp.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2019 Marvell International Ltd.
3  */
4
5 #include <rte_cryptodev.h>
6 #include <rte_malloc.h>
7
8 #include "nitrox_qp.h"
9 #include "nitrox_hal.h"
10 #include "nitrox_logs.h"
11
12 #define MAX_CMD_QLEN 16384
13
14 static int
15 nitrox_setup_ridq(struct nitrox_qp *qp, int socket_id)
16 {
17         size_t ridq_size = qp->count * sizeof(*qp->ridq);
18
19         qp->ridq = rte_zmalloc_socket("nitrox ridq", ridq_size,
20                                    RTE_CACHE_LINE_SIZE,
21                                    socket_id);
22         if (!qp->ridq) {
23                 NITROX_LOG(ERR, "Failed to create rid queue\n");
24                 return -ENOMEM;
25         }
26
27         return 0;
28 }
29
30 int
31 nitrox_qp_setup(struct nitrox_qp *qp, uint8_t *bar_addr, const char *dev_name,
32                 uint32_t nb_descriptors, uint8_t instr_size, int socket_id)
33 {
34         int err;
35         uint32_t count;
36
37         RTE_SET_USED(bar_addr);
38         RTE_SET_USED(instr_size);
39         count = rte_align32pow2(nb_descriptors);
40         if (count > MAX_CMD_QLEN) {
41                 NITROX_LOG(ERR, "%s: Number of descriptors too big %d,"
42                            " greater than max queue length %d\n",
43                            dev_name, count,
44                            MAX_CMD_QLEN);
45                 return -EINVAL;
46         }
47
48         qp->count = count;
49         qp->head = qp->tail = 0;
50         rte_atomic16_init(&qp->pending_count);
51         err = nitrox_setup_ridq(qp, socket_id);
52         if (err)
53                 goto ridq_err;
54
55         return 0;
56
57 ridq_err:
58         return err;
59
60 }
61
62 static void
63 nitrox_release_ridq(struct nitrox_qp *qp)
64 {
65         rte_free(qp->ridq);
66 }
67
68 int
69 nitrox_qp_release(struct nitrox_qp *qp, uint8_t *bar_addr)
70 {
71         RTE_SET_USED(bar_addr);
72         nitrox_release_ridq(qp);
73         return 0;
74 }