net/mlx5: extend flow metadata support
[dpdk.git] / drivers / net / mlx5 / mlx5_flow.h
index fddc06b..aba0e4f 100644 (file)
 #include "mlx5.h"
 #include "mlx5_prm.h"
 
-enum modify_reg {
-       REG_A,
-       REG_B,
-       REG_C_0,
-       REG_C_1,
-       REG_C_2,
-       REG_C_3,
-       REG_C_4,
-       REG_C_5,
-       REG_C_6,
-       REG_C_7,
-};
-
 /* Private rte flow items. */
 enum mlx5_rte_flow_item_type {
        MLX5_RTE_FLOW_ITEM_TYPE_END = INT_MIN,
        MLX5_RTE_FLOW_ITEM_TYPE_TAG,
+       MLX5_RTE_FLOW_ITEM_TYPE_TX_QUEUE,
 };
 
-/* Private rte flow actions. */
+/* Private (internal) rte flow actions. */
 enum mlx5_rte_flow_action_type {
        MLX5_RTE_FLOW_ACTION_TYPE_END = INT_MIN,
        MLX5_RTE_FLOW_ACTION_TYPE_TAG,
+       MLX5_RTE_FLOW_ACTION_TYPE_COPY_MREG,
 };
 
 /* Matches on selected register. */
 struct mlx5_rte_flow_item_tag {
-       uint16_t id;
-       rte_be32_t data;
+       enum modify_reg id;
+       uint32_t data;
 };
 
 /* Modify selected register. */
 struct mlx5_rte_flow_action_set_tag {
-       uint16_t id;
-       rte_be32_t data;
+       enum modify_reg id;
+       uint32_t data;
+};
+
+struct mlx5_flow_action_copy_mreg {
+       enum modify_reg dst;
+       enum modify_reg src;
+};
+
+/* Matches on source queue. */
+struct mlx5_rte_flow_item_tx_queue {
+       uint32_t queue;
+};
+
+/* Feature name to allocate metadata register. */
+enum mlx5_feature_name {
+       MLX5_HAIRPIN_RX,
+       MLX5_HAIRPIN_TX,
+       MLX5_METADATA_RX,
+       MLX5_METADATA_TX,
+       MLX5_METADATA_FDB,
+       MLX5_FLOW_MARK,
+       MLX5_APP_TAG,
+       MLX5_COPY_MARK,
 };
 
 /* Pattern outer Layer bits. */
