openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

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 }