root/usr/src/uts/common/sys/nxge/nxge_fflp.h
/*
 * 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 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_NXGE_NXGE_FFLP_H
#define _SYS_NXGE_NXGE_FFLP_H

#ifdef  __cplusplus
extern "C" {
#endif

#include <npi_fflp.h>

#define MAX_PARTITION 8

typedef struct _fflp_errlog {
        uint32_t                vlan;
        uint32_t                tcam;
        uint32_t                hash_pio[MAX_PARTITION];
        uint32_t                hash_lookup1;
        uint32_t                hash_lookup2;
} fflp_errlog_t, *p_fflp_errlog_t;

typedef struct _fflp_stats {
        uint32_t                tcam_entries;
        uint32_t                fcram_entries;
        uint32_t                tcam_parity_err;
        uint32_t                tcam_ecc_err;
        uint32_t                vlan_parity_err;
        uint32_t                hash_lookup_err;
        uint32_t                hash_pio_err[MAX_PARTITION];
        fflp_errlog_t           errlog;
} nxge_fflp_stats_t, *p_nxge_fflp_stats_t;

/*
 * The FCRAM (hash table) cosnists of 1 meg cells
 * each 64 byte wide. Each cell can hold either of:
 * 2 IPV4 Exact match entry (each 32 bytes)
 * 1 IPV6 Exact match entry (each 56 bytes) and
 *    1 Optimistic match entry (each 8 bytes)
 * 8 Optimistic match entries (each 8 bytes)
 * In the case IPV4 Exact match, half of the cell
 * (the first or the second 32 bytes) could be used
 * to hold 4 Optimistic matches
 */

#define FCRAM_CELL_EMPTY        0x00
#define FCRAM_CELL_IPV4_IPV4    0x01
#define FCRAM_CELL_IPV4_OPT     0x02
#define FCRAM_CELL_OPT_IPV4     0x04
#define FCRAM_CELL_IPV6_OPT     0x08
#define FCRAM_CELL_OPT_OPT      0x10


#define FCRAM_SUBAREA0_OCCUPIED 0x01
#define FCRAM_SUBAREA1_OCCUPIED 0x02
#define FCRAM_SUBAREA2_OCCUPIED 0x04
#define FCRAM_SUBAREA3_OCCUPIED 0x08

#define FCRAM_SUBAREA4_OCCUPIED 0x10
#define FCRAM_SUBAREA5_OCCUPIED 0x20
#define FCRAM_SUBAREA6_OCCUPIED 0x40
#define FCRAM_SUBAREA7_OCCUPIED 0x20

#define FCRAM_IPV4_SUBAREA0_OCCUPIED \
        (FCRAM_SUBAREA0_OCCUPIED | FCRAM_SUBAREA1_OCCUPIED | \
        FCRAM_SUBAREA2_OCCUPIED | FCRAM_SUBAREA3_OCCUPIED)

#define FCRAM_IPV4_SUBAREA4_OCCUPIED \
        (FCRAM_SUBAREA4_OCCUPIED | FCRAM_SUBAREA5_OCCUPIED | \
        FCRAM_SUBAREA6_OCCUPIED | FCRAM_SUBAREA7_OCCUPIED)


#define FCRAM_IPV6_SUBAREA0_OCCUPIED \
        (FCRAM_SUBAREA0_OCCUPIED | FCRAM_SUBAREA1_OCCUPIED | \
        FCRAM_SUBAREA2_OCCUPIED | FCRAM_SUBAREA3_OCCUPIED | \
        FCRAM_SUBAREA4_OCCUPIED | FCRAM_SUBAREA5_OCCUPIED | \
        FCRAM_SUBAREA6_OCCUPIED)

        /*
         * The current occupancy state of each FCRAM cell isy
         * described by the fcram_cell_t data structure.
         * The "type" field denotes the type of entry (or combination)
         * the cell holds (FCRAM_CELL_EMPTY ...... FCRAM_CELL_OPT_OPT)
         * The "occupied" field indicates if individual 8 bytes (subareas)
         * with in the cell are occupied
         */

typedef struct _fcram_cell {
        uint32_t                type:8;
        uint32_t                occupied:8;
        uint32_t                shadow_loc:16;
} fcram_cell_t, *p_fcram_cell_t;

typedef struct _fcram_parition {
        uint8_t                 id;
        uint8_t                 base;
        uint8_t                 mask;
        uint8_t                 reloc;
        uint32_t                flags;
#define HASH_PARTITION_ENABLED 1
        uint32_t                offset;
        uint32_t                size;
} fcram_parition_t, *p_fcram_partition_t;


typedef struct _tcam_flow_spec {
        tcam_entry_t tce;
        uint64_t flags;
        uint64_t user_info;
        uint8_t valid;
} tcam_flow_spec_t, *p_tcam_flow_spec_t;


/*
 * Used for configuration.
 * ndd as well nxge.conf use the following definitions
 */

#define NXGE_CLASS_CONFIG_PARAMS        20
/* Used for ip class flow key and tcam key config */

