1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2019 Marvell International Ltd.
5 #include <rte_cryptodev.h>
6 #include <rte_malloc.h>
9 #include "nitrox_hal.h"
10 #include "nitrox_logs.h"
12 #define MAX_CMD_QLEN 16384
13 #define CMDQ_PKT_IN_ALIGN 16
16 nitrox_setup_cmdq(struct nitrox_qp
*qp
, uint8_t *bar_addr
,
17 const char *dev_name
, uint8_t instr_size
, int socket_id
)
19 char mz_name
[RTE_MEMZONE_NAMESIZE
];
20 const struct rte_memzone
*mz
;
21 size_t cmdq_size
= qp
->count
* instr_size
;
24 snprintf(mz_name
, sizeof(mz_name
), "%s_cmdq_%d", dev_name
, qp
->qno
);
25 mz
= rte_memzone_reserve_aligned(mz_name
, cmdq_size
, socket_id
,
26 RTE_MEMZONE_SIZE_HINT_ONLY
|
30 NITROX_LOG(ERR
, "cmdq memzone reserve failed for %s queue\n",
36 offset
= NPS_PKT_IN_INSTR_BAOFF_DBELLX(qp
->qno
);
37 qp
->cmdq
.dbell_csr_addr
= NITROX_CSR_ADDR(bar_addr
, offset
);
38 qp
->cmdq
.ring
= mz
->addr
;
39 qp
->cmdq
.instr_size
= instr_size
;
40 setup_nps_pkt_input_ring(bar_addr
, qp
->qno
, qp
->count
, mz
->iova
);
41 setup_nps_pkt_solicit_output_port(bar_addr
, qp
->qno
);
47 nitrox_setup_ridq(struct nitrox_qp
*qp
, int socket_id
)
49 size_t ridq_size
= qp
->count
* sizeof(*qp
->ridq
);
51 qp
->ridq
= rte_zmalloc_socket("nitrox ridq", ridq_size
,
55 NITROX_LOG(ERR
, "Failed to create rid queue\n");
63 nitrox_release_cmdq(struct nitrox_qp
*qp
, uint8_t *bar_addr
)
65 nps_pkt_solicited_port_disable(bar_addr
, qp
->qno
);
66 nps_pkt_input_ring_disable(bar_addr
, qp
->qno
);
67 return rte_memzone_free(qp
->cmdq
.mz
);
71 nitrox_qp_setup(struct nitrox_qp
*qp
, uint8_t *bar_addr
, const char *dev_name
,
72 uint32_t nb_descriptors
, uint8_t instr_size
, int socket_id
)
77 count
= rte_align32pow2(nb_descriptors
);
78 if (count
> MAX_CMD_QLEN
) {
79 NITROX_LOG(ERR
, "%s: Number of descriptors too big %d,"
80 " greater than max queue length %d\n",
87 qp
->head
= qp
->tail
= 0;
88 rte_atomic16_init(&qp
->pending_count
);
89 err
= nitrox_setup_cmdq(qp
, bar_addr
, dev_name
, instr_size
, socket_id
);
93 err
= nitrox_setup_ridq(qp
, socket_id
);
100 nitrox_release_cmdq(qp
, bar_addr
);
105 nitrox_release_ridq(struct nitrox_qp
*qp
)
111 nitrox_qp_release(struct nitrox_qp
*qp
, uint8_t *bar_addr
)
113 nitrox_release_ridq(qp
);
114 return nitrox_release_cmdq(qp
, bar_addr
);