New upstream version 17.11-rc3
[deb_dpdk.git] / drivers / net / octeontx / base / octeontx_pkivf.h
1 /*
2  *   BSD LICENSE
3  *
4  *   Copyright (C) Cavium Inc. 2017. All rights reserved.
5  *
6  *   Redistribution and use in source and binary forms, with or without
7  *   modification, are permitted provided that the following conditions
8  *   are met:
9  *
10  *     * Redistributions of source code must retain the above copyright
11  *       notice, this list of conditions and the following disclaimer.
12  *     * Redistributions in binary form must reproduce the above copyright
13  *       notice, this list of conditions and the following disclaimer in
14  *       the documentation and/or other materials provided with the
15  *       distribution.
16  *     * Neither the name of Cavium networks nor the names of its
17  *       contributors may be used to endorse or promote products derived
18  *       from this software without specific prior written permission.
19  *
20  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32
33 #ifndef __OCTEONTX_PKI_H__
34 #define __OCTEONTX_PKI_H__
35
36 #include <stdint.h>
37
38 #include <octeontx_mbox.h>
39
40 #define OCTEONTX_PKI_COPROC                     5
41
42 /* PKI messages */
43
44 #define MBOX_PKI_PORT_OPEN                      1
45 #define MBOX_PKI_PORT_START                     2
46 #define MBOX_PKI_PORT_STOP                      3
47 #define MBOX_PKI_PORT_CLOSE                     4
48 #define MBOX_PKI_PORT_CONFIG                    5
49 #define MBOX_PKI_PORT_OPT_PARSER_CONFIG         6
50 #define MBOX_PKI_PORT_CUSTOM_PARSER_CONFIG      7
51 #define MBOX_PKI_PORT_PKTBUF_CONFIG             8
52 #define MBOX_PKI_PORT_HASH_CONFIG               9
53 #define MBOX_PKI_PORT_ERRCHK_CONFIG             10
54 #define MBOX_PKI_PORT_CREATE_QOS                11
55 #define MBOX_PKI_PORT_MODIFY_QOS                12
56 #define MBOX_PKI_PORT_DELETE_QOS                13
57 #define MBOX_PKI_PORT_PKTDROP_CONFIG            14
58 #define MBOX_PKI_PORT_WQE_GEN_CONFIG            15
59 #define MBOX_PKI_BACKPRESSURE_CONFIG            16
60 #define MBOX_PKI_PORT_GET_STATS                 17
61 #define MBOX_PKI_PORT_RESET_STATS               18
62 #define MBOX_PKI_GET_PORT_CONFIG                19
63 #define MBOX_PKI_GET_PORT_QOS_CONFIG            20
64
65 #define MBOX_PKI_MAX_QOS_ENTRY 64
66
67 /* pki pkind parse mode */
68 enum  {
69         MBOX_PKI_PARSE_LA_TO_LG = 0,
70         MBOX_PKI_PARSE_LB_TO_LG = 1,
71         MBOX_PKI_PARSE_LC_TO_LG = 3,
72         MBOX_PKI_PARSE_LG = 0x3f,
73         MBOX_PKI_PARSE_NOTHING = 0x7f
74 };
75
76 /* Interface types: */
77 enum {
78         OCTTX_PORT_TYPE_NET, /* Network interface ports */
79         OCTTX_PORT_TYPE_INT, /* CPU internal interface ports */
80         OCTTX_PORT_TYPE_PCI, /* DPI/PCIe interface ports */
81         OCTTX_PORT_TYPE_MAX
82 };
83
84 /* pki port config */
85 typedef struct mbox_pki_port_type {
86         uint8_t port_type;
87 } mbox_pki_port_t;
88
89 /* pki port config */
90 typedef struct mbox_pki_port_cfg {
91         uint8_t port_type;
92         struct {
93                 uint8_t fcs_pres:1;
94                 uint8_t fcs_skip:1;
95                 uint8_t parse_mode:1;
96                 uint8_t mpls_parse:1;
97                 uint8_t inst_hdr_parse:1;
98                 uint8_t fulc_parse:1;
99                 uint8_t dsa_parse:1;
100                 uint8_t hg2_parse:1;
101                 uint8_t hg_parse:1;
102         } mmask;
103         uint8_t fcs_pres;
104         uint8_t fcs_skip;
105         uint8_t parse_mode;
106         uint8_t mpls_parse;
107         uint8_t inst_hdr_parse;
108         uint8_t fulc_parse;
109         uint8_t dsa_parse;
110         uint8_t hg2_parse;
111         uint8_t hg_parse;
112 } mbox_pki_prt_cfg_t;
113
114 /* pki Flow/style packet buffer config */
115 typedef struct mbox_pki_port_pktbuf_cfg {
116         uint8_t port_type;
117         struct {
118                 uint16_t f_mbuff_size:1;
119                 uint16_t f_wqe_skip:1;
120                 uint16_t f_first_skip:1;
121                 uint16_t f_later_skip:1;
122                 uint16_t f_pkt_outside_wqe:1;
123                 uint16_t f_wqe_endian:1;
124                 uint16_t f_cache_mode:1;
125         } mmask;
126         uint16_t mbuff_size;
127         uint16_t wqe_skip;
128         uint16_t first_skip;
129         uint16_t later_skip;
130         uint8_t pkt_outside_wqe;
131         uint8_t wqe_endian;
132         uint8_t cache_mode;
133 } mbox_pki_pktbuf_cfg_t;
134
135 /* pki flow/style tag config */
136 typedef struct mbox_pki_port_hash_cfg {
137         uint8_t port_type;
138         uint32_t tag_slf:1;
139         uint32_t tag_sle:1;
140         uint32_t tag_sld:1;
141         uint32_t tag_slc:1;
142         uint32_t tag_dlf:1;
143         uint32_t tag_dle:1;
144         uint32_t tag_dld:1;
145         uint32_t tag_dlc:1;
146         uint32_t tag_prt:1;
147         uint32_t tag_vlan0:1;
148         uint32_t tag_vlan1:1;
149         uint32_t tag_ip_pctl:1;
150         uint32_t tag_sync:1;
151         uint32_t tag_spi:1;
152         uint32_t tag_gtp:1;
153         uint32_t tag_vni:1;
154 } mbox_pki_hash_cfg_t;
155
156 /* pki flow/style errcheck config */
157 typedef struct mbox_pki_port_errcheck_cfg {
158         uint8_t port_type;
159         struct {
160                 uint32_t f_ip6_udp_opt:1;
161                 uint32_t f_lenerr_en:1;
162                 uint32_t f_maxerr_en:1;
163                 uint32_t f_minerr_en:1;
164                 uint32_t f_fcs_chk:1;
165                 uint32_t f_fcs_strip:1;
166                 uint32_t f_len_lf:1;
167                 uint32_t f_len_le:1;
168                 uint32_t f_len_ld:1;
169                 uint32_t f_len_lc:1;
170                 uint32_t f_csum_lf:1;
171                 uint32_t f_csum_le:1;
172                 uint32_t f_csum_ld:1;
173                 uint32_t f_csum_lc:1;
174                 uint32_t f_min_frame_len;
175                 uint32_t f_max_frame_len;
176         } mmask;
177         uint64_t ip6_udp_opt:1;
178         uint64_t lenerr_en:1;
179         uint64_t maxerr_en:1;
180         uint64_t minerr_en:1;
181         uint64_t fcs_chk:1;
182         uint64_t fcs_strip:1;
183         uint64_t len_lf:1;
184         uint64_t len_le:1;
185         uint64_t len_ld:1;
186         uint64_t len_lc:1;
187         uint64_t csum_lf:1;
188         uint64_t csum_le:1;
189         uint64_t csum_ld:1;
190         uint64_t csum_lc:1;
191         uint64_t min_frame_len;
192         uint64_t max_frame_len;
193 } mbox_pki_errcheck_cfg_t;
194
195 /* CACHE MODE*/
196 enum {
197         MBOX_PKI_OPC_MODE_STT = 0LL,
198         MBOX_PKI_OPC_MODE_STF = 1LL,
199         MBOX_PKI_OPC_MODE_STF1_STT = 2LL,
200         MBOX_PKI_OPC_MODE_STF2_STT = 3LL
201 };
202
203 /* PKI QPG QOS*/
204 enum {
205         MBOX_PKI_QPG_QOS_NONE = 0,
206         MBOX_PKI_QPG_QOS_VLAN,
207         MBOX_PKI_QPG_QOS_MPLS,
208         MBOX_PKI_QPG_QOS_DSA_SRC,
209         MBOX_PKI_QPG_QOS_DIFFSERV,
210         MBOX_PKI_QPG_QOS_HIGIG,
211 };
212
213 struct mbox_pki_qos_entry {
214         uint16_t port_add;
215         uint16_t ggrp_ok;
216         uint16_t ggrp_bad;
217         uint16_t gaura;
218         uint8_t grptag_ok;
219         uint8_t grptag_bad;
220 };
221
222 /* pki flow/style enable qos */
223 typedef struct mbox_pki_port_create_qos {
224         uint8_t port_type;
225         uint8_t qpg_qos;
226         uint8_t num_entry;
227         uint8_t tag_type;
228         uint8_t drop_policy;
229         struct mbox_pki_qos_entry qos_entry[MBOX_PKI_MAX_QOS_ENTRY];
230 } mbox_pki_qos_cfg_t;
231
232 /* pki flow/style enable qos */
233 typedef struct mbox_pki_port_modify_qos_entry {
234         uint8_t port_type;
235         uint16_t index;
236         struct {
237                 uint8_t f_port_add:1;
238                 uint8_t f_grp_ok:1;
239                 uint8_t f_grp_bad:1;
240                 uint8_t f_gaura:1;
241                 uint8_t f_grptag_ok:1;
242                 uint8_t f_grptag_bad:1;
243                 uint8_t f_tag_type:1;
244         } mmask;
245         uint8_t tag_type;
246         struct mbox_pki_qos_entry qos_entry;
247 } mbox_pki_mod_qos_t;
248
249 /* pki flow/style enable qos */
250 typedef struct mbox_pki_port_delete_qos_entry {
251         uint8_t port_type;
252         uint16_t index;
253 } mbox_pki_del_qos_t;
254
255 /* PKI maximum constants */
256 #define PKI_VF_MAX                      (1)
257 #define PKI_MAX_PKTLEN                  (32768)
258
259 /* pki pkind parse mode */
260 enum  {
261         PKI_PARSE_LA_TO_LG = 0,
262         PKI_PARSE_LB_TO_LG = 1,
263         PKI_PARSE_LC_TO_LG = 3,
264         PKI_PARSE_LG = 0x3f,
265         PKI_PARSE_NOTHING = 0x7f
266 };
267
268 /* pki port config */
269 typedef struct pki_port_cfg {
270         uint8_t port_type;
271         struct {
272                 uint8_t fcs_pres:1;
273                 uint8_t fcs_skip:1;
274                 uint8_t parse_mode:1;
275                 uint8_t mpls_parse:1;
276                 uint8_t inst_hdr_parse:1;
277                 uint8_t fulc_parse:1;
278                 uint8_t dsa_parse:1;
279                 uint8_t hg2_parse:1;
280                 uint8_t hg_parse:1;
281         } mmask;
282         uint8_t fcs_pres;
283         uint8_t fcs_skip;
284         uint8_t parse_mode;
285         uint8_t mpls_parse;
286         uint8_t inst_hdr_parse;
287         uint8_t fulc_parse;
288         uint8_t dsa_parse;
289         uint8_t hg2_parse;
290         uint8_t hg_parse;
291 } pki_prt_cfg_t;
292
293
294 /* pki Flow/style packet buffer config */
295 typedef struct pki_port_pktbuf_cfg {
296         uint8_t port_type;
297         struct {
298                 uint16_t f_mbuff_size:1;
299                 uint16_t f_wqe_skip:1;
300                 uint16_t f_first_skip:1;
301                 uint16_t f_later_skip:1;
302                 uint16_t f_pkt_outside_wqe:1;
303                 uint16_t f_wqe_endian:1;
304                 uint16_t f_cache_mode:1;
305         } mmask;
306         uint16_t mbuff_size;
307         uint16_t wqe_skip;
308         uint16_t first_skip;
309         uint16_t later_skip;
310         uint8_t pkt_outside_wqe;
311         uint8_t wqe_endian;
312         uint8_t cache_mode;
313 } pki_pktbuf_cfg_t;
314
315 /* pki flow/style tag config */
316 typedef struct pki_port_hash_cfg {
317         uint8_t port_type;
318         uint32_t tag_slf:1;
319         uint32_t tag_sle:1;
320         uint32_t tag_sld:1;
321         uint32_t tag_slc:1;
322         uint32_t tag_dlf:1;
323         uint32_t tag_dle:1;
324         uint32_t tag_dld:1;
325         uint32_t tag_dlc:1;
326         uint32_t tag_prt:1;
327         uint32_t tag_vlan0:1;
328         uint32_t tag_vlan1:1;
329         uint32_t tag_ip_pctl:1;
330         uint32_t tag_sync:1;
331         uint32_t tag_spi:1;
332         uint32_t tag_gtp:1;
333         uint32_t tag_vni:1;
334 } pki_hash_cfg_t;
335
336 /* pki flow/style errcheck config */
337 typedef struct pki_port_errcheck_cfg {
338         uint8_t port_type;
339         struct {
340                 uint32_t f_ip6_udp_opt:1;
341                 uint32_t f_lenerr_en:1;
342                 uint32_t f_maxerr_en:1;
343                 uint32_t f_minerr_en:1;
344                 uint32_t f_fcs_chk:1;
345                 uint32_t f_fcs_strip:1;
346                 uint32_t f_len_lf:1;
347                 uint32_t f_len_le:1;
348                 uint32_t f_len_ld:1;
349                 uint32_t f_len_lc:1;
350                 uint32_t f_csum_lf:1;
351                 uint32_t f_csum_le:1;
352                 uint32_t f_csum_ld:1;
353                 uint32_t f_csum_lc:1;
354                 uint32_t f_min_frame_len;
355                 uint32_t f_max_frame_len;
356         } mmask;
357         uint64_t ip6_udp_opt:1;
358         uint64_t lenerr_en:1;
359         uint64_t maxerr_en:1;
360         uint64_t minerr_en:1;
361         uint64_t fcs_chk:1;
362         uint64_t fcs_strip:1;
363         uint64_t len_lf:1;
364         uint64_t len_le:1;
365         uint64_t len_ld:1;
366         uint64_t len_lc:1;
367         uint64_t csum_lf:1;
368         uint64_t csum_le:1;
369         uint64_t csum_ld:1;
370         uint64_t csum_lc:1;
371         uint64_t min_frame_len;
372         uint64_t max_frame_len;
373 } pki_errchk_cfg_t;
374
375
376 /* CACHE MODE*/
377 enum {
378         PKI_OPC_MODE_STT = 0LL,
379         PKI_OPC_MODE_STF = 1LL,
380         PKI_OPC_MODE_STF1_STT = 2LL,
381         PKI_OPC_MODE_STF2_STT = 3LL
382 };
383
384 /* PKI QPG QOS*/
385 enum {
386         PKI_QPG_QOS_NONE = 0,
387         PKI_QPG_QOS_VLAN,
388         PKI_QPG_QOS_MPLS,
389         PKI_QPG_QOS_DSA_SRC,
390         PKI_QPG_QOS_DIFFSERV,
391         PKI_QPG_QOS_HIGIG,
392 };
393
394 struct pki_qos_entry {
395         uint16_t port_add;
396         uint16_t ggrp_ok;
397         uint16_t ggrp_bad;
398         uint16_t gaura;
399         uint8_t grptag_ok;
400         uint8_t grptag_bad;
401         uint8_t ena_red;
402         uint8_t ena_drop;
403 };
404
405 #define PKO_MAX_QOS_ENTRY 64
406
407 /* pki flow/style enable qos */
408 typedef struct pki_port_create_qos {
409         uint8_t port_type;
410         uint8_t qpg_qos;
411         uint8_t num_entry;
412         uint8_t tag_type;
413         uint8_t drop_policy;
414         struct pki_qos_entry qos_entry[PKO_MAX_QOS_ENTRY];
415 } pki_qos_cfg_t;
416
417 /* pki flow/style enable qos */
418 typedef struct pki_port_delete_qos_entry {
419         uint8_t port_type;
420         uint16_t index;
421 } pki_del_qos_t;
422
423 /* pki flow/style enable qos */
424 typedef struct pki_port_modify_qos_entry {
425         uint8_t port_type;
426         uint16_t index;
427         struct {
428                 uint8_t f_port_add:1;
429                 uint8_t f_grp_ok:1;
430                 uint8_t f_grp_bad:1;
431                 uint8_t f_gaura:1;
432                 uint8_t f_grptag_ok:1;
433                 uint8_t f_grptag_bad:1;
434                 uint8_t f_tag_type:1;
435         } mmask;
436         uint8_t tag_type;
437         struct pki_qos_entry qos_entry;
438 } pki_mod_qos_t;
439
440 static inline int
441 octeontx_pki_port_modify_qos(int port, pki_mod_qos_t *qos_cfg)
442 {
443         struct octeontx_mbox_hdr hdr;
444         int res;
445
446         mbox_pki_mod_qos_t q_cfg = *(mbox_pki_mod_qos_t *)qos_cfg;
447         int len = sizeof(mbox_pki_mod_qos_t);
448
449         hdr.coproc = OCTEONTX_PKI_COPROC;
450         hdr.msg = MBOX_PKI_PORT_MODIFY_QOS;
451         hdr.vfid = port;
452
453         res = octeontx_ssovf_mbox_send(&hdr, &q_cfg, len, NULL, 0);
454         if (res < 0)
455                 return -EACCES;
456
457         return res;
458 }
459
460 static inline int
461 octeontx_pki_port_delete_qos(int port, pki_del_qos_t *qos_cfg)
462 {
463         struct octeontx_mbox_hdr hdr;
464         int res;
465
466         mbox_pki_del_qos_t q_cfg = *(mbox_pki_del_qos_t *)qos_cfg;
467         int len = sizeof(mbox_pki_del_qos_t);
468
469         hdr.coproc = OCTEONTX_PKI_COPROC;
470         hdr.msg = MBOX_PKI_PORT_DELETE_QOS;
471         hdr.vfid = port;
472
473         res = octeontx_ssovf_mbox_send(&hdr, &q_cfg, len, NULL, 0);
474         if (res < 0)
475                 return -EACCES;
476
477         return res;
478 }
479
480 static inline int
481 octeontx_pki_port_close(int port)
482 {
483         struct octeontx_mbox_hdr hdr;
484         int res;
485
486         mbox_pki_port_t ptype;
487         int len = sizeof(mbox_pki_port_t);
488         memset(&ptype, 0, len);
489         ptype.port_type = OCTTX_PORT_TYPE_NET;
490
491         hdr.coproc = OCTEONTX_PKI_COPROC;
492         hdr.msg = MBOX_PKI_PORT_CLOSE;
493         hdr.vfid = port;
494
495         res = octeontx_ssovf_mbox_send(&hdr, &ptype, len, NULL, 0);
496         if (res < 0)
497                 return -EACCES;
498
499         return res;
500 }
501
502 static inline int
503 octeontx_pki_port_start(int port)
504 {
505         struct octeontx_mbox_hdr hdr;
506         int res;
507
508         mbox_pki_port_t ptype;
509         int len = sizeof(mbox_pki_port_t);
510         memset(&ptype, 0, len);
511         ptype.port_type = OCTTX_PORT_TYPE_NET;
512
513         hdr.coproc = OCTEONTX_PKI_COPROC;
514         hdr.msg = MBOX_PKI_PORT_START;
515         hdr.vfid = port;
516
517         res = octeontx_ssovf_mbox_send(&hdr, &ptype, len, NULL, 0);
518         if (res < 0)
519                 return -EACCES;
520
521         return res;
522 }
523
524 static inline int
525 octeontx_pki_port_stop(int port)
526 {
527         struct octeontx_mbox_hdr hdr;
528         int res;
529
530         mbox_pki_port_t ptype;
531         int len = sizeof(mbox_pki_port_t);
532         memset(&ptype, 0, len);
533         ptype.port_type = OCTTX_PORT_TYPE_NET;
534
535         hdr.coproc = OCTEONTX_PKI_COPROC;
536         hdr.msg = MBOX_PKI_PORT_STOP;
537         hdr.vfid = port;
538
539         res = octeontx_ssovf_mbox_send(&hdr, &ptype, len, NULL, 0);
540         if (res < 0)
541                 return -EACCES;
542
543         return res;
544 }
545
546 int octeontx_pki_port_open(int port);
547 int octeontx_pki_port_hash_config(int port, pki_hash_cfg_t *hash_cfg);
548 int octeontx_pki_port_pktbuf_config(int port, pki_pktbuf_cfg_t *buf_cfg);
549 int octeontx_pki_port_create_qos(int port, pki_qos_cfg_t *qos_cfg);
550 int octeontx_pki_port_close(int port);
551 int octeontx_pki_port_errchk_config(int port, pki_errchk_cfg_t *cfg);
552
553 #endif /* __OCTEONTX_PKI_H__ */