Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(c) 2014-2023 Broadcom
3 : : * All rights reserved.
4 : : */
5 : :
6 : : #ifndef _BNXT_RING_H_
7 : : #define _BNXT_RING_H_
8 : :
9 : : #include <inttypes.h>
10 : :
11 : : #include <rte_memory.h>
12 : :
13 : : #define RING_ADV(idx, n) ((idx) + (n))
14 : : #define RING_NEXT(idx) RING_ADV(idx, 1)
15 : : #define RING_IDX(ring, idx) ((idx) & (ring)->ring_mask)
16 : :
17 : : #define DB_IDX_MASK 0xffffff
18 : : #define DB_IDX_VALID (0x1 << 26)
19 : : #define DB_IRQ_DIS (0x1 << 27)
20 : : #define DB_KEY_TX (0x0 << 28)
21 : : #define DB_KEY_RX (0x1 << 28)
22 : : #define DB_KEY_CP (0x2 << 28)
23 : : #define DB_KEY_ST (0x3 << 28)
24 : : #define DB_KEY_TX_PUSH (0x4 << 28)
25 : : #define DB_LONG_TX_PUSH (0x2 << 24)
26 : :
27 : : #define DEFAULT_CP_RING_SIZE 4096
28 : : #define DEFAULT_RX_RING_SIZE 256
29 : : #define DEFAULT_TX_RING_SIZE 256
30 : :
31 : : #define AGG_RING_SIZE_FACTOR 4
32 : : #define AGG_RING_MULTIPLIER 2
33 : :
34 : : /* These assume 4k pages */
35 : : #define MAX_RX_DESC_CNT (8 * 1024)
36 : : #define MAX_TX_DESC_CNT (4 * 1024)
37 : : #define MAX_CP_DESC_CNT (16 * 1024)
38 : :
39 : : #define INVALID_HW_RING_ID ((uint16_t)-1)
40 : : #define INVALID_STATS_CTX_ID ((uint16_t)-1)
41 : : #define MPC_HW_COS_ID ((uint16_t)-2)
42 : :
43 : : struct bnxt_ring {
44 : : void *bd;
45 : : rte_iova_t bd_dma;
46 : : uint32_t ring_size;
47 : : uint32_t ring_mask;
48 : :
49 : : int vmem_size;
50 : : void **vmem;
51 : :
52 : : uint16_t fw_ring_id; /* Ring id filled by Chimp FW */
53 : : uint16_t fw_rx_ring_id;
54 : : const void *mem_zone;
55 : : };
56 : :
57 : : struct bnxt_ring_grp_info {
58 : : uint16_t fw_stats_ctx;
59 : : uint16_t fw_grp_id;
60 : : uint16_t rx_fw_ring_id;
61 : : uint16_t cp_fw_ring_id;
62 : : uint16_t ag_fw_ring_id;
63 : : };
64 : :
65 : : struct bnxt;
66 : : struct bnxt_tx_ring_info;
67 : : struct bnxt_rx_ring_info;
68 : : struct bnxt_cp_ring_info;
69 : : void bnxt_free_ring(struct bnxt_ring *ring);
70 : : int bnxt_alloc_ring_grps(struct bnxt *bp);
71 : : int bnxt_alloc_rings(struct bnxt *bp, unsigned int socket_id, uint16_t qidx,
72 : : struct bnxt_tx_queue *txq,
73 : : struct bnxt_rx_queue *rxq,
74 : : struct bnxt_cp_ring_info *cp_ring_info,
75 : : struct bnxt_cp_ring_info *nq_ring_info,
76 : : const char *suffix);
77 : : int bnxt_alloc_hwrm_rx_ring(struct bnxt *bp, int queue_index);
78 : : int bnxt_alloc_hwrm_rings(struct bnxt *bp);
79 : : int bnxt_alloc_async_cp_ring(struct bnxt *bp);
80 : : void bnxt_free_async_cp_ring(struct bnxt *bp);
81 : : int bnxt_alloc_async_ring_struct(struct bnxt *bp);
82 : : int bnxt_alloc_rxtx_nq_ring(struct bnxt *bp);
83 : : void bnxt_free_rxtx_nq_ring(struct bnxt *bp);
84 : : void bnxt_init_dflt_coal(struct bnxt_coal *coal);
85 : : int bnxt_alloc_cmpl_ring(struct bnxt *bp, int queue_index,
86 : : struct bnxt_cp_ring_info *cpr);
87 : : void bnxt_set_db(struct bnxt *bp,
88 : : struct bnxt_db_info *db,
89 : : uint32_t ring_type,
90 : : uint32_t map_idx,
91 : : uint32_t fid,
92 : : uint32_t ring_mask,
93 : : uint16_t dpi);
94 : :
95 : : static inline void bnxt_db_write(struct bnxt_db_info *db, uint32_t idx)
96 : : {
97 [ # # # # : 0 : uint32_t db_idx = DB_RING_IDX(db, idx);
# # # # #
# # # #
# ]
98 : 0 : void *doorbell = db->doorbell;
99 : :
100 [ # # # # : 0 : if (db->db_64) {
# # # # #
# # # #
# ]
101 : 0 : uint64_t key_idx = db->db_key64 | db_idx;
102 : :
103 : 0 : rte_compiler_barrier();
104 : : rte_write64_relaxed(key_idx, doorbell);
105 : : } else {
106 : 0 : uint32_t key_idx = db->db_key32 | db_idx;
107 : :
108 : : rte_write32(key_idx, doorbell);
109 : : }
110 : : }
111 : :
112 : : static inline void bnxt_db_epoch_write(struct bnxt_db_info *db, uint32_t idx, uint32_t epoch)
113 : : {
114 [ # # ]: 0 : uint32_t db_idx = DB_RING_IDX(db, idx);
115 : 0 : void *doorbell = db->doorbell;
116 : :
117 [ # # ]: 0 : if (db->db_64) {
118 : 0 : uint64_t key_idx = db->db_key64 | db_idx;
119 : :
120 : 0 : key_idx |= epoch << DBR_EPOCH_SFT;
121 : :
122 : 0 : rte_compiler_barrier();
123 : : rte_write64_relaxed(key_idx, doorbell);
124 : : } else {
125 : 0 : uint32_t key_idx = db->db_key32 | db_idx;
126 : :
127 : : rte_write32(key_idx, doorbell);
128 : : }
129 : : }
130 : :
131 : : static inline void bnxt_db_mpc_write(struct bnxt_db_info *db, uint32_t idx, uint32_t epoch)
132 : : {
133 [ # # ]: 0 : uint32_t db_idx = DB_RING_IDX(db, idx);
134 : 0 : void *doorbell = db->doorbell;
135 : :
136 [ # # ]: 0 : if (likely(db->db_64)) {
137 : 0 : uint64_t key_idx = db->db_key64 | db_idx |
138 : 0 : (epoch << 24);
139 : : rte_write64_relaxed(key_idx, doorbell);
140 : : } else {
141 : 0 : uint32_t key_idx = db->db_key32 | db_idx;
142 : :
143 : : rte_write32_relaxed(key_idx, doorbell);
144 : : }
145 : : }
146 : :
147 : : /* Ring an NQ doorbell and disable interrupts for the ring. */
148 : : static inline void bnxt_db_nq(struct bnxt_cp_ring_info *cpr)
149 : : {
150 [ # # # # ]: 0 : uint32_t db_idx = DB_RING_IDX(&cpr->cp_db, cpr->cp_raw_cons);
151 : 0 : uint64_t key_idx = cpr->cp_db.db_key64 | DBR_TYPE_NQ | db_idx;
152 : 0 : void *doorbell = cpr->cp_db.doorbell;
153 : :
154 : :
155 [ # # # # ]: 0 : if (unlikely(!cpr->cp_db.db_64))
156 : : return;
157 : :
158 : : rte_write64(key_idx, doorbell);
159 : : }
160 : :
161 : : /* Ring an NQ doorbell and enable interrupts for the ring. */
162 : : static inline void bnxt_db_nq_arm(struct bnxt_cp_ring_info *cpr)
163 : : {
164 [ # # # # ]: 0 : uint32_t db_idx = DB_RING_IDX(&cpr->cp_db, cpr->cp_raw_cons);
165 : 0 : uint64_t key_idx = cpr->cp_db.db_key64 | DBR_TYPE_NQ_ARM | db_idx;
166 : 0 : void *doorbell = cpr->cp_db.doorbell;
167 : :
168 [ # # # # ]: 0 : if (unlikely(!cpr->cp_db.db_64))
169 : : return;
170 : :
171 : : rte_write64(key_idx, doorbell);
172 : : }
173 : :
174 : 0 : static inline void bnxt_db_cq(struct bnxt_cp_ring_info *cpr)
175 : : {
176 : : struct bnxt_db_info *db = &cpr->cp_db;
177 [ # # ]: 0 : uint32_t idx = DB_RING_IDX(&cpr->cp_db, cpr->cp_raw_cons);
178 : :
179 [ # # ]: 0 : if (db->db_64) {
180 : 0 : uint64_t key_idx = db->db_key64 | idx;
181 : 0 : void *doorbell = db->doorbell;
182 : :
183 : 0 : rte_compiler_barrier();
184 : : rte_write64_relaxed(key_idx, doorbell);
185 : : } else {
186 : : uint32_t cp_raw_cons = cpr->cp_raw_cons;
187 : :
188 : 0 : rte_compiler_barrier();
189 [ # # ]: 0 : B_CP_DIS_DB(cpr, cp_raw_cons);
190 : : }
191 : 0 : }
192 : :
193 : 0 : static inline void bnxt_db_mpc_cq(struct bnxt_cp_ring_info *cpr)
194 : : {
195 : : struct bnxt_db_info *db = &cpr->cp_db;
196 [ # # ]: 0 : uint32_t idx = DB_RING_IDX(&cpr->cp_db, cpr->cp_raw_cons);
197 : :
198 [ # # ]: 0 : if (likely(db->db_64)) {
199 : 0 : uint64_t key_idx = db->db_key64 | idx |
200 : 0 : (cpr->epoch << 24);
201 : 0 : void *doorbell = db->doorbell;
202 : :
203 : 0 : rte_compiler_barrier();
204 : : rte_write64_relaxed(key_idx, doorbell);
205 : : } else {
206 : : uint32_t cp_raw_cons = cpr->cp_raw_cons;
207 : :
208 : 0 : rte_compiler_barrier();
209 [ # # ]: 0 : B_CP_DIS_DB(cpr, cp_raw_cons);
210 : : }
211 : 0 : }
212 : :
213 : : #endif
|