net/mlx5: make tunnel hub list thread safe
[dpdk.git] / drivers / bus / dpaa / dpaa_bus.c
index aa906c3..ece6a4c 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  *
- *   Copyright 2017-2019 NXP
+ *   Copyright 2017-2020 NXP
  *
  */
 /* System headers */
@@ -13,6 +13,7 @@
 #include <pthread.h>
 #include <sys/types.h>
 #include <sys/syscall.h>
+#include <sys/eventfd.h>
 
 #include <rte_byteorder.h>
 #include <rte_common.h>
@@ -31,6 +32,7 @@
 #include <rte_ring.h>
 #include <rte_bus.h>
 #include <rte_mbuf_pool_ops.h>
+#include <rte_mbuf_dyn.h>
 
 #include <dpaa_of.h>
 #include <rte_dpaa_bus.h>
@@ -54,6 +56,9 @@ unsigned int dpaa_svr_family;
 
 RTE_DEFINE_PER_LCORE(struct dpaa_portal *, dpaa_io);
 
+#define DPAA_SEQN_DYNFIELD_NAME "dpaa_seqn_dynfield"
+int dpaa_seqn_dynfield_offset = -1;
+
 struct fm_eth_port_cfg *
 dpaa_get_eth_port_cfg(int dev_id)
 {
@@ -250,19 +255,31 @@ dpaa_clean_device_list(void)
 
 int rte_dpaa_portal_init(void *arg)
 {
+       static const struct rte_mbuf_dynfield dpaa_seqn_dynfield_desc = {
+               .name = DPAA_SEQN_DYNFIELD_NAME,
+               .size = sizeof(dpaa_seqn_t),
+               .align = __alignof__(dpaa_seqn_t),
+       };
        unsigned int cpu, lcore = rte_lcore_id();
        int ret;
 
        BUS_INIT_FUNC_TRACE();
 
        if ((size_t)arg == 1 || lcore == LCORE_ID_ANY)
-               lcore = rte_get_master_lcore();
+               lcore = rte_get_main_lcore();
        else
                if (lcore >= RTE_MAX_LCORE)
                        return -1;
 
        cpu = rte_lcore_to_cpu_id(lcore);
 
+       dpaa_seqn_dynfield_offset =
+               rte_mbuf_dynfield_register(&dpaa_seqn_dynfield_desc);
+       if (dpaa_seqn_dynfield_offset < 0) {
+               DPAA_BUS_LOG(ERR, "Failed to register mbuf field for dpaa sequence number\n");
+               return -rte_errno;
+       }
+
        /* Initialise bman thread portals */
        ret = bman_thread_init();
        if (ret) {
@@ -542,6 +559,23 @@ rte_dpaa_bus_dev_build(void)
        return 0;
 }
 
+static int rte_dpaa_setup_intr(struct rte_intr_handle *intr_handle)
+{
+       int fd;
+
+       fd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
+       if (fd < 0) {
+               DPAA_BUS_ERR("Cannot set up eventfd, error %i (%s)",
+                            errno, strerror(errno));
+               return errno;
+       }
+
+       intr_handle->fd = fd;
+       intr_handle->type = RTE_INTR_HANDLE_EXT;
+
+       return 0;
+}
+
 static int
 rte_dpaa_bus_probe(void)
 {
@@ -589,6 +623,14 @@ rte_dpaa_bus_probe(void)
                fclose(svr_file);
        }
 
+       TAILQ_FOREACH(dev, &rte_dpaa_bus.device_list, next) {
+               if (dev->device_type == FSL_DPAA_ETH) {
+                       ret = rte_dpaa_setup_intr(&dev->intr_handle);
+                       if (ret)
+                               DPAA_BUS_ERR("Error setting up interrupt.\n");
+               }
+       }
+
        /* And initialize the PA->VA translation table */
        dpaax_iova_table_populate();