]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/liquidio/base/lio_iq.h
Import mandoc 1.14.4
[FreeBSD/FreeBSD.git] / sys / dev / liquidio / base / lio_iq.h
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__ */