[v2,2/4] eventdev: add caps API and PMD callbacks for eth Tx adapter
Checks
Commit Message
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
-----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>
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
-----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
>
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
@@ -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;
@@ -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 */
@@ -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;