1 /*
2 * BSD LICENSE
3 *
4 * Copyright(c) 2017 Cavium, Inc.. All rights reserved.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
16 * distribution.
17 * * Neither the name of Cavium, Inc. nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER(S) OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33 /*$FreeBSD$*/
34
35 /* \file lio_iq.h
36 * \brief Host Driver: Implementation of Octeon input queues. "Input" is
37 * with respect to the Octeon device on the NIC. From this driver's
38 * point of view they are egress queues.
39 */
40
41 #ifndef __LIO_IQ_H__
42 #define __LIO_IQ_H__
43
44 #define LIO_IQ_SEND_OK 0
45 #define LIO_IQ_SEND_STOP 1
46 #define LIO_IQ_SEND_FAILED -1
47
48 /*------------------------- INSTRUCTION QUEUE --------------------------*/
49
50 #define LIO_REQTYPE_NONE 0
51 #define LIO_REQTYPE_NORESP_NET 1
52 #define LIO_REQTYPE_NORESP_NET_SG 2
53 #define LIO_REQTYPE_RESP_NET 3
54 #define LIO_REQTYPE_SOFT_COMMAND 4
55
56 /*
57 * This structure is used by NIC driver to store information required
58 * to free the mbuf when the packet has been fetched by Octeon.
59 * Bytes offset below assume worst-case of a 64-bit system.
60 */
61 struct lio_mbuf_free_info {
62 /* Pointer to mbuf. */
63 struct mbuf *mb;
64
65 /* Pointer to gather list. */
66 struct lio_gather *g;
67
68 bus_dmamap_t map;
69 };
70
71 struct lio_request_list {
72 uint32_t reqtype;
73 void *buf;
74 bus_dmamap_t map;
75 struct lio_mbuf_free_info finfo;
76 };
77
78 /* Input Queue statistics. Each input queue has four stats fields. */
79 struct lio_iq_stats {
80 uint64_t instr_posted; /**< Instructions posted to this queue. */
81 uint64_t instr_processed; /**< Instructions processed in this queue. */
82 uint64_t instr_dropped; /**< Instructions that could not be processed */
83 uint64_t bytes_sent; /**< Bytes sent through this queue. */
84 uint64_t sgentry_sent; /**< Gather entries sent through this queue. */
85 uint64_t tx_done; /**< Num of packets sent to network. */
86 uint64_t tx_iq_busy; /**< Numof times this iq was found to be full. */
87 uint64_t tx_dropped; /**< Numof pkts dropped dueto xmitpath errors. */
88 uint64_t tx_tot_bytes; /**< Total count of bytes sento to network. */
89 uint64_t tx_gso; /* count of tso */
90 uint64_t tx_vxlan; /* tunnel */
91 uint64_t tx_dmamap_fail;
92 uint64_t tx_restart;
93 uint64_t mbuf_defrag_failed;
94 };
95
96 /*
97 * The instruction (input) queue.
98 * The input queue is used to post raw (instruction) mode data or packet
99 * data to Octeon device from the host. Each input queue for
100 * a Octeon device has one such structure to represent it.
101 */
102 struct lio_instr_queue {
103 struct octeon_device *oct_dev;
104
105 /* A lock to protect access to the input ring. */
106 struct mtx lock;
107
108 /* A lock to protect while enqueue to the input ring. */
109 struct mtx enq_lock;
110
111 /* A lock to protect while posting on the ring. */
112 struct mtx post_lock;
113
114 uint32_t pkt_in_done;
115
116 /* A lock to protect access to the input ring. */
117 struct mtx iq_flush_running_lock;
118
119 /* Flag that indicates if the queue uses 64 byte commands. */
120 uint32_t iqcmd_64B:1;
121
122 /* Queue info. */
123 union octeon_txpciq txpciq;
124
125 uint32_t rsvd:17;
126
127 uint32_t status:8;
128
129 /* Maximum no. of instructions in this queue. */
130 uint32_t max_count;
131
132 /* Index in input ring where the driver should write the next packet */
133 uint32_t host_write_index;
134
135 /*
136 * Index in input ring where Octeon is expected to read the next
137 * packet.
138 */
139 uint32_t octeon_read_index;
140
141 /*
142 * This index aids in finding the window in the queue where Octeon
143 * has read the commands.
144 */
145 uint32_t flush_index;
146
147 /* This field keeps track of the instructions pending in this queue. */
148 volatile int instr_pending;
149
150 uint32_t reset_instr_cnt;
151
152 /* Pointer to the Virtual Base addr of the input ring. */
153 uint8_t *base_addr;
154 bus_dma_tag_t txtag;
155
156 struct lio_request_list *request_list;
157
158 struct buf_ring *br;
159
160 /* Octeon doorbell register for the ring. */
161 uint32_t doorbell_reg;
162
163 /* Octeon instruction count register for this ring. */
164 uint32_t inst_cnt_reg;
165
166 /* Number of instructions pending to be posted to Octeon. */
167 uint32_t fill_cnt;
168
169 /* The last time that the doorbell was rung. */
170 uint64_t last_db_time;
171
172 /*
173 * The doorbell timeout. If the doorbell was not rung for this time
174 * and fill_cnt is non-zero, ring the doorbell again.
175 */
176 uint32_t db_timeout;
177
178 /* Statistics for this input queue. */
179 struct lio_iq_stats stats;
180
181 /* DMA mapped base address of the input descriptor ring. */
182 uint64_t base_addr_dma;
183
184 /* Application context */
185 void *app_ctx;
186
187 /* network stack queue index */
188 int q_index;
189
190 /* os ifidx associated with this queue */
191 int ifidx;
192
193 };
194
195 /*---------------------- INSTRUCTION FORMAT ----------------------------*/
196
197 struct lio_instr3_64B {
198 /* Pointer where the input data is available. */
199 uint64_t dptr;
200
201 /* Instruction Header. */
202 uint64_t ih3;
203
204 /* Instruction Header. */
205 uint64_t pki_ih3;
206
207 /* Input Request Header. */
208 uint64_t irh;
209
210 /* opcode/subcode specific parameters */
211 uint64_t ossp[2];
212
213 /* Return Data Parameters */
214 uint64_t rdp;
215
216 /*
217 * Pointer where the response for a RAW mode packet will be written
218 * by Octeon.
219 */
220 uint64_t rptr;
221
222 };
223
224 union lio_instr_64B {
225 struct lio_instr3_64B cmd3;
226 };
227
228 /* The size of each buffer in soft command buffer pool */
229 #define LIO_SOFT_COMMAND_BUFFER_SIZE 2048
230
231 struct lio_soft_command {
232 /* Soft command buffer info. */
233 struct lio_stailq_node node;
234 uint64_t dma_addr;
235 uint32_t size;
236
237 /* Command and return status */
238 union lio_instr_64B cmd;
239
240 #define COMPLETION_WORD_INIT 0xffffffffffffffffULL
241 uint64_t *status_word;
242
243 /* Data buffer info */
244 void *virtdptr;
245 uint64_t dmadptr;
246 uint32_t datasize;
247
248 /* Return buffer info */
249 void *virtrptr;
250 uint64_t dmarptr;
251 uint32_t rdatasize;
252
253 /* Context buffer info */
254 void *ctxptr;
255 uint32_t ctxsize;
256
257 /* Time out and callback */
258 int wait_time;
259 int timeout;
260 uint32_t iq_no;
261 void (*callback) (struct octeon_device *, uint32_t,
262 void *);
263 void *callback_arg;
264 };
265
266 /* Maximum number of buffers to allocate into soft command buffer pool */
267 #define LIO_MAX_SOFT_COMMAND_BUFFERS 256
268
269 /* Head of a soft command buffer pool. */
270 struct lio_sc_buffer_pool {
271 /* List structure to add delete pending entries to */
272 struct lio_stailq_head head;
273
274 /* A lock for this response list */
275 struct mtx lock;
276
277 volatile uint32_t alloc_buf_count;
278 };
279
280 #define LIO_INCR_INSTRQUEUE_PKT_COUNT(octeon_dev_ptr, iq_no, field, count) \
281 (((octeon_dev_ptr)->instr_queue[iq_no]->stats.field) += count)
282
283 int lio_setup_sc_buffer_pool(struct octeon_device *oct);
284 int lio_free_sc_buffer_pool(struct octeon_device *oct);
285 struct lio_soft_command *lio_alloc_soft_command(struct octeon_device *oct,
286 uint32_t datasize,
287 uint32_t rdatasize,
288 uint32_t ctxsize);
289 void lio_free_soft_command(struct octeon_device *oct,
290 struct lio_soft_command *sc);
291
292 /*
293 * lio_init_instr_queue()
294 * @param octeon_dev - pointer to the octeon device structure.
295 * @param txpciq - queue to be initialized (0 <= q_no <= 3).
296 *
297 * Called at driver init time for each input queue. iq_conf has the
298 * configuration parameters for the queue.
299 *
300 * @return Success: 0 Failure: 1
301 */
302 int lio_init_instr_queue(struct octeon_device *octeon_dev,
303 union octeon_txpciq txpciq, uint32_t num_descs);
304
305 /*
306 * lio_delete_instr_queue()
307 * @param octeon_dev - pointer to the octeon device structure.
308 * @param iq_no - queue to be deleted
309 *
310 * Called at driver unload time for each input queue. Deletes all
311 * allocated resources for the input queue.
312 *
313 * @return Success: 0 Failure: 1
314 */
315 int lio_delete_instr_queue(struct octeon_device *octeon_dev,
316 uint32_t iq_no);
317
318 int lio_wait_for_instr_fetch(struct octeon_device *oct);
319
320 int lio_process_iq_request_list(struct octeon_device *oct,
321 struct lio_instr_queue *iq,
322 uint32_t budget);
323
324 int lio_send_command(struct octeon_device *oct, uint32_t iq_no,
325 uint32_t force_db, void *cmd, void *buf,
326 uint32_t datasize, uint32_t reqtype);
327
328 void lio_prepare_soft_command(struct octeon_device *oct,
329 struct lio_soft_command *sc,
330 uint8_t opcode, uint8_t subcode,
331 uint32_t irh_ossp, uint64_t ossp0,
332 uint64_t ossp1);
333
334 int lio_send_soft_command(struct octeon_device *oct,
335 struct lio_soft_command *sc);
336
337 int lio_setup_iq(struct octeon_device *oct, int ifidx,
338 int q_index, union octeon_txpciq iq_no,
339 uint32_t num_descs);
340 int lio_flush_iq(struct octeon_device *oct, struct lio_instr_queue *iq,
341 uint32_t budget);
342 #endif /* __LIO_IQ_H__ */
Cache object: 610901e222d61b27edf0dd3ebaa9e311
|