net/liquidio: add APIs for SG list
[dpdk.git] / drivers / net / liquidio / lio_rxtx.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
34 #ifndef _LIO_RXTX_H_
35 #define _LIO_RXTX_H_
36
37 #include <stdio.h>
38 #include <stdint.h>
39
40 #include <rte_spinlock.h>
41 #include <rte_memory.h>
42
43 #include "lio_struct.h"
44
45 #ifndef ROUNDUP4
46 #define ROUNDUP4(val) (((val) + 3) & 0xfffffffc)
47 #endif
48
49 #define LIO_STQUEUE_FIRST_ENTRY(ptr, type, elem)        \
50         (type *)((char *)((ptr)->stqh_first) - offsetof(type, elem))
51
52 #define lio_check_timeout(cur_time, chk_time) ((cur_time) > (chk_time))
53
54 #define lio_uptime              \
55         (size_t)(rte_get_timer_cycles() / rte_get_timer_hz())
56
57 /** Descriptor format.
58  *  The descriptor ring is made of descriptors which have 2 64-bit values:
59  *  -# Physical (bus) address of the data buffer.
60  *  -# Physical (bus) address of a lio_droq_info structure.
61  *  The device DMA's incoming packets and its information at the address
62  *  given by these descriptor fields.
63  */
64 struct lio_droq_desc {
65         /** The buffer pointer */
66         uint64_t buffer_ptr;
67
68         /** The Info pointer */
69         uint64_t info_ptr;
70 };
71
72 #define LIO_DROQ_DESC_SIZE      (sizeof(struct lio_droq_desc))
73
74 /** Information about packet DMA'ed by Octeon.
75  *  The format of the information available at Info Pointer after Octeon
76  *  has posted a packet. Not all descriptors have valid information. Only
77  *  the Info field of the first descriptor for a packet has information
78  *  about the packet.
79  */
80 struct lio_droq_info {
81         /** The Output Receive Header. */
82         union octeon_rh rh;
83
84         /** The Length of the packet. */
85         uint64_t length;
86 };
87
88 #define LIO_DROQ_INFO_SIZE      (sizeof(struct lio_droq_info))
89
90 /** Pointer to data buffer.
91  *  Driver keeps a pointer to the data buffer that it made available to
92  *  the Octeon device. Since the descriptor ring keeps physical (bus)
93  *  addresses, this field is required for the driver to keep track of
94  *  the virtual address pointers.
95  */
96 struct lio_recv_buffer {
97         /** Packet buffer, including meta data. */
98         void *buffer;
99
100         /** Data in the packet buffer. */
101         uint8_t *data;
102
103 };
104
105 #define LIO_DROQ_RECVBUF_SIZE   (sizeof(struct lio_recv_buffer))
106
107 #define LIO_DROQ_SIZE           (sizeof(struct lio_droq))
108
109 #define LIO_IQ_SEND_OK          0
110 #define LIO_IQ_SEND_STOP        1
111 #define LIO_IQ_SEND_FAILED      -1
112
113 /* conditions */
114 #define LIO_REQTYPE_NONE                0
115 #define LIO_REQTYPE_NORESP_NET          1
116 #define LIO_REQTYPE_NORESP_NET_SG       2
117 #define LIO_REQTYPE_SOFT_COMMAND        3
118
119 struct lio_request_list {
120         uint32_t reqtype;
121         void *buf;
122 };
123
124 /*----------------------  INSTRUCTION FORMAT ----------------------------*/
125
126 struct lio_instr3_64B {
127         /** Pointer where the input data is available. */
128         uint64_t dptr;
129
130         /** Instruction Header. */
131         uint64_t ih3;
132
133         /** Instruction Header. */
134         uint64_t pki_ih3;
135
136         /** Input Request Header. */
137         uint64_t irh;
138
139         /** opcode/subcode specific parameters */
140         uint64_t ossp[2];
141
142         /** Return Data Parameters */
143         uint64_t rdp;
144
145         /** Pointer where the response for a RAW mode packet will be written
146          *  by Octeon.
147          */
148         uint64_t rptr;
149
150 };
151
152 union lio_instr_64B {
153         struct lio_instr3_64B cmd3;
154 };
155
156 /** The size of each buffer in soft command buffer pool */
157 #define LIO_SOFT_COMMAND_BUFFER_SIZE    1536
158
159 /** Maximum number of buffers to allocate into soft command buffer pool */
160 #define LIO_MAX_SOFT_COMMAND_BUFFERS    255
161
162 struct lio_soft_command {
163         /** Soft command buffer info. */
164         struct lio_stailq_node node;
165         uint64_t dma_addr;
166         uint32_t size;
167
168         /** Command and return status */
169         union lio_instr_64B cmd;
170
171 #define LIO_COMPLETION_WORD_INIT        0xffffffffffffffffULL
172         uint64_t *status_word;
173
174         /** Data buffer info */
175         void *virtdptr;
176         uint64_t dmadptr;
177         uint32_t datasize;
178
179         /** Return buffer info */
180         void *virtrptr;
181         uint64_t dmarptr;
182         uint32_t rdatasize;
183
184         /** Context buffer info */
185         void *ctxptr;
186         uint32_t ctxsize;
187
188         /** Time out and callback */
189         size_t wait_time;
190         size_t timeout;
191         uint32_t iq_no;
192         void (*callback)(uint32_t, void *);
193         void *callback_arg;
194         struct rte_mbuf *mbuf;
195 };
196
197 struct lio_iq_post_status {
198         int status;
199         int index;
200 };
201
202 /*   wqe
203  *  ---------------  0
204  * |  wqe  word0-3 |
205  *  ---------------  32
206  * |    PCI IH     |
207  *  ---------------  40
208  * |     RPTR      |
209  *  ---------------  48
210  * |    PCI IRH    |
211  *  ---------------  56
212  * |    OCTEON_CMD |
213  *  ---------------  64
214  * | Addtl 8-BData |
215  * |               |
216  *  ---------------
217  */
218
219 union octeon_cmd {
220         uint64_t cmd64;
221
222         struct  {
223 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
224                 uint64_t cmd : 5;
225
226                 uint64_t more : 6; /* How many udd words follow the command */
227
228                 uint64_t reserved : 29;
229
230                 uint64_t param1 : 16;
231
232                 uint64_t param2 : 8;
233
234 #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
235
236                 uint64_t param2 : 8;
237
238                 uint64_t param1 : 16;
239
240                 uint64_t reserved : 29;
241
242                 uint64_t more : 6;
243
244                 uint64_t cmd : 5;
245
246 #endif
247         } s;
248 };
249
250 #define OCTEON_CMD_SIZE (sizeof(union octeon_cmd))
251
252 /* Instruction Header */
253 struct octeon_instr_ih3 {
254 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
255
256         /** Reserved3 */
257         uint64_t reserved3 : 1;
258
259         /** Gather indicator 1=gather*/
260         uint64_t gather : 1;
261
262         /** Data length OR no. of entries in gather list */
263         uint64_t dlengsz : 14;
264
265         /** Front Data size */
266         uint64_t fsz : 6;
267
268         /** Reserved2 */
269         uint64_t reserved2 : 4;
270
271         /** PKI port kind - PKIND */
272         uint64_t pkind : 6;
273
274         /** Reserved1 */
275         uint64_t reserved1 : 32;
276
277 #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
278         /** Reserved1 */
279         uint64_t reserved1 : 32;
280
281         /** PKI port kind - PKIND */
282         uint64_t pkind : 6;
283
284         /** Reserved2 */
285         uint64_t reserved2 : 4;
286
287         /** Front Data size */
288         uint64_t fsz : 6;
289
290         /** Data length OR no. of entries in gather list */
291         uint64_t dlengsz : 14;
292
293         /** Gather indicator 1=gather*/
294         uint64_t gather : 1;
295
296         /** Reserved3 */
297         uint64_t reserved3 : 1;
298
299 #endif
300 };
301
302 /* PKI Instruction Header(PKI IH) */
303 struct octeon_instr_pki_ih3 {
304 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
305
306         /** Wider bit */
307         uint64_t w : 1;
308
309         /** Raw mode indicator 1 = RAW */
310         uint64_t raw : 1;
311
312         /** Use Tag */
313         uint64_t utag : 1;
314
315         /** Use QPG */
316         uint64_t uqpg : 1;
317
318         /** Reserved2 */
319         uint64_t reserved2 : 1;
320
321         /** Parse Mode */
322         uint64_t pm : 3;
323
324         /** Skip Length */
325         uint64_t sl : 8;
326
327         /** Use Tag Type */
328         uint64_t utt : 1;
329
330         /** Tag type */
331         uint64_t tagtype : 2;
332
333         /** Reserved1 */
334         uint64_t reserved1 : 2;
335
336         /** QPG Value */
337         uint64_t qpg : 11;
338
339         /** Tag Value */
340         uint64_t tag : 32;
341
342 #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
343
344         /** Tag Value */
345         uint64_t tag : 32;
346
347         /** QPG Value */
348         uint64_t qpg : 11;
349
350         /** Reserved1 */
351         uint64_t reserved1 : 2;
352
353         /** Tag type */
354         uint64_t tagtype : 2;
355
356         /** Use Tag Type */
357         uint64_t utt : 1;
358
359         /** Skip Length */
360         uint64_t sl : 8;
361
362         /** Parse Mode */
363         uint64_t pm : 3;
364
365         /** Reserved2 */
366         uint64_t reserved2 : 1;
367
368         /** Use QPG */
369         uint64_t uqpg : 1;
370
371         /** Use Tag */
372         uint64_t utag : 1;
373
374         /** Raw mode indicator 1 = RAW */
375         uint64_t raw : 1;
376
377         /** Wider bit */
378         uint64_t w : 1;
379 #endif
380 };
381
382 /** Input Request Header */
383 struct octeon_instr_irh {
384 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
385         uint64_t opcode : 4;
386         uint64_t rflag : 1;
387         uint64_t subcode : 7;
388         uint64_t vlan : 12;
389         uint64_t priority : 3;
390         uint64_t reserved : 5;
391         uint64_t ossp : 32; /* opcode/subcode specific parameters */
392 #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
393         uint64_t ossp : 32; /* opcode/subcode specific parameters */
394         uint64_t reserved : 5;
395         uint64_t priority : 3;
396         uint64_t vlan : 12;
397         uint64_t subcode : 7;
398         uint64_t rflag : 1;
399         uint64_t opcode : 4;
400 #endif
401 };
402
403 /* pkiih3 + irh + ossp[0] + ossp[1] + rdp + rptr = 40 bytes */
404 #define OCTEON_SOFT_CMD_RESP_IH3        (40 + 8)
405 /* pki_h3 + irh + ossp[0] + ossp[1] = 32 bytes */
406 #define OCTEON_PCI_CMD_O3               (24 + 8)
407
408 /** Return Data Parameters */
409 struct octeon_instr_rdp {
410 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN
411         uint64_t reserved : 49;
412         uint64_t pcie_port : 3;
413         uint64_t rlen : 12;
414 #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
415         uint64_t rlen : 12;
416         uint64_t pcie_port : 3;
417         uint64_t reserved : 49;
418 #endif
419 };
420
421 int lio_setup_sc_buffer_pool(struct lio_device *lio_dev);
422 void lio_free_sc_buffer_pool(struct lio_device *lio_dev);
423
424 struct lio_soft_command *
425 lio_alloc_soft_command(struct lio_device *lio_dev,
426                        uint32_t datasize, uint32_t rdatasize,
427                        uint32_t ctxsize);
428 void lio_prepare_soft_command(struct lio_device *lio_dev,
429                               struct lio_soft_command *sc,
430                               uint8_t opcode, uint8_t subcode,
431                               uint32_t irh_ossp, uint64_t ossp0,
432                               uint64_t ossp1);
433 int lio_send_soft_command(struct lio_device *lio_dev,
434                           struct lio_soft_command *sc);
435 void lio_free_soft_command(struct lio_soft_command *sc);
436
437 /** Maximum ordered requests to process in every invocation of
438  *  lio_process_ordered_list(). The function will continue to process requests
439  *  as long as it can find one that has finished processing. If it keeps
440  *  finding requests that have completed, the function can run for ever. The
441  *  value defined here sets an upper limit on the number of requests it can
442  *  process before it returns control to the poll thread.
443  */
444 #define LIO_MAX_ORD_REQS_TO_PROCESS     4096
445
446 /** Error codes used in Octeon Host-Core communication.
447  *
448  *   31         16 15           0
449  *   ----------------------------
450  * |            |               |
451  *   ----------------------------
452  *   Error codes are 32-bit wide. The upper 16-bits, called Major Error Number,
453  *   are reserved to identify the group to which the error code belongs. The
454  *   lower 16-bits, called Minor Error Number, carry the actual code.
455  *
456  *   So error codes are (MAJOR NUMBER << 16)| MINOR_NUMBER.
457  */
458 /** Status for a request.
459  *  If the request is successfully queued, the driver will return
460  *  a LIO_REQUEST_PENDING status. LIO_REQUEST_TIMEOUT is only returned by
461  *  the driver if the response for request failed to arrive before a
462  *  time-out period or if the request processing * got interrupted due to
463  *  a signal respectively.
464  */
465 enum {
466         /** A value of 0x00000000 indicates no error i.e. success */
467         LIO_REQUEST_DONE        = 0x00000000,
468         /** (Major number: 0x0000; Minor Number: 0x0001) */
469         LIO_REQUEST_PENDING     = 0x00000001,
470         LIO_REQUEST_TIMEOUT     = 0x00000003,
471
472 };
473
474 /*------ Error codes used by firmware (bits 15..0 set by firmware */
475 #define LIO_FIRMWARE_MAJOR_ERROR_CODE    0x0001
476 #define LIO_FIRMWARE_STATUS_CODE(status) \
477         ((LIO_FIRMWARE_MAJOR_ERROR_CODE << 16) | (status))
478
479 /** Initialize the response lists. The number of response lists to create is
480  *  given by count.
481  *  @param lio_dev - the lio device structure.
482  */
483 void lio_setup_response_list(struct lio_device *lio_dev);
484
485 /** Check the status of first entry in the ordered list. If the instruction at
486  *  that entry finished processing or has timed-out, the entry is cleaned.
487  *  @param lio_dev - the lio device structure.
488  *  @return 1 if the ordered list is empty, 0 otherwise.
489  */
490 int lio_process_ordered_list(struct lio_device *lio_dev);
491
492 static inline void
493 lio_swap_8B_data(uint64_t *data, uint32_t blocks)
494 {
495         while (blocks) {
496                 *data = rte_cpu_to_be_64(*data);
497                 blocks--;
498                 data++;
499         }
500 }
501
502 static inline uint64_t
503 lio_map_ring(void *buf)
504 {
505         phys_addr_t dma_addr;
506
507         dma_addr = rte_mbuf_data_dma_addr_default(((struct rte_mbuf *)buf));
508
509         return (uint64_t)dma_addr;
510 }
511
512 static inline uint64_t
513 lio_map_ring_info(struct lio_droq *droq, uint32_t i)
514 {
515         phys_addr_t dma_addr;
516
517         dma_addr = droq->info_list_dma + (i * LIO_DROQ_INFO_SIZE);
518
519         return (uint64_t)dma_addr;
520 }
521
522 static inline int
523 lio_opcode_slow_path(union octeon_rh *rh)
524 {
525         uint16_t subcode1, subcode2;
526
527         subcode1 = LIO_OPCODE_SUBCODE(rh->r.opcode, rh->r.subcode);
528         subcode2 = LIO_OPCODE_SUBCODE(LIO_OPCODE, LIO_OPCODE_NW_DATA);
529
530         return subcode2 != subcode1;
531 }
532
533 /* Macro to increment index.
534  * Index is incremented by count; if the sum exceeds
535  * max, index is wrapped-around to the start.
536  */
537 static inline uint32_t
538 lio_incr_index(uint32_t index, uint32_t count, uint32_t max)
539 {
540         if ((index + count) >= max)
541                 index = index + count - max;
542         else
543                 index += count;
544
545         return index;
546 }
547
548 int lio_setup_droq(struct lio_device *lio_dev, int q_no, int num_descs,
549                    int desc_size, struct rte_mempool *mpool,
550                    unsigned int socket_id);
551 uint16_t lio_dev_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts,
552                            uint16_t budget);
553 void lio_delete_droq_queue(struct lio_device *lio_dev, int oq_no);
554
555 int lio_setup_sglists(struct lio_device *lio_dev, int iq_no,
556                       int fw_mapped_iq, int num_descs, unsigned int socket_id);
557 int lio_setup_iq(struct lio_device *lio_dev, int q_index,
558                  union octeon_txpciq iq_no, uint32_t num_descs, void *app_ctx,
559                  unsigned int socket_id);
560 void lio_delete_instruction_queue(struct lio_device *lio_dev, int iq_no);
561 /** Setup instruction queue zero for the device
562  *  @param lio_dev which lio device to setup
563  *
564  *  @return 0 if success. -1 if fails
565  */
566 int lio_setup_instr_queue0(struct lio_device *lio_dev);
567 void lio_free_instr_queue0(struct lio_device *lio_dev);
568 #endif  /* _LIO_RXTX_H_ */