[v2,2/4] eventdev: add caps API and PMD callbacks for eth Tx adapter

Message ID 1534479652-80182-2-git-send-email-nikhil.rao@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Jerin Jacob
Headers
Series [v2,1/4] eventdev: add eth Tx adapter APIs |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Rao, Nikhil Aug. 17, 2018, 4:20 a.m. UTC
  The caps API allows the application to query if the transmit
stage is implemented in the eventdev PMD or uses the common
rte_service function. The PMD callbacks support the
eventdev PMD implementation of the adapter.

Signed-off-by: Nikhil Rao <nikhil.rao@intel.com>
---
 lib/librte_eventdev/rte_eventdev.h     |  33 +++++-
 lib/librte_eventdev/rte_eventdev_pmd.h | 200 +++++++++++++++++++++++++++++++++
 lib/librte_eventdev/rte_eventdev.c     |  37 ++++++
 3 files changed, 269 insertions(+), 1 deletion(-)
  

Comments

Jerin Jacob Aug. 19, 2018, 10:45 a.m. UTC | #1
-----Original Message-----
> Date: Fri, 17 Aug 2018 09:50:50 +0530
> From: Nikhil Rao <nikhil.rao@intel.com>
> To: jerin.jacob@caviumnetworks.com, olivier.matz@6wind.com
> CC: dev@dpdk.org, Nikhil Rao <nikhil.rao@intel.com>
> Subject: [PATCH v2 2/4] eventdev: add caps API and PMD callbacks for eth Tx
>  adapter
> X-Mailer: git-send-email 1.8.3.1
> 
> 
> The caps API allows the application to query if the transmit
> stage is implemented in the eventdev PMD or uses the common
> rte_service function. The PMD callbacks support the
> eventdev PMD implementation of the adapter.
> 
> Signed-off-by: Nikhil Rao <nikhil.rao@intel.com>
> ---
> +
>  static inline int
>  rte_event_dev_queue_config(struct rte_eventdev *dev, uint8_t nb_queues)
>  {
> @@ -1275,6 +1300,15 @@ int rte_event_dev_selftest(uint8_t dev_id)
>         return RTE_EVENT_MAX_DEVS;
>  }
> 
> @@ -1295,6 +1329,9 @@ struct rte_eventdev *
> 
>         eventdev = &rte_eventdevs[dev_id];
> 
> +       if (eventdev->txa_enqueue == NULL)

Is this check required, it will be always NULL. Right? if so,
Can't we write eventdev->txa_enqueue directly?

> +               eventdev->txa_enqueue = rte_event_tx_adapter_enqueue;
> +

With above changes,

Acked-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
  
Rao, Nikhil Aug. 21, 2018, 8:52 a.m. UTC | #2
On 8/19/2018 4:15 PM, Jerin Jacob wrote:
> -----Original Message-----
>> Date: Fri, 17 Aug 2018 09:50:50 +0530
>> From: Nikhil Rao <nikhil.rao@intel.com>
>> To: jerin.jacob@caviumnetworks.com, olivier.matz@6wind.com
>> CC: dev@dpdk.org, Nikhil Rao <nikhil.rao@intel.com>
>> Subject: [PATCH v2 2/4] eventdev: add caps API and PMD callbacks for eth Tx
>>   adapter
>> X-Mailer: git-send-email 1.8.3.1
>>
>>
>> The caps API allows the application to query if the transmit
>> stage is implemented in the eventdev PMD or uses the common
>> rte_service function. The PMD callbacks support the
>> eventdev PMD implementation of the adapter.
>>
>> Signed-off-by: Nikhil Rao <nikhil.rao@intel.com>
>> ---
>> +
>>   static inline int
>>   rte_event_dev_queue_config(struct rte_eventdev *dev, uint8_t nb_queues)
>>   {
>> @@ -1275,6 +1300,15 @@ int rte_event_dev_selftest(uint8_t dev_id)
>>          return RTE_EVENT_MAX_DEVS;
>>   }
>>
>> @@ -1295,6 +1329,9 @@ struct rte_eventdev *
>>
>>          eventdev = &rte_eventdevs[dev_id];
>>
>> +       if (eventdev->txa_enqueue == NULL)
> 
> Is this check required, it will be always NULL. Right? if so,
> Can't we write eventdev->txa_enqueue directly?
> 
>> +               eventdev->txa_enqueue = rte_event_tx_adapter_enqueue;
>> +
> 

The thought was that if the PMD supports txa_enqueue then it wouldn't be 
NULL.

Thanks for the review,
Nikhil
  
Jerin Jacob Aug. 21, 2018, 9:11 a.m. UTC | #3
-----Original Message-----
> Date: Tue, 21 Aug 2018 14:22:15 +0530
> From: "Rao, Nikhil" <nikhil.rao@intel.com>
> To: Jerin Jacob <jerin.jacob@caviumnetworks.com>
> CC: olivier.matz@6wind.com, dev@dpdk.org, nikhil.rao@intel.com
> Subject: Re: [PATCH v2 2/4] eventdev: add caps API and PMD callbacks for
>  eth Tx adapter
> User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101
>  Thunderbird/60.0
> 
> External Email
> 
> On 8/19/2018 4:15 PM, Jerin Jacob wrote:
> > -----Original Message-----
> > > Date: Fri, 17 Aug 2018 09:50:50 +0530
> > > From: Nikhil Rao <nikhil.rao@intel.com>
> > > To: jerin.jacob@caviumnetworks.com, olivier.matz@6wind.com
> > > CC: dev@dpdk.org, Nikhil Rao <nikhil.rao@intel.com>
> > > Subject: [PATCH v2 2/4] eventdev: add caps API and PMD callbacks for eth Tx
> > >   adapter
> > > X-Mailer: git-send-email 1.8.3.1
> > > 
> > > 
> > > The caps API allows the application to query if the transmit
> > > stage is implemented in the eventdev PMD or uses the common
> > > rte_service function. The PMD callbacks support the
> > > eventdev PMD implementation of the adapter.
> > > 
> > > Signed-off-by: Nikhil Rao <nikhil.rao@intel.com>
> > > ---
> > > +
> > >   static inline int
> > >   rte_event_dev_queue_config(struct rte_eventdev *dev, uint8_t nb_queues)
> > >   {
> > > @@ -1275,6 +1300,15 @@ int rte_event_dev_selftest(uint8_t dev_id)
> > >          return RTE_EVENT_MAX_DEVS;
> > >   }
> > > 
> > > @@ -1295,6 +1329,9 @@ struct rte_eventdev *
> > > 
> > >          eventdev = &rte_eventdevs[dev_id];
> > > 
> > > +       if (eventdev->txa_enqueue == NULL)
> > 
> > Is this check required, it will be always NULL. Right? if so,
> > Can't we write eventdev->txa_enqueue directly?
> > 
> > > +               eventdev->txa_enqueue = rte_event_tx_adapter_enqueue;
> > > +
> > 
> 
> The thought was that if the PMD supports txa_enqueue then it wouldn't be
> NULL.


Yes that's true. But in rte_event_pmd_allocate(), eventdev->txa_enqueue
it will be NULL. Right? Do we need to add the if (eventdev->txa_enqueue == NULL) check?

> 
> Thanks for the review,
> Nikhil
>
  
Rao, Nikhil Aug. 22, 2018, 1:34 p.m. UTC | #4
On 8/21/2018 2:41 PM, Jerin Jacob wrote:
> -----Original Message-----
>> Date: Tue, 21 Aug 2018 14:22:15 +0530
>> From: "Rao, Nikhil" <nikhil.rao@intel.com>
>> To: Jerin Jacob <jerin.jacob@caviumnetworks.com>
>> CC: olivier.matz@6wind.com, dev@dpdk.org, nikhil.rao@intel.com
>> Subject: Re: [PATCH v2 2/4] eventdev: add caps API and PMD callbacks for
>>   eth Tx adapter
>> User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101
>>   Thunderbird/60.0
>>
>> External Email
>>
>> On 8/19/2018 4:15 PM, Jerin Jacob wrote:
>>> -----Original Message-----
>>>> Date: Fri, 17 Aug 2018 09:50:50 +0530
>>>> From: Nikhil Rao <nikhil.rao@intel.com>
>>>> To: jerin.jacob@caviumnetworks.com, olivier.matz@6wind.com
>>>> CC: dev@dpdk.org, Nikhil Rao <nikhil.rao@intel.com>
>>>> Subject: [PATCH v2 2/4] eventdev: add caps API and PMD callbacks for eth Tx
>>>>    adapter
>>>> X-Mailer: git-send-email 1.8.3.1
>>>>
>>>>
>>>> The caps API allows the application to query if the transmit
>>>> stage is implemented in the eventdev PMD or uses the common
>>>> rte_service function. The PMD callbacks support the
>>>> eventdev PMD implementation of the adapter.
>>>>
>>>> Signed-off-by: Nikhil Rao <nikhil.rao@intel.com>
>>>> ---
>>>> +
>>>>    static inline int
>>>>    rte_event_dev_queue_config(struct rte_eventdev *dev, uint8_t nb_queues)
>>>>    {
>>>> @@ -1275,6 +1300,15 @@ int rte_event_dev_selftest(uint8_t dev_id)
>>>>           return RTE_EVENT_MAX_DEVS;
>>>>    }
>>>>
>>>> @@ -1295,6 +1329,9 @@ struct rte_eventdev *
>>>>
>>>>           eventdev = &rte_eventdevs[dev_id];
>>>>
>>>> +       if (eventdev->txa_enqueue == NULL)
>>>
>>> Is this check required, it will be always NULL. Right? if so,
>>> Can't we write eventdev->txa_enqueue directly?
>>>
>>>> +               eventdev->txa_enqueue = rte_event_tx_adapter_enqueue;
>>>> +
>>>
>>
>> The thought was that if the PMD supports txa_enqueue then it wouldn't be
>> NULL.
> 
> 
> Yes that's true. But in rte_event_pmd_allocate(), eventdev->txa_enqueue
> it will be NULL. Right? Do we need to add the if (eventdev->txa_enqueue == NULL) check?

OK, got it.

Nikhil
  

Patch

diff --git a/lib/librte_eventdev/rte_eventdev.h b/lib/librte_eventdev/rte_eventdev.h
index b6fd6ee..4717292 100644
--- a/lib/librte_eventdev/rte_eventdev.h
+++ b/lib/librte_eventdev/rte_eventdev.h
@@ -1186,6 +1186,32 @@  struct rte_event {
 rte_event_crypto_adapter_caps_get(uint8_t dev_id, uint8_t cdev_id,
 				  uint32_t *caps);
 
+/* Ethdev Tx adapter capability bitmap flags */
+#define RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT	0x1
+/**< This flag is sent when the PMD supports a packet transmit callback
+ */
+
+/**
+ * Retrieve the event device's eth Tx adapter capabilities
+ *
+ * @param dev_id
+ *   The identifier of the device.
+ *
+ * @param eth_port_id
+ *   The identifier of the ethernet device.
+ *
+ * @param[out] caps
+ *   A pointer to memory filled with eth Tx adapter capabilities.
+ *
+ * @return
+ *   - 0: Success, driver provides eth Tx adapter capabilities.
+ *   - <0: Error code returned by the driver function.
+ *
+ */
+int __rte_experimental
+rte_event_eth_tx_adapter_caps_get(uint8_t dev_id, uint16_t eth_port_id,
+				uint32_t *caps);
+
 struct rte_eventdev_ops;
 struct rte_eventdev;
 
@@ -1204,6 +1230,10 @@  typedef uint16_t (*event_dequeue_burst_t)(void *port, struct rte_event ev[],
 		uint16_t nb_events, uint64_t timeout_ticks);
 /**< @internal Dequeue burst of events from port of a device */
 
+typedef uint16_t (*event_tx_adapter_enqueue)(void *port,
+				struct rte_event ev[], uint16_t nb_events);
+/**< @internal Enqueue burst of events on port of a device */
+
 #define RTE_EVENTDEV_NAME_MAX_LEN	(64)
 /**< @internal Max length of name of event PMD */
 
@@ -1266,7 +1296,8 @@  struct rte_eventdev {
 	/**< Pointer to PMD dequeue function. */
 	event_dequeue_burst_t dequeue_burst;
 	/**< Pointer to PMD dequeue burst function. */
-
+	event_tx_adapter_enqueue txa_enqueue;
+	/**< Pointer to PMD eth Tx adapter enqueue function. */
 	struct rte_eventdev_data *data;
 	/**< Pointer to device data */
 	struct rte_eventdev_ops *dev_ops;
diff --git a/lib/librte_eventdev/rte_eventdev_pmd.h b/lib/librte_eventdev/rte_eventdev_pmd.h
index 3fbb4d2..cd7145a 100644
--- a/lib/librte_eventdev/rte_eventdev_pmd.h
+++ b/lib/librte_eventdev/rte_eventdev_pmd.h
@@ -789,6 +789,186 @@  typedef int (*eventdev_crypto_adapter_stats_reset)
 			(const struct rte_eventdev *dev,
 			 const struct rte_cryptodev *cdev);
 
+/**
+ * Retrieve the event device's eth Tx adapter capabilities.
+ *
+ * @param dev
+ *   Event device pointer
+ *
+ * @param eth_dev
+ *   Ethernet device pointer
+ *
+ * @param[out] caps
+ *   A pointer to memory filled with eth Tx adapter capabilities.
+ *
+ * @return
+ *   - 0: Success, driver provides eth Tx adapter capabilities
+ *   - <0: Error code returned by the driver function.
+ *
+ */
+typedef int (*eventdev_eth_tx_adapter_caps_get_t)
+					(const struct rte_eventdev *dev,
+					const struct rte_eth_dev *eth_dev,
+					uint32_t *caps);
+
+/**
+ * Create adapter callback.
+ *
+ * @param id
+ *   Adapter identifier
+ *
+ * @param dev
+ *   Event device pointer
+ *
+ * @return
+ *   - 0: Success.
+ *   - <0: Error code on failure.
+ */
+typedef int (*eventdev_eth_tx_adapter_create_t)(uint8_t id,
+					const struct rte_eventdev *dev);
+
+/**
+ * Free adapter callback.
+ *
+ * @param id
+ *   Adapter identifier
+ *
+ * @param dev
+ *   Event device pointer
+ *
+ * @return
+ *   - 0: Success.
+ *   - <0: Error code on failure.
+ */
+typedef int (*eventdev_eth_tx_adapter_free_t)(uint8_t id,
+					const struct rte_eventdev *dev);
+
+/**
+ * Add a Tx queue to the adapter.
+ * A queue value of -1 is used to indicate all
+ * queues within the device.
+ *
+ * @param id
+ *   Adapter identifier
+ *
+ * @param dev
+ *   Event device pointer
+ *
+ * @param eth_dev
+ *   Ethernet device pointer
+ *
+ * @param tx_queue_id
+ *   Transmt queue index
+ *
+ * @return
+ *   - 0: Success.
+ *   - <0: Error code on failure.
+ */
+typedef int (*eventdev_eth_tx_adapter_queue_add_t)(
+					uint8_t id,
+					const struct rte_eventdev *dev,
+					const struct rte_eth_dev *eth_dev,
+					int32_t tx_queue_id);
+
+/**
+ * Delete a Tx queue from the adapter.
+ * A queue value of -1 is used to indicate all
+ * queues within the device, that have been added to this
+ * adapter.
+ *
+ * @param id
+ *   Adapter identifier
+ *
+ * @param dev
+ *   Event device pointer
+ *
+ * @param eth_dev
+ *   Ethernet device pointer
+ *
+ * @param tx_queue_id
+ *   Transmit queue index
+ *
+ * @return
+ *  - 0: Success, Queues deleted successfully.
+ *  - <0: Error code on failure.
+ */
+typedef int (*eventdev_eth_tx_adapter_queue_del_t)(
+					uint8_t id,
+					const struct rte_eventdev *dev,
+					const struct rte_eth_dev *eth_dev,
+					int32_t tx_queue_id);
+
+/**
+ * Start the adapter.
+ *
+ * @param id
+ *   Adapter identifier
+ *
+ * @param dev
+ *   Event device pointer
+ *
+ * @return
+ *  - 0: Success, Adapter started correctly.
+ *  - <0: Error code on failure.
+ */
+typedef int (*eventdev_eth_tx_adapter_start_t)(uint8_t id,
+					const struct rte_eventdev *dev);
+
+/**
+ * Stop the adapter.
+ *
+ * @param id
+ *  Adapter identifier
+ *
+ * @param dev
+ *   Event device pointer
+ *
+ * @return
+ *  - 0: Success.
+ *  - <0: Error code on failure.
+ */
+typedef int (*eventdev_eth_tx_adapter_stop_t)(uint8_t id,
+					const struct rte_eventdev *dev);
+
+struct rte_event_eth_tx_adapter_stats;
+
+/**
+ * Retrieve statistics for an adapter
+ *
+ * @param id
+ *  Adapter identifier
+ *
+ * @param dev
+ *   Event device pointer
+ *
+ * @param [out] stats
+ *  A pointer to structure used to retrieve statistics for an adapter
+ *
+ * @return
+ *  - 0: Success, statistics retrieved successfully.
+ *  - <0: Error code on failure.
+ */
+typedef int (*eventdev_eth_tx_adapter_stats_get_t)(
+				uint8_t id,
+				const struct rte_eventdev *dev,
+				struct rte_event_eth_tx_adapter_stats *stats);
+
+/**
+ * Reset statistics for an adapter
+ *
+ * @param id
+ *  Adapter identifier
+ *
+ * @param dev
+ *   Event device pointer
+ *
+ * @return
+ *  - 0: Success, statistics retrieved successfully.
+ *  - <0: Error code on failure.
+ */
+typedef int (*eventdev_eth_tx_adapter_stats_reset_t)(uint8_t id,
+					const struct rte_eventdev *dev);
+
 /** Event device operations function pointer table */
 struct rte_eventdev_ops {
 	eventdev_info_get_t dev_infos_get;	/**< Get device info. */
@@ -862,6 +1042,26 @@  struct rte_eventdev_ops {
 	eventdev_crypto_adapter_stats_reset crypto_adapter_stats_reset;
 	/**< Reset crypto stats */
 
+	eventdev_eth_tx_adapter_caps_get_t eth_tx_adapter_caps_get;
+	/**< Get ethernet Tx adapter capabilities */
+
+	eventdev_eth_tx_adapter_create_t eth_tx_adapter_create;
+	/**< Create adapter callback */
+	eventdev_eth_tx_adapter_free_t eth_tx_adapter_free;
+	/**< Free adapter callback */
+	eventdev_eth_tx_adapter_queue_add_t eth_tx_adapter_queue_add;
+	/**< Add Tx queues to the eth Tx adapter */
+	eventdev_eth_tx_adapter_queue_del_t eth_tx_adapter_queue_del;
+	/**< Delete Tx queues from the eth Tx adapter */
+	eventdev_eth_tx_adapter_start_t eth_tx_adapter_start;
+	/**< Start eth Tx adapter */
+	eventdev_eth_tx_adapter_stop_t eth_tx_adapter_stop;
+	/**< Stop eth Tx adapter */
+	eventdev_eth_tx_adapter_stats_get_t eth_tx_adapter_stats_get;
+	/**< Get eth Tx adapter statistics */
+	eventdev_eth_tx_adapter_stats_reset_t eth_tx_adapter_stats_reset;
+	/**< Reset eth Tx adapter statistics */
+
 	eventdev_selftest dev_selftest;
 	/**< Start eventdev Selftest */
 
diff --git a/lib/librte_eventdev/rte_eventdev.c b/lib/librte_eventdev/rte_eventdev.c
index 801810e..52097a8 100644
--- a/lib/librte_eventdev/rte_eventdev.c
+++ b/lib/librte_eventdev/rte_eventdev.c
@@ -175,6 +175,31 @@ 
 		(dev, cdev, caps) : -ENOTSUP;
 }
 
+int __rte_experimental
+rte_event_eth_tx_adapter_caps_get(uint8_t dev_id, uint16_t eth_port_id,
+				uint32_t *caps)
+{
+	struct rte_eventdev *dev;
+	struct rte_eth_dev *eth_dev;
+
+	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
+	RTE_ETH_VALID_PORTID_OR_ERR_RET(eth_port_id, -EINVAL);
+
+	dev = &rte_eventdevs[dev_id];
+	eth_dev = &rte_eth_devices[eth_port_id];
+
+	if (caps == NULL)
+		return -EINVAL;
+
+	*caps = 0;
+
+	return dev->dev_ops->eth_tx_adapter_caps_get ?
+			(*dev->dev_ops->eth_tx_adapter_caps_get)(dev,
+								eth_dev,
+								caps)
+			: 0;
+}
+
 static inline int
 rte_event_dev_queue_config(struct rte_eventdev *dev, uint8_t nb_queues)
 {
@@ -1275,6 +1300,15 @@  int rte_event_dev_selftest(uint8_t dev_id)
 	return RTE_EVENT_MAX_DEVS;
 }
 
+static uint16_t
+rte_event_tx_adapter_enqueue(__rte_unused void *port,
+			__rte_unused struct rte_event ev[],
+			__rte_unused uint16_t nb_events)
+{
+	rte_errno = ENOTSUP;
+	return 0;
+}
+
 struct rte_eventdev *
 rte_event_pmd_allocate(const char *name, int socket_id)
 {
@@ -1295,6 +1329,9 @@  struct rte_eventdev *
 
 	eventdev = &rte_eventdevs[dev_id];
 
+	if (eventdev->txa_enqueue == NULL)
+		eventdev->txa_enqueue = rte_event_tx_adapter_enqueue;
+
 	if (eventdev->data == NULL) {
 		struct rte_eventdev_data *eventdev_data = NULL;