1 /* 2 * SPDX-License-Identifier: BSD-3-Clause 3 * Copyright(c) 2023 Napatech A/S 4 */ 5 6 #include <stdint.h> 7 8 #include "flow_nthw_info.h" 9 #include "ntnic_mod_reg.h" 10 #include "nthw_fpga_model.h" 11 #include "hw_mod_backend.h" 12 13 /* 14 * Binary Flow API backend implementation into ntservice driver 15 * 16 * General note on this backend implementation: 17 * Maybe use shadow class to combine multiple writes. However, this backend is only for dev/testing 18 */ 19 20 static struct backend_dev_s { 21 uint8_t adapter_no; 22 enum debug_mode_e dmode; 23 struct info_nthw *p_info_nthw; 24 } be_devs[MAX_PHYS_ADAPTERS]; 25 26 const struct flow_api_backend_ops *bin_flow_backend_init(nthw_fpga_t *p_fpga, void **be_dev); 27 static void bin_flow_backend_done(void *be_dev); 28 29 static int set_debug_mode(void *be_dev, enum debug_mode_e mode) 30 { 31 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 32 be->dmode = mode; 33 return 0; 34 } 35 36 /* 37 * INFO 38 */ 39 40 static int get_nb_phy_ports(void *be_dev) 41 { 42 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 43 return info_nthw_get_nb_phy_ports(be->p_info_nthw); 44 } 45 46 static int get_nb_rx_ports(void *be_dev) 47 { 48 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 49 return info_nthw_get_nb_rx_ports(be->p_info_nthw); 50 } 51 52 static int get_ltx_avail(void *be_dev) 53 { 54 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 55 return info_nthw_get_ltx_avail(be->p_info_nthw); 56 } 57 58 static int get_nb_cat_funcs(void *be_dev) 59 { 60 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 61 return info_nthw_get_nb_cat_funcs(be->p_info_nthw); 62 } 63 64 static int get_nb_categories(void *be_dev) 65 { 66 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 67 return info_nthw_get_nb_categories(be->p_info_nthw); 68 } 69 70 static int get_nb_cat_km_if_cnt(void *be_dev) 71 { 72 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 73 return info_nthw_get_nb_cat_km_if_cnt(be->p_info_nthw); 74 } 75 76 static int get_nb_cat_km_if_m0(void *be_dev) 77 { 78 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 79 return info_nthw_get_nb_cat_km_if_m0(be->p_info_nthw); 80 } 81 82 static int get_nb_cat_km_if_m1(void *be_dev) 83 { 84 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 85 return info_nthw_get_nb_cat_km_if_m1(be->p_info_nthw); 86 } 87 88 static int get_nb_queues(void *be_dev) 89 { 90 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 91 return info_nthw_get_nb_queues(be->p_info_nthw); 92 } 93 94 static int get_nb_km_flow_types(void *be_dev) 95 { 96 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 97 return info_nthw_get_nb_km_flow_types(be->p_info_nthw); 98 } 99 100 static int get_nb_pm_ext(void *be_dev) 101 { 102 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 103 return info_nthw_get_nb_pm_ext(be->p_info_nthw); 104 } 105 106 static int get_nb_len(void *be_dev) 107 { 108 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 109 return info_nthw_get_nb_len(be->p_info_nthw); 110 } 111 112 static int get_kcc_size(void *be_dev) 113 { 114 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 115 return info_nthw_get_kcc_size(be->p_info_nthw); 116 } 117 118 static int get_kcc_banks(void *be_dev) 119 { 120 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 121 return info_nthw_get_kcc_banks(be->p_info_nthw); 122 } 123 124 static int get_nb_km_categories(void *be_dev) 125 { 126 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 127 return info_nthw_get_nb_km_categories(be->p_info_nthw); 128 } 129 130 static int get_nb_km_cam_banks(void *be_dev) 131 { 132 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 133 return info_nthw_get_nb_km_cam_banks(be->p_info_nthw); 134 } 135 136 static int get_nb_km_cam_record_words(void *be_dev) 137 { 138 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 139 return info_nthw_get_nb_km_cam_record_words(be->p_info_nthw); 140 } 141 142 static int get_nb_km_cam_records(void *be_dev) 143 { 144 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 145 return info_nthw_get_nb_km_cam_records(be->p_info_nthw); 146 } 147 148 static int get_nb_km_tcam_banks(void *be_dev) 149 { 150 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 151 return info_nthw_get_nb_km_tcam_banks(be->p_info_nthw); 152 } 153 154 static int get_nb_km_tcam_bank_width(void *be_dev) 155 { 156 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 157 return info_nthw_get_nb_km_tcam_bank_width(be->p_info_nthw); 158 } 159 160 static int get_nb_flm_categories(void *be_dev) 161 { 162 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 163 return info_nthw_get_nb_flm_categories(be->p_info_nthw); 164 } 165 166 static int get_nb_flm_size_mb(void *be_dev) 167 { 168 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 169 return info_nthw_get_nb_flm_size_mb(be->p_info_nthw); 170 } 171 172 static int get_nb_flm_entry_size(void *be_dev) 173 { 174 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 175 return info_nthw_get_nb_flm_entry_size(be->p_info_nthw); 176 } 177 178 static int get_nb_flm_variant(void *be_dev) 179 { 180 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 181 return info_nthw_get_nb_flm_variant(be->p_info_nthw); 182 } 183 184 static int get_nb_flm_prios(void *be_dev) 185 { 186 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 187 return info_nthw_get_nb_flm_prios(be->p_info_nthw); 188 } 189 190 static int get_nb_flm_pst_profiles(void *be_dev) 191 { 192 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 193 return info_nthw_get_nb_flm_pst_profiles(be->p_info_nthw); 194 } 195 196 static int get_nb_flm_scrub_profiles(void *be_dev) 197 { 198 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 199 return info_nthw_get_nb_flm_scrub_profiles(be->p_info_nthw); 200 } 201 202 static int get_nb_flm_load_aps_max(void *be_dev) 203 { 204 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 205 return info_nthw_get_nb_flm_load_aps_max(be->p_info_nthw); 206 } 207 208 static int get_nb_qsl_categories(void *be_dev) 209 { 210 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 211 return info_nthw_get_nb_qsl_categories(be->p_info_nthw); 212 } 213 214 static int get_nb_qsl_qst_entries(void *be_dev) 215 { 216 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 217 return info_nthw_get_nb_qsl_qst_entries(be->p_info_nthw); 218 } 219 220 static int get_nb_pdb_categories(void *be_dev) 221 { 222 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 223 return info_nthw_get_nb_pdb_categories(be->p_info_nthw); 224 } 225 226 static int get_nb_roa_categories(void *be_dev) 227 { 228 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 229 return info_nthw_get_nb_roa_categories(be->p_info_nthw); 230 } 231 232 static int get_nb_tpe_categories(void *be_dev) 233 { 234 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 235 return info_nthw_get_nb_tpe_categories(be->p_info_nthw); 236 } 237 238 static int get_nb_tx_cpy_writers(void *be_dev) 239 { 240 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 241 return info_nthw_get_nb_tx_cpy_writers(be->p_info_nthw); 242 } 243 244 static int get_nb_tx_cpy_mask_mem(void *be_dev) 245 { 246 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 247 return info_nthw_get_nb_tx_cpy_mask_mem(be->p_info_nthw); 248 } 249 250 static int get_nb_tx_rpl_depth(void *be_dev) 251 { 252 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 253 return info_nthw_get_nb_tx_rpl_depth(be->p_info_nthw); 254 } 255 256 static int get_nb_tx_rpl_ext_categories(void *be_dev) 257 { 258 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 259 return info_nthw_get_nb_tx_rpl_ext_categories(be->p_info_nthw); 260 } 261 262 static int get_nb_tpe_ifr_categories(void *be_dev) 263 { 264 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 265 return info_nthw_get_nb_tpe_ifr_categories(be->p_info_nthw); 266 } 267 268 static int get_nb_rpp_per_ps(void *be_dev) 269 { 270 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 271 return info_nthw_get_nb_rpp_per_ps(be->p_info_nthw); 272 } 273 274 static int get_nb_hsh_categories(void *be_dev) 275 { 276 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 277 return info_nthw_get_nb_hsh_categories(be->p_info_nthw); 278 } 279 280 static int get_nb_hsh_toeplitz(void *be_dev) 281 { 282 struct backend_dev_s *be = (struct backend_dev_s *)be_dev; 283 return info_nthw_get_nb_hsh_toeplitz(be->p_info_nthw); 284 } 285 286 /* 287 * DBS 288 */ 289 290 static int alloc_rx_queue(void *be_dev, int queue_id) 291 { 292 (void)be_dev; 293 (void)queue_id; 294 NT_LOG(ERR, FILTER, "ERROR alloc Rx queue"); 295 return -1; 296 } 297 298 static int free_rx_queue(void *be_dev, int hw_queue) 299 { 300 (void)be_dev; 301 (void)hw_queue; 302 NT_LOG(ERR, FILTER, "ERROR free Rx queue"); 303 return 0; 304 } 305 306 const struct flow_api_backend_ops flow_be_iface = { 307 1, 308 309 set_debug_mode, 310 get_nb_phy_ports, 311 get_nb_rx_ports, 312 get_ltx_avail, 313 get_nb_cat_funcs, 314 get_nb_categories, 315 get_nb_cat_km_if_cnt, 316 get_nb_cat_km_if_m0, 317 get_nb_cat_km_if_m1, 318 get_nb_queues, 319 get_nb_km_flow_types, 320 get_nb_pm_ext, 321 get_nb_len, 322 get_kcc_size, 323 get_kcc_banks, 324 get_nb_km_categories, 325 get_nb_km_cam_banks, 326 get_nb_km_cam_record_words, 327 get_nb_km_cam_records, 328 get_nb_km_tcam_banks, 329 get_nb_km_tcam_bank_width, 330 get_nb_flm_categories, 331 get_nb_flm_size_mb, 332 get_nb_flm_entry_size, 333 get_nb_flm_variant, 334 get_nb_flm_prios, 335 get_nb_flm_pst_profiles, 336 get_nb_flm_scrub_profiles, 337 get_nb_flm_load_aps_max, 338 get_nb_qsl_categories, 339 get_nb_qsl_qst_entries, 340 get_nb_pdb_categories, 341 get_nb_roa_categories, 342 get_nb_tpe_categories, 343 get_nb_tx_cpy_writers, 344 get_nb_tx_cpy_mask_mem, 345 get_nb_tx_rpl_depth, 346 get_nb_tx_rpl_ext_categories, 347 get_nb_tpe_ifr_categories, 348 get_nb_rpp_per_ps, 349 get_nb_hsh_categories, 350 get_nb_hsh_toeplitz, 351 352 alloc_rx_queue, 353 free_rx_queue, 354 }; 355 356 const struct flow_api_backend_ops *bin_flow_backend_init(nthw_fpga_t *p_fpga, void **dev) 357 { 358 uint8_t physical_adapter_no = (uint8_t)p_fpga->p_fpga_info->adapter_no; 359 360 struct info_nthw *pinfonthw = info_nthw_new(); 361 info_nthw_init(pinfonthw, p_fpga, physical_adapter_no); 362 be_devs[physical_adapter_no].p_info_nthw = pinfonthw; 363 364 be_devs[physical_adapter_no].adapter_no = physical_adapter_no; 365 *dev = (void *)&be_devs[physical_adapter_no]; 366 367 return &flow_be_iface; 368 } 369 370 static void bin_flow_backend_done(void *dev) 371 { 372 struct backend_dev_s *be_dev = (struct backend_dev_s *)dev; 373 info_nthw_delete(be_dev->p_info_nthw); 374 } 375 376 static const struct flow_backend_ops ops = { 377 .bin_flow_backend_init = bin_flow_backend_init, 378 .bin_flow_backend_done = bin_flow_backend_done, 379 }; 380 381 void flow_backend_init(void) 382 { 383 register_flow_backend_ops(&ops); 384 } 385