X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=drivers%2Fraw%2Fioat%2Frte_ioat_rawdev.h;h=6cc1560a6402fc5f3b18adae24fe8d1f18bd0cac;hb=48fbc1be82b551e41c58e94de780fdd2ffaaeb78;hp=7067b352fc93c663da54ff6453ef6567822bc7f3;hpb=507bf656bfa50262007869210ac63e5305f5e4b3;p=dpdk.git diff --git a/drivers/raw/ioat/rte_ioat_rawdev.h b/drivers/raw/ioat/rte_ioat_rawdev.h index 7067b352fc..6cc1560a64 100644 --- a/drivers/raw/ioat/rte_ioat_rawdev.h +++ b/drivers/raw/ioat/rte_ioat_rawdev.h @@ -35,8 +35,39 @@ extern "C" { struct rte_ioat_rawdev_config { 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; }; +/** + * 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 + */ +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); + /** * Enqueue a copy operation onto the ioat device * @@ -61,63 +92,116 @@ struct rte_ioat_rawdev_config { * 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 fence - * A flag parameter indicating that hardware should not begin to perform any - * subsequently enqueued copy operations until after this operation has - * completed * @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, - int fence); + unsigned int length, uintptr_t src_hdl, uintptr_t dst_hdl); /** - * Trigger hardware to begin performing enqueued copy operations + * 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); + + +/** + * Trigger hardware to begin performing enqueued operations * * This API is used to write the "doorbell" to the hardware to trigger it - * to begin the copy operations previously enqueued by rte_ioat_enqueue_copy() + * 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 */ -static inline void -rte_ioat_do_copies(int dev_id); +#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 copy operations that have been completed + * 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 - * max_copies, src_hdls and dst_hdls parameters will be ignored, and 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 src_hdls and dst_hdls + * 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 is ignored. + * 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 copies. + * 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. + * parameter is ignored, and may be NULL * @param dst_hdls - * Array to hold the destination handle parameters of the completed copies. + * 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. + * parameter is ignored, and may be NULL * @return - * -1 on error, with rte_errno set appropriately. - * Otherwise number of completed operations i.e. number of entries written - * to the src_hdls and dst_hdls array parameters. + * -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_ioat_completed_copies(int dev_id, uint8_t max_copies, +__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 */