#define NXGE_CLASS_TCAM_LOOKUP          0x0001
#define NXGE_CLASS_TCAM_USE_SRC_ADDR    0x0002
#define NXGE_CLASS_FLOW_USE_PORTNUM     0x0010
#define NXGE_CLASS_FLOW_USE_L2DA        0x0020
#define NXGE_CLASS_FLOW_USE_VLAN        0x0040
#define NXGE_CLASS_FLOW_USE_PROTO       0x0080
#define NXGE_CLASS_FLOW_USE_IPSRC       0x0100
#define NXGE_CLASS_FLOW_USE_IPDST       0x0200
#define NXGE_CLASS_FLOW_USE_SRC_PORT    0x0400
#define NXGE_CLASS_FLOW_USE_DST_PORT    0x0800
#define NXGE_CLASS_DISCARD              0x80000000

/* these are used for quick configs */
#define NXGE_CLASS_FLOW_WEB_SERVER      NXGE_CLASS_FLOW_USE_IPSRC | \
                                        NXGE_CLASS_FLOW_USE_SRC_PORT

#define NXGE_CLASS_FLOW_GEN_SERVER      NXGE_CLASS_FLOW_USE_IPSRC | \
                                        NXGE_CLASS_FLOW_USE_IPDST | \
                                        NXGE_CLASS_FLOW_USE_SRC_PORT |  \
                                        NXGE_CLASS_FLOW_USE_DST_PORT | \
                                        NXGE_CLASS_FLOW_USE_PROTO | \
                                        NXGE_CLASS_FLOW_USE_L2DA | \
                                        NXGE_CLASS_FLOW_USE_VLAN

/*
 * used for use classes
 */


/* Ethernet Classes */
#define NXGE_CLASS_CFG_ETHER_TYPE_MASK          0x0000FFFF
#define NXGE_CLASS_CFG_ETHER_ENABLE_MASK        0x40000000

/* IP Classes */
#define NXGE_CLASS_CFG_IP_TOS_MASK              0x000000FF
#define NXGE_CLASS_CFG_IP_TOS_SHIFT             0
#define NXGE_CLASS_CFG_IP_TOS_MASK_MASK         0x0000FF00
#define NXGE_CLASS_CFG_IP_TOS_MASK_SHIFT        8
#define NXGE_CLASS_CFG_IP_PROTO_MASK            0x00FFFF00
#define NXGE_CLASS_CFG_IP_PROTO_SHIFT           16

#define NXGE_CLASS_CFG_IP_IPV6_MASK             0x01000000
#define NXGE_CLASS_CFG_IP_PARAM_MASK    NXGE_CLASS_CFG_IP_TOS_MASK | \
                                        NXGE_CLASS_CFG_IP_TOS_MASK_MASK | \
                                        NXGE_CLASS_CFG_IP_PROTO_MASK | \
                                        NXGE_CLASS_CFG_IP_IPV6_MASK

#define NXGE_CLASS_CFG_IP_ENABLE_MASK           0x40000000

typedef struct _vlan_rdcgrp_map {
        uint32_t                rsrvd:8;
        uint32_t                vid:16;
        uint32_t                rdc_grp:8;
}       vlan_rdcgrp_map_t, *p_vlan_rdcgrp_map_t;

#define NXGE_INIT_VLAN_RDCG_TBL 32

typedef struct _nxge_classify {
        nxge_os_mutex_t         tcam_lock;
        nxge_os_mutex_t         fcram_lock;
        nxge_os_mutex_t         hash_lock[MAX_PARTITION];
        uint32_t                tcam_size;
        uint32_t                tcam_entry_cnt;
        uint32_t                state;
#define NXGE_FFLP_HW_RESET      0x1
#define NXGE_FFLP_HW_INIT       0x2
#define NXGE_FFLP_SW_INIT       0x4
#define NXGE_FFLP_FCRAM_PART    0x80000000
        p_nxge_fflp_stats_t     fflp_stats;

        tcam_flow_spec_t        *tcam_entries;
        uint8_t                 tcam_top;
        uint8_t                 tcam_location;
        uint64_t                tcam_l2_prog_cls[NXGE_L2_PROG_CLS];
        uint64_t                tcam_l3_prog_cls[NXGE_L3_PROG_CLS];
        uint64_t                tcam_key[12];
        uint64_t                flow_key[12];
        uint16_t                tcam_l3_prog_cls_refcnt[NXGE_L3_PROG_CLS];
        uint8_t                 tcam_l3_prog_cls_pid[NXGE_L3_PROG_CLS];
#define NXGE_FLOW_NO_SUPPORT  0x0
#define NXGE_FLOW_USE_TCAM    0x1
#define NXGE_FLOW_USE_FCRAM   0x2
#define NXGE_FLOW_USE_TCAM_FCRAM   0x3

#define NXGE_FLOW_COMPUTE_H1   0x10
#define NXGE_FLOW_COMPUTE_H2   0x20
        uint8_t fragment_bug;
        uint8_t fragment_bug_location;
        fcram_cell_t            *hash_table; /* allocated for Neptune only */
        fcram_parition_t    partition[MAX_PARTITION];
} nxge_classify_t, *p_nxge_classify_t;

#ifdef  __cplusplus
}
#endif

#endif  /* _SYS_NXGE_NXGE_FFLP_H */