1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2014-2018 Broadcom
8 #include <rte_byteorder.h>
10 #include <rte_malloc.h>
12 #include <rte_flow_driver.h>
13 #include <rte_tailq.h>
16 #include "bnxt_filter.h"
17 #include "bnxt_hwrm.h"
18 #include "bnxt_vnic.h"
19 #include "hsi_struct_def_dpdk.h"
25 struct bnxt_filter_info
*bnxt_alloc_filter(struct bnxt
*bp
)
27 struct bnxt_filter_info
*filter
;
29 filter
= bnxt_get_unused_filter(bp
);
31 PMD_DRV_LOG(ERR
, "No more free filter resources\n");
35 filter
->mac_index
= INVALID_MAC_INDEX
;
36 /* Default to L2 MAC Addr filter */
37 filter
->flags
= HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_PATH_RX
;
38 filter
->enables
= HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_ADDR
|
39 HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_ADDR_MASK
;
40 memcpy(filter
->l2_addr
, bp
->mac_addr
, RTE_ETHER_ADDR_LEN
);
41 memset(filter
->l2_addr_mask
, 0xff, RTE_ETHER_ADDR_LEN
);
46 struct bnxt_filter_info
*bnxt_alloc_vf_filter(struct bnxt
*bp
, uint16_t vf
)
48 struct bnxt_filter_info
*filter
;
50 filter
= rte_zmalloc("bnxt_vf_filter_info", sizeof(*filter
), 0);
52 PMD_DRV_LOG(ERR
, "Failed to alloc memory for VF %hu filters\n",
57 filter
->fw_l2_filter_id
= UINT64_MAX
;
58 STAILQ_INSERT_TAIL(&bp
->pf
->vf_info
[vf
].filter
, filter
, next
);
62 static void bnxt_init_filters(struct bnxt
*bp
)
64 struct bnxt_filter_info
*filter
;
67 max_filters
= bp
->max_l2_ctx
;
68 STAILQ_INIT(&bp
->free_filter_list
);
69 for (i
= 0; i
< max_filters
; i
++) {
70 filter
= &bp
->filter_info
[i
];
71 filter
->fw_l2_filter_id
= UINT64_MAX
;
72 filter
->fw_em_filter_id
= UINT64_MAX
;
73 filter
->fw_ntuple_filter_id
= UINT64_MAX
;
74 STAILQ_INSERT_TAIL(&bp
->free_filter_list
, filter
, next
);
78 void bnxt_free_all_filters(struct bnxt
*bp
)
80 struct bnxt_vnic_info
*vnic
;
81 struct bnxt_filter_info
*filter
, *temp_filter
;
84 for (i
= 0; i
< bp
->nr_vnics
; i
++) {
85 vnic
= &bp
->vnic_info
[i
];
86 filter
= STAILQ_FIRST(&vnic
->filter
);
88 temp_filter
= STAILQ_NEXT(filter
, next
);
89 STAILQ_REMOVE(&vnic
->filter
, filter
,
90 bnxt_filter_info
, next
);
91 STAILQ_INSERT_TAIL(&bp
->free_filter_list
,
95 STAILQ_INIT(&vnic
->filter
);
98 for (i
= 0; i
< bp
->pf
->max_vfs
; i
++) {
99 STAILQ_FOREACH(filter
, &bp
->pf
->vf_info
[i
].filter
, next
) {
100 bnxt_hwrm_clear_l2_filter(bp
, filter
);
105 void bnxt_free_filter_mem(struct bnxt
*bp
)
107 struct bnxt_filter_info
*filter
;
108 uint16_t max_filters
, i
;
111 if (bp
->filter_info
== NULL
)
114 /* Ensure that all filters are freed */
115 max_filters
= bp
->max_l2_ctx
;
116 for (i
= 0; i
< max_filters
; i
++) {
117 filter
= &bp
->filter_info
[i
];
118 if (filter
->fw_ntuple_filter_id
!= ((uint64_t)-1) &&
119 filter
->filter_type
== HWRM_CFA_NTUPLE_FILTER
) {
120 /* Call HWRM to try to free filter again */
121 rc
= bnxt_hwrm_clear_ntuple_filter(bp
, filter
);
124 "Cannot free ntuple filter: %d\n",
127 filter
->fw_ntuple_filter_id
= UINT64_MAX
;
129 if (filter
->fw_l2_filter_id
!= ((uint64_t)-1) &&
130 filter
->filter_type
== HWRM_CFA_L2_FILTER
) {
131 PMD_DRV_LOG(DEBUG
, "L2 filter is not free\n");
132 /* Call HWRM to try to free filter again */
133 rc
= bnxt_hwrm_clear_l2_filter(bp
, filter
);
136 "Cannot free L2 filter: %d\n",
139 filter
->fw_l2_filter_id
= UINT64_MAX
;
142 STAILQ_INIT(&bp
->free_filter_list
);
144 rte_free(bp
->filter_info
);
145 bp
->filter_info
= NULL
;
147 for (i
= 0; i
< bp
->pf
->max_vfs
; i
++) {
148 STAILQ_FOREACH(filter
, &bp
->pf
->vf_info
[i
].filter
, next
) {
150 STAILQ_REMOVE(&bp
->pf
->vf_info
[i
].filter
, filter
,
151 bnxt_filter_info
, next
);
156 int bnxt_alloc_filter_mem(struct bnxt
*bp
)
158 struct bnxt_filter_info
*filter_mem
;
159 uint16_t max_filters
;
161 max_filters
= bp
->max_l2_ctx
;
162 /* Allocate memory for VNIC pool and filter pool */
163 filter_mem
= rte_zmalloc("bnxt_filter_info",
164 max_filters
* sizeof(struct bnxt_filter_info
),
166 if (filter_mem
== NULL
) {
167 PMD_DRV_LOG(ERR
, "Failed to alloc memory for %d filters",
171 bp
->filter_info
= filter_mem
;
172 bnxt_init_filters(bp
);
176 struct bnxt_filter_info
*bnxt_get_unused_filter(struct bnxt
*bp
)
178 struct bnxt_filter_info
*filter
;
180 /* Find the 1st unused filter from the free_filter_list pool*/
181 filter
= STAILQ_FIRST(&bp
->free_filter_list
);
183 PMD_DRV_LOG(ERR
, "No more free filter resources\n");
186 STAILQ_REMOVE_HEAD(&bp
->free_filter_list
, next
);
191 void bnxt_free_filter(struct bnxt
*bp
, struct bnxt_filter_info
*filter
)
193 memset(filter
, 0, sizeof(*filter
));
194 filter
->mac_index
= INVALID_MAC_INDEX
;
195 filter
->fw_l2_filter_id
= UINT64_MAX
;
196 filter
->fw_ntuple_filter_id
= UINT64_MAX
;
197 filter
->fw_em_filter_id
= UINT64_MAX
;
198 STAILQ_INSERT_TAIL(&bp
->free_filter_list
, filter
, next
);