/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #ifndef _HXGE_PFC_HW_H #define _HXGE_PFC_HW_H #pragma ident "%Z%%M% %I% %E% SMI" #ifdef __cplusplus extern "C" { #endif #define PFC_BASE_ADDR 0X0200000 #define PFC_VLAN_TABLE (PFC_BASE_ADDR + 0x0) #define PFC_VLAN_CTRL (PFC_BASE_ADDR + 0x9000) #define PFC_MAC_ADDR (PFC_BASE_ADDR + 0x10000) #define PFC_MAC_ADDR_MASK (PFC_BASE_ADDR + 0x10080) #define PFC_HASH_TABLE (PFC_BASE_ADDR + 0x10100) #define PFC_L2_CLASS_CONFIG (PFC_BASE_ADDR + 0x20000) #define PFC_L3_CLASS_CONFIG (PFC_BASE_ADDR + 0x20030) #define PFC_TCAM_KEY0 (PFC_BASE_ADDR + 0x20090) #define PFC_TCAM_KEY1 (PFC_BASE_ADDR + 0x20098) #define PFC_TCAM_MASK0 (PFC_BASE_ADDR + 0x200B0) #define PFC_TCAM_MASK1 (PFC_BASE_ADDR + 0x200B8) #define PFC_TCAM_CTRL (PFC_BASE_ADDR + 0x200D0) #define PFC_CONFIG (PFC_BASE_ADDR + 0x20100) #define TCP_CTRL_MASK (PFC_BASE_ADDR + 0x20108) #define SRC_HASH_VAL (PFC_BASE_ADDR + 0x20110) #define PFC_INT_STATUS (PFC_BASE_ADDR + 0x30000) #define PFC_DBG_INT_STATUS (PFC_BASE_ADDR + 0x30008) #define PFC_INT_MASK (PFC_BASE_ADDR + 0x30100) #define PFC_DROP_LOG (PFC_BASE_ADDR + 0x30200) #define PFC_DROP_LOG_MASK (PFC_BASE_ADDR + 0x30208) #define PFC_VLAN_PAR_ERR_LOG (PFC_BASE_ADDR + 0x30210) #define PFC_TCAM_PAR_ERR_LOG (PFC_BASE_ADDR + 0x30218) #define PFC_BAD_CS_COUNTER (PFC_BASE_ADDR + 0x30220) #define PFC_DROP_COUNTER (PFC_BASE_ADDR + 0x30228) #define PFC_AUTO_INIT (PFC_BASE_ADDR + 0x30300) /* * Register: PfcVlanTable * VLAN Table Registers * Description: VLAN membership table. CPU programs in the VLANs that * it wants to belong to. A blade may be a member of multiple VLANs. * Bits [31:0] of the first entry corresponds to vlan members [31:0], * bits [31:0] of the second entry corresponds to vlan members * [63:32] and so on. * Fields: * Odd parities of member[31:24], member[23:16], member[17:8], * member[7:0]. These parity bits are ignored when parEn in the * VLAN Control register is set to '0'. * Set to 1 to indicate that blade is a member of the VLAN IDs * (32 to 0) * entry number */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:28; uint32_t parity:4; uint32_t member:32; #else uint32_t member:32; uint32_t parity:4; uint32_t rsrvd:28; #endif } bits; } pfc_vlan_table_t; /* * Register: PfcVlanCtrl * VLAN Control Register * Description: VLAN control register. Controls VLAN table properties * and implicit VLAN properties for non-VLAN tagged packets. * Fields: * VLAN table parity debug write enable. When set to 1, software * writes the parity bits together with the data during a VLAN * table write. Otherwise, hardware automatically generates the * parity bits from the data. * Set to 1 to indicate the implicit VLAN ID is valid for use in * non-VLAN tagged packets filtering * Implicit VLAN ID for non-VLAN tagged packets */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:32; uint32_t rsrvd_l:18; uint32_t par_en:1; uint32_t valid:1; uint32_t id:12; #else uint32_t id:12; uint32_t valid:1; uint32_t par_en:1; uint32_t rsrvd_l:18; uint32_t rsrvd:32; #endif } bits; } pfc_vlan_ctrl_t; /* * Register: PfcMacAddr * MAC Address * Description: MAC Address - Contains a station's 48 bit MAC * address. The first register corresponds to MAC address 0, the * second register corresponds to MAC address 1 and so on. For a MAC * address of format aa-bb-cc-dd-ee-ff, addr[47:0] corresponds to * "aabbccddeeff". When used in conjunction with the MAC address * filter mask registers, these registers can be used to construct * either a unicast or multicast address. An address is considered * matched if (DA & ~mask) == (MAC address & ~mask) * Fields: * 48 bits of stations's MAC address */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:16; uint32_t addr:16; uint32_t addr_l:32; #else uint32_t addr_l:32; uint32_t addr:16; uint32_t rsrvd:16; #endif } bits; } pfc_mac_addr_t; /* * Register: PfcMacAddrMask * MAC Address Filter * Description: MAC Address Filter Mask - Contains the station's 48 * bit MAC address filter mask. The first register corresponds to MAC * address 0 filter mask, the second register corresponds to MAC * address 1 filter mask and so on. These filter masks cover MAC * address bits 47:0 in the same order as the address registers * Fields: * 48 bits of stations's MAC address filter mask */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:16; uint32_t mask:16; uint32_t mask_l:32; #else uint32_t mask_l:32; uint32_t mask:16; uint32_t rsrvd:16; #endif } bits; } pfc_mac_addr_mask_t; /* * Register: PfcHashTable * MAC Multicast Hash Filter * Description: MAC multicast hash table filter. The multicast * destination address is used to perform Ethernet CRC-32 hashing * with seed value 0xffffFfff. Bits 47:40 of the hash result are used * to index one bit of this multicast hash table. If the bit is '1', * the multicast hash matches. * Fields: * 16 bits of 256 bit hash table. First entry contains bits * [15:0], last entry contains bits [255:240] */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:32; uint32_t rsrvd_l:16; uint32_t hash_val:16; #else uint32_t hash_val:16; uint32_t rsrvd_l:16; uint32_t rsrvd:32; #endif } bits; } pfc_hash_table_t; /* * Register: PfcL2ClassConfig * L2 Class Configuration * Description: Programmable EtherType for class codes 2 and 3. The * first register is class 2, and the second class 3 * Fields: * Set to 1 to indicate that the entry is valid for use in * classification * EtherType value */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:32; uint32_t rsrvd_l:15; uint32_t valid:1; uint32_t etype:16; #else uint32_t etype:16; uint32_t valid:1; uint32_t rsrvd_l:15; uint32_t rsrvd:32; #endif } bits; } pfc_l2_class_config_t; /* * Register: PfcL3ClassConfig * L3 Class Configuration * Description: Configuration for class codes 0x8-0xF. PFC can be set * to discard certain classes of traffic, or to not initiate a TCAM * match for that class * Fields: * Set to 1 to discard all packets of this class code * Set to 1 to indicate that packets of this class should be sent * to the TCAM for perfect match */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:32; uint32_t rsrvd_l:28; uint32_t discard:1; uint32_t tsel:1; uint32_t rsrvd1:2; #else uint32_t rsrvd1:2; uint32_t tsel:1; uint32_t discard:1; uint32_t rsrvd_l:28; uint32_t rsrvd:32; #endif } bits; } pfc_l3_class_config_t; /* * Register: PfcTcamKey0 * TCAM Key 0 * Description: TCAM key value. Holds bit 63:0 of the TCAM key * Fields: * bits 63:0 of tcam key */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t key:32; uint32_t key_l:32; #else uint32_t key_l:32; uint32_t key:32; #endif } bits; } pfc_tcam_key0_t; /* * Register: PfcTcamKey1 * TCAM Key 1 * Description: TCAM key value. Holds bit 99:64 of the TCAM key * Fields: * bits 99:64 of tcam key */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:28; uint32_t key:4; uint32_t key_l:32; #else uint32_t key_l:32; uint32_t key:4; uint32_t rsrvd:28; #endif } bits; } pfc_tcam_key1_t; /* * Register: PfcTcamMask0 * TCAM Mask 0 * Description: TCAM mask value. Holds bit 63:0 of the TCAM mask * Fields: * bits 63:0 of tcam mask */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t mask:32; uint32_t mask_l:32; #else uint32_t mask_l:32; uint32_t mask:32; #endif } bits; } pfc_tcam_mask0_t; /* * Register: PfcTcamMask1 * TCAM Mask 1 * Description: TCAM mask value. Holds bit 99:64 of the TCAM mask * Fields: * bits 99:64 of tcam mask */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:28; uint32_t mask:4; uint32_t mask_l:32; #else uint32_t mask_l:32; uint32_t mask:4; uint32_t rsrvd:28; #endif } bits; } pfc_tcam_mask1_t; /* * Register: PfcTcamCtrl * TCAM Control * Description: TCAM and TCAM lookup memory access control register. * Controls how TCAM and result lookup table are accessed by blade * CPU. For a TCAM write, the data in the TCAM key and mask registers * will be written to the TCAM. A compare will initiate a TCAM match * with the data stored in the TCAM key register. The match bit is * toggled, and the matching address is reported in the addr field. * For an access to the TCAM result lookup memory, the TCAM 0 key * register is used for the read/write data. * Fields: * TCAM lookup table debug parity bit write enable. When a '1' is * written, software writes the parity bit together with the data * during a TCAM result lookup write. Otherwise, hardware * automatically generates the parity bit from the data. * 3'b000 = TCAM write 3'b001 = reserved 3'b010 = TCAM compare * 3'b011 = reserved 3'b100 = TCAM result lookup write 3'b101 = * TCAM result lookup read 3'b110 = reserved 3'b111 = reserved * Status of read/write/compare operation. When a zero is * written, hardware initiates access. Hardware writes a '1' to * the bit when it completes * Set to 1 if there is a TCAM match for compare command. Zero * otherwise * Address location for access of TCAM or RAM (valid values * 0-42). For a compare, the location of the match is written * here by hardware. */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:32; uint32_t rsrvd_l:13; uint32_t par_en:1; uint32_t cmd:3; uint32_t status:1; uint32_t match:1; uint32_t rsrvd1:5; uint32_t addr:8; #else uint32_t addr:8; uint32_t rsrvd1:5; uint32_t match:1; uint32_t status:1; uint32_t cmd:3; uint32_t par_en:1; uint32_t rsrvd_l:13; uint32_t rsrvd:32; #endif } bits; } pfc_tcam_ctrl_t; /* * Register: PfcConfig * PFC General Configuration * Description: PFC configuration options that are under the control * of a blade CPU * Fields: * MAC address enable mask. Each bit corresponds to one MAC * adress (lsb = addr0). With 16 MAC addresses, only the lower 16 * bits are valid. * default DMA channel number * force TCP/UDP checksum result to always match * Enable for TCP/UDP checksum. If not enabled, the result will * never match. * Enable TCAM matching. If TCAM matching is not enabled, traffic * will be sent to the default DMA channel. * Enable L2 Multicast hash */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:24; uint32_t mac_addr_en:8; uint32_t mac_addr_en_l:24; uint32_t default_dma:4; uint32_t force_cs_en:1; uint32_t tcp_cs_en:1; uint32_t tcam_en:1; uint32_t l2_hash_en:1; #else uint32_t l2_hash_en:1; uint32_t tcam_en:1; uint32_t tcp_cs_en:1; uint32_t force_cs_en:1; uint32_t default_dma:4; uint32_t mac_addr_en_l:24; uint32_t mac_addr_en:8; uint32_t rsrvd:24; #endif } bits; } pfc_config_t; /* * Register: TcpCtrlMask * TCP control bits mask * Description: Mask of TCP control bits to forward onto downstream * blocks The TCP packet's control bits are masked, and then bitwise * OR'd to produce a signal to the Rx DMA. Normally, all bits are * masked off except the TCP SYN bit. The Rx DMA uses this bitwise OR * for statistics. When discard = 1, the packet will be dropped if * the bitwise OR = 1. * Fields: * Drop the packet if bitwise OR of the TCP control bits masked * on = 1 * TCP end of data flag * TCP SYN flag * TCP reset flag * TCP push flag * TCP ack flag * TCP urgent flag */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:32; uint32_t rsrvd_l:25; uint32_t discard:1; uint32_t fin:1; uint32_t syn:1; uint32_t rst:1; uint32_t psh:1; uint32_t ack:1; uint32_t urg:1; #else uint32_t urg:1; uint32_t ack:1; uint32_t psh:1; uint32_t rst:1; uint32_t syn:1; uint32_t fin:1; uint32_t discard:1; uint32_t rsrvd_l:25; uint32_t rsrvd:32; #endif } bits; } tcp_ctrl_mask_t; /* * Register: SrcHashVal * Source hash Seed Value * Hash CRC seed value */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:32; uint32_t seed:32; #else uint32_t seed:32; uint32_t rsrvd:32; #endif } bits; } src_hash_val_t; /* * Register: PfcIntStatus * PFC Interrupt Status * Description: PFC interrupt status register * Fields: * triggered when packet drop log captured a drop. Part of LDF 0. * Write 1 to clear. * TCAM result lookup table parity error. Part of LDF 0. Write 1 * to clear. * VLAN table parity error. Part of LDF 0. Write 1 to clear. */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:32; uint32_t rsrvd_l:29; uint32_t pkt_drop:1; uint32_t tcam_parity_err:1; uint32_t vlan_parity_err:1; #else uint32_t vlan_parity_err:1; uint32_t tcam_parity_err:1; uint32_t pkt_drop:1; uint32_t rsrvd_l:29; uint32_t rsrvd:32; #endif } bits; } pfc_int_status_t; /* * Register: PfcDbgIntStatus * PFC Debug Interrupt Status * Description: PFC debug interrupt status mirror register. This * debug register triggers the same interrupts as those in the PFC * Interrupt Status register. Interrupts in this mirror register are * subject to the filtering of the PFC Interrupt Mask register. * Fields: * Packet drop. Part of LDF 0. * TCAM result lookup table parity error. Part of LDF 0. * VLAN table parity error. Part of LDF 0. */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:32; uint32_t rsrvd_l:29; uint32_t pkt_drop:1; uint32_t tcam_parity_err:1; uint32_t vlan_parity_err:1; #else uint32_t vlan_parity_err:1; uint32_t tcam_parity_err:1; uint32_t pkt_drop:1; uint32_t rsrvd_l:29; uint32_t rsrvd:32; #endif } bits; } pfc_dbg_int_status_t; /* * Register: PfcIntMask * PFC Interrupt Mask * Description: PFC interrupt status mask register * Fields: * mask for pktDrop capture; * TCAM result lookup table parity error mask; * VLAN table parity error mask; */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:32; uint32_t rsrvd_l:29; uint32_t pkt_drop_mask:1; uint32_t tcam_parity_err_mask:1; uint32_t vlan_parity_err_mask:1; #else uint32_t vlan_parity_err_mask:1; uint32_t tcam_parity_err_mask:1; uint32_t pkt_drop_mask:1; uint32_t rsrvd_l:29; uint32_t rsrvd:32; #endif } bits; } pfc_int_mask_t; /* * Register: PfcDropLog * Packet Drop Log * Description: Packet drop log. Log for capturing packet drops. Log * is re-armed when associated interrupt bit is cleared. * Fields: * drop because bitwise OR of the tcp control bits masked on = 1 * drop because L2 address did not match * drop because class code indicated drop * drop because TCAM result indicated drop * drop because blade was not a member of VLAN */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:32; uint32_t rsrvd_l:27; uint32_t tcp_ctrl_drop:1; uint32_t l2_addr_drop:1; uint32_t class_code_drop:1; uint32_t tcam_drop:1; uint32_t vlan_drop:1; #else uint32_t vlan_drop:1; uint32_t tcam_drop:1; uint32_t class_code_drop:1; uint32_t l2_addr_drop:1; uint32_t tcp_ctrl_drop:1; uint32_t rsrvd_l:27; uint32_t rsrvd:32; #endif } bits; } pfc_drop_log_t; /* * Register: PfcDropLogMask * Packet Drop Log Mask * Description: Mask for logging packet drop. If the drop type is * masked off, it will not trigger the drop log to capture the packet * drop * Fields: * mask drop because bitwise OR of the tcp control bits masked on * = 1 * mask drop because L2 address did not match * mask drop because class code indicated * mask drop because TCAM result indicated drop * mask drop because blade was not a member of VLAN */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:32; uint32_t rsrvd_l:27; uint32_t tcp_ctrl_drop_mask:1; uint32_t l2_addr_drop_mask:1; uint32_t class_code_drop_mask:1; uint32_t tcam_drop_mask:1; uint32_t vlan_drop_mask:1; #else uint32_t vlan_drop_mask:1; uint32_t tcam_drop_mask:1; uint32_t class_code_drop_mask:1; uint32_t l2_addr_drop_mask:1; uint32_t tcp_ctrl_drop_mask:1; uint32_t rsrvd_l:27; uint32_t rsrvd:32; #endif } bits; } pfc_drop_log_mask_t; /* * Register: PfcVlanParErrLog * VLAN Parity Error Log * Description: Log of parity errors in VLAN table. * Fields: * address of parity error. Log is cleared when corresponding * interrupt bit is cleared by writing '1'. */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:32; uint32_t rsrvd_l:20; uint32_t addr:12; #else uint32_t addr:12; uint32_t rsrvd_l:20; uint32_t rsrvd:32; #endif } bits; } pfc_vlan_par_err_log_t; /* * Register: PfcTcamParErrLog * TCAM Parity Error Log * Description: Log of parity errors in TCAM result lookup table. * Fields: * address of parity error. Log is cleared when corresponding * interrupt bit is cleared by writing '1'. */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:32; uint32_t rsrvd_l:24; uint32_t addr:8; #else uint32_t addr:8; uint32_t rsrvd_l:24; uint32_t rsrvd:32; #endif } bits; } pfc_tcam_par_err_log_t; /* * Register: PfcBadCsCounter * PFC Bad Checksum Counter * Description: Count number of bad TCP/UDP checksum. Only counted if * L2 adddress matched * Fields: * count of number of bad TCP/UDP checksums received. Clear on * read */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:32; uint32_t bad_cs_count:32; #else uint32_t bad_cs_count:32; uint32_t rsrvd:32; #endif } bits; } pfc_bad_cs_counter_t; /* * Register: PfcDropCounter * PFC Drop Counter * Description: Count number of packets dropped due to VLAN * membership, class code, TCP control bits, or TCAM results Only * counted if L2 address matched. * Fields: * Count of number of packets dropped due to VLAN, TCAM results. * Clear on read */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:32; uint32_t drop_count:32; #else uint32_t drop_count:32; uint32_t rsrvd:32; #endif } bits; } pfc_drop_counter_t; /* * Register: PfcAutoInit * PFC Auto Init * Description: PFC Auto Initialization. Writing to this register * triggers the auto initialization of the blade's TCAM entries with * 100 bits of '0' for both key and mask. TCAM lookup is disabled * during auto initialization. * Fields: * TCAM auto initialization status. 0=busy, 1=done. */ typedef union { uint64_t value; struct { #if defined(_BIG_ENDIAN) uint32_t rsrvd:32; uint32_t rsrvd_l:31; uint32_t auto_init_status:1; #else uint32_t auto_init_status:1; uint32_t rsrvd_l:31; uint32_t rsrvd:32; #endif } bits; } pfc_auto_init_t; #ifdef __cplusplus } #endif #endif /* _HXGE_PFC_HW_H */