1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright(c) 2007-2022 Intel Corporation */
3 /* $FreeBSD$ */
4 /**
5  ***************************************************************************
6  * @file lac_sync.h
7  *
8  * @defgroup LacSync     LAC synchronous
9  *
10  * @ingroup LacCommon
11  *
12  * Function prototypes and defines for synchronous support
13  *
14  ***************************************************************************/
15 
16 #ifndef LAC_SYNC_H
17 #define LAC_SYNC_H
18 
19 #include "cpa.h"
20 #include "qat_utils.h"
21 #include "lac_mem.h"
22 
23 /**
24  *****************************************************************************
25  * @ingroup LacSync
26  *
27  * @description
28  *      LAC cookie for synchronous support
29  *
30  *****************************************************************************/
31 typedef struct lac_sync_op_data_s {
32 	struct sema *sid;
33 	/**< Semaphore to signal */
34 	CpaStatus status;
35 	/**< Output - Status of the QAT response */
36 	CpaBoolean opResult;
37 	/**< Output - Verification of the operation/protocol status */
38 	CpaBoolean complete;
39 	/**< Output - Operation is complete */
40 	CpaBoolean canceled;
41 	/**< Output - Operation canceled */
42 } lac_sync_op_data_t;
43 
44 #define LAC_PKE_SYNC_CALLBACK_TIMEOUT (5000)
45 /**< @ingroup LacSync
46  * Timeout waiting for an async callbacks in msecs.
47  * This is derived from the max latency of a PKE request  + 1 sec
48  */
49 
50 #define LAC_SYM_DRBG_POLL_AND_WAIT_TIME_MS (10)
51 /**< @ingroup LacSyn
52  * Default interval DRBG polling in msecs */
53 
54 #define LAC_SYM_SYNC_CALLBACK_TIMEOUT (300)
55 /**< @ingroup LacSyn
56  * Timeout for wait for symmetric response in msecs
57 */
58 
59 #define LAC_INIT_MSG_CALLBACK_TIMEOUT (1922)
60 /**< @ingroup LacSyn
61  * Timeout for wait for init messages response in msecs
62 */
63 
64 #define DC_SYNC_CALLBACK_TIMEOUT (2000)
65 /**< @ingroup LacSyn
66  * Timeout for wait for compression response in msecs */
67 
68 #define LAC_SYN_INITIAL_SEM_VALUE (0)
69 /**< @ingroup LacSyn
70  * Initial value of the sync waiting semaphore */
71 
72 /**
73  *******************************************************************************
74  * @ingroup LacSync
75  *      This function allocates a sync op data cookie
76  *      and creates and initialises the QAT Utils semaphore
77  *
78  * @param[in] ppSyncCallbackCookie  Pointer to synch op data
79  *
80  * @retval CPA_STATUS_RESOURCE  Failed to allocate the memory for the cookie.
81  * @retval CPA_STATUS_SUCCESS   Success
82  *
83  ******************************************************************************/
84 static __inline CpaStatus
85 LacSync_CreateSyncCookie(lac_sync_op_data_t **ppSyncCallbackCookie)
86 {
87 	CpaStatus status = CPA_STATUS_SUCCESS;
88 
89 	*ppSyncCallbackCookie =
90 	    malloc(sizeof(lac_sync_op_data_t), M_QAT, M_WAITOK);
91 
92 	if (CPA_STATUS_SUCCESS == status) {
93 		status = LAC_INIT_SEMAPHORE((*ppSyncCallbackCookie)->sid,
94 					    LAC_SYN_INITIAL_SEM_VALUE);
95 		(*ppSyncCallbackCookie)->complete = CPA_FALSE;
96 		(*ppSyncCallbackCookie)->canceled = CPA_FALSE;
97 	}
98 
99 	if (CPA_STATUS_SUCCESS != status) {
100 		LAC_OS_FREE(*ppSyncCallbackCookie);
101 	}
102 
103 	return status;
104 }
105 
106 /**
107  *******************************************************************************
108  * @ingroup LacSync
109  *      This macro frees a sync op data cookie and destroys the QAT Utils
110  *semaphore
111  *
112  * @param[in] ppSyncCallbackCookie      Pointer to sync op data
113  *
114  * @return void
115  ******************************************************************************/
116 static __inline CpaStatus
117 LacSync_DestroySyncCookie(lac_sync_op_data_t **ppSyncCallbackCookie)
118 {
119 	CpaStatus status = CPA_STATUS_SUCCESS;
120 
121 	/*
122 	 * If the operation has not completed, cancel it instead of destroying
123 	 * the
124 	 * cookie. Otherwise, the callback might panic. In this case, the cookie
125 	 * will leak, but it's better than a panic.
126 	 */
127 	if (!(*ppSyncCallbackCookie)->complete) {
128 		QAT_UTILS_LOG(
129 		    "Attempting to destroy an incomplete sync cookie\n");
130 		(*ppSyncCallbackCookie)->canceled = CPA_TRUE;
131 		return CPA_STATUS_FAIL;
132 	}
133 
134 	status = LAC_DESTROY_SEMAPHORE((*ppSyncCallbackCookie)->sid);
135 	LAC_OS_FREE(*ppSyncCallbackCookie);
136 	return status;
137 }
138 
139 /**
140  *****************************************************************************
141  * @ingroup LacSync
142  *      Function which will wait for a sync callback on a given cookie.
143  *
144  * @param[in] pSyncCallbackCookie       Pointer to sync op data
145  * @param[in] timeOut                   Time to wait for callback (msec)
146  * @param[out] pStatus                  Status returned by the callback
147  * @param[out] pOpStatus                Operation status returned by callback.
148  *
149  * @retval CPA_STATUS_SUCCESS   Success
150  * @retval CPA_STATUS_SUCCESS   Fail waiting for a callback
151  *
152  *****************************************************************************/
153 static __inline CpaStatus
154 LacSync_WaitForCallback(lac_sync_op_data_t *pSyncCallbackCookie,
155 			Cpa32S timeOut,
156 			CpaStatus *pStatus,
157 			CpaBoolean *pOpStatus)
158 {
159 	CpaStatus status = CPA_STATUS_SUCCESS;
160 
161 	status = LAC_WAIT_SEMAPHORE(pSyncCallbackCookie->sid, timeOut);
162 
163 	if (CPA_STATUS_SUCCESS == status) {
164 		*pStatus = pSyncCallbackCookie->status;
165 		if (NULL != pOpStatus) {
166 			*pOpStatus = pSyncCallbackCookie->opResult;
167 		}
168 		pSyncCallbackCookie->complete = CPA_TRUE;
169 	}
170 
171 	return status;
172 }
173 
174 /**
175  *****************************************************************************
176  * @ingroup LacSync
177  *      Function which will check for a sync callback on a given cookie.
178  *      Returns whether the callback has happened or not, no timeout.
179  *
180  * @param[in] pSyncCallbackCookie       Pointer to sync op data
181  * @param[in] timeOut                   Time to wait for callback (msec)
182  * @param[out] pStatus                  Status returned by the callback
183  * @param[out] pOpStatus                Operation status returned by callback.
184  *
185  * @retval CPA_STATUS_SUCCESS           Success
186  * @retval CPA_STATUS_FAIL              Fail waiting for a callback
187  *
188  *****************************************************************************/
189 static __inline CpaStatus
190 LacSync_CheckForCallback(lac_sync_op_data_t *pSyncCallbackCookie,
191 			 CpaStatus *pStatus,
192 			 CpaBoolean *pOpStatus)
193 {
194 	CpaStatus status = CPA_STATUS_SUCCESS;
195 
196 	status = LAC_CHECK_SEMAPHORE(pSyncCallbackCookie->sid);
197 
198 	if (CPA_STATUS_SUCCESS == status) {
199 		*pStatus = pSyncCallbackCookie->status;
200 		if (NULL != pOpStatus) {
201 			*pOpStatus = pSyncCallbackCookie->opResult;
202 		}
203 		pSyncCallbackCookie->complete = CPA_TRUE;
204 	}
205 
206 	return status;
207 }
208 
209 /**
210  *****************************************************************************
211  * @ingroup LacSync
212  *      Function which will mark a sync cookie as complete.
213  *      If it's known that the callback will not happen it's necessary
214  *      to call this, else the cookie can't be destroyed.
215  *
216  * @param[in] pSyncCallbackCookie       Pointer to sync op data
217  *
218  * @retval CPA_STATUS_SUCCESS           Success
219  * @retval CPA_STATUS_FAIL              Failed to mark as complete
220  *
221  *****************************************************************************/
222 static __inline CpaStatus
223 LacSync_SetSyncCookieComplete(lac_sync_op_data_t *pSyncCallbackCookie)
224 {
225 	CpaStatus status = CPA_STATUS_FAIL;
226 
227 	if (NULL != pSyncCallbackCookie) {
228 		pSyncCallbackCookie->complete = CPA_TRUE;
229 		status = CPA_STATUS_SUCCESS;
230 	}
231 	return status;
232 }
233 /**
234  *****************************************************************************
235  * @ingroup LacSync
236  *      Generic verify callback function.
237  * @description
238  *      This function is used when the API is called in synchronous mode.
239  *      It's assumed the callbackTag holds a lac_sync_op_data_t type
240  *      and when the callback is received, this callback shall set the
241  *      status element of that cookie structure and kick the sid.
242  *      This function may be used directly as a callback function.
243  *
244  * @param[in]  callbackTag       Callback Tag
245  * @param[in]  status            Status of callback
246  * @param[out] pOpdata           Pointer to the Op Data
247  * @param[out] opResult          Boolean to indicate the result of the operation
248  *
249  * @return void
250  *****************************************************************************/
251 void LacSync_GenVerifyCb(void *callbackTag,
252 			 CpaStatus status,
253 			 void *pOpdata,
254 			 CpaBoolean opResult);
255 
256 /**
257  *****************************************************************************
258  * @ingroup LacSync
259  *      Generic flatbuffer callback function.
260  * @description
261  *      This function is used when the API is called in synchronous mode.
262  *      It's assumed the callbackTag holds a lac_sync_op_data_t type
263  *      and when the callback is received, this callback shall set the
264  *      status element of that cookie structure and kick the sid.
265  *      This function may be used directly as a callback function.
266  *
267  * @param[in]  callbackTag       Callback Tag
268  * @param[in]  status            Status of callback
269  * @param[in]  pOpdata           Pointer to the Op Data
270  * @param[out] pOut              Pointer to the flat buffer
271  *
272  * @return void
273  *****************************************************************************/
274 void LacSync_GenFlatBufCb(void *callbackTag,
275 			  CpaStatus status,
276 			  void *pOpdata,
277 			  CpaFlatBuffer *pOut);
278 
279 /**
280  *****************************************************************************
281  * @ingroup LacSync
282  *      Generic flatbuffer verify callback function.
283  * @description
284  *      This function is used when the API is called in synchronous mode.
285  *      It's assumed the callbackTag holds a lac_sync_op_data_t type
286  *      and when the callback is received, this callback shall set the
287  *      status and opResult element of that cookie structure and
288  *      kick the sid.
289  *      This function may be used directly as a callback function.
290  *
291  * @param[in]  callbackTag       Callback Tag
292  * @param[in]  status            Status of callback
293  * @param[in]  pOpdata           Pointer to the Op Data
294  * @param[out] opResult          Boolean to indicate the result of the operation
295  * @param[out] pOut              Pointer to the flat buffer
296  *
297  * @return void
298  *****************************************************************************/
299 void LacSync_GenFlatBufVerifyCb(void *callbackTag,
300 				CpaStatus status,
301 				void *pOpdata,
302 				CpaBoolean opResult,
303 				CpaFlatBuffer *pOut);
304 
305 /**
306  *****************************************************************************
307  * @ingroup LacSync
308  *      Generic dual flatbuffer verify callback function.
309  * @description
310  *      This function is used when the API is called in synchronous mode.
311  *      It's assumed the callbackTag holds a lac_sync_op_data_t type
312  *      and when the callback is received, this callback shall set the
313  *      status and opResult element of that cookie structure and
314  *      kick the sid.
315  *      This function may be used directly as a callback function.
316  *
317  * @param[in]  callbackTag       Callback Tag
318  * @param[in]  status            Status of callback
319  * @param[in]  pOpdata           Pointer to the Op Data
320  * @param[out] opResult          Boolean to indicate the result of the operation
321  * @param[out] pOut0             Pointer to the flat buffer
322  * @param[out] pOut1             Pointer to the flat buffer
323  *
324  * @return void
325  *****************************************************************************/
326 void LacSync_GenDualFlatBufVerifyCb(void *callbackTag,
327 				    CpaStatus status,
328 				    void *pOpdata,
329 				    CpaBoolean opResult,
330 				    CpaFlatBuffer *pOut0,
331 				    CpaFlatBuffer *pOut1);
332 
333 /**
334  *****************************************************************************
335  * @ingroup LacSync
336  *      Generic wake up function.
337  * @description
338  *      This function is used when the API is called in synchronous
339  *      mode.
340  *      It's assumed the callbackTag holds a lac_sync_op_data_t type
341  *      and when the callback is received, this callback shall set
342  *      the status element of that cookie structure and kick the
343  *      sid.
344  *      This function maybe called from an async callback.
345  *
346  * @param[in] callbackTag       Callback Tag
347  * @param[in] status            Status of callback
348  *
349  * @return void
350  *****************************************************************************/
351 void LacSync_GenWakeupSyncCaller(void *callbackTag, CpaStatus status);
352 
353 /**
354  *****************************************************************************
355  * @ingroup LacSync
356  *      Generic wake up verify function.
357  * @description
358  *      This function is used when the API is called in synchronous
359  *      mode.
360  *      It's assumed the callbackTag holds a lac_sync_op_data_t type
361  *      and when the callback is received, this callback shall set
362  *      the status element and the opResult of that cookie structure
363  *      and kick the sid.
364  *      This function maybe called from an async callback.
365  *
366  * @param[in]  callbackTag       Callback Tag
367  * @param[in]  status            Status of callback
368  * @param[out] opResult          Boolean to indicate the result of the operation
369  *
370  * @return void
371  *****************************************************************************/
372 void LacSync_GenVerifyWakeupSyncCaller(void *callbackTag,
373 				       CpaStatus status,
374 				       CpaBoolean opResult);
375 
376 #endif /*LAC_SYNC_H*/
377