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