@@ -91,6 +102,7 @@ struct mlx5_rte_flow_action_set_tag {
 #define MLX5_FLOW_ITEM_METADATA (1u << 16)
 #define MLX5_FLOW_ITEM_PORT_ID (1u << 17)
 #define MLX5_FLOW_ITEM_TAG (1u << 18)
+#define MLX5_FLOW_ITEM_MARK (1u << 19)
 
 /* Pattern MISC bits. */
 #define MLX5_FLOW_LAYER_ICMP (1u << 19)
@@ -103,6 +115,9 @@ struct mlx5_rte_flow_action_set_tag {
 #define MLX5_FLOW_LAYER_NVGRE (1u << 23)
 #define MLX5_FLOW_LAYER_GENEVE (1u << 24)
 
+/* Queue items. */
+#define MLX5_FLOW_ITEM_TX_QUEUE (1u << 25)
+
 /* Outer Masks. */
 #define MLX5_FLOW_LAYER_OUTER_L3 \
        (MLX5_FLOW_LAYER_OUTER_L3_IPV4 | MLX5_FLOW_LAYER_OUTER_L3_IPV6)
@@ -180,6 +195,8 @@ struct mlx5_rte_flow_action_set_tag {
 #define MLX5_FLOW_ACTION_INC_TCP_ACK (1u << 30)
 #define MLX5_FLOW_ACTION_DEC_TCP_ACK (1u << 31)
 #define MLX5_FLOW_ACTION_SET_TAG (1ull << 32)
+#define MLX5_FLOW_ACTION_MARK_EXT (1ull << 33)
+#define MLX5_FLOW_ACTION_SET_META (1ull << 34)
 
 #define MLX5_FLOW_FATE_ACTIONS \
        (MLX5_FLOW_ACTION_DROP | MLX5_FLOW_ACTION_QUEUE | \
@@ -214,11 +231,12 @@ struct mlx5_rte_flow_action_set_tag {
                                      MLX5_FLOW_ACTION_INC_TCP_ACK | \
                                      MLX5_FLOW_ACTION_DEC_TCP_ACK | \
                                      MLX5_FLOW_ACTION_OF_SET_VLAN_VID | \
-                                     MLX5_FLOW_ACTION_SET_TAG)
+                                     MLX5_FLOW_ACTION_SET_TAG | \
+                                     MLX5_FLOW_ACTION_MARK_EXT | \
+                                     MLX5_FLOW_ACTION_SET_META)
 
 #define MLX5_FLOW_VLAN_ACTIONS (MLX5_FLOW_ACTION_OF_POP_VLAN | \
                                MLX5_FLOW_ACTION_OF_PUSH_VLAN)
-
 #ifndef IPPROTO_MPLS
 #define IPPROTO_MPLS 137
 #endif
@@ -347,8 +365,13 @@ struct mlx5_flow_dv_tag_resource {
        uint32_t tag; /**< the tag value. */
 };
 
-/* Number of modification commands. */
-#define MLX5_MODIFY_NUM 8
+/*
+ * Number of modification commands.
+ * If extensive metadata registers are supported
+ * the maximal actions amount is 16 and 8 otherwise.
+ */
+#define MLX5_MODIFY_NUM 16
+#define MLX5_MODIFY_NUM_NO_MREG 8
 
 /* Modify resource structure */
 struct mlx5_flow_dv_modify_hdr_resource {
@@ -403,7 +426,6 @@ struct mlx5_flow_dv_push_vlan_action_resource {
 
 /* DV flows structure. */
 struct mlx5_flow_dv {
-       uint64_t hash_fields; /**< Fields that participate in the hash. */
        struct mlx5_hrxq *hrxq; /**< Hash Rx queues. */
        /* Flow DV api: */
        struct mlx5_flow_dv_matcher *matcher; /**< Cache to matcher. */
@@ -422,6 +444,8 @@ struct mlx5_flow_dv {
        /**< Structure for VF VLAN workaround. */
        struct mlx5_flow_dv_push_vlan_action_resource *push_vlan_res;
        /**< Pointer to push VLAN action resource in cache. */
+       struct mlx5_flow_dv_tag_resource *tag_resource;
+       /**< pointer to the tag action. */
 #ifdef HAVE_IBV_FLOW_DV_SUPPORT
        void *actions[MLX5_DV_MAX_NUMBER_OF_ACTIONS];
        /**< Action list. */
@@ -446,17 +470,30 @@ struct mlx5_flow_verbs {
        };
        struct ibv_flow *flow; /**< Verbs flow pointer. */
        struct mlx5_hrxq *hrxq; /**< Hash Rx queue object. */
-       uint64_t hash_fields; /**< Verbs hash Rx queue hash fields. */
        struct mlx5_vf_vlan vf_vlan;
        /**< Structure for VF VLAN workaround. */
 };
 
+struct mlx5_flow_rss {
+       uint32_t level;
+       uint32_t queue_num; /**< Number of entries in @p queue. */
+       uint64_t types; /**< Specific RSS hash types (see ETH_RSS_*). */
+       uint16_t (*queue)[]; /**< Destination queues to redirect traffic to. */
+       uint8_t key[MLX5_RSS_HASH_KEY_LEN]; /**< RSS hash key. */
+};
+
 /** Device flow structure. */
 struct mlx5_flow {
        LIST_ENTRY(mlx5_flow) next;
        struct rte_flow *flow; /**< Pointer to the main flow. */
        uint64_t layers;
        /**< Bit-fields of present layers, see MLX5_FLOW_LAYER_*. */
+       uint64_t actions;
+       /**< Bit-fields of detected actions, see MLX5_FLOW_ACTION_*. */
+       uint64_t hash_fields; /**< Verbs hash Rx queue hash fields. */
+       uint8_t ingress; /**< 1 if the flow is ingress. */
+       uint32_t group; /**< The group index. */
+       uint8_t transfer; /**< 1 if the flow is E-Switch flow. */
        union {
 #ifdef HAVE_IBV_FLOW_DV_SUPPORT
                struct mlx5_flow_dv dv;
@@ -470,20 +507,12 @@ struct mlx5_flow {
 struct rte_flow {
        TAILQ_ENTRY(rte_flow) next; /**< Pointer to the next flow structure. */
        enum mlx5_flow_drv_type drv_type; /**< Driver type. */
+       struct mlx5_flow_rss rss; /**< RSS context. */
        struct mlx5_flow_counter *counter; /**< Holds flow counter. */
-       struct mlx5_flow_dv_tag_resource *tag_resource;
-       /**< pointer to the tag action. */
-       struct rte_flow_action_rss rss;/**< RSS context. */
-       uint8_t key[MLX5_RSS_HASH_KEY_LEN]; /**< RSS hash key. */
-       uint16_t (*queue)[]; /**< Destination queues to redirect traffic to. */
        LIST_HEAD(dev_flows, mlx5_flow) dev_flows;
        /**< Device flows that are part of the flow. */
-       uint64_t actions;
-       /**< Bit-fields of detected actions, see MLX5_FLOW_ACTION_*. */
        struct mlx5_fdir *fdir; /**< Pointer to associated FDIR if any. */
-       uint8_t ingress; /**< 1 if the flow is ingress. */
-       uint32_t group; /**< The group index. */
-       uint8_t transfer; /**< 1 if the flow is E-Switch flow. */
+       uint32_t hairpin_flow_id; /**< The flow id used for hairpin. */
 };
 
 typedef int (*mlx5_flow_validate_t)(struct rte_eth_dev *dev,
@@ -522,20 +551,12 @@ struct mlx5_flow_driver_ops {
        mlx5_flow_query_t query;
 };
 
+
 #define MLX5_CNT_CONTAINER(sh, batch, thread) (&(sh)->cmng.ccont \
        [(((sh)->cmng.mhi[batch] >> (thread)) & 0x1) * 2 + (batch)])
 #define MLX5_CNT_CONTAINER_UNUSED(sh, batch, thread) (&(sh)->cmng.ccont \
        [(~((sh)->cmng.mhi[batch] >> (thread)) & 0x1) * 2 + (batch)])
 
-/* ID generation structure. */
-struct mlx5_flow_id_pool {
-       uint32_t *free_arr; /**< Pointer to the a array of free values. */
-       uint32_t base_index;
-       /**< The next index that can be used without any free elements. */
-       uint32_t *curr; /**< Pointer to the index to pop. */
-       uint32_t *last; /**< Pointer to the last element in the empty arrray. */
-};
-
 /* mlx5_flow.c */
 
 struct mlx5_flow_id_pool *mlx5_flow_id_pool_alloc(void);
@@ -551,6 +572,10 @@ uint64_t mlx5_flow_hashfields_adjust(struct mlx5_flow *dev_flow, int tunnel,
                                     uint64_t hash_fields);
 uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,
                                   uint32_t subpriority);
+enum modify_reg mlx5_flow_get_reg_id(struct rte_eth_dev *dev,
+                                    enum mlx5_feature_name feature,
+                                    uint32_t id,
+                                    struct rte_flow_error *error);
 const struct rte_flow_action *mlx5_flow_find_action
                                        (const struct rte_flow_action *actions,
                                         enum rte_flow_action_type action);
@@ -599,10 +624,14 @@ int mlx5_flow_validate_item_gre_key(const struct rte_flow_item *item,
                                    struct rte_flow_error *error);
 int mlx5_flow_validate_item_ipv4(const struct rte_flow_item *item,
                                 uint64_t item_flags,
+                                uint64_t last_item,
+                                uint16_t ether_type,
                                 const struct rte_flow_item_ipv4 *acc_mask,
                                 struct rte_flow_error *error);
 int mlx5_flow_validate_item_ipv6(const struct rte_flow_item *item,
                                 uint64_t item_flags,
+                                uint64_t last_item,
+                                uint16_t ether_type,
                                 const struct rte_flow_item_ipv6 *acc_mask,
                                 struct rte_flow_error *error);
 int mlx5_flow_validate_item_mpls(struct rte_eth_dev *dev,