1aaf4363eSJerin Jacob /* SPDX-License-Identifier: BSD-3-Clause 2aaf4363eSJerin Jacob * Copyright(c) 2017 Cavium, Inc 3b95c3413SJerin Jacob */ 4b95c3413SJerin Jacob 5b95c3413SJerin Jacob #ifndef __OCTEONTX_PKI_H__ 6b95c3413SJerin Jacob #define __OCTEONTX_PKI_H__ 7b95c3413SJerin Jacob 8b95c3413SJerin Jacob #include <stdint.h> 9b95c3413SJerin Jacob 1089ee1e94SSantosh Shukla #include <octeontx_mbox.h> 11b95c3413SJerin Jacob 12b95c3413SJerin Jacob #define OCTEONTX_PKI_COPROC 5 13b95c3413SJerin Jacob 14b95c3413SJerin Jacob /* PKI messages */ 15b95c3413SJerin Jacob 16b95c3413SJerin Jacob #define MBOX_PKI_PORT_OPEN 1 17b95c3413SJerin Jacob #define MBOX_PKI_PORT_START 2 18b95c3413SJerin Jacob #define MBOX_PKI_PORT_STOP 3 19b95c3413SJerin Jacob #define MBOX_PKI_PORT_CLOSE 4 206d28968eSJerin Jacob #define MBOX_PKI_PORT_CONFIG 5 216d28968eSJerin Jacob #define MBOX_PKI_PORT_OPT_PARSER_CONFIG 6 226d28968eSJerin Jacob #define MBOX_PKI_PORT_CUSTOM_PARSER_CONFIG 7 236d28968eSJerin Jacob #define MBOX_PKI_PORT_PKTBUF_CONFIG 8 246d28968eSJerin Jacob #define MBOX_PKI_PORT_HASH_CONFIG 9 256d28968eSJerin Jacob #define MBOX_PKI_PORT_ERRCHK_CONFIG 10 266d28968eSJerin Jacob #define MBOX_PKI_PORT_CREATE_QOS 11 276d28968eSJerin Jacob #define MBOX_PKI_PORT_MODIFY_QOS 12 286d28968eSJerin Jacob #define MBOX_PKI_PORT_DELETE_QOS 13 296d28968eSJerin Jacob #define MBOX_PKI_PORT_PKTDROP_CONFIG 14 306d28968eSJerin Jacob #define MBOX_PKI_PORT_WQE_GEN_CONFIG 15 316d28968eSJerin Jacob #define MBOX_PKI_BACKPRESSURE_CONFIG 16 326d28968eSJerin Jacob #define MBOX_PKI_PORT_GET_STATS 17 336d28968eSJerin Jacob #define MBOX_PKI_PORT_RESET_STATS 18 346d28968eSJerin Jacob #define MBOX_PKI_GET_PORT_CONFIG 19 356d28968eSJerin Jacob #define MBOX_PKI_GET_PORT_QOS_CONFIG 20 36b4134b2dSPavan Nikhilesh #define MBOX_PKI_PORT_ALLOC_QPG 21 37b4134b2dSPavan Nikhilesh #define MBOX_PKI_PORT_FREE_QPG 22 38b4134b2dSPavan Nikhilesh #define MBOX_PKI_SET_PORT_CONFIG 23 396d28968eSJerin Jacob 406d28968eSJerin Jacob #define MBOX_PKI_MAX_QOS_ENTRY 64 416d28968eSJerin Jacob 42a6d6f0afSPavan Nikhilesh /* PKI maximum constants */ 43a6d6f0afSPavan Nikhilesh #define PKI_VF_MAX (32) 44a6d6f0afSPavan Nikhilesh #define PKI_MAX_PKTLEN (32768) 45a6d6f0afSPavan Nikhilesh 46b95c3413SJerin Jacob /* Interface types: */ 47b95c3413SJerin Jacob enum { 48b95c3413SJerin Jacob OCTTX_PORT_TYPE_NET, /* Network interface ports */ 49b95c3413SJerin Jacob OCTTX_PORT_TYPE_INT, /* CPU internal interface ports */ 50b95c3413SJerin Jacob OCTTX_PORT_TYPE_PCI, /* DPI/PCIe interface ports */ 51b95c3413SJerin Jacob OCTTX_PORT_TYPE_MAX 52b95c3413SJerin Jacob }; 53b95c3413SJerin Jacob 546d28968eSJerin Jacob /* pki pkind parse mode */ 556d28968eSJerin Jacob enum { 566d28968eSJerin Jacob PKI_PARSE_LA_TO_LG = 0, 576d28968eSJerin Jacob PKI_PARSE_LB_TO_LG = 1, 586d28968eSJerin Jacob PKI_PARSE_LC_TO_LG = 3, 596d28968eSJerin Jacob PKI_PARSE_LG = 0x3f, 606d28968eSJerin Jacob PKI_PARSE_NOTHING = 0x7f 616d28968eSJerin Jacob }; 626d28968eSJerin Jacob 63*91c0c978SPavan Nikhilesh /* CACHE MODE*/ 64*91c0c978SPavan Nikhilesh enum { 65*91c0c978SPavan Nikhilesh PKI_OPC_MODE_STT = 0LL, 66*91c0c978SPavan Nikhilesh PKI_OPC_MODE_STF = 1LL, 67*91c0c978SPavan Nikhilesh PKI_OPC_MODE_STF1_STT = 2LL, 68*91c0c978SPavan Nikhilesh PKI_OPC_MODE_STF2_STT = 3LL 69*91c0c978SPavan Nikhilesh }; 70*91c0c978SPavan Nikhilesh 71*91c0c978SPavan Nikhilesh /* PKI QPG QOS*/ 72*91c0c978SPavan Nikhilesh enum { 73*91c0c978SPavan Nikhilesh PKI_QPG_QOS_NONE = 0, 74*91c0c978SPavan Nikhilesh PKI_QPG_QOS_VLAN, 75*91c0c978SPavan Nikhilesh PKI_QPG_QOS_MPLS, 76*91c0c978SPavan Nikhilesh PKI_QPG_QOS_DSA_SRC, 77*91c0c978SPavan Nikhilesh PKI_QPG_QOS_DIFFSERV, 78*91c0c978SPavan Nikhilesh PKI_QPG_QOS_HIGIG, 79*91c0c978SPavan Nikhilesh }; 80*91c0c978SPavan Nikhilesh 81*91c0c978SPavan Nikhilesh /* pki port config */ 82*91c0c978SPavan Nikhilesh typedef struct pki_port_type { 83*91c0c978SPavan Nikhilesh uint8_t port_type; 84*91c0c978SPavan Nikhilesh } pki_port_type_t; 85*91c0c978SPavan Nikhilesh 866d28968eSJerin Jacob /* pki port config */ 876d28968eSJerin Jacob typedef struct pki_port_cfg { 886d28968eSJerin Jacob uint8_t port_type; 896d28968eSJerin Jacob struct { 906d28968eSJerin Jacob uint8_t fcs_pres:1; 916d28968eSJerin Jacob uint8_t fcs_skip:1; 926d28968eSJerin Jacob uint8_t parse_mode:1; 936d28968eSJerin Jacob uint8_t mpls_parse:1; 946d28968eSJerin Jacob uint8_t inst_hdr_parse:1; 956d28968eSJerin Jacob uint8_t fulc_parse:1; 966d28968eSJerin Jacob uint8_t dsa_parse:1; 976d28968eSJerin Jacob uint8_t hg2_parse:1; 986d28968eSJerin Jacob uint8_t hg_parse:1; 996d28968eSJerin Jacob } mmask; 1006d28968eSJerin Jacob uint8_t fcs_pres; 1016d28968eSJerin Jacob uint8_t fcs_skip; 1026d28968eSJerin Jacob uint8_t parse_mode; 1036d28968eSJerin Jacob uint8_t mpls_parse; 1046d28968eSJerin Jacob uint8_t inst_hdr_parse; 1056d28968eSJerin Jacob uint8_t fulc_parse; 1066d28968eSJerin Jacob uint8_t dsa_parse; 1076d28968eSJerin Jacob uint8_t hg2_parse; 1086d28968eSJerin Jacob uint8_t hg_parse; 1096d28968eSJerin Jacob } pki_prt_cfg_t; 1106d28968eSJerin Jacob 1116d28968eSJerin Jacob 1126d28968eSJerin Jacob /* pki Flow/style packet buffer config */ 1136d28968eSJerin Jacob typedef struct pki_port_pktbuf_cfg { 1146d28968eSJerin Jacob uint8_t port_type; 1156d28968eSJerin Jacob struct { 1166d28968eSJerin Jacob uint16_t f_mbuff_size:1; 1176d28968eSJerin Jacob uint16_t f_wqe_skip:1; 1186d28968eSJerin Jacob uint16_t f_first_skip:1; 1196d28968eSJerin Jacob uint16_t f_later_skip:1; 1206d28968eSJerin Jacob uint16_t f_pkt_outside_wqe:1; 1216d28968eSJerin Jacob uint16_t f_wqe_endian:1; 1226d28968eSJerin Jacob uint16_t f_cache_mode:1; 1236d28968eSJerin Jacob } mmask; 1246d28968eSJerin Jacob uint16_t mbuff_size; 1256d28968eSJerin Jacob uint16_t wqe_skip; 1266d28968eSJerin Jacob uint16_t first_skip; 1276d28968eSJerin Jacob uint16_t later_skip; 1286d28968eSJerin Jacob uint8_t pkt_outside_wqe; 1296d28968eSJerin Jacob uint8_t wqe_endian; 1306d28968eSJerin Jacob uint8_t cache_mode; 1316d28968eSJerin Jacob } pki_pktbuf_cfg_t; 1326d28968eSJerin Jacob 1336d28968eSJerin Jacob /* pki flow/style tag config */ 1346d28968eSJerin Jacob typedef struct pki_port_hash_cfg { 1356d28968eSJerin Jacob uint8_t port_type; 1366d28968eSJerin Jacob uint32_t tag_slf:1; 1376d28968eSJerin Jacob uint32_t tag_sle:1; 1386d28968eSJerin Jacob uint32_t tag_sld:1; 1396d28968eSJerin Jacob uint32_t tag_slc:1; 1406d28968eSJerin Jacob uint32_t tag_dlf:1; 1416d28968eSJerin Jacob uint32_t tag_dle:1; 1426d28968eSJerin Jacob uint32_t tag_dld:1; 1436d28968eSJerin Jacob uint32_t tag_dlc:1; 1446d28968eSJerin Jacob uint32_t tag_prt:1; 1456d28968eSJerin Jacob uint32_t tag_vlan0:1; 1466d28968eSJerin Jacob uint32_t tag_vlan1:1; 1476d28968eSJerin Jacob uint32_t tag_ip_pctl:1; 1486d28968eSJerin Jacob uint32_t tag_sync:1; 1496d28968eSJerin Jacob uint32_t tag_spi:1; 1506d28968eSJerin Jacob uint32_t tag_gtp:1; 1516d28968eSJerin Jacob uint32_t tag_vni:1; 1526d28968eSJerin Jacob } pki_hash_cfg_t; 1536d28968eSJerin Jacob 1546d28968eSJerin Jacob /* pki flow/style errcheck config */ 1556d28968eSJerin Jacob typedef struct pki_port_errcheck_cfg { 1566d28968eSJerin Jacob uint8_t port_type; 1576d28968eSJerin Jacob struct { 1586d28968eSJerin Jacob uint32_t f_ip6_udp_opt:1; 1596d28968eSJerin Jacob uint32_t f_lenerr_en:1; 1606d28968eSJerin Jacob uint32_t f_maxerr_en:1; 1616d28968eSJerin Jacob uint32_t f_minerr_en:1; 1626d28968eSJerin Jacob uint32_t f_fcs_chk:1; 1636d28968eSJerin Jacob uint32_t f_fcs_strip:1; 1646d28968eSJerin Jacob uint32_t f_len_lf:1; 1656d28968eSJerin Jacob uint32_t f_len_le:1; 1666d28968eSJerin Jacob uint32_t f_len_ld:1; 1676d28968eSJerin Jacob uint32_t f_len_lc:1; 1686d28968eSJerin Jacob uint32_t f_csum_lf:1; 1696d28968eSJerin Jacob uint32_t f_csum_le:1; 1706d28968eSJerin Jacob uint32_t f_csum_ld:1; 1716d28968eSJerin Jacob uint32_t f_csum_lc:1; 1726d28968eSJerin Jacob uint32_t f_min_frame_len; 1736d28968eSJerin Jacob uint32_t f_max_frame_len; 1746d28968eSJerin Jacob } mmask; 1756d28968eSJerin Jacob uint64_t ip6_udp_opt:1; 1766d28968eSJerin Jacob uint64_t lenerr_en:1; 1776d28968eSJerin Jacob uint64_t maxerr_en:1; 1786d28968eSJerin Jacob uint64_t minerr_en:1; 1796d28968eSJerin Jacob uint64_t fcs_chk:1; 1806d28968eSJerin Jacob uint64_t fcs_strip:1; 1816d28968eSJerin Jacob uint64_t len_lf:1; 1826d28968eSJerin Jacob uint64_t len_le:1; 1836d28968eSJerin Jacob uint64_t len_ld:1; 1846d28968eSJerin Jacob uint64_t len_lc:1; 1856d28968eSJerin Jacob uint64_t csum_lf:1; 1866d28968eSJerin Jacob uint64_t csum_le:1; 1876d28968eSJerin Jacob uint64_t csum_ld:1; 1886d28968eSJerin Jacob uint64_t csum_lc:1; 1896d28968eSJerin Jacob uint64_t min_frame_len; 1906d28968eSJerin Jacob uint64_t max_frame_len; 1916d28968eSJerin Jacob } pki_errchk_cfg_t; 1926d28968eSJerin Jacob 1936d28968eSJerin Jacob struct pki_qos_entry { 1946d28968eSJerin Jacob uint16_t port_add; 1956d28968eSJerin Jacob uint16_t ggrp_ok; 1966d28968eSJerin Jacob uint16_t ggrp_bad; 1976d28968eSJerin Jacob uint16_t gaura; 1986d28968eSJerin Jacob uint8_t grptag_ok; 1996d28968eSJerin Jacob uint8_t grptag_bad; 2006d28968eSJerin Jacob uint8_t ena_red; 2016d28968eSJerin Jacob uint8_t ena_drop; 202b4134b2dSPavan Nikhilesh uint8_t tag_type; 2036d28968eSJerin Jacob }; 2046d28968eSJerin Jacob 2056d28968eSJerin Jacob #define PKO_MAX_QOS_ENTRY 64 2066d28968eSJerin Jacob 2076d28968eSJerin Jacob /* pki flow/style enable qos */ 2086d28968eSJerin Jacob typedef struct pki_port_create_qos { 2096d28968eSJerin Jacob uint8_t port_type; 2106d28968eSJerin Jacob uint8_t qpg_qos; 2116d28968eSJerin Jacob uint8_t num_entry; 2126d28968eSJerin Jacob uint8_t tag_type; 2136d28968eSJerin Jacob uint8_t drop_policy; 2146d28968eSJerin Jacob struct pki_qos_entry qos_entry[PKO_MAX_QOS_ENTRY]; 2156d28968eSJerin Jacob } pki_qos_cfg_t; 2166d28968eSJerin Jacob 2176d28968eSJerin Jacob /* pki flow/style enable qos */ 218d0d65498SPavan Nikhilesh typedef struct pki_port_delete_qos_entry { 219d0d65498SPavan Nikhilesh uint8_t port_type; 220d0d65498SPavan Nikhilesh uint16_t index; 221d0d65498SPavan Nikhilesh } pki_del_qos_t; 222d0d65498SPavan Nikhilesh 223d0d65498SPavan Nikhilesh /* pki flow/style enable qos */ 2246d28968eSJerin Jacob typedef struct pki_port_modify_qos_entry { 2256d28968eSJerin Jacob uint8_t port_type; 2266d28968eSJerin Jacob uint16_t index; 2276d28968eSJerin Jacob struct { 2286d28968eSJerin Jacob uint8_t f_port_add:1; 2296d28968eSJerin Jacob uint8_t f_grp_ok:1; 2306d28968eSJerin Jacob uint8_t f_grp_bad:1; 2316d28968eSJerin Jacob uint8_t f_gaura:1; 232d0d65498SPavan Nikhilesh uint8_t f_grptag_ok:1; 233d0d65498SPavan Nikhilesh uint8_t f_grptag_bad:1; 234d0d65498SPavan Nikhilesh uint8_t f_tag_type:1; 2356d28968eSJerin Jacob } mmask; 2366d28968eSJerin Jacob struct pki_qos_entry qos_entry; 2376d28968eSJerin Jacob } pki_mod_qos_t; 2386d28968eSJerin Jacob 239d0d65498SPavan Nikhilesh static inline int 240d0d65498SPavan Nikhilesh octeontx_pki_port_modify_qos(int port, pki_mod_qos_t *qos_cfg) 241d0d65498SPavan Nikhilesh { 242d0d65498SPavan Nikhilesh struct octeontx_mbox_hdr hdr; 243d0d65498SPavan Nikhilesh int res; 244d0d65498SPavan Nikhilesh 245*91c0c978SPavan Nikhilesh pki_mod_qos_t q_cfg = *(pki_mod_qos_t *)qos_cfg; 246*91c0c978SPavan Nikhilesh int len = sizeof(pki_mod_qos_t); 247d0d65498SPavan Nikhilesh 248d0d65498SPavan Nikhilesh hdr.coproc = OCTEONTX_PKI_COPROC; 249d0d65498SPavan Nikhilesh hdr.msg = MBOX_PKI_PORT_MODIFY_QOS; 250d0d65498SPavan Nikhilesh hdr.vfid = port; 251d0d65498SPavan Nikhilesh 252d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, &q_cfg, len, NULL, 0); 253d0d65498SPavan Nikhilesh if (res < 0) 254d0d65498SPavan Nikhilesh return -EACCES; 255d0d65498SPavan Nikhilesh 256d0d65498SPavan Nikhilesh return res; 257d0d65498SPavan Nikhilesh } 258d0d65498SPavan Nikhilesh 259d0d65498SPavan Nikhilesh static inline int 260d0d65498SPavan Nikhilesh octeontx_pki_port_delete_qos(int port, pki_del_qos_t *qos_cfg) 261d0d65498SPavan Nikhilesh { 262d0d65498SPavan Nikhilesh struct octeontx_mbox_hdr hdr; 263d0d65498SPavan Nikhilesh int res; 264d0d65498SPavan Nikhilesh 265*91c0c978SPavan Nikhilesh pki_del_qos_t q_cfg = *(pki_del_qos_t *)qos_cfg; 266*91c0c978SPavan Nikhilesh int len = sizeof(pki_del_qos_t); 267d0d65498SPavan Nikhilesh 268d0d65498SPavan Nikhilesh hdr.coproc = OCTEONTX_PKI_COPROC; 269d0d65498SPavan Nikhilesh hdr.msg = MBOX_PKI_PORT_DELETE_QOS; 270d0d65498SPavan Nikhilesh hdr.vfid = port; 271d0d65498SPavan Nikhilesh 272d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, &q_cfg, len, NULL, 0); 273d0d65498SPavan Nikhilesh if (res < 0) 274d0d65498SPavan Nikhilesh return -EACCES; 275d0d65498SPavan Nikhilesh 276d0d65498SPavan Nikhilesh return res; 277d0d65498SPavan Nikhilesh } 278d0d65498SPavan Nikhilesh 279d0d65498SPavan Nikhilesh static inline int 280d0d65498SPavan Nikhilesh octeontx_pki_port_close(int port) 281d0d65498SPavan Nikhilesh { 282d0d65498SPavan Nikhilesh struct octeontx_mbox_hdr hdr; 283d0d65498SPavan Nikhilesh int res; 284d0d65498SPavan Nikhilesh 285*91c0c978SPavan Nikhilesh pki_port_type_t ptype; 286*91c0c978SPavan Nikhilesh int len = sizeof(pki_port_type_t); 287d0d65498SPavan Nikhilesh memset(&ptype, 0, len); 288d0d65498SPavan Nikhilesh ptype.port_type = OCTTX_PORT_TYPE_NET; 289d0d65498SPavan Nikhilesh 290d0d65498SPavan Nikhilesh hdr.coproc = OCTEONTX_PKI_COPROC; 291d0d65498SPavan Nikhilesh hdr.msg = MBOX_PKI_PORT_CLOSE; 292d0d65498SPavan Nikhilesh hdr.vfid = port; 293d0d65498SPavan Nikhilesh 294d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, &ptype, len, NULL, 0); 295d0d65498SPavan Nikhilesh if (res < 0) 296d0d65498SPavan Nikhilesh return -EACCES; 297d0d65498SPavan Nikhilesh 298d0d65498SPavan Nikhilesh return res; 299d0d65498SPavan Nikhilesh } 300d0d65498SPavan Nikhilesh 301d0d65498SPavan Nikhilesh static inline int 302d0d65498SPavan Nikhilesh octeontx_pki_port_start(int port) 303d0d65498SPavan Nikhilesh { 304d0d65498SPavan Nikhilesh struct octeontx_mbox_hdr hdr; 305d0d65498SPavan Nikhilesh int res; 306d0d65498SPavan Nikhilesh 307*91c0c978SPavan Nikhilesh pki_port_type_t ptype; 308*91c0c978SPavan Nikhilesh int len = sizeof(pki_port_type_t); 309d0d65498SPavan Nikhilesh memset(&ptype, 0, len); 310d0d65498SPavan Nikhilesh ptype.port_type = OCTTX_PORT_TYPE_NET; 311d0d65498SPavan Nikhilesh 312d0d65498SPavan Nikhilesh hdr.coproc = OCTEONTX_PKI_COPROC; 313d0d65498SPavan Nikhilesh hdr.msg = MBOX_PKI_PORT_START; 314d0d65498SPavan Nikhilesh hdr.vfid = port; 315d0d65498SPavan Nikhilesh 316d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, &ptype, len, NULL, 0); 317d0d65498SPavan Nikhilesh if (res < 0) 318d0d65498SPavan Nikhilesh return -EACCES; 319d0d65498SPavan Nikhilesh 320d0d65498SPavan Nikhilesh return res; 321d0d65498SPavan Nikhilesh } 322d0d65498SPavan Nikhilesh 323d0d65498SPavan Nikhilesh static inline int 324d0d65498SPavan Nikhilesh octeontx_pki_port_stop(int port) 325d0d65498SPavan Nikhilesh { 326d0d65498SPavan Nikhilesh struct octeontx_mbox_hdr hdr; 327d0d65498SPavan Nikhilesh int res; 328d0d65498SPavan Nikhilesh 329*91c0c978SPavan Nikhilesh pki_port_type_t ptype; 330*91c0c978SPavan Nikhilesh int len = sizeof(pki_port_type_t); 331d0d65498SPavan Nikhilesh memset(&ptype, 0, len); 332d0d65498SPavan Nikhilesh ptype.port_type = OCTTX_PORT_TYPE_NET; 333d0d65498SPavan Nikhilesh 334d0d65498SPavan Nikhilesh hdr.coproc = OCTEONTX_PKI_COPROC; 335d0d65498SPavan Nikhilesh hdr.msg = MBOX_PKI_PORT_STOP; 336d0d65498SPavan Nikhilesh hdr.vfid = port; 337d0d65498SPavan Nikhilesh 338d8dd3165SPavan Nikhilesh res = octeontx_mbox_send(&hdr, &ptype, len, NULL, 0); 339d0d65498SPavan Nikhilesh if (res < 0) 340d0d65498SPavan Nikhilesh return -EACCES; 341d0d65498SPavan Nikhilesh 342d0d65498SPavan Nikhilesh return res; 343d0d65498SPavan Nikhilesh } 344d0d65498SPavan Nikhilesh 345b95c3413SJerin Jacob int octeontx_pki_port_open(int port); 3466d28968eSJerin Jacob int octeontx_pki_port_hash_config(int port, pki_hash_cfg_t *hash_cfg); 3476d28968eSJerin Jacob int octeontx_pki_port_pktbuf_config(int port, pki_pktbuf_cfg_t *buf_cfg); 3486d28968eSJerin Jacob int octeontx_pki_port_create_qos(int port, pki_qos_cfg_t *qos_cfg); 349b95c3413SJerin Jacob int octeontx_pki_port_close(int port); 3506d28968eSJerin Jacob int octeontx_pki_port_errchk_config(int port, pki_errchk_cfg_t *cfg); 351b95c3413SJerin Jacob 352b95c3413SJerin Jacob #endif /* __OCTEONTX_PKI_H__ */ 353