178ee8d1cSJulian Grajkowski /* SPDX-License-Identifier: BSD-3-Clause */
278ee8d1cSJulian Grajkowski /* Copyright(c) 2007-2022 Intel Corporation */
378ee8d1cSJulian Grajkowski /**
478ee8d1cSJulian Grajkowski *****************************************************************************
578ee8d1cSJulian Grajkowski * @file sal_compression.c
678ee8d1cSJulian Grajkowski *
778ee8d1cSJulian Grajkowski * @ingroup SalCtrl
878ee8d1cSJulian Grajkowski *
978ee8d1cSJulian Grajkowski * @description
1078ee8d1cSJulian Grajkowski * This file contains the sal implementation for compression.
1178ee8d1cSJulian Grajkowski *
1278ee8d1cSJulian Grajkowski *****************************************************************************/
1378ee8d1cSJulian Grajkowski
1478ee8d1cSJulian Grajkowski /* QAT-API includes */
1578ee8d1cSJulian Grajkowski #include "cpa.h"
1678ee8d1cSJulian Grajkowski #include "cpa_dc.h"
1778ee8d1cSJulian Grajkowski
1878ee8d1cSJulian Grajkowski /* QAT utils includes */
1978ee8d1cSJulian Grajkowski #include "qat_utils.h"
2078ee8d1cSJulian Grajkowski
2178ee8d1cSJulian Grajkowski /* ADF includes */
2278ee8d1cSJulian Grajkowski #include "icp_adf_init.h"
2378ee8d1cSJulian Grajkowski #include "icp_adf_transport.h"
2478ee8d1cSJulian Grajkowski #include "icp_accel_devices.h"
2578ee8d1cSJulian Grajkowski #include "icp_adf_cfg.h"
2678ee8d1cSJulian Grajkowski #include "icp_adf_accel_mgr.h"
2778ee8d1cSJulian Grajkowski #include "icp_adf_poll.h"
2878ee8d1cSJulian Grajkowski #include "icp_adf_debug.h"
2978ee8d1cSJulian Grajkowski #include "icp_adf_esram.h"
3078ee8d1cSJulian Grajkowski #include "icp_qat_hw.h"
3178ee8d1cSJulian Grajkowski
3278ee8d1cSJulian Grajkowski /* SAL includes */
3378ee8d1cSJulian Grajkowski #include "lac_mem.h"
3478ee8d1cSJulian Grajkowski #include "lac_common.h"
3578ee8d1cSJulian Grajkowski #include "lac_mem_pools.h"
3678ee8d1cSJulian Grajkowski #include "sal_statistics.h"
3778ee8d1cSJulian Grajkowski #include "lac_list.h"
3878ee8d1cSJulian Grajkowski #include "icp_sal_poll.h"
3978ee8d1cSJulian Grajkowski #include "sal_types_compression.h"
4078ee8d1cSJulian Grajkowski #include "dc_session.h"
4178ee8d1cSJulian Grajkowski #include "dc_datapath.h"
4278ee8d1cSJulian Grajkowski #include "dc_stats.h"
4378ee8d1cSJulian Grajkowski #include "lac_sal.h"
4478ee8d1cSJulian Grajkowski #include "lac_sal_ctrl.h"
4578ee8d1cSJulian Grajkowski #include "sal_string_parse.h"
4678ee8d1cSJulian Grajkowski #include "sal_service_state.h"
4778ee8d1cSJulian Grajkowski #include "lac_buffer_desc.h"
4878ee8d1cSJulian Grajkowski #include "icp_qat_fw_comp.h"
49a977168cSMichal Gulbicki #include "icp_qat_hw_20_comp_defs.h"
5078ee8d1cSJulian Grajkowski #include "icp_sal_versions.h"
5178ee8d1cSJulian Grajkowski
5278ee8d1cSJulian Grajkowski /* C string null terminator size */
5378ee8d1cSJulian Grajkowski #define SAL_NULL_TERM_SIZE 1
5478ee8d1cSJulian Grajkowski
5578ee8d1cSJulian Grajkowski /*
5678ee8d1cSJulian Grajkowski * Prints statistics for a compression instance
5778ee8d1cSJulian Grajkowski */
5878ee8d1cSJulian Grajkowski static int
SalCtrl_CompresionDebug(void * private_data,char * data,int size,int offset)5978ee8d1cSJulian Grajkowski SalCtrl_CompresionDebug(void *private_data, char *data, int size, int offset)
6078ee8d1cSJulian Grajkowski {
6178ee8d1cSJulian Grajkowski sal_compression_service_t *pCompressionService =
6278ee8d1cSJulian Grajkowski (sal_compression_service_t *)private_data;
6378ee8d1cSJulian Grajkowski CpaStatus status = CPA_STATUS_SUCCESS;
6478ee8d1cSJulian Grajkowski CpaDcStats dcStats = { 0 };
6578ee8d1cSJulian Grajkowski Cpa32S len = 0;
6678ee8d1cSJulian Grajkowski
6778ee8d1cSJulian Grajkowski status = cpaDcGetStats(pCompressionService, &dcStats);
6878ee8d1cSJulian Grajkowski if (status != CPA_STATUS_SUCCESS) {
6978ee8d1cSJulian Grajkowski QAT_UTILS_LOG("cpaDcGetStats returned error.\n");
7078ee8d1cSJulian Grajkowski return (-1);
7178ee8d1cSJulian Grajkowski }
7278ee8d1cSJulian Grajkowski
7378ee8d1cSJulian Grajkowski /* Engine Info */
7478ee8d1cSJulian Grajkowski if (NULL != pCompressionService->debug_file) {
7578ee8d1cSJulian Grajkowski len += snprintf(data + len,
7678ee8d1cSJulian Grajkowski size - len,
7778ee8d1cSJulian Grajkowski SEPARATOR BORDER
7878ee8d1cSJulian Grajkowski " Statistics for Instance %24s | \n" SEPARATOR,
7978ee8d1cSJulian Grajkowski pCompressionService->debug_file->name);
8078ee8d1cSJulian Grajkowski }
8178ee8d1cSJulian Grajkowski
8278ee8d1cSJulian Grajkowski /* Perform Info */
8378ee8d1cSJulian Grajkowski len += snprintf(data + len,
8478ee8d1cSJulian Grajkowski size - len,
8578ee8d1cSJulian Grajkowski BORDER " DC comp Requests: %16llu " BORDER
8678ee8d1cSJulian Grajkowski "\n" BORDER
8778ee8d1cSJulian Grajkowski " DC comp Request Errors: %16llu " BORDER
8878ee8d1cSJulian Grajkowski "\n" BORDER
8978ee8d1cSJulian Grajkowski " DC comp Completed: %16llu " BORDER
9078ee8d1cSJulian Grajkowski "\n" BORDER
9178ee8d1cSJulian Grajkowski " DC comp Completed Errors: %16llu " BORDER
9278ee8d1cSJulian Grajkowski "\n" SEPARATOR,
9378ee8d1cSJulian Grajkowski (long long unsigned int)dcStats.numCompRequests,
9478ee8d1cSJulian Grajkowski (long long unsigned int)dcStats.numCompRequestsErrors,
9578ee8d1cSJulian Grajkowski (long long unsigned int)dcStats.numCompCompleted,
9678ee8d1cSJulian Grajkowski (long long unsigned int)dcStats.numCompCompletedErrors);
9778ee8d1cSJulian Grajkowski
9878ee8d1cSJulian Grajkowski /* Perform Info */
9978ee8d1cSJulian Grajkowski len += snprintf(
10078ee8d1cSJulian Grajkowski data + len,
10178ee8d1cSJulian Grajkowski size - len,
10278ee8d1cSJulian Grajkowski BORDER " DC decomp Requests: %16llu " BORDER "\n" BORDER
10378ee8d1cSJulian Grajkowski " DC decomp Request Errors: %16llu " BORDER "\n" BORDER
10478ee8d1cSJulian Grajkowski " DC decomp Completed: %16llu " BORDER "\n" BORDER
10578ee8d1cSJulian Grajkowski " DC decomp Completed Errors: %16llu " BORDER
10678ee8d1cSJulian Grajkowski "\n" SEPARATOR,
10778ee8d1cSJulian Grajkowski (long long unsigned int)dcStats.numDecompRequests,
10878ee8d1cSJulian Grajkowski (long long unsigned int)dcStats.numDecompRequestsErrors,
10978ee8d1cSJulian Grajkowski (long long unsigned int)dcStats.numDecompCompleted,
11078ee8d1cSJulian Grajkowski (long long unsigned int)dcStats.numDecompCompletedErrors);
11178ee8d1cSJulian Grajkowski return 0;
11278ee8d1cSJulian Grajkowski }
11378ee8d1cSJulian Grajkowski
11478ee8d1cSJulian Grajkowski /* Initialise device specific information needed by compression service */
11578ee8d1cSJulian Grajkowski static CpaStatus
SalCtrl_CompressionInit_CompData(icp_accel_dev_t * device,sal_compression_service_t * pCompService)11678ee8d1cSJulian Grajkowski SalCtrl_CompressionInit_CompData(icp_accel_dev_t *device,
11778ee8d1cSJulian Grajkowski sal_compression_service_t *pCompService)
11878ee8d1cSJulian Grajkowski {
119a977168cSMichal Gulbicki int level = 0;
120*266b0663SKrzysztof Zdziarski pCompService->comp_device_data.asbEnableSupport = CPA_FALSE;
121a977168cSMichal Gulbicki pCompService->comp_device_data.uniqueCompressionLevels[0] = CPA_FALSE;
122a977168cSMichal Gulbicki
12378ee8d1cSJulian Grajkowski switch (device->deviceType) {
12478ee8d1cSJulian Grajkowski case DEVICE_DH895XCC:
12578ee8d1cSJulian Grajkowski case DEVICE_DH895XCCVF:
12678ee8d1cSJulian Grajkowski pCompService->generic_service_info.integrityCrcCheck =
12778ee8d1cSJulian Grajkowski CPA_FALSE;
12878ee8d1cSJulian Grajkowski pCompService->numInterBuffs =
12978ee8d1cSJulian Grajkowski DC_QAT_MAX_NUM_INTER_BUFFERS_6COMP_SLICES;
13078ee8d1cSJulian Grajkowski pCompService->comp_device_data.minOutputBuffSize =
13178ee8d1cSJulian Grajkowski DC_DEST_BUFFER_STA_MIN_SIZE;
13278ee8d1cSJulian Grajkowski pCompService->comp_device_data.oddByteDecompNobFinal = CPA_TRUE;
13378ee8d1cSJulian Grajkowski pCompService->comp_device_data.oddByteDecompInterim = CPA_FALSE;
13478ee8d1cSJulian Grajkowski pCompService->comp_device_data.translatorOverflow = CPA_FALSE;
13578ee8d1cSJulian Grajkowski pCompService->comp_device_data.useDevRam =
13678ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_ENABLE_SECURE_RAM_USED_AS_INTMD_BUF;
13778ee8d1cSJulian Grajkowski pCompService->comp_device_data.enableDmm =
13878ee8d1cSJulian Grajkowski ICP_QAT_HW_COMPRESSION_DELAYED_MATCH_DISABLED;
13978ee8d1cSJulian Grajkowski
14078ee8d1cSJulian Grajkowski pCompService->comp_device_data.inflateContextSize =
14178ee8d1cSJulian Grajkowski DC_INFLATE_CONTEXT_SIZE;
14278ee8d1cSJulian Grajkowski pCompService->comp_device_data.highestHwCompressionDepth =
14378ee8d1cSJulian Grajkowski ICP_QAT_HW_COMPRESSION_DEPTH_16;
14478ee8d1cSJulian Grajkowski
14578ee8d1cSJulian Grajkowski pCompService->comp_device_data.windowSizeMask =
14678ee8d1cSJulian Grajkowski (1 << DC_8K_WINDOW_SIZE | 1 << DC_32K_WINDOW_SIZE);
14778ee8d1cSJulian Grajkowski pCompService->comp_device_data.cnvnrSupported = CPA_FALSE;
148*266b0663SKrzysztof Zdziarski for (level = CPA_DC_L1; level <= CPA_DC_L12; level++) {
149*266b0663SKrzysztof Zdziarski switch (level) {
150*266b0663SKrzysztof Zdziarski case CPA_DC_L1:
151*266b0663SKrzysztof Zdziarski case CPA_DC_L2:
152*266b0663SKrzysztof Zdziarski case CPA_DC_L3:
153*266b0663SKrzysztof Zdziarski case CPA_DC_L4:
154*266b0663SKrzysztof Zdziarski pCompService->comp_device_data
155*266b0663SKrzysztof Zdziarski .uniqueCompressionLevels[level] = CPA_TRUE;
156*266b0663SKrzysztof Zdziarski break;
157*266b0663SKrzysztof Zdziarski default:
158*266b0663SKrzysztof Zdziarski pCompService->comp_device_data
159*266b0663SKrzysztof Zdziarski .uniqueCompressionLevels[level] = CPA_FALSE;
160*266b0663SKrzysztof Zdziarski break;
161*266b0663SKrzysztof Zdziarski }
162*266b0663SKrzysztof Zdziarski }
163*266b0663SKrzysztof Zdziarski pCompService->comp_device_data.numCompressionLevels =
164*266b0663SKrzysztof Zdziarski DC_NUM_COMPRESSION_LEVELS;
16578ee8d1cSJulian Grajkowski break;
16678ee8d1cSJulian Grajkowski case DEVICE_C3XXX:
16778ee8d1cSJulian Grajkowski case DEVICE_C3XXXVF:
16878ee8d1cSJulian Grajkowski case DEVICE_200XX:
16978ee8d1cSJulian Grajkowski case DEVICE_200XXVF:
17078ee8d1cSJulian Grajkowski pCompService->generic_service_info.integrityCrcCheck =
17178ee8d1cSJulian Grajkowski CPA_FALSE;
17278ee8d1cSJulian Grajkowski pCompService->numInterBuffs =
17378ee8d1cSJulian Grajkowski DC_QAT_MAX_NUM_INTER_BUFFERS_6COMP_SLICES;
17478ee8d1cSJulian Grajkowski pCompService->comp_device_data.oddByteDecompNobFinal =
17578ee8d1cSJulian Grajkowski CPA_FALSE;
17678ee8d1cSJulian Grajkowski pCompService->comp_device_data.oddByteDecompInterim = CPA_TRUE;
17778ee8d1cSJulian Grajkowski pCompService->comp_device_data.translatorOverflow = CPA_FALSE;
17878ee8d1cSJulian Grajkowski pCompService->comp_device_data.useDevRam =
17978ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_DISABLE_SECURE_RAM_USED_AS_INTMD_BUF;
18078ee8d1cSJulian Grajkowski pCompService->comp_device_data.inflateContextSize =
18178ee8d1cSJulian Grajkowski DC_INFLATE_EH_CONTEXT_SIZE;
18278ee8d1cSJulian Grajkowski pCompService->comp_device_data.highestHwCompressionDepth =
18378ee8d1cSJulian Grajkowski ICP_QAT_HW_COMPRESSION_DEPTH_16;
18478ee8d1cSJulian Grajkowski pCompService->comp_device_data.windowSizeMask =
18578ee8d1cSJulian Grajkowski (1 << DC_16K_WINDOW_SIZE | 1 << DC_32K_WINDOW_SIZE);
18678ee8d1cSJulian Grajkowski pCompService->comp_device_data.minOutputBuffSize =
18778ee8d1cSJulian Grajkowski DC_DEST_BUFFER_STA_MIN_SIZE;
18878ee8d1cSJulian Grajkowski pCompService->comp_device_data.enableDmm =
18978ee8d1cSJulian Grajkowski ICP_QAT_HW_COMPRESSION_DELAYED_MATCH_ENABLED;
19078ee8d1cSJulian Grajkowski
19178ee8d1cSJulian Grajkowski pCompService->comp_device_data.cnvnrSupported = CPA_TRUE;
192*266b0663SKrzysztof Zdziarski
193*266b0663SKrzysztof Zdziarski for (level = CPA_DC_L1; level <= CPA_DC_L12; level++) {
194*266b0663SKrzysztof Zdziarski switch (level) {
195*266b0663SKrzysztof Zdziarski case CPA_DC_L1:
196*266b0663SKrzysztof Zdziarski case CPA_DC_L2:
197*266b0663SKrzysztof Zdziarski case CPA_DC_L3:
198*266b0663SKrzysztof Zdziarski case CPA_DC_L4:
199*266b0663SKrzysztof Zdziarski pCompService->comp_device_data
200*266b0663SKrzysztof Zdziarski .uniqueCompressionLevels[level] = CPA_TRUE;
201*266b0663SKrzysztof Zdziarski break;
202*266b0663SKrzysztof Zdziarski default:
203*266b0663SKrzysztof Zdziarski pCompService->comp_device_data
204*266b0663SKrzysztof Zdziarski .uniqueCompressionLevels[level] = CPA_FALSE;
205*266b0663SKrzysztof Zdziarski break;
206*266b0663SKrzysztof Zdziarski }
207*266b0663SKrzysztof Zdziarski }
208*266b0663SKrzysztof Zdziarski pCompService->comp_device_data.numCompressionLevels =
209*266b0663SKrzysztof Zdziarski DC_NUM_COMPRESSION_LEVELS;
21078ee8d1cSJulian Grajkowski break;
21178ee8d1cSJulian Grajkowski case DEVICE_C62X:
21278ee8d1cSJulian Grajkowski case DEVICE_C62XVF:
21378ee8d1cSJulian Grajkowski pCompService->generic_service_info.integrityCrcCheck =
21478ee8d1cSJulian Grajkowski CPA_FALSE;
21578ee8d1cSJulian Grajkowski pCompService->numInterBuffs =
21678ee8d1cSJulian Grajkowski DC_QAT_MAX_NUM_INTER_BUFFERS_10COMP_SLICES;
21778ee8d1cSJulian Grajkowski pCompService->comp_device_data.oddByteDecompNobFinal =
21878ee8d1cSJulian Grajkowski CPA_FALSE;
21978ee8d1cSJulian Grajkowski pCompService->comp_device_data.oddByteDecompInterim = CPA_TRUE;
22078ee8d1cSJulian Grajkowski pCompService->comp_device_data.translatorOverflow = CPA_FALSE;
22178ee8d1cSJulian Grajkowski pCompService->comp_device_data.useDevRam =
22278ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_ENABLE_SECURE_RAM_USED_AS_INTMD_BUF;
22378ee8d1cSJulian Grajkowski pCompService->comp_device_data.inflateContextSize =
22478ee8d1cSJulian Grajkowski DC_INFLATE_EH_CONTEXT_SIZE;
225a977168cSMichal Gulbicki pCompService->comp_device_data.highestHwCompressionDepth =
226a977168cSMichal Gulbicki ICP_QAT_HW_COMPRESSION_DEPTH_16;
22778ee8d1cSJulian Grajkowski pCompService->comp_device_data.windowSizeMask =
228a977168cSMichal Gulbicki (1 << DC_4K_WINDOW_SIZE | 1 << DC_8K_WINDOW_SIZE |
229a977168cSMichal Gulbicki 1 << DC_16K_WINDOW_SIZE | 1 << DC_32K_WINDOW_SIZE);
23078ee8d1cSJulian Grajkowski pCompService->comp_device_data.minOutputBuffSize =
23178ee8d1cSJulian Grajkowski DC_DEST_BUFFER_STA_MIN_SIZE;
232a977168cSMichal Gulbicki pCompService->comp_device_data.minOutputBuffSizeDynamic =
233a977168cSMichal Gulbicki pCompService->comp_device_data.minOutputBuffSize;
23478ee8d1cSJulian Grajkowski pCompService->comp_device_data.enableDmm =
23578ee8d1cSJulian Grajkowski ICP_QAT_HW_COMPRESSION_DELAYED_MATCH_ENABLED;
23678ee8d1cSJulian Grajkowski pCompService->comp_device_data.cnvnrSupported = CPA_TRUE;
237a977168cSMichal Gulbicki
238*266b0663SKrzysztof Zdziarski for (level = CPA_DC_L1; level <= CPA_DC_L12; level++) {
239a977168cSMichal Gulbicki switch (level) {
240a977168cSMichal Gulbicki case CPA_DC_L1:
241a977168cSMichal Gulbicki case CPA_DC_L2:
242a977168cSMichal Gulbicki case CPA_DC_L3:
243a977168cSMichal Gulbicki case CPA_DC_L4:
244a977168cSMichal Gulbicki pCompService->comp_device_data
245a977168cSMichal Gulbicki .uniqueCompressionLevels[level] = CPA_TRUE;
246a977168cSMichal Gulbicki break;
247a977168cSMichal Gulbicki default:
248a977168cSMichal Gulbicki pCompService->comp_device_data
249a977168cSMichal Gulbicki .uniqueCompressionLevels[level] = CPA_FALSE;
250a977168cSMichal Gulbicki break;
251a977168cSMichal Gulbicki }
252a977168cSMichal Gulbicki }
253a977168cSMichal Gulbicki pCompService->comp_device_data.numCompressionLevels =
254a977168cSMichal Gulbicki DC_NUM_COMPRESSION_LEVELS;
25578ee8d1cSJulian Grajkowski break;
25678ee8d1cSJulian Grajkowski case DEVICE_C4XXX:
25778ee8d1cSJulian Grajkowski case DEVICE_C4XXXVF:
25878ee8d1cSJulian Grajkowski pCompService->generic_service_info.integrityCrcCheck = CPA_TRUE;
25978ee8d1cSJulian Grajkowski pCompService->numInterBuffs =
26078ee8d1cSJulian Grajkowski DC_QAT_MAX_NUM_INTER_BUFFERS_24COMP_SLICES;
26178ee8d1cSJulian Grajkowski pCompService->comp_device_data.minOutputBuffSize =
26278ee8d1cSJulian Grajkowski DC_DEST_BUFFER_MIN_SIZE;
26378ee8d1cSJulian Grajkowski pCompService->comp_device_data.oddByteDecompNobFinal = CPA_TRUE;
26478ee8d1cSJulian Grajkowski pCompService->comp_device_data.oddByteDecompInterim = CPA_TRUE;
26578ee8d1cSJulian Grajkowski pCompService->comp_device_data.translatorOverflow = CPA_TRUE;
26678ee8d1cSJulian Grajkowski if (pCompService->generic_service_info.capabilitiesMask &
26778ee8d1cSJulian Grajkowski ICP_ACCEL_CAPABILITIES_INLINE) {
26878ee8d1cSJulian Grajkowski pCompService->comp_device_data.useDevRam =
26978ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_DISABLE_SECURE_RAM_USED_AS_INTMD_BUF;
27078ee8d1cSJulian Grajkowski } else {
27178ee8d1cSJulian Grajkowski pCompService->comp_device_data.useDevRam =
27278ee8d1cSJulian Grajkowski ICP_QAT_FW_COMP_ENABLE_SECURE_RAM_USED_AS_INTMD_BUF;
27378ee8d1cSJulian Grajkowski }
27478ee8d1cSJulian Grajkowski pCompService->comp_device_data.enableDmm =
27578ee8d1cSJulian Grajkowski ICP_QAT_HW_COMPRESSION_DELAYED_MATCH_ENABLED;
27678ee8d1cSJulian Grajkowski pCompService->comp_device_data.inflateContextSize =
27778ee8d1cSJulian Grajkowski DC_INFLATE_EH_CONTEXT_SIZE;
27878ee8d1cSJulian Grajkowski pCompService->comp_device_data.highestHwCompressionDepth =
27978ee8d1cSJulian Grajkowski ICP_QAT_HW_COMPRESSION_DEPTH_128;
28078ee8d1cSJulian Grajkowski pCompService->comp_device_data.windowSizeMask =
28178ee8d1cSJulian Grajkowski (1 << DC_16K_WINDOW_SIZE | 1 << DC_32K_WINDOW_SIZE);
28278ee8d1cSJulian Grajkowski pCompService->comp_device_data.cnvnrSupported = CPA_TRUE;
283*266b0663SKrzysztof Zdziarski
284*266b0663SKrzysztof Zdziarski for (level = CPA_DC_L1; level <= CPA_DC_L12; level++) {
285*266b0663SKrzysztof Zdziarski switch (level) {
286*266b0663SKrzysztof Zdziarski case CPA_DC_L1:
287*266b0663SKrzysztof Zdziarski case CPA_DC_L2:
288*266b0663SKrzysztof Zdziarski case CPA_DC_L3:
289*266b0663SKrzysztof Zdziarski case CPA_DC_L4:
290*266b0663SKrzysztof Zdziarski case CPA_DC_L5:
291*266b0663SKrzysztof Zdziarski pCompService->comp_device_data
292*266b0663SKrzysztof Zdziarski .uniqueCompressionLevels[level] = CPA_TRUE;
29378ee8d1cSJulian Grajkowski break;
294*266b0663SKrzysztof Zdziarski default:
295*266b0663SKrzysztof Zdziarski pCompService->comp_device_data
296*266b0663SKrzysztof Zdziarski .uniqueCompressionLevels[level] = CPA_FALSE;
297*266b0663SKrzysztof Zdziarski break;
298*266b0663SKrzysztof Zdziarski }
299*266b0663SKrzysztof Zdziarski }
300*266b0663SKrzysztof Zdziarski pCompService->comp_device_data.numCompressionLevels =
301*266b0663SKrzysztof Zdziarski DC_NUM_COMPRESSION_LEVELS;
302*266b0663SKrzysztof Zdziarski break;
303*266b0663SKrzysztof Zdziarski case DEVICE_4XXX:
304*266b0663SKrzysztof Zdziarski case DEVICE_4XXXVF:
305a977168cSMichal Gulbicki pCompService->generic_service_info.integrityCrcCheck = CPA_TRUE;
306a977168cSMichal Gulbicki pCompService->numInterBuffs = 0;
307a977168cSMichal Gulbicki pCompService->comp_device_data.minOutputBuffSize =
308a977168cSMichal Gulbicki DC_DEST_BUFFER_STA_MIN_SIZE_GEN4;
309a977168cSMichal Gulbicki pCompService->comp_device_data.minOutputBuffSizeDynamic =
310a977168cSMichal Gulbicki DC_DEST_BUFFER_DYN_MIN_SIZE_GEN4;
311a977168cSMichal Gulbicki pCompService->comp_device_data.oddByteDecompNobFinal = CPA_TRUE;
312a977168cSMichal Gulbicki pCompService->comp_device_data.oddByteDecompInterim = CPA_FALSE;
313a977168cSMichal Gulbicki pCompService->comp_device_data.translatorOverflow = CPA_TRUE;
314a977168cSMichal Gulbicki pCompService->comp_device_data.useDevRam =
315a977168cSMichal Gulbicki ICP_QAT_FW_COMP_ENABLE_SECURE_RAM_USED_AS_INTMD_BUF;
316a977168cSMichal Gulbicki pCompService->comp_device_data.enableDmm =
317a977168cSMichal Gulbicki ICP_QAT_HW_COMPRESSION_DELAYED_MATCH_ENABLED;
318a977168cSMichal Gulbicki
319a977168cSMichal Gulbicki pCompService->comp_device_data.inflateContextSize =
320a977168cSMichal Gulbicki DC_INFLATE_CONTEXT_SIZE;
321a977168cSMichal Gulbicki pCompService->comp_device_data.highestHwCompressionDepth =
322a977168cSMichal Gulbicki ICP_QAT_HW_COMP_20_SEARCH_DEPTH_LEVEL_9;
323a977168cSMichal Gulbicki pCompService->comp_device_data.windowSizeMask =
324a977168cSMichal Gulbicki (1 << DC_4K_WINDOW_SIZE | 1 << DC_8K_WINDOW_SIZE |
325a977168cSMichal Gulbicki 1 << DC_16K_WINDOW_SIZE | 1 << DC_32K_WINDOW_SIZE);
326*266b0663SKrzysztof Zdziarski for (level = CPA_DC_L1; level <= CPA_DC_L12; level++) {
327a977168cSMichal Gulbicki switch (level) {
328a977168cSMichal Gulbicki case CPA_DC_L1:
329a977168cSMichal Gulbicki case CPA_DC_L6:
330a977168cSMichal Gulbicki case CPA_DC_L9:
331a977168cSMichal Gulbicki pCompService->comp_device_data
332a977168cSMichal Gulbicki .uniqueCompressionLevels[level] = CPA_TRUE;
333a977168cSMichal Gulbicki break;
334a977168cSMichal Gulbicki default:
335a977168cSMichal Gulbicki pCompService->comp_device_data
336a977168cSMichal Gulbicki .uniqueCompressionLevels[level] = CPA_FALSE;
337a977168cSMichal Gulbicki break;
338a977168cSMichal Gulbicki }
339a977168cSMichal Gulbicki }
340a977168cSMichal Gulbicki pCompService->comp_device_data.numCompressionLevels =
341a977168cSMichal Gulbicki DC_NUM_COMPRESSION_LEVELS;
342a977168cSMichal Gulbicki break;
34378ee8d1cSJulian Grajkowski default:
34478ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Unknown device type! - %d.\n",
34578ee8d1cSJulian Grajkowski device->deviceType);
34678ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL;
34778ee8d1cSJulian Grajkowski }
34878ee8d1cSJulian Grajkowski return CPA_STATUS_SUCCESS;
34978ee8d1cSJulian Grajkowski }
35078ee8d1cSJulian Grajkowski
35178ee8d1cSJulian Grajkowski CpaStatus
SalCtrl_CompressionInit(icp_accel_dev_t * device,sal_service_t * service)35278ee8d1cSJulian Grajkowski SalCtrl_CompressionInit(icp_accel_dev_t *device, sal_service_t *service)
35378ee8d1cSJulian Grajkowski {
35478ee8d1cSJulian Grajkowski CpaStatus status = CPA_STATUS_SUCCESS;
35578ee8d1cSJulian Grajkowski Cpa32U numCompConcurrentReq = 0;
35678ee8d1cSJulian Grajkowski Cpa32U request_ring_id = 0;
35778ee8d1cSJulian Grajkowski Cpa32U response_ring_id = 0;
35878ee8d1cSJulian Grajkowski
35978ee8d1cSJulian Grajkowski char adfGetParam[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
36078ee8d1cSJulian Grajkowski char compMemPool[SAL_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
36178ee8d1cSJulian Grajkowski char temp_string[SAL_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
36278ee8d1cSJulian Grajkowski char temp_string2[SAL_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
36378ee8d1cSJulian Grajkowski char *instance_name = NULL;
36478ee8d1cSJulian Grajkowski sal_statistics_collection_t *pStatsCollection =
36578ee8d1cSJulian Grajkowski (sal_statistics_collection_t *)device->pQatStats;
36678ee8d1cSJulian Grajkowski icp_resp_deliv_method rx_resp_type = ICP_RESP_TYPE_IRQ;
36778ee8d1cSJulian Grajkowski sal_compression_service_t *pCompressionService =
36878ee8d1cSJulian Grajkowski (sal_compression_service_t *)service;
36978ee8d1cSJulian Grajkowski Cpa32U msgSize = 0;
37078ee8d1cSJulian Grajkowski char *section = DYN_SEC;
37178ee8d1cSJulian Grajkowski
37278ee8d1cSJulian Grajkowski SAL_SERVICE_GOOD_FOR_INIT(pCompressionService);
37378ee8d1cSJulian Grajkowski
37478ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.state =
37578ee8d1cSJulian Grajkowski SAL_SERVICE_STATE_INITIALIZING;
37678ee8d1cSJulian Grajkowski
37778ee8d1cSJulian Grajkowski if (CPA_FALSE == pCompressionService->generic_service_info.is_dyn) {
37878ee8d1cSJulian Grajkowski section = icpGetProcessName();
37978ee8d1cSJulian Grajkowski }
38078ee8d1cSJulian Grajkowski
38178ee8d1cSJulian Grajkowski if (pStatsCollection == NULL) {
38278ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL;
38378ee8d1cSJulian Grajkowski }
38478ee8d1cSJulian Grajkowski
38578ee8d1cSJulian Grajkowski /* Get Config Info: Accel Num, bank Num, packageID,
38678ee8d1cSJulian Grajkowski coreAffinity, nodeAffinity and response mode
38778ee8d1cSJulian Grajkowski */
38878ee8d1cSJulian Grajkowski
38978ee8d1cSJulian Grajkowski pCompressionService->acceleratorNum = 0;
39078ee8d1cSJulian Grajkowski
39178ee8d1cSJulian Grajkowski /* Initialise device specific compression data */
39278ee8d1cSJulian Grajkowski SalCtrl_CompressionInit_CompData(device, pCompressionService);
39378ee8d1cSJulian Grajkowski
39478ee8d1cSJulian Grajkowski status = Sal_StringParsing(
39578ee8d1cSJulian Grajkowski "Dc",
39678ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.instance,
39778ee8d1cSJulian Grajkowski "BankNumber",
39878ee8d1cSJulian Grajkowski temp_string);
39978ee8d1cSJulian Grajkowski LAC_CHECK_STATUS(status);
40078ee8d1cSJulian Grajkowski status =
40178ee8d1cSJulian Grajkowski icp_adf_cfgGetParamValue(device, section, temp_string, adfGetParam);
40278ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) {
40378ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Failed to get %s from configuration.\n",
40478ee8d1cSJulian Grajkowski temp_string);
40578ee8d1cSJulian Grajkowski return status;
40678ee8d1cSJulian Grajkowski }
40778ee8d1cSJulian Grajkowski
40878ee8d1cSJulian Grajkowski pCompressionService->bankNum =
40978ee8d1cSJulian Grajkowski Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC);
41078ee8d1cSJulian Grajkowski
41178ee8d1cSJulian Grajkowski status = Sal_StringParsing(
41278ee8d1cSJulian Grajkowski "Dc",
41378ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.instance,
41478ee8d1cSJulian Grajkowski "IsPolled",
41578ee8d1cSJulian Grajkowski temp_string);
41678ee8d1cSJulian Grajkowski LAC_CHECK_STATUS(status);
41778ee8d1cSJulian Grajkowski status =
41878ee8d1cSJulian Grajkowski icp_adf_cfgGetParamValue(device, section, temp_string, adfGetParam);
41978ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) {
42078ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Failed to get %s from configuration.\n",
42178ee8d1cSJulian Grajkowski temp_string);
42278ee8d1cSJulian Grajkowski return status;
42378ee8d1cSJulian Grajkowski }
42478ee8d1cSJulian Grajkowski pCompressionService->isPolled =
42578ee8d1cSJulian Grajkowski (Cpa8U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC);
42678ee8d1cSJulian Grajkowski
42778ee8d1cSJulian Grajkowski /* User instances only support poll and epoll mode */
42878ee8d1cSJulian Grajkowski if (SAL_RESP_POLL_CFG_FILE != pCompressionService->isPolled) {
42978ee8d1cSJulian Grajkowski QAT_UTILS_LOG(
43078ee8d1cSJulian Grajkowski "IsPolled %u is not supported for user instance %s.\n",
43178ee8d1cSJulian Grajkowski pCompressionService->isPolled,
43278ee8d1cSJulian Grajkowski temp_string);
43378ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL;
43478ee8d1cSJulian Grajkowski }
43578ee8d1cSJulian Grajkowski
43678ee8d1cSJulian Grajkowski if (SAL_RESP_POLL_CFG_FILE == pCompressionService->isPolled) {
43778ee8d1cSJulian Grajkowski rx_resp_type = ICP_RESP_TYPE_POLL;
43878ee8d1cSJulian Grajkowski }
43978ee8d1cSJulian Grajkowski
44078ee8d1cSJulian Grajkowski status = icp_adf_cfgGetParamValue(device,
44178ee8d1cSJulian Grajkowski LAC_CFG_SECTION_GENERAL,
44278ee8d1cSJulian Grajkowski ADF_DEV_PKG_ID,
44378ee8d1cSJulian Grajkowski adfGetParam);
44478ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) {
44578ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Failed to get %s from configuration.\n",
44678ee8d1cSJulian Grajkowski ADF_DEV_PKG_ID);
44778ee8d1cSJulian Grajkowski return status;
44878ee8d1cSJulian Grajkowski }
44978ee8d1cSJulian Grajkowski pCompressionService->pkgID =
45078ee8d1cSJulian Grajkowski (Cpa16U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC);
45178ee8d1cSJulian Grajkowski
45278ee8d1cSJulian Grajkowski status = icp_adf_cfgGetParamValue(device,
45378ee8d1cSJulian Grajkowski LAC_CFG_SECTION_GENERAL,
45478ee8d1cSJulian Grajkowski ADF_DEV_NODE_ID,
45578ee8d1cSJulian Grajkowski adfGetParam);
45678ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) {
45778ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Failed to get %s from configuration.\n",
45878ee8d1cSJulian Grajkowski ADF_DEV_NODE_ID);
45978ee8d1cSJulian Grajkowski return status;
46078ee8d1cSJulian Grajkowski }
46178ee8d1cSJulian Grajkowski pCompressionService->nodeAffinity =
46278ee8d1cSJulian Grajkowski (Cpa32U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC);
46378ee8d1cSJulian Grajkowski
46478ee8d1cSJulian Grajkowski /* In case of interrupt instance, use the bank affinity set by adf_ctl
46578ee8d1cSJulian Grajkowski * Otherwise, use the instance affinity for backwards compatibility */
46678ee8d1cSJulian Grajkowski if (SAL_RESP_POLL_CFG_FILE != pCompressionService->isPolled) {
46778ee8d1cSJulian Grajkowski /* Next need to read the [AcceleratorX] section of the config
46878ee8d1cSJulian Grajkowski * file */
46978ee8d1cSJulian Grajkowski status = Sal_StringParsing("Accelerator",
47078ee8d1cSJulian Grajkowski pCompressionService->acceleratorNum,
47178ee8d1cSJulian Grajkowski "",
47278ee8d1cSJulian Grajkowski temp_string2);
47378ee8d1cSJulian Grajkowski LAC_CHECK_STATUS(status);
47478ee8d1cSJulian Grajkowski
47578ee8d1cSJulian Grajkowski status = Sal_StringParsing("Bank",
47678ee8d1cSJulian Grajkowski pCompressionService->bankNum,
47778ee8d1cSJulian Grajkowski "CoreAffinity",
47878ee8d1cSJulian Grajkowski temp_string);
47978ee8d1cSJulian Grajkowski LAC_CHECK_STATUS(status);
48078ee8d1cSJulian Grajkowski } else {
48178ee8d1cSJulian Grajkowski strncpy(temp_string2,
48278ee8d1cSJulian Grajkowski section,
48378ee8d1cSJulian Grajkowski sizeof(temp_string2) - SAL_NULL_TERM_SIZE);
48478ee8d1cSJulian Grajkowski temp_string2[SAL_CFG_MAX_VAL_LEN_IN_BYTES -
48578ee8d1cSJulian Grajkowski SAL_NULL_TERM_SIZE] = '\0';
48678ee8d1cSJulian Grajkowski
48778ee8d1cSJulian Grajkowski status = Sal_StringParsing(
48878ee8d1cSJulian Grajkowski "Dc",
48978ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.instance,
49078ee8d1cSJulian Grajkowski "CoreAffinity",
49178ee8d1cSJulian Grajkowski temp_string);
49278ee8d1cSJulian Grajkowski LAC_CHECK_STATUS(status);
49378ee8d1cSJulian Grajkowski }
49478ee8d1cSJulian Grajkowski
49578ee8d1cSJulian Grajkowski status = icp_adf_cfgGetParamValue(device,
49678ee8d1cSJulian Grajkowski temp_string2,
49778ee8d1cSJulian Grajkowski temp_string,
49878ee8d1cSJulian Grajkowski adfGetParam);
49978ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) {
50078ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Failed to get %s from configuration.\n",
50178ee8d1cSJulian Grajkowski temp_string);
50278ee8d1cSJulian Grajkowski return status;
50378ee8d1cSJulian Grajkowski }
50478ee8d1cSJulian Grajkowski pCompressionService->coreAffinity =
50578ee8d1cSJulian Grajkowski (Cpa32U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC);
50678ee8d1cSJulian Grajkowski
50778ee8d1cSJulian Grajkowski status = Sal_StringParsing(
50878ee8d1cSJulian Grajkowski "Dc",
50978ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.instance,
51078ee8d1cSJulian Grajkowski "NumConcurrentRequests",
51178ee8d1cSJulian Grajkowski temp_string);
51278ee8d1cSJulian Grajkowski LAC_CHECK_STATUS(status);
51378ee8d1cSJulian Grajkowski status =
51478ee8d1cSJulian Grajkowski icp_adf_cfgGetParamValue(device, section, temp_string, adfGetParam);
51578ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) {
51678ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Failed to get %s from configuration.\n",
51778ee8d1cSJulian Grajkowski temp_string);
51878ee8d1cSJulian Grajkowski return status;
51978ee8d1cSJulian Grajkowski }
52078ee8d1cSJulian Grajkowski
52178ee8d1cSJulian Grajkowski numCompConcurrentReq =
52278ee8d1cSJulian Grajkowski (Cpa32U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC);
52378ee8d1cSJulian Grajkowski if (validateConcurrRequest(numCompConcurrentReq)) {
52478ee8d1cSJulian Grajkowski QAT_UTILS_LOG(
52578ee8d1cSJulian Grajkowski "Invalid NumConcurrentRequests, valid values are: {64, 128, 256, ... 32768, 65536}.\n");
52678ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL;
52778ee8d1cSJulian Grajkowski }
52878ee8d1cSJulian Grajkowski
52978ee8d1cSJulian Grajkowski /* ADF does not allow us to completely fill the ring for batch requests
53078ee8d1cSJulian Grajkowski */
53178ee8d1cSJulian Grajkowski pCompressionService->maxNumCompConcurrentReq =
53278ee8d1cSJulian Grajkowski (numCompConcurrentReq - SAL_BATCH_SUBMIT_FREE_SPACE);
53378ee8d1cSJulian Grajkowski
53478ee8d1cSJulian Grajkowski /* 1. Create transport handles */
53578ee8d1cSJulian Grajkowski status = Sal_StringParsing(
53678ee8d1cSJulian Grajkowski "Dc",
53778ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.instance,
53878ee8d1cSJulian Grajkowski "RingTx",
53978ee8d1cSJulian Grajkowski temp_string);
54078ee8d1cSJulian Grajkowski LAC_CHECK_STATUS(status);
54178ee8d1cSJulian Grajkowski
54278ee8d1cSJulian Grajkowski msgSize = LAC_QAT_DC_REQ_SZ_LW * LAC_LONG_WORD_IN_BYTES;
54378ee8d1cSJulian Grajkowski status = icp_adf_transCreateHandle(
54478ee8d1cSJulian Grajkowski device,
54578ee8d1cSJulian Grajkowski ICP_TRANS_TYPE_ETR,
54678ee8d1cSJulian Grajkowski section,
54778ee8d1cSJulian Grajkowski pCompressionService->acceleratorNum,
54878ee8d1cSJulian Grajkowski pCompressionService->bankNum,
54978ee8d1cSJulian Grajkowski temp_string,
55078ee8d1cSJulian Grajkowski lac_getRingType(SAL_RING_TYPE_DC),
55178ee8d1cSJulian Grajkowski NULL,
55278ee8d1cSJulian Grajkowski ICP_RESP_TYPE_NONE,
55378ee8d1cSJulian Grajkowski numCompConcurrentReq,
55478ee8d1cSJulian Grajkowski msgSize,
55578ee8d1cSJulian Grajkowski (icp_comms_trans_handle *)&(
55678ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_tx));
55778ee8d1cSJulian Grajkowski LAC_CHECK_STATUS(status);
55878ee8d1cSJulian Grajkowski
55978ee8d1cSJulian Grajkowski if (icp_adf_transGetRingNum(
56078ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_tx,
56178ee8d1cSJulian Grajkowski &request_ring_id) != CPA_STATUS_SUCCESS) {
56278ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
56378ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_tx);
56478ee8d1cSJulian Grajkowski
56578ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Failed to get DC TX ring number.\n");
56678ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL;
56778ee8d1cSJulian Grajkowski }
56878ee8d1cSJulian Grajkowski
56978ee8d1cSJulian Grajkowski status = Sal_StringParsing(
57078ee8d1cSJulian Grajkowski "Dc",
57178ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.instance,
57278ee8d1cSJulian Grajkowski "RingRx",
57378ee8d1cSJulian Grajkowski temp_string);
57478ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) {
57578ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
57678ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_tx);
57778ee8d1cSJulian Grajkowski return status;
57878ee8d1cSJulian Grajkowski }
57978ee8d1cSJulian Grajkowski
58078ee8d1cSJulian Grajkowski msgSize = LAC_QAT_DC_RESP_SZ_LW * LAC_LONG_WORD_IN_BYTES;
58178ee8d1cSJulian Grajkowski status = icp_adf_transCreateHandle(
58278ee8d1cSJulian Grajkowski device,
58378ee8d1cSJulian Grajkowski ICP_TRANS_TYPE_ETR,
58478ee8d1cSJulian Grajkowski section,
58578ee8d1cSJulian Grajkowski pCompressionService->acceleratorNum,
58678ee8d1cSJulian Grajkowski pCompressionService->bankNum,
58778ee8d1cSJulian Grajkowski temp_string,
58878ee8d1cSJulian Grajkowski lac_getRingType(SAL_RING_TYPE_NONE),
58978ee8d1cSJulian Grajkowski (icp_trans_callback)dcCompression_ProcessCallback,
59078ee8d1cSJulian Grajkowski rx_resp_type,
59178ee8d1cSJulian Grajkowski numCompConcurrentReq,
59278ee8d1cSJulian Grajkowski msgSize,
59378ee8d1cSJulian Grajkowski (icp_comms_trans_handle *)&(
59478ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_rx));
59578ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) {
59678ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
59778ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_tx);
59878ee8d1cSJulian Grajkowski return status;
59978ee8d1cSJulian Grajkowski }
60078ee8d1cSJulian Grajkowski
60178ee8d1cSJulian Grajkowski if (icp_adf_transGetRingNum(
60278ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_rx,
60378ee8d1cSJulian Grajkowski &response_ring_id) != CPA_STATUS_SUCCESS) {
60478ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
60578ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_tx);
60678ee8d1cSJulian Grajkowski
60778ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
60878ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_rx);
60978ee8d1cSJulian Grajkowski
61078ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Failed to get DC RX ring number.\n");
61178ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL;
61278ee8d1cSJulian Grajkowski }
61378ee8d1cSJulian Grajkowski
61478ee8d1cSJulian Grajkowski /* 2. Allocates memory pools */
61578ee8d1cSJulian Grajkowski
61678ee8d1cSJulian Grajkowski /* Valid initialisation value for a pool ID */
61778ee8d1cSJulian Grajkowski pCompressionService->compression_mem_pool = LAC_MEM_POOL_INIT_POOL_ID;
61878ee8d1cSJulian Grajkowski
61978ee8d1cSJulian Grajkowski status = Sal_StringParsing(
62078ee8d1cSJulian Grajkowski "Comp",
62178ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.instance,
62278ee8d1cSJulian Grajkowski "_MemPool",
62378ee8d1cSJulian Grajkowski compMemPool);
62478ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) {
62578ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
62678ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_tx);
62778ee8d1cSJulian Grajkowski
62878ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
62978ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_rx);
63078ee8d1cSJulian Grajkowski
63178ee8d1cSJulian Grajkowski return status;
63278ee8d1cSJulian Grajkowski }
63378ee8d1cSJulian Grajkowski
63478ee8d1cSJulian Grajkowski status = Lac_MemPoolCreate(&pCompressionService->compression_mem_pool,
63578ee8d1cSJulian Grajkowski compMemPool,
63678ee8d1cSJulian Grajkowski (numCompConcurrentReq + 1),
63778ee8d1cSJulian Grajkowski sizeof(dc_compression_cookie_t),
63878ee8d1cSJulian Grajkowski LAC_64BYTE_ALIGNMENT,
63978ee8d1cSJulian Grajkowski CPA_FALSE,
64078ee8d1cSJulian Grajkowski pCompressionService->nodeAffinity);
64178ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) {
64278ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
64378ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_tx);
64478ee8d1cSJulian Grajkowski
64578ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
64678ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_rx);
64778ee8d1cSJulian Grajkowski
64878ee8d1cSJulian Grajkowski return status;
64978ee8d1cSJulian Grajkowski }
65078ee8d1cSJulian Grajkowski
65178ee8d1cSJulian Grajkowski /* Init compression statistics */
65278ee8d1cSJulian Grajkowski status = dcStatsInit(pCompressionService);
65378ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) {
65478ee8d1cSJulian Grajkowski Lac_MemPoolDestroy(pCompressionService->compression_mem_pool);
65578ee8d1cSJulian Grajkowski
65678ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
65778ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_tx);
65878ee8d1cSJulian Grajkowski
65978ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
66078ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_rx);
66178ee8d1cSJulian Grajkowski
66278ee8d1cSJulian Grajkowski return status;
66378ee8d1cSJulian Grajkowski }
66478ee8d1cSJulian Grajkowski if (CPA_TRUE == pStatsCollection->bDcStatsEnabled) {
66578ee8d1cSJulian Grajkowski /* Get instance name for stats */
66678ee8d1cSJulian Grajkowski instance_name = LAC_OS_MALLOC(ADF_CFG_MAX_VAL_LEN_IN_BYTES);
66778ee8d1cSJulian Grajkowski if (NULL == instance_name) {
66878ee8d1cSJulian Grajkowski Lac_MemPoolDestroy(
66978ee8d1cSJulian Grajkowski pCompressionService->compression_mem_pool);
67078ee8d1cSJulian Grajkowski
67178ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
67278ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_tx);
67378ee8d1cSJulian Grajkowski
67478ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
67578ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_rx);
67678ee8d1cSJulian Grajkowski
67778ee8d1cSJulian Grajkowski return CPA_STATUS_RESOURCE;
67878ee8d1cSJulian Grajkowski }
67978ee8d1cSJulian Grajkowski
68078ee8d1cSJulian Grajkowski status = Sal_StringParsing(
68178ee8d1cSJulian Grajkowski "Dc",
68278ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.instance,
68378ee8d1cSJulian Grajkowski "Name",
68478ee8d1cSJulian Grajkowski temp_string);
68578ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) {
68678ee8d1cSJulian Grajkowski Lac_MemPoolDestroy(
68778ee8d1cSJulian Grajkowski pCompressionService->compression_mem_pool);
68878ee8d1cSJulian Grajkowski
68978ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
69078ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_tx);
69178ee8d1cSJulian Grajkowski
69278ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
69378ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_rx);
69478ee8d1cSJulian Grajkowski LAC_OS_FREE(instance_name);
69578ee8d1cSJulian Grajkowski return status;
69678ee8d1cSJulian Grajkowski }
69778ee8d1cSJulian Grajkowski status = icp_adf_cfgGetParamValue(device,
69878ee8d1cSJulian Grajkowski section,
69978ee8d1cSJulian Grajkowski temp_string,
70078ee8d1cSJulian Grajkowski adfGetParam);
70178ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) {
70278ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Failed to get %s from configuration.\n",
70378ee8d1cSJulian Grajkowski temp_string);
70478ee8d1cSJulian Grajkowski
70578ee8d1cSJulian Grajkowski Lac_MemPoolDestroy(
70678ee8d1cSJulian Grajkowski pCompressionService->compression_mem_pool);
70778ee8d1cSJulian Grajkowski
70878ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
70978ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_tx);
71078ee8d1cSJulian Grajkowski
71178ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
71278ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_rx);
71378ee8d1cSJulian Grajkowski LAC_OS_FREE(instance_name);
71478ee8d1cSJulian Grajkowski return status;
71578ee8d1cSJulian Grajkowski }
71678ee8d1cSJulian Grajkowski
71778ee8d1cSJulian Grajkowski snprintf(instance_name,
71878ee8d1cSJulian Grajkowski ADF_CFG_MAX_VAL_LEN_IN_BYTES,
71978ee8d1cSJulian Grajkowski "%s",
72078ee8d1cSJulian Grajkowski adfGetParam);
72178ee8d1cSJulian Grajkowski
72278ee8d1cSJulian Grajkowski pCompressionService->debug_file =
72378ee8d1cSJulian Grajkowski LAC_OS_MALLOC(sizeof(debug_file_info_t));
72478ee8d1cSJulian Grajkowski if (NULL == pCompressionService->debug_file) {
72578ee8d1cSJulian Grajkowski Lac_MemPoolDestroy(
72678ee8d1cSJulian Grajkowski pCompressionService->compression_mem_pool);
72778ee8d1cSJulian Grajkowski
72878ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
72978ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_tx);
73078ee8d1cSJulian Grajkowski
73178ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
73278ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_rx);
73378ee8d1cSJulian Grajkowski LAC_OS_FREE(instance_name);
73478ee8d1cSJulian Grajkowski return CPA_STATUS_RESOURCE;
73578ee8d1cSJulian Grajkowski }
73678ee8d1cSJulian Grajkowski
73778ee8d1cSJulian Grajkowski memset(pCompressionService->debug_file,
73878ee8d1cSJulian Grajkowski 0,
73978ee8d1cSJulian Grajkowski sizeof(debug_file_info_t));
74078ee8d1cSJulian Grajkowski pCompressionService->debug_file->name = instance_name;
74178ee8d1cSJulian Grajkowski pCompressionService->debug_file->seq_read =
74278ee8d1cSJulian Grajkowski SalCtrl_CompresionDebug;
74378ee8d1cSJulian Grajkowski pCompressionService->debug_file->private_data =
74478ee8d1cSJulian Grajkowski pCompressionService;
74578ee8d1cSJulian Grajkowski pCompressionService->debug_file->parent =
74678ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.debug_parent_dir;
74778ee8d1cSJulian Grajkowski
74878ee8d1cSJulian Grajkowski status = icp_adf_debugAddFile(device,
74978ee8d1cSJulian Grajkowski pCompressionService->debug_file);
75078ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) {
75178ee8d1cSJulian Grajkowski Lac_MemPoolDestroy(
75278ee8d1cSJulian Grajkowski pCompressionService->compression_mem_pool);
75378ee8d1cSJulian Grajkowski
75478ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
75578ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_tx);
75678ee8d1cSJulian Grajkowski
75778ee8d1cSJulian Grajkowski icp_adf_transReleaseHandle(
75878ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_rx);
75978ee8d1cSJulian Grajkowski LAC_OS_FREE(instance_name);
76078ee8d1cSJulian Grajkowski LAC_OS_FREE(pCompressionService->debug_file);
76178ee8d1cSJulian Grajkowski return status;
76278ee8d1cSJulian Grajkowski }
76378ee8d1cSJulian Grajkowski }
76478ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.stats = pStatsCollection;
76578ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.state =
76678ee8d1cSJulian Grajkowski SAL_SERVICE_STATE_INITIALIZED;
76778ee8d1cSJulian Grajkowski
76878ee8d1cSJulian Grajkowski return status;
76978ee8d1cSJulian Grajkowski }
77078ee8d1cSJulian Grajkowski
77178ee8d1cSJulian Grajkowski CpaStatus
SalCtrl_CompressionStart(icp_accel_dev_t * device,sal_service_t * service)77278ee8d1cSJulian Grajkowski SalCtrl_CompressionStart(icp_accel_dev_t *device, sal_service_t *service)
77378ee8d1cSJulian Grajkowski {
77478ee8d1cSJulian Grajkowski CpaStatus status = CPA_STATUS_SUCCESS;
77578ee8d1cSJulian Grajkowski
77678ee8d1cSJulian Grajkowski sal_compression_service_t *pCompressionService =
77778ee8d1cSJulian Grajkowski (sal_compression_service_t *)service;
77878ee8d1cSJulian Grajkowski
77978ee8d1cSJulian Grajkowski if (SAL_SERVICE_STATE_INITIALIZED !=
78078ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.state) {
78178ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Not in the correct state to call start.\n");
78278ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL;
78378ee8d1cSJulian Grajkowski }
78478ee8d1cSJulian Grajkowski /**************************************************************/
78578ee8d1cSJulian Grajkowski /* Obtain Extended Features. I.e. Compress And Verify */
78678ee8d1cSJulian Grajkowski /**************************************************************/
78778ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.dcExtendedFeatures =
78878ee8d1cSJulian Grajkowski device->dcExtendedFeatures;
78978ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.state =
79078ee8d1cSJulian Grajkowski SAL_SERVICE_STATE_RUNNING;
79178ee8d1cSJulian Grajkowski
79278ee8d1cSJulian Grajkowski return status;
79378ee8d1cSJulian Grajkowski }
79478ee8d1cSJulian Grajkowski
79578ee8d1cSJulian Grajkowski CpaStatus
SalCtrl_CompressionStop(icp_accel_dev_t * device,sal_service_t * service)79678ee8d1cSJulian Grajkowski SalCtrl_CompressionStop(icp_accel_dev_t *device, sal_service_t *service)
79778ee8d1cSJulian Grajkowski {
79878ee8d1cSJulian Grajkowski sal_compression_service_t *pCompressionService =
79978ee8d1cSJulian Grajkowski (sal_compression_service_t *)service;
80078ee8d1cSJulian Grajkowski
80178ee8d1cSJulian Grajkowski if (SAL_SERVICE_STATE_RUNNING !=
80278ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.state) {
80378ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Not in the correct state to call stop.\n");
80478ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL;
80578ee8d1cSJulian Grajkowski }
80678ee8d1cSJulian Grajkowski
80778ee8d1cSJulian Grajkowski if (icp_adf_is_dev_in_reset(device)) {
80878ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.state =
80978ee8d1cSJulian Grajkowski SAL_SERVICE_STATE_RESTARTING;
81078ee8d1cSJulian Grajkowski return CPA_STATUS_SUCCESS;
81178ee8d1cSJulian Grajkowski }
81278ee8d1cSJulian Grajkowski
81378ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.state =
81478ee8d1cSJulian Grajkowski SAL_SERVICE_STATE_SHUTTING_DOWN;
81578ee8d1cSJulian Grajkowski return CPA_STATUS_RETRY;
81678ee8d1cSJulian Grajkowski }
81778ee8d1cSJulian Grajkowski
81878ee8d1cSJulian Grajkowski CpaStatus
SalCtrl_CompressionShutdown(icp_accel_dev_t * device,sal_service_t * service)81978ee8d1cSJulian Grajkowski SalCtrl_CompressionShutdown(icp_accel_dev_t *device, sal_service_t *service)
82078ee8d1cSJulian Grajkowski {
82178ee8d1cSJulian Grajkowski CpaStatus status = CPA_STATUS_SUCCESS;
82278ee8d1cSJulian Grajkowski
82378ee8d1cSJulian Grajkowski sal_compression_service_t *pCompressionService =
82478ee8d1cSJulian Grajkowski (sal_compression_service_t *)service;
82578ee8d1cSJulian Grajkowski sal_statistics_collection_t *pStatsCollection =
82678ee8d1cSJulian Grajkowski (sal_statistics_collection_t *)device->pQatStats;
82778ee8d1cSJulian Grajkowski
82878ee8d1cSJulian Grajkowski if ((SAL_SERVICE_STATE_INITIALIZED !=
82978ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.state) &&
83078ee8d1cSJulian Grajkowski (SAL_SERVICE_STATE_SHUTTING_DOWN !=
83178ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.state) &&
83278ee8d1cSJulian Grajkowski (SAL_SERVICE_STATE_RESTARTING !=
83378ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.state)) {
83478ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Not in the correct state to call shutdown.\n");
83578ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL;
83678ee8d1cSJulian Grajkowski }
83778ee8d1cSJulian Grajkowski
83878ee8d1cSJulian Grajkowski Lac_MemPoolDestroy(pCompressionService->compression_mem_pool);
83978ee8d1cSJulian Grajkowski
84078ee8d1cSJulian Grajkowski status = icp_adf_transReleaseHandle(
84178ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_tx);
84278ee8d1cSJulian Grajkowski LAC_CHECK_STATUS(status);
84378ee8d1cSJulian Grajkowski
84478ee8d1cSJulian Grajkowski status = icp_adf_transReleaseHandle(
84578ee8d1cSJulian Grajkowski pCompressionService->trans_handle_compression_rx);
84678ee8d1cSJulian Grajkowski LAC_CHECK_STATUS(status);
84778ee8d1cSJulian Grajkowski
84878ee8d1cSJulian Grajkowski if (CPA_TRUE == pStatsCollection->bDcStatsEnabled) {
84978ee8d1cSJulian Grajkowski /* Clean stats */
85078ee8d1cSJulian Grajkowski if (NULL != pCompressionService->debug_file) {
85178ee8d1cSJulian Grajkowski icp_adf_debugRemoveFile(
85278ee8d1cSJulian Grajkowski pCompressionService->debug_file);
85378ee8d1cSJulian Grajkowski LAC_OS_FREE(pCompressionService->debug_file->name);
85478ee8d1cSJulian Grajkowski LAC_OS_FREE(pCompressionService->debug_file);
85578ee8d1cSJulian Grajkowski pCompressionService->debug_file = NULL;
85678ee8d1cSJulian Grajkowski }
85778ee8d1cSJulian Grajkowski }
85878ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.stats = NULL;
85978ee8d1cSJulian Grajkowski dcStatsFree(pCompressionService);
86078ee8d1cSJulian Grajkowski
86178ee8d1cSJulian Grajkowski if (icp_adf_is_dev_in_reset(device)) {
86278ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.state =
86378ee8d1cSJulian Grajkowski SAL_SERVICE_STATE_RESTARTING;
86478ee8d1cSJulian Grajkowski return CPA_STATUS_SUCCESS;
86578ee8d1cSJulian Grajkowski }
86678ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.state =
86778ee8d1cSJulian Grajkowski SAL_SERVICE_STATE_SHUTDOWN;
86878ee8d1cSJulian Grajkowski return status;
86978ee8d1cSJulian Grajkowski }
87078ee8d1cSJulian Grajkowski
87178ee8d1cSJulian Grajkowski CpaStatus
cpaDcGetStatusText(const CpaInstanceHandle dcInstance,const CpaStatus errStatus,Cpa8S * pStatusText)87278ee8d1cSJulian Grajkowski cpaDcGetStatusText(const CpaInstanceHandle dcInstance,
87378ee8d1cSJulian Grajkowski const CpaStatus errStatus,
87478ee8d1cSJulian Grajkowski Cpa8S *pStatusText)
87578ee8d1cSJulian Grajkowski {
87678ee8d1cSJulian Grajkowski CpaStatus status = CPA_STATUS_SUCCESS;
87778ee8d1cSJulian Grajkowski
87878ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(pStatusText);
87978ee8d1cSJulian Grajkowski
88078ee8d1cSJulian Grajkowski switch (errStatus) {
88178ee8d1cSJulian Grajkowski case CPA_STATUS_SUCCESS:
88278ee8d1cSJulian Grajkowski LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_SUCCESS);
88378ee8d1cSJulian Grajkowski break;
88478ee8d1cSJulian Grajkowski case CPA_STATUS_FAIL:
88578ee8d1cSJulian Grajkowski LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_FAIL);
88678ee8d1cSJulian Grajkowski break;
88778ee8d1cSJulian Grajkowski case CPA_STATUS_RETRY:
88878ee8d1cSJulian Grajkowski LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_RETRY);
88978ee8d1cSJulian Grajkowski break;
89078ee8d1cSJulian Grajkowski case CPA_STATUS_RESOURCE:
89178ee8d1cSJulian Grajkowski LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_RESOURCE);
89278ee8d1cSJulian Grajkowski break;
89378ee8d1cSJulian Grajkowski case CPA_STATUS_INVALID_PARAM:
89478ee8d1cSJulian Grajkowski LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_INVALID_PARAM);
89578ee8d1cSJulian Grajkowski break;
89678ee8d1cSJulian Grajkowski case CPA_STATUS_FATAL:
89778ee8d1cSJulian Grajkowski LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_FATAL);
89878ee8d1cSJulian Grajkowski break;
89978ee8d1cSJulian Grajkowski case CPA_STATUS_UNSUPPORTED:
90078ee8d1cSJulian Grajkowski LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_UNSUPPORTED);
90178ee8d1cSJulian Grajkowski break;
90278ee8d1cSJulian Grajkowski default:
90378ee8d1cSJulian Grajkowski status = CPA_STATUS_INVALID_PARAM;
90478ee8d1cSJulian Grajkowski break;
90578ee8d1cSJulian Grajkowski }
90678ee8d1cSJulian Grajkowski
90778ee8d1cSJulian Grajkowski return status;
90878ee8d1cSJulian Grajkowski }
90978ee8d1cSJulian Grajkowski
91078ee8d1cSJulian Grajkowski CpaStatus
cpaDcGetNumIntermediateBuffers(CpaInstanceHandle dcInstance,Cpa16U * pNumBuffers)91178ee8d1cSJulian Grajkowski cpaDcGetNumIntermediateBuffers(CpaInstanceHandle dcInstance,
91278ee8d1cSJulian Grajkowski Cpa16U *pNumBuffers)
91378ee8d1cSJulian Grajkowski {
91478ee8d1cSJulian Grajkowski CpaInstanceHandle insHandle = NULL;
91578ee8d1cSJulian Grajkowski sal_compression_service_t *pService = NULL;
91678ee8d1cSJulian Grajkowski
91778ee8d1cSJulian Grajkowski if (CPA_INSTANCE_HANDLE_SINGLE == dcInstance) {
91878ee8d1cSJulian Grajkowski insHandle = dcGetFirstHandle();
91978ee8d1cSJulian Grajkowski } else {
92078ee8d1cSJulian Grajkowski insHandle = dcInstance;
92178ee8d1cSJulian Grajkowski }
92278ee8d1cSJulian Grajkowski
92378ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(insHandle);
92478ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(pNumBuffers);
92578ee8d1cSJulian Grajkowski
92678ee8d1cSJulian Grajkowski pService = (sal_compression_service_t *)insHandle;
92778ee8d1cSJulian Grajkowski *pNumBuffers = pService->numInterBuffs;
92878ee8d1cSJulian Grajkowski
92978ee8d1cSJulian Grajkowski return CPA_STATUS_SUCCESS;
93078ee8d1cSJulian Grajkowski }
93178ee8d1cSJulian Grajkowski
93278ee8d1cSJulian Grajkowski CpaStatus
cpaDcStartInstance(CpaInstanceHandle instanceHandle,Cpa16U numBuffers,CpaBufferList ** pIntermediateBufferPtrsArray)93378ee8d1cSJulian Grajkowski cpaDcStartInstance(CpaInstanceHandle instanceHandle,
93478ee8d1cSJulian Grajkowski Cpa16U numBuffers,
93578ee8d1cSJulian Grajkowski CpaBufferList **pIntermediateBufferPtrsArray)
93678ee8d1cSJulian Grajkowski {
93778ee8d1cSJulian Grajkowski icp_qat_addr_width_t *pInterBuffPtrsArray = NULL;
93878ee8d1cSJulian Grajkowski icp_qat_addr_width_t pArrayBufferListDescPhyAddr = 0;
93978ee8d1cSJulian Grajkowski icp_qat_addr_width_t bufListDescPhyAddr;
94078ee8d1cSJulian Grajkowski icp_qat_addr_width_t bufListAlignedPhyAddr;
94178ee8d1cSJulian Grajkowski CpaFlatBuffer *pClientCurrFlatBuffer = NULL;
94278ee8d1cSJulian Grajkowski icp_buffer_list_desc_t *pBufferListDesc = NULL;
94378ee8d1cSJulian Grajkowski icp_flat_buffer_desc_t *pCurrFlatBufDesc = NULL;
94478ee8d1cSJulian Grajkowski CpaInstanceInfo2 info = { 0 };
94578ee8d1cSJulian Grajkowski icp_accel_dev_t *dev = NULL;
94678ee8d1cSJulian Grajkowski CpaStatus status = CPA_STATUS_SUCCESS;
94778ee8d1cSJulian Grajkowski sal_compression_service_t *pService = NULL;
94878ee8d1cSJulian Grajkowski CpaInstanceHandle insHandle = NULL;
94978ee8d1cSJulian Grajkowski Cpa16U bufferIndex = 0;
95078ee8d1cSJulian Grajkowski Cpa32U numFlatBuffers = 0;
95178ee8d1cSJulian Grajkowski Cpa64U clientListSize = 0;
95278ee8d1cSJulian Grajkowski CpaBufferList *pClientCurrentIntermediateBuffer = NULL;
95378ee8d1cSJulian Grajkowski Cpa32U bufferIndex2 = 0;
95478ee8d1cSJulian Grajkowski CpaBufferList **pTempIntermediateBufferPtrsArray;
95578ee8d1cSJulian Grajkowski Cpa64U lastClientListSize = 0;
95678ee8d1cSJulian Grajkowski
95778ee8d1cSJulian Grajkowski if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle) {
95878ee8d1cSJulian Grajkowski insHandle = dcGetFirstHandle();
95978ee8d1cSJulian Grajkowski } else {
96078ee8d1cSJulian Grajkowski insHandle = instanceHandle;
96178ee8d1cSJulian Grajkowski }
96278ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(insHandle);
96378ee8d1cSJulian Grajkowski
96478ee8d1cSJulian Grajkowski status = cpaDcInstanceGetInfo2(insHandle, &info);
96578ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) {
96678ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Can not get instance info.\n");
96778ee8d1cSJulian Grajkowski return status;
96878ee8d1cSJulian Grajkowski }
96978ee8d1cSJulian Grajkowski
97078ee8d1cSJulian Grajkowski dev = icp_adf_getAccelDevByAccelId(info.physInstId.packageId);
97178ee8d1cSJulian Grajkowski if (NULL == dev) {
97278ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Can not find device for the instance\n");
97378ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL;
97478ee8d1cSJulian Grajkowski }
97578ee8d1cSJulian Grajkowski
97678ee8d1cSJulian Grajkowski if (NULL == pIntermediateBufferPtrsArray) {
97778ee8d1cSJulian Grajkowski /* Increment dev ref counter and return - DRAM is not used */
97878ee8d1cSJulian Grajkowski icp_qa_dev_get(dev);
97978ee8d1cSJulian Grajkowski return CPA_STATUS_SUCCESS;
98078ee8d1cSJulian Grajkowski }
98178ee8d1cSJulian Grajkowski
98278ee8d1cSJulian Grajkowski if (0 == numBuffers) {
98378ee8d1cSJulian Grajkowski /* Increment dev ref counter and return - DRAM is not used */
98478ee8d1cSJulian Grajkowski icp_qa_dev_get(dev);
98578ee8d1cSJulian Grajkowski return CPA_STATUS_SUCCESS;
98678ee8d1cSJulian Grajkowski }
98778ee8d1cSJulian Grajkowski
98878ee8d1cSJulian Grajkowski pService = (sal_compression_service_t *)insHandle;
98978ee8d1cSJulian Grajkowski
99078ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(insHandle);
99178ee8d1cSJulian Grajkowski
99278ee8d1cSJulian Grajkowski if ((numBuffers > 0) && (NULL == pIntermediateBufferPtrsArray)) {
99378ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Invalid Intermediate Buffers Array pointer\n");
99478ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM;
99578ee8d1cSJulian Grajkowski }
99678ee8d1cSJulian Grajkowski
99778ee8d1cSJulian Grajkowski /* Check number of intermediate buffers allocated by user */
99878ee8d1cSJulian Grajkowski if ((pService->numInterBuffs != numBuffers)) {
99978ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Invalid number of buffers\n");
100078ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM;
100178ee8d1cSJulian Grajkowski }
100278ee8d1cSJulian Grajkowski
100378ee8d1cSJulian Grajkowski pTempIntermediateBufferPtrsArray = pIntermediateBufferPtrsArray;
100478ee8d1cSJulian Grajkowski for (bufferIndex = 0; bufferIndex < numBuffers; bufferIndex++) {
100578ee8d1cSJulian Grajkowski if (NULL == *pTempIntermediateBufferPtrsArray) {
100678ee8d1cSJulian Grajkowski QAT_UTILS_LOG(
100778ee8d1cSJulian Grajkowski "Intermediate Buffer - Invalid Buffer List pointer\n");
100878ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM;
100978ee8d1cSJulian Grajkowski }
101078ee8d1cSJulian Grajkowski
101178ee8d1cSJulian Grajkowski if (NULL == (*pTempIntermediateBufferPtrsArray)->pBuffers) {
101278ee8d1cSJulian Grajkowski QAT_UTILS_LOG(
101378ee8d1cSJulian Grajkowski "Intermediate Buffer - Invalid Flat Buffer descriptor pointer\n");
101478ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM;
101578ee8d1cSJulian Grajkowski }
101678ee8d1cSJulian Grajkowski
101778ee8d1cSJulian Grajkowski if (NULL ==
101878ee8d1cSJulian Grajkowski (*pTempIntermediateBufferPtrsArray)->pPrivateMetaData) {
101978ee8d1cSJulian Grajkowski QAT_UTILS_LOG(
102078ee8d1cSJulian Grajkowski "Intermediate Buffer - Invalid Private MetaData descriptor pointer\n");
102178ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM;
102278ee8d1cSJulian Grajkowski }
102378ee8d1cSJulian Grajkowski
102478ee8d1cSJulian Grajkowski clientListSize = 0;
102578ee8d1cSJulian Grajkowski for (bufferIndex2 = 0; bufferIndex2 <
102678ee8d1cSJulian Grajkowski (*pTempIntermediateBufferPtrsArray)->numBuffers;
102778ee8d1cSJulian Grajkowski bufferIndex2++) {
102878ee8d1cSJulian Grajkowski
102978ee8d1cSJulian Grajkowski if ((0 !=
103078ee8d1cSJulian Grajkowski (*pTempIntermediateBufferPtrsArray)
103178ee8d1cSJulian Grajkowski ->pBuffers[bufferIndex2]
103278ee8d1cSJulian Grajkowski .dataLenInBytes) &&
103378ee8d1cSJulian Grajkowski NULL ==
103478ee8d1cSJulian Grajkowski (*pTempIntermediateBufferPtrsArray)
103578ee8d1cSJulian Grajkowski ->pBuffers[bufferIndex2]
103678ee8d1cSJulian Grajkowski .pData) {
103778ee8d1cSJulian Grajkowski QAT_UTILS_LOG(
103878ee8d1cSJulian Grajkowski "Intermediate Buffer - Invalid Flat Buffer pointer\n");
103978ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM;
104078ee8d1cSJulian Grajkowski }
104178ee8d1cSJulian Grajkowski
104278ee8d1cSJulian Grajkowski clientListSize += (*pTempIntermediateBufferPtrsArray)
104378ee8d1cSJulian Grajkowski ->pBuffers[bufferIndex2]
104478ee8d1cSJulian Grajkowski .dataLenInBytes;
104578ee8d1cSJulian Grajkowski }
104678ee8d1cSJulian Grajkowski
104778ee8d1cSJulian Grajkowski if (bufferIndex != 0) {
104878ee8d1cSJulian Grajkowski if (lastClientListSize != clientListSize) {
104978ee8d1cSJulian Grajkowski QAT_UTILS_LOG(
105078ee8d1cSJulian Grajkowski "SGLs have to be of the same size.\n");
105178ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM;
105278ee8d1cSJulian Grajkowski }
105378ee8d1cSJulian Grajkowski } else {
105478ee8d1cSJulian Grajkowski lastClientListSize = clientListSize;
105578ee8d1cSJulian Grajkowski }
105678ee8d1cSJulian Grajkowski pTempIntermediateBufferPtrsArray++;
105778ee8d1cSJulian Grajkowski }
105878ee8d1cSJulian Grajkowski
105978ee8d1cSJulian Grajkowski /* Allocate array of physical pointers to icp_buffer_list_desc_t */
106078ee8d1cSJulian Grajkowski status = LAC_OS_CAMALLOC(&pInterBuffPtrsArray,
106178ee8d1cSJulian Grajkowski (numBuffers * sizeof(icp_qat_addr_width_t)),
106278ee8d1cSJulian Grajkowski LAC_64BYTE_ALIGNMENT,
106378ee8d1cSJulian Grajkowski pService->nodeAffinity);
106478ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) {
106578ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Can not allocate Intermediate Buffers array.\n");
106678ee8d1cSJulian Grajkowski return status;
106778ee8d1cSJulian Grajkowski }
106878ee8d1cSJulian Grajkowski
106978ee8d1cSJulian Grajkowski /* Get physical address of the intermediate buffer pointers array */
107078ee8d1cSJulian Grajkowski pArrayBufferListDescPhyAddr = LAC_MEM_CAST_PTR_TO_UINT64(
107178ee8d1cSJulian Grajkowski LAC_OS_VIRT_TO_PHYS_INTERNAL(pInterBuffPtrsArray));
107278ee8d1cSJulian Grajkowski
107378ee8d1cSJulian Grajkowski pService->pInterBuffPtrsArray = pInterBuffPtrsArray;
107478ee8d1cSJulian Grajkowski pService->pInterBuffPtrsArrayPhyAddr = pArrayBufferListDescPhyAddr;
107578ee8d1cSJulian Grajkowski
107678ee8d1cSJulian Grajkowski /* Get the full size of the buffer list */
107778ee8d1cSJulian Grajkowski /* Assumption: all the SGLs allocated by the user have the same size */
107878ee8d1cSJulian Grajkowski clientListSize = 0;
107978ee8d1cSJulian Grajkowski for (bufferIndex = 0;
108078ee8d1cSJulian Grajkowski bufferIndex < (*pIntermediateBufferPtrsArray)->numBuffers;
108178ee8d1cSJulian Grajkowski bufferIndex++) {
108278ee8d1cSJulian Grajkowski clientListSize += ((*pIntermediateBufferPtrsArray)
108378ee8d1cSJulian Grajkowski ->pBuffers[bufferIndex]
108478ee8d1cSJulian Grajkowski .dataLenInBytes);
108578ee8d1cSJulian Grajkowski }
108678ee8d1cSJulian Grajkowski pService->minInterBuffSizeInBytes = clientListSize;
108778ee8d1cSJulian Grajkowski
108878ee8d1cSJulian Grajkowski for (bufferIndex = 0; bufferIndex < numBuffers; bufferIndex++) {
108978ee8d1cSJulian Grajkowski
109078ee8d1cSJulian Grajkowski /* Get pointer to the client Intermediate Buffer List
109178ee8d1cSJulian Grajkowski * (CpaBufferList) */
109278ee8d1cSJulian Grajkowski pClientCurrentIntermediateBuffer =
109378ee8d1cSJulian Grajkowski *pIntermediateBufferPtrsArray;
109478ee8d1cSJulian Grajkowski
109578ee8d1cSJulian Grajkowski /* Get number of flat buffers in the buffer list */
109678ee8d1cSJulian Grajkowski numFlatBuffers = pClientCurrentIntermediateBuffer->numBuffers;
109778ee8d1cSJulian Grajkowski
109878ee8d1cSJulian Grajkowski /* Get pointer to the client array of CpaFlatBuffers */
109978ee8d1cSJulian Grajkowski pClientCurrFlatBuffer =
110078ee8d1cSJulian Grajkowski pClientCurrentIntermediateBuffer->pBuffers;
110178ee8d1cSJulian Grajkowski
110278ee8d1cSJulian Grajkowski /* Calculate Physical address of current private SGL */
110378ee8d1cSJulian Grajkowski bufListDescPhyAddr = LAC_OS_VIRT_TO_PHYS_EXTERNAL(
110478ee8d1cSJulian Grajkowski (*pService),
110578ee8d1cSJulian Grajkowski pClientCurrentIntermediateBuffer->pPrivateMetaData);
110678ee8d1cSJulian Grajkowski if (bufListDescPhyAddr == 0) {
110778ee8d1cSJulian Grajkowski QAT_UTILS_LOG(
110878ee8d1cSJulian Grajkowski "Unable to get the physical address of the metadata.\n");
110978ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL;
111078ee8d1cSJulian Grajkowski }
111178ee8d1cSJulian Grajkowski
111278ee8d1cSJulian Grajkowski /* Align SGL physical address */
111378ee8d1cSJulian Grajkowski bufListAlignedPhyAddr =
111478ee8d1cSJulian Grajkowski LAC_ALIGN_POW2_ROUNDUP(bufListDescPhyAddr,
111578ee8d1cSJulian Grajkowski ICP_DESCRIPTOR_ALIGNMENT_BYTES);
111678ee8d1cSJulian Grajkowski
111778ee8d1cSJulian Grajkowski /* Set physical address of the Intermediate Buffer SGL in the
111878ee8d1cSJulian Grajkowski * SGLs array
111978ee8d1cSJulian Grajkowski */
112078ee8d1cSJulian Grajkowski *pInterBuffPtrsArray =
112178ee8d1cSJulian Grajkowski LAC_MEM_CAST_PTR_TO_UINT64(bufListAlignedPhyAddr);
112278ee8d1cSJulian Grajkowski
112378ee8d1cSJulian Grajkowski /* Calculate (virtual) offset to the buffer list descriptor */
112478ee8d1cSJulian Grajkowski pBufferListDesc =
112578ee8d1cSJulian Grajkowski (icp_buffer_list_desc_t
112678ee8d1cSJulian Grajkowski *)((LAC_ARCH_UINT)pClientCurrentIntermediateBuffer
112778ee8d1cSJulian Grajkowski ->pPrivateMetaData +
112878ee8d1cSJulian Grajkowski (LAC_ARCH_UINT)(bufListAlignedPhyAddr -
112978ee8d1cSJulian Grajkowski bufListDescPhyAddr));
113078ee8d1cSJulian Grajkowski
113178ee8d1cSJulian Grajkowski /* Set number of flat buffers in the physical Buffer List
113278ee8d1cSJulian Grajkowski * descriptor */
113378ee8d1cSJulian Grajkowski pBufferListDesc->numBuffers = numFlatBuffers;
113478ee8d1cSJulian Grajkowski
113578ee8d1cSJulian Grajkowski /* Go past the Buffer List descriptor to the list of buffer
113678ee8d1cSJulian Grajkowski * descriptors
113778ee8d1cSJulian Grajkowski */
113878ee8d1cSJulian Grajkowski pCurrFlatBufDesc =
113978ee8d1cSJulian Grajkowski (icp_flat_buffer_desc_t *)((pBufferListDesc->phyBuffers));
114078ee8d1cSJulian Grajkowski
114178ee8d1cSJulian Grajkowski /* Loop for each flat buffer in the SGL */
114278ee8d1cSJulian Grajkowski while (0 != numFlatBuffers) {
114378ee8d1cSJulian Grajkowski /* Set length of the current flat buffer */
114478ee8d1cSJulian Grajkowski pCurrFlatBufDesc->dataLenInBytes =
114578ee8d1cSJulian Grajkowski pClientCurrFlatBuffer->dataLenInBytes;
114678ee8d1cSJulian Grajkowski
114778ee8d1cSJulian Grajkowski /* Set physical address of the flat buffer */
114878ee8d1cSJulian Grajkowski pCurrFlatBufDesc->phyBuffer =
114978ee8d1cSJulian Grajkowski LAC_MEM_CAST_PTR_TO_UINT64(
115078ee8d1cSJulian Grajkowski LAC_OS_VIRT_TO_PHYS_EXTERNAL(
115178ee8d1cSJulian Grajkowski (*pService), pClientCurrFlatBuffer->pData));
115278ee8d1cSJulian Grajkowski
115378ee8d1cSJulian Grajkowski if (pCurrFlatBufDesc->phyBuffer == 0) {
115478ee8d1cSJulian Grajkowski QAT_UTILS_LOG(
115578ee8d1cSJulian Grajkowski "Unable to get the physical address of the flat buffer.\n");
115678ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL;
115778ee8d1cSJulian Grajkowski }
115878ee8d1cSJulian Grajkowski
115978ee8d1cSJulian Grajkowski pCurrFlatBufDesc++;
116078ee8d1cSJulian Grajkowski pClientCurrFlatBuffer++;
116178ee8d1cSJulian Grajkowski numFlatBuffers--;
116278ee8d1cSJulian Grajkowski }
116378ee8d1cSJulian Grajkowski pIntermediateBufferPtrsArray++;
116478ee8d1cSJulian Grajkowski pInterBuffPtrsArray++;
116578ee8d1cSJulian Grajkowski }
116678ee8d1cSJulian Grajkowski
116778ee8d1cSJulian Grajkowski pService->generic_service_info.isInstanceStarted = CPA_TRUE;
116878ee8d1cSJulian Grajkowski
116978ee8d1cSJulian Grajkowski /* Increment dev ref counter */
117078ee8d1cSJulian Grajkowski icp_qa_dev_get(dev);
117178ee8d1cSJulian Grajkowski return CPA_STATUS_SUCCESS;
117278ee8d1cSJulian Grajkowski }
117378ee8d1cSJulian Grajkowski
117478ee8d1cSJulian Grajkowski CpaStatus
cpaDcStopInstance(CpaInstanceHandle instanceHandle)117578ee8d1cSJulian Grajkowski cpaDcStopInstance(CpaInstanceHandle instanceHandle)
117678ee8d1cSJulian Grajkowski {
117778ee8d1cSJulian Grajkowski CpaInstanceHandle insHandle = NULL;
117878ee8d1cSJulian Grajkowski CpaInstanceInfo2 info = { 0 };
117978ee8d1cSJulian Grajkowski icp_accel_dev_t *dev = NULL;
118078ee8d1cSJulian Grajkowski CpaStatus status = CPA_STATUS_SUCCESS;
118178ee8d1cSJulian Grajkowski sal_compression_service_t *pService = NULL;
118278ee8d1cSJulian Grajkowski
118378ee8d1cSJulian Grajkowski if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle) {
118478ee8d1cSJulian Grajkowski insHandle = dcGetFirstHandle();
118578ee8d1cSJulian Grajkowski } else {
118678ee8d1cSJulian Grajkowski insHandle = instanceHandle;
118778ee8d1cSJulian Grajkowski }
118878ee8d1cSJulian Grajkowski
118978ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(insHandle);
119078ee8d1cSJulian Grajkowski pService = (sal_compression_service_t *)insHandle;
119178ee8d1cSJulian Grajkowski
119278ee8d1cSJulian Grajkowski /* Free Intermediate Buffer Pointers Array */
119378ee8d1cSJulian Grajkowski if (pService->pInterBuffPtrsArray != NULL) {
119478ee8d1cSJulian Grajkowski LAC_OS_CAFREE(pService->pInterBuffPtrsArray);
119578ee8d1cSJulian Grajkowski pService->pInterBuffPtrsArray = 0;
119678ee8d1cSJulian Grajkowski }
119778ee8d1cSJulian Grajkowski
119878ee8d1cSJulian Grajkowski pService->pInterBuffPtrsArrayPhyAddr = 0;
119978ee8d1cSJulian Grajkowski
120078ee8d1cSJulian Grajkowski status = cpaDcInstanceGetInfo2(insHandle, &info);
120178ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS != status) {
120278ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Can not get instance info.\n");
120378ee8d1cSJulian Grajkowski return status;
120478ee8d1cSJulian Grajkowski }
120578ee8d1cSJulian Grajkowski dev = icp_adf_getAccelDevByAccelId(info.physInstId.packageId);
120678ee8d1cSJulian Grajkowski if (NULL == dev) {
120778ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Can not find device for the instance.\n");
120878ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL;
120978ee8d1cSJulian Grajkowski }
121078ee8d1cSJulian Grajkowski
121178ee8d1cSJulian Grajkowski pService->generic_service_info.isInstanceStarted = CPA_FALSE;
121278ee8d1cSJulian Grajkowski
121378ee8d1cSJulian Grajkowski /* Decrement dev ref counter */
121478ee8d1cSJulian Grajkowski icp_qa_dev_put(dev);
121578ee8d1cSJulian Grajkowski return CPA_STATUS_SUCCESS;
121678ee8d1cSJulian Grajkowski }
121778ee8d1cSJulian Grajkowski
121878ee8d1cSJulian Grajkowski CpaStatus
cpaDcGetNumInstances(Cpa16U * pNumInstances)121978ee8d1cSJulian Grajkowski cpaDcGetNumInstances(Cpa16U *pNumInstances)
122078ee8d1cSJulian Grajkowski {
122178ee8d1cSJulian Grajkowski CpaStatus status = CPA_STATUS_SUCCESS;
122278ee8d1cSJulian Grajkowski icp_accel_dev_t **pAdfInsts = NULL;
122378ee8d1cSJulian Grajkowski icp_accel_dev_t *dev_addr = NULL;
122478ee8d1cSJulian Grajkowski sal_t *base_addr = NULL;
122578ee8d1cSJulian Grajkowski sal_list_t *list_temp = NULL;
122678ee8d1cSJulian Grajkowski Cpa16U num_accel_dev = 0;
122778ee8d1cSJulian Grajkowski Cpa16U num = 0;
122878ee8d1cSJulian Grajkowski Cpa16U i = 0;
122978ee8d1cSJulian Grajkowski
123078ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(pNumInstances);
123178ee8d1cSJulian Grajkowski
123278ee8d1cSJulian Grajkowski /* Get the number of accel_dev in the system */
123378ee8d1cSJulian Grajkowski status = icp_amgr_getNumInstances(&num_accel_dev);
123478ee8d1cSJulian Grajkowski LAC_CHECK_STATUS(status);
123578ee8d1cSJulian Grajkowski
123678ee8d1cSJulian Grajkowski /* Allocate memory to store addr of accel_devs */
123778ee8d1cSJulian Grajkowski pAdfInsts =
123878ee8d1cSJulian Grajkowski malloc(num_accel_dev * sizeof(icp_accel_dev_t *), M_QAT, M_WAITOK);
123978ee8d1cSJulian Grajkowski num_accel_dev = 0;
124078ee8d1cSJulian Grajkowski
124178ee8d1cSJulian Grajkowski /* Get ADF to return accel_devs with dc enabled */
124278ee8d1cSJulian Grajkowski status = icp_amgr_getAllAccelDevByCapabilities(
124378ee8d1cSJulian Grajkowski ICP_ACCEL_CAPABILITIES_COMPRESSION, pAdfInsts, &num_accel_dev);
124478ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS == status) {
124578ee8d1cSJulian Grajkowski for (i = 0; i < num_accel_dev; i++) {
124678ee8d1cSJulian Grajkowski dev_addr = (icp_accel_dev_t *)pAdfInsts[i];
124778ee8d1cSJulian Grajkowski if (NULL != dev_addr) {
124878ee8d1cSJulian Grajkowski base_addr = dev_addr->pSalHandle;
124978ee8d1cSJulian Grajkowski if (NULL != base_addr) {
125078ee8d1cSJulian Grajkowski list_temp =
125178ee8d1cSJulian Grajkowski base_addr->compression_services;
125278ee8d1cSJulian Grajkowski while (NULL != list_temp) {
125378ee8d1cSJulian Grajkowski num++;
125478ee8d1cSJulian Grajkowski list_temp =
125578ee8d1cSJulian Grajkowski SalList_next(list_temp);
125678ee8d1cSJulian Grajkowski }
125778ee8d1cSJulian Grajkowski }
125878ee8d1cSJulian Grajkowski }
125978ee8d1cSJulian Grajkowski }
126078ee8d1cSJulian Grajkowski
126178ee8d1cSJulian Grajkowski *pNumInstances = num;
126278ee8d1cSJulian Grajkowski }
126378ee8d1cSJulian Grajkowski
126478ee8d1cSJulian Grajkowski free(pAdfInsts, M_QAT);
126578ee8d1cSJulian Grajkowski
126678ee8d1cSJulian Grajkowski return status;
126778ee8d1cSJulian Grajkowski }
126878ee8d1cSJulian Grajkowski
126978ee8d1cSJulian Grajkowski CpaStatus
cpaDcGetInstances(Cpa16U numInstances,CpaInstanceHandle * dcInstances)127078ee8d1cSJulian Grajkowski cpaDcGetInstances(Cpa16U numInstances, CpaInstanceHandle *dcInstances)
127178ee8d1cSJulian Grajkowski {
127278ee8d1cSJulian Grajkowski CpaStatus status = CPA_STATUS_SUCCESS;
127378ee8d1cSJulian Grajkowski icp_accel_dev_t **pAdfInsts = NULL;
127478ee8d1cSJulian Grajkowski icp_accel_dev_t *dev_addr = NULL;
127578ee8d1cSJulian Grajkowski sal_t *base_addr = NULL;
127678ee8d1cSJulian Grajkowski sal_list_t *list_temp = NULL;
127778ee8d1cSJulian Grajkowski Cpa16U num_accel_dev = 0;
127878ee8d1cSJulian Grajkowski Cpa16U index = 0;
127978ee8d1cSJulian Grajkowski Cpa16U i = 0;
128078ee8d1cSJulian Grajkowski
128178ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(dcInstances);
128278ee8d1cSJulian Grajkowski if (0 == numInstances) {
128378ee8d1cSJulian Grajkowski QAT_UTILS_LOG("numInstances is 0.\n");
128478ee8d1cSJulian Grajkowski return CPA_STATUS_INVALID_PARAM;
128578ee8d1cSJulian Grajkowski }
128678ee8d1cSJulian Grajkowski
128778ee8d1cSJulian Grajkowski /* Get the number of accel_dev in the system */
128878ee8d1cSJulian Grajkowski status = icp_amgr_getNumInstances(&num_accel_dev);
128978ee8d1cSJulian Grajkowski LAC_CHECK_STATUS(status);
129078ee8d1cSJulian Grajkowski
129178ee8d1cSJulian Grajkowski /* Allocate memory to store addr of accel_devs */
129278ee8d1cSJulian Grajkowski pAdfInsts =
129378ee8d1cSJulian Grajkowski malloc(num_accel_dev * sizeof(icp_accel_dev_t *), M_QAT, M_WAITOK);
129478ee8d1cSJulian Grajkowski
129578ee8d1cSJulian Grajkowski num_accel_dev = 0;
129678ee8d1cSJulian Grajkowski /* Get ADF to return accel_devs with dc enabled */
129778ee8d1cSJulian Grajkowski status = icp_amgr_getAllAccelDevByCapabilities(
129878ee8d1cSJulian Grajkowski ICP_ACCEL_CAPABILITIES_COMPRESSION, pAdfInsts, &num_accel_dev);
129978ee8d1cSJulian Grajkowski
130078ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS == status) {
130178ee8d1cSJulian Grajkowski /* First check the number of instances in the system */
130278ee8d1cSJulian Grajkowski for (i = 0; i < num_accel_dev; i++) {
130378ee8d1cSJulian Grajkowski dev_addr = (icp_accel_dev_t *)pAdfInsts[i];
130478ee8d1cSJulian Grajkowski if (NULL != dev_addr) {
130578ee8d1cSJulian Grajkowski base_addr = dev_addr->pSalHandle;
130678ee8d1cSJulian Grajkowski if (NULL != base_addr) {
130778ee8d1cSJulian Grajkowski list_temp =
130878ee8d1cSJulian Grajkowski base_addr->compression_services;
130978ee8d1cSJulian Grajkowski while (NULL != list_temp) {
131078ee8d1cSJulian Grajkowski if (index >
131178ee8d1cSJulian Grajkowski (numInstances - 1)) {
131278ee8d1cSJulian Grajkowski break;
131378ee8d1cSJulian Grajkowski }
131478ee8d1cSJulian Grajkowski
131578ee8d1cSJulian Grajkowski dcInstances[index] =
131678ee8d1cSJulian Grajkowski SalList_getObject(
131778ee8d1cSJulian Grajkowski list_temp);
131878ee8d1cSJulian Grajkowski list_temp =
131978ee8d1cSJulian Grajkowski SalList_next(list_temp);
132078ee8d1cSJulian Grajkowski index++;
132178ee8d1cSJulian Grajkowski }
132278ee8d1cSJulian Grajkowski }
132378ee8d1cSJulian Grajkowski }
132478ee8d1cSJulian Grajkowski }
132578ee8d1cSJulian Grajkowski
132678ee8d1cSJulian Grajkowski if (numInstances > index) {
132778ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Only %d dc instances available.\n",
132878ee8d1cSJulian Grajkowski index);
132978ee8d1cSJulian Grajkowski status = CPA_STATUS_RESOURCE;
133078ee8d1cSJulian Grajkowski }
133178ee8d1cSJulian Grajkowski }
133278ee8d1cSJulian Grajkowski
133378ee8d1cSJulian Grajkowski if (CPA_STATUS_SUCCESS == status) {
133478ee8d1cSJulian Grajkowski index = 0;
133578ee8d1cSJulian Grajkowski for (i = 0; i < num_accel_dev; i++) {
133678ee8d1cSJulian Grajkowski dev_addr = (icp_accel_dev_t *)pAdfInsts[i];
133778ee8d1cSJulian Grajkowski /* Note dev_addr cannot be NULL here as numInstances=0
133878ee8d1cSJulian Grajkowski is not valid and if dev_addr=NULL then index=0 (which
133978ee8d1cSJulian Grajkowski is less than numInstances and status is set to
134078ee8d1cSJulian Grajkowski _RESOURCE
134178ee8d1cSJulian Grajkowski above */
134278ee8d1cSJulian Grajkowski base_addr = dev_addr->pSalHandle;
134378ee8d1cSJulian Grajkowski if (NULL != base_addr) {
134478ee8d1cSJulian Grajkowski list_temp = base_addr->compression_services;
134578ee8d1cSJulian Grajkowski while (NULL != list_temp) {
134678ee8d1cSJulian Grajkowski if (index > (numInstances - 1)) {
134778ee8d1cSJulian Grajkowski break;
134878ee8d1cSJulian Grajkowski }
134978ee8d1cSJulian Grajkowski
135078ee8d1cSJulian Grajkowski dcInstances[index] =
135178ee8d1cSJulian Grajkowski SalList_getObject(list_temp);
135278ee8d1cSJulian Grajkowski list_temp = SalList_next(list_temp);
135378ee8d1cSJulian Grajkowski index++;
135478ee8d1cSJulian Grajkowski }
135578ee8d1cSJulian Grajkowski }
135678ee8d1cSJulian Grajkowski }
135778ee8d1cSJulian Grajkowski }
135878ee8d1cSJulian Grajkowski
135978ee8d1cSJulian Grajkowski free(pAdfInsts, M_QAT);
136078ee8d1cSJulian Grajkowski
136178ee8d1cSJulian Grajkowski return status;
136278ee8d1cSJulian Grajkowski }
136378ee8d1cSJulian Grajkowski
136478ee8d1cSJulian Grajkowski CpaStatus
cpaDcInstanceGetInfo2(const CpaInstanceHandle instanceHandle,CpaInstanceInfo2 * pInstanceInfo2)136578ee8d1cSJulian Grajkowski cpaDcInstanceGetInfo2(const CpaInstanceHandle instanceHandle,
136678ee8d1cSJulian Grajkowski CpaInstanceInfo2 *pInstanceInfo2)
136778ee8d1cSJulian Grajkowski {
136878ee8d1cSJulian Grajkowski sal_compression_service_t *pCompressionService = NULL;
136978ee8d1cSJulian Grajkowski CpaInstanceHandle insHandle = NULL;
137078ee8d1cSJulian Grajkowski icp_accel_dev_t *dev = NULL;
137178ee8d1cSJulian Grajkowski CpaStatus status = CPA_STATUS_SUCCESS;
137278ee8d1cSJulian Grajkowski char keyStr[ADF_CFG_MAX_KEY_LEN_IN_BYTES] = { 0 };
137378ee8d1cSJulian Grajkowski char valStr[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
137478ee8d1cSJulian Grajkowski char *section = DYN_SEC;
137578ee8d1cSJulian Grajkowski
137678ee8d1cSJulian Grajkowski if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle) {
137778ee8d1cSJulian Grajkowski insHandle = dcGetFirstHandle();
137878ee8d1cSJulian Grajkowski } else {
137978ee8d1cSJulian Grajkowski insHandle = instanceHandle;
138078ee8d1cSJulian Grajkowski }
138178ee8d1cSJulian Grajkowski
138278ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(insHandle);
138378ee8d1cSJulian Grajkowski SAL_CHECK_INSTANCE_TYPE(insHandle, SAL_SERVICE_TYPE_COMPRESSION);
138478ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(pInstanceInfo2);
138578ee8d1cSJulian Grajkowski
138678ee8d1cSJulian Grajkowski LAC_OS_BZERO(pInstanceInfo2, sizeof(CpaInstanceInfo2));
138778ee8d1cSJulian Grajkowski pInstanceInfo2->accelerationServiceType =
138878ee8d1cSJulian Grajkowski CPA_ACC_SVC_TYPE_DATA_COMPRESSION;
138978ee8d1cSJulian Grajkowski
139078ee8d1cSJulian Grajkowski snprintf((char *)pInstanceInfo2->vendorName,
139178ee8d1cSJulian Grajkowski CPA_INST_VENDOR_NAME_SIZE,
139278ee8d1cSJulian Grajkowski "%s",
139378ee8d1cSJulian Grajkowski SAL_INFO2_VENDOR_NAME);
139478ee8d1cSJulian Grajkowski pInstanceInfo2->vendorName[CPA_INST_VENDOR_NAME_SIZE - 1] = '\0';
139578ee8d1cSJulian Grajkowski
139678ee8d1cSJulian Grajkowski snprintf((char *)pInstanceInfo2->swVersion,
139778ee8d1cSJulian Grajkowski CPA_INST_SW_VERSION_SIZE,
139878ee8d1cSJulian Grajkowski "Version %d.%d",
139978ee8d1cSJulian Grajkowski SAL_INFO2_DRIVER_SW_VERSION_MAJ_NUMBER,
140078ee8d1cSJulian Grajkowski SAL_INFO2_DRIVER_SW_VERSION_MIN_NUMBER);
140178ee8d1cSJulian Grajkowski pInstanceInfo2->swVersion[CPA_INST_SW_VERSION_SIZE - 1] = '\0';
140278ee8d1cSJulian Grajkowski
140378ee8d1cSJulian Grajkowski /* Note we can safely read the contents of the compression service
140478ee8d1cSJulian Grajkowski instance
140578ee8d1cSJulian Grajkowski here because icp_amgr_getAccelDevByCapabilities() only returns devs
140678ee8d1cSJulian Grajkowski that have started */
140778ee8d1cSJulian Grajkowski pCompressionService = (sal_compression_service_t *)insHandle;
140878ee8d1cSJulian Grajkowski pInstanceInfo2->physInstId.packageId = pCompressionService->pkgID;
140978ee8d1cSJulian Grajkowski pInstanceInfo2->physInstId.acceleratorId =
141078ee8d1cSJulian Grajkowski pCompressionService->acceleratorNum;
141178ee8d1cSJulian Grajkowski pInstanceInfo2->physInstId.executionEngineId = 0;
141278ee8d1cSJulian Grajkowski pInstanceInfo2->physInstId.busAddress =
141378ee8d1cSJulian Grajkowski icp_adf_get_busAddress(pInstanceInfo2->physInstId.packageId);
141478ee8d1cSJulian Grajkowski
141578ee8d1cSJulian Grajkowski /* set coreAffinity to zero before use */
141678ee8d1cSJulian Grajkowski LAC_OS_BZERO(pInstanceInfo2->coreAffinity,
141778ee8d1cSJulian Grajkowski sizeof(pInstanceInfo2->coreAffinity));
141878ee8d1cSJulian Grajkowski CPA_BITMAP_BIT_SET(pInstanceInfo2->coreAffinity,
141978ee8d1cSJulian Grajkowski pCompressionService->coreAffinity);
142078ee8d1cSJulian Grajkowski
142178ee8d1cSJulian Grajkowski pInstanceInfo2->nodeAffinity = pCompressionService->nodeAffinity;
142278ee8d1cSJulian Grajkowski
142378ee8d1cSJulian Grajkowski if (CPA_TRUE ==
142478ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.isInstanceStarted) {
142578ee8d1cSJulian Grajkowski pInstanceInfo2->operState = CPA_OPER_STATE_UP;
142678ee8d1cSJulian Grajkowski } else {
142778ee8d1cSJulian Grajkowski pInstanceInfo2->operState = CPA_OPER_STATE_DOWN;
142878ee8d1cSJulian Grajkowski }
142978ee8d1cSJulian Grajkowski
143078ee8d1cSJulian Grajkowski pInstanceInfo2->requiresPhysicallyContiguousMemory = CPA_TRUE;
143178ee8d1cSJulian Grajkowski
143278ee8d1cSJulian Grajkowski if (SAL_RESP_POLL_CFG_FILE == pCompressionService->isPolled) {
143378ee8d1cSJulian Grajkowski pInstanceInfo2->isPolled = CPA_TRUE;
143478ee8d1cSJulian Grajkowski } else {
143578ee8d1cSJulian Grajkowski pInstanceInfo2->isPolled = CPA_FALSE;
143678ee8d1cSJulian Grajkowski }
143778ee8d1cSJulian Grajkowski
143878ee8d1cSJulian Grajkowski pInstanceInfo2->isOffloaded = CPA_TRUE;
143978ee8d1cSJulian Grajkowski /* Get the instance name and part name from the config file */
144078ee8d1cSJulian Grajkowski dev = icp_adf_getAccelDevByAccelId(pCompressionService->pkgID);
144178ee8d1cSJulian Grajkowski if (NULL == dev) {
144278ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Can not find device for the instance.\n");
144378ee8d1cSJulian Grajkowski LAC_OS_BZERO(pInstanceInfo2, sizeof(CpaInstanceInfo2));
144478ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL;
144578ee8d1cSJulian Grajkowski }
144678ee8d1cSJulian Grajkowski snprintf((char *)pInstanceInfo2->partName,
144778ee8d1cSJulian Grajkowski CPA_INST_PART_NAME_SIZE,
144878ee8d1cSJulian Grajkowski SAL_INFO2_PART_NAME,
144978ee8d1cSJulian Grajkowski dev->deviceName);
145078ee8d1cSJulian Grajkowski pInstanceInfo2->partName[CPA_INST_PART_NAME_SIZE - 1] = '\0';
145178ee8d1cSJulian Grajkowski
145278ee8d1cSJulian Grajkowski if (CPA_FALSE == pCompressionService->generic_service_info.is_dyn) {
145378ee8d1cSJulian Grajkowski section = icpGetProcessName();
145478ee8d1cSJulian Grajkowski }
145578ee8d1cSJulian Grajkowski
145678ee8d1cSJulian Grajkowski status = Sal_StringParsing(
145778ee8d1cSJulian Grajkowski "Dc",
145878ee8d1cSJulian Grajkowski pCompressionService->generic_service_info.instance,
145978ee8d1cSJulian Grajkowski "Name",
146078ee8d1cSJulian Grajkowski keyStr);
146178ee8d1cSJulian Grajkowski LAC_CHECK_STATUS(status);
146278ee8d1cSJulian Grajkowski status = icp_adf_cfgGetParamValue(dev, section, keyStr, valStr);
146378ee8d1cSJulian Grajkowski LAC_CHECK_STATUS(status);
146478ee8d1cSJulian Grajkowski strncpy((char *)pInstanceInfo2->instName,
146578ee8d1cSJulian Grajkowski valStr,
146678ee8d1cSJulian Grajkowski sizeof(pInstanceInfo2->instName) - 1);
146778ee8d1cSJulian Grajkowski pInstanceInfo2->instName[CPA_INST_NAME_SIZE - 1] = '\0';
146878ee8d1cSJulian Grajkowski
146978ee8d1cSJulian Grajkowski #if __GNUC__ >= 7
147078ee8d1cSJulian Grajkowski #pragma GCC diagnostic push
147178ee8d1cSJulian Grajkowski #pragma GCC diagnostic ignored "-Wformat-truncation"
147278ee8d1cSJulian Grajkowski #endif
147378ee8d1cSJulian Grajkowski snprintf((char *)pInstanceInfo2->instID,
147478ee8d1cSJulian Grajkowski CPA_INST_ID_SIZE,
147578ee8d1cSJulian Grajkowski "%s_%s",
147678ee8d1cSJulian Grajkowski section,
147778ee8d1cSJulian Grajkowski valStr);
147878ee8d1cSJulian Grajkowski #if __GNUC__ >= 7
147978ee8d1cSJulian Grajkowski #pragma GCC diagnostic pop
148078ee8d1cSJulian Grajkowski #endif
148178ee8d1cSJulian Grajkowski
148278ee8d1cSJulian Grajkowski return CPA_STATUS_SUCCESS;
148378ee8d1cSJulian Grajkowski }
148478ee8d1cSJulian Grajkowski
148578ee8d1cSJulian Grajkowski CpaStatus
cpaDcQueryCapabilities(CpaInstanceHandle dcInstance,CpaDcInstanceCapabilities * pInstanceCapabilities)148678ee8d1cSJulian Grajkowski cpaDcQueryCapabilities(CpaInstanceHandle dcInstance,
148778ee8d1cSJulian Grajkowski CpaDcInstanceCapabilities *pInstanceCapabilities)
148878ee8d1cSJulian Grajkowski {
148978ee8d1cSJulian Grajkowski CpaInstanceHandle insHandle = NULL;
149078ee8d1cSJulian Grajkowski sal_compression_service_t *pService = NULL;
149178ee8d1cSJulian Grajkowski Cpa32U capabilitiesMask = 0;
149278ee8d1cSJulian Grajkowski dc_extd_ftrs_t *pExtendedFtrs = NULL;
149378ee8d1cSJulian Grajkowski
149478ee8d1cSJulian Grajkowski if (CPA_INSTANCE_HANDLE_SINGLE == dcInstance) {
149578ee8d1cSJulian Grajkowski insHandle = dcGetFirstHandle();
149678ee8d1cSJulian Grajkowski if (NULL == insHandle) {
149778ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Can not get the instance.\n");
149878ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL;
149978ee8d1cSJulian Grajkowski }
150078ee8d1cSJulian Grajkowski } else {
150178ee8d1cSJulian Grajkowski insHandle = dcInstance;
150278ee8d1cSJulian Grajkowski }
150378ee8d1cSJulian Grajkowski
150478ee8d1cSJulian Grajkowski pService = (sal_compression_service_t *)insHandle;
150578ee8d1cSJulian Grajkowski
150678ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(insHandle);
150778ee8d1cSJulian Grajkowski SAL_CHECK_INSTANCE_TYPE(insHandle, SAL_SERVICE_TYPE_COMPRESSION);
150878ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(pInstanceCapabilities);
150978ee8d1cSJulian Grajkowski
151078ee8d1cSJulian Grajkowski memset(pInstanceCapabilities, 0, sizeof(CpaDcInstanceCapabilities));
151178ee8d1cSJulian Grajkowski
151278ee8d1cSJulian Grajkowski capabilitiesMask = pService->generic_service_info.capabilitiesMask;
151378ee8d1cSJulian Grajkowski
151478ee8d1cSJulian Grajkowski /* Set compression capabilities */
151578ee8d1cSJulian Grajkowski if (capabilitiesMask & ICP_ACCEL_CAPABILITIES_CNV_INTEGRITY) {
151678ee8d1cSJulian Grajkowski pInstanceCapabilities->integrityCrcs = CPA_TRUE;
151778ee8d1cSJulian Grajkowski }
151878ee8d1cSJulian Grajkowski
151978ee8d1cSJulian Grajkowski pInstanceCapabilities->endOfLastBlock = CPA_TRUE;
152078ee8d1cSJulian Grajkowski pInstanceCapabilities->statefulDeflateCompression = CPA_FALSE;
152178ee8d1cSJulian Grajkowski pInstanceCapabilities->statefulDeflateDecompression = CPA_TRUE;
152278ee8d1cSJulian Grajkowski pInstanceCapabilities->statelessDeflateCompression = CPA_TRUE;
152378ee8d1cSJulian Grajkowski pInstanceCapabilities->statelessDeflateDecompression = CPA_TRUE;
152478ee8d1cSJulian Grajkowski pInstanceCapabilities->checksumCRC32 = CPA_TRUE;
152578ee8d1cSJulian Grajkowski pInstanceCapabilities->checksumAdler32 = CPA_TRUE;
152678ee8d1cSJulian Grajkowski pInstanceCapabilities->dynamicHuffman = CPA_TRUE;
152778ee8d1cSJulian Grajkowski pInstanceCapabilities->precompiledHuffman = CPA_FALSE;
152878ee8d1cSJulian Grajkowski pInstanceCapabilities->dynamicHuffmanBufferReq = CPA_TRUE;
152978ee8d1cSJulian Grajkowski pInstanceCapabilities->autoSelectBestHuffmanTree = CPA_TRUE;
153078ee8d1cSJulian Grajkowski
153178ee8d1cSJulian Grajkowski pInstanceCapabilities->validWindowSizeMaskCompression =
153278ee8d1cSJulian Grajkowski pService->comp_device_data.windowSizeMask;
153378ee8d1cSJulian Grajkowski pInstanceCapabilities->validWindowSizeMaskDecompression =
153478ee8d1cSJulian Grajkowski pService->comp_device_data.windowSizeMask;
153578ee8d1cSJulian Grajkowski pExtendedFtrs = (dc_extd_ftrs_t *)&(
153678ee8d1cSJulian Grajkowski ((sal_service_t *)insHandle)->dcExtendedFeatures);
153778ee8d1cSJulian Grajkowski pInstanceCapabilities->batchAndPack = CPA_FALSE;
153878ee8d1cSJulian Grajkowski pInstanceCapabilities->compressAndVerify =
153978ee8d1cSJulian Grajkowski (CpaBoolean)pExtendedFtrs->is_cnv;
154078ee8d1cSJulian Grajkowski pInstanceCapabilities->compressAndVerifyStrict = CPA_TRUE;
154178ee8d1cSJulian Grajkowski pInstanceCapabilities->compressAndVerifyAndRecover =
154278ee8d1cSJulian Grajkowski (CpaBoolean)pExtendedFtrs->is_cnvnr;
154378ee8d1cSJulian Grajkowski return CPA_STATUS_SUCCESS;
154478ee8d1cSJulian Grajkowski }
154578ee8d1cSJulian Grajkowski
154678ee8d1cSJulian Grajkowski CpaStatus
cpaDcSetAddressTranslation(const CpaInstanceHandle instanceHandle,CpaVirtualToPhysical virtual2Physical)154778ee8d1cSJulian Grajkowski cpaDcSetAddressTranslation(const CpaInstanceHandle instanceHandle,
154878ee8d1cSJulian Grajkowski CpaVirtualToPhysical virtual2Physical)
154978ee8d1cSJulian Grajkowski {
155078ee8d1cSJulian Grajkowski sal_service_t *pService = NULL;
155178ee8d1cSJulian Grajkowski CpaInstanceHandle insHandle = NULL;
155278ee8d1cSJulian Grajkowski
155378ee8d1cSJulian Grajkowski if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle) {
155478ee8d1cSJulian Grajkowski insHandle = dcGetFirstHandle();
155578ee8d1cSJulian Grajkowski } else {
155678ee8d1cSJulian Grajkowski insHandle = instanceHandle;
155778ee8d1cSJulian Grajkowski }
155878ee8d1cSJulian Grajkowski
155978ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(insHandle);
156078ee8d1cSJulian Grajkowski SAL_CHECK_INSTANCE_TYPE(insHandle, SAL_SERVICE_TYPE_COMPRESSION);
156178ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(virtual2Physical);
156278ee8d1cSJulian Grajkowski
156378ee8d1cSJulian Grajkowski pService = (sal_service_t *)insHandle;
156478ee8d1cSJulian Grajkowski
156578ee8d1cSJulian Grajkowski pService->virt2PhysClient = virtual2Physical;
156678ee8d1cSJulian Grajkowski
156778ee8d1cSJulian Grajkowski return CPA_STATUS_SUCCESS;
156878ee8d1cSJulian Grajkowski }
156978ee8d1cSJulian Grajkowski
157078ee8d1cSJulian Grajkowski /**
157178ee8d1cSJulian Grajkowski ******************************************************************************
157278ee8d1cSJulian Grajkowski * @ingroup cpaDcCommon
157378ee8d1cSJulian Grajkowski * Data compression specific polling function which polls a DC instance.
157478ee8d1cSJulian Grajkowski *****************************************************************************/
157578ee8d1cSJulian Grajkowski
157678ee8d1cSJulian Grajkowski CpaStatus
icp_sal_DcPollInstance(CpaInstanceHandle instanceHandle_in,Cpa32U response_quota)157778ee8d1cSJulian Grajkowski icp_sal_DcPollInstance(CpaInstanceHandle instanceHandle_in,
157878ee8d1cSJulian Grajkowski Cpa32U response_quota)
157978ee8d1cSJulian Grajkowski {
158078ee8d1cSJulian Grajkowski CpaStatus status = CPA_STATUS_SUCCESS;
158178ee8d1cSJulian Grajkowski sal_compression_service_t *dc_handle = NULL;
158278ee8d1cSJulian Grajkowski sal_service_t *gen_handle = NULL;
158378ee8d1cSJulian Grajkowski icp_comms_trans_handle trans_hndTable[DC_NUM_RX_RINGS];
158478ee8d1cSJulian Grajkowski
158578ee8d1cSJulian Grajkowski if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) {
158678ee8d1cSJulian Grajkowski dc_handle = (sal_compression_service_t *)dcGetFirstHandle();
158778ee8d1cSJulian Grajkowski } else {
158878ee8d1cSJulian Grajkowski dc_handle = (sal_compression_service_t *)instanceHandle_in;
158978ee8d1cSJulian Grajkowski }
159078ee8d1cSJulian Grajkowski
159178ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(dc_handle);
159278ee8d1cSJulian Grajkowski SAL_RUNNING_CHECK(dc_handle);
159378ee8d1cSJulian Grajkowski
159478ee8d1cSJulian Grajkowski gen_handle = &(dc_handle->generic_service_info);
159578ee8d1cSJulian Grajkowski if (SAL_SERVICE_TYPE_COMPRESSION != gen_handle->type) {
159678ee8d1cSJulian Grajkowski QAT_UTILS_LOG("Instance handle type is incorrect.\n");
159778ee8d1cSJulian Grajkowski return CPA_STATUS_FAIL;
159878ee8d1cSJulian Grajkowski }
159978ee8d1cSJulian Grajkowski
160078ee8d1cSJulian Grajkowski /*
160178ee8d1cSJulian Grajkowski * From the instanceHandle we must get the trans_handle and send
160278ee8d1cSJulian Grajkowski * down to adf for polling.
160378ee8d1cSJulian Grajkowski * Populate our trans handle table with the appropriate handles.
160478ee8d1cSJulian Grajkowski */
160578ee8d1cSJulian Grajkowski trans_hndTable[0] = dc_handle->trans_handle_compression_rx;
160678ee8d1cSJulian Grajkowski
160778ee8d1cSJulian Grajkowski /* Call adf to do the polling. */
160878ee8d1cSJulian Grajkowski status = icp_adf_pollInstance(trans_hndTable,
160978ee8d1cSJulian Grajkowski DC_NUM_RX_RINGS,
161078ee8d1cSJulian Grajkowski response_quota);
161178ee8d1cSJulian Grajkowski return status;
161278ee8d1cSJulian Grajkowski }
161378ee8d1cSJulian Grajkowski
161478ee8d1cSJulian Grajkowski /**
161578ee8d1cSJulian Grajkowski ******************************************************************************
161678ee8d1cSJulian Grajkowski * @ingroup cpaDcCommon
161778ee8d1cSJulian Grajkowski *****************************************************************************/
161878ee8d1cSJulian Grajkowski CpaStatus
cpaDcInstanceSetNotificationCb(const CpaInstanceHandle instanceHandle,const CpaDcInstanceNotificationCbFunc pInstanceNotificationCb,void * pCallbackTag)161978ee8d1cSJulian Grajkowski cpaDcInstanceSetNotificationCb(
162078ee8d1cSJulian Grajkowski const CpaInstanceHandle instanceHandle,
162178ee8d1cSJulian Grajkowski const CpaDcInstanceNotificationCbFunc pInstanceNotificationCb,
162278ee8d1cSJulian Grajkowski void *pCallbackTag)
162378ee8d1cSJulian Grajkowski {
162478ee8d1cSJulian Grajkowski CpaStatus status = CPA_STATUS_SUCCESS;
162578ee8d1cSJulian Grajkowski sal_service_t *gen_handle = instanceHandle;
162678ee8d1cSJulian Grajkowski
162778ee8d1cSJulian Grajkowski LAC_CHECK_NULL_PARAM(gen_handle);
162878ee8d1cSJulian Grajkowski gen_handle->notification_cb = pInstanceNotificationCb;
162978ee8d1cSJulian Grajkowski gen_handle->cb_tag = pCallbackTag;
163078ee8d1cSJulian Grajkowski return status;
163178ee8d1cSJulian Grajkowski }
163278ee8d1cSJulian Grajkowski
163378ee8d1cSJulian Grajkowski CpaInstanceHandle
dcGetFirstHandle(void)163478ee8d1cSJulian Grajkowski dcGetFirstHandle(void)
163578ee8d1cSJulian Grajkowski {
163678ee8d1cSJulian Grajkowski CpaStatus status = CPA_STATUS_SUCCESS;
163778ee8d1cSJulian Grajkowski static icp_accel_dev_t *adfInsts[ADF_MAX_DEVICES] = { 0 };
163878ee8d1cSJulian Grajkowski CpaInstanceHandle dcInst = NULL;
163978ee8d1cSJulian Grajkowski icp_accel_dev_t *dev_addr = NULL;
164078ee8d1cSJulian Grajkowski sal_t *base_addr = NULL;
164178ee8d1cSJulian Grajkowski sal_list_t *list_temp = NULL;
164278ee8d1cSJulian Grajkowski Cpa16U i, num_dc = 0;
164378ee8d1cSJulian Grajkowski
164478ee8d1cSJulian Grajkowski /* Only need 1 dev with compression enabled - so check all devices */
164578ee8d1cSJulian Grajkowski status = icp_amgr_getAllAccelDevByCapabilities(
164678ee8d1cSJulian Grajkowski ICP_ACCEL_CAPABILITIES_COMPRESSION, adfInsts, &num_dc);
164778ee8d1cSJulian Grajkowski if ((0 == num_dc) || (CPA_STATUS_SUCCESS != status)) {
164878ee8d1cSJulian Grajkowski QAT_UTILS_LOG(
164978ee8d1cSJulian Grajkowski "No compression devices enabled in the system.\n");
165078ee8d1cSJulian Grajkowski return dcInst;
165178ee8d1cSJulian Grajkowski }
165278ee8d1cSJulian Grajkowski
165378ee8d1cSJulian Grajkowski for (i = 0; i < num_dc; i++) {
165478ee8d1cSJulian Grajkowski dev_addr = (icp_accel_dev_t *)adfInsts[i];
165578ee8d1cSJulian Grajkowski if (NULL != dev_addr) {
165678ee8d1cSJulian Grajkowski base_addr = dev_addr->pSalHandle;
165778ee8d1cSJulian Grajkowski if (NULL != base_addr) {
165878ee8d1cSJulian Grajkowski list_temp = base_addr->compression_services;
165978ee8d1cSJulian Grajkowski if (NULL != list_temp) {
166078ee8d1cSJulian Grajkowski dcInst = SalList_getObject(list_temp);
166178ee8d1cSJulian Grajkowski break;
166278ee8d1cSJulian Grajkowski }
166378ee8d1cSJulian Grajkowski }
166478ee8d1cSJulian Grajkowski }
166578ee8d1cSJulian Grajkowski }
166678ee8d1cSJulian Grajkowski return dcInst;
166778ee8d1cSJulian Grajkowski }
1668