net/mlx5: use indexed pool as id generator
[dpdk.git] / drivers / net / mlx5 / mlx5.h
index 944e177..5bda233 100644 (file)
@@ -47,6 +47,9 @@ enum mlx5_ipool_index {
        MLX5_IPOOL_HRXQ, /* Pool for hrxq resource. */
        MLX5_IPOOL_MLX5_FLOW, /* Pool for mlx5 flow handle. */
        MLX5_IPOOL_RTE_FLOW, /* Pool for rte_flow. */
+       MLX5_IPOOL_RSS_EXPANTION_FLOW_ID, /* Pool for Queue/RSS flow ID. */
+       MLX5_IPOOL_TUNNEL_ID, /* Pool for flow tunnel ID. */
+       MLX5_IPOOL_TNL_TBL_ID, /* Pool for tunnel table ID. */
        MLX5_IPOOL_MAX,
 };
 
@@ -164,6 +167,9 @@ struct mlx5_stats_ctrl {
 /* Maximal size of aggregated LRO packet. */
 #define MLX5_MAX_LRO_SIZE (UINT8_MAX * MLX5_LRO_SEG_CHUNK_SIZE)
 
+/* Maximal number of segments to split. */
+#define MLX5_MAX_RXQ_NSEG (1u << MLX5_MAX_LOG_RQ_SEGS)
+
 /* LRO configurations structure. */
 struct mlx5_lro_config {
        uint32_t supported:1; /* Whether LRO is supported. */
@@ -208,6 +214,7 @@ struct mlx5_dev_config {
        unsigned int rt_timestamp:1; /* realtime timestamp format. */
        unsigned int sys_mem_en:1; /* The default memory allocator. */
        unsigned int decap_en:1; /* Whether decap will be used or not. */
+       unsigned int dv_miss_info:1; /* restore packet after partial hw miss */
        struct {
                unsigned int enabled:1; /* Whether MPRQ is enabled. */
                unsigned int stride_num_n; /* Number of strides. */
@@ -398,10 +405,7 @@ TAILQ_HEAD(mlx5_counters, mlx5_flow_counter);
 struct mlx5_flow_counter_pool {
        TAILQ_ENTRY(mlx5_flow_counter_pool) next;
        struct mlx5_counters counters[2]; /* Free counter list. */
-       union {
-               struct mlx5_devx_obj *min_dcs;
-               rte_atomic64_t a64_dcs;
-       };
+       struct mlx5_devx_obj *min_dcs;
        /* The devx object of the minimum counter ID. */
        uint64_t time_of_last_age_check;
        /* System time (from rte_rdtsc()) read in the last aging check. */
@@ -460,7 +464,7 @@ struct mlx5_flow_counter_mng {
 /* Default miss action resource structure. */
 struct mlx5_flow_default_miss_resource {
        void *action; /* Pointer to the rdma-core action. */
-       rte_atomic32_t refcnt; /* Default miss action reference counter. */
+       uint32_t refcnt; /* Default miss action reference counter. */
 };
 
 #define MLX5_AGE_EVENT_NEW             1
@@ -511,7 +515,7 @@ union mlx5_flow_tbl_key {
 /* Table structure. */
 struct mlx5_flow_tbl_resource {
        void *obj; /**< Pointer to DR table object. */
-       rte_atomic32_t refcnt; /**< Reference counter. */
+       uint32_t refcnt; /**< Reference counter. */
 };
 
 #define MLX5_MAX_TABLES UINT16_MAX
@@ -644,6 +648,7 @@ struct mlx5_dev_ctx_shared {
        /* UAR same-page access control required in 32bit implementations. */
 #endif
        struct mlx5_hlist *flow_tbls;
+       struct mlx5_flow_tunnel_hub *tunnel_hub;
        /* Direct Rules tables for FDB, NIC TX+RX */
        void *esw_drop_action; /* Pointer to DR E-Switch drop action. */
        void *pop_vlan_action; /* Pointer to DR pop VLAN action. */
@@ -666,7 +671,6 @@ struct mlx5_dev_ctx_shared {
        void *devx_comp; /* DEVX async comp obj. */
        struct mlx5_devx_obj *tis; /* TIS object. */
        struct mlx5_devx_obj *td; /* Transport domain. */
-       struct mlx5_flow_id_pool *flow_id_pool; /* Flow ID pool. */
        void *tx_uar; /* Tx/packet pacing shared UAR. */
        struct mlx5_flex_parser_profiles fp[MLX5_FLEX_PARSER_MAX];
        /* Flex parser profiles information. */
@@ -713,7 +717,7 @@ struct mlx5_rxq_obj {
 /* Indirection table. */
 struct mlx5_ind_table_obj {
        LIST_ENTRY(mlx5_ind_table_obj) next; /* Pointer to the next element. */
-       rte_atomic32_t refcnt; /* Reference counter. */
+       uint32_t refcnt; /* Reference counter. */
        RTE_STD_C11
        union {
                void *ind_table; /**< Indirection table. */
@@ -724,9 +728,10 @@ struct mlx5_ind_table_obj {
 };
 
 /* Hash Rx queue. */
+__extension__
 struct mlx5_hrxq {
        ILIST_ENTRY(uint32_t)next; /* Index to the next element. */
-       rte_atomic32_t refcnt; /* Reference counter. */
+       uint32_t refcnt; /* Reference counter. */
        uint32_t shared:1; /* This object used in shared action. */
        struct mlx5_ind_table_obj *ind_table; /* Indirection table. */
        RTE_STD_C11
@@ -781,7 +786,6 @@ enum mlx5_rxq_modify_type {
 };
 
 enum mlx5_txq_modify_type {
-       MLX5_TXQ_MOD_RDY2RDY, /* modify state from ready to ready. */
        MLX5_TXQ_MOD_RST2RDY, /* modify state from reset to ready. */
        MLX5_TXQ_MOD_RDY2RST, /* modify state from ready to reset. */
        MLX5_TXQ_MOD_ERR2RDY, /* modify state from error to ready. */
@@ -852,10 +856,6 @@ struct mlx5_priv {
        struct mlx5_drop drop_queue; /* Flow drop queues. */
        uint32_t flows; /* RTE Flow rules. */
        uint32_t ctrl_flows; /* Control flow rules. */
-       void *inter_flows; /* Intermediate resources for flow creation. */
-       void *rss_desc; /* Intermediate rss description resources. */
-       int flow_idx; /* Intermediate device flow index. */
-       int flow_nested_idx; /* Intermediate device flow index, nested. */
        struct mlx5_obj_ops obj_ops; /* HW objects operations. */
        LIST_HEAD(rxq, mlx5_rxq_ctrl) rxqsctrl; /* DPDK Rx queues. */
        LIST_HEAD(rxqobj, mlx5_rxq_obj) rxqsobj; /* Verbs/DevX Rx queues. */
@@ -865,7 +865,7 @@ struct mlx5_priv {
        /* Indirection tables. */
        LIST_HEAD(ind_tables, mlx5_ind_table_obj) ind_tbls;
        /* Pointer to next element. */
-       rte_atomic32_t refcnt; /**< Reference counter. */
+       uint32_t refcnt; /**< Reference counter. */
        /**< Verbs modify header action object. */
        uint8_t ft_type; /**< Flow table type, Rx or Tx. */
        uint8_t max_lro_msg_size;
@@ -880,7 +880,6 @@ struct mlx5_priv {
        int nl_socket_route; /* Netlink socket (NETLINK_ROUTE). */
        struct mlx5_dbr_page_list dbrpgs; /* Door-bell pages. */
        struct mlx5_nl_vlan_vmwa_context *vmwa_context; /* VLAN WA context. */
-       struct mlx5_flow_id_pool *qrss_id_pool;
        struct mlx5_hlist *mreg_cp_tbl;
        /* Hash table of Rx metadata register copy table. */
        uint8_t mtr_sfx_reg; /* Meter prefix-suffix flow match REG_C. */
@@ -891,11 +890,21 @@ struct mlx5_priv {
        uint8_t fdb_def_rule; /* Whether fdb jump to table 1 is configured. */
        struct mlx5_mp_id mp_id; /* ID of a multi-process process */
        LIST_HEAD(fdir, mlx5_fdir_flow) fdir_flows; /* fdir flows. */
+       LIST_HEAD(shared_action, rte_flow_shared_action) shared_actions;
+       /* shared actions */
 };
 
 #define PORT_ID(priv) ((priv)->dev_data->port_id)
 #define ETH_DEV(priv) (&rte_eth_devices[PORT_ID(priv)])
 
+struct rte_hairpin_peer_info {
+       uint32_t qp_id;
+       uint32_t vhca_id;
+       uint16_t peer_q;
+       uint16_t tx_explicit;
+       uint16_t manual_bind;
+};
+
 /* mlx5.c */
 
 int mlx5_getenv_int(const char *);
@@ -1046,6 +1055,19 @@ int mlx5_dev_stop(struct rte_eth_dev *dev);
 int mlx5_traffic_enable(struct rte_eth_dev *dev);
 void mlx5_traffic_disable(struct rte_eth_dev *dev);
 int mlx5_traffic_restart(struct rte_eth_dev *dev);
+int mlx5_hairpin_queue_peer_update(struct rte_eth_dev *dev, uint16_t peer_queue,
+                                  struct rte_hairpin_peer_info *current_info,
+                                  struct rte_hairpin_peer_info *peer_info,
+                                  uint32_t direction);
+int mlx5_hairpin_queue_peer_bind(struct rte_eth_dev *dev, uint16_t cur_queue,
+                                struct rte_hairpin_peer_info *peer_info,
+                                uint32_t direction);
+int mlx5_hairpin_queue_peer_unbind(struct rte_eth_dev *dev, uint16_t cur_queue,
+                                  uint32_t direction);
+int mlx5_hairpin_bind(struct rte_eth_dev *dev, uint16_t rx_port);
+int mlx5_hairpin_unbind(struct rte_eth_dev *dev, uint16_t rx_port);
+int mlx5_hairpin_get_peer_ports(struct rte_eth_dev *dev, uint16_t *peer_ports,
+                               size_t len, uint32_t direction);
 
 /* mlx5_flow.c */
 
@@ -1079,8 +1101,6 @@ int mlx5_flow_start(struct rte_eth_dev *dev, uint32_t *list);
 void mlx5_flow_stop(struct rte_eth_dev *dev, uint32_t *list);
 int mlx5_flow_start_default(struct rte_eth_dev *dev);
 void mlx5_flow_stop_default(struct rte_eth_dev *dev);
-void mlx5_flow_alloc_intermediate(struct rte_eth_dev *dev);
-void mlx5_flow_free_intermediate(struct rte_eth_dev *dev);
 int mlx5_flow_verify(struct rte_eth_dev *dev);
 int mlx5_ctrl_flow_source_queue(struct rte_eth_dev *dev, uint32_t queue);
 int mlx5_ctrl_flow_vlan(struct rte_eth_dev *dev,