xref: /dpdk/drivers/crypto/bcmfs/bcmfs_qp.h (revision 27595cd83053b2d39634a159d6709b3ce3cdf3b0)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2020 Broadcom
3  * All rights reserved.
4  */
5 
6 #ifndef _BCMFS_QP_H_
7 #define _BCMFS_QP_H_
8 
9 #include <rte_memzone.h>
10 
11 /* Maximum number of h/w queues supported by device */
12 #define BCMFS_MAX_HW_QUEUES		32
13 
14 /* H/W queue IO address space len */
15 #define BCMFS_HW_QUEUE_IO_ADDR_LEN	(64 * 1024)
16 
17 /* Maximum size of device ops name */
18 #define BCMFS_HW_OPS_NAMESIZE		32
19 
20 enum bcmfs_queue_type {
21 	/* TX or submission queue */
22 	BCMFS_RM_TXQ,
23 	 /* Completion or receive queue */
24 	BCMFS_RM_CPLQ
25 };
26 
27 #define BCMFS_QP_IOBASE_XLATE(base, idx)	\
28 		((base) + ((idx) * BCMFS_HW_QUEUE_IO_ADDR_LEN))
29 
30 /* Max pkts for preprocessing before submitting to h/w qp */
31 #define BCMFS_MAX_REQS_BUFF	64
32 
33 /* qp stats */
34 struct bcmfs_qp_stats {
35 	/* Count of all operations enqueued */
36 	uint64_t enqueued_count;
37 	/* Count of all operations dequeued */
38 	uint64_t dequeued_count;
39 	/* Total error count on operations enqueued */
40 	uint64_t enqueue_err_count;
41 	/* Total error count on operations dequeued */
42 	uint64_t dequeue_err_count;
43 };
44 
45 struct bcmfs_qp_config {
46 	/* Socket to allocate memory on */
47 	int socket_id;
48 	/* Mapped iobase for qp */
49 	void *iobase;
50 	/* nb_descriptors or requests a h/w queue can accommodate */
51 	uint16_t nb_descriptors;
52 	/* Maximum number of h/w descriptors needed by a request */
53 	uint16_t max_descs_req;
54 	/* h/w ops associated with qp */
55 	struct bcmfs_hw_queue_pair_ops *ops;
56 };
57 
58 struct bcmfs_queue {
59 	/* Base virt address */
60 	void *base_addr;
61 	/* Base iova */
62 	rte_iova_t base_phys_addr;
63 	/* Queue type */
64 	enum bcmfs_queue_type q_type;
65 	/* Queue size based on nb_descriptors and max_descs_reqs */
66 	uint32_t queue_size;
67 	union {
68 		/* s/w pointer for tx h/w queue*/
69 		uint32_t tx_write_ptr;
70 		/* s/w pointer for completion h/w queue*/
71 		uint32_t cmpl_read_ptr;
72 	};
73 	/* number of inflight descriptor accumulated  before next db ring */
74 	uint16_t descs_inflight;
75 	/* Memzone name */
76 	char memz_name[RTE_MEMZONE_NAMESIZE];
77 };
78 
79 struct __rte_cache_aligned bcmfs_qp {
80 	/* Queue-pair ID */
81 	uint16_t qpair_id;
82 	/* Mapped IO address */
83 	void *ioreg;
84 	/* A TX queue */
85 	struct bcmfs_queue tx_q;
86 	/* A Completion queue */
87 	struct bcmfs_queue cmpl_q;
88 	/* Number of requests queue can accommodate */
89 	uint32_t nb_descriptors;
90 	/* Number of pending requests and enqueued to h/w queue */
91 	uint16_t nb_pending_requests;
92 	/* A pool which act as a hash for <request-ID and virt address> pair */
93 	unsigned long *ctx_pool;
94 	/* virt address for mem allocated for bitmap */
95 	void *ctx_bmp_mem;
96 	/* Bitmap */
97 	struct rte_bitmap *ctx_bmp;
98 	/* Associated stats */
99 	struct bcmfs_qp_stats stats;
100 	/* h/w ops associated with qp */
101 	struct bcmfs_hw_queue_pair_ops *ops;
102 	/* bcmfs requests pool*/
103 	struct rte_mempool *sr_mp;
104 	/* a temporary buffer to keep message pointers */
105 	struct bcmfs_qp_message *infl_msgs[BCMFS_MAX_REQS_BUFF];
106 
107 };
108 
109 /* Structure defining h/w queue pair operations */
110 struct bcmfs_hw_queue_pair_ops {
111 	/* ops name */
112 	char name[BCMFS_HW_OPS_NAMESIZE];
113 	/* Enqueue an object */
114 	int (*enq_one_req)(struct bcmfs_qp *qp, void *obj);
115 	/* Ring doorbell */
116 	void (*ring_db)(struct bcmfs_qp *qp);
117 	/* Dequeue objects */
118 	uint16_t (*dequeue)(struct bcmfs_qp *qp, void **obj,
119 			    uint16_t nb_ops);
120 	/* Start the h/w queue */
121 	int (*startq)(struct bcmfs_qp *qp);
122 	/* Stop the h/w queue */
123 	void (*stopq)(struct bcmfs_qp *qp);
124 };
125 
126 uint16_t
127 bcmfs_enqueue_op_burst(void *qp, void **ops, uint16_t nb_ops);
128 uint16_t
129 bcmfs_dequeue_op_burst(void *qp, void **ops, uint16_t nb_ops);
130 int
131 bcmfs_qp_release(struct bcmfs_qp **qp_addr);
132 int
133 bcmfs_qp_setup(struct bcmfs_qp **qp_addr,
134 	       uint16_t queue_pair_id,
135 	       struct bcmfs_qp_config *bcmfs_conf);
136 
137 /* stats functions*/
138 void bcmfs_qp_stats_get(struct bcmfs_qp **qp, int num_qp,
139 			struct bcmfs_qp_stats *stats);
140 void bcmfs_qp_stats_reset(struct bcmfs_qp **qp, int num_qp);
141 
142 #endif /* _BCMFS_QP_H_ */
143