fix typos using codespell utility
[dpdk.git] / drivers / net / i40e / i40e_ethdev.h
index e0c8574..183dc17 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  *   BSD LICENSE
  *
- *   Copyright(c) 2010-2015 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2010-2017 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
@@ -251,6 +251,13 @@ enum i40e_flxpld_layer_idx {
        I40E_INSET_FLEX_PAYLOAD_W5 | I40E_INSET_FLEX_PAYLOAD_W6 | \
        I40E_INSET_FLEX_PAYLOAD_W7 | I40E_INSET_FLEX_PAYLOAD_W8)
 
+/**
+ * The overhead from MTU to max frame size.
+ * Considering QinQ packet, the VLAN tag needs to be counted twice.
+ */
+#define I40E_ETH_OVERHEAD \
+       (ETHER_HDR_LEN + ETHER_CRC_LEN + I40E_VLAN_TAG_SIZE * 2)
+
 struct i40e_adapter;
 
 /**
@@ -398,7 +405,7 @@ enum I40E_VF_STATE {
 struct i40e_pf_vf {
        struct i40e_pf *pf;
        struct i40e_vsi *vsi;
-       enum I40E_VF_STATE state; /* The number of queue pairs availiable */
+       enum I40E_VF_STATE state; /* The number of queue pairs available */
        uint16_t vf_idx; /* VF index in pf->vfs */
        uint16_t lan_nb_qps; /* Actual queues allocated */
        uint16_t reset_cnt; /* Total vf reset times */
@@ -424,6 +431,24 @@ struct i40e_vmdq_info {
        struct i40e_vsi *vsi;
 };
 
+#define I40E_FDIR_MAX_FLEXLEN      16  /**< Max length of flexbytes. */
+#define I40E_MAX_FLX_SOURCE_OFF    480
+#define NONUSE_FLX_PIT_DEST_OFF 63
+#define NONUSE_FLX_PIT_FSIZE    1
+#define I40E_FLX_OFFSET_IN_FIELD_VECTOR   50
+#define MK_FLX_PIT(src_offset, fsize, dst_offset) ( \
+       (((src_offset) << I40E_PRTQF_FLX_PIT_SOURCE_OFF_SHIFT) & \
+               I40E_PRTQF_FLX_PIT_SOURCE_OFF_MASK) | \
+       (((fsize) << I40E_PRTQF_FLX_PIT_FSIZE_SHIFT) & \
+                       I40E_PRTQF_FLX_PIT_FSIZE_MASK) | \
+       ((((dst_offset) == NONUSE_FLX_PIT_DEST_OFF ? \
+                       NONUSE_FLX_PIT_DEST_OFF : \
+                       ((dst_offset) + I40E_FLX_OFFSET_IN_FIELD_VECTOR)) << \
+                       I40E_PRTQF_FLX_PIT_DEST_OFF_SHIFT) & \
+                       I40E_PRTQF_FLX_PIT_DEST_OFF_MASK))
+#define I40E_WORD(hi, lo) (uint16_t)((((hi) << 8) & 0xFF00) | ((lo) & 0xFF))
+#define I40E_FLEX_WORD_MASK(off) (0x80 >> (off))
+
 /*
  * Structure to store flex pit for flow diretor.
  */
