198c4a35cSTomasz Jozwiak /* SPDX-License-Identifier: BSD-3-Clause
2c3352e72SKai Ji * Copyright(c) 2018-2022 Intel Corporation
398c4a35cSTomasz Jozwiak */
498c4a35cSTomasz Jozwiak #ifndef _QAT_QP_H_
598c4a35cSTomasz Jozwiak #define _QAT_QP_H_
698c4a35cSTomasz Jozwiak
798c4a35cSTomasz Jozwiak #include "qat_common.h"
898c4a35cSTomasz Jozwiak #include "adf_transport_access_macros.h"
998c4a35cSTomasz Jozwiak
1098c4a35cSTomasz Jozwiak #define QAT_CSR_HEAD_WRITE_THRESH 32U
1198c4a35cSTomasz Jozwiak /* number of requests to accumulate before writing head CSR */
1298c4a35cSTomasz Jozwiak
1347c3f7a4SArek Kusztal #define QAT_QP_MIN_INFL_THRESHOLD 256
1447c3f7a4SArek Kusztal
15*b7bd72d8SArkadiusz Kusztal struct qat_qp;
165dbc8beaSFan Zhang struct qat_pci_device;
1798c4a35cSTomasz Jozwiak
1898c4a35cSTomasz Jozwiak /**
1998c4a35cSTomasz Jozwiak * Structure associated with each queue.
2098c4a35cSTomasz Jozwiak */
2198c4a35cSTomasz Jozwiak struct qat_queue {
2298c4a35cSTomasz Jozwiak char memz_name[RTE_MEMZONE_NAMESIZE];
2398c4a35cSTomasz Jozwiak void *base_addr; /* Base address */
2498c4a35cSTomasz Jozwiak rte_iova_t base_phys_addr; /* Queue physical address */
2598c4a35cSTomasz Jozwiak uint32_t head; /* Shadow copy of the head */
2698c4a35cSTomasz Jozwiak uint32_t tail; /* Shadow copy of the tail */
2798c4a35cSTomasz Jozwiak uint32_t modulo_mask;
2898c4a35cSTomasz Jozwiak uint32_t msg_size;
2998c4a35cSTomasz Jozwiak uint32_t queue_size;
30dda27cb3SFiona Trahe uint8_t trailz;
3198c4a35cSTomasz Jozwiak uint8_t hw_bundle_number;
3298c4a35cSTomasz Jozwiak uint8_t hw_queue_number;
3398c4a35cSTomasz Jozwiak /* HW queue aka ring offset on bundle */
3498c4a35cSTomasz Jozwiak uint32_t csr_head; /* last written head value */
3598c4a35cSTomasz Jozwiak uint32_t csr_tail; /* last written tail value */
3698c4a35cSTomasz Jozwiak uint16_t nb_processed_responses;
3798c4a35cSTomasz Jozwiak /* number of responses processed since last CSR head write */
3898c4a35cSTomasz Jozwiak };
3998c4a35cSTomasz Jozwiak
40c3352e72SKai Ji /**
41c3352e72SKai Ji * Type define qat_op_build_request_t function pointer, passed in as argument
42c3352e72SKai Ji * in enqueue op burst, where a build request assigned base on the type of
43c3352e72SKai Ji * crypto op.
44c3352e72SKai Ji *
45c3352e72SKai Ji * @param in_op
46c3352e72SKai Ji * An input op pointer
47c3352e72SKai Ji * @param out_msg
48c3352e72SKai Ji * out_meg pointer
49c3352e72SKai Ji * @param op_cookie
50c3352e72SKai Ji * op cookie pointer
51c3352e72SKai Ji * @param opaque
52c3352e72SKai Ji * an opaque data may be used to store context may be useful between
53c3352e72SKai Ji * 2 enqueue operations.
54c3352e72SKai Ji * @param dev_gen
55c3352e72SKai Ji * qat device gen id
56c3352e72SKai Ji * @return
57c3352e72SKai Ji * - 0 if the crypto request is build successfully,
58c3352e72SKai Ji * - EINVAL if error
59c3352e72SKai Ji **/
60c3352e72SKai Ji typedef int (*qat_op_build_request_t)(void *in_op, uint8_t *out_msg,
61*b7bd72d8SArkadiusz Kusztal void *op_cookie, struct qat_qp *qp);
62c3352e72SKai Ji
63c3352e72SKai Ji /**
64c3352e72SKai Ji * Type define qat_op_dequeue_t function pointer, passed in as argument
65c3352e72SKai Ji * in dequeue op burst, where a dequeue op assigned base on the type of
66c3352e72SKai Ji * crypto op.
67c3352e72SKai Ji *
68c3352e72SKai Ji * @param op
69c3352e72SKai Ji * An input op pointer
70c3352e72SKai Ji * @param resp
71c3352e72SKai Ji * qat response msg pointer
72c3352e72SKai Ji * @param op_cookie
73c3352e72SKai Ji * op cookie pointer
74c3352e72SKai Ji * @param dequeue_err_count
75c3352e72SKai Ji * dequeue error counter
76c3352e72SKai Ji * @return
77c3352e72SKai Ji * - 0 if dequeue OP is successful
78c3352e72SKai Ji * - EINVAL if error
79c3352e72SKai Ji **/
80c3352e72SKai Ji typedef int (*qat_op_dequeue_t)(void **op, uint8_t *resp, void *op_cookie,
81c3352e72SKai Ji uint64_t *dequeue_err_count __rte_unused);
82c3352e72SKai Ji
83c3352e72SKai Ji #define QAT_BUILD_REQUEST_MAX_OPAQUE_SIZE 2
84c3352e72SKai Ji
8527595cd8STyler Retzlaff struct __rte_cache_aligned qat_qp {
8698c4a35cSTomasz Jozwiak void *mmap_bar_addr;
8798c4a35cSTomasz Jozwiak struct qat_queue tx_q;
8898c4a35cSTomasz Jozwiak struct qat_queue rx_q;
8998c4a35cSTomasz Jozwiak struct qat_common_stats stats;
9098c4a35cSTomasz Jozwiak struct rte_mempool *op_cookie_pool;
9198c4a35cSTomasz Jozwiak void **op_cookies;
9298c4a35cSTomasz Jozwiak uint32_t nb_descriptors;
93c3352e72SKai Ji uint64_t opaque[QAT_BUILD_REQUEST_MAX_OPAQUE_SIZE];
9498c4a35cSTomasz Jozwiak enum qat_device_gen qat_dev_gen;
9598c4a35cSTomasz Jozwiak enum qat_service_type service_type;
9698c4a35cSTomasz Jozwiak struct qat_pci_device *qat_dev;
9798c4a35cSTomasz Jozwiak /**< qat device this qp is on */
98026f21c0SFiona Trahe uint32_t enqueued;
9927595cd8STyler Retzlaff alignas(sizeof(uint32_t)) uint32_t dequeued;
1008f185e7cSFiona Trahe uint16_t max_inflights;
10147c3f7a4SArek Kusztal uint16_t min_enq_burst_threshold;
10227595cd8STyler Retzlaff };
10398c4a35cSTomasz Jozwiak
1045dbc8beaSFan Zhang /**
1055dbc8beaSFan Zhang * Structure with data needed for creation of queue pair.
1065dbc8beaSFan Zhang */
1075dbc8beaSFan Zhang struct qat_qp_hw_data {
1085dbc8beaSFan Zhang enum qat_service_type service_type;
1095dbc8beaSFan Zhang uint8_t hw_bundle_num;
1105dbc8beaSFan Zhang uint8_t tx_ring_num;
1115dbc8beaSFan Zhang uint8_t rx_ring_num;
1125dbc8beaSFan Zhang uint16_t tx_msg_size;
1135dbc8beaSFan Zhang uint16_t rx_msg_size;
1145dbc8beaSFan Zhang };
1155dbc8beaSFan Zhang
1165dbc8beaSFan Zhang /**
1175dbc8beaSFan Zhang * Structure with data needed for creation of queue pair.
1185dbc8beaSFan Zhang */
1195dbc8beaSFan Zhang struct qat_qp_config {
1205dbc8beaSFan Zhang const struct qat_qp_hw_data *hw;
1215dbc8beaSFan Zhang uint32_t nb_descriptors;
1225dbc8beaSFan Zhang uint32_t cookie_size;
1235dbc8beaSFan Zhang int socket_id;
1245dbc8beaSFan Zhang const char *service_str;
1255dbc8beaSFan Zhang };
12698c4a35cSTomasz Jozwiak
12798c4a35cSTomasz Jozwiak uint16_t
128c3352e72SKai Ji qat_enqueue_op_burst(void *qp, qat_op_build_request_t op_build_request,
129c3352e72SKai Ji void **ops, uint16_t nb_ops);
13098c4a35cSTomasz Jozwiak
13198c4a35cSTomasz Jozwiak uint16_t
132c3352e72SKai Ji qat_dequeue_op_burst(void *qp, void **ops,
133c3352e72SKai Ji qat_op_dequeue_t qat_dequeue_process_response, uint16_t nb_ops);
13498c4a35cSTomasz Jozwiak
13598c4a35cSTomasz Jozwiak int
1368f393c4fSArek Kusztal qat_qp_release(enum qat_device_gen qat_dev_gen, struct qat_qp **qp_addr);
13798c4a35cSTomasz Jozwiak
13898c4a35cSTomasz Jozwiak int
13998c4a35cSTomasz Jozwiak qat_qp_setup(struct qat_pci_device *qat_dev,
14098c4a35cSTomasz Jozwiak struct qat_qp **qp_addr, uint16_t queue_pair_id,
14198c4a35cSTomasz Jozwiak struct qat_qp_config *qat_qp_conf);
14298c4a35cSTomasz Jozwiak
14398c4a35cSTomasz Jozwiak int
1447b976dd0SArek Kusztal qat_qps_per_service(struct qat_pci_device *qat_dev,
14598c4a35cSTomasz Jozwiak enum qat_service_type service);
146c0c90bc4SFiona Trahe
1474c778f1aSFan Zhang const struct qat_qp_hw_data *
1484c778f1aSFan Zhang qat_qp_get_hw_data(struct qat_pci_device *qat_dev,
1494c778f1aSFan Zhang enum qat_service_type service, uint16_t qp_id);
1504c778f1aSFan Zhang
15174441114SAdam Dybkowski int
15274441114SAdam Dybkowski qat_cq_get_fw_version(struct qat_qp *qp);
15374441114SAdam Dybkowski
154ce7a737cSKevin O'Sullivan #ifdef BUILD_QAT_SYM
155ce7a737cSKevin O'Sullivan int
156ce7a737cSKevin O'Sullivan qat_cq_get_fw_cipher_crc_cap(struct qat_qp *qp);
157ce7a737cSKevin O'Sullivan #endif
158ce7a737cSKevin O'Sullivan
159c0c90bc4SFiona Trahe /* Needed for weak function*/
160c0c90bc4SFiona Trahe int
161ba83e5c0STomasz Jozwiak qat_comp_process_response(void **op __rte_unused, uint8_t *resp __rte_unused,
162b643808fSTomasz Jozwiak void *op_cookie __rte_unused,
163b643808fSTomasz Jozwiak uint64_t *dequeue_err_count __rte_unused);
1648f393c4fSArek Kusztal int
165960ff4d6SArek Kusztal qat_read_qp_config(struct qat_pci_device *qat_dev);
1668f393c4fSArek Kusztal
1675dbc8beaSFan Zhang /**
1685dbc8beaSFan Zhang * Function prototypes for GENx specific queue pair operations.
1695dbc8beaSFan Zhang **/
1705dbc8beaSFan Zhang typedef int (*qat_qp_rings_per_service_t)
1715dbc8beaSFan Zhang (struct qat_pci_device *, enum qat_service_type);
1725dbc8beaSFan Zhang
1735dbc8beaSFan Zhang typedef void (*qat_qp_build_ring_base_t)(void *, struct qat_queue *);
1745dbc8beaSFan Zhang
1755dbc8beaSFan Zhang typedef void (*qat_qp_adf_arb_enable_t)(const struct qat_queue *, void *,
1765dbc8beaSFan Zhang rte_spinlock_t *);
1775dbc8beaSFan Zhang
1785dbc8beaSFan Zhang typedef void (*qat_qp_adf_arb_disable_t)(const struct qat_queue *, void *,
1795dbc8beaSFan Zhang rte_spinlock_t *);
1805dbc8beaSFan Zhang
1815dbc8beaSFan Zhang typedef void (*qat_qp_adf_configure_queues_t)(struct qat_qp *);
1825dbc8beaSFan Zhang
1835dbc8beaSFan Zhang typedef void (*qat_qp_csr_write_tail_t)(struct qat_qp *qp, struct qat_queue *q);
1845dbc8beaSFan Zhang
1855dbc8beaSFan Zhang typedef void (*qat_qp_csr_write_head_t)(struct qat_qp *qp, struct qat_queue *q,
1865dbc8beaSFan Zhang uint32_t new_head);
1875dbc8beaSFan Zhang
1885dbc8beaSFan Zhang typedef void (*qat_qp_csr_setup_t)(struct qat_pci_device*, void *,
1895dbc8beaSFan Zhang struct qat_qp *);
1905dbc8beaSFan Zhang
1915dbc8beaSFan Zhang typedef const struct qat_qp_hw_data * (*qat_qp_get_hw_data_t)(
1925dbc8beaSFan Zhang struct qat_pci_device *dev, enum qat_service_type service_type,
1935dbc8beaSFan Zhang uint16_t qp_id);
1945dbc8beaSFan Zhang
1955dbc8beaSFan Zhang struct qat_qp_hw_spec_funcs {
1965dbc8beaSFan Zhang qat_qp_rings_per_service_t qat_qp_rings_per_service;
1975dbc8beaSFan Zhang qat_qp_build_ring_base_t qat_qp_build_ring_base;
1985dbc8beaSFan Zhang qat_qp_adf_arb_enable_t qat_qp_adf_arb_enable;
1995dbc8beaSFan Zhang qat_qp_adf_arb_disable_t qat_qp_adf_arb_disable;
2005dbc8beaSFan Zhang qat_qp_adf_configure_queues_t qat_qp_adf_configure_queues;
2015dbc8beaSFan Zhang qat_qp_csr_write_tail_t qat_qp_csr_write_tail;
2025dbc8beaSFan Zhang qat_qp_csr_write_head_t qat_qp_csr_write_head;
2035dbc8beaSFan Zhang qat_qp_csr_setup_t qat_qp_csr_setup;
2045dbc8beaSFan Zhang qat_qp_get_hw_data_t qat_qp_get_hw_data;
2055dbc8beaSFan Zhang };
2065dbc8beaSFan Zhang
2077cb939f6SVikash Poddar extern struct qat_qp_hw_spec_funcs*
2087cb939f6SVikash Poddar qat_qp_hw_spec[];
2097cb939f6SVikash Poddar
2107cb939f6SVikash Poddar static inline void
txq_write_tail(enum qat_device_gen qat_dev_gen,struct qat_qp * qp,struct qat_queue * q)2117cb939f6SVikash Poddar txq_write_tail(enum qat_device_gen qat_dev_gen,
2127cb939f6SVikash Poddar struct qat_qp *qp, struct qat_queue *q)
2137cb939f6SVikash Poddar {
2147cb939f6SVikash Poddar struct qat_qp_hw_spec_funcs *ops =
2157cb939f6SVikash Poddar qat_qp_hw_spec[qat_dev_gen];
2167cb939f6SVikash Poddar
2177cb939f6SVikash Poddar /*
2187cb939f6SVikash Poddar * Pointer check should be done during
2197cb939f6SVikash Poddar * initialization
2207cb939f6SVikash Poddar */
2217cb939f6SVikash Poddar ops->qat_qp_csr_write_tail(qp, q);
2227cb939f6SVikash Poddar }
2235dbc8beaSFan Zhang
22498c4a35cSTomasz Jozwiak #endif /* _QAT_QP_H_ */
225