net/bnxt: fix RSS action parser
[dpdk.git] / drivers / net / bnxt / bnxt_filter.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2014-2021 Broadcom
3  * All rights reserved.
4  */
5
6 #ifndef _BNXT_FILTER_H_
7 #define _BNXT_FILTER_H_
8
9 #include <rte_ether.h>
10
11 #define bnxt_vlan_filter_exists(bp, filter, chk, vlan_id)       \
12                 (((filter)->enables & (chk)) &&                 \
13                  ((filter)->l2_ivlan == (vlan_id) &&            \
14                   (filter)->l2_ivlan_mask == 0x0FFF) &&         \
15                  !memcmp((filter)->l2_addr, (bp)->mac_addr,     \
16                          RTE_ETHER_ADDR_LEN))
17 struct bnxt;
18
19 #define BNXT_FLOW_L2_VALID_FLAG                 BIT(0)
20 #define BNXT_FLOW_L2_SRC_VALID_FLAG             BIT(1)
21 #define BNXT_FLOW_L2_INNER_SRC_VALID_FLAG       BIT(2)
22 #define BNXT_FLOW_L2_DST_VALID_FLAG             BIT(3)
23 #define BNXT_FLOW_L2_INNER_DST_VALID_FLAG       BIT(4)
24 #define BNXT_FLOW_L2_DROP_FLAG                  BIT(5)
25 #define BNXT_FLOW_PARSE_INNER_FLAG              BIT(6)
26 #define BNXT_FLOW_MARK_FLAG                     BIT(7)
27
28 struct bnxt_flow_stats {
29         uint64_t        packets;
30         uint64_t        bytes;
31 };
32
33 struct bnxt_filter_info {
34         STAILQ_ENTRY(bnxt_filter_info)  next;
35         uint32_t                flow_id;
36         uint64_t                fw_l2_filter_id;
37         struct bnxt_filter_info *matching_l2_fltr_ptr;
38         uint64_t                fw_em_filter_id;
39         uint64_t                fw_ntuple_filter_id;
40 #define INVALID_MAC_INDEX       ((uint16_t)-1)
41         uint16_t                mac_index;
42 #define HWRM_CFA_L2_FILTER      0
43 #define HWRM_CFA_EM_FILTER      1
44 #define HWRM_CFA_NTUPLE_FILTER  2
45 #define HWRM_CFA_TUNNEL_REDIRECT_FILTER 3
46 #define HWRM_CFA_CONFIG         4
47         uint8_t                 filter_type;
48         uint32_t                dst_id;
49
50         /* Filter Characteristics */
51         uint32_t                flags;
52         uint32_t                enables;
53         uint32_t                l2_ref_cnt;
54         uint8_t                 l2_addr[RTE_ETHER_ADDR_LEN];
55         uint8_t                 l2_addr_mask[RTE_ETHER_ADDR_LEN];
56         uint32_t                valid_flags;
57         uint16_t                l2_ovlan;
58         uint16_t                l2_ovlan_mask;
59         uint16_t                l2_ivlan;
60         uint16_t                l2_ivlan_mask;
61         uint8_t                 t_l2_addr[RTE_ETHER_ADDR_LEN];
62         uint8_t                 t_l2_addr_mask[RTE_ETHER_ADDR_LEN];
63         uint16_t                t_l2_ovlan;
64         uint16_t                t_l2_ovlan_mask;
65         uint16_t                t_l2_ivlan;
66         uint16_t                t_l2_ivlan_mask;
67         uint8_t                 tunnel_type;
68         uint16_t                mirror_vnic_id;
69         uint32_t                vni;
70         uint8_t                 pri_hint;
71         uint64_t                l2_filter_id_hint;
72         uint32_t                src_id;
73         uint8_t                 src_type;
74         uint8_t                 src_macaddr[6];
75         uint8_t                 dst_macaddr[6];
76         uint32_t                dst_ipaddr[4];
77         uint32_t                dst_ipaddr_mask[4];
78         uint32_t                src_ipaddr[4];
79         uint32_t                src_ipaddr_mask[4];
80         uint16_t                dst_port;
81         uint16_t                dst_port_mask;
82         uint16_t                src_port;
83         uint16_t                src_port_mask;
84         uint16_t                ip_protocol;
85         uint16_t                ip_addr_type;
86         uint16_t                ethertype;
87         uint32_t                priority;
88         /* Backptr to vnic. As of now, used only by an L2 filter
89          * to remember which vnic it was created on
90          */
91         struct                  bnxt_vnic_info *vnic;
92         uint32_t                mark;
93         struct bnxt_flow_stats  hw_stats;
94 };
95
96 struct bnxt_filter_info *bnxt_alloc_filter(struct bnxt *bp);
97 struct bnxt_filter_info *bnxt_alloc_vf_filter(struct bnxt *bp, uint16_t vf);
98 void bnxt_free_all_filters(struct bnxt *bp);
99 void bnxt_free_filter_mem(struct bnxt *bp);
100 int bnxt_alloc_filter_mem(struct bnxt *bp);
101 struct bnxt_filter_info *bnxt_get_unused_filter(struct bnxt *bp);
102 void bnxt_free_filter(struct bnxt *bp, struct bnxt_filter_info *filter);
103 struct bnxt_filter_info *bnxt_get_l2_filter(struct bnxt *bp,
104                 struct bnxt_filter_info *nf, struct bnxt_vnic_info *vnic);
105
106 #define NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_MACADDR  \
107         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_SRC_MACADDR
108 #define EM_FLOW_ALLOC_INPUT_EN_SRC_MACADDR      \
109         HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_SRC_MACADDR
110 #define NTUPLE_FLTR_ALLOC_INPUT_EN_DST_MACADDR  \
111         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_DST_MACADDR
112 #define EM_FLOW_ALLOC_INPUT_EN_DST_MACADDR      \
113         HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_DST_MACADDR
114 #define NTUPLE_FLTR_ALLOC_INPUT_EN_ETHERTYPE   \
115         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_ETHERTYPE
116 #define EM_FLOW_ALLOC_INPUT_EN_ETHERTYPE       \
117         HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_ETHERTYPE
118 #define EM_FLOW_ALLOC_INPUT_EN_OVLAN_VID       \
119         HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_OVLAN_VID
120 #define NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_IPADDR  \
121         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_SRC_IPADDR
122 #define NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_IPADDR_MASK     \
123         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_SRC_IPADDR_MASK
124 #define NTUPLE_FLTR_ALLOC_INPUT_EN_DST_IPADDR  \
125         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_DST_IPADDR
126 #define NTUPLE_FLTR_ALLOC_INPUT_EN_DST_IPADDR_MASK     \
127         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_DST_IPADDR_MASK
128 #define NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_PORT    \
129         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_SRC_PORT
130 #define NTUPLE_FLTR_ALLOC_INPUT_EN_SRC_PORT_MASK       \
131         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_SRC_PORT_MASK
132 #define NTUPLE_FLTR_ALLOC_INPUT_EN_DST_PORT    \
133         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_DST_PORT
134 #define NTUPLE_FLTR_ALLOC_INPUT_EN_DST_PORT_MASK       \
135         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_DST_PORT_MASK
136 #define NTUPLE_FLTR_ALLOC_IN_EN_IP_PROTO        \
137         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_IP_PROTOCOL
138 #define EM_FLOW_ALLOC_INPUT_EN_SRC_IPADDR       \
139         HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_SRC_IPADDR
140 #define EM_FLOW_ALLOC_INPUT_EN_DST_IPADDR       \
141         HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_DST_IPADDR
142 #define EM_FLOW_ALLOC_INPUT_EN_SRC_PORT \
143         HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_SRC_PORT
144 #define EM_FLOW_ALLOC_INPUT_EN_DST_PORT \
145         HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_DST_PORT
146 #define EM_FLOW_ALLOC_INPUT_EN_IP_PROTO \
147         HWRM_CFA_EM_FLOW_ALLOC_INPUT_ENABLES_IP_PROTOCOL
148 #define EM_FLOW_ALLOC_INPUT_IP_ADDR_TYPE_IPV6   \
149         HWRM_CFA_EM_FLOW_ALLOC_INPUT_IP_ADDR_TYPE_IPV6
150 #define NTUPLE_FLTR_ALLOC_INPUT_IP_ADDR_TYPE_IPV6       \
151         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_IP_ADDR_TYPE_IPV6
152 #define CFA_NTUPLE_FILTER_ALLOC_REQ_TUNNEL_TYPE_VXLAN   \
153         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_TUNNEL_TYPE_VXLAN
154 #define CFA_NTUPLE_FILTER_ALLOC_REQ_TUNNEL_TYPE_NVGRE   \
155         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_TUNNEL_TYPE_NVGRE
156 #define CFA_NTUPLE_FILTER_ALLOC_REQ_TUNNEL_TYPE_IPGRE  \
157         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_TUNNEL_TYPE_IPGRE
158 #define L2_FILTER_ALLOC_INPUT_EN_L2_ADDR_MASK   \
159         HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_ADDR_MASK
160 #define NTUPLE_FLTR_ALLOC_INPUT_IP_PROTOCOL_UDP \
161         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_IP_PROTOCOL_UDP
162 #define NTUPLE_FLTR_ALLOC_INPUT_IP_PROTOCOL_TCP \
163         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_IP_PROTOCOL_TCP
164 #define NTUPLE_FLTR_ALLOC_INPUT_IP_PROTOCOL_UNKNOWN     \
165         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_IP_PROTOCOL_UNKNOWN
166 #define NTUPLE_FLTR_ALLOC_INPUT_IP_ADDR_TYPE_IPV4       \
167         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_IP_ADDR_TYPE_IPV4
168 #define NTUPLE_FLTR_ALLOC_INPUT_EN_MIRROR_VNIC_ID       \
169         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_MIRROR_VNIC_ID
170 #define NTUPLE_FLTR_ALLOC_INPUT_EN_MIRROR_VNIC_ID       \
171         HWRM_CFA_NTUPLE_FILTER_ALLOC_INPUT_ENABLES_MIRROR_VNIC_ID
172 #define L2_FILTER_ALLOC_INPUT_EN_T_NUM_VLANS \
173         HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_T_NUM_VLANS
174 #define L2_FILTER_ALLOC_INPUT_EN_NUM_VLANS \
175         HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_NUM_VLANS
176 #endif