keygen_pmux.c (15568B)
1 /* 2 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 3 * 4 * Copyright 2007-2019 Broadcom Inc. All rights reserved. 5 */ 6 7 #include <bcm_int/esw/keygen_md.h> 8 #include <bcm_int/esw/field.h> 9 10 STATIC int 11 bcmi_keygen_pmux_alloc(int unit, 12 bcmi_keygen_cfg_t *keygen_cfg, 13 bcmi_keygen_md_t *keygen_md) 14 { 15 uint8 idx = 0; 16 uint8 part = 0; 17 uint8 num_parts = 0; 18 uint8 found_part = FALSE; 19 uint8 num_qual_cfg = 0; 20 uint8 qual_cfg_id = 0; 21 uint8 pmux_idx = 0; 22 bcm_field_qualify_t pmux_qual; 23 bcmi_keygen_ext_sel_t *pmux_sel = NULL; 24 bcmi_keygen_qual_flags_bmp_t *qual_flags = NULL; 25 bcmi_keygen_qual_cfg_t *qual_cfg = NULL; 26 bcmi_keygen_qual_cfg_info_t **qual_cfg_info = NULL; 27 28 BCMI_KEYGEN_FUNC_ENTER(unit); 29 30 BCMI_KEYGEN_NULL_CHECK(keygen_md, BCM_E_PARAM); 31 BCMI_KEYGEN_NULL_CHECK(keygen_cfg, BCM_E_PARAM); 32 33 num_parts = keygen_cfg->num_parts; 34 qual_cfg_info = keygen_cfg->qual_cfg_info_db->qual_cfg_info; 35 for (idx = 0; idx < keygen_cfg->qual_info_count; idx++) { 36 pmux_qual = keygen_cfg->qual_info_arr[idx].qual_id; 37 qual_cfg = qual_cfg_info[pmux_qual]->qual_cfg_arr; 38 qual_flags = &(qual_cfg->qual_flags); 39 if (!SHR_BITGET(qual_flags->w, BCMI_KEYGEN_QUAL_FLAGS_PMUX)) { 40 continue; 41 } 42 if (qual_cfg->pri_ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_DISABLE || 43 qual_cfg->pri_ctrl_sel == BCMI_KEYGEN_EXT_CTRL_SEL_IPBM_PRESENT) { 44 keygen_md->pmux_info[pmux_idx].pmux_qual = pmux_qual; 45 keygen_md->pmux_info[pmux_idx].pmux_part = 0; 46 keygen_md->pmux_info[pmux_idx].pmux_qual_cfg = qual_cfg; 47 pmux_idx++; 48 continue; 49 } 50 if (pmux_sel == NULL) { 51 BCMI_KEYGEN_ALLOC(pmux_sel, 52 sizeof(bcmi_keygen_ext_sel_t) * num_parts, 53 "Post mux qualifiers secondary selectors"); 54 for (part = 0; part < num_parts; part++) { 55 BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT 56 (bcmi_keygen_ext_codes_init(unit, 57 &(pmux_sel[part]))); 58 } 59 } 60 61 found_part = FALSE; 62 num_qual_cfg = qual_cfg_info[pmux_qual]->num_qual_cfg; 63 for (qual_cfg_id = 0; 64 qual_cfg_id < num_qual_cfg; 65 qual_cfg_id++) { 66 if (SHR_BITGET(qual_cfg[qual_cfg_id].qual_flags.w, 67 BCMI_KEYGEN_QUAL_FLAGS_NOT_IN_SINGLE) && 68 keygen_cfg->mode == BCMI_KEYGEN_MODE_SINGLE) { 69 continue; 70 } 71 switch (qual_cfg[qual_cfg_id].pri_ctrl_sel) { 72 case BCMI_KEYGEN_EXT_CTRL_SEL_DST_A: 73 for (part = 0; part < num_parts; part++) { 74 if (pmux_sel[part].dst_cont_a_sel == 75 BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) { 76 pmux_sel[part].dst_cont_a_sel = 77 qual_cfg[qual_cfg_id].pri_ctrl_sel_val; 78 found_part = TRUE; 79 break; 80 } else if (pmux_sel[part].dst_cont_a_sel == 81 qual_cfg[qual_cfg_id].pri_ctrl_sel_val) { 82 found_part = TRUE; 83 break; 84 } 85 } 86 break; 87 case BCMI_KEYGEN_EXT_CTRL_SEL_DST_B: 88 for (part = 0; part < num_parts; part++) { 89 if (pmux_sel[part].dst_cont_b_sel == 90 BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) { 91 pmux_sel[part].dst_cont_b_sel = 92 qual_cfg[qual_cfg_id].pri_ctrl_sel_val; 93 found_part = TRUE; 94 break; 95 } else if (pmux_sel[part].dst_cont_b_sel == 96 qual_cfg[qual_cfg_id].pri_ctrl_sel_val) { 97 found_part = TRUE; 98 break; 99 } 100 } 101 break; 102 case BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_0: 103 for (part = 0; part < num_parts; part++) { 104 if (pmux_sel[part].src_dest_cont_0_sel == 105 BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) { 106 pmux_sel[part].src_dest_cont_0_sel = 107 qual_cfg[qual_cfg_id].pri_ctrl_sel_val; 108 found_part = TRUE; 109 break; 110 } else if (pmux_sel[part].src_dest_cont_0_sel == 111 qual_cfg[qual_cfg_id].pri_ctrl_sel_val) { 112 found_part = TRUE; 113 break; 114 } 115 } 116 break; 117 case BCMI_KEYGEN_EXT_CTRL_SEL_SRC_DST_1: 118 for (part = 0; part < num_parts; part++) { 119 if (pmux_sel[part].src_dest_cont_1_sel == 120 BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) { 121 pmux_sel[part].src_dest_cont_1_sel = 122 qual_cfg[qual_cfg_id].pri_ctrl_sel_val; 123 found_part = TRUE; 124 break; 125 } else if (pmux_sel[part].src_dest_cont_1_sel == 126 qual_cfg[qual_cfg_id].pri_ctrl_sel_val) { 127 found_part = TRUE; 128 break; 129 } 130 } 131 break; 132 case BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_C: 133 for (part = 0; part < num_parts; part++) { 134 if (pmux_sel[part].class_id_cont_c_sel == 135 BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) { 136 pmux_sel[part].class_id_cont_c_sel = 137 qual_cfg[qual_cfg_id].pri_ctrl_sel_val; 138 found_part = TRUE; 139 break; 140 } else if (pmux_sel[part].class_id_cont_c_sel == 141 qual_cfg[qual_cfg_id].pri_ctrl_sel_val) { 142 found_part = TRUE; 143 break; 144 } 145 } 146 break; 147 case BCMI_KEYGEN_EXT_CTRL_SEL_CLASSID_D: 148 for (part = 0; part < num_parts; part++) { 149 if (pmux_sel[part].class_id_cont_d_sel == 150 BCMI_KEYGEN_EXT_SELCODE_DONT_CARE) { 151 pmux_sel[part].class_id_cont_d_sel = 152 qual_cfg[qual_cfg_id].pri_ctrl_sel_val; 153 found_part = TRUE; 154 break; 155 } else if (pmux_sel[part].class_id_cont_d_sel == 156 qual_cfg[qual_cfg_id].pri_ctrl_sel_val) { 157 found_part = TRUE; 158 break; 159 } 160 } 161 break; 162 default: 163 BCMI_KEYGEN_RETURN_VAL_EXIT(BCM_E_INTERNAL); 164 } 165 if (found_part == TRUE) { 166 break; 167 } 168 } 169 if (found_part == FALSE) { 170 BCMI_KEYGEN_RETURN_VAL_EXIT(BCM_E_RESOURCE); 171 } else { 172 keygen_md->pmux_info[pmux_idx].pmux_qual = pmux_qual; 173 keygen_md->pmux_info[pmux_idx].pmux_part = part; 174 keygen_md->pmux_info[pmux_idx].pmux_qual_cfg = 175 &(qual_cfg[qual_cfg_id]); 176 pmux_idx++; 177 } 178 } 179 exit: 180 BCMI_KEYGEN_FREE(pmux_sel); 181 BCMI_KEYGEN_FUNC_EXIT(); 182 } 183 184 int 185 bcmi_keygen_pmux_info_get(int unit, 186 bcm_field_qualify_t qual, 187 uint8 num_pmux_qual, 188 bcmi_keygen_pmux_info_t *pmux_info_arr, 189 bcmi_keygen_pmux_info_t **pmux_info) 190 { 191 uint8 idx = 0; 192 193 BCMI_KEYGEN_FUNC_ENTER(unit); 194 195 BCMI_KEYGEN_NULL_CHECK(pmux_info, BCM_E_PARAM); 196 BCMI_KEYGEN_NULL_CHECK(pmux_info_arr, BCM_E_PARAM); 197 198 *pmux_info = NULL; 199 for (idx = 0; idx < num_pmux_qual; idx++) { 200 if (pmux_info_arr[idx].pmux_qual == qual) { 201 *pmux_info = &(pmux_info_arr[idx]); 202 } 203 } 204 205 if (pmux_info == NULL) { 206 BCMI_KEYGEN_IF_ERR_EXIT(BCM_E_NOT_FOUND); 207 } 208 exit: 209 BCMI_KEYGEN_FUNC_EXIT(); 210 } 211 212 int 213 bcmi_keygen_pmux_control_set(int unit, 214 bcm_field_qualify_t qual, 215 bcmi_keygen_md_t *keygen_md, 216 bcmi_keygen_cfg_t *keygen_cfg) 217 { 218 uint8 idx = 0; 219 uint8 pmux_num = 0; 220 uint8 pmux_part = 0; 221 bcmi_keygen_ext_sel_t *ext_codes = NULL; 222 bcmi_keygen_pmux_info_t *pmux_info = NULL; 223 bcmi_keygen_qual_cfg_t *qual_cfg = NULL; 224 225 BCMI_KEYGEN_FUNC_ENTER(unit); 226 227 BCMI_KEYGEN_NULL_CHECK(keygen_md, BCM_E_PARAM); 228 BCMI_KEYGEN_NULL_CHECK(keygen_cfg, BCM_E_PARAM); 229 230 BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT( 231 bcmi_keygen_pmux_info_get(unit, 232 qual, 233 keygen_md->num_pmux_qual, 234 keygen_md->pmux_info, 235 &pmux_info)); 236 237 pmux_part = pmux_info->pmux_part; 238 qual_cfg = pmux_info->pmux_qual_cfg; 239 ext_codes = &(keygen_md->ext_codes[pmux_part]); 240 for (idx = 0; idx < qual_cfg->num_chunks; idx++) { 241 pmux_num = qual_cfg->e_params[idx].sec_val; 242 switch (qual_cfg->e_params[idx].section) { 243 case BCMI_KEYGEN_EXT_SECTION_IPBM: 244 ext_codes->ipbm_source = qual_cfg->pri_ctrl_sel_val; 245 ext_codes->ipbm_present = 1; 246 break; 247 case BCMI_KEYGEN_EXT_SECTION_DROP: 248 case BCMI_KEYGEN_EXT_SECTION_NAT_NEEDED: 249 case BCMI_KEYGEN_EXT_SECTION_NAT_DST_REALMID: 250 case BCMI_KEYGEN_EXT_SECTION_EM_FIRST_LOOKUP_HIT: 251 case BCMI_KEYGEN_EXT_SECTION_EM_SECOND_LOOKUP_HIT: 252 case BCMI_KEYGEN_EXT_SECTION_EM_FIRST_LOOKUP_CLASSID_BITS_0_3: 253 case BCMI_KEYGEN_EXT_SECTION_EM_FIRST_LOOKUP_CLASSID_BITS_4_7: 254 case BCMI_KEYGEN_EXT_SECTION_EM_FIRST_LOOKUP_CLASSID_BITS_8_11: 255 case BCMI_KEYGEN_EXT_SECTION_EM_SECOND_LOOKUP_CLASSID_BITS_0_3: 256 case BCMI_KEYGEN_EXT_SECTION_EM_SECOND_LOOKUP_CLASSID_BITS_4_7: 257 case BCMI_KEYGEN_EXT_SECTION_EM_SECOND_LOOKUP_CLASSID_BITS_8_11: 258 case BCMI_KEYGEN_EXT_SECTION_LOOKUP_STATUS_VECTOR_BITS_0_3: 259 case BCMI_KEYGEN_EXT_SECTION_LOOKUP_STATUS_VECTOR_BITS_4_7: 260 case BCMI_KEYGEN_EXT_SECTION_PKT_RESOLUTION: 261 case BCMI_KEYGEN_EXT_SECTION_INT_PRI: 262 case BCMI_KEYGEN_EXT_SECTION_IFP_DROP_VECTOR: 263 case BCMI_KEYGEN_EXT_SECTION_MH_OPCODE: 264 case BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINERS_MSB: 265 keygen_md->ext_codes[pmux_part].pmux_sel[pmux_num] = 1; 266 break; 267 case BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_0: 268 ext_codes->pmux_sel[pmux_num] = 1; 269 ext_codes->src_dest_cont_0_sel = qual_cfg->pri_ctrl_sel_val; 270 break; 271 case BCMI_KEYGEN_EXT_SECTION_SRC_DST_CONTAINER_1: 272 ext_codes->pmux_sel[pmux_num] = 1; 273 ext_codes->src_dest_cont_1_sel = qual_cfg->pri_ctrl_sel_val; 274 break; 275 case BCMI_KEYGEN_EXT_SECTION_DST_CONTAINER_A: 276 ext_codes->pmux_sel[pmux_num] = 1; 277 ext_codes->dst_cont_a_sel = qual_cfg->pri_ctrl_sel_val; 278 break; 279 case BCMI_KEYGEN_EXT_SECTION_DST_CONTAINER_B: 280 ext_codes->pmux_sel[pmux_num] = 1; 281 ext_codes->dst_cont_b_sel = qual_cfg->pri_ctrl_sel_val; 282 break; 283 case BCMI_KEYGEN_EXT_SECTION_CLASS_ID_C: 284 ext_codes->pmux_sel[pmux_num] = 1; 285 ext_codes->class_id_cont_c_sel = qual_cfg->pri_ctrl_sel_val; 286 break; 287 case BCMI_KEYGEN_EXT_SECTION_CLASS_ID_D: 288 ext_codes->pmux_sel[pmux_num] = 1; 289 ext_codes->class_id_cont_d_sel = qual_cfg->pri_ctrl_sel_val; 290 break; 291 case BCMI_KEYGEN_EXT_SECTION_LTID: 292 break; 293 default: 294 BCMI_KEYGEN_RETURN_VAL_EXIT(BCM_E_INTERNAL); 295 } 296 } 297 exit: 298 BCMI_KEYGEN_FUNC_EXIT(); 299 } 300 301 int 302 bcmi_keygen_pmux_qual_offset_get(int unit, 303 bcm_field_qualify_t qual_id, 304 bcmi_keygen_md_t *keygen_md, 305 bcmi_keygen_cfg_t *keygen_cfg, 306 bcmi_keygen_qual_offset_t *qual_offset) 307 { 308 uint8 idx; 309 bcmi_keygen_qual_cfg_t *qual_cfg = NULL; 310 bcmi_keygen_pmux_info_t *pmux_info = NULL; 311 312 BCMI_KEYGEN_FUNC_ENTER(unit); 313 314 BCMI_KEYGEN_NULL_CHECK(keygen_md, BCM_E_PARAM); 315 BCMI_KEYGEN_NULL_CHECK(keygen_cfg, BCM_E_PARAM); 316 BCMI_KEYGEN_NULL_CHECK(qual_offset, BCM_E_PARAM); 317 318 sal_memset(qual_offset, 0, sizeof(bcmi_keygen_qual_offset_t)); 319 320 BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT 321 (bcmi_keygen_pmux_info_get(unit, 322 qual_id, 323 keygen_md->num_pmux_qual, 324 keygen_md->pmux_info, 325 &pmux_info)); 326 BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT 327 (bcmi_keygen_pmux_control_set(unit, qual_id, 328 keygen_md, keygen_cfg)); 329 qual_cfg = pmux_info->pmux_qual_cfg; 330 for (idx = 0; idx < qual_cfg->num_chunks; idx++) { 331 qual_offset->offset[idx] = qual_cfg->e_params[idx].offset; 332 qual_offset->width[idx] = qual_cfg->e_params[idx].width; 333 qual_offset->num_offsets++; 334 } 335 exit: 336 BCMI_KEYGEN_FUNC_EXIT(); 337 } 338 339 int 340 bcmi_keygen_pmux_process(int unit, 341 bcmi_keygen_cfg_t *keygen_cfg, 342 bcmi_keygen_md_t *keygen_md) 343 { 344 uint8 idx = 0; 345 uint8 num_pmux_qual = 0; 346 bcm_field_qualify_t pmux_qual; 347 bcmi_keygen_qual_flags_bmp_t *qual_flags = NULL; 348 bcmi_keygen_qual_cfg_t *qual_cfg = NULL; 349 bcmi_keygen_qual_cfg_info_t **qual_cfg_info = NULL; 350 351 BCMI_KEYGEN_FUNC_ENTER(unit); 352 353 BCMI_KEYGEN_NULL_CHECK(keygen_md, BCM_E_PARAM); 354 BCMI_KEYGEN_NULL_CHECK(keygen_cfg, BCM_E_PARAM); 355 356 qual_cfg_info = keygen_cfg->qual_cfg_info_db->qual_cfg_info; 357 for (idx = 0; idx < keygen_cfg->qual_info_count; idx++) { 358 pmux_qual = keygen_cfg->qual_info_arr[idx].qual_id; 359 qual_cfg = qual_cfg_info[pmux_qual]->qual_cfg_arr; 360 qual_flags = &(qual_cfg->qual_flags); 361 if (!SHR_BITGET(qual_flags->w, BCMI_KEYGEN_QUAL_FLAGS_PMUX)) { 362 continue; 363 } 364 num_pmux_qual++; 365 } 366 367 if (num_pmux_qual == 0) { 368 BCMI_KEYGEN_RETURN_VAL_EXIT(BCM_E_NONE); 369 } 370 371 BCMI_KEYGEN_ALLOC(keygen_md->pmux_info, 372 num_pmux_qual * sizeof(bcmi_keygen_pmux_info_t), 373 "Groups Post Mux Qualifiers Information"); 374 keygen_md->num_pmux_qual = num_pmux_qual; 375 376 BCMI_KEYGEN_IF_ERR_VERBOSE_EXIT 377 (bcmi_keygen_pmux_alloc(unit, keygen_cfg, keygen_md)); 378 exit: 379 if (BCMI_KEYGEN_FUNC_ERR()) { 380 BCMI_KEYGEN_FREE(keygen_md->pmux_info); 381 } 382 BCMI_KEYGEN_FUNC_EXIT(); 383 }