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 /* Find the 1st unused filter from the free_filter_list pool*/
30 filter
= STAILQ_FIRST(&bp
->free_filter_list
);
32 PMD_DRV_LOG(ERR
, "No more free filter resources\n");
35 STAILQ_REMOVE_HEAD(&bp
->free_filter_list
, next
);
37 /* Default to L2 MAC Addr filter */
38 filter
->flags
= HWRM_CFA_L2_FILTER_ALLOC_INPUT_FLAGS_PATH_RX
;
39 filter
->enables
= HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_ADDR
|
40 HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_ADDR_MASK
;
41 memcpy(filter
->l2_addr
, bp
->eth_dev
->data
->mac_addrs
->addr_bytes
,
43 memset(filter
->l2_addr_mask
, 0xff, ETHER_ADDR_LEN
);
47 struct bnxt_filter_info
*bnxt_alloc_vf_filter(struct bnxt
*bp
, uint16_t vf
)
49 struct bnxt_filter_info
*filter
;
51 filter
= rte_zmalloc("bnxt_vf_filter_info", sizeof(*filter
), 0);
53 PMD_DRV_LOG(ERR
, "Failed to alloc memory for VF %hu filters\n",
58 filter
->fw_l2_filter_id
= UINT64_MAX
;
59 STAILQ_INSERT_TAIL(&bp
->pf
.vf_info
[vf
].filter
, filter
, next
);
63 void bnxt_init_filters(struct bnxt
*bp
)
65 struct bnxt_filter_info
*filter
;
68 max_filters
= bp
->max_l2_ctx
;
69 STAILQ_INIT(&bp
->free_filter_list
);
70 for (i
= 0; i
< max_filters
; i
++) {
71 filter
= &bp
->filter_info
[i
];
72 filter
->fw_l2_filter_id
= UINT64_MAX
;
73 filter
->fw_em_filter_id
= UINT64_MAX
;
74 filter
->fw_ntuple_filter_id
= UINT64_MAX
;
75 STAILQ_INSERT_TAIL(&bp
->free_filter_list
, filter
, next
);
79 void bnxt_free_all_filters(struct bnxt
*bp
)
81 struct bnxt_vnic_info
*vnic
;
82 struct bnxt_filter_info
*filter
, *temp_filter
;
85 for (i
= 0; i
< MAX_FF_POOLS
; i
++) {
86 STAILQ_FOREACH(vnic
, &bp
->ff_pool
[i
], next
) {
87 filter
= STAILQ_FIRST(&vnic
->filter
);
89 temp_filter
= STAILQ_NEXT(filter
, next
);
90 STAILQ_REMOVE(&vnic
->filter
, filter
,
91 bnxt_filter_info
, next
);
92 STAILQ_INSERT_TAIL(&bp
->free_filter_list
,
96 STAILQ_INIT(&vnic
->filter
);
100 for (i
= 0; i
< bp
->pf
.max_vfs
; i
++) {
101 STAILQ_FOREACH(filter
, &bp
->pf
.vf_info
[i
].filter
, next
) {
102 bnxt_hwrm_clear_l2_filter(bp
, filter
);
107 void bnxt_free_filter_mem(struct bnxt
*bp
)
109 struct bnxt_filter_info
*filter
;
110 uint16_t max_filters
, i
;
113 if (bp
->filter_info
== NULL
)
116 /* Ensure that all filters are freed */
117 max_filters
= bp
->max_l2_ctx
;
118 for (i
= 0; i
< max_filters
; i
++) {
119 filter
= &bp
->filter_info
[i
];
120 if (filter
->fw_l2_filter_id
!= ((uint64_t)-1) &&
121 filter
->filter_type
== HWRM_CFA_L2_FILTER
) {
122 PMD_DRV_LOG(ERR
, "L2 filter is not free\n");
123 /* Call HWRM to try to free filter again */
124 rc
= bnxt_hwrm_clear_l2_filter(bp
, filter
);
127 "Cannot free L2 filter: %d\n",
130 filter
->fw_l2_filter_id
= UINT64_MAX
;
132 if (filter
->fw_ntuple_filter_id
!= ((uint64_t)-1) &&
133 filter
->filter_type
== HWRM_CFA_NTUPLE_FILTER
) {
134 PMD_DRV_LOG(ERR
, "NTUPLE filter is not free\n");
135 /* Call HWRM to try to free filter again */
136 rc
= bnxt_hwrm_clear_ntuple_filter(bp
, filter
);
139 "Cannot free NTUPLE filter: %d\n",
142 filter
->fw_ntuple_filter_id
= UINT64_MAX
;
144 STAILQ_INIT(&bp
->free_filter_list
);
146 rte_free(bp
->filter_info
);
147 bp
->filter_info
= NULL
;
149 for (i
= 0; i
< bp
->pf
.max_vfs
; i
++) {
150 STAILQ_FOREACH(filter
, &bp
->pf
.vf_info
[i
].filter
, next
) {
152 STAILQ_REMOVE(&bp
->pf
.vf_info
[i
].filter
, filter
,
153 bnxt_filter_info
, next
);
158 int bnxt_alloc_filter_mem(struct bnxt
*bp
)
160 struct bnxt_filter_info
*filter_mem
;
161 uint16_t max_filters
;
163 max_filters
= bp
->max_l2_ctx
;
164 /* Allocate memory for VNIC pool and filter pool */
165 filter_mem
= rte_zmalloc("bnxt_filter_info",
166 max_filters
* sizeof(struct bnxt_filter_info
),
168 if (filter_mem
== NULL
) {
169 PMD_DRV_LOG(ERR
, "Failed to alloc memory for %d filters",
173 bp
->filter_info
= filter_mem
;
177 struct bnxt_filter_info
*bnxt_get_unused_filter(struct bnxt
*bp
)
179 struct bnxt_filter_info
*filter
;
181 /* Find the 1st unused filter from the free_filter_list pool*/
182 filter
= STAILQ_FIRST(&bp
->free_filter_list
);
184 PMD_DRV_LOG(ERR
, "No more free filter resources\n");
187 STAILQ_REMOVE_HEAD(&bp
->free_filter_list
, next
);
192 void bnxt_free_filter(struct bnxt
*bp
, struct bnxt_filter_info
*filter
)
194 STAILQ_INSERT_TAIL(&bp
->free_filter_list
, filter
, next
);