1 /* 2 * SPDX-License-Identifier: BSD-3-Clause 3 * Copyright(c) 2023 Napatech A/S 4 */ 5 6 #ifndef _HW_MOD_BACKEND_H_ 7 #define _HW_MOD_BACKEND_H_ 8 9 #include <stdbool.h> 10 11 #include "ntlog.h" 12 13 #include "hw_mod_cat_v18.h" 14 #include "hw_mod_cat_v21.h" 15 #include "hw_mod_flm_v25.h" 16 #include "hw_mod_km_v7.h" 17 #include "hw_mod_qsl_v7.h" 18 #include "hw_mod_pdb_v9.h" 19 #include "hw_mod_slc_lr_v2.h" 20 #include "hw_mod_hsh_v5.h" 21 #include "hw_mod_tpe_v3.h" 22 23 #define MAX_PHYS_ADAPTERS 8 24 25 #define COMMON_FUNC_INFO_S \ 26 int ver; \ 27 void *base; \ 28 unsigned int alloced_size; \ 29 int debug 30 31 struct cat_func_s { 32 COMMON_FUNC_INFO_S; 33 uint32_t nb_cat_funcs; 34 uint32_t nb_flow_types; 35 uint32_t nb_pm_ext; 36 uint32_t nb_len; 37 uint32_t kcc_size; 38 uint32_t cts_num; 39 uint32_t kcc_banks; 40 uint32_t kcc_id_bit_size; 41 uint32_t kcc_records; 42 uint32_t km_if_count; 43 int32_t km_if_m0; 44 int32_t km_if_m1; 45 46 union { 47 struct hw_mod_cat_v18_s v18; 48 struct hw_mod_cat_v21_s v21; 49 }; 50 }; 51 52 struct km_func_s { 53 COMMON_FUNC_INFO_S; 54 uint32_t nb_categories; 55 uint32_t nb_cam_banks; 56 uint32_t nb_cam_record_words; 57 uint32_t nb_cam_records; 58 uint32_t nb_tcam_banks; 59 uint32_t nb_tcam_bank_width; 60 /* not read from backend, but rather set using version */ 61 uint32_t nb_km_rcp_mask_a_word_size; 62 /* --- || --- */ 63 uint32_t nb_km_rcp_mask_b_word_size; 64 union { 65 struct hw_mod_km_v7_s v7; 66 }; 67 }; 68 69 struct flm_func_s { 70 COMMON_FUNC_INFO_S; 71 uint32_t nb_categories; 72 uint32_t nb_size_mb; 73 uint32_t nb_entry_size; 74 uint32_t nb_variant; 75 uint32_t nb_prios; 76 uint32_t nb_pst_profiles; 77 uint32_t nb_scrub_profiles; 78 uint32_t nb_rpp_clock_in_ps; 79 uint32_t nb_load_aps_max; 80 union { 81 struct hw_mod_flm_v25_s v25; 82 }; 83 }; 84 85 struct hsh_func_s { 86 COMMON_FUNC_INFO_S; 87 uint32_t nb_rcp;/* number of HSH recipes supported by FPGA */ 88 /* indication if Toeplitz is supported by FPGA, i.e. 0 - unsupported, 1 - supported */ 89 uint32_t toeplitz; 90 union { 91 struct hw_mod_hsh_v5_s v5; 92 }; 93 }; 94 95 struct qsl_func_s { 96 COMMON_FUNC_INFO_S; 97 uint32_t nb_rcp_categories; 98 uint32_t nb_qst_entries; 99 union { 100 struct hw_mod_qsl_v7_s v7; 101 }; 102 }; 103 104 struct slc_lr_func_s { 105 COMMON_FUNC_INFO_S; 106 union { 107 struct hw_mod_slc_lr_v2_s v2; 108 }; 109 }; 110 111 struct pdb_func_s { 112 COMMON_FUNC_INFO_S; 113 uint32_t nb_pdb_rcp_categories; 114 115 union { 116 struct hw_mod_pdb_v9_s v9; 117 }; 118 }; 119 120 struct tpe_func_s { 121 COMMON_FUNC_INFO_S; 122 uint32_t nb_rcp_categories; 123 uint32_t nb_ifr_categories; 124 uint32_t nb_cpy_writers; 125 uint32_t nb_rpl_depth; 126 uint32_t nb_rpl_ext_categories; 127 union { 128 struct hw_mod_tpe_v3_s v3; 129 }; 130 }; 131 132 enum debug_mode_e { 133 FLOW_BACKEND_DEBUG_MODE_NONE = 0x0000, 134 FLOW_BACKEND_DEBUG_MODE_WRITE = 0x0001 135 }; 136 137 struct flow_api_backend_ops { 138 int version; 139 int (*set_debug_mode)(void *dev, enum debug_mode_e mode); 140 int (*get_nb_phy_port)(void *dev); 141 int (*get_nb_rx_port)(void *dev); 142 int (*get_ltx_avail)(void *dev); 143 int (*get_nb_cat_funcs)(void *dev); 144 int (*get_nb_categories)(void *dev); 145 int (*get_nb_cat_km_if_cnt)(void *dev); 146 int (*get_nb_cat_km_if_m0)(void *dev); 147 int (*get_nb_cat_km_if_m1)(void *dev); 148 149 int (*get_nb_queues)(void *dev); 150 int (*get_nb_km_flow_types)(void *dev); 151 int (*get_nb_pm_ext)(void *dev); 152 int (*get_nb_len)(void *dev); 153 int (*get_kcc_size)(void *dev); 154 int (*get_kcc_banks)(void *dev); 155 int (*get_nb_km_categories)(void *dev); 156 int (*get_nb_km_cam_banks)(void *dev); 157 int (*get_nb_km_cam_record_words)(void *dev); 158 int (*get_nb_km_cam_records)(void *dev); 159 int (*get_nb_km_tcam_banks)(void *dev); 160 int (*get_nb_km_tcam_bank_width)(void *dev); 161 int (*get_nb_flm_categories)(void *dev); 162 int (*get_nb_flm_size_mb)(void *dev); 163 int (*get_nb_flm_entry_size)(void *dev); 164 int (*get_nb_flm_variant)(void *dev); 165 int (*get_nb_flm_prios)(void *dev); 166 int (*get_nb_flm_pst_profiles)(void *dev); 167 int (*get_nb_flm_scrub_profiles)(void *dev); 168 int (*get_nb_flm_load_aps_max)(void *dev); 169 int (*get_nb_qsl_categories)(void *dev); 170 int (*get_nb_qsl_qst_entries)(void *dev); 171 int (*get_nb_pdb_categories)(void *dev); 172 int (*get_nb_roa_categories)(void *dev); 173 int (*get_nb_tpe_categories)(void *dev); 174 int (*get_nb_tx_cpy_writers)(void *dev); 175 int (*get_nb_tx_cpy_mask_mem)(void *dev); 176 int (*get_nb_tx_rpl_depth)(void *dev); 177 int (*get_nb_tx_rpl_ext_categories)(void *dev); 178 int (*get_nb_tpe_ifr_categories)(void *dev); 179 int (*get_nb_rpp_per_ps)(void *dev); 180 int (*get_nb_hsh_categories)(void *dev); 181 int (*get_nb_hsh_toeplitz)(void *dev); 182 183 int (*alloc_rx_queue)(void *dev, int queue_id); 184 int (*free_rx_queue)(void *dev, int hw_queue); 185 186 /* CAT */ 187 bool (*get_cat_present)(void *dev); 188 uint32_t (*get_cat_version)(void *dev); 189 int (*cat_cfn_flush)(void *dev, const struct cat_func_s *cat, int cat_func, int cnt); 190 int (*cat_kce_flush)(void *dev, const struct cat_func_s *cat, int km_if_idx, int index, 191 int cnt); 192 int (*cat_kcs_flush)(void *dev, const struct cat_func_s *cat, int km_if_idx, int cat_func, 193 int cnt); 194 int (*cat_fte_flush)(void *dev, const struct cat_func_s *cat, int km_if_idx, int index, 195 int cnt); 196 int (*cat_cte_flush)(void *dev, const struct cat_func_s *cat, int cat_func, int cnt); 197 int (*cat_cts_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt); 198 int (*cat_cot_flush)(void *dev, const struct cat_func_s *cat, int cat_func, int cnt); 199 int (*cat_cct_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt); 200 int (*cat_exo_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt); 201 int (*cat_rck_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt); 202 int (*cat_len_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt); 203 int (*cat_kcc_flush)(void *dev, const struct cat_func_s *cat, int index, int cnt); 204 205 /* KM */ 206 bool (*get_km_present)(void *dev); 207 uint32_t (*get_km_version)(void *dev); 208 int (*km_rcp_flush)(void *dev, const struct km_func_s *km, int category, int cnt); 209 int (*km_cam_flush)(void *dev, const struct km_func_s *km, int bank, int record, int cnt); 210 int (*km_tcam_flush)(void *dev, const struct km_func_s *km, int bank, int byte, int value, 211 int cnt); 212 int (*km_tci_flush)(void *dev, const struct km_func_s *km, int bank, int record, int cnt); 213 int (*km_tcq_flush)(void *dev, const struct km_func_s *km, int bank, int record, int cnt); 214 215 /* FLM */ 216 bool (*get_flm_present)(void *dev); 217 uint32_t (*get_flm_version)(void *dev); 218 int (*flm_control_flush)(void *dev, const struct flm_func_s *flm); 219 int (*flm_status_flush)(void *dev, const struct flm_func_s *flm); 220 int (*flm_status_update)(void *dev, const struct flm_func_s *flm); 221 int (*flm_scan_flush)(void *dev, const struct flm_func_s *flm); 222 int (*flm_load_bin_flush)(void *dev, const struct flm_func_s *flm); 223 int (*flm_prio_flush)(void *dev, const struct flm_func_s *flm); 224 int (*flm_pst_flush)(void *dev, const struct flm_func_s *flm, int index, int cnt); 225 int (*flm_rcp_flush)(void *dev, const struct flm_func_s *flm, int index, int cnt); 226 int (*flm_scrub_flush)(void *dev, const struct flm_func_s *flm, int index, int cnt); 227 int (*flm_buf_ctrl_update)(void *dev, const struct flm_func_s *flm); 228 int (*flm_stat_update)(void *dev, const struct flm_func_s *flm); 229 int (*flm_lrn_data_flush)(void *be_dev, const struct flm_func_s *flm, 230 const uint32_t *lrn_data, uint32_t records, 231 uint32_t *handled_records, uint32_t words_per_record, 232 uint32_t *inf_word_cnt, uint32_t *sta_word_cnt); 233 int (*flm_inf_sta_data_update)(void *be_dev, const struct flm_func_s *flm, 234 uint32_t *inf_data, uint32_t inf_size, 235 uint32_t *inf_word_cnt, uint32_t *sta_data, 236 uint32_t sta_size, uint32_t *sta_word_cnt); 237 238 /* HSH */ 239 bool (*get_hsh_present)(void *dev); 240 uint32_t (*get_hsh_version)(void *dev); 241 int (*hsh_rcp_flush)(void *dev, const struct hsh_func_s *hsh, int category, int cnt); 242 243 /* QSL */ 244 bool (*get_qsl_present)(void *dev); 245 uint32_t (*get_qsl_version)(void *dev); 246 int (*qsl_rcp_flush)(void *dev, const struct qsl_func_s *qsl, int category, int cnt); 247 int (*qsl_qst_flush)(void *dev, const struct qsl_func_s *qsl, int entry, int cnt); 248 int (*qsl_qen_flush)(void *dev, const struct qsl_func_s *qsl, int entry, int cnt); 249 int (*qsl_unmq_flush)(void *dev, const struct qsl_func_s *qsl, int entry, int cnt); 250 251 /* SLC LR */ 252 bool (*get_slc_lr_present)(void *dev); 253 uint32_t (*get_slc_lr_version)(void *dev); 254 int (*slc_lr_rcp_flush)(void *dev, const struct slc_lr_func_s *slc_lr, int category, 255 int cnt); 256 257 /* PDB */ 258 bool (*get_pdb_present)(void *dev); 259 uint32_t (*get_pdb_version)(void *dev); 260 int (*pdb_rcp_flush)(void *dev, const struct pdb_func_s *pdb, int category, int cnt); 261 int (*pdb_config_flush)(void *dev, const struct pdb_func_s *pdb); 262 263 /* TPE */ 264 bool (*get_tpe_present)(void *dev); 265 uint32_t (*get_tpe_version)(void *dev); 266 int (*tpe_rpp_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 267 int (*tpe_rpp_ifr_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 268 int (*tpe_ifr_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 269 int (*tpe_ins_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 270 int (*tpe_rpl_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 271 int (*tpe_rpl_ext_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 272 int (*tpe_rpl_rpl_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 273 int (*tpe_cpy_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 274 int (*tpe_hfu_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 275 int (*tpe_csu_rcp_flush)(void *dev, const struct tpe_func_s *tpe, int index, int cnt); 276 }; 277 278 struct flow_api_backend_s { 279 void *be_dev; 280 const struct flow_api_backend_ops *iface; 281 282 /* NIC attributes */ 283 unsigned int num_phy_ports; 284 unsigned int num_rx_ports; 285 286 /* flow filter resource capacities */ 287 unsigned int max_categories; 288 unsigned int max_queues; 289 }; 290 291 int flow_api_backend_init(struct flow_api_backend_s *dev, const struct flow_api_backend_ops *iface, 292 void *be_dev); 293 int flow_api_backend_done(struct flow_api_backend_s *dev); 294 295 #endif /* _HW_MOD_BACKEND_H_ */ 296