xref: /dpdk/drivers/common/qat/qat_qp.h (revision b7bd72d8da9c13deba44b1ac9f7dfa8cda77f240)
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