xref: /dpdk/lib/eventdev/rte_event_dma_adapter.h (revision 29911b323e7a4200b95e2049df08779c0673fbfc)
166a30a29SAmit Prakash Shukla /* SPDX-License-Identifier: BSD-3-Clause
266a30a29SAmit Prakash Shukla  * Copyright (c) 2023 Marvell.
366a30a29SAmit Prakash Shukla  */
466a30a29SAmit Prakash Shukla 
566a30a29SAmit Prakash Shukla #ifndef RTE_EVENT_DMA_ADAPTER
666a30a29SAmit Prakash Shukla #define RTE_EVENT_DMA_ADAPTER
766a30a29SAmit Prakash Shukla 
866a30a29SAmit Prakash Shukla /**
966a30a29SAmit Prakash Shukla  * @file rte_event_dma_adapter.h
1066a30a29SAmit Prakash Shukla  *
1166a30a29SAmit Prakash Shukla  * @warning
1266a30a29SAmit Prakash Shukla  * @b EXPERIMENTAL:
1366a30a29SAmit Prakash Shukla  * All functions in this file may be changed or removed without prior notice.
1466a30a29SAmit Prakash Shukla  *
1566a30a29SAmit Prakash Shukla  * DMA Event Adapter API.
1666a30a29SAmit Prakash Shukla  *
1766a30a29SAmit Prakash Shukla  * Eventdev library provides adapters to bridge between various components for providing new
1866a30a29SAmit Prakash Shukla  * event source. The event DMA adapter is one of those adapters which is intended to bridge
1966a30a29SAmit Prakash Shukla  * between event devices and DMA devices.
2066a30a29SAmit Prakash Shukla  *
2166a30a29SAmit Prakash Shukla  * The DMA adapter adds support to enqueue / dequeue DMA operations to / from event device. The
2266a30a29SAmit Prakash Shukla  * packet flow between DMA device and the event device can be accomplished using both SW and HW
2366a30a29SAmit Prakash Shukla  * based transfer mechanisms. The adapter uses an EAL service core function for SW based packet
2466a30a29SAmit Prakash Shukla  * transfer and uses the eventdev PMD functions to configure HW based packet transfer between the
2566a30a29SAmit Prakash Shukla  * DMA device and the event device.
2666a30a29SAmit Prakash Shukla  *
2766a30a29SAmit Prakash Shukla  * The application can choose to submit a DMA operation directly to an DMA device or send it to the
2866a30a29SAmit Prakash Shukla  * DMA adapter via eventdev based on RTE_EVENT_DMA_ADAPTER_CAP_INTERNAL_PORT_OP_FWD capability. The
2966a30a29SAmit Prakash Shukla  * first mode is known as the event new (RTE_EVENT_DMA_ADAPTER_OP_NEW) mode and the second as the
3066a30a29SAmit Prakash Shukla  * event forward (RTE_EVENT_DMA_ADAPTER_OP_FORWARD) mode. The choice of mode can be specified while
3166a30a29SAmit Prakash Shukla  * creating the adapter. In the former mode, it is an application responsibility to enable ingress
3266a30a29SAmit Prakash Shukla  * packet ordering. In the latter mode, it is the adapter responsibility to enable the ingress
3366a30a29SAmit Prakash Shukla  * packet ordering.
3466a30a29SAmit Prakash Shukla  *
3566a30a29SAmit Prakash Shukla  *
3666a30a29SAmit Prakash Shukla  * Working model of RTE_EVENT_DMA_ADAPTER_OP_NEW mode:
3766a30a29SAmit Prakash Shukla  *
3866a30a29SAmit Prakash Shukla  *                +--------------+         +--------------+
3966a30a29SAmit Prakash Shukla  *                |              |         |   DMA stage  |
4066a30a29SAmit Prakash Shukla  *                | Application  |---[2]-->| + enqueue to |
4166a30a29SAmit Prakash Shukla  *                |              |         |     dmadev   |
4266a30a29SAmit Prakash Shukla  *                +--------------+         +--------------+
4366a30a29SAmit Prakash Shukla  *                    ^   ^                       |
4466a30a29SAmit Prakash Shukla  *                    |   |                      [3]
4566a30a29SAmit Prakash Shukla  *                   [6] [1]                      |
4666a30a29SAmit Prakash Shukla  *                    |   |                       |
4766a30a29SAmit Prakash Shukla  *                +--------------+                |
4866a30a29SAmit Prakash Shukla  *                |              |                |
4966a30a29SAmit Prakash Shukla  *                | Event device |                |
5066a30a29SAmit Prakash Shukla  *                |              |                |
5166a30a29SAmit Prakash Shukla  *                +--------------+                |
5266a30a29SAmit Prakash Shukla  *                       ^                        |
5366a30a29SAmit Prakash Shukla  *                       |                        |
5466a30a29SAmit Prakash Shukla  *                      [5]                       |
5566a30a29SAmit Prakash Shukla  *                       |                        v
5666a30a29SAmit Prakash Shukla  *                +--------------+         +--------------+
5766a30a29SAmit Prakash Shukla  *                |              |         |              |
5866a30a29SAmit Prakash Shukla  *                |  DMA adapter |<--[4]---|    dmadev    |
5966a30a29SAmit Prakash Shukla  *                |              |         |              |
6066a30a29SAmit Prakash Shukla  *                +--------------+         +--------------+
6166a30a29SAmit Prakash Shukla  *
6266a30a29SAmit Prakash Shukla  *
6366a30a29SAmit Prakash Shukla  *         [1] Application dequeues events from the previous stage.
6466a30a29SAmit Prakash Shukla  *         [2] Application prepares the DMA operations.
6566a30a29SAmit Prakash Shukla  *         [3] DMA operations are submitted to dmadev by application.
6666a30a29SAmit Prakash Shukla  *         [4] DMA adapter dequeues DMA completions from dmadev.
6766a30a29SAmit Prakash Shukla  *         [5] DMA adapter enqueues events to the eventdev.
6866a30a29SAmit Prakash Shukla  *         [6] Application dequeues from eventdev for further processing.
6966a30a29SAmit Prakash Shukla  *
7066a30a29SAmit Prakash Shukla  * In the RTE_EVENT_DMA_ADAPTER_OP_NEW mode, application submits DMA operations directly to DMA
7166a30a29SAmit Prakash Shukla  * device. The DMA adapter then dequeues DMA completions from DMA device and enqueue events to the
7266a30a29SAmit Prakash Shukla  * event device. This mode does not ensure ingress ordering, if the application directly enqueues
7366a30a29SAmit Prakash Shukla  * to dmadev without going through DMA / atomic stage i.e. removing item [1] and [2].
7466a30a29SAmit Prakash Shukla  *
7566a30a29SAmit Prakash Shukla  * Events dequeued from the adapter will be treated as new events. In this mode, application needs
7666a30a29SAmit Prakash Shukla  * to specify event information (response information) which is needed to enqueue an event after the
7766a30a29SAmit Prakash Shukla  * DMA operation is completed.
7866a30a29SAmit Prakash Shukla  *
7966a30a29SAmit Prakash Shukla  *
8066a30a29SAmit Prakash Shukla  * Working model of RTE_EVENT_DMA_ADAPTER_OP_FORWARD mode:
8166a30a29SAmit Prakash Shukla  *
8266a30a29SAmit Prakash Shukla  *                +--------------+         +--------------+
8366a30a29SAmit Prakash Shukla  *        --[1]-->|              |---[2]-->|  Application |
8466a30a29SAmit Prakash Shukla  *                | Event device |         |      in      |
8566a30a29SAmit Prakash Shukla  *        <--[8]--|              |<--[3]---| Ordered stage|
8666a30a29SAmit Prakash Shukla  *                +--------------+         +--------------+
8766a30a29SAmit Prakash Shukla  *                    ^      |
8866a30a29SAmit Prakash Shukla  *                    |     [4]
8966a30a29SAmit Prakash Shukla  *                   [7]     |
9066a30a29SAmit Prakash Shukla  *                    |      v
9166a30a29SAmit Prakash Shukla  *               +----------------+       +--------------+
9266a30a29SAmit Prakash Shukla  *               |                |--[5]->|              |
9366a30a29SAmit Prakash Shukla  *               |   DMA adapter  |       |     dmadev   |
9466a30a29SAmit Prakash Shukla  *               |                |<-[6]--|              |
9566a30a29SAmit Prakash Shukla  *               +----------------+       +--------------+
9666a30a29SAmit Prakash Shukla  *
9766a30a29SAmit Prakash Shukla  *
9866a30a29SAmit Prakash Shukla  *         [1] Events from the previous stage.
9966a30a29SAmit Prakash Shukla  *         [2] Application in ordered stage dequeues events from eventdev.
10066a30a29SAmit Prakash Shukla  *         [3] Application enqueues DMA operations as events to eventdev.
10166a30a29SAmit Prakash Shukla  *         [4] DMA adapter dequeues event from eventdev.
10266a30a29SAmit Prakash Shukla  *         [5] DMA adapter submits DMA operations to dmadev (Atomic stage).
10366a30a29SAmit Prakash Shukla  *         [6] DMA adapter dequeues DMA completions from dmadev
10466a30a29SAmit Prakash Shukla  *         [7] DMA adapter enqueues events to the eventdev
10566a30a29SAmit Prakash Shukla  *         [8] Events to the next stage
10666a30a29SAmit Prakash Shukla  *
10766a30a29SAmit Prakash Shukla  * In the event forward (RTE_EVENT_DMA_ADAPTER_OP_FORWARD) mode, if the HW supports the capability
10866a30a29SAmit Prakash Shukla  * RTE_EVENT_DMA_ADAPTER_CAP_INTERNAL_PORT_OP_FWD, application can directly submit the DMA
10966a30a29SAmit Prakash Shukla  * operations to the dmadev. If not, application retrieves the event port of the DMA adapter
11066a30a29SAmit Prakash Shukla  * through the API, rte_event_DMA_adapter_event_port_get(). Then, links its event queue to this
11166a30a29SAmit Prakash Shukla  * port and starts enqueuing DMA operations as events to the eventdev. The adapter then dequeues
11266a30a29SAmit Prakash Shukla  * the events and submits the DMA operations to the dmadev. After the DMA completions, the adapter
11366a30a29SAmit Prakash Shukla  * enqueues events to the event device.
11466a30a29SAmit Prakash Shukla  *
11566a30a29SAmit Prakash Shukla  * Application can use this mode, when ingress packet ordering is needed. Events dequeued from the
11666a30a29SAmit Prakash Shukla  * adapter will be treated as forwarded events. In this mode, the application needs to specify the
11766a30a29SAmit Prakash Shukla  * dmadev ID and queue pair ID (request information) needed to enqueue an DMA operation in addition
11866a30a29SAmit Prakash Shukla  * to the event information (response information) needed to enqueue an event after the DMA
11966a30a29SAmit Prakash Shukla  * operation has completed.
12066a30a29SAmit Prakash Shukla  *
12166a30a29SAmit Prakash Shukla  * The event DMA adapter provides common APIs to configure the packet flow from the DMA device to
12266a30a29SAmit Prakash Shukla  * event devices for both SW and HW based transfers. The DMA event adapter's functions are:
12366a30a29SAmit Prakash Shukla  *
12466a30a29SAmit Prakash Shukla  *  - rte_event_dma_adapter_create_ext()
12566a30a29SAmit Prakash Shukla  *  - rte_event_dma_adapter_create()
12666a30a29SAmit Prakash Shukla  *  - rte_event_dma_adapter_free()
12766a30a29SAmit Prakash Shukla  *  - rte_event_dma_adapter_vchan_add()
12866a30a29SAmit Prakash Shukla  *  - rte_event_dma_adapter_vchan_del()
12966a30a29SAmit Prakash Shukla  *  - rte_event_dma_adapter_start()
13066a30a29SAmit Prakash Shukla  *  - rte_event_dma_adapter_stop()
13166a30a29SAmit Prakash Shukla  *  - rte_event_dma_adapter_stats_get()
13266a30a29SAmit Prakash Shukla  *  - rte_event_dma_adapter_stats_reset()
13366a30a29SAmit Prakash Shukla  *
13466a30a29SAmit Prakash Shukla  * The application creates an instance using rte_event_dma_adapter_create() or
13566a30a29SAmit Prakash Shukla  * rte_event_dma_adapter_create_ext().
13666a30a29SAmit Prakash Shukla  *
13766a30a29SAmit Prakash Shukla  * dmadev queue pair addition / deletion is done using the rte_event_dma_adapter_vchan_add() /
13866a30a29SAmit Prakash Shukla  * rte_event_dma_adapter_vchan_del() APIs. If HW supports the capability
13966a30a29SAmit Prakash Shukla  * RTE_EVENT_DMA_ADAPTER_CAP_INTERNAL_PORT_VCHAN_EV_BIND, event information must be passed to the
14066a30a29SAmit Prakash Shukla  * add API.
14166a30a29SAmit Prakash Shukla  *
14266a30a29SAmit Prakash Shukla  */
14366a30a29SAmit Prakash Shukla 
14466a30a29SAmit Prakash Shukla #include <stdint.h>
14566a30a29SAmit Prakash Shukla 
14666a30a29SAmit Prakash Shukla #include <rte_common.h>
14766a30a29SAmit Prakash Shukla #include <rte_dmadev_pmd.h>
14866a30a29SAmit Prakash Shukla #include <rte_eventdev.h>
14966a30a29SAmit Prakash Shukla 
15066a30a29SAmit Prakash Shukla #ifdef __cplusplus
15166a30a29SAmit Prakash Shukla extern "C" {
15266a30a29SAmit Prakash Shukla #endif
15366a30a29SAmit Prakash Shukla 
15466a30a29SAmit Prakash Shukla /**
15566a30a29SAmit Prakash Shukla  * A structure used to hold event based DMA operation entry. All the information
15666a30a29SAmit Prakash Shukla  * required for a DMA transfer shall be populated in "struct rte_event_dma_adapter_op"
15766a30a29SAmit Prakash Shukla  * instance.
15866a30a29SAmit Prakash Shukla  */
15966a30a29SAmit Prakash Shukla struct rte_event_dma_adapter_op {
16066a30a29SAmit Prakash Shukla 	uint64_t flags;
16166a30a29SAmit Prakash Shukla 	/**< Flags related to the operation.
16266a30a29SAmit Prakash Shukla 	 * @see RTE_DMA_OP_FLAG_*
16366a30a29SAmit Prakash Shukla 	 */
16466a30a29SAmit Prakash Shukla 	struct rte_mempool *op_mp;
16566a30a29SAmit Prakash Shukla 	/**< Mempool from which op is allocated. */
166588dcac2SPavan Nikhilesh 	enum rte_dma_status_code status;
167588dcac2SPavan Nikhilesh 	/**< Status code for this operation. */
168588dcac2SPavan Nikhilesh 	uint32_t rsvd;
169588dcac2SPavan Nikhilesh 	/**< Reserved for future use. */
170588dcac2SPavan Nikhilesh 	uint64_t impl_opaque[2];
171588dcac2SPavan Nikhilesh 	/**< Implementation-specific opaque data.
172588dcac2SPavan Nikhilesh 	 * An dma device implementation use this field to hold
173588dcac2SPavan Nikhilesh 	 * implementation specific values to share between dequeue and enqueue
174588dcac2SPavan Nikhilesh 	 * operations.
175588dcac2SPavan Nikhilesh 	 * The application should not modify this field.
176588dcac2SPavan Nikhilesh 	 */
177588dcac2SPavan Nikhilesh 	uint64_t user_meta;
178588dcac2SPavan Nikhilesh 	/**<  Memory to store user specific metadata.
179588dcac2SPavan Nikhilesh 	 * The dma device implementation should not modify this area.
180588dcac2SPavan Nikhilesh 	 */
181588dcac2SPavan Nikhilesh 	uint64_t event_meta;
182cfa81500SPavan Nikhilesh 	/**< Event metadata of DMA completion event.
183cfa81500SPavan Nikhilesh 	 * Used when RTE_EVENT_DMA_ADAPTER_CAP_INTERNAL_PORT_VCHAN_EV_BIND is not
184cfa81500SPavan Nikhilesh 	 * supported in OP_NEW mode.
185588dcac2SPavan Nikhilesh 	 * @see rte_event_dma_adapter_mode::RTE_EVENT_DMA_ADAPTER_OP_NEW
186cfa81500SPavan Nikhilesh 	 * @see RTE_EVENT_DMA_ADAPTER_CAP_INTERNAL_PORT_VCHAN_EV_BIND
187cfa81500SPavan Nikhilesh 	 *
188cfa81500SPavan Nikhilesh 	 * Used when RTE_EVENT_DMA_ADAPTER_CAP_INTERNAL_PORT_OP_FWD is not
189cfa81500SPavan Nikhilesh 	 * supported in OP_FWD mode.
190cfa81500SPavan Nikhilesh 	 * @see rte_event_dma_adapter_mode::RTE_EVENT_DMA_ADAPTER_OP_FORWARD
191cfa81500SPavan Nikhilesh 	 * @see RTE_EVENT_DMA_ADAPTER_CAP_INTERNAL_PORT_OP_FWD
192cfa81500SPavan Nikhilesh 	 *
193588dcac2SPavan Nikhilesh 	 * @see struct rte_event::event
194588dcac2SPavan Nikhilesh 	 */
195588dcac2SPavan Nikhilesh 	int16_t dma_dev_id;
196588dcac2SPavan Nikhilesh 	/**< DMA device ID to be used with OP_FORWARD mode.
197588dcac2SPavan Nikhilesh 	 * @see rte_event_dma_adapter_mode::RTE_EVENT_DMA_ADAPTER_OP_FORWARD
198588dcac2SPavan Nikhilesh 	 */
199588dcac2SPavan Nikhilesh 	uint16_t vchan;
200588dcac2SPavan Nikhilesh 	/**< DMA vchan ID to be used with OP_FORWARD mode
201588dcac2SPavan Nikhilesh 	 * @see rte_event_dma_adapter_mode::RTE_EVENT_DMA_ADAPTER_OP_FORWARD
202588dcac2SPavan Nikhilesh 	 */
203588dcac2SPavan Nikhilesh 	uint16_t nb_src;
204588dcac2SPavan Nikhilesh 	/**< Number of source segments. */
205588dcac2SPavan Nikhilesh 	uint16_t nb_dst;
206588dcac2SPavan Nikhilesh 	/**< Number of destination segments. */
207*29911b32SStephen Hemminger 	struct rte_dma_sge src_dst_seg[];
208588dcac2SPavan Nikhilesh 	/**< Source and destination segments. */
20966a30a29SAmit Prakash Shukla };
21066a30a29SAmit Prakash Shukla 
21166a30a29SAmit Prakash Shukla /**
21266a30a29SAmit Prakash Shukla  *  DMA event adapter mode
21366a30a29SAmit Prakash Shukla  */
21466a30a29SAmit Prakash Shukla enum rte_event_dma_adapter_mode {
21566a30a29SAmit Prakash Shukla 	RTE_EVENT_DMA_ADAPTER_OP_NEW,
21666a30a29SAmit Prakash Shukla 	/**< Start the DMA adapter in event new mode.
21766a30a29SAmit Prakash Shukla 	 * @see RTE_EVENT_OP_NEW.
21866a30a29SAmit Prakash Shukla 	 *
21966a30a29SAmit Prakash Shukla 	 * Application submits DMA operations to the dmadev. Adapter only dequeues the DMA
22066a30a29SAmit Prakash Shukla 	 * completions from dmadev and enqueue events to the eventdev.
22166a30a29SAmit Prakash Shukla 	 */
22266a30a29SAmit Prakash Shukla 
22366a30a29SAmit Prakash Shukla 	RTE_EVENT_DMA_ADAPTER_OP_FORWARD,
22466a30a29SAmit Prakash Shukla 	/**< Start the DMA adapter in event forward mode.
22566a30a29SAmit Prakash Shukla 	 * @see RTE_EVENT_OP_FORWARD.
22666a30a29SAmit Prakash Shukla 	 *
22766a30a29SAmit Prakash Shukla 	 * Application submits DMA requests as events to the DMA adapter or DMA device based on
22866a30a29SAmit Prakash Shukla 	 * RTE_EVENT_DMA_ADAPTER_CAP_INTERNAL_PORT_OP_FWD capability. DMA completions are enqueued
22966a30a29SAmit Prakash Shukla 	 * back to the eventdev by DMA adapter.
23066a30a29SAmit Prakash Shukla 	 */
23166a30a29SAmit Prakash Shukla };
23266a30a29SAmit Prakash Shukla 
23366a30a29SAmit Prakash Shukla /**
23466a30a29SAmit Prakash Shukla  * Adapter configuration structure that the adapter configuration callback function is expected to
23566a30a29SAmit Prakash Shukla  * fill out.
23666a30a29SAmit Prakash Shukla  *
23766a30a29SAmit Prakash Shukla  * @see rte_event_dma_adapter_conf_cb
23866a30a29SAmit Prakash Shukla  */
23966a30a29SAmit Prakash Shukla struct rte_event_dma_adapter_conf {
24066a30a29SAmit Prakash Shukla 	uint8_t event_port_id;
24166a30a29SAmit Prakash Shukla 	/** < Event port identifier, the adapter enqueues events to this port and dequeues DMA
24266a30a29SAmit Prakash Shukla 	 * request events in RTE_EVENT_DMA_ADAPTER_OP_FORWARD mode.
24366a30a29SAmit Prakash Shukla 	 */
24466a30a29SAmit Prakash Shukla 
24566a30a29SAmit Prakash Shukla 	uint32_t max_nb;
24666a30a29SAmit Prakash Shukla 	/**< The adapter can return early if it has processed at least max_nb DMA ops. This isn't
24766a30a29SAmit Prakash Shukla 	 * treated as a requirement; batching may cause the adapter to process more than max_nb DMA
24866a30a29SAmit Prakash Shukla 	 * ops.
24966a30a29SAmit Prakash Shukla 	 */
25066a30a29SAmit Prakash Shukla };
25166a30a29SAmit Prakash Shukla 
25266a30a29SAmit Prakash Shukla /**
25366a30a29SAmit Prakash Shukla  * Adapter runtime configuration parameters
25466a30a29SAmit Prakash Shukla  */
25566a30a29SAmit Prakash Shukla struct rte_event_dma_adapter_runtime_params {
25666a30a29SAmit Prakash Shukla 	uint32_t max_nb;
25766a30a29SAmit Prakash Shukla 	/**< The adapter can return early if it has processed at least max_nb DMA ops. This isn't
25866a30a29SAmit Prakash Shukla 	 * treated as a requirement; batching may cause the adapter to process more than max_nb DMA
25966a30a29SAmit Prakash Shukla 	 * ops.
26066a30a29SAmit Prakash Shukla 	 *
26166a30a29SAmit Prakash Shukla 	 * Callback function passed to rte_event_dma_adapter_create_ext() configures the adapter
26266a30a29SAmit Prakash Shukla 	 * with default value of max_nb.
26366a30a29SAmit Prakash Shukla 	 * rte_event_dma_adapter_runtime_params_set() allows to re-configure max_nb during runtime
26466a30a29SAmit Prakash Shukla 	 * (after adding at least one queue pair)
26566a30a29SAmit Prakash Shukla 	 *
26666a30a29SAmit Prakash Shukla 	 * This is valid for the devices without RTE_EVENT_DMA_ADAPTER_CAP_INTERNAL_PORT_OP_FWD or
26766a30a29SAmit Prakash Shukla 	 * RTE_EVENT_DMA_ADAPTER_CAP_INTERNAL_PORT_OP_NEW capability.
26866a30a29SAmit Prakash Shukla 	 */
26966a30a29SAmit Prakash Shukla 
27066a30a29SAmit Prakash Shukla 	uint32_t rsvd[15];
27166a30a29SAmit Prakash Shukla 	/**< Reserved fields for future expansion */
27266a30a29SAmit Prakash Shukla };
27366a30a29SAmit Prakash Shukla 
27466a30a29SAmit Prakash Shukla /**
27566a30a29SAmit Prakash Shukla  * Function type used for adapter configuration callback. The callback is used to fill in members of
27666a30a29SAmit Prakash Shukla  * the struct rte_event_dma_adapter_conf, this callback is invoked when creating a SW service for
27766a30a29SAmit Prakash Shukla  * packet transfer from dmadev vchan to the event device. The SW service is created within the
27866a30a29SAmit Prakash Shukla  * function, rte_event_dma_adapter_vchan_add(), if SW based packet transfers from dmadev vchan
27966a30a29SAmit Prakash Shukla  * to the event device are required.
28066a30a29SAmit Prakash Shukla  *
28166a30a29SAmit Prakash Shukla  * @param id
28266a30a29SAmit Prakash Shukla  *     Adapter identifier.
28366a30a29SAmit Prakash Shukla  * @param evdev_id
28466a30a29SAmit Prakash Shukla  *     Event device identifier.
28566a30a29SAmit Prakash Shukla  * @param conf
28666a30a29SAmit Prakash Shukla  *     Structure that needs to be populated by this callback.
28766a30a29SAmit Prakash Shukla  * @param arg
28866a30a29SAmit Prakash Shukla  *     Argument to the callback. This is the same as the conf_arg passed to the
28966a30a29SAmit Prakash Shukla  * rte_event_dma_adapter_create_ext().
29066a30a29SAmit Prakash Shukla  */
29166a30a29SAmit Prakash Shukla typedef int (*rte_event_dma_adapter_conf_cb)(uint8_t id, uint8_t evdev_id,
29266a30a29SAmit Prakash Shukla 					     struct rte_event_dma_adapter_conf *conf, void *arg);
29366a30a29SAmit Prakash Shukla 
29466a30a29SAmit Prakash Shukla /**
29566a30a29SAmit Prakash Shukla  * A structure used to retrieve statistics for an event DMA adapter instance.
29666a30a29SAmit Prakash Shukla  */
29766a30a29SAmit Prakash Shukla struct rte_event_dma_adapter_stats {
29866a30a29SAmit Prakash Shukla 	uint64_t event_poll_count;
29966a30a29SAmit Prakash Shukla 	/**< Event port poll count */
30066a30a29SAmit Prakash Shukla 
30166a30a29SAmit Prakash Shukla 	uint64_t event_deq_count;
30266a30a29SAmit Prakash Shukla 	/**< Event dequeue count */
30366a30a29SAmit Prakash Shukla 
30466a30a29SAmit Prakash Shukla 	uint64_t dma_enq_count;
30566a30a29SAmit Prakash Shukla 	/**< dmadev enqueue count */
30666a30a29SAmit Prakash Shukla 
30766a30a29SAmit Prakash Shukla 	uint64_t dma_enq_fail_count;
30866a30a29SAmit Prakash Shukla 	/**< dmadev enqueue failed count */
30966a30a29SAmit Prakash Shukla 
31066a30a29SAmit Prakash Shukla 	uint64_t dma_deq_count;
31166a30a29SAmit Prakash Shukla 	/**< dmadev dequeue count */
31266a30a29SAmit Prakash Shukla 
31366a30a29SAmit Prakash Shukla 	uint64_t event_enq_count;
31466a30a29SAmit Prakash Shukla 	/**< Event enqueue count */
31566a30a29SAmit Prakash Shukla 
31666a30a29SAmit Prakash Shukla 	uint64_t event_enq_retry_count;
31766a30a29SAmit Prakash Shukla 	/**< Event enqueue retry count */
31866a30a29SAmit Prakash Shukla 
31966a30a29SAmit Prakash Shukla 	uint64_t event_enq_fail_count;
32066a30a29SAmit Prakash Shukla 	/**< Event enqueue fail count */
32166a30a29SAmit Prakash Shukla };
32266a30a29SAmit Prakash Shukla 
32366a30a29SAmit Prakash Shukla /**
32466a30a29SAmit Prakash Shukla  * Create a new event DMA adapter with the specified identifier.
32566a30a29SAmit Prakash Shukla  *
32666a30a29SAmit Prakash Shukla  * @param id
32766a30a29SAmit Prakash Shukla  *     Adapter identifier.
32866a30a29SAmit Prakash Shukla  * @param evdev_id
32966a30a29SAmit Prakash Shukla  *     Event device identifier.
33066a30a29SAmit Prakash Shukla  * @param conf_cb
33166a30a29SAmit Prakash Shukla  *     Callback function that fills in members of a struct rte_event_dma_adapter_conf struct passed
33266a30a29SAmit Prakash Shukla  * into it.
33366a30a29SAmit Prakash Shukla  * @param mode
33466a30a29SAmit Prakash Shukla  *     Flag to indicate the mode of the adapter.
33566a30a29SAmit Prakash Shukla  *     @see rte_event_dma_adapter_mode
33666a30a29SAmit Prakash Shukla  * @param conf_arg
33766a30a29SAmit Prakash Shukla  *     Argument that is passed to the conf_cb function.
33866a30a29SAmit Prakash Shukla  *
33966a30a29SAmit Prakash Shukla  * @return
34066a30a29SAmit Prakash Shukla  *     - 0: Success
34166a30a29SAmit Prakash Shukla  *     - <0: Error code on failure
34266a30a29SAmit Prakash Shukla  */
34366a30a29SAmit Prakash Shukla __rte_experimental
34466a30a29SAmit Prakash Shukla int rte_event_dma_adapter_create_ext(uint8_t id, uint8_t evdev_id,
34566a30a29SAmit Prakash Shukla 				     rte_event_dma_adapter_conf_cb conf_cb,
34666a30a29SAmit Prakash Shukla 				     enum rte_event_dma_adapter_mode mode, void *conf_arg);
34766a30a29SAmit Prakash Shukla 
34866a30a29SAmit Prakash Shukla /**
34966a30a29SAmit Prakash Shukla  * Create a new event DMA adapter with the specified identifier. This function uses an internal
35066a30a29SAmit Prakash Shukla  * configuration function that creates an event port. This default function reconfigures the event
35166a30a29SAmit Prakash Shukla  * device with an additional event port and set up the event port using the port_config parameter
35266a30a29SAmit Prakash Shukla  * passed into this function. In case the application needs more control in configuration of the
35366a30a29SAmit Prakash Shukla  * service, it should use the rte_event_dma_adapter_create_ext() version.
35466a30a29SAmit Prakash Shukla  *
35566a30a29SAmit Prakash Shukla  * @param id
35666a30a29SAmit Prakash Shukla  *     Adapter identifier.
35766a30a29SAmit Prakash Shukla  * @param evdev_id
35866a30a29SAmit Prakash Shukla  *     Event device identifier.
35966a30a29SAmit Prakash Shukla  * @param port_config
36066a30a29SAmit Prakash Shukla  *     Argument of type *rte_event_port_conf* that is passed to the conf_cb function.
36166a30a29SAmit Prakash Shukla  * @param mode
36266a30a29SAmit Prakash Shukla  *     Flag to indicate the mode of the adapter.
36366a30a29SAmit Prakash Shukla  *     @see rte_event_dma_adapter_mode
36466a30a29SAmit Prakash Shukla  *
36566a30a29SAmit Prakash Shukla  * @return
36666a30a29SAmit Prakash Shukla  *     - 0: Success
36766a30a29SAmit Prakash Shukla  *     - <0: Error code on failure
36866a30a29SAmit Prakash Shukla  */
36966a30a29SAmit Prakash Shukla __rte_experimental
37066a30a29SAmit Prakash Shukla int rte_event_dma_adapter_create(uint8_t id, uint8_t evdev_id,
37166a30a29SAmit Prakash Shukla 				 struct rte_event_port_conf *port_config,
37266a30a29SAmit Prakash Shukla 				 enum rte_event_dma_adapter_mode mode);
37366a30a29SAmit Prakash Shukla 
37466a30a29SAmit Prakash Shukla /**
37566a30a29SAmit Prakash Shukla  * Free an event DMA adapter
37666a30a29SAmit Prakash Shukla  *
37766a30a29SAmit Prakash Shukla  * @param id
37866a30a29SAmit Prakash Shukla  *     Adapter identifier.
37966a30a29SAmit Prakash Shukla  * @return
38066a30a29SAmit Prakash Shukla  *     - 0: Success
38166a30a29SAmit Prakash Shukla  *     - <0: Error code on failure, If the adapter still has queue pairs added to it, the function
38266a30a29SAmit Prakash Shukla  * returns -EBUSY.
38366a30a29SAmit Prakash Shukla  */
38466a30a29SAmit Prakash Shukla __rte_experimental
38566a30a29SAmit Prakash Shukla int rte_event_dma_adapter_free(uint8_t id);
38666a30a29SAmit Prakash Shukla 
38766a30a29SAmit Prakash Shukla /**
38866a30a29SAmit Prakash Shukla  * Retrieve the event port of an adapter.
38966a30a29SAmit Prakash Shukla  *
39066a30a29SAmit Prakash Shukla  * @param id
39166a30a29SAmit Prakash Shukla  *     Adapter identifier.
39266a30a29SAmit Prakash Shukla  *
39366a30a29SAmit Prakash Shukla  * @param [out] event_port_id
39466a30a29SAmit Prakash Shukla  *     Application links its event queue to this adapter port which is used in
39566a30a29SAmit Prakash Shukla  * RTE_EVENT_DMA_ADAPTER_OP_FORWARD mode.
39666a30a29SAmit Prakash Shukla  *
39766a30a29SAmit Prakash Shukla  * @return
39866a30a29SAmit Prakash Shukla  *     - 0: Success
39966a30a29SAmit Prakash Shukla  *     - <0: Error code on failure.
40066a30a29SAmit Prakash Shukla  */
40166a30a29SAmit Prakash Shukla __rte_experimental
40266a30a29SAmit Prakash Shukla int rte_event_dma_adapter_event_port_get(uint8_t id, uint8_t *event_port_id);
40366a30a29SAmit Prakash Shukla 
40466a30a29SAmit Prakash Shukla /**
40566a30a29SAmit Prakash Shukla  * Add a vchan to an event DMA adapter.
40666a30a29SAmit Prakash Shukla  *
40766a30a29SAmit Prakash Shukla  * @param id
40866a30a29SAmit Prakash Shukla  *     Adapter identifier.
40966a30a29SAmit Prakash Shukla  * @param dmadev_id
41066a30a29SAmit Prakash Shukla  *     dmadev identifier.
41166a30a29SAmit Prakash Shukla  * @param vchan
41266a30a29SAmit Prakash Shukla  *     DMA device vchan identifier. If vchan is set -1, adapter adds all the
41366a30a29SAmit Prakash Shukla  * preconfigured vchan to the instance.
41466a30a29SAmit Prakash Shukla  * @param event
41566a30a29SAmit Prakash Shukla  *     If HW supports dmadev vchan to event queue binding, application is expected to fill in
41666a30a29SAmit Prakash Shukla  * event information, else it will be NULL.
41766a30a29SAmit Prakash Shukla  *     @see RTE_EVENT_DMA_ADAPTER_CAP_INTERNAL_PORT_VCHAN_EV_BIND
41866a30a29SAmit Prakash Shukla  *
41966a30a29SAmit Prakash Shukla  * @return
42066a30a29SAmit Prakash Shukla  *     - 0: Success, vchan added correctly.
42166a30a29SAmit Prakash Shukla  *     - <0: Error code on failure.
42266a30a29SAmit Prakash Shukla  */
42366a30a29SAmit Prakash Shukla __rte_experimental
42466a30a29SAmit Prakash Shukla int rte_event_dma_adapter_vchan_add(uint8_t id, int16_t dmadev_id, uint16_t vchan,
42566a30a29SAmit Prakash Shukla 				    const struct rte_event *event);
42666a30a29SAmit Prakash Shukla 
42766a30a29SAmit Prakash Shukla /**
42866a30a29SAmit Prakash Shukla  * Delete a vchan from an event DMA adapter.
42966a30a29SAmit Prakash Shukla  *
43066a30a29SAmit Prakash Shukla  * @param id
43166a30a29SAmit Prakash Shukla  *     Adapter identifier.
43266a30a29SAmit Prakash Shukla  * @param dmadev_id
43366a30a29SAmit Prakash Shukla  *     DMA device identifier.
43466a30a29SAmit Prakash Shukla  * @param vchan
43566a30a29SAmit Prakash Shukla  *     DMA device vchan identifier.
43666a30a29SAmit Prakash Shukla  *
43766a30a29SAmit Prakash Shukla  * @return
43866a30a29SAmit Prakash Shukla  *     - 0: Success, vchan deleted successfully.
43966a30a29SAmit Prakash Shukla  *     - <0: Error code on failure.
44066a30a29SAmit Prakash Shukla  */
44166a30a29SAmit Prakash Shukla __rte_experimental
44266a30a29SAmit Prakash Shukla int rte_event_dma_adapter_vchan_del(uint8_t id, int16_t dmadev_id, uint16_t vchan);
44366a30a29SAmit Prakash Shukla 
44466a30a29SAmit Prakash Shukla /**
44566a30a29SAmit Prakash Shukla  * Retrieve the service ID of an adapter. If the adapter doesn't use a rte_service function, this
44666a30a29SAmit Prakash Shukla  * function returns -ESRCH.
44766a30a29SAmit Prakash Shukla  *
44866a30a29SAmit Prakash Shukla  * @param id
44966a30a29SAmit Prakash Shukla  *     Adapter identifier.
45066a30a29SAmit Prakash Shukla  * @param [out] service_id
45166a30a29SAmit Prakash Shukla  *     A pointer to a uint32_t, to be filled in with the service id.
45266a30a29SAmit Prakash Shukla  *
45366a30a29SAmit Prakash Shukla  * @return
45466a30a29SAmit Prakash Shukla  *     - 0: Success
45566a30a29SAmit Prakash Shukla  *     - <0: Error code on failure, if the adapter doesn't use a rte_service function, this function
45666a30a29SAmit Prakash Shukla  * returns -ESRCH.
45766a30a29SAmit Prakash Shukla  */
45866a30a29SAmit Prakash Shukla __rte_experimental
45966a30a29SAmit Prakash Shukla int rte_event_dma_adapter_service_id_get(uint8_t id, uint32_t *service_id);
46066a30a29SAmit Prakash Shukla 
46166a30a29SAmit Prakash Shukla /**
46266a30a29SAmit Prakash Shukla  * Start event DMA adapter
46366a30a29SAmit Prakash Shukla  *
46466a30a29SAmit Prakash Shukla  * @param id
46566a30a29SAmit Prakash Shukla  *     Adapter identifier.
46666a30a29SAmit Prakash Shukla  *
46766a30a29SAmit Prakash Shukla  * @return
46866a30a29SAmit Prakash Shukla  *     - 0: Success, adapter started successfully.
46966a30a29SAmit Prakash Shukla  *     - <0: Error code on failure.
47066a30a29SAmit Prakash Shukla  *
47166a30a29SAmit Prakash Shukla  * @note The eventdev and dmadev to which the event_dma_adapter is connected should be started
47266a30a29SAmit Prakash Shukla  * before calling rte_event_dma_adapter_start().
47366a30a29SAmit Prakash Shukla  */
47466a30a29SAmit Prakash Shukla __rte_experimental
47566a30a29SAmit Prakash Shukla int rte_event_dma_adapter_start(uint8_t id);
47666a30a29SAmit Prakash Shukla 
47766a30a29SAmit Prakash Shukla /**
47866a30a29SAmit Prakash Shukla  * Stop event DMA adapter
47966a30a29SAmit Prakash Shukla  *
48066a30a29SAmit Prakash Shukla  * @param id
48166a30a29SAmit Prakash Shukla  *  Adapter identifier.
48266a30a29SAmit Prakash Shukla  *
48366a30a29SAmit Prakash Shukla  * @return
48466a30a29SAmit Prakash Shukla  *  - 0: Success, adapter stopped successfully.
48566a30a29SAmit Prakash Shukla  *  - <0: Error code on failure.
48666a30a29SAmit Prakash Shukla  */
48766a30a29SAmit Prakash Shukla __rte_experimental
48866a30a29SAmit Prakash Shukla int rte_event_dma_adapter_stop(uint8_t id);
48966a30a29SAmit Prakash Shukla 
49066a30a29SAmit Prakash Shukla /**
49166a30a29SAmit Prakash Shukla  * Initialize the adapter runtime configuration parameters
49266a30a29SAmit Prakash Shukla  *
49366a30a29SAmit Prakash Shukla  * @param params
49466a30a29SAmit Prakash Shukla  *  A pointer to structure of type struct rte_event_dma_adapter_runtime_params
49566a30a29SAmit Prakash Shukla  *
49666a30a29SAmit Prakash Shukla  * @return
49766a30a29SAmit Prakash Shukla  *  -  0: Success
49866a30a29SAmit Prakash Shukla  *  - <0: Error code on failure
49966a30a29SAmit Prakash Shukla  */
50066a30a29SAmit Prakash Shukla __rte_experimental
50166a30a29SAmit Prakash Shukla int rte_event_dma_adapter_runtime_params_init(struct rte_event_dma_adapter_runtime_params *params);
50266a30a29SAmit Prakash Shukla 
50366a30a29SAmit Prakash Shukla /**
50466a30a29SAmit Prakash Shukla  * Set the adapter runtime configuration parameters
50566a30a29SAmit Prakash Shukla  *
50666a30a29SAmit Prakash Shukla  * @param id
50766a30a29SAmit Prakash Shukla  *  Adapter identifier
50866a30a29SAmit Prakash Shukla  *
50966a30a29SAmit Prakash Shukla  * @param params
51066a30a29SAmit Prakash Shukla  *  A pointer to structure of type struct rte_event_dma_adapter_runtime_params with configuration
51166a30a29SAmit Prakash Shukla  * parameter values. The reserved fields of this structure must be initialized to zero and the valid
51266a30a29SAmit Prakash Shukla  * fields need to be set appropriately. This struct can be initialized using
51366a30a29SAmit Prakash Shukla  * rte_event_dma_adapter_runtime_params_init() API to default values or application may reset this
51466a30a29SAmit Prakash Shukla  * struct and update required fields.
51566a30a29SAmit Prakash Shukla  *
51666a30a29SAmit Prakash Shukla  * @return
51766a30a29SAmit Prakash Shukla  *  -  0: Success
51866a30a29SAmit Prakash Shukla  *  - <0: Error code on failure
51966a30a29SAmit Prakash Shukla  */
52066a30a29SAmit Prakash Shukla __rte_experimental
52166a30a29SAmit Prakash Shukla int rte_event_dma_adapter_runtime_params_set(uint8_t id,
52266a30a29SAmit Prakash Shukla 					     struct rte_event_dma_adapter_runtime_params *params);
52366a30a29SAmit Prakash Shukla 
52466a30a29SAmit Prakash Shukla /**
52566a30a29SAmit Prakash Shukla  * Get the adapter runtime configuration parameters
52666a30a29SAmit Prakash Shukla  *
52766a30a29SAmit Prakash Shukla  * @param id
52866a30a29SAmit Prakash Shukla  *  Adapter identifier
52966a30a29SAmit Prakash Shukla  *
53066a30a29SAmit Prakash Shukla  * @param[out] params
53166a30a29SAmit Prakash Shukla  *  A pointer to structure of type struct rte_event_dma_adapter_runtime_params containing valid
53266a30a29SAmit Prakash Shukla  * adapter parameters when return value is 0.
53366a30a29SAmit Prakash Shukla  *
53466a30a29SAmit Prakash Shukla  * @return
53566a30a29SAmit Prakash Shukla  *  -  0: Success
53666a30a29SAmit Prakash Shukla  *  - <0: Error code on failure
53766a30a29SAmit Prakash Shukla  */
53866a30a29SAmit Prakash Shukla __rte_experimental
53966a30a29SAmit Prakash Shukla int rte_event_dma_adapter_runtime_params_get(uint8_t id,
54066a30a29SAmit Prakash Shukla 					     struct rte_event_dma_adapter_runtime_params *params);
54166a30a29SAmit Prakash Shukla 
54266a30a29SAmit Prakash Shukla /**
54366a30a29SAmit Prakash Shukla  * Retrieve statistics for an adapter
54466a30a29SAmit Prakash Shukla  *
54566a30a29SAmit Prakash Shukla  * @param id
54666a30a29SAmit Prakash Shukla  *     Adapter identifier.
54766a30a29SAmit Prakash Shukla  * @param [out] stats
54866a30a29SAmit Prakash Shukla  *     A pointer to structure used to retrieve statistics for an adapter.
54966a30a29SAmit Prakash Shukla  *
55066a30a29SAmit Prakash Shukla  * @return
55166a30a29SAmit Prakash Shukla  *     - 0: Success, retrieved successfully.
55266a30a29SAmit Prakash Shukla  *     - <0: Error code on failure.
55366a30a29SAmit Prakash Shukla  */
55466a30a29SAmit Prakash Shukla __rte_experimental
55566a30a29SAmit Prakash Shukla int rte_event_dma_adapter_stats_get(uint8_t id, struct rte_event_dma_adapter_stats *stats);
55666a30a29SAmit Prakash Shukla 
55766a30a29SAmit Prakash Shukla /**
55866a30a29SAmit Prakash Shukla  * Reset statistics for an adapter.
55966a30a29SAmit Prakash Shukla  *
56066a30a29SAmit Prakash Shukla  * @param id
56166a30a29SAmit Prakash Shukla  *     Adapter identifier.
56266a30a29SAmit Prakash Shukla  *
56366a30a29SAmit Prakash Shukla  * @return
56466a30a29SAmit Prakash Shukla  *     - 0: Success, statistics reset successfully.
56566a30a29SAmit Prakash Shukla  *     - <0: Error code on failure.
56666a30a29SAmit Prakash Shukla  */
56766a30a29SAmit Prakash Shukla __rte_experimental
56866a30a29SAmit Prakash Shukla int rte_event_dma_adapter_stats_reset(uint8_t id);
56966a30a29SAmit Prakash Shukla 
57066a30a29SAmit Prakash Shukla /**
57166a30a29SAmit Prakash Shukla  * Enqueue a burst of DMA operations as event objects supplied in *rte_event* structure on an event
57266a30a29SAmit Prakash Shukla  * DMA adapter designated by its event *evdev_id* through the event port specified by *port_id*.
57366a30a29SAmit Prakash Shukla  * This function is supported if the eventdev PMD has the
57466a30a29SAmit Prakash Shukla  * #RTE_EVENT_DMA_ADAPTER_CAP_INTERNAL_PORT_OP_FWD capability flag set.
57566a30a29SAmit Prakash Shukla  *
57666a30a29SAmit Prakash Shukla  * The *nb_events* parameter is the number of event objects to enqueue that are supplied in the
57766a30a29SAmit Prakash Shukla  * *ev* array of *rte_event* structure.
57866a30a29SAmit Prakash Shukla  *
57966a30a29SAmit Prakash Shukla  * The rte_event_dma_adapter_enqueue() function returns the number of event objects it actually
58066a30a29SAmit Prakash Shukla  * enqueued. A return value equal to *nb_events* means that all event objects have been enqueued.
58166a30a29SAmit Prakash Shukla  *
58266a30a29SAmit Prakash Shukla  * @param evdev_id
58366a30a29SAmit Prakash Shukla  *     The identifier of the device.
58466a30a29SAmit Prakash Shukla  * @param port_id
58566a30a29SAmit Prakash Shukla  *     The identifier of the event port.
58666a30a29SAmit Prakash Shukla  * @param ev
58766a30a29SAmit Prakash Shukla  *     Points to an array of *nb_events* objects of type *rte_event* structure which contain the
58866a30a29SAmit Prakash Shukla  * event object enqueue operations to be processed.
58966a30a29SAmit Prakash Shukla  * @param nb_events
59066a30a29SAmit Prakash Shukla  *     The number of event objects to enqueue, typically number of
59166a30a29SAmit Prakash Shukla  * rte_event_port_attr_get(...RTE_EVENT_PORT_ATTR_ENQ_DEPTH...) available for this port.
59266a30a29SAmit Prakash Shukla  *
59366a30a29SAmit Prakash Shukla  * @return
59466a30a29SAmit Prakash Shukla  *     The number of event objects actually enqueued on the event device. The return value can be
59566a30a29SAmit Prakash Shukla  * less than the value of the *nb_events* parameter when the event devices queue is full or if
59666a30a29SAmit Prakash Shukla  * invalid parameters are specified in a *rte_event*. If the return value is less than *nb_events*,
59766a30a29SAmit Prakash Shukla  * the remaining events at the end of ev[] are not consumed and the caller has to take care of them,
59866a30a29SAmit Prakash Shukla  * and rte_errno is set accordingly. Possible errno values include:
59966a30a29SAmit Prakash Shukla  *     - EINVAL: The port ID is invalid, device ID is invalid, an event's queue ID is invalid, or an
60066a30a29SAmit Prakash Shukla  * event's sched type doesn't match the capabilities of the destination queue.
60166a30a29SAmit Prakash Shukla  *     - ENOSPC: The event port was backpressured and unable to enqueue one or more events. This
60266a30a29SAmit Prakash Shukla  * error code is only applicable to closed systems.
60366a30a29SAmit Prakash Shukla  */
60466a30a29SAmit Prakash Shukla __rte_experimental
60566a30a29SAmit Prakash Shukla uint16_t rte_event_dma_adapter_enqueue(uint8_t evdev_id, uint8_t port_id, struct rte_event ev[],
60666a30a29SAmit Prakash Shukla 				       uint16_t nb_events);
60766a30a29SAmit Prakash Shukla 
60866a30a29SAmit Prakash Shukla #ifdef __cplusplus
60966a30a29SAmit Prakash Shukla }
61066a30a29SAmit Prakash Shukla #endif
61166a30a29SAmit Prakash Shukla 
61266a30a29SAmit Prakash Shukla #endif /* RTE_EVENT_DMA_ADAPTER */
613