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

field_range.h (10534B)


      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-2020 Broadcom Inc. All rights reserved.
      5  */
      6 /**
      7  *  \file bcm_int/dnx/field/field_range.h
      8  *
      9  *  This file exposes DNX level functions for Field range,
     10  *  and their input structure types.
     11  */
     12 
     13 #ifndef DNX_FIELD_RANGE_H_INCLUDED
     14 
     15 #define DNX_FIELD_RANGE_H_INCLUDED
     16 
     17 #ifndef BCM_DNX_SUPPORT
     18 #error "This file is for use by DNX (JR2) family only!"
     19 #endif
     20 
     21 /**
     22  * { Include files
     23  */
     24 
     25 /** bcm */
     26 #include <bcm/field.h>
     27 #include <bcm/types.h>
     28 #include <bcm_int/dnx/field/field.h>
     29 /** soc */
     30 #include <soc/dnx/dbal/dbal.h>
     31 #include <soc/dnx/swstate/auto_generated/types/dnx_field_types.h>
     32 #include <soc/dnx/swstate/auto_generated/types/dnx_field_range_types.h>
     33 #include <soc/dnx/dnx_data/auto_generated/dnx_data_device.h>
     34 #include <soc/dnx/dnx_data/auto_generated/dnx_data_field.h>
     35 #include <soc/dnx/dnx_data/auto_generated/dnx_data_max_field.h>
     36 /** shared */
     37 #include <shared/bsl.h>
     38 /**
     39  * } Include files
     40  */
     41 /**
     42  * { DEFINES
     43  */
     44  /**
     45   * The maximum value for L4 range quals
     46   */
     47 #define DNX_FIELD_RANGE_L4_OPS_MAX_VAL   0xFFFF
     48 /**
     49  * The maximum for Out Lif range quals
     50  */
     51 #define DNX_FIELD_RANGE_OUT_LIF_MAX_VAL  0x3FFFFF
     52 /**
     53  * The maximum for Packet Header range quals
     54  */
     55 #define DNX_FIELD_RANGE_PKT_HDR_MAX_VAL  0xFF
     56  /**
     57   * Used for setting the minimum value for range ID and for the Range!
     58   * The minimum for all range qualifiers (L4 Ops, Out Lif and Packet Header)
     59   */
     60 #define DNX_FIELD_RANGE_QUALS_MIN_VAL     0
     61 /**
     62  * Used in the verify function. Indicates that we are verifying in the get function.
     63  */
     64 #define DNX_FIELD_RANGE_IS_FOR_SET     1
     65 /**
     66  * Used in the verify function. Indicates that we are verifying in the get function.
     67  */
     68 #define DNX_FIELD_RANGE_IS_FOR_GET     0
     69 /**
     70  * } DEFINES
     71  */
     72 /**
     73  * { MACROS
     74  */
     75 /**
     76  * Range ID validation check for L4 Range Qualifiers.
     77  * Range must smaller then 24 and bigger then 0.
     78  * For L4 Ops the DNX_DATA_MAX_FIELD value is the same for both stages!
     79  */
     80 #define DNX_FIELD_RANGE_L4_RANGE_ID_VALID(_unit, _stage, _range_id)    \
     81     ((((int)_range_id) >= 0) && \
     82      ((_range_id) < dnx_data_field.stage.stage_info_get((_unit), (_stage))->nof_l4_ops_ranges_legacy))
     83 /**
     84  * Range ID validation check for Out Lif Range Qualifiers for IPMF1.
     85  * Range must smaller then 3 and bigger then 0
     86  */
     87 #define DNX_FIELD_RANGE_OUT_LIF_IPMF1_RANGE_ID_VALID(_unit, _range_id)    \
     88     ((((int)_range_id) >= 0) && \
     89      ((_range_id) < dnx_data_field.stage.stage_info_get((_unit), DNX_FIELD_STAGE_IPMF1)->nof_out_lif_ranges))
     90 /**
     91  * Range ID validation check for Out Lif Range Qualifiers for IPMF3.
     92  * Range must smaller then 6 and bigger then 0
     93  */
     94 #define DNX_FIELD_RANGE_OUT_LIF_IPMF3_RANGE_ID_VALID(_unit, _range_id)    \
     95     ((((int)_range_id) >= 0) && \
     96      ((_range_id) < dnx_data_field.stage.stage_info_get((_unit), DNX_FIELD_STAGE_IPMF3)->nof_out_lif_ranges))
     97 /**
     98  * Range ID validation check for Packet Header Size Range Qualifiers.
     99  * Range must smaller then 3 and bigger then 0
    100  */
    101 #define DNX_FIELD_RANGE_PKT_HDR_RANGE_ID_VALID(_unit, _range_id)    \
    102     ((((int)_range_id) >= 0) && \
    103      (_range_id < dnx_data_field.stage.stage_info_get(_unit, DNX_FIELD_STAGE_IPMF1)->nof_pkt_hdr_ranges))
    104  /**
    105   * Min-max range validation check for L4 Range Qualifiers.
    106   * Range must be [0-65355]
    107   */
    108 #define DNX_FIELD_RANGE_L4_RANGE_VALID(range_min_val, range_max_val)  \
    109     (((int)range_min_val >= DNX_FIELD_RANGE_QUALS_MIN_VAL) && (range_max_val <= DNX_FIELD_RANGE_L4_OPS_MAX_VAL))
    110 /**
    111  * Min-max range validation check for Out Lif Range Qualifier.
    112  * Range must be [0-4194303]
    113  */
    114 #define DNX_FIELD_RANGE_OUT_LIF_RANGE_VALID(range_min_val, range_max_val) \
    115     (((int)range_min_val >= DNX_FIELD_RANGE_QUALS_MIN_VAL) && (range_max_val <= DNX_FIELD_RANGE_OUT_LIF_MAX_VAL))
    116 /**
    117  * Min-max range validation check for Packet Header Size Range Qualifiers.
    118  * Range must be [0-255]
    119  */
    120 #define DNX_FIELD_RANGE_PKT_HDR_RANGE_VALID(range_min_val, range_max_val) \
    121     (((int)range_min_val >= DNX_FIELD_RANGE_QUALS_MIN_VAL) && (range_max_val <= DNX_FIELD_RANGE_PKT_HDR_MAX_VAL))
    122 
    123 /**
    124  * Checks whether the given type belongs to the extended L4 OPs.
    125  */
    126 #define DNX_FIELD_RANGE_EXTENDED_L4_OPS(_range_type) \
    127     (((_range_type) == DNX_FIELD_RANGE_TYPE_L4_SRC_PORT) || \
    128      ((_range_type) == DNX_FIELD_RANGE_TYPE_L4_DST_PORT) || \
    129      (((_range_type) >= DNX_FIELD_RANGE_TYPE_L4OPS_PKT_HDR_SIZE) && \
    130       ((_range_type) <= DNX_FIELD_RANGE_TYPE_FFC2_HIGH)))
    131 /**
    132  * } MACROS
    133  */
    134 /**
    135  * { Types
    136  */
    137 
    138 /**
    139  *   This structure holds the data per range qualifier.
    140  */
    141 typedef struct
    142 {
    143     /**
    144      * The type of the range. For more information look at the 'dnx_field_range_type_e'
    145      */
    146     dnx_field_range_type_e range_type;
    147     /**
    148      * Minimum value of the range.
    149      * In case the range type is PacketHeaderSize, min val is in bits.
    150      */
    151     uint32 min_val;
    152     /**
    153      * Maximum value of the range.
    154      * In case the range type is PacketHeaderSize, max val is in bits.
    155      */
    156     uint32 max_val;
    157 } dnx_field_range_info_t;
    158 
    159 /**
    160  * } Types
    161  */
    162  /**
    163  * \brief
    164  *  Clear the dnx_field_range_info_t, set it to preferred init values
    165  * \param [in] unit          - Device ID
    166  * \param [in] range_info_p    - Pointer to input structure of
    167  *                        dnx_field_range_info_t that needs to be init
    168  * \return
    169  *   shr_error_e - Error Type
    170  * \remark
    171  *   * None
    172  * \see
    173  *   * None
    174  */
    175 shr_error_e dnx_field_range_info_t_init(
    176     int unit,
    177     dnx_field_range_info_t * range_info_p);
    178 /**
    179  * \brief
    180  *  Install a functional range with range_id and range_info.
    181  * \param [in] unit       - Device ID
    182  * \param [in] flags      - range flags
    183  * \param [in] field_stage - Indicate the PMF stage
    184  * \param [in] range_id   - Identifier of the range: User-provided range ID
    185  * \param [in] range_info_p - Data to be written in hardware:
    186  *                The type of the range, the minimum and maximum value
    187  * \return
    188  *   shr_error_e - Error Type
    189  * \remark
    190  *   * None
    191  * \see
    192  *   * None
    193  */
    194 shr_error_e dnx_field_range_set(
    195     int unit,
    196     uint32 flags,
    197     dnx_field_stage_e field_stage,
    198     uint32 range_id,
    199     dnx_field_range_info_t * range_info_p);
    200 
    201 /**
    202  * \brief
    203  *  Get the HW data associated with access_id (range with given ID):
    204  *  The type of the range, the minimum and maximum value
    205  * \param [in] unit       - Device ID
    206  * \param [in] field_stage - Indicate the PMF stage
    207  * \param [in] range_id_p   - Identifier of the range: User-provided range ID
    208  * \param [in,out] range_info_p - The range_info structure.
    209  *                       as in - range_type. Used to configure all needed tables from where the info is get.
    210  *                       as out - min and max value.
    211  * \return
    212  *   shr_error_e - Error Type
    213  * \remark
    214  *   * None
    215  * \see
    216  *   * None
    217  */
    218 shr_error_e dnx_field_range_get(
    219     int unit,
    220     dnx_field_stage_e field_stage,
    221     uint32 *range_id_p,
    222     dnx_field_range_info_t * range_info_p);
    223 
    224 /**
    225  * \brief
    226  *  Get the minimum and maximum values usable by a certain rnage type.
    227  * \param [in] unit       - Device ID
    228  * \param [in] range_type - DNX range type
    229  * \param [out] absolute_min_val_p   - The minimum value the range type can accept.
    230  * \param [out] absolute_max_val_p - The maximum value the range type can accept.
    231  * \return
    232  *   shr_error_e - Error Type
    233  * \remark
    234  *   * None
    235  * \see
    236  *   * None
    237  */
    238 shr_error_e dnx_field_range_absolute_min_max_values(
    239     int unit,
    240     dnx_field_range_type_e range_type,
    241     int *absolute_min_val_p,
    242     int *absolute_max_val_p);
    243 
    244 /**
    245  * \brief  Return name of dnx range type
    246  * \param [in] range_type - dnx range_type
    247  * \return
    248  *   \retval Range type            - On success
    249  *   \retval "Invalid Range Type"  - If invalid range type provided
    250  *   \retval "Unnamed Range Type"  - If for valid range name was not assigned
    251  * \remark
    252  */
    253 char *dnx_field_range_type_text(
    254     dnx_field_range_type_e range_type);
    255 
    256 /**
    257 * \brief
    258 *  Initialize the ranges to accept all values.
    259 * \param [in] unit       - Device ID
    260 * \return
    261 *   shr_error_e - Error Type
    262 * \remark
    263 *   * None
    264 * \see
    265 *   * None
    266 */
    267 shr_error_e dnx_field_range_init(
    268     int unit);
    269 
    270 /**
    271 * \brief
    272 *  Configures the Extended L4 OPS (range) FFCs. The FFC to config is determined by the given dnx_range_type.
    273 * \param [in] unit                     - Device ID
    274 * \param [in] flags                    - TBD
    275 * \param [in] configurable_range_index - Range FFC index to set
    276 * \param [in] dnx_qual_info            - Qualifier info to set into FFC
    277 * \return
    278 *   shr_error_e - Error Type
    279 * \remark
    280 *   * None
    281 * \see
    282 *   * None
    283  */
    284 shr_error_e dnx_field_range_ffc_config_set(
    285     int unit,
    286     uint32 flags,
    287     uint32 configurable_range_index,
    288     dnx_field_range_type_qual_info_t * dnx_qual_info);
    289 
    290 /**
    291 * \brief
    292 *  Retrieves the DNX qualifier info (type, attach_info) for the given Extended L4 OPS (range) FFC.
    293 * \param [in]  unit                     - Device ID
    294 * \param [in]  flags                    - TBD
    295 * \param [in]  configurable_range_index - Range FFC index to get
    296 * \param [out] dnx_qual_info            - Retrieved qualifier info
    297 * \return
    298 *   shr_error_e - Error Type
    299 * \remark
    300 *   * None
    301 * \see
    302 *   * None
    303  */
    304 shr_error_e dnx_field_range_ffc_config_get(
    305     int unit,
    306     uint32 flags,
    307     uint32 configurable_range_index,
    308     dnx_field_range_type_qual_info_t * dnx_qual_info);
    309 
    310 /**
    311 * \brief
    312 *  Returns the range indexes and the number of maximum range IDs for the given range_type
    313 * \param [in] unit      - Device Id.
    314 * \param [in] dnx_range_type    - The range type
    315 * \param [out] range_indexes - The range indexes of the given
    316 * \param [out] nof_range_ids - Number of range IDs for the given type
    317 * \return
    318 *   shr_error_e - Error Type
    319 * \see
    320 *   * None
    321 */
    322 shr_error_e dnx_field_range_type_nof_range_ids_extended(
    323     int unit,
    324     dnx_field_range_type_e dnx_range_type,
    325     uint32 range_indexes[],
    326     int *nof_range_ids);
    327 
    328 /**
    329  * \brief
    330  *  Returns the number of range IDs available for a specific range type in a specidfic stage.
    331  * \param [in] unit          - Device ID
    332  * \param [in] range_type    - Range type
    333  * \param [in] field_stage   - Stage
    334  * \param [out] nof_ranges_p - maximum number of ranges for range type and stage
    335  * \return
    336  *   shr_error_e - Error Type
    337  * \remark
    338  */
    339 shr_error_e dnx_field_range_nof_range_ids(
    340     int unit,
    341     dnx_field_range_type_e range_type,
    342     dnx_field_stage_e field_stage,
    343     int *nof_ranges_p);
    344 
    345 #endif/*_FIELD_API_INCLUDED_*/