1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright(c) 2007-2022 Intel Corporation */
3 /* $FreeBSD$ */
4 /**
5 ***************************************************************************
6 * @file lac_mem.h
7 *
8 * @defgroup LacMem Memory
9 *
10 * @ingroup LacCommon
11 *
12 * Memory re-sizing functions and memory accessor macros.
13 *
14 ***************************************************************************/
15
16 #ifndef LAC_MEM_H
17 #define LAC_MEM_H
18
19 /***************************************************************************
20 * Include header files
21 ***************************************************************************/
22 #include "cpa.h"
23 #include "qat_utils.h"
24 #include "lac_common.h"
25
26 /**
27 *******************************************************************************
28 * @ingroup LacMem
29 * These macros are used to Endian swap variables from IA to QAT.
30 *
31 * @param[out] x The variable to be swapped.
32 *
33 * @retval none
34 ******************************************************************************/
35 #if (BYTE_ORDER == LITTLE_ENDIAN)
36 #define LAC_MEM_WR_64(x) QAT_UTILS_HOST_TO_NW_64(x)
37 #define LAC_MEM_WR_32(x) QAT_UTILS_HOST_TO_NW_32(x)
38 #define LAC_MEM_WR_16(x) QAT_UTILS_HOST_TO_NW_16(x)
39 #define LAC_MEM_RD_64(x) QAT_UTILS_NW_TO_HOST_64(x)
40 #define LAC_MEM_RD_32(x) QAT_UTILS_NW_TO_HOST_32(x)
41 #define LAC_MEM_RD_16(x) QAT_UTILS_NW_TO_HOST_16(x)
42 #else
43 #define LAC_MEM_WR_64(x) (x)
44 #define LAC_MEM_WR_32(x) (x)
45 #define LAC_MEM_WR_16(x) (x)
46 #define LAC_MEM_RD_64(x) (x)
47 #define LAC_MEM_RD_32(x) (x)
48 #define LAC_MEM_RD_16(x) (x)
49 #endif
50
51 /*
52 *******************************************************************************
53 * Shared Memory Macros (memory accessible by Acceleration Engines, e.g. QAT)
54 *******************************************************************************
55 */
56
57 /**
58 *******************************************************************************
59 * @ingroup LacMem
60 * This macro can be used to write to a variable that will be read by the
61 * QAT. The macro will automatically detect the size of the target variable and
62 * will select the correct method for performing the write. The data is cast to
63 * the type of the field that it will be written to.
64 * This macro swaps data if required.
65 *
66 * @param[out] var The variable to be written. Can be a field of a struct.
67 *
68 * @param[in] data The value to be written. Will be cast to the size of the
69 * target.
70 *
71 * @retval none
72 ******************************************************************************/
73 #define LAC_MEM_SHARED_WRITE_SWAP(var, data) \
74 do { \
75 switch (sizeof(var)) { \
76 case 1: \
77 (var) = (Cpa8U)(data); \
78 break; \
79 case 2: \
80 (var) = (Cpa16U)(data); \
81 (var) = LAC_MEM_WR_16(((Cpa16U)var)); \
82 break; \
83 case 4: \
84 (var) = (Cpa32U)(data); \
85 (var) = LAC_MEM_WR_32(((Cpa32U)var)); \
86 break; \
87 case 8: \
88 (var) = (Cpa64U)(data); \
89 (var) = LAC_MEM_WR_64(((Cpa64U)var)); \
90 break; \
91 default: \
92 break; \
93 } \
94 } while (0)
95
96 /**
97 *******************************************************************************
98 * @ingroup LacMem
99 * This macro can be used to read a variable that was written by the QAT.
100 * The macro will automatically detect the size of the data to be read and will
101 * select the correct method for performing the read. The value read from the
102 * variable is cast to the size of the data type it will be stored in.
103 * This macro swaps data if required.
104 *
105 * @param[in] var The variable to be read. Can be a field of a struct.
106 *
107 * @param[out] data The variable to hold the result of the read. Data read
108 * will be cast to the size of this variable
109 *
110 * @retval none
111 ******************************************************************************/
112 #define LAC_MEM_SHARED_READ_SWAP(var, data) \
113 do { \
114 switch (sizeof(var)) { \
115 case 1: \
116 (data) = (var); \
117 break; \
118 case 2: \
119 (data) = LAC_MEM_RD_16(((Cpa16U)var)); \
120 break; \
121 case 4: \
122 (data) = LAC_MEM_RD_32(((Cpa32U)var)); \
123 break; \
124 case 8: \
125 (data) = LAC_MEM_RD_64(((Cpa64U)var)); \
126 break; \
127 default: \
128 break; \
129 } \
130 } while (0)
131
132 /**
133 *******************************************************************************
134 * @ingroup LacMem
135 * This macro can be used to write a pointer to a QAT request. The fields
136 * for pointers in the QAT request and response messages are always 64 bits
137 *
138 * @param[out] var The variable to be written to. Can be a field of a struct.
139 *
140 * @param[in] data The value to be written. Will be cast to size of target
141 * variable
142 *
143 * @retval none
144 ******************************************************************************/
145 /* cast pointer to scalar of same size of the native pointer */
146 #define LAC_MEM_SHARED_WRITE_FROM_PTR(var, data) \
147 ((var) = (Cpa64U)(LAC_ARCH_UINT)(data))
148
149 /* Note: any changes to this macro implementation should also be made to the
150 * similar LAC_MEM_CAST_PTR_TO_UINT64 macro
151 */
152
153 /**
154 *******************************************************************************
155 * @ingroup LacMem
156 * This macro can be used to read a pointer from a QAT response. The fields
157 * for pointers in the QAT request and response messages are always 64 bits
158 *
159 * @param[in] var The variable to be read. Can be a field of a struct.
160 *
161 * @param[out] data The variable to hold the result of the read. Data read
162 * will be cast to the size of this variable
163 *
164 * @retval none
165 ******************************************************************************/
166 /* Cast back to native pointer */
167 #define LAC_MEM_SHARED_READ_TO_PTR(var, data) \
168 ((data) = (void *)(LAC_ARCH_UINT)(var))
169
170 /**
171 *******************************************************************************
172 * @ingroup LacMem
173 * This macro safely casts a pointer to a Cpa64U type.
174 *
175 * @param[in] pPtr The pointer to be cast.
176 *
177 * @retval pointer cast to Cpa64U
178 ******************************************************************************/
179 #define LAC_MEM_CAST_PTR_TO_UINT64(pPtr) ((Cpa64U)(pPtr))
180
181 /**
182 *******************************************************************************
183 * @ingroup LacMem
184 * This macro uses an QAT Utils macro to convert from a virtual address to
185 *a
186 * physical address for internally allocated memory.
187 *
188 * @param[in] pVirtAddr The address to be converted.
189 *
190 * @retval The converted physical address
191 ******************************************************************************/
192 #define LAC_OS_VIRT_TO_PHYS_INTERNAL(pVirtAddr) \
193 (QAT_UTILS_MMU_VIRT_TO_PHYS(pVirtAddr))
194
195 /**
196 *******************************************************************************
197 * @ingroup LacMem
198 * This macro should be called on all externally allocated memory it calls
199 * SalMem_virt2PhysExternal function which allows a user
200 * to set the virt2phys function used by an instance.
201 * Defaults to virt to phys for kernel.
202 *
203 * @param[in] genService Generic sal_service_t structure.
204 * @param[in] pVirtAddr The address to be converted.
205 *
206 * @retval The converted physical address
207 ******************************************************************************/
208 #define LAC_OS_VIRT_TO_PHYS_EXTERNAL(genService, pVirtAddr) \
209 ((SalMem_virt2PhysExternal(pVirtAddr, &(genService))))
210
211 /**
212 *******************************************************************************
213 * @ingroup LacMem
214 * This macro can be used to write an address variable that will be read by
215 * the QAT. The macro will perform the necessary virt2phys address translation
216 * This macro is only to be called on memory allocated internally by the driver.
217 *
218 * @param[out] var The address variable to write. Can be a field of a struct.
219 *
220 * @param[in] pPtr The pointer variable to containing the address to be
221 * written
222 *
223 * @retval none
224 ******************************************************************************/
225 #define LAC_MEM_SHARED_WRITE_VIRT_TO_PHYS_PTR_INTERNAL(var, pPtr) \
226 do { \
227 Cpa64U physAddr = 0; \
228 physAddr = LAC_MEM_CAST_PTR_TO_UINT64( \
229 LAC_OS_VIRT_TO_PHYS_INTERNAL(pPtr)); \
230 var = physAddr; \
231 } while (0)
232
233 /**
234 *******************************************************************************
235 * @ingroup LacMem
236 * This macro can be used to write an address variable that will be read by
237 * the QAT. The macro will perform the necessary virt2phys address translation
238 * This macro is to be used on memory allocated externally by the user. It calls
239 * the user supplied virt2phys address translation.
240 *
241 * @param[in] pService The pointer to the service
242 * @param[out] var The address variable to write. Can be a field of a struct
243 * @param[in] pPtr The pointer variable to containing the address to be
244 * written
245 *
246 * @retval none
247 ******************************************************************************/
248 #define LAC_MEM_SHARED_WRITE_VIRT_TO_PHYS_PTR_EXTERNAL(pService, var, pPtr) \
249 do { \
250 Cpa64U physAddr = 0; \
251 physAddr = LAC_MEM_CAST_PTR_TO_UINT64( \
252 LAC_OS_VIRT_TO_PHYS_EXTERNAL(pService, pPtr)); \
253 var = physAddr; \
254 } while (0)
255
256 /*
257 *******************************************************************************
258 * OS Memory Macros
259 *******************************************************************************
260 */
261
262 /**
263 *******************************************************************************
264 * @ingroup LacMem
265 * This function and associated macro allocates the memory for the given
266 * size and stores the address of the memory allocated in the pointer.
267 *
268 * @param[out] ppMemAddr address of pointer where address will be stored
269 * @param[in] sizeBytes the size of the memory to be allocated.
270 *
271 * @retval CPA_STATUS_RESOURCE Macro failed to allocate Memory
272 * @retval CPA_STATUS_SUCCESS Macro executed successfully
273 *
274 ******************************************************************************/
275 static __inline CpaStatus
276 LacMem_OsMemAlloc(void **ppMemAddr, Cpa32U sizeBytes)
277 {
278 *ppMemAddr = malloc(sizeBytes, M_QAT, M_WAITOK);
279
280 return CPA_STATUS_SUCCESS;
281 }
282
283 /**
284 *******************************************************************************
285 * @ingroup LacMem
286 * This function and associated macro allocates the contiguous
287 * memory for the given
288 * size and stores the address of the memory allocated in the pointer.
289 *
290 * @param[out] ppMemAddr address of pointer where address will be stored
291 * @param[in] sizeBytes the size of the memory to be allocated.
292 * @param[in] alignmentBytes the alignment
293 * @param[in] node node to allocate from
294 *
295 * @retval CPA_STATUS_RESOURCE Macro failed to allocate Memory
296 * @retval CPA_STATUS_SUCCESS Macro executed successfully
297 *
298 ******************************************************************************/
299 static __inline CpaStatus
300 LacMem_OsContigAlignMemAlloc(void **ppMemAddr,
301 Cpa32U sizeBytes,
302 Cpa32U alignmentBytes,
303 Cpa32U node)
304 {
305 if ((alignmentBytes & (alignmentBytes - 1)) !=
306 0) /* if is not power of 2 */
307 {
308 *ppMemAddr = NULL;
309 QAT_UTILS_LOG("alignmentBytes MUST be the power of 2\n");
310 return CPA_STATUS_INVALID_PARAM;
311 }
312
313 *ppMemAddr =
314 qatUtilsMemAllocContiguousNUMA(sizeBytes, node, alignmentBytes);
315
316 if (NULL == *ppMemAddr) {
317 return CPA_STATUS_RESOURCE;
318 }
319
320 return CPA_STATUS_SUCCESS;
321 }
322
323 /**
324 *******************************************************************************
325 * @ingroup LacMem
326 * Macro from the malloc() function
327 *
328 ******************************************************************************/
329 #define LAC_OS_MALLOC(sizeBytes) malloc(sizeBytes, M_QAT, M_WAITOK)
330
331 /**
332 *******************************************************************************
333 * @ingroup LacMem
334 * Macro from the LacMem_OsContigAlignMemAlloc function
335 *
336 ******************************************************************************/
337 #define LAC_OS_CAMALLOC(ppMemAddr, sizeBytes, alignmentBytes, node) \
338 LacMem_OsContigAlignMemAlloc((void *)ppMemAddr, \
339 sizeBytes, \
340 alignmentBytes, \
341 node)
342
343 /**
344 *******************************************************************************
345 * @ingroup LacMem
346 * Macro for declaration static const unsigned int constant. One provides
347 * the compilation time computation with the highest bit set in the
348 * sizeof(TYPE) value. The constant is being put by the linker by default in
349 * .rodata section
350 *
351 * E.g. Statement LAC_DECLARE_HIGHEST_BIT_OF(lac_mem_blk_t)
352 * results in following entry:
353 * static const unsigned int highest_bit_of_lac_mem_blk_t = 3
354 *
355 * CAUTION!!
356 * Macro is prepared only for type names NOT-containing ANY
357 * special characters. Types as amongst others:
358 * - void *
359 * - unsigned long
360 * - unsigned int
361 * are strictly forbidden and will result in compilation error.
362 * Use typedef to provide one-word type name for MACRO's usage.
363 ******************************************************************************/
364 #define LAC_DECLARE_HIGHEST_BIT_OF(TYPE) \
365 static const unsigned int highest_bit_of_##TYPE = \
366 (sizeof(TYPE) & 0x80000000 ? 31 : (sizeof(TYPE) & 0x40000000 ? 30 : (sizeof(TYPE) & 0x20000000 ? 29 : ( \
367 sizeof(TYPE) & 0x10000000 ? 28 : ( \
368 sizeof(TYPE) & 0x08000000 ? 27 : ( \
369 sizeof(TYPE) & 0x04000000 ? 26 : ( \
370 sizeof(TYPE) & 0x02000000 ? 25 : ( \
371 sizeof(TYPE) & 0x01000000 ? 24 : ( \
372 sizeof(TYPE) & 0x00800000 ? \
373 23 : \
374 (sizeof(TYPE) & 0x00400000 ? 22 : ( \
375 sizeof( \
376 TYPE) & \
377 0x00200000 ? \
378 21 : \
379 ( \
380 sizeof(TYPE) & 0x00100000 ? 20 : (sizeof(TYPE) & 0x00080000 ? 19 : ( \
381 sizeof( \
382 TYPE) & \
383 0x00040000 ? \
384 18 : \
385 ( \
386 sizeof(TYPE) & 0x00020000 ? 17 : ( \
387 sizeof(TYPE) & 0x00010000 ? 16 : (sizeof(TYPE) & \
388 0x00008000 ? \
389 15 : \
390 (sizeof(TYPE) & 0x00004000 ? 14 : ( \
391 sizeof(TYPE) & 0x00002000 ? 13 : \
392 ( \
393 sizeof(TYPE) & 0x00001000 ? 12 : ( \
394 sizeof(TYPE) & 0x00000800 ? 11 : ( \
395 sizeof(TYPE) & 0x00000400 ? 10 : \
396 ( \
397 sizeof(TYPE) & \
398 0x00000200 ? \
399 9 : \
400 (sizeof( \
401 TYPE) & \
402 0x00000100 ? \
403 8 : \
404 (sizeof(TYPE) & 0x00000080 ? 7 : \
405 ( \
406 sizeof(TYPE) & 0x00000040 ? \
407 6 : \
408 ( \
409 sizeof(TYPE) & 0x00000020 ? 5 : \
410 ( \
411 sizeof(TYPE) & 0x00000010 ? 4 : \
412 ( \
413 sizeof(TYPE) & 0x00000008 ? 3 : \
414 ( \
415 sizeof(TYPE) & 0x00000004 ? 2 : \
416 ( \
417 sizeof(TYPE) & 0x00000002 ? 1 : ( \
418 sizeof(TYPE) & 0x00000001 ? 0 : 32))))))))))))))))) /*16*/))))))))))))))) /* 31 */
419
420 /**
421 *******************************************************************************
422 * @ingroup LacMem
423 * This function and associated macro frees the memory at the given address
424 * and resets the pointer to NULL
425 *
426 * @param[out] ppMemAddr address of pointer where mem address is stored.
427 * If pointer is NULL, the function will exit silently
428 *
429 * @retval void
430 *
431 ******************************************************************************/
432 static __inline void
433 LacMem_OsMemFree(void **ppMemAddr)
434 {
435 free(*ppMemAddr, M_QAT);
436 *ppMemAddr = NULL;
437 }
438
439 /**
440 *******************************************************************************
441 * @ingroup LacMem
442 * This function and associated macro frees the contiguous memory at the
443 * given address and resets the pointer to NULL
444 *
445 * @param[out] ppMemAddr address of pointer where mem address is stored.
446 * If pointer is NULL, the function will exit silently
447 *
448 * @retval void
449 *
450 ******************************************************************************/
451 static __inline void
452 LacMem_OsContigAlignMemFree(void **ppMemAddr)
453 {
454 if (NULL != *ppMemAddr) {
455 qatUtilsMemFreeNUMA(*ppMemAddr);
456 *ppMemAddr = NULL;
457 }
458 }
459
460 #define LAC_OS_FREE(pMemAddr) LacMem_OsMemFree((void *)&pMemAddr)
461
462 #define LAC_OS_CAFREE(pMemAddr) LacMem_OsContigAlignMemFree((void *)&pMemAddr)
463
464 /**
465 *******************************************************************************
466 * @ingroup LacMem
467 * Copies user data to a working buffer of the correct size (required by
468 * PKE services)
469 *
470 * @description
471 * This function produces a correctly sized working buffer from the input
472 * user buffer. If the original buffer is too small a new buffer shall
473 * be allocated and memory is copied (left padded with zeros to the
474 *required
475 * length).
476 *
477 * The returned working buffer is guaranteed to be of the desired size for
478 * QAT.
479 *
480 * When this function is called pInternalMem describes the user_buffer and
481 * when the function returns pInternalMem describes the working buffer.
482 * This is because pInternalMem describes the memory that will be sent to
483 * QAT.
484 *
485 * The caller must keep the original buffer pointer. The alllocated buffer
486 *is
487 * freed (as necessary) using icp_LacBufferRestore().
488 *
489 * @param[in] instanceHandle Handle to crypto instance so pke_resize mem pool
490 *can
491 * be located
492 * @param[in] pUserBuffer Pointer on the user buffer
493 * @param[in] userLen length of the user buffer
494 * @param[in] workingLen length of the working (correctly sized) buffer
495 * @param[in/out] pInternalMem pointer to boolean if TRUE on input then
496 * user_buffer is internally allocated memory
497 * if false then it is externally allocated.
498 * This value gets updated by the function
499 * if the returned pointer references internally
500 * allocated memory.
501 *
502 * @return a pointer to the working (correctly sized) buffer or NULL if the
503 * allocation failed
504 *
505 * @note the working length cannot be smaller than the user buffer length
506 *
507 * @warning the working buffer may be the same or different from the original
508 * user buffer; the caller should make no assumptions in this regard
509 *
510 * @see icp_LacBufferRestore()
511 *
512 ******************************************************************************/
513 Cpa8U *icp_LacBufferResize(CpaInstanceHandle instanceHandle,
514 Cpa8U *pUserBuffer,
515 Cpa32U userLen,
516 Cpa32U workingLen,
517 CpaBoolean *pInternalMemory);
518
519 /**
520 *******************************************************************************
521 * @ingroup LacMem
522 * Restores a user buffer
523 *
524 * @description
525 * This function restores a user buffer and releases its
526 * corresponding working buffer. The working buffer, assumed to be
527 * previously obtained using icp_LacBufferResize(), is freed as necessary.
528 *
529 * The contents are copied in the process.
530 *
531 * @note the working length cannot be smaller than the user buffer length
532 *
533 * @param[out] pUserBuffer Pointer on the user buffer
534 * @param[in] userLen length of the user buffer
535 * @param[in] pWorkingBuffer Pointer on the working buffer
536 * @param[in] workingLen working buffer length
537 * @param[in] copyBuf if set _TRUE the data in the workingBuffer
538 * will be copied to the userBuffer before the
539 * workingBuffer is freed.
540 *
541 * @return the status of the operation
542 *
543 * @see icp_LacBufferResize()
544 *
545 ******************************************************************************/
546 CpaStatus icp_LacBufferRestore(Cpa8U *pUserBuffer,
547 Cpa32U userLen,
548 Cpa8U *pWorkingBuffer,
549 Cpa32U workingLen,
550 CpaBoolean copyBuf);
551
552 /**
553 *******************************************************************************
554 * @ingroup LacMem
555 * Uses an instance specific user supplied virt2phys function to convert a
556 * virtual address to a physical address.
557 *
558 * @description
559 * Uses an instance specific user supplied virt2phys function to convert a
560 * virtual address to a physical address. A client of QA API can set the
561 * virt2phys function for an instance by using the
562 * cpaXxSetAddressTranslation() function. If the client does not set the
563 * virt2phys function and the instance is in kernel space then OS specific
564 * virt2phys function will be used. In user space the virt2phys function
565 * MUST be set by the user.
566 *
567 * @param[in] pVirtAddr the virtual addr to be converted
568 * @param[in] pServiceGen Pointer on the sal_service_t structure
569 * so client supplied virt2phys function can be
570 * called.
571 *
572 * @return the physical address
573 *
574 ******************************************************************************/
575 CpaPhysicalAddr SalMem_virt2PhysExternal(void *pVirtAddr, void *pServiceGen);
576
577 #endif /* LAC_MEM_H */
Cache object: 337d6d91f18dead70c7bcffa09ffa2d5
|