@@ -435,6 +460,7 @@ struct i40e_fdir_flex_pit {
 
 struct i40e_fdir_flex_mask {
        uint8_t word_mask;  /**< Bit i enables word i of flexible payload */
+       uint8_t nb_bitmask;
        struct {
                uint8_t offset;
                uint16_t mask;
@@ -472,6 +498,12 @@ struct i40e_fdir_info {
        struct i40e_fdir_filter_list fdir_list;
        struct i40e_fdir_filter **hash_map;
        struct rte_hash *hash_table;
+
+       /* Mark if flex pit and mask is set */
+       bool flex_pit_flag[I40E_MAX_FLXPLD_LAYER];
+       bool flex_mask_flag[I40E_FILTER_PCTYPE_MAX];
+
+       bool inset_flag[I40E_FILTER_PCTYPE_MAX]; /* Mark if input set is set */
 };
 
 /* Ethertype filter number HW supports */
@@ -501,6 +533,15 @@ struct i40e_ethertype_rule {
 /* Tunnel filter number HW supports */
 #define I40E_MAX_TUNNEL_FILTER_NUM 400
 
+#define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_FV_TEID_WORD0 44
+#define I40E_AQC_REPLACE_CLOUD_CMD_INPUT_FV_TEID_WORD1 45
+#define I40E_AQC_ADD_CLOUD_TNL_TYPE_MPLSoUDP 8
+#define I40E_AQC_ADD_CLOUD_TNL_TYPE_MPLSoGRE 9
+#define I40E_AQC_ADD_CLOUD_FILTER_CUSTOM_QINQ 0x10
+#define I40E_AQC_ADD_CLOUD_FILTER_TEID_MPLSoUDP 0x11
+#define I40E_AQC_ADD_CLOUD_FILTER_TEID_MPLSoGRE 0x12
+#define I40E_AQC_ADD_L1_FILTER_TEID_MPLS 0x11
+
 enum i40e_tunnel_iptype {
        I40E_TUNNEL_IPTYPE_IPV4,
        I40E_TUNNEL_IPTYPE_IPV6,
@@ -514,11 +555,14 @@ struct i40e_tunnel_filter_input {
        enum i40e_tunnel_iptype ip_type;
        uint16_t flags;          /* Filter type flag */
        uint32_t tenant_id;      /* Tenant id to match */
+       uint16_t general_fields[32];  /* Big buffer */
 };
 
 struct i40e_tunnel_filter {
        TAILQ_ENTRY(i40e_tunnel_filter) rules;
        struct i40e_tunnel_filter_input input;
+       uint8_t is_to_vf; /* 0 - to PF, 1 - to VF */
+       uint16_t vf_id;   /* VF id, avaiblable when is_to_vf is 1. */
        uint16_t queue; /* Queue assigned to when match */
 };
 
@@ -530,6 +574,50 @@ struct i40e_tunnel_rule {
        struct rte_hash *hash_table;
 };
 
+/**
+ * Tunnel type.
+ */
+enum i40e_tunnel_type {
+       I40E_TUNNEL_TYPE_NONE = 0,
+       I40E_TUNNEL_TYPE_VXLAN,
+       I40E_TUNNEL_TYPE_GENEVE,
+       I40E_TUNNEL_TYPE_TEREDO,
+       I40E_TUNNEL_TYPE_NVGRE,
+       I40E_TUNNEL_TYPE_IP_IN_GRE,
+       I40E_L2_TUNNEL_TYPE_E_TAG,
+       I40E_TUNNEL_TYPE_MPLSoUDP,
+       I40E_TUNNEL_TYPE_MPLSoGRE,
+       I40E_TUNNEL_TYPE_QINQ,
+       I40E_TUNNEL_TYPE_MAX,
+};
+
+/**
+ * Tunneling Packet filter configuration.
+ */
+struct i40e_tunnel_filter_conf {
+       struct ether_addr outer_mac;    /**< Outer MAC address to match. */
+       struct ether_addr inner_mac;    /**< Inner MAC address to match. */
+       uint16_t inner_vlan;            /**< Inner VLAN to match. */
+       uint32_t outer_vlan;            /**< Outer VLAN to match */
+       enum i40e_tunnel_iptype ip_type; /**< IP address type. */
+       /**
+        * Outer destination IP address to match if ETH_TUNNEL_FILTER_OIP
+        * is set in filter_type, or inner destination IP address to match
+        * if ETH_TUNNEL_FILTER_IIP is set in filter_type.
+        */
+       union {
+               uint32_t ipv4_addr;     /**< IPv4 address in big endian. */
+               uint32_t ipv6_addr[4];  /**< IPv6 address in big endian. */
+       } ip_addr;
+       /** Flags from ETH_TUNNEL_FILTER_XX - see above. */
+       uint16_t filter_type;
+       enum i40e_tunnel_type tunnel_type; /**< Tunnel Type. */
+       uint32_t tenant_id;     /**< Tenant ID to match. VNI, GRE key... */
+       uint16_t queue_id;      /**< Queue assigned to if match. */
+       uint8_t is_to_vf;       /**< 0 - to PF, 1 - to VF */
+       uint16_t vf_id;         /**< VF id, avaiblable when is_to_vf is 1. */
+};
+
 #define I40E_MIRROR_MAX_ENTRIES_PER_RULE   64
 #define I40E_MAX_MIRROR_RULES           64
 /*
@@ -576,6 +664,11 @@ struct i40e_pf {
 
        struct i40e_hw_port_stats stats_offset;
        struct i40e_hw_port_stats stats;
+       /* internal packet byte count, it should be excluded from the total */
+       uint64_t internal_rx_bytes;
+       uint64_t internal_tx_bytes;
+       uint64_t internal_rx_bytes_offset;
+       uint64_t internal_tx_bytes_offset;
        bool offset_loaded;
 
        struct rte_eth_dev_data *dev_data; /* Pointer to the device data */
@@ -620,6 +713,8 @@ struct i40e_pf {
        /* The floating enable flag for the specific VF */
        bool floating_veb_list[I40E_MAX_VF];
        struct i40e_flow_list flow_list;
+       bool mpls_replace_flag;  /* 1 - MPLS filter replace is done */
+       bool qinq_replace_flag;  /* QINQ filter replace is done */
 };
 
 enum pending_msg {
@@ -686,6 +781,8 @@ struct i40e_vf {
        uint64_t flags;
 };
 
+#define I40E_MAX_PKT_TYPE 256
+
 /*
  * Structure to store private data for each PF/VF instance.
  */
@@ -710,6 +807,9 @@ struct i40e_adapter {
        struct rte_timecounter systime_tc;
        struct rte_timecounter rx_tstamp_tc;
        struct rte_timecounter tx_tstamp_tc;
+
+       /* ptype mapping table */
+       uint32_t ptype_tbl[I40E_MAX_PKT_TYPE] __rte_cache_min_aligned;
 };
 
 extern const struct rte_flow_ops i40e_flow_ops;
@@ -718,6 +818,7 @@ union i40e_filter_t {
        struct rte_eth_ethertype_filter ethertype_filter;
        struct rte_eth_fdir_filter fdir_filter;
        struct rte_eth_tunnel_filter_conf tunnel_filter;
+       struct i40e_tunnel_filter_conf consistent_tunnel_filter;
 };
 
 typedef int (*parse_filter_t)(struct rte_eth_dev *dev,
@@ -746,8 +847,7 @@ int i40e_vsi_delete_mac(struct i40e_vsi *vsi, struct ether_addr *addr);
 void i40e_update_vsi_stats(struct i40e_vsi *vsi);
 void i40e_pf_disable_irq0(struct i40e_hw *hw);
 void i40e_pf_enable_irq0(struct i40e_hw *hw);
-int i40e_dev_link_update(struct rte_eth_dev *dev,
-                        __rte_unused int wait_to_complete);
+int i40e_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete);
 void i40e_vsi_queues_bind_intr(struct i40e_vsi *vsi);
 void i40e_vsi_queues_unbind_intr(struct i40e_vsi *vsi);
 int i40e_vsi_vlan_pvid_set(struct i40e_vsi *vsi,
@@ -806,10 +906,27 @@ int i40e_add_del_fdir_filter(struct rte_eth_dev *dev,
 int i40e_dev_tunnel_filter_set(struct i40e_pf *pf,
                               struct rte_eth_tunnel_filter_conf *tunnel_filter,
                               uint8_t add);
+int i40e_dev_consistent_tunnel_filter_set(struct i40e_pf *pf,
+                                 struct i40e_tunnel_filter_conf *tunnel_filter,
+                                 uint8_t add);
 int i40e_fdir_flush(struct rte_eth_dev *dev);
-
-#define I40E_DEV_TO_PCI(eth_dev) \
-       RTE_DEV_TO_PCI((eth_dev)->device)
+int i40e_find_all_vlan_for_mac(struct i40e_vsi *vsi,
+                              struct i40e_macvlan_filter *mv_f,
+                              int num, struct ether_addr *addr);
+int i40e_remove_macvlan_filters(struct i40e_vsi *vsi,
+                               struct i40e_macvlan_filter *filter,
+                               int total);
+void i40e_set_vlan_filter(struct i40e_vsi *vsi, uint16_t vlan_id, bool on);
+int i40e_add_macvlan_filters(struct i40e_vsi *vsi,
+                            struct i40e_macvlan_filter *filter,
+                            int total);
+bool is_i40e_supported(struct rte_eth_dev *dev);
+int i40e_validate_input_set(enum i40e_filter_pctype pctype,
+                           enum rte_filter_type filter, uint64_t inset);
+int i40e_generate_inset_mask_reg(uint64_t inset, uint32_t *mask,
+                                uint8_t nb_elem);
+uint64_t i40e_translate_input_set_reg(enum i40e_mac_type type, uint64_t input);
+void i40e_check_write_reg(struct i40e_hw *hw, uint32_t addr, uint32_t val);
 
 /* I40E_DEV_PRIVATE_TO */
 #define I40E_DEV_PRIVATE_TO_PF(adapter) \