1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(C) 2021 Marvell. 3 */ 4 5 #ifndef _ROC_NPC_H_ 6 #define _ROC_NPC_H_ 7 8 #include <sys/queue.h> 9 10 enum roc_npc_item_type { 11 ROC_NPC_ITEM_TYPE_VOID, 12 ROC_NPC_ITEM_TYPE_ANY, 13 ROC_NPC_ITEM_TYPE_ETH, 14 ROC_NPC_ITEM_TYPE_VLAN, 15 ROC_NPC_ITEM_TYPE_E_TAG, 16 ROC_NPC_ITEM_TYPE_IPV4, 17 ROC_NPC_ITEM_TYPE_IPV6, 18 ROC_NPC_ITEM_TYPE_ARP_ETH_IPV4, 19 ROC_NPC_ITEM_TYPE_MPLS, 20 ROC_NPC_ITEM_TYPE_ICMP, 21 ROC_NPC_ITEM_TYPE_IGMP, 22 ROC_NPC_ITEM_TYPE_UDP, 23 ROC_NPC_ITEM_TYPE_TCP, 24 ROC_NPC_ITEM_TYPE_SCTP, 25 ROC_NPC_ITEM_TYPE_ESP, 26 ROC_NPC_ITEM_TYPE_GRE, 27 ROC_NPC_ITEM_TYPE_NVGRE, 28 ROC_NPC_ITEM_TYPE_VXLAN, 29 ROC_NPC_ITEM_TYPE_GTPC, 30 ROC_NPC_ITEM_TYPE_GTPU, 31 ROC_NPC_ITEM_TYPE_GENEVE, 32 ROC_NPC_ITEM_TYPE_VXLAN_GPE, 33 ROC_NPC_ITEM_TYPE_IPV6_EXT, 34 ROC_NPC_ITEM_TYPE_GRE_KEY, 35 ROC_NPC_ITEM_TYPE_HIGIG2, 36 ROC_NPC_ITEM_TYPE_CPT_HDR, 37 ROC_NPC_ITEM_TYPE_L3_CUSTOM, 38 ROC_NPC_ITEM_TYPE_QINQ, 39 ROC_NPC_ITEM_TYPE_RAW, 40 ROC_NPC_ITEM_TYPE_END, 41 }; 42 43 struct roc_npc_item_info { 44 enum roc_npc_item_type type; /* Item type */ 45 uint32_t size; /* item size */ 46 const void *spec; /**< Pointer to item specification structure. */ 47 const void *mask; /**< Bit-mask applied to spec and last. */ 48 const void *last; /* For range */ 49 }; 50 51 struct roc_npc_flow_item_raw { 52 uint32_t relative : 1; /**< Look for pattern after the previous item. */ 53 uint32_t search : 1; /**< Search pattern from offset. */ 54 uint32_t reserved : 30; /**< Reserved, must be set to zero. */ 55 int32_t offset; /**< Absolute or relative offset for pattern. */ 56 uint16_t limit; /**< Search area limit for start of pattern. */ 57 uint16_t length; /**< Pattern length. */ 58 const uint8_t *pattern; /**< Byte string to look for. */ 59 }; 60 61 struct roc_ether_addr { 62 uint8_t addr_bytes[PLT_ETHER_ADDR_LEN]; /**< Addr bytes in tx order */ 63 } plt_aligned(2); 64 65 struct roc_ether_hdr { 66 struct roc_ether_addr d_addr; /**< Destination address. */ 67 PLT_STD_C11 68 union { 69 struct roc_ether_addr s_addr; /**< Source address. */ 70 struct { 71 struct roc_ether_addr S_addr; 72 } S_un; /**< Do not use directly; use s_addr instead.*/ 73 }; 74 uint16_t ether_type; /**< Frame type. */ 75 } plt_aligned(2); 76 77 PLT_STD_C11 78 struct roc_npc_flow_item_eth { 79 union { 80 struct { 81 /* 82 * These fields are retained 83 * for compatibility. 84 * Please switch to the new header field below. 85 */ 86 struct roc_ether_addr dst; /**< Destination MAC. */ 87 struct roc_ether_addr src; /**< Source MAC. */ 88 uint16_t type; /**< EtherType or TPID. */ 89 }; 90 struct roc_ether_hdr hdr; 91 }; 92 uint32_t has_vlan : 1; /**< Packet header contains at least one VLAN. */ 93 uint32_t reserved : 31; /**< Reserved, must be zero. */ 94 }; 95 96 struct roc_vlan_hdr { 97 uint16_t vlan_tci; /**< Priority (3) + CFI (1) + Identifier Code (12) */ 98 uint16_t eth_proto; /**< Ethernet type of encapsulated frame. */ 99 } __plt_packed; 100 101 PLT_STD_C11 102 struct roc_npc_flow_item_vlan { 103 union { 104 struct { 105 uint16_t tci; /**< Tag control information. */ 106 uint16_t inner_type; /**< Inner EtherType or TPID. */ 107 }; 108 struct roc_vlan_hdr hdr; 109 }; 110 uint32_t has_more_vlan : 1; 111 /**< Packet header contains at least one more VLAN, after this VLAN. */ 112 uint32_t reserved : 31; /**< Reserved, must be zero. */ 113 }; 114 115 struct roc_ipv6_hdr { 116 uint32_t vtc_flow; /**< IP version, traffic class & flow label. */ 117 uint16_t payload_len; /**< IP payload size, including ext. headers */ 118 uint8_t proto; /**< Protocol, next header. */ 119 uint8_t hop_limits; /**< Hop limits. */ 120 uint8_t src_addr[16]; /**< IP address of source host. */ 121 uint8_t dst_addr[16]; /**< IP address of destination host(s). */ 122 } __plt_packed; 123 124 struct roc_npc_flow_item_ipv6 { 125 struct roc_ipv6_hdr hdr; /**< IPv6 header definition. */ 126 uint32_t has_hop_ext : 1; 127 /**< Header contains Hop-by-Hop Options extension header. */ 128 uint32_t has_route_ext : 1; 129 /**< Header contains Routing extension header. */ 130 uint32_t has_frag_ext : 1; 131 /**< Header contains Fragment extension header. */ 132 uint32_t has_auth_ext : 1; 133 /**< Header contains Authentication extension header. */ 134 uint32_t has_esp_ext : 1; 135 /**< Header contains Encapsulation Security Payload extension header. */ 136 uint32_t has_dest_ext : 1; 137 /**< Header contains Destination Options extension header. */ 138 uint32_t has_mobil_ext : 1; 139 /**< Header contains Mobility extension header. */ 140 uint32_t has_hip_ext : 1; 141 /**< Header contains Host Identity Protocol extension header. */ 142 uint32_t has_shim6_ext : 1; 143 /**< Header contains Shim6 Protocol extension header. */ 144 uint32_t reserved : 23; 145 /**< Reserved for future extension headers, must be zero. */ 146 }; 147 148 #define ROC_NPC_MAX_ACTION_COUNT 19 149 150 enum roc_npc_action_type { 151 ROC_NPC_ACTION_TYPE_END = (1 << 0), 152 ROC_NPC_ACTION_TYPE_VOID = (1 << 1), 153 ROC_NPC_ACTION_TYPE_MARK = (1 << 2), 154 ROC_NPC_ACTION_TYPE_FLAG = (1 << 3), 155 ROC_NPC_ACTION_TYPE_DROP = (1 << 4), 156 ROC_NPC_ACTION_TYPE_QUEUE = (1 << 5), 157 ROC_NPC_ACTION_TYPE_RSS = (1 << 6), 158 ROC_NPC_ACTION_TYPE_DUP = (1 << 7), 159 ROC_NPC_ACTION_TYPE_SEC = (1 << 8), 160 ROC_NPC_ACTION_TYPE_COUNT = (1 << 9), 161 ROC_NPC_ACTION_TYPE_PF = (1 << 10), 162 ROC_NPC_ACTION_TYPE_VF = (1 << 11), 163 ROC_NPC_ACTION_TYPE_VLAN_STRIP = (1 << 12), 164 ROC_NPC_ACTION_TYPE_VLAN_INSERT = (1 << 13), 165 ROC_NPC_ACTION_TYPE_VLAN_ETHTYPE_INSERT = (1 << 14), 166 ROC_NPC_ACTION_TYPE_VLAN_PCP_INSERT = (1 << 15), 167 ROC_NPC_ACTION_TYPE_PORT_ID = (1 << 16), 168 ROC_NPC_ACTION_TYPE_METER = (1 << 17), 169 }; 170 171 struct roc_npc_action { 172 enum roc_npc_action_type type; /**< Action type. */ 173 const void *conf; /**< Pointer to action configuration object. */ 174 }; 175 176 struct roc_npc_action_mark { 177 uint32_t id; /**< Integer value to return with packets. */ 178 }; 179 180 struct roc_npc_action_vf { 181 uint32_t original : 1; /**< Use original VF ID if possible. */ 182 uint32_t reserved : 31; /**< Reserved, must be zero. */ 183 uint32_t id; /**< VF ID. */ 184 }; 185 186 struct roc_npc_action_port_id { 187 uint32_t original : 1; /**< Use original port ID if possible. */ 188 uint32_t reserved : 31; /**< Reserved, must be zero. */ 189 uint32_t id; /**< port ID. */ 190 }; 191 192 struct roc_npc_action_queue { 193 uint16_t index; /**< Queue index to use. */ 194 }; 195 196 struct roc_npc_action_of_push_vlan { 197 uint16_t ethertype; /**< EtherType. */ 198 }; 199 200 struct roc_npc_action_of_set_vlan_vid { 201 uint16_t vlan_vid; /**< VLAN id. */ 202 }; 203 204 struct roc_npc_action_of_set_vlan_pcp { 205 uint8_t vlan_pcp; /**< VLAN priority. */ 206 }; 207 208 struct roc_npc_action_meter { 209 uint32_t mtr_id; /**< Meter id to be applied. > */ 210 }; 211 212 struct roc_npc_attr { 213 uint32_t priority; /**< Rule priority level within group. */ 214 uint32_t ingress : 1; /**< Rule applies to ingress traffic. */ 215 uint32_t egress : 1; /**< Rule applies to egress traffic. */ 216 uint32_t reserved : 30; /**< Reserved, must be zero. */ 217 }; 218 219 struct roc_npc_flow_dump_data { 220 uint8_t lid; 221 uint16_t ltype; 222 }; 223 224 struct roc_npc_flow { 225 uint8_t nix_intf; 226 uint8_t enable; 227 uint32_t mcam_id; 228 int32_t ctr_id; 229 uint32_t priority; 230 uint32_t mtr_id; 231 #define ROC_NPC_MAX_MCAM_WIDTH_DWORDS 7 232 /* Contiguous match string */ 233 uint64_t mcam_data[ROC_NPC_MAX_MCAM_WIDTH_DWORDS]; 234 uint64_t mcam_mask[ROC_NPC_MAX_MCAM_WIDTH_DWORDS]; 235 uint64_t npc_action; 236 uint64_t vtag_action; 237 bool vtag_insert_enabled; 238 uint8_t vtag_insert_count; 239 #define ROC_NPC_MAX_FLOW_PATTERNS 32 240 struct roc_npc_flow_dump_data dump_data[ROC_NPC_MAX_FLOW_PATTERNS]; 241 uint16_t num_patterns; 242 243 TAILQ_ENTRY(roc_npc_flow) next; 244 }; 245 246 enum roc_npc_rss_hash_function { 247 ROC_NPC_RSS_HASH_FUNCTION_DEFAULT = 0, 248 ROC_NPC_RSS_HASH_FUNCTION_TOEPLITZ, /**< Toeplitz */ 249 ROC_NPC_RSS_HASH_FUNCTION_SIMPLE_XOR, /**< Simple XOR */ 250 ROC_NPC_RSS_HASH_FUNCTION_SYMMETRIC_TOEPLITZ, 251 ROC_NPC_RSS_HASH_FUNCTION_MAX, 252 }; 253 254 struct roc_npc_action_rss { 255 enum roc_npc_rss_hash_function func; 256 uint32_t level; 257 uint64_t types; /**< Specific RSS hash types (see RTE_ETH_RSS_*). */ 258 uint32_t key_len; /**< Hash key length in bytes. */ 259 uint32_t queue_num; /**< Number of entries in @p queue. */ 260 const uint8_t *key; /**< Hash key. */ 261 const uint16_t *queue; /**< Queue indices to use. */ 262 }; 263 264 enum roc_npc_intf { 265 ROC_NPC_INTF_RX = 0, 266 ROC_NPC_INTF_TX = 1, 267 ROC_NPC_INTF_MAX = 2, 268 }; 269 270 enum flow_vtag_cfg_dir { VTAG_TX, VTAG_RX }; 271 #define ROC_ETHER_TYPE_VLAN 0x8100 /**< IEEE 802.1Q VLAN tagging. */ 272 #define ROC_ETHER_TYPE_QINQ 0x88A8 /**< IEEE 802.1ad QinQ tagging. */ 273 274 struct roc_npc { 275 struct roc_nix *roc_nix; 276 uint8_t switch_header_type; 277 uint8_t pre_l2_size_offset; /**< Offset with in header that holds 278 * size of custom header 279 */ 280 uint8_t pre_l2_size_offset_mask; /**< Offset mask with in header 281 * that holds size of custom header 282 */ 283 uint8_t pre_l2_size_shift_dir; /**< Shift direction to calculate size 284 */ 285 uint16_t flow_prealloc_size; 286 uint16_t flow_max_priority; 287 uint16_t channel; 288 uint16_t pf_func; 289 uint64_t kex_capability; 290 uint64_t rx_parse_nibble; 291 /* Parsed RSS Flowkey cfg for current flow being created */ 292 uint32_t flowkey_cfg_state; 293 bool is_sdp_mask_set; 294 uint16_t sdp_channel; 295 uint16_t sdp_channel_mask; 296 297 #define ROC_NPC_MEM_SZ (5 * 1024) 298 uint8_t reserved[ROC_NPC_MEM_SZ]; 299 } __plt_cache_aligned; 300 301 int __roc_api roc_npc_init(struct roc_npc *roc_npc); 302 int __roc_api roc_npc_fini(struct roc_npc *roc_npc); 303 const char *__roc_api roc_npc_profile_name_get(struct roc_npc *roc_npc); 304 305 struct roc_npc_flow *__roc_api 306 roc_npc_flow_create(struct roc_npc *roc_npc, const struct roc_npc_attr *attr, 307 const struct roc_npc_item_info pattern[], 308 const struct roc_npc_action actions[], int *errcode); 309 int __roc_api roc_npc_flow_destroy(struct roc_npc *roc_npc, 310 struct roc_npc_flow *flow); 311 int __roc_api roc_npc_mcam_free_entry(struct roc_npc *roc_npc, uint32_t entry); 312 int __roc_api roc_npc_mcam_enable_all_entries(struct roc_npc *roc_npc, 313 bool enable); 314 int __roc_api roc_npc_mcam_alloc_entry(struct roc_npc *roc_npc, 315 struct roc_npc_flow *mcam, 316 struct roc_npc_flow *ref_mcam, int prio, 317 int *resp_count); 318 int __roc_api roc_npc_mcam_alloc_entries(struct roc_npc *roc_npc, int ref_entry, 319 int *alloc_entry, int req_count, 320 int priority, int *resp_count); 321 int __roc_api roc_npc_mcam_ena_dis_entry(struct roc_npc *roc_npc, 322 struct roc_npc_flow *mcam, 323 bool enable); 324 int __roc_api roc_npc_mcam_write_entry(struct roc_npc *roc_npc, 325 struct roc_npc_flow *mcam); 326 int __roc_api roc_npc_flow_parse(struct roc_npc *roc_npc, 327 const struct roc_npc_attr *attr, 328 const struct roc_npc_item_info pattern[], 329 const struct roc_npc_action actions[], 330 struct roc_npc_flow *flow); 331 int __roc_api roc_npc_get_low_priority_mcam(struct roc_npc *roc_npc); 332 int __roc_api roc_npc_mcam_free_counter(struct roc_npc *roc_npc, 333 uint16_t ctr_id); 334 int __roc_api roc_npc_mcam_read_counter(struct roc_npc *roc_npc, 335 uint32_t ctr_id, uint64_t *count); 336 int __roc_api roc_npc_mcam_clear_counter(struct roc_npc *roc_npc, 337 uint32_t ctr_id); 338 int __roc_api roc_npc_mcam_free_all_resources(struct roc_npc *roc_npc); 339 void __roc_api roc_npc_flow_dump(FILE *file, struct roc_npc *roc_npc); 340 void __roc_api roc_npc_flow_mcam_dump(FILE *file, struct roc_npc *roc_npc, 341 struct roc_npc_flow *mcam); 342 int __roc_api roc_npc_vtag_actions_get(struct roc_npc *roc_npc); 343 int __roc_api roc_npc_vtag_actions_sub_return(struct roc_npc *roc_npc, 344 uint32_t count); 345 int __roc_api roc_npc_mcam_merge_base_steering_rule(struct roc_npc *roc_npc, 346 struct roc_npc_flow *flow); 347 int __roc_api roc_npc_validate_portid_action(struct roc_npc *roc_npc_src, 348 struct roc_npc *roc_npc_dst); 349 #endif /* _ROC_NPC_H_ */ 350