net/mlx5: remove TCF support
[dpdk.git] / drivers / net / mlx5 / mlx5.c
index b563e0f..d93f92d 100644 (file)
 /* Select port representors to instantiate. */
 #define MLX5_REPRESENTOR "representor"
 
+/* Device parameter to configure the maximum number of dump files per queue. */
+#define MLX5_MAX_DUMP_FILES_NUM "max_dump_files_num"
+
 #ifndef HAVE_IBV_MLX5_MOD_MPW
 #define MLX5DV_CONTEXT_FLAGS_MPW_ALLOWED (1 << 2)
 #define MLX5DV_CONTEXT_FLAGS_ENHANCED_MPW (1 << 3)
@@ -313,7 +316,7 @@ mlx5_free_shared_ibctx(struct mlx5_ibv_shared *sh)
         **/
        assert(!sh->intr_cnt);
        if (sh->intr_cnt)
-               rte_intr_callback_unregister
+               mlx5_intr_callback_unregister
                        (&sh->intr_handle, mlx5_dev_interrupt_handler, sh);
        pthread_mutex_destroy(&sh->intr_mutex);
        if (sh->pd)
@@ -342,7 +345,7 @@ mlx5_alloc_shared_dr(struct mlx5_priv *priv)
 #ifdef HAVE_MLX5DV_DR
        struct mlx5_ibv_shared *sh = priv->sh;
        int err = 0;
-       void *ns;
+       void *domain;
 
        assert(sh);
        if (sh->dv_refcnt) {
@@ -352,33 +355,33 @@ mlx5_alloc_shared_dr(struct mlx5_priv *priv)
                return 0;
        }
        /* Reference counter is zero, we should initialize structures. */
-       ns = mlx5_glue->dr_create_ns(sh->ctx,
-                                    MLX5DV_DR_NS_DOMAIN_INGRESS_BYPASS);
-       if (!ns) {
-               DRV_LOG(ERR, "ingress mlx5dv_dr_create_ns failed");
+       domain = mlx5_glue->dr_create_domain(sh->ctx,
+                                            MLX5DV_DR_DOMAIN_TYPE_NIC_RX);
+       if (!domain) {
+               DRV_LOG(ERR, "ingress mlx5dv_dr_create_domain failed");
                err = errno;
                goto error;
        }
-       sh->rx_ns = ns;
-       ns = mlx5_glue->dr_create_ns(sh->ctx,
-                                    MLX5DV_DR_NS_DOMAIN_EGRESS_BYPASS);
-       if (!ns) {
-               DRV_LOG(ERR, "egress mlx5dv_dr_create_ns failed");
+       sh->rx_domain = domain;
+       domain = mlx5_glue->dr_create_domain(sh->ctx,
+                                            MLX5DV_DR_DOMAIN_TYPE_NIC_TX);
+       if (!domain) {
+               DRV_LOG(ERR, "egress mlx5dv_dr_create_domain failed");
                err = errno;
                goto error;
        }
        pthread_mutex_init(&sh->dv_mutex, NULL);
-       sh->tx_ns = ns;
+       sh->tx_domain = domain;
 #ifdef HAVE_MLX5DV_DR_ESWITCH
        if (priv->config.dv_esw_en) {
-               ns  = mlx5_glue->dr_create_ns(sh->ctx,
-                                             MLX5DV_DR_NS_DOMAIN_FDB_BYPASS);
-               if (!ns) {
-                       DRV_LOG(ERR, "FDB mlx5dv_dr_create_ns failed");
+               domain  = mlx5_glue->dr_create_domain
+                       (sh->ctx, MLX5DV_DR_DOMAIN_TYPE_FDB);
+               if (!domain) {
+                       DRV_LOG(ERR, "FDB mlx5dv_dr_create_domain failed");
                        err = errno;
                        goto error;
                }
-               sh->fdb_ns = ns;
+               sh->fdb_domain = domain;
                sh->esw_drop_action = mlx5_glue->dr_create_flow_action_drop();
        }
 #endif
@@ -388,17 +391,17 @@ mlx5_alloc_shared_dr(struct mlx5_priv *priv)
 
 error:
        /* Rollback the created objects. */
-       if (sh->rx_ns) {
-               mlx5_glue->dr_destroy_ns(sh->rx_ns);
-               sh->rx_ns = NULL;
+       if (sh->rx_domain) {
+               mlx5_glue->dr_destroy_domain(sh->rx_domain);
+               sh->rx_domain = NULL;
        }
-       if (sh->tx_ns) {
-               mlx5_glue->dr_destroy_ns(sh->tx_ns);
-               sh->tx_ns = NULL;
+       if (sh->tx_domain) {
+               mlx5_glue->dr_destroy_domain(sh->tx_domain);
+               sh->tx_domain = NULL;
        }
-       if (sh->fdb_ns) {
-               mlx5_glue->dr_destroy_ns(sh->fdb_ns);
-               sh->fdb_ns = NULL;
+       if (sh->fdb_domain) {
+               mlx5_glue->dr_destroy_domain(sh->fdb_domain);
+               sh->fdb_domain = NULL;
        }
        if (sh->esw_drop_action) {
                mlx5_glue->destroy_flow_action(sh->esw_drop_action);
@@ -431,18 +434,18 @@ mlx5_free_shared_dr(struct mlx5_priv *priv)
        assert(sh->dv_refcnt);
        if (sh->dv_refcnt && --sh->dv_refcnt)
                return;
-       if (sh->rx_ns) {
-               mlx5_glue->dr_destroy_ns(sh->rx_ns);
-               sh->rx_ns = NULL;
+       if (sh->rx_domain) {
+               mlx5_glue->dr_destroy_domain(sh->rx_domain);
+               sh->rx_domain = NULL;
        }
-       if (sh->tx_ns) {
-               mlx5_glue->dr_destroy_ns(sh->tx_ns);
-               sh->tx_ns = NULL;
+       if (sh->tx_domain) {
+               mlx5_glue->dr_destroy_domain(sh->tx_domain);
+               sh->tx_domain = NULL;
        }
 #ifdef HAVE_MLX5DV_DR_ESWITCH
-       if (sh->fdb_ns) {
-               mlx5_glue->dr_destroy_ns(sh->fdb_ns);
-               sh->fdb_ns = NULL;
+       if (sh->fdb_domain) {
+               mlx5_glue->dr_destroy_domain(sh->fdb_domain);
+               sh->fdb_domain = NULL;
        }
        if (sh->esw_drop_action) {
                mlx5_glue->destroy_flow_action(sh->esw_drop_action);
@@ -673,9 +676,9 @@ mlx5_dev_close(struct rte_eth_dev *dev)
        mlx5_mprq_free_mp(dev);
        /* Remove from memory callback device list. */
        rte_rwlock_write_lock(&mlx5_shared_data->mem_event_rwlock);
-       LIST_REMOVE(priv, mem_event_cb);
-       rte_rwlock_write_unlock(&mlx5_shared_data->mem_event_rwlock);
        assert(priv->sh);
+       LIST_REMOVE(priv->sh, mem_event_cb);
+       rte_rwlock_write_unlock(&mlx5_shared_data->mem_event_rwlock);
        mlx5_free_shared_dr(priv);
        if (priv->rss_conf.rss_key != NULL)
                rte_free(priv->rss_conf.rss_key);
@@ -687,8 +690,6 @@ mlx5_dev_close(struct rte_eth_dev *dev)
                close(priv->nl_socket_route);
        if (priv->nl_socket_rdma >= 0)
                close(priv->nl_socket_rdma);
-       if (priv->tcf_context)
-               mlx5_flow_tcf_context_destroy(priv->tcf_context);
        if (priv->sh) {
                /*
                 * Free the shared context in last turn, because the cleanup
@@ -773,6 +774,7 @@ const struct eth_dev_ops mlx5_dev_ops = {
        .xstats_get_names = mlx5_xstats_get_names,
        .fw_version_get = mlx5_fw_version_get,
        .dev_infos_get = mlx5_dev_infos_get,
+       .read_clock = mlx5_read_clock,
        .dev_supported_ptypes_get = mlx5_dev_supported_ptypes_get,
        .vlan_filter_set = mlx5_vlan_filter_set,
        .rx_queue_setup = mlx5_rx_queue_setup,
@@ -926,6 +928,8 @@ mlx5_args_check(const char *key, const char *val, void *opaque)
                config->dv_flow_en = !!tmp;
        } else if (strcmp(MLX5_MR_EXT_MEMSEG_EN, key) == 0) {
                config->mr_ext_memseg_en = !!tmp;
+       } else if (strcmp(MLX5_MAX_DUMP_FILES_NUM, key) == 0) {
+               config->max_dump_files_num = tmp;
        } else {
                DRV_LOG(WARNING, "%s: unknown parameter", key);
                rte_errno = EINVAL;
@@ -970,6 +974,7 @@ mlx5_args(struct mlx5_dev_config *config, struct rte_devargs *devargs)
                MLX5_DV_FLOW_EN,
                MLX5_MR_EXT_MEMSEG_EN,
                MLX5_REPRESENTOR,
+               MLX5_MAX_DUMP_FILES_NUM,
                NULL,
        };
        struct rte_kvargs *kvlist;
@@ -980,8 +985,10 @@ mlx5_args(struct mlx5_dev_config *config, struct rte_devargs *devargs)
                return 0;
        /* Following UGLY cast is done to pass checkpatch. */
        kvlist = rte_kvargs_parse(devargs->args, params);
-       if (kvlist == NULL)
-               return 0;
+       if (kvlist == NULL) {
+               rte_errno = EINVAL;
+               return -rte_errno;
+       }
        /* Process parameters. */
        for (i = 0; (params[i] != NULL); ++i) {
                if (rte_kvargs_count(kvlist, params[i])) {
@@ -1015,6 +1022,7 @@ mlx5_init_once(void)
 {
        struct mlx5_shared_data *sd;
        struct mlx5_local_data *ld = &mlx5_local_data;
+       int ret = 0;
 
        if (mlx5_init_shared_data())
                return -rte_errno;
@@ -1029,21 +1037,26 @@ mlx5_init_once(void)
                rte_rwlock_init(&sd->mem_event_rwlock);
                rte_mem_event_callback_register("MLX5_MEM_EVENT_CB",
                                                mlx5_mr_mem_event_cb, NULL);
-               mlx5_mp_init_primary();
+               ret = mlx5_mp_init_primary();
+               if (ret)
+                       goto out;
                sd->init_done = true;
                break;
        case RTE_PROC_SECONDARY:
                if (ld->init_done)
                        break;
-               mlx5_mp_init_secondary();
+               ret = mlx5_mp_init_secondary();
+               if (ret)
+                       goto out;
                ++sd->secondary_cnt;
                ld->init_done = true;
                break;
        default:
                break;
        }
+out:
        rte_spinlock_unlock(&sd->lock);
-       return 0;
+       return ret;
 }
 
 /**
@@ -1087,7 +1100,7 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
        unsigned int mprq_max_stride_size_n = 0;
        unsigned int mprq_min_stride_num_n = 0;
        unsigned int mprq_max_stride_num_n = 0;
-       struct ether_addr mac;
+       struct rte_ether_addr mac;
        char name[RTE_ETH_NAME_MAX_LEN];
        int own_domain_id = 0;
        uint16_t port_id;
@@ -1282,7 +1295,7 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
        }
        priv->sh = sh;
        priv->ibv_port = spawn->ibv_port;
-       priv->mtu = ETHER_MTU;
+       priv->mtu = RTE_ETHER_MTU;
 #ifndef RTE_ARCH_64
        /* Initialize UAR access locks for 32bit implementations. */
        rte_spinlock_init(&priv->uar_lock_cq);
@@ -1433,6 +1446,8 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
                DRV_LOG(WARNING, "Multi-Packet RQ isn't supported");
                config.mprq.enabled = 0;
        }
+       if (config.max_dump_files_num == 0)
+               config.max_dump_files_num = 128;
        eth_dev = rte_eth_dev_allocate(name);
        if (eth_dev == NULL) {
                DRV_LOG(ERR, "can not allocate rte ethdev");
@@ -1492,34 +1507,6 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
        claim_zero(mlx5_mac_addr_add(eth_dev, &mac, 0, 0));
        if (config.vf && config.vf_nl_en)
                mlx5_nl_mac_addr_sync(eth_dev);
-       priv->tcf_context = mlx5_flow_tcf_context_create();
-       if (!priv->tcf_context) {
-               err = -rte_errno;
-               DRV_LOG(WARNING,
-                       "flow rules relying on switch offloads will not be"
-                       " supported: cannot open libmnl socket: %s",
-                       strerror(rte_errno));
-       } else {
-               struct rte_flow_error error;
-               unsigned int ifindex = mlx5_ifindex(eth_dev);
-
-               if (!ifindex) {
-                       err = -rte_errno;
-                       error.message =
-                               "cannot retrieve network interface index";
-               } else {
-                       err = mlx5_flow_tcf_init(priv->tcf_context,
-                                                ifindex, &error);
-               }
-               if (err) {
-                       DRV_LOG(WARNING,
-                               "flow rules relying on switch offloads will"
-                               " not be supported: %s: %s",
-                               error.message, strerror(rte_errno));
-                       mlx5_flow_tcf_context_destroy(priv->tcf_context);
-                       priv->tcf_context = NULL;
-               }
-       }
        TAILQ_INIT(&priv->flows);
        TAILQ_INIT(&priv->ctrl_flows);
        /* Hint libmlx5 to use PMD allocator for data plane resources */
@@ -1574,7 +1561,7 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
        /* Add device to memory callback list. */
        rte_rwlock_write_lock(&mlx5_shared_data->mem_event_rwlock);
        LIST_INSERT_HEAD(&mlx5_shared_data->mem_event_cb_list,
-                        priv, mem_event_cb);
+                        sh, mem_event_cb);
        rte_rwlock_write_unlock(&mlx5_shared_data->mem_event_rwlock);
        return eth_dev;
 error:
@@ -1585,8 +1572,6 @@ error:
                        close(priv->nl_socket_route);
                if (priv->nl_socket_rdma >= 0)
                        close(priv->nl_socket_rdma);
-               if (priv->tcf_context)
-                       mlx5_flow_tcf_context_destroy(priv->tcf_context);
                if (own_domain_id)
                        claim_zero(rte_eth_switch_domain_free(priv->domain_id));
                rte_free(priv);
@@ -2101,8 +2086,8 @@ static struct rte_pci_driver mlx5_driver = {
        .remove = mlx5_pci_remove,
        .dma_map = mlx5_dma_map,
        .dma_unmap = mlx5_dma_unmap,
-       .drv_flags = (RTE_PCI_DRV_INTR_LSC | RTE_PCI_DRV_INTR_RMV |
-                     RTE_PCI_DRV_PROBE_AGAIN),
+       .drv_flags = RTE_PCI_DRV_INTR_LSC | RTE_PCI_DRV_INTR_RMV |
+                    RTE_PCI_DRV_PROBE_AGAIN | RTE_PCI_DRV_IOVA_AS_VA,
 };
 
 #ifdef RTE_IBVERBS_LINK_DLOPEN