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_*/