New upstream version 17.11-rc3
[deb_dpdk.git] / drivers / net / sfc / base / efx.h
index 7eabc37..57fba05 100644 (file)
@@ -1088,6 +1088,14 @@ efx_bist_stop(
 #define        EFX_FEATURE_FW_ASSISTED_TSO_V2  0x00002000
 #define        EFX_FEATURE_PACKED_STREAM       0x00004000
 
+typedef enum efx_tunnel_protocol_e {
+       EFX_TUNNEL_PROTOCOL_NONE = 0,
+       EFX_TUNNEL_PROTOCOL_VXLAN,
+       EFX_TUNNEL_PROTOCOL_GENEVE,
+       EFX_TUNNEL_PROTOCOL_NVGRE,
+       EFX_TUNNEL_NPROTOS
+} efx_tunnel_protocol_t;
+
 typedef struct efx_nic_cfg_s {
        uint32_t                enc_board_type;
        uint32_t                enc_phy_type;
@@ -1119,6 +1127,7 @@ typedef struct efx_nic_cfg_s {
        uint32_t                enc_rx_prefix_size;
        uint32_t                enc_rx_buf_align_start;
        uint32_t                enc_rx_buf_align_end;
+       uint32_t                enc_rx_scale_max_exclusive_contexts;
 #if EFSYS_OPT_LOOPBACK
        efx_qword_t             enc_loopback_types[EFX_LINK_NMODES];
 #endif /* EFSYS_OPT_LOOPBACK */
@@ -1187,6 +1196,7 @@ typedef struct efx_nic_cfg_s {
        boolean_t               enc_rx_var_packed_stream_supported;
        boolean_t               enc_pm_and_rxdp_counters;
        boolean_t               enc_mac_stats_40g_tx_size_bins;
+       uint32_t                enc_tunnel_encapsulations_supported;
        /* External port identifier */
        uint8_t                 enc_external_port;
        uint32_t                enc_mcdi_max_payload_length;
@@ -1873,6 +1883,9 @@ efx_rx_scatter_enable(
        __in            unsigned int buf_size);
 #endif /* EFSYS_OPT_RX_SCATTER */
 
+/* Handle to represent use of the default RSS context. */
+#define        EFX_RSS_CONTEXT_DEFAULT 0xffffffff
+
 #if EFSYS_OPT_RX_SCALE
 
 typedef enum efx_rx_hash_alg_e {
@@ -1892,30 +1905,44 @@ typedef enum efx_rx_hash_support_e {
        EFX_RX_HASH_AVAILABLE           /* Insert hash with/without RSS */
 } efx_rx_hash_support_t;
 
+#define        EFX_RSS_KEY_SIZE        40      /* RSS key size (bytes) */
 #define        EFX_RSS_TBL_SIZE        128     /* Rows in RX indirection table */
 #define        EFX_MAXRSS              64      /* RX indirection entry range */
 #define        EFX_MAXRSS_LEGACY       16      /* See bug16611 and bug17213 */
 
-typedef enum efx_rx_scale_support_e {
-       EFX_RX_SCALE_UNAVAILABLE = 0,   /* Not supported */
+typedef enum efx_rx_scale_context_type_e {
+       EFX_RX_SCALE_UNAVAILABLE = 0,   /* No RX scale context */
        EFX_RX_SCALE_EXCLUSIVE,         /* Writable key/indirection table */
        EFX_RX_SCALE_SHARED             /* Read-only key/indirection table */
-} efx_rx_scale_support_t;
+} efx_rx_scale_context_type_t;
 
 extern __checkReturn   efx_rc_t
-efx_rx_hash_support_get(
+efx_rx_hash_default_support_get(
        __in            efx_nic_t *enp,
        __out           efx_rx_hash_support_t *supportp);
 
 
 extern __checkReturn   efx_rc_t
-efx_rx_scale_support_get(
+efx_rx_scale_default_support_get(
+       __in            efx_nic_t *enp,
+       __out           efx_rx_scale_context_type_t *typep);
+
+extern __checkReturn   efx_rc_t
+efx_rx_scale_context_alloc(
        __in            efx_nic_t *enp,
-       __out           efx_rx_scale_support_t *supportp);
+       __in            efx_rx_scale_context_type_t type,
+       __in            uint32_t num_queues,
+       __out           uint32_t *rss_contextp);
+
+extern __checkReturn   efx_rc_t
+efx_rx_scale_context_free(
+       __in            efx_nic_t *enp,
+       __in            uint32_t rss_context);
 
 extern __checkReturn   efx_rc_t
 efx_rx_scale_mode_set(
        __in    efx_nic_t *enp,
+       __in    uint32_t rss_context,
        __in    efx_rx_hash_alg_t alg,
        __in    efx_rx_hash_type_t type,
        __in    boolean_t insert);
@@ -1923,12 +1950,14 @@ efx_rx_scale_mode_set(
 extern __checkReturn   efx_rc_t
 efx_rx_scale_tbl_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in_ecount(n)  unsigned int *table,
        __in            size_t n);
 
 extern __checkReturn   efx_rc_t
 efx_rx_scale_key_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in_ecount(n)  uint8_t *key,
        __in            size_t n);
 
@@ -2214,6 +2243,7 @@ efx_tx_qdestroy(
 
 #define        EFX_IPPROTO_TCP 6
 #define        EFX_IPPROTO_UDP 17
+#define        EFX_IPPROTO_GRE 47
 
 /* Use RSS to spread across multiple queues */
 #define        EFX_FILTER_FLAG_RX_RSS          0x01
@@ -2232,6 +2262,10 @@ efx_tx_qdestroy(
 
 typedef unsigned int efx_filter_flags_t;
 
+/*
+ * Flags which specify the fields to match on. The values are the same as in the
+ * MC_CMD_FILTER_OP/MC_CMD_FILTER_OP_EXT commands.
+ */
 typedef enum efx_filter_match_flags_e {
        EFX_FILTER_MATCH_REM_HOST = 0x0001,     /* Match by remote IP host
                                                 * address */
@@ -2246,6 +2280,10 @@ typedef enum efx_filter_match_flags_e {
        EFX_FILTER_MATCH_OUTER_VID = 0x0100,    /* Match by outer VLAN ID */
        EFX_FILTER_MATCH_IP_PROTO = 0x0200,     /* Match by IP transport
                                                 * protocol */
+       /* For encapsulated packets, match all multicast inner frames */
+       EFX_FILTER_MATCH_IFRM_UNKNOWN_MCAST_DST = 0x01000000,
+       /* For encapsulated packets, match all unicast inner frames */
+       EFX_FILTER_MATCH_IFRM_UNKNOWN_UCAST_DST = 0x02000000,
        /* Match otherwise-unmatched multicast and broadcast packets */
        EFX_FILTER_MATCH_UNKNOWN_MCAST_DST = 0x40000000,
        /* Match otherwise-unmatched unicast packets */
@@ -2271,26 +2309,26 @@ typedef enum efx_filter_priority_s {
  */
 
 typedef struct efx_filter_spec_s {
-       uint32_t        efs_match_flags;
-       uint32_t        efs_priority:2;
-       uint32_t        efs_flags:6;
-       uint32_t        efs_dmaq_id:12;
-       uint32_t        efs_rss_context;
-       uint16_t        efs_outer_vid;
-       uint16_t        efs_inner_vid;
-       uint8_t         efs_loc_mac[EFX_MAC_ADDR_LEN];
-       uint8_t         efs_rem_mac[EFX_MAC_ADDR_LEN];
-       uint16_t        efs_ether_type;
-       uint8_t         efs_ip_proto;
-       uint16_t        efs_loc_port;
-       uint16_t        efs_rem_port;
-       efx_oword_t     efs_rem_host;
-       efx_oword_t     efs_loc_host;
+       uint32_t                efs_match_flags;
+       uint32_t                efs_priority:2;
+       uint32_t                efs_flags:6;
+       uint32_t                efs_dmaq_id:12;
+       uint32_t                efs_rss_context;
+       uint16_t                efs_outer_vid;
+       uint16_t                efs_inner_vid;
+       uint8_t                 efs_loc_mac[EFX_MAC_ADDR_LEN];
+       uint8_t                 efs_rem_mac[EFX_MAC_ADDR_LEN];
+       uint16_t                efs_ether_type;
+       uint8_t                 efs_ip_proto;
+       efx_tunnel_protocol_t   efs_encap_type;
+       uint16_t                efs_loc_port;
+       uint16_t                efs_rem_port;
+       efx_oword_t             efs_rem_host;
+       efx_oword_t             efs_loc_host;
 } efx_filter_spec_t;
 
 
 /* Default values for use in filter specifications */
-#define        EFX_FILTER_SPEC_RSS_CONTEXT_DEFAULT     0xffffffff
 #define        EFX_FILTER_SPEC_RX_DMAQ_ID_DROP         0xfff
 #define        EFX_FILTER_SPEC_VID_UNSPEC              0xffff
 
@@ -2357,6 +2395,11 @@ efx_filter_spec_set_eth_local(
        __in            uint16_t vid,
        __in            const uint8_t *addr);
 
+extern                 void
+efx_filter_spec_set_ether_type(
+       __inout         efx_filter_spec_t *spec,
+       __in            uint16_t ether_type);
+
 extern __checkReturn   efx_rc_t
 efx_filter_spec_set_uc_def(
        __inout         efx_filter_spec_t *spec);
@@ -2365,6 +2408,24 @@ extern   __checkReturn   efx_rc_t
 efx_filter_spec_set_mc_def(
        __inout         efx_filter_spec_t *spec);
 
+typedef enum efx_filter_inner_frame_match_e {
+       EFX_FILTER_INNER_FRAME_MATCH_OTHER = 0,
+       EFX_FILTER_INNER_FRAME_MATCH_UNKNOWN_MCAST_DST,
+       EFX_FILTER_INNER_FRAME_MATCH_UNKNOWN_UCAST_DST
+} efx_filter_inner_frame_match_t;
+
+extern __checkReturn   efx_rc_t
+efx_filter_spec_set_encap_type(
+       __inout         efx_filter_spec_t *spec,
+       __in            efx_tunnel_protocol_t encap_type,
+       __in            efx_filter_inner_frame_match_t inner_frame_match);
+
+#if EFSYS_OPT_RX_SCALE
+extern __checkReturn   efx_rc_t
+efx_filter_spec_set_rss_context(
+       __inout         efx_filter_spec_t *spec,
+       __in            uint32_t rss_context);
+#endif
 #endif /* EFSYS_OPT_FILTER */
 
 /* HASH */