net/mlx5: prepare Direct Verbs for Direct Rule
[dpdk.git] / drivers / net / mlx5 / mlx5.h
index 6882460..784bf9b 100644 (file)
@@ -56,6 +56,31 @@ enum {
        PCI_DEVICE_ID_MELLANOX_CONNECTX6VF = 0x101c,
 };
 
+/* Request types for IPC. */
+enum mlx5_mp_req_type {
+       MLX5_MP_REQ_VERBS_CMD_FD = 1,
+       MLX5_MP_REQ_CREATE_MR,
+       MLX5_MP_REQ_START_RXTX,
+       MLX5_MP_REQ_STOP_RXTX,
+};
+
+/* Pameters for IPC. */
+struct mlx5_mp_param {
+       enum mlx5_mp_req_type type;
+       int port_id;
+       int result;
+       RTE_STD_C11
+       union {
+               uintptr_t addr; /* MLX5_MP_REQ_CREATE_MR */
+       } args;
+};
+
+/** Request timeout for IPC. */
+#define MLX5_MP_REQ_TIMEOUT_SEC 5
+
+/** Key string for IPC. */
+#define MLX5_MP_NAME "net_mlx5_mp"
+
 /** Switch information returned by mlx5_nl_switch_info(). */
 struct mlx5_switch_info {
        uint32_t master:1; /**< Master device. */
@@ -67,12 +92,25 @@ struct mlx5_switch_info {
 
 LIST_HEAD(mlx5_dev_list, mlx5_priv);
 
-/* Shared memory between primary and secondary processes. */
+/* Shared data between primary and secondary processes. */
 struct mlx5_shared_data {
+       rte_spinlock_t lock;
+       /* Global spinlock for primary and secondary processes. */
+       int init_done; /* Whether primary has done initialization. */
+       unsigned int secondary_cnt; /* Number of secondary processes init'd. */
+       void *uar_base;
+       /* Reserved UAR address space for TXQ UAR(hw doorbell) mapping. */
        struct mlx5_dev_list mem_event_cb_list;
        rte_rwlock_t mem_event_rwlock;
 };
 
+/* Per-process data structure, not visible to other processes. */
+struct mlx5_local_data {
+       int init_done; /* Whether a secondary has done initialization. */
+       void *uar_base;
+       /* Reserved UAR address space for TXQ UAR(hw doorbell) mapping. */
+};
+
 extern struct mlx5_shared_data *mlx5_shared_data;
 
 struct mlx5_counter_ctrl {
@@ -134,6 +172,8 @@ struct mlx5_dev_config {
        unsigned int tx_vec_en:1; /* Tx vector is enabled. */
        unsigned int rx_vec_en:1; /* Rx vector is enabled. */
        unsigned int mpw_hdr_dseg:1; /* Enable DSEGs in the title WQEBB. */
+       unsigned int mr_ext_memseg_en:1;
+       /* Whether memseg should be extended for MR creation. */
        unsigned int l3_vxlan_en:1; /* Enable L3 VXLAN flow creation. */
        unsigned int vf_nl_en:1; /* Enable Netlink requests in VF mode. */
        unsigned int dv_flow_en:1; /* Enable DV flow. */
@@ -213,6 +253,8 @@ struct mlx5_ibv_shared {
        char ibdev_name[IBV_SYSFS_NAME_MAX]; /* IB device name. */
        char ibdev_path[IBV_SYSFS_PATH_MAX]; /* IB device path for secondary */
        struct ibv_device_attr_ex device_attr; /* Device properties. */
+       pthread_mutex_t intr_mutex; /* Interrupt config mutex. */
+       uint32_t intr_cnt; /* Interrupt handler reference counter. */
        struct rte_intr_handle intr_handle; /* Interrupt handler for device. */
        struct mlx5_ibv_shared_port port[]; /* per device port data array. */
 };
@@ -223,11 +265,6 @@ struct mlx5_priv {
        struct rte_eth_dev_data *dev_data;  /* Pointer to device data. */
        struct mlx5_ibv_shared *sh; /* Shared IB device context. */
        uint32_t ibv_port; /* IB device port number. */
-       struct ibv_context *ctx; /* Verbs context. */
-       struct ibv_device_attr_ex device_attr; /* Device properties. */
-       struct ibv_pd *pd; /* Protection Domain. */
-       char ibdev_name[IBV_SYSFS_NAME_MAX]; /* IB device name. */
-       char ibdev_path[IBV_SYSFS_PATH_MAX]; /* IB device path for secondary */
        struct ether_addr mac[MLX5_MAX_MAC_ADDRESSES]; /* MAC addresses. */
        BITFIELD_DECLARE(mac_own, uint64_t, MLX5_MAX_MAC_ADDRESSES);
        /* Bit-field of MAC addresses owned by the PMD. */
@@ -248,7 +285,6 @@ struct mlx5_priv {
        struct mlx5_txq_data *(*txqs)[]; /* TX queues. */
        struct rte_mempool *mprq_mp; /* Mempool for Multi-Packet RQ. */
        struct rte_eth_rss_conf rss_conf; /* RSS configuration. */
-       struct rte_intr_handle intr_handle; /* Interrupt handler. */
        unsigned int (*reta_idx)[]; /* RETA index table. */
        unsigned int reta_idx_n; /* RETA index size. */
        struct mlx5_drop drop_queue; /* Flow drop queues. */
@@ -273,12 +309,11 @@ struct mlx5_priv {
        LIST_HEAD(matchers, mlx5_flow_dv_matcher) matchers;
        LIST_HEAD(encap_decap, mlx5_flow_dv_encap_decap_resource) encaps_decaps;
        LIST_HEAD(modify_cmd, mlx5_flow_dv_modify_hdr_resource) modify_cmds;
+       LIST_HEAD(tag, mlx5_flow_dv_tag_resource) tags;
+       /* Tags resources cache. */
        uint32_t link_speed_capa; /* Link speed capabilities. */
        struct mlx5_xstats_ctrl xstats_ctrl; /* Extended stats control. */
        struct mlx5_stats_ctrl stats_ctrl; /* Stats control. */
-       int primary_socket; /* Unix socket for primary process. */
-       void *uar_base; /* Reserved address space for UAR mapping */
-       struct rte_intr_handle intr_handle_socket; /* Interrupt handler. */
        struct mlx5_dev_config config; /* Device configuration. */
        struct mlx5_verbs_alloc_ctx verbs_alloc_ctx;
        /* Context for Verbs allocator. */
@@ -436,12 +471,15 @@ int mlx5_ctrl_flow(struct rte_eth_dev *dev,
 int mlx5_flow_create_drop_queue(struct rte_eth_dev *dev);
 void mlx5_flow_delete_drop_queue(struct rte_eth_dev *dev);
 
-/* mlx5_socket.c */
-
-int mlx5_socket_init(struct rte_eth_dev *priv);
-void mlx5_socket_uninit(struct rte_eth_dev *priv);
-void mlx5_socket_handle(struct rte_eth_dev *priv);
-int mlx5_socket_connect(struct rte_eth_dev *priv);
+/* mlx5_mp.c */
+void mlx5_mp_req_start_rxtx(struct rte_eth_dev *dev);
+void mlx5_mp_req_stop_rxtx(struct rte_eth_dev *dev);
+int mlx5_mp_req_mr_create(struct rte_eth_dev *dev, uintptr_t addr);
+int mlx5_mp_req_verbs_cmd_fd(struct rte_eth_dev *dev);
+void mlx5_mp_init_primary(void);
+void mlx5_mp_uninit_primary(void);
+void mlx5_mp_init_secondary(void);
+void mlx5_mp_uninit_secondary(void);
 
 /* mlx5_nl.c */