xref: /freebsd/sys/dev/qat/include/qat_ocf_mem_pool.h (revision 315ee00f)
1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright(c) 2007-2022 Intel Corporation */
3 #ifndef _QAT_OCF_MEM_POOL_H_
4 #define _QAT_OCF_MEM_POOL_H_
5 
6 /* System headers */
7 #include <sys/types.h>
8 
9 /* QAT specific headers */
10 #include "cpa.h"
11 #include "cpa_cy_sym_dp.h"
12 #include "icp_qat_fw_la.h"
13 
14 #define QAT_OCF_MAX_LEN (64 * 1024)
15 #define QAT_OCF_MAX_FLATS (32)
16 #define QAT_OCF_MAX_DIGEST SHA512_DIGEST_LENGTH
17 #define QAT_OCF_MAX_SYMREQ (256)
18 #define QAT_OCF_MEM_POOL_SIZE ((QAT_OCF_MAX_SYMREQ * 2 + 1) * 2)
19 #define QAT_OCF_MAXLEN 64 * 1024
20 
21 /* Dedicated structure due to flexible arrays not allowed to be
22  * allocated on stack */
23 struct qat_ocf_buffer_list {
24 	Cpa64U reserved0;
25 	Cpa32U numBuffers;
26 	Cpa32U reserved1;
27 	CpaPhysFlatBuffer flatBuffers[QAT_OCF_MAX_FLATS];
28 };
29 
30 struct qat_ocf_dma_mem {
31 	bus_dma_tag_t dma_tag;
32 	bus_dmamap_t dma_map;
33 	bus_dma_segment_t dma_seg;
34 	void *dma_vaddr;
35 } __aligned(64);
36 
37 struct qat_ocf_cookie {
38 	/* Source SGLs */
39 	struct qat_ocf_buffer_list src_buffers;
40 	/* Destination SGL */
41 	struct qat_ocf_buffer_list dst_buffers;
42 
43 	/* Cache OP data */
44 	CpaCySymDpOpData pOpdata;
45 
46 	/* IV max size taken from cryptdev */
47 	uint8_t qat_ocf_iv_buf[EALG_MAX_BLOCK_LEN];
48 	bus_addr_t qat_ocf_iv_buf_paddr;
49 	uint8_t qat_ocf_digest[QAT_OCF_MAX_DIGEST];
50 	bus_addr_t qat_ocf_digest_paddr;
51 	/* Used only in case of separated AAD and GCM, CCM and RC4 */
52 	uint8_t qat_ocf_gcm_aad[ICP_QAT_FW_CCM_GCM_AAD_SZ_MAX];
53 	bus_addr_t qat_ocf_gcm_aad_paddr;
54 
55 	/* Source SGLs */
56 	struct qat_ocf_dma_mem src_dma_mem;
57 	bus_addr_t src_buffer_list_paddr;
58 
59 	/* Destination SGL */
60 	struct qat_ocf_dma_mem dst_dma_mem;
61 	bus_addr_t dst_buffer_list_paddr;
62 
63 	/* AAD - used only if separated AAD is used by OCF and HW requires
64 	 * to have it at the beginning of source buffer */
65 	struct qat_ocf_dma_mem gcm_aad_dma_mem;
66 	bus_addr_t gcm_aad_buffer_list_paddr;
67 	CpaBoolean is_sep_aad_used;
68 
69 	/* Cache OP data */
70 	bus_addr_t pOpData_paddr;
71 	/* misc */
72 	struct cryptop *crp_op;
73 
74 	/* This cookie tag and map */
75 	bus_dma_tag_t dma_tag;
76 	bus_dmamap_t dma_map;
77 };
78 
79 struct qat_ocf_session {
80 	CpaCySymSessionCtx sessionCtx;
81 	Cpa32U sessionCtxSize;
82 	Cpa32U authLen;
83 	Cpa32U aadLen;
84 };
85 
86 struct qat_ocf_dsession {
87 	struct qat_ocf_instance *qatInstance;
88 	struct qat_ocf_session encSession;
89 	struct qat_ocf_session decSession;
90 };
91 
92 struct qat_ocf_load_cb_arg {
93 	struct cryptop *crp_op;
94 	struct qat_ocf_cookie *qat_cookie;
95 	CpaCySymDpOpData *pOpData;
96 	int error;
97 };
98 
99 struct qat_ocf_instance {
100 	CpaInstanceHandle cyInstHandle;
101 	struct mtx cyInstMtx;
102 	struct qat_ocf_dma_mem cookie_dmamem[QAT_OCF_MEM_POOL_SIZE];
103 	struct qat_ocf_cookie *cookie_pool[QAT_OCF_MEM_POOL_SIZE];
104 	struct qat_ocf_cookie *free_cookie[QAT_OCF_MEM_POOL_SIZE];
105 	int free_cookie_ptr;
106 	struct mtx cookie_pool_mtx;
107 	int32_t driver_id;
108 };
109 
110 /* Init/deinit */
111 CpaStatus qat_ocf_cookie_pool_init(struct qat_ocf_instance *instance,
112 				   device_t dev);
113 void qat_ocf_cookie_pool_deinit(struct qat_ocf_instance *instance);
114 /* Alloc/free */
115 CpaStatus qat_ocf_cookie_alloc(struct qat_ocf_instance *instance,
116 			       struct qat_ocf_cookie **buffers_out);
117 void qat_ocf_cookie_free(struct qat_ocf_instance *instance,
118 			 struct qat_ocf_cookie *cookie);
119 /* Pre/post sync */
120 CpaStatus qat_ocf_cookie_dma_pre_sync(struct cryptop *crp,
121 				      CpaCySymDpOpData *pOpData);
122 CpaStatus qat_ocf_cookie_dma_post_sync(struct cryptop *crp,
123 				       CpaCySymDpOpData *pOpData);
124 /* Bus DMA unload */
125 CpaStatus qat_ocf_cookie_dma_unload(struct cryptop *crp,
126 				    CpaCySymDpOpData *pOpData);
127 /* Bus DMA load callbacks */
128 void qat_ocf_crypto_load_buf_cb(void *_arg,
129 				bus_dma_segment_t *segs,
130 				int nseg,
131 				int error);
132 void qat_ocf_crypto_load_obuf_cb(void *_arg,
133 				 bus_dma_segment_t *segs,
134 				 int nseg,
135 				 int error);
136 void qat_ocf_crypto_load_aadbuf_cb(void *_arg,
137 				   bus_dma_segment_t *segs,
138 				   int nseg,
139 				   int error);
140 
141 #endif /* _QAT_OCF_MEM_POOL_H_ */
142