>Subject: [PATCH v1 1/2] eventdev: introduce crypto adapter enqueue
>API
>
>From: Akhil Goyal <gak...@marvell.com>
>
>In case an event from a previous stage is required to be forwarded
>to a crypto adapter and PMD supports internal event port in crypto
>adapter, exposed via capability
>RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD, we
>do not have
>a way to check in the API rte_event_enqueue_burst(), whether it is
>for crypto adapter or for eth tx adapter.
>
>Hence we need a new API similar to
>rte_event_eth_tx_adapter_enqueue(),
>which can send to a crypto adapter.
>
>Note that RTE_EVENT_TYPE_* cannot be used to make that decision,
>as it is meant for event source and not event destination.
>And event port designated for crypto adapter is designed to be used
>for OP_NEW mode.
>
>Hence, in order to support an event PMD which has an internal event
>port
>in crypto adapter (RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD
>mode), exposed
>via capability
>RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD,
>application should use rte_event_crypto_adapter_enqueue() API to
>enqueue
>events.
>
>When internal port is not
>available(RTE_EVENT_CRYPTO_ADAPTER_OP_NEW mode),
>application can use API rte_event_enqueue_burst() as it was doing
>earlier,
>i.e. retrieve event port used by crypto adapter and bind its event queues
>to that port and enqueue events using the API
>rte_event_enqueue_burst().
>
>Signed-off-by: Akhil Goyal <gak...@marvell.com>
>---
> .../prog_guide/event_crypto_adapter.rst       | 69 ++++++++++++-------
> lib/librte_eventdev/eventdev_trace_points.c   |  3 +
> .../rte_event_crypto_adapter.h                | 66 ++++++++++++++++++
> lib/librte_eventdev/rte_eventdev.c            | 10 +++
> lib/librte_eventdev/rte_eventdev.h            |  8 ++-
> lib/librte_eventdev/rte_eventdev_trace_fp.h   | 10 +++
> lib/librte_eventdev/version.map               |  3 +

Please update release notes.

> 7 files changed, 142 insertions(+), 27 deletions(-)
>
>diff --git a/doc/guides/prog_guide/event_crypto_adapter.rst
>b/doc/guides/prog_guide/event_crypto_adapter.rst
>index 1e3eb7139..4fb5c688e 100644
>--- a/doc/guides/prog_guide/event_crypto_adapter.rst
>+++ b/doc/guides/prog_guide/event_crypto_adapter.rst
>@@ -55,21 +55,22 @@ which is needed to enqueue an event after the
>crypto operation is completed.
> RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD mode
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
>-In the RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD mode, if HW
>supports
>-RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD
>capability the application
>-can directly submit the crypto operations to the cryptodev.
>-If not, application retrieves crypto adapter's event port using
>-rte_event_crypto_adapter_event_port_get() API. Then, links its event
>-queue to this port and starts enqueuing crypto operations as events
>-to the eventdev. The adapter then dequeues the events and submits
>the
>-crypto operations to the cryptodev. After the crypto completions, the
>-adapter enqueues events to the event device.
>-Application can use this mode, when ingress packet ordering is needed.
>-In this mode, events dequeued from the adapter will be treated as
>-forwarded events. The application needs to specify the cryptodev ID
>-and queue pair ID (request information) needed to enqueue a crypto
>-operation in addition to the event information (response information)
>-needed to enqueue an event after the crypto operation has completed.
>+In the ``RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD`` mode, if the
>event PMD and crypto
>+PMD supports internal event port
>+(``RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD``),
>the application should
>+use ``rte_event_crypto_adapter_enqueue()`` API to enqueue crypto
>operations as
>+events to crypto adapter. If not, application retrieves crypto adapter's
>event
>+port using ``rte_event_crypto_adapter_event_port_get()`` API, links its
>event
>+queue to this port and starts enqueuing crypto operations as events to
>eventdev
>+using ``rte_event_enqueue_burst()``. The adapter then dequeues the
>events and
>+submits the crypto operations to the cryptodev. After the crypto
>operation is
>+complete, the adapter enqueues events to the event device. The
>application can
>+use this mode when ingress packet ordering is needed. In this mode,
>events
>+dequeued from the adapter will be treated as forwarded events. The
>application
>+needs to specify the cryptodev ID and queue pair ID (request
>information) needed
>+to enqueue a crypto operation in addition to the event information
>(response
>+information) needed to enqueue an event after the crypto operation
>has
>+completed.
>
> .. _figure_event_crypto_adapter_op_forward:
>
>@@ -120,28 +121,44 @@ service function and needs to create an
>event port for it. The callback is
> expected to fill the ``struct rte_event_crypto_adapter_conf`` structure
> passed to it.
>
>-For RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD mode, the event
>port created by adapter
>-can be retrieved using ``rte_event_crypto_adapter_event_port_get()``
>API.
>-Application can use this event port to link with event queue on which it
>-enqueues events towards the crypto adapter.
>+In the ``RTE_EVENT_CRYPTO_ADAPTER_OP_FORWARD`` mode, if the
>event PMD and crypto
>+PMD supports internal event port
>+(``RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD``),
>events with crypto
>+operations should be enqueued to the crypto adapter using
>+``rte_event_crypto_adapter_enqueue()`` API. If not, the event port
>created by
>+the adapter can be retrieved using
>``rte_event_crypto_adapter_event_port_get()``
>+API. An application can use this event port to link with an event queue,
>on
>+which it enqueues events towards the crypto adapter using
>+``rte_event_enqueue_burst()``.
>
> .. code-block:: c
>
>-        uint8_t id, evdev, crypto_ev_port_id, app_qid;
>+        uint8_t id, evdev_id, cdev_id, crypto_ev_port_id, app_qid;
>         struct rte_event ev;
>+        uint32_t cap;
>         int ret;
>
>-        ret = rte_event_crypto_adapter_event_port_get(id,
>&crypto_ev_port_id);
>-        ret = rte_event_queue_setup(evdev, app_qid, NULL);
>-        ret = rte_event_port_link(evdev, crypto_ev_port_id, &app_qid,
>NULL, 1);
>-
>         // Fill in event info and update event_ptr with rte_crypto_op
>         memset(&ev, 0, sizeof(ev));
>-        ev.queue_id = app_qid;
>         .
>         .
>         ev.event_ptr = op;
>-        ret = rte_event_enqueue_burst(evdev, app_ev_port_id, ev,
>nb_events);
>+
>+        ret = rte_event_crypto_adapter_caps_get(evdev_id, cdev_id,
>&cap);
>+        if (cap &
>RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD) {
>+                ret = rte_event_crypto_adapter_enqueue(evdev_id,
>app_ev_port_id,
>+                                                       ev, nb_events);
>+        } else {
>+                ret = rte_event_crypto_adapter_event_port_get(id,
>+                                                        &crypto_ev_port_id);
>+                ret = rte_event_queue_setup(evdev_id, app_qid, NULL);
>+                ret = rte_event_port_link(evdev_id, crypto_ev_port_id,
>&app_qid,
>+                                          NULL, 1);
>+                ev.queue_id = app_qid;
>+                ret = rte_event_enqueue_burst(evdev_id, app_ev_port_id, ev,
>+                                              nb_events);
>+        }
>+
>
> Querying adapter capabilities
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>diff --git a/lib/librte_eventdev/eventdev_trace_points.c
>b/lib/librte_eventdev/eventdev_trace_points.c
>index 1a0ccc448..3867ec800 100644
>--- a/lib/librte_eventdev/eventdev_trace_points.c
>+++ b/lib/librte_eventdev/eventdev_trace_points.c
>@@ -118,3 +118,6 @@
>RTE_TRACE_POINT_REGISTER(rte_eventdev_trace_crypto_adapter_sta
>rt,
>
>
>RTE_TRACE_POINT_REGISTER(rte_eventdev_trace_crypto_adapter_sto
>p,
>       lib.eventdev.crypto.stop)
>+
>+RTE_TRACE_POINT_REGISTER(rte_eventdev_trace_crypto_adapter_e
>nqueue,
>+      lib.eventdev.crypto.enq)
>diff --git a/lib/librte_eventdev/rte_event_crypto_adapter.h
>b/lib/librte_eventdev/rte_event_crypto_adapter.h
>index 60630ef66..003667759 100644
>--- a/lib/librte_eventdev/rte_event_crypto_adapter.h
>+++ b/lib/librte_eventdev/rte_event_crypto_adapter.h
>@@ -522,6 +522,72 @@
>rte_event_crypto_adapter_service_id_get(uint8_t id, uint32_t
>*service_id);
> int
> rte_event_crypto_adapter_event_port_get(uint8_t id, uint8_t
>*event_port_id);
>
>+/**
>+ * Enqueue a burst of crypto operations as events object supplied in
>*rte_event*
>+ * structure on an event crypto adapter designated by its event
>*dev_id* through
>+ * the event port specified by *port_id*. This function is supported if
>the
>+ * eventdev PMD has the
>#RTE_EVENT_CRYPTO_ADAPTER_CAP_INTERNAL_PORT_OP_FWD
>+ * capability flag set.
>+ *
>+ * The *nb_events* parameter is the number of event objects to
>enqueue which are
>+ * supplied in the *ev* array of *rte_event* structure.
>+ *
>+ * The rte_event_crypto_adapter_enqueue() function returns the
>number of
>+ * events objects it actually enqueued. A return value equal to
>*nb_events*
>+ * means that all event objects have been enqueued.
>+ *
>+ * @param dev_id
>+ *  The identifier of the device.
>+ * @param port_id
>+ *  The identifier of the event port.
>+ * @param ev
>+ *  Points to an array of *nb_events* objects of type *rte_event*
>structure
>+ *  which contain the event object enqueue operations to be
>processed.
>+ * @param nb_events
>+ *  The number of event objects to enqueue, typically number of
>+ *
>rte_event_port_attr_get(...RTE_EVENT_PORT_ATTR_ENQ_DEPTH...)
>+ *  available for this port.
>+ *
>+ * @return
>+ *   The number of event objects actually enqueued on the event
>device. The
>+ *   return value can be less than the value of the *nb_events*
>parameter when
>+ *   the event devices queue is full or if invalid parameters are specified
>in a
>+ *   *rte_event*. If the return value is less than *nb_events*, the
>remaining
>+ *   events at the end of ev[] are not consumed and the caller has to
>take care
>+ *   of them, and rte_errno is set accordingly. Possible errno values
>include:
>+ *   - EINVAL   The port ID is invalid, device ID is invalid, an event's
>queue
>+ *              ID is invalid, or an event's sched type doesn't match the
>+ *              capabilities of the destination queue.
>+ *   - ENOSPC   The event port was backpressured and unable to
>enqueue
>+ *              one or more events. This error code is only applicable to
>+ *              closed systems.
>+ */
>+static inline uint16_t
>+rte_event_crypto_adapter_enqueue(uint8_t dev_id,
>+                              uint8_t port_id,
>+                              struct rte_event ev[],
>+                              uint16_t nb_events)
>+{
>+      const struct rte_eventdev *dev = &rte_eventdevs[dev_id];
>+
>+#ifdef RTE_LIBRTE_EVENTDEV_DEBUG
>+      if (dev_id >= RTE_EVENT_MAX_DEVS ||
>+              !rte_eventdevs[dev_id].attached) {
>+              rte_errno = EINVAL;
>+              return 0;

Please use RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET

>+      }
>+
>+      if (port_id >= dev->data->nb_ports) {
>+              rte_errno = EINVAL;
>+              return 0;
>+      }
>+#endif
>+      rte_eventdev_trace_crypto_adapter_enqueue(dev_id, port_id,
>ev,
>+              nb_events);
>+
>+      return dev->ca_enqueue(dev->data->ports[port_id], ev,
>nb_events);
>+}
>+
> #ifdef __cplusplus
> }
> #endif
>diff --git a/lib/librte_eventdev/rte_eventdev.c
>b/lib/librte_eventdev/rte_eventdev.c
>index b57363f80..5674bd38e 100644
>--- a/lib/librte_eventdev/rte_eventdev.c
>+++ b/lib/librte_eventdev/rte_eventdev.c
>@@ -1405,6 +1405,15 @@
>rte_event_tx_adapter_enqueue(__rte_unused void *port,
>       return 0;
> }
>
>+static uint16_t
>+rte_event_crypto_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)
> {
>@@ -1427,6 +1436,7 @@ rte_event_pmd_allocate(const char *name,
>int socket_id)
>
>       eventdev->txa_enqueue = rte_event_tx_adapter_enqueue;
>       eventdev->txa_enqueue_same_dest =
>rte_event_tx_adapter_enqueue;
>+      eventdev->ca_enqueue = rte_event_crypto_adapter_enqueue;
>
>       if (eventdev->data == NULL) {
>               struct rte_eventdev_data *eventdev_data = NULL;
>diff --git a/lib/librte_eventdev/rte_eventdev.h
>b/lib/librte_eventdev/rte_eventdev.h
>index 9fc39e9ca..b50027f88 100644
>--- a/lib/librte_eventdev/rte_eventdev.h
>+++ b/lib/librte_eventdev/rte_eventdev.h
>@@ -1276,6 +1276,10 @@ typedef uint16_t
>(*event_tx_adapter_enqueue_same_dest)(void *port,
>  * burst having same destination Ethernet port & Tx queue.
>  */
>
>+typedef uint16_t (*event_crypto_adapter_enqueue)(void *port,
>+                              struct rte_event ev[], uint16_t
>nb_events);
>+/**< @internal Enqueue burst of events on crypto adapter */
>+
> #define RTE_EVENTDEV_NAME_MAX_LEN     (64)
> /**< @internal Max length of name of event PMD */
>
>@@ -1347,6 +1351,8 @@ struct rte_eventdev {
>        */
>       event_tx_adapter_enqueue txa_enqueue;
>       /**< Pointer to PMD eth Tx adapter enqueue function. */
>+      event_crypto_adapter_enqueue ca_enqueue;
>+      /**< Pointer to PMD crypto adapter enqueue function. */
>       struct rte_eventdev_data *data;
>       /**< Pointer to device data */
>       struct rte_eventdev_ops *dev_ops;
>@@ -1359,7 +1365,7 @@ struct rte_eventdev {
>       /**< Flag indicating the device is attached */
>
>       uint64_t reserved_64s[4]; /**< Reserved for future fields */
>-      void *reserved_ptrs[4];   /**< Reserved for future fields */
>+      void *reserved_ptrs[3];   /**< Reserved for future fields */
> } __rte_cache_aligned;
>
> extern struct rte_eventdev *rte_eventdevs;
>diff --git a/lib/librte_eventdev/rte_eventdev_trace_fp.h
>b/lib/librte_eventdev/rte_eventdev_trace_fp.h
>index 349129c0f..5639e0b83 100644
>--- a/lib/librte_eventdev/rte_eventdev_trace_fp.h
>+++ b/lib/librte_eventdev/rte_eventdev_trace_fp.h
>@@ -49,6 +49,16 @@ RTE_TRACE_POINT_FP(
>       rte_trace_point_emit_u8(flags);
> )
>
>+RTE_TRACE_POINT_FP(
>+      rte_eventdev_trace_crypto_adapter_enqueue,
>+      RTE_TRACE_POINT_ARGS(uint8_t dev_id, uint8_t port_id, void
>*ev_table,
>+              uint16_t nb_events),
>+      rte_trace_point_emit_u8(dev_id);
>+      rte_trace_point_emit_u8(port_id);
>+      rte_trace_point_emit_ptr(ev_table);
>+      rte_trace_point_emit_u16(nb_events);
>+)
>+
> RTE_TRACE_POINT_FP(
>       rte_eventdev_trace_timer_arm_burst,
>       RTE_TRACE_POINT_ARGS(const void *adapter, void
>**evtims_table,
>diff --git a/lib/librte_eventdev/version.map
>b/lib/librte_eventdev/version.map
>index 3e5c09cfd..c63ba7a9c 100644
>--- a/lib/librte_eventdev/version.map
>+++ b/lib/librte_eventdev/version.map
>@@ -138,6 +138,9 @@ EXPERIMENTAL {
>       __rte_eventdev_trace_port_setup;
>       # added in 20.11
>       rte_event_pmd_pci_probe_named;
>+
>+      # added in 21.05
>+      __rte_eventdev_trace_crypto_adapter_enqueue;
> };
>
> INTERNAL {
>--
>2.25.1

Reply via email to