All of lore.kernel.org
 help / color / mirror / Atom feed
From: Declan Doherty <declan.doherty@intel.com>
To: dev@dpdk.org
Cc: Adrien Mazarguil <adrien.mazarguil@6wind.com>,
	Ferruh Yigit <ferruh.yigit@intel.com>,
	Thomas Monjalon <thomas@monjalon.net>,
	Shahaf Shuler <shahafs@mellanox.com>,
	Declan Doherty <declan.doherty@intel.com>
Subject: [PATCH v7 3/9] ethdev: add generic create/destroy ethdev APIs
Date: Mon, 16 Apr 2018 14:05:59 +0100	[thread overview]
Message-ID: <20180416130605.6509-4-declan.doherty@intel.com> (raw)
In-Reply-To: <20180416130605.6509-1-declan.doherty@intel.com>

Add new bus generic ethdev create/destroy APIs which are bus independent
and provide hooks for bus specific initialisation.

Signed-off-by: Declan Doherty <declan.doherty@intel.com>
---
 lib/librte_ether/rte_ethdev.c           | 95 ++++++++++++++++++++++++++++++++-
 lib/librte_ether/rte_ethdev_driver.h    | 57 ++++++++++++++++++++
 lib/librte_ether/rte_ethdev_pci.h       | 12 +++++
 lib/librte_ether/rte_ethdev_version.map |  8 +++
 4 files changed, 171 insertions(+), 1 deletion(-)

diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c
index 3c049ef43..b16d23b9a 100644
--- a/lib/librte_ether/rte_ethdev.c
+++ b/lib/librte_ether/rte_ethdev.c
@@ -348,7 +348,8 @@ rte_eth_dev_release_port(struct rte_eth_dev *eth_dev)
 	rte_eth_dev_shared_data_prepare();
 
 	rte_spinlock_lock(&rte_eth_dev_shared_data->ownership_lock);
-
+	eth_dev->device = NULL;
+	eth_dev->intr_handle = NULL;
 	eth_dev->state = RTE_ETH_DEV_UNUSED;
 
 	memset(eth_dev->data, 0, sizeof(struct rte_eth_dev_data));
@@ -3439,6 +3440,98 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name,
 			RTE_MEMZONE_IOVA_CONTIG, align);
 }
 
+int __rte_experimental
+rte_eth_dev_create(struct rte_device *device, const char *name,
+	size_t priv_data_size,
+	ethdev_bus_specific_init ethdev_bus_specific_init,
+	void *bus_init_params,
+	ethdev_init_t ethdev_init, void *init_params)
+{
+	struct rte_eth_dev *ethdev;
+	int retval;
+
+	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+		ethdev = rte_eth_dev_allocate(name);
+		if (!ethdev) {
+			retval = -ENODEV;
+			goto probe_failed;
+		}
+
+		if (priv_data_size) {
+			ethdev->data->dev_private = rte_zmalloc_socket(
+				name, priv_data_size, RTE_CACHE_LINE_SIZE,
+				device->numa_node);
+
+			if (!ethdev->data->dev_private) {
+				RTE_LOG(ERR, EAL, "failed to allocate private data");
+				retval = -ENOMEM;
+				goto probe_failed;
+			}
+		}
+	} else {
+		ethdev = rte_eth_dev_attach_secondary(name);
+		if (!ethdev) {
+			RTE_LOG(ERR, EAL, "secondary process attach failed, "
+				"ethdev doesn't exist");
+			retval = -ENODEV;
+			goto probe_failed;
+		}
+	}
+
+	ethdev->device = device;
+
+	if (ethdev_bus_specific_init) {
+		retval = ethdev_bus_specific_init(ethdev, bus_init_params);
+		if (retval) {
+			RTE_LOG(ERR, EAL,
+				"ethdev bus specific initialisation failed");
+			goto probe_failed;
+		}
+	}
+
+	RTE_FUNC_PTR_OR_ERR_RET(*ethdev_init, -EINVAL);
+	retval = ethdev_init(ethdev, init_params);
+	if (retval) {
+		RTE_LOG(ERR, EAL, "ethdev initialisation failed");
+		goto probe_failed;
+	}
+
+	return retval;
+probe_failed:
+	/* free ports private data if primary process */
+	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
+		rte_free(ethdev->data->dev_private);
+
+	rte_eth_dev_release_port(ethdev);
+
+	return retval;
+}
+
+int  __rte_experimental
+rte_eth_dev_destroy(struct rte_eth_dev *ethdev,
+	ethdev_uninit_t ethdev_uninit)
+{
+	int ret;
+
+	ethdev = rte_eth_dev_allocated(ethdev->data->name);
+	if (!ethdev)
+		return -ENODEV;
+
+	RTE_FUNC_PTR_OR_ERR_RET(*ethdev_uninit, -EINVAL);
+	if (ethdev_uninit) {
+		ret = ethdev_uninit(ethdev);
+		if (ret)
+			return ret;
+	}
+
+	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
+		rte_free(ethdev->data->dev_private);
+
+	ethdev->data->dev_private = NULL;
+
+	return rte_eth_dev_release_port(ethdev);
+}
+
 int
 rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
 			  int epfd, int op, void *data)
diff --git a/lib/librte_ether/rte_ethdev_driver.h b/lib/librte_ether/rte_ethdev_driver.h
index a406ef123..e52add0ad 100644
--- a/lib/librte_ether/rte_ethdev_driver.h
+++ b/lib/librte_ether/rte_ethdev_driver.h
@@ -188,6 +188,63 @@ rte_eth_linkstatus_get(const struct rte_eth_dev *dev,
 #endif
 }
 
+
+typedef int (*ethdev_init_t)(struct rte_eth_dev *ethdev, void *init_params);
+typedef int (*ethdev_bus_specific_init)(struct rte_eth_dev *ethdev,
+	void *bus_specific_init_params);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * PMD helper function for the creation of a new ethdev ports.
+ *
+ * @param device
+ *  rte_device handle.
+ * @param	name
+ *  port name.
+ * @param priv_data_size
+ *  size of private data required for port.
+ * @param bus_specific_init
+ *  port bus specific initialisation callback function
+ * @param bus_init_params
+ *  port bus specific initialisation parameters
+ * @param ethdev_init
+ *  device specific port initialization callback function
+ * @param init_params
+ *  port initialisation parameters
+ *
+ * @return
+ *   Negative errno value on error, 0 on success.
+ */
+int __rte_experimental
+rte_eth_dev_create(struct rte_device *device, const char *name,
+	size_t priv_data_size,
+	ethdev_bus_specific_init bus_specific_init, void *bus_init_params,
+	ethdev_init_t ethdev_init, void *init_params);
+
+
+typedef int (*ethdev_uninit_t)(struct rte_eth_dev *ethdev);
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * PMD helper function for cleaing up the resources of a ethdev port on it's
+ * destruction.
+ *
+ * @param ethdev
+ *   ethdev handle of port.
+ * @param ethdev
+ *   device specific port un-initialise callback function
+ *
+ * @return
+ *   Negative errno value on error, 0 on success.
+ */
+int __rte_experimental
+rte_eth_dev_destroy(struct rte_eth_dev *ethdev,
+	ethdev_uninit_t ethdev_uninit);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/librte_ether/rte_ethdev_pci.h b/lib/librte_ether/rte_ethdev_pci.h
index 6565ae7d3..603287c28 100644
--- a/lib/librte_ether/rte_ethdev_pci.h
+++ b/lib/librte_ether/rte_ethdev_pci.h
@@ -70,6 +70,18 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev,
 	eth_dev->data->numa_node = pci_dev->device.numa_node;
 }
 
+static inline int
+eth_dev_pci_specific_init(struct rte_eth_dev *eth_dev, void *bus_device) {
+	struct rte_pci_device *pci_dev = bus_device;
+
+	if (!pci_dev)
+		return -ENODEV;
+
+	rte_eth_copy_pci_info(eth_dev, pci_dev);
+
+	return 0;
+}
+
 /**
  * @internal
  * Allocates a new ethdev slot for an ethernet device and returns the pointer
diff --git a/lib/librte_ether/rte_ethdev_version.map b/lib/librte_ether/rte_ethdev_version.map
index 34df6c8b5..bd7232923 100644
--- a/lib/librte_ether/rte_ethdev_version.map
+++ b/lib/librte_ether/rte_ethdev_version.map
@@ -229,3 +229,11 @@ EXPERIMENTAL {
 	rte_mtr_stats_update;
 
 } DPDK_17.11;
+
+EXPERIMENTAL {
+	global:
+
+	rte_eth_dev_create;
+	rte_eth_dev_destroy;
+
+} DPDK_18.05;
-- 
2.14.3

  parent reply	other threads:[~2018-04-16 13:14 UTC|newest]

Thread overview: 73+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-28 13:54 [PATCH v6 0/7] switching device representation Declan Doherty
2018-03-28 13:54 ` [PATCH v6 1/8] doc: add switch representation documentation Declan Doherty
2018-03-28 14:53   ` Thomas Monjalon
2018-03-28 15:05     ` Doherty, Declan
2018-04-03 15:52   ` Adrien Mazarguil
2018-03-28 13:54 ` [PATCH v6 2/8] ethdev: add switch identifier parameter to port Declan Doherty
2018-03-29  6:13   ` Shahaf Shuler
2018-03-29  9:13     ` Doherty, Declan
2018-03-29 10:12       ` Shahaf Shuler
2018-03-29 15:12         ` Doherty, Declan
2018-04-01  6:10           ` Shahaf Shuler
2018-03-28 13:54 ` [PATCH v6 3/8] ethdev: add generic create/destroy ethdev APIs Declan Doherty
2018-03-29  6:13   ` Shahaf Shuler
2018-03-29  9:22     ` Doherty, Declan
2018-03-28 13:54 ` [PATCH v6 4/8] ethdev: Add port representor device flag Declan Doherty
2018-03-29  6:13   ` Shahaf Shuler
2018-03-29  7:34     ` Thomas Monjalon
2018-03-29 14:53     ` Doherty, Declan
2018-04-01  6:14       ` Shahaf Shuler
2018-03-28 13:54 ` [PATCH v6 5/8] app/testpmd: add port name to device info Declan Doherty
2018-03-28 13:54 ` [PATCH v6 6/8] ethdev: add common devargs parser Declan Doherty
2018-03-29 12:12   ` Gaëtan Rivet
2018-03-28 13:54 ` [PATCH v6 7/8] net/i40e: add support for representor ports Declan Doherty
2018-03-28 13:54 ` [PATCH v6 8/8] net/ixgbe: " Declan Doherty
2018-04-16 13:05 ` [PATCH v7 0/9] switching devices representation Declan Doherty
2018-04-16 13:05   ` [PATCH v7 1/9] doc: add switch representation documentation Declan Doherty
2018-04-16 15:55     ` Kovacevic, Marko
2018-04-16 13:05   ` [PATCH v7 2/9] ethdev: add switch identifier parameter to port Declan Doherty
2018-04-24 16:38     ` Thomas Monjalon
2018-04-16 13:05   ` Declan Doherty [this message]
2018-04-20 13:01     ` [PATCH v7 3/9] ethdev: add generic create/destroy ethdev APIs Ananyev, Konstantin
2018-04-24 17:48     ` Thomas Monjalon
2018-04-16 13:06   ` [PATCH v7 4/9] ethdev: Add port representor device flag Declan Doherty
2018-04-24 19:37     ` Thomas Monjalon
2018-04-25 12:17       ` Doherty, Declan
2018-04-25 12:23         ` Thomas Monjalon
2018-04-16 13:06   ` [PATCH v7 5/9] app/testpmd: add port name to device info Declan Doherty
2018-04-16 13:06   ` [PATCH v7 6/9] ethdev: add common devargs parser Declan Doherty
2018-04-20 13:16     ` Ananyev, Konstantin
2018-04-24 19:53     ` Thomas Monjalon
2018-04-25  9:40       ` Remy Horton
2018-04-25 10:06         ` Thomas Monjalon
2018-04-25 10:45           ` Remy Horton
2018-04-16 13:06   ` [PATCH v7 7/9] ethdev: add switch domain allocator Declan Doherty
2018-04-20 13:22     ` Ananyev, Konstantin
2018-04-24 19:58     ` Thomas Monjalon
2018-04-16 13:06   ` [PATCH v7 8/9] net/i40e: add support for representor ports Declan Doherty
2018-04-16 13:06   ` [PATCH v7 9/9] net/ixgbe: " Declan Doherty
2018-04-20 13:29     ` Ananyev, Konstantin
2018-04-26 10:40   ` [dpdk=-dev][PATCH v8 0/9] switching devices representation Declan Doherty
2018-04-26 10:40     ` [PATCH v8 1/9] doc: add switch representation documentation Declan Doherty
2018-04-26 10:40     ` [PATCH v8 2/9] ethdev: add switch identifier parameter to port Declan Doherty
2018-04-26 12:02       ` Thomas Monjalon
2018-04-26 14:26         ` Thomas Monjalon
2018-04-27 16:29       ` Ferruh Yigit
2018-04-26 10:40     ` [PATCH v8 3/9] ethdev: add generic create/destroy ethdev APIs Declan Doherty
2018-04-26 12:16       ` Ferruh Yigit
2018-04-26 10:41     ` [PATCH v8 4/9] ethdev: Add port representor device flag Declan Doherty
2018-04-26 10:41     ` [PATCH v8 5/9] app/testpmd: add port name to device info Declan Doherty
2018-04-26 10:41     ` [PATCH v8 6/9] ethdev: add common devargs parser Declan Doherty
2018-04-26 12:03       ` Ananyev, Konstantin
2018-04-26 14:21         ` Ferruh Yigit
2018-04-26 14:28         ` Doherty, Declan
2018-04-26 14:44           ` Thomas Monjalon
2018-04-26 14:48           ` Ananyev, Konstantin
2018-04-26 14:30         ` Remy Horton
2018-04-26 12:15       ` Ferruh Yigit
2018-04-26 10:41     ` [PATCH v8 7/9] ethdev: add switch domain allocator Declan Doherty
2018-04-26 12:27       ` Ananyev, Konstantin
2018-04-26 10:41     ` [PATCH v8 8/9] net/i40e: add support for representor ports Declan Doherty
2018-04-26 10:41     ` [PATCH v8 9/9] net/ixgbe: " Declan Doherty
2018-04-26 16:24     ` [dpdk=-dev][PATCH v8 0/9] switching devices representation Ferruh Yigit
2018-04-26 16:35       ` Ferruh Yigit

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180416130605.6509-4-declan.doherty@intel.com \
    --to=declan.doherty@intel.com \
    --cc=adrien.mazarguil@6wind.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    --cc=shahafs@mellanox.com \
    --cc=thomas@monjalon.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.