#ifndef _RTE_IOAT_RAWDEV_H_
#define _RTE_IOAT_RAWDEV_H_
+#ifdef __cplusplus
+extern "C" {
+#endif
+
/**
* @file rte_ioat_rawdev.h
*
* @b EXPERIMENTAL: these structures and APIs may change without prior notice
*/
-#include <rte_memory.h>
-#include <rte_memzone.h>
-#include <rte_ioat_spec.h>
+#include <rte_common.h>
/** Name of the device driver */
#define IOAT_PMD_RAWDEV_NAME rawdev_ioat
/** String reported as the device driver name by rte_rawdev_info_get() */
#define IOAT_PMD_RAWDEV_NAME_STR "rawdev_ioat"
-/** Name used to adjust the log level for this driver */
-#define IOAT_PMD_LOG_NAME "rawdev.ioat"
/**
* Configuration structure for an ioat rawdev instance
* an ioat rawdev instance.
*/
struct rte_ioat_rawdev_config {
- unsigned short ring_size;
+ unsigned short ring_size; /**< size of job submission descriptor ring */
+ bool hdls_disable; /**< if set, ignore user-supplied handle params */
+ /** set "no_prefetch_completions", if polling completions on separate core
+ * from the core submitting the jobs
+ */
+ bool no_prefetch_completions;
};
/**
- * @internal
- * Structure representing a device instance
+ * Enqueue a fill operation onto the ioat device
+ *
+ * This queues up a fill operation to be performed by hardware, but does not
+ * trigger hardware to begin that operation.
+ *
+ * @param dev_id
+ * The rawdev device id of the ioat instance
+ * @param pattern
+ * The pattern to populate the destination buffer with
+ * @param dst
+ * The physical address of the destination buffer
+ * @param length
+ * The length of the destination buffer
+ * @param dst_hdl
+ * An opaque handle for the destination data, to be returned when this
+ * operation has been completed and the user polls for the completion details.
+ * NOTE: If hdls_disable configuration option for the device is set, this
+ * parameter is ignored.
+ * @return
+ * Number of operations enqueued, either 0 or 1
*/
-struct rte_ioat_rawdev {
- struct rte_rawdev *rawdev;
- const struct rte_memzone *mz;
- const struct rte_memzone *desc_mz;
+static inline int
+__rte_experimental
+rte_ioat_enqueue_fill(int dev_id, uint64_t pattern, phys_addr_t dst,
+ unsigned int length, uintptr_t dst_hdl);
- volatile struct rte_ioat_registers *regs;
- phys_addr_t status_addr;
- phys_addr_t ring_addr;
+/**
+ * Enqueue a copy operation onto the ioat device
+ *
+ * This queues up a copy operation to be performed by hardware, but does not
+ * trigger hardware to begin that operation.
+ *
+ * @param dev_id
+ * The rawdev device id of the ioat instance
+ * @param src
+ * The physical address of the source buffer
+ * @param dst
+ * The physical address of the destination buffer
+ * @param length
+ * The length of the data to be copied
+ * @param src_hdl
+ * An opaque handle for the source data, to be returned when this operation
+ * has been completed and the user polls for the completion details.
+ * NOTE: If hdls_disable configuration option for the device is set, this
+ * parameter is ignored.
+ * @param dst_hdl
+ * An opaque handle for the destination data, to be returned when this
+ * operation has been completed and the user polls for the completion details.
+ * NOTE: If hdls_disable configuration option for the device is set, this
+ * parameter is ignored.
+ * @return
+ * Number of operations enqueued, either 0 or 1
+ */
+static inline int
+__rte_experimental
+rte_ioat_enqueue_copy(int dev_id, phys_addr_t src, phys_addr_t dst,
+ unsigned int length, uintptr_t src_hdl, uintptr_t dst_hdl);
- unsigned short ring_size;
- struct rte_ioat_generic_hw_desc *desc_ring;
+/**
+ * Add a fence to force ordering between operations
+ *
+ * This adds a fence to a sequence of operations to enforce ordering, such that
+ * all operations enqueued before the fence must be completed before operations
+ * after the fence.
+ * NOTE: Since this fence may be added as a flag to the last operation enqueued,
+ * this API may not function correctly when called immediately after an
+ * "rte_ioat_perform_ops" call i.e. before any new operations are enqueued.
+ *
+ * @param dev_id
+ * The rawdev device id of the ioat instance
+ * @return
+ * Number of fences enqueued, either 0 or 1
+ */
+static inline int
+__rte_experimental
+rte_ioat_fence(int dev_id);
- /* to report completions, the device will write status back here */
- volatile uint64_t status __rte_cache_aligned;
-};
+/**
+ * Trigger hardware to begin performing enqueued operations
+ *
+ * This API is used to write the "doorbell" to the hardware to trigger it
+ * to begin the operations previously enqueued by rte_ioat_enqueue_copy()
+ *
+ * @param dev_id
+ * The rawdev device id of the ioat instance
+ * @return
+ * 0 on success. Non-zero return on error.
+ */
+static inline int
+__rte_experimental
+rte_ioat_perform_ops(int dev_id);
+
+/*
+ * Status codes for operations.
+ */
+#define RTE_IOAT_OP_SUCCESS 0 /**< Operation completed successfully */
+#define RTE_IOAT_OP_SKIPPED 1 /**< Operation was not attempted (Earlier fenced op failed) */
+/* Values >1 indicate a failure condition */
+/* Error codes taken from Intel(R) Data Streaming Accelerator Architecture
+ * Specification, section 5.7
+ */
+#define RTE_IOAT_OP_ADDRESS_ERR 0x03 /**< Page fault or invalid address */
+#define RTE_IOAT_OP_INVALID_LEN 0x13 /**< Invalid/too big length field passed */
+#define RTE_IOAT_OP_OVERLAPPING_BUFS 0x16 /**< Overlapping buffers error */
+
+
+/**
+ * Returns details of operations that have been completed
+ *
+ * The status of each operation is returned in the status array parameter.
+ * If the hdls_disable option was not set when the device was configured,
+ * the function will return to the caller the user-provided "handles" for
+ * the copy operations which have been completed by the hardware, and not
+ * already returned by a previous call to this API.
+ * If the hdls_disable option for the device was set on configure, the
+ * src_hdls and dst_hdls parameters will be ignored, and the
+ * function returns the number of newly-completed operations.
+ * If status is also NULL, then max_copies parameter is also ignored and the
+ * function returns a count of the number of newly-completed operations.
+ *
+ * @param dev_id
+ * The rawdev device id of the ioat instance
+ * @param max_copies
+ * The number of entries which can fit in the status, src_hdls and dst_hdls
+ * arrays, i.e. max number of completed operations to report.
+ * NOTE: If hdls_disable configuration option for the device is set, this
+ * parameter applies only to the "status" array if specified
+ * @param status
+ * Array to hold the status of each completed operation. Array should be
+ * set to zeros on input, as the driver will only write error status values.
+ * A value of 1 implies an operation was not attempted, and any other non-zero
+ * value indicates operation failure.
+ * Parameter may be NULL if no status value checking is required.
+ * @param num_unsuccessful
+ * Returns the number of elements in status where the value is non-zero,
+ * i.e. the operation either failed or was not attempted due to an earlier
+ * failure. If this value is returned as zero (the expected case), the
+ * status array will not have been modified by the function and need not be
+ * checked by software
+ * @param src_hdls
+ * Array to hold the source handle parameters of the completed ops.
+ * NOTE: If hdls_disable configuration option for the device is set, this
+ * parameter is ignored, and may be NULL
+ * @param dst_hdls
+ * Array to hold the destination handle parameters of the completed ops.
+ * NOTE: If hdls_disable configuration option for the device is set, this
+ * parameter is ignored, and may be NULL
+ * @return
+ * -1 on device error, with rte_errno set appropriately and parameters
+ * unmodified.
+ * Otherwise number of returned operations i.e. number of valid entries
+ * in the status, src_hdls and dst_hdls array parameters. If status is NULL,
+ * and the hdls_disable config option is set, this value may be greater than
+ * max_copies parameter.
+ */
+static inline int
+__rte_experimental
+rte_ioat_completed_ops(int dev_id, uint8_t max_copies,
+ uint32_t *status, uint8_t *num_unsuccessful,
+ uintptr_t *src_hdls, uintptr_t *dst_hdls);
+
+/* include the implementation details from a separate file */
+#include "rte_ioat_rawdev_fns.h"
+
+#ifdef __cplusplus
+}
#endif
+
+#endif /* _RTE_IOAT_RAWDEV_H_ */