cvmx-higig.h revision 232812
1/***********************license start*************** 2 * Copyright (c) 2003-2010 Cavium Inc. (support@cavium.com). All rights 3 * reserved. 4 * 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: 9 * 10 * * Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * * Redistributions in binary form must reproduce the above 14 * copyright notice, this list of conditions and the following 15 * disclaimer in the documentation and/or other materials provided 16 * with the distribution. 17 18 * * Neither the name of Cavium Inc. nor the names of 19 * its contributors may be used to endorse or promote products 20 * derived from this software without specific prior written 21 * permission. 22 23 * This Software, including technical data, may be subject to U.S. export control 24 * laws, including the U.S. Export Administration Act and its associated 25 * regulations, and may be subject to export or import regulations in other 26 * countries. 27 28 * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS" 29 * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR 30 * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO 31 * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR 32 * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM 33 * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE, 34 * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF 35 * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR 36 * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE RISK ARISING OUT OF USE OR 37 * PERFORMANCE OF THE SOFTWARE LIES WITH YOU. 38 ***********************license end**************************************/ 39 40 41 42 43 44 45 46/** 47 * @file 48 * 49 * Functions and typedefs for using Octeon in HiGig/HiGig+/HiGig2 mode over 50 * XAUI. 51 * 52 * <hr>$Revision: 70030 $<hr> 53 */ 54 55#ifndef __CVMX_HIGIG_H__ 56#define __CVMX_HIGIG_H__ 57#include "cvmx-wqe.h" 58#include "cvmx-helper.h" 59#include "cvmx-helper-util.h" 60 61#ifdef __cplusplus 62extern "C" { 63#endif 64 65typedef struct 66{ 67 union 68 { 69 uint32_t u32; 70 struct 71 { 72 uint32_t start : 8; /**< 8-bits of Preamble indicating start of frame */ 73 uint32_t hgi : 2; /**< HiGig interface format indicator 74 00 = Reserved 75 01 = Pure preamble - IEEE standard framing of 10GE 76 10 = XGS header - framing based on XGS family definition In this 77 format, the default length of the header is 12 bytes and additional 78 bytes are indicated by the HDR_EXT_LEN field 79 11 = Reserved */ 80 uint32_t cng_high : 1; /**< Congestion Bit High flag */ 81 uint32_t hdr_ext_len : 3; /**< This field is valid only if the HGI field is a b'10' and it indicates the extension 82 to the standard 12-bytes of XGS HiGig header. Each unit represents 4 83 bytes, giving a total of 16 additional extension bytes. Value of b'101', b'110' 84 and b'111' are reserved. For HGI field value of b'01' this field should be 85 b'01'. For all other values of HGI it is don't care. */ 86 uint32_t src_modid_6 : 1; /**< This field is valid only if the HGI field is a b'10' and it represents Bit 6 of 87 SRC_MODID (bits 4:0 are in Byte 4 and bit 5 is in Byte 9). For HGI field 88 value of b'01' this field should be b'0'. For all other values of HGI it is don't 89 care. */ 90 uint32_t dst_modid_6 : 1; /**< This field is valid only if the HGI field is a b'10' and it represents Bit 6 of 91 DST_MODID (bits 4:0 are in Byte 7 and bit 5 is in Byte 9). ). For HGI field 92 value of b'01' this field should be b'1'. For all other values of HGI it is don't 93 care. */ 94 uint32_t vid_high : 8; /**< 8-bits of the VLAN tag information */ 95 uint32_t vid_low : 8; /**< 8 bits LSB of the VLAN tag information */ 96 } s; 97 } dw0; 98 union 99 { 100 uint32_t u32; 101 struct 102 { 103 uint32_t src_modid_low : 5; /**< Bits 4:0 of Module ID of the source module on which the packet ingress (bit 104 5 is in Byte 9 and bit 6 Is in Byte 1) */ 105 uint32_t opcode : 3; /**< XGS HiGig op-code, indicating the type of packet 106 000 = Control frames used for CPU to CPU communications 107 001 = Unicast packet with destination resolved; The packet can be 108 either Layer 2 unicast packet or L3 unicast packet that was 109 routed in the ingress chip. 110 010 = Broadcast or unknown Unicast packet or unknown multicast, 111 destined to all members of the VLAN 112 011 = L2 Multicast packet, destined to all ports of the group indicated 113 in the L2MC_INDEX which is overlayed on DST_PORT/DST_MODID fields 114 100 = IP Multicast packet, destined to all ports of the group indicated 115 in the IPMC_INDEX which is overlayed on DST_PORT/DST_MODID fields 116 101 = Reserved 117 110 = Reserved 118 111 = Reserved */ 119 uint32_t pfm : 2; /**< Three Port Filtering Modes (0, 1, 2) used in handling registed/unregistered 120 multicast (unknown L2 multicast and IPMC) packets. This field is used 121 when OPCODE is 011 or 100 Semantics of PFM bits are as follows; 122 For registered L2 multicast packets: 123 PFM= 0 � Flood to VLAN 124 PFM= 1 or 2 � Send to group members in the L2MC table 125 For unregistered L2 multicast packets: 126 PFM= 0 or 1 � Flood to VLAN 127 PFM= 2 � Drop the packet */ 128 uint32_t src_port_tgid : 6; /**< If the MSB of this field is set, then it indicates the LAG the packet ingressed 129 on, else it represents the physical port the packet ingressed on. */ 130 uint32_t dst_port : 5; /**< Port number of destination port on which the packet needs to egress. */ 131 uint32_t priority : 3; /**< This is the internal priority of the packet. This internal priority will go through 132 COS_SEL mapping registers to map to the actual MMU queues. */ 133 uint32_t header_type : 2; /**< Indicates the format of the next 4 bytes of the XGS HiGig header 134 00 = Overlay 1 (default) 135 01 = Overlay 2 (Classification Tag) 136 10 = Reserved 137 11 = Reserved */ 138 uint32_t cng_low : 1; /**< Semantics of CNG_HIGH and CNG_LOW are as follows: The following 139 encodings are to make it backward compatible: 140 [CNG_HIGH, CNG_LOW] - COLOR 141 [0, 0] � Packet is green 142 [0, 1] � Packet is red 143 [1, 1] � Packet is yellow 144 [1, 0] � Undefined */ 145 uint32_t dst_modid_low : 5; /**< Bits [4-: 0] of Module ID of the destination port on which the packet needs to egress. */ 146 } s; 147 } dw1; 148 union 149 { 150 uint32_t u32; 151 struct 152 { 153 uint32_t dst_t : 1; /**< Destination Trunk: Indicates that the destination port is a member of a trunk 154 group. */ 155 uint32_t dst_tgid : 3; /**< Destination Trunk Group ID: Trunk group ID of the destination port. The 156 DO_NOT_LEARN bit is overlaid on the second bit of this field. */ 157 uint32_t ingress_tagged : 1; /**< Ingress Tagged: Indicates whether the packet was tagged when it originally 158 ingressed the system. */ 159 uint32_t mirror_only : 1; /**< Mirror Only: XGS 1/2 mode: Indicates that the packet was switched and only 160 needs to be mirrored. */ 161 uint32_t mirror_done : 1; /**< Mirroring Done: XGS1/2 mode: Indicates that the packet was mirrored and 162 may still need to be switched. */ 163 uint32_t mirror : 1; /**< Mirror: XGS3 mode: a mirror copy packet. XGS1/2 mode: Indicates that the 164 packet was switched and only needs to be mirrored. */ 165 166 uint32_t src_modid_5 : 1; /**< Source Module ID: Bit 5 of Src_ModID (bits 4:0 are in byte 4 and bit 6 is in 167 byte 1) */ 168 uint32_t dst_modid_5 : 1; /**< Destination Module ID: Bit 5 of Dst_ModID (bits 4:0 are in byte 7 and bit 6 169 is in byte 1) */ 170 uint32_t l3 : 1; /**< L3: Indicates that the packet is L3 switched */ 171 uint32_t label_present : 1; /**< Label Present: Indicates that header contains a 20-bit VC label: HiGig+ 172 added field. */ 173 uint32_t vc_label_16_19 : 4; /**< VC Label: Bits 19:16 of VC label: HiGig+ added field */ 174 uint32_t vc_label_0_15 : 16;/**< VC Label: Bits 15:0 of VC label: HiGig+ added field */ 175 } o1; 176 struct 177 { 178 uint32_t classification : 16; /**< Classification tag information from the HiGig device FFP */ 179 uint32_t reserved_0_15 : 16; 180 181 } o2; 182 } dw2; 183} cvmx_higig_header_t; 184 185typedef struct 186{ 187 union 188 { 189 uint32_t u32; 190 struct 191 { 192 uint32_t k_sop : 8; /**< The delimiter indicating the start of a packet transmission */ 193 uint32_t reserved_21_23 : 3; 194 uint32_t mcst : 1; /**< MCST indicates whether the packet should be unicast or 195 multicast forwarded through the XGS switching fabric 196 - 0: Unicast 197 - 1: Mulitcast */ 198 uint32_t tc : 4; /**< Traffic Class [3:0] indicates the distinctive Quality of Service (QoS) 199 the switching fabric will provide when forwarding the packet 200 through the fabric */ 201 uint32_t dst_modid_mgid : 8; /**< When MCST=0, this field indicates the destination XGS module to 202 which the packet will be delivered. When MCST=1, this field indicates 203 higher order bits of the Multicast Group ID. */ 204 uint32_t dst_pid_mgid : 8; /**< When MCST=0, this field indicates a port associated with the 205 module indicated by the DST_MODID, through which the packet 206 will exit the system. When MCST=1, this field indicates lower order 207 bits of the Multicast Group ID */ 208 } s; 209 } dw0; 210 union 211 { 212 uint32_t u32; 213 struct 214 { 215 uint32_t src_modid : 8; /**< Source Module ID indicates the source XGS module from which 216 the packet is originated. (It can also be used for the fabric multicast 217 load balancing purpose.) */ 218 uint32_t src_pid : 8; /**< Source Port ID indicates a port associated with the module 219 indicated by the SRC_MODID, through which the packet has 220 entered the system */ 221 uint32_t lbid : 8; /**< Load Balancing ID indicates a packet flow hashing index 222 computed by the ingress XGS module for statistical distribution of 223 packet flows through a multipath fabric */ 224 uint32_t dp : 2; /**< Drop Precedence indicates the traffic rate violation status of the 225 packet measured by the ingress module. 226 - 00: GREEN 227 - 01: RED 228 - 10: Reserved 229 - 11: Yellow */ 230 uint32_t reserved_3_5 : 3; 231 uint32_t ppd_type : 3; /**< Packet Processing Descriptor Type 232 - 000: PPD Overlay1 233 - 001: PPD Overlay2 234 - 010~111: Reserved */ 235 } s; 236 } dw1; 237 union 238 { 239 uint32_t u32; 240 struct 241 { 242 uint32_t dst_t : 1; /**< Destination Trunk: Indicates that the destination port is a member of a trunk 243 group. */ 244 uint32_t dst_tgid : 3; /**< Destination Trunk Group ID: Trunk group ID of the destination port. The 245 DO_NOT_LEARN bit is overlaid on the second bit of this field. */ 246 uint32_t ingress_tagged : 1; /**< Ingress Tagged: Indicates whether the packet was tagged when it originally 247 ingressed the system. */ 248 uint32_t mirror_only : 1; /**< Mirror Only: XGS 1/2 mode: Indicates that the packet was switched and only 249 needs to be mirrored. */ 250 uint32_t mirror_done : 1; /**< Mirroring Done: XGS1/2 mode: Indicates that the packet was mirrored and 251 may still need to be switched. */ 252 uint32_t mirror : 1; /**< Mirror: XGS3 mode: a mirror copy packet. XGS1/2 mode: Indicates that the 253 packet was switched and only needs to be mirrored. */ 254 uint32_t reserved_22_23 : 2; 255 uint32_t l3 : 1; /**< L3: Indicates that the packet is L3 switched */ 256 uint32_t label_present : 1; /**< Label Present: Indicates that header contains a 20-bit VC label: HiGig+ 257 added field. */ 258 uint32_t vc_label : 20; /**< Refer to the HiGig+ Architecture Specification */ 259 } o1; 260 struct 261 { 262 uint32_t classification : 16; /**< Classification tag information from the HiGig device FFP */ 263 uint32_t reserved_0_15 : 16; 264 } o2; 265 } dw2; 266 union 267 { 268 uint32_t u32; 269 struct 270 { 271 uint32_t vid : 16; /**< VLAN tag information */ 272 uint32_t pfm : 2; /**< Three Port Filtering Modes (0, 1, 2) used in handling registed/unregistered 273 multicast (unknown L2 multicast and IPMC) packets. This field is used 274 when OPCODE is 011 or 100 Semantics of PFM bits are as follows; 275 For registered L2 multicast packets: 276 PFM= 0 � Flood to VLAN 277 PFM= 1 or 2 � Send to group members in the L2MC table 278 For unregistered L2 multicast packets: 279 PFM= 0 or 1 � Flood to VLAN 280 PFM= 2 � Drop the packet */ 281 uint32_t src_t : 1; /**< If the MSB of this field is set, then it indicates the LAG the packet ingressed 282 on, else it represents the physical port the packet ingressed on. */ 283 uint32_t reserved_11_12 : 2; 284 uint32_t opcode : 3; /**< XGS HiGig op-code, indicating the type of packet 285 000 = Control frames used for CPU to CPU communications 286 001 = Unicast packet with destination resolved; The packet can be 287 either Layer 2 unicast packet or L3 unicast packet that was 288 routed in the ingress chip. 289 010 = Broadcast or unknown Unicast packet or unknown multicast, 290 destined to all members of the VLAN 291 011 = L2 Multicast packet, destined to all ports of the group indicated 292 in the L2MC_INDEX which is overlayed on DST_PORT/DST_MODID fields 293 100 = IP Multicast packet, destined to all ports of the group indicated 294 in the IPMC_INDEX which is overlayed on DST_PORT/DST_MODID fields 295 101 = Reserved 296 110 = Reserved 297 111 = Reserved */ 298 uint32_t hdr_ext_len : 3; /**< This field is valid only if the HGI field is a b'10' and it indicates the extension 299 to the standard 12-bytes of XGS HiGig header. Each unit represents 4 300 bytes, giving a total of 16 additional extension bytes. Value of b'101', b'110' 301 and b'111' are reserved. For HGI field value of b'01' this field should be 302 b'01'. For all other values of HGI it is don't care. */ 303 uint32_t reserved_0_4 : 5; 304 } s; 305 } dw3; 306} cvmx_higig2_header_t; 307 308 309/** 310 * Initialize the HiGig aspects of a XAUI interface. This function 311 * should be called before the cvmx-helper generic init. 312 * 313 * @param interface Interface to initialize HiGig on (0-1) 314 * @param enable_higig2 315 * Non zero to enable HiGig2 support. Zero to support HiGig 316 * and HiGig+. 317 * 318 * @return Zero on success, negative on failure 319 */ 320static inline int cvmx_higig_initialize(int interface, int enable_higig2) 321{ 322 cvmx_pip_prt_cfgx_t pip_prt_cfg; 323 cvmx_gmxx_rxx_udd_skp_t gmx_rx_udd_skp; 324 cvmx_gmxx_txx_min_pkt_t gmx_tx_min_pkt; 325 cvmx_gmxx_txx_append_t gmx_tx_append; 326 cvmx_gmxx_tx_ifg_t gmx_tx_ifg; 327 cvmx_gmxx_tx_ovr_bp_t gmx_tx_ovr_bp; 328 cvmx_gmxx_rxx_frm_ctl_t gmx_rx_frm_ctl; 329 cvmx_gmxx_tx_xaui_ctl_t gmx_tx_xaui_ctl; 330 int i, pknd; 331 int header_size = (enable_higig2) ? 16 : 12; 332 333 /* Setup PIP to handle HiGig */ 334 if (octeon_has_feature(OCTEON_FEATURE_PKND)) 335 pknd = cvmx_helper_get_pknd(interface, 0); 336 else 337 pknd = interface*16; 338 pip_prt_cfg.u64 = cvmx_read_csr(CVMX_PIP_PRT_CFGX(pknd)); 339 pip_prt_cfg.s.dsa_en = 0; 340 pip_prt_cfg.s.higig_en = 1; 341 pip_prt_cfg.s.hg_qos = 1; 342 pip_prt_cfg.s.skip = header_size; 343 cvmx_write_csr(CVMX_PIP_PRT_CFGX(pknd), pip_prt_cfg.u64); 344 345 /* Setup some sample QoS defaults. These can be changed later */ 346 if (!OCTEON_IS_MODEL(OCTEON_CN68XX)) 347 { 348 for (i=0; i<64; i++) 349 { 350 cvmx_pip_hg_pri_qos_t pip_hg_pri_qos; 351 pip_hg_pri_qos.u64 = 0; 352 pip_hg_pri_qos.s.up_qos = 1; 353 pip_hg_pri_qos.s.pri = i; 354 pip_hg_pri_qos.s.qos = i&7; 355 cvmx_write_csr(CVMX_PIP_HG_PRI_QOS, pip_hg_pri_qos.u64); 356 } 357 } 358 359 /* Setup GMX RX to treat the HiGig header as user data to ignore */ 360 gmx_rx_udd_skp.u64 = cvmx_read_csr(CVMX_GMXX_RXX_UDD_SKP(0, interface)); 361 gmx_rx_udd_skp.s.len = header_size; 362 gmx_rx_udd_skp.s.fcssel = 0; 363 cvmx_write_csr(CVMX_GMXX_RXX_UDD_SKP(0, interface), gmx_rx_udd_skp.u64); 364 365 /* Disable GMX preamble checking */ 366 gmx_rx_frm_ctl.u64 = cvmx_read_csr(CVMX_GMXX_RXX_FRM_CTL(0, interface)); 367 gmx_rx_frm_ctl.s.pre_chk = 0; 368 cvmx_write_csr(CVMX_GMXX_RXX_FRM_CTL(0, interface), gmx_rx_frm_ctl.u64); 369 370 /* Setup GMX TX to pad properly min sized packets */ 371 gmx_tx_min_pkt.u64 = cvmx_read_csr(CVMX_GMXX_TXX_MIN_PKT(0, interface)); 372 gmx_tx_min_pkt.s.min_size = 59 + header_size; 373 cvmx_write_csr(CVMX_GMXX_TXX_MIN_PKT(0, interface), gmx_tx_min_pkt.u64); 374 375 /* Setup GMX TX to not add a preamble */ 376 gmx_tx_append.u64 = cvmx_read_csr(CVMX_GMXX_TXX_APPEND(0, interface)); 377 gmx_tx_append.s.preamble = 0; 378 cvmx_write_csr(CVMX_GMXX_TXX_APPEND(0, interface), gmx_tx_append.u64); 379 380 /* Reduce the inter frame gap to 8 bytes */ 381 gmx_tx_ifg.u64 = cvmx_read_csr(CVMX_GMXX_TX_IFG(interface)); 382 gmx_tx_ifg.s.ifg1 = 4; 383 gmx_tx_ifg.s.ifg2 = 4; 384 cvmx_write_csr(CVMX_GMXX_TX_IFG(interface), gmx_tx_ifg.u64); 385 386 /* Disable GMX backpressure */ 387 gmx_tx_ovr_bp.u64 = cvmx_read_csr(CVMX_GMXX_TX_OVR_BP(interface)); 388 gmx_tx_ovr_bp.s.bp = 0; 389 gmx_tx_ovr_bp.s.en = 0xf; 390 gmx_tx_ovr_bp.s.ign_full = 0xf; 391 cvmx_write_csr(CVMX_GMXX_TX_OVR_BP(interface), gmx_tx_ovr_bp.u64); 392 393 if (enable_higig2) 394 { 395 /* Enable HiGig2 support and forwarding of virtual port backpressure 396 to PKO */ 397 cvmx_gmxx_hg2_control_t gmx_hg2_control; 398 gmx_hg2_control.u64 = cvmx_read_csr(CVMX_GMXX_HG2_CONTROL(interface)); 399 gmx_hg2_control.s.hg2rx_en = 1; 400 gmx_hg2_control.s.hg2tx_en = 1; 401 gmx_hg2_control.s.logl_en = 0xffff; 402 gmx_hg2_control.s.phys_en = 1; 403 cvmx_write_csr(CVMX_GMXX_HG2_CONTROL(interface), gmx_hg2_control.u64); 404 } 405 406 /* Enable HiGig */ 407 gmx_tx_xaui_ctl.u64 = cvmx_read_csr(CVMX_GMXX_TX_XAUI_CTL(interface)); 408 gmx_tx_xaui_ctl.s.hg_en = 1; 409 cvmx_write_csr(CVMX_GMXX_TX_XAUI_CTL(interface), gmx_tx_xaui_ctl.u64); 410 411 return 0; 412} 413 414#ifdef __cplusplus 415} 416#endif 417 418#endif // __CVMX_HIGIG_H__ 419