xref: /dpdk/drivers/net/bnxt/tf_core/tf_tcam_mgr_msg.c (revision 5873bd31dc8393b17fb7b45bd1f714c227dad3f5)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2021-2024 Broadcom
3  * All rights reserved.
4  */
5 
6 #include <errno.h>
7 
8 #include "tfp.h"
9 #include "tf_tcam.h"
10 #include "cfa_tcam_mgr.h"
11 #include "cfa_tcam_mgr_device.h"
12 #include "tf_tcam_mgr_msg.h"
13 
14 /*
15  * Table to convert TCAM type to logical TCAM type for applications.
16  * Index is tf_tcam_tbl_type.
17  */
18 static enum cfa_tcam_mgr_tbl_type tcam_types[TF_TCAM_TBL_TYPE_MAX] = {
19 	[TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_HIGH] =
20 		CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_HIGH,
21 	[TF_TCAM_TBL_TYPE_L2_CTXT_TCAM_LOW]  =
22 		CFA_TCAM_MGR_TBL_TYPE_L2_CTXT_TCAM_LOW,
23 	[TF_TCAM_TBL_TYPE_PROF_TCAM]	     =
24 		CFA_TCAM_MGR_TBL_TYPE_PROF_TCAM,
25 	[TF_TCAM_TBL_TYPE_WC_TCAM]	     =
26 		CFA_TCAM_MGR_TBL_TYPE_WC_TCAM,
27 	[TF_TCAM_TBL_TYPE_SP_TCAM]	     =
28 		CFA_TCAM_MGR_TBL_TYPE_SP_TCAM,
29 	[TF_TCAM_TBL_TYPE_CT_RULE_TCAM]	     =
30 		CFA_TCAM_MGR_TBL_TYPE_CT_RULE_TCAM,
31 	[TF_TCAM_TBL_TYPE_VEB_TCAM]	     =
32 		CFA_TCAM_MGR_TBL_TYPE_VEB_TCAM,
33 	[TF_TCAM_TBL_TYPE_WC_TCAM_HIGH]      =
34 		CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_HIGH,
35 	[TF_TCAM_TBL_TYPE_WC_TCAM_LOW]       =
36 		CFA_TCAM_MGR_TBL_TYPE_WC_TCAM_LOW,
37 };
38 
39 static uint16_t hcapi_type[TF_TCAM_TBL_TYPE_MAX];
40 
41 int
42 tf_tcam_mgr_bind_msg(struct tf *tfp,
43 		     struct tf_dev_info *dev __rte_unused,
44 		     struct tf_tcam_cfg_parms *parms,
45 		     struct tf_resource_info resv_res[][TF_TCAM_TBL_TYPE_MAX]
46 		     __rte_unused
47 	)
48 {
49 	struct tf_rm_resc_entry
50 		mgr_resv_res[TF_DIR_MAX][CFA_TCAM_MGR_TBL_TYPE_MAX];
51 	struct cfa_tcam_mgr_cfg_parms mgr_parms;
52 	int dir, rc;
53 	int type;
54 
55 	if (parms->num_elements != TF_TCAM_TBL_TYPE_MAX) {
56 		TFP_DRV_LOG(ERR,
57 			    "Invalid number of elements in bind request.\n");
58 		TFP_DRV_LOG(ERR,
59 			    "Expected %d, received %d.\n",
60 			    TF_TCAM_TBL_TYPE_MAX,
61 			    parms->num_elements);
62 		return -EINVAL;
63 	}
64 
65 	for (type = 0; type < TF_TCAM_TBL_TYPE_MAX; type++)
66 		hcapi_type[type] = parms->cfg[type].hcapi_type;
67 
68 	memset(&mgr_parms, 0, sizeof(mgr_parms));
69 
70 	mgr_parms.num_elements = CFA_TCAM_MGR_TBL_TYPE_MAX;
71 
72 	/* Convert the data to logical tables */
73 	for (dir = 0; dir < TF_DIR_MAX; dir++) {
74 		for (type = 0; type < TF_TCAM_TBL_TYPE_MAX; type++) {
75 			mgr_parms.tcam_cnt[dir][tcam_types[type]] =
76 				parms->resources->tcam_cnt[dir].cnt[type];
77 			mgr_resv_res[dir][tcam_types[type]].start =
78 				resv_res[dir][type].start;
79 			mgr_resv_res[dir][tcam_types[type]].stride =
80 				resv_res[dir][type].stride;
81 		}
82 	}
83 	mgr_parms.resv_res = mgr_resv_res;
84 
85 	rc = cfa_tcam_mgr_bind(tfp, &mgr_parms);
86 
87 	return rc;
88 }
89 
90 int
91 tf_tcam_mgr_unbind_msg(struct tf *tfp,
92 		       struct tf_dev_info *dev __rte_unused)
93 {
94 	return cfa_tcam_mgr_unbind(tfp);
95 }
96 
97 int
98 tf_tcam_mgr_alloc_msg(struct tf *tfp,
99 		      struct tf_dev_info *dev __rte_unused,
100 		      struct tf_tcam_alloc_parms *parms)
101 {
102 	struct cfa_tcam_mgr_alloc_parms mgr_parms;
103 	int rc;
104 
105 	if (parms->type >= TF_TCAM_TBL_TYPE_MAX) {
106 		TFP_DRV_LOG(ERR,
107 			    "No such TCAM table %d.\n",
108 			    parms->type);
109 		return -EINVAL;
110 	}
111 
112 	mgr_parms.dir	     = parms->dir;
113 	mgr_parms.type	     = tcam_types[parms->type];
114 	mgr_parms.hcapi_type = hcapi_type[parms->type];
115 	mgr_parms.key_size   = parms->key_size;
116 	if (parms->priority > TF_TCAM_PRIORITY_MAX)
117 		mgr_parms.priority = 0;
118 	else
119 		mgr_parms.priority = TF_TCAM_PRIORITY_MAX - parms->priority - 1;
120 
121 	rc = cfa_tcam_mgr_alloc(tfp, &mgr_parms);
122 	if (rc)
123 		return rc;
124 
125 	parms->idx = mgr_parms.id;
126 	return 0;
127 }
128 
129 int
130 tf_tcam_mgr_free_msg(struct tf *tfp,
131 		     struct tf_dev_info *dev __rte_unused,
132 		     struct tf_tcam_free_parms *parms)
133 {
134 	struct cfa_tcam_mgr_free_parms mgr_parms;
135 
136 	if (parms->type >= TF_TCAM_TBL_TYPE_MAX) {
137 		TFP_DRV_LOG(ERR,
138 			    "No such TCAM table %d.\n",
139 			    parms->type);
140 		return -EINVAL;
141 	}
142 
143 	mgr_parms.dir	     = parms->dir;
144 	mgr_parms.type	     = tcam_types[parms->type];
145 	mgr_parms.hcapi_type = hcapi_type[parms->type];
146 	mgr_parms.id	     = parms->idx;
147 
148 	return cfa_tcam_mgr_free(tfp, &mgr_parms);
149 }
150 
151 int
152 tf_tcam_mgr_set_msg(struct tf *tfp,
153 		    struct tf_dev_info *dev __rte_unused,
154 		    struct tf_tcam_set_parms *parms)
155 {
156 	struct cfa_tcam_mgr_set_parms mgr_parms;
157 
158 	if (parms->type >= TF_TCAM_TBL_TYPE_MAX) {
159 		TFP_DRV_LOG(ERR,
160 			    "No such TCAM table %d.\n",
161 			    parms->type);
162 		return -EINVAL;
163 	}
164 
165 	mgr_parms.dir	      = parms->dir;
166 	mgr_parms.type	      = tcam_types[parms->type];
167 	mgr_parms.hcapi_type  = hcapi_type[parms->type];
168 	mgr_parms.id	      = parms->idx;
169 	mgr_parms.key	      = parms->key;
170 	mgr_parms.mask	      = parms->mask;
171 	mgr_parms.key_size    = parms->key_size;
172 	mgr_parms.result      = parms->result;
173 	mgr_parms.result_size = parms->result_size;
174 
175 	return cfa_tcam_mgr_set(tfp, &mgr_parms);
176 }
177 
178 int
179 tf_tcam_mgr_get_msg(struct tf *tfp,
180 		    struct tf_dev_info *dev __rte_unused,
181 		    struct tf_tcam_get_parms *parms)
182 {
183 	struct cfa_tcam_mgr_get_parms mgr_parms;
184 	int rc;
185 
186 	if (parms->type >= TF_TCAM_TBL_TYPE_MAX) {
187 		TFP_DRV_LOG(ERR,
188 			    "No such TCAM table %d.\n",
189 			    parms->type);
190 		return -EINVAL;
191 	}
192 
193 	mgr_parms.dir	      = parms->dir;
194 	mgr_parms.type	      = tcam_types[parms->type];
195 	mgr_parms.hcapi_type  = hcapi_type[parms->type];
196 	mgr_parms.id	      = parms->idx;
197 	mgr_parms.key	      = parms->key;
198 	mgr_parms.mask	      = parms->mask;
199 	mgr_parms.key_size    = parms->key_size;
200 	mgr_parms.result      = parms->result;
201 	mgr_parms.result_size = parms->result_size;
202 
203 	rc = cfa_tcam_mgr_get(tfp, &mgr_parms);
204 	if (rc)
205 		return rc;
206 
207 	parms->key_size	   = mgr_parms.key_size;
208 	parms->result_size = mgr_parms.result_size;
209 
210 	return rc;
211 }
212 
213 int
214 tf_tcam_mgr_shared_clear_msg(struct tf *tfp,
215 		     struct tf_clear_tcam_shared_entries_parms *parms)
216 {
217 	struct cfa_tcam_mgr_shared_clear_parms mgr_parms;
218 
219 	mgr_parms.dir = parms->dir;
220 	mgr_parms.type = tcam_types[parms->tcam_tbl_type];
221 
222 	return cfa_tcam_mgr_shared_clear(tfp, &mgr_parms);
223 }
224 
225 int
226 tf_tcam_mgr_shared_move_msg(struct tf *tfp,
227 		     struct tf_move_tcam_shared_entries_parms *parms)
228 {
229 	struct cfa_tcam_mgr_shared_move_parms mgr_parms;
230 
231 	mgr_parms.dir = parms->dir;
232 	mgr_parms.type = tcam_types[parms->tcam_tbl_type];
233 
234 	return cfa_tcam_mgr_shared_move(tfp, &mgr_parms);
235 }
236