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