kbp_connectivity.h (7458B)
1 /** \file kbp_connectivity.h 2 * 3 * Functions for handling jericho2 kbp connectivity. 4 */ 5 /* 6 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 7 * 8 * Copyright 2007-2020 Broadcom Inc. All rights reserved. 9 */ 10 #if defined(INCLUDE_KBP) 11 /* 12 * { 13 */ 14 #ifndef __KBP_CONNECTIVITY_INCLUDED__ 15 /* 16 * { 17 */ 18 #define __KBP_CONNECTIVITY_INCLUDED__ 19 20 #ifndef BCM_DNX_SUPPORT 21 #error "This file is for use by DNX (Jr2) family only!" 22 #endif 23 24 /************* 25 * INCLUDES * 26 */ 27 /* 28 * { 29 */ 30 #include <soc/kbp/alg_kbp/include/db.h> 31 #include <soc/kbp/alg_kbp/include/default_allocator.h> 32 #include <soc/kbp/alg_kbp/include/device.h> 33 #include <soc/kbp/alg_kbp/include/key.h> 34 #include <soc/kbp/alg_kbp/include/instruction.h> 35 #include <soc/kbp/alg_kbp/include/errors.h> 36 #include <soc/kbp/alg_kbp/include/ad.h> 37 #include <soc/kbp/alg_kbp/include/kbp_legacy.h> 38 #include <soc/kbp/alg_kbp/include/init.h> 39 #include <soc/kbp/alg_kbp/include/kbp_pcie.h> 40 41 #include <soc/dnx/dnx_data/auto_generated/dnx_data_elk.h> 42 #include <bcm/port.h> 43 /* 44 * } 45 */ 46 47 /************* 48 * DEFINES * 49 */ 50 /* 51 * { 52 */ 53 54 #define DNX_KBP_MDIO_CLAUSE (45) 55 /* 56 * Opcode 57 */ 58 59 #define DNX_KBP_OPCODE_NUM_MAX 256 60 /* 61 * Lookup Table Write 62 */ 63 #define DNX_KBP_CPU_WR_LUT_OPCODE 255 64 /* 65 * Lookup Table Read 66 */ 67 #define DNX_KBP_CPU_RD_LUT_OPCODE 254 68 /* 69 * PIO Write 70 */ 71 #define DNX_KBP_CPU_PIOWR_OPCODE 253 72 /* 73 * PIO Read Database-X,Register, and User Data Array 74 */ 75 #define DNX_KBP_CPU_PIORDX_OPCODE 252 76 /* 77 * PIO Read Database-Y 78 */ 79 #define DNX_KBP_CPU_PIORDY_OPCODE 251 80 /* 81 * ROP Error Record 82 */ 83 #define DNX_KBP_CPU_ERR_OPCODE 250 84 /* 85 * Database Block Copy 86 */ 87 #define DNX_KBP_CPU_BLK_COPY_OPCODE 249 88 /* 89 * Database Block Move 90 */ 91 #define DNX_KBP_CPU_BLK_MOVE_OPCODE 248 92 /* 93 * Database Block Clear 94 */ 95 #define DNX_KBP_CPU_BLK_CLR_OPCODE 247 96 /* 97 * Database Block Invalidate 98 */ 99 #define DNX_KBP_CPU_BLK_EV_OPCODE 246 100 101 /** 102 * \brief 103 * define the first opcode in KBP management group 104 */ 105 #define DNX_KBP_CPU_MANAGMENT_OPCODE_FIRST 200 106 /* 107 * Context Buffer Write 108 */ 109 #define DNX_KBP_CPU_CTX_BUFF_WRITE_OPCODE 10 110 /* 111 * PAD OPCODE 112 */ 113 #define DNX_KBP_CPU_PAD_OPCODE 0 114 115 /* 116 * Size for Request 117 */ 118 #define DNX_KBP_CPU_WR_LUT_REQ_SIZE 4 119 #define DNX_KBP_CPU_RD_LUT_REQ_SIZE 1 120 #define DNX_KBP_CPU_PIOWR_REQ_SIZE 24 121 #define DNX_KBP_CPU_PIORDX_REQ_SIZE 4 122 #define DNX_KBP_CPU_PIORDY_REQ_SIZE 4 123 #define DNX_KBP_CPU_BLK_COPY_REQ_SIZE 8 124 #define DNX_KBP_CPU_BLK_MOVE_REQ_SIZE 8 125 #define DNX_KBP_CPU_BLK_CLR_REQ_SIZE 5 126 #define DNX_KBP_CPU_BLK_EV_REQ_SIZE 5 127 128 /* 129 * Size for Reply 130 */ 131 #define DNX_KBP_CPU_WR_LUT_REP_SIZE 1 132 #define DNX_KBP_CPU_RD_LUT_REP_SIZE 4 133 #define DNX_KBP_CPU_PIOWR_REP_SIZE 1 134 #define DNX_KBP_CPU_PIORDX_REP_SIZE 11 135 #define DNX_KBP_CPU_PIORDY_REP_SIZE 11 136 #define DNX_KBP_CPU_BLK_COPY_REP_SIZE 1 137 #define DNX_KBP_CPU_BLK_MOVE_REP_SIZE 1 138 #define DNX_KBP_CPU_BLK_CLR_REP_SIZE 1 139 #define DNX_KBP_CPU_BLK_EV_REP_SIZE 1 140 141 /* 142 * Opcode type 143 */ 144 #define DNX_KBP_OPCODE_TYPE_REQUEST 1 145 #define DNX_KBP_OPCODE_TYPE_REPLY 3 146 147 /* 148 * Number of kbp instance 149 */ 150 #define DNX_KBP_MAX_NOF_INST (DNX_DATA_MAX_ELK_GENERAL_MAX_KBP_INSTANCE) 151 /* 152 * Second KBP exists or not 153 * This indication is true when: 154 * 1. KBP connectivity properties are configured with second KBP 155 * or 156 * 2. when KBP blackhole mode indicates 2 KBP instances 157 */ 158 #define DNX_KBP_IS_SECOND_KBP_EXIST \ 159 ((dnx_data_elk.connectivity.topology_get(unit)->start_lane[2] >= \ 160 dnx_data_elk.general.max_lane_id_get(unit)) || \ 161 (dnx_data_elk.connectivity.blackhole_get(unit) == 2)) 162 163 #define DNX_KBP_INST_ITER(unit, kbp_inst) \ 164 for (kbp_inst = 0; kbp_inst < (DNX_KBP_IS_SECOND_KBP_EXIST ? DNX_KBP_MAX_NOF_INST : 1); kbp_inst++) 165 166 #define DNX_KBP_INST_MASTER 0 167 #define DNX_KBP_INST_SLAVE 1 168 169 #define DNX_KBP_OP_IS_DUAL_MODE(unit) ((dnx_data_elk.connectivity.connect_mode_get(unit) == \ 170 DNX_NIF_ELK_TCAM_CONNECT_MODE_DUAL_SHARED) || \ 171 (dnx_data_elk.connectivity.connect_mode_get(unit) == \ 172 DNX_NIF_ELK_TCAM_CONNECT_MODE_DUAL_SMT)) 173 174 #define DNX_KBP_OP2_IS_SINGLE_PORT_MODE(unit) (dnx_data_elk.connectivity.connect_mode_get(unit) == \ 175 DNX_NIF_ELK_TCAM_CONNECT_MODE_SINGLE_PORT) 176 177 #define DNX_KBP_VALID_KBP_PORTS_NUM (2) 178 179 #define DNX_KBP_USED_KBP_PORTS_NUM (DNX_KBP_OP2_IS_SINGLE_PORT_MODE(unit) ? 1 : DNX_KBP_VALID_KBP_PORTS_NUM) 180 181 /* 182 * } 183 */ 184 185 /************* 186 * MACROS * 187 */ 188 /* 189 * { 190 */ 191 192 /* 193 * } 194 */ 195 196 /************* 197 * TYPE DEFS * 198 */ 199 /* 200 * { 201 */ 202 203 typedef enum 204 { 205 /* 206 * OP Single Host Dual Port mode 207 */ 208 DNX_NIF_ELK_TCAM_CONNECT_MODE_SINGLE = 0, 209 /* 210 * OP Dual Host Quad Port Shared mode 211 */ 212 DNX_NIF_ELK_TCAM_CONNECT_MODE_DUAL_SHARED = 1, 213 /* 214 * OP Dual Host Quad Port SMT mode 215 */ 216 DNX_NIF_ELK_TCAM_CONNECT_MODE_DUAL_SMT = 2, 217 /* 218 * OP2 Single Port mode 219 */ 220 DNX_NIF_ELK_TCAM_CONNECT_MODE_SINGLE_PORT = 3, 221 /* 222 * Number of types in ARAD_NIF_ELK_TCAM_DEV_TYPE 223 */ 224 DNX_NIF_ELK_TCAM_NOF_CONNECT_MODE = 4 225 } DNX_NIF_ELK_TCAM_CONNECT_MODE; 226 227 typedef struct dnx_kbp_user_data_s 228 { 229 int device; 230 uint32 kbp_mdio_id; 231 } dnx_kbp_user_data_t; 232 233 typedef struct dnx_kbp_opcode_map_s 234 { 235 uint8 opcode; 236 /* 237 * Reply size, 1-based 238 */ 239 uint32 rx_size; 240 uint32 rx_type; 241 /* 242 * Response size, 1-based 243 */ 244 uint32 tx_size; 245 uint32 tx_type; 246 } dnx_kbp_opcode_map_t; 247 /* 248 * } 249 */ 250 251 /************* 252 * GLOBALS * 253 */ 254 /* 255 * { 256 */ 257 258 /* 259 * } 260 */ 261 262 /************* 263 * FUNCTIONS * 264 */ 265 /* 266 * { 267 */ 268 int32_t dnx_kbp_callback_usleep( 269 void *handle, 270 uint32_t usec); 271 272 int32_t dnx_kbp_callback_mdio_read( 273 void *handle, 274 int32_t chip_no, 275 uint8_t dev, 276 uint16_t reg, 277 uint16_t * value); 278 279 int32_t dnx_kbp_callback_mdio_write( 280 void *handle, 281 int32_t chip_no, 282 uint8_t dev, 283 uint16_t reg, 284 uint16_t value); 285 286 int32_t dnx_kbp_callback_reset_device( 287 void *handle, 288 int32_t s_reset_low, 289 int32_t c_reset_low); 290 291 shr_error_e dnx_kbp_init_device_type_get( 292 int unit, 293 enum kbp_device_type *device_type); 294 295 shr_error_e dnx_kbp_init_user_data_get( 296 int unit, 297 int kbp_inst, 298 dnx_kbp_user_data_t * user_data); 299 300 shr_error_e dnx_kbp_ilkn_interface_param_get( 301 int unit, 302 bcm_core_t core, 303 bcm_port_t * ilkn_port, 304 int *ilkn_num_lanes, 305 int *ilkn_rate, 306 int *ilkn_metaframe); 307 308 shr_error_e dnx_kbp_init_config_param_get( 309 int unit, 310 int kbp_inst, 311 bcm_core_t core, 312 uint32 *flags, 313 struct kbp_device_config *kbp_config); 314 315 shr_error_e dnx_kbp_opcode_map_set( 316 int unit, 317 bcm_core_t core, 318 dnx_kbp_opcode_map_t * opcode_map); 319 320 shr_error_e dnx_kbp_opcode_map_get( 321 int unit, 322 bcm_core_t core, 323 dnx_kbp_opcode_map_t * opcode_map); 324 325 shr_error_e dnx_kbp_interface_init( 326 int unit); 327 328 shr_error_e dnx_kbp_init_reset( 329 int unit); 330 331 shr_error_e dnx_kbp_init_kbp_stat_interface( 332 int unit); 333 334 shr_error_e dnx_kbp_stat_interface_enable_get( 335 int unit, 336 int *enable); 337 338 /* 339 * } 340 */ 341 342 /* 343 * } 344 */ 345 #endif /* __KBP_CONNECTIVITY_INCLUDED__ */ 346 /* 347 * } 348 */ 349 #endif /* defined(INCLUDE_KBP) */