xref: /freebsd/sys/dev/qat/qat_api/common/ctrl/sal_compression.c (revision ded037e65e5239671b1292ec987a2e0894b217b5)
178ee8d1cSJulian Grajkowski /* SPDX-License-Identifier: BSD-3-Clause */
2*ded037e6SHareshx Sankar Raj /* Copyright(c) 2007-2025 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;
120266b0663SKrzysztof 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;
148266b0663SKrzysztof Zdziarski 		for (level = CPA_DC_L1; level <= CPA_DC_L12; level++) {
149266b0663SKrzysztof Zdziarski 			switch (level) {
150266b0663SKrzysztof Zdziarski 			case CPA_DC_L1:
151266b0663SKrzysztof Zdziarski 			case CPA_DC_L2:
152266b0663SKrzysztof Zdziarski 			case CPA_DC_L3:
153266b0663SKrzysztof Zdziarski 			case CPA_DC_L4:
154266b0663SKrzysztof Zdziarski 				pCompService->comp_device_data
155266b0663SKrzysztof Zdziarski 				    .uniqueCompressionLevels[level] = CPA_TRUE;
156266b0663SKrzysztof Zdziarski 				break;
157266b0663SKrzysztof Zdziarski 			default:
158266b0663SKrzysztof Zdziarski 				pCompService->comp_device_data
159266b0663SKrzysztof Zdziarski 				    .uniqueCompressionLevels[level] = CPA_FALSE;
160266b0663SKrzysztof Zdziarski 				break;
161266b0663SKrzysztof Zdziarski 			}
162266b0663SKrzysztof Zdziarski 		}
163266b0663SKrzysztof Zdziarski 		pCompService->comp_device_data.numCompressionLevels =
164266b0663SKrzysztof 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;
192266b0663SKrzysztof Zdziarski 
193266b0663SKrzysztof Zdziarski 		for (level = CPA_DC_L1; level <= CPA_DC_L12; level++) {
194266b0663SKrzysztof Zdziarski 			switch (level) {
195266b0663SKrzysztof Zdziarski 			case CPA_DC_L1:
196266b0663SKrzysztof Zdziarski 			case CPA_DC_L2:
197266b0663SKrzysztof Zdziarski 			case CPA_DC_L3:
198266b0663SKrzysztof Zdziarski 			case CPA_DC_L4:
199266b0663SKrzysztof Zdziarski 				pCompService->comp_device_data
200266b0663SKrzysztof Zdziarski 				    .uniqueCompressionLevels[level] = CPA_TRUE;
201266b0663SKrzysztof Zdziarski 				break;
202266b0663SKrzysztof Zdziarski 			default:
203266b0663SKrzysztof Zdziarski 				pCompService->comp_device_data
204266b0663SKrzysztof Zdziarski 				    .uniqueCompressionLevels[level] = CPA_FALSE;
205266b0663SKrzysztof Zdziarski 				break;
206266b0663SKrzysztof Zdziarski 			}
207266b0663SKrzysztof Zdziarski 		}
208266b0663SKrzysztof Zdziarski 		pCompService->comp_device_data.numCompressionLevels =
209266b0663SKrzysztof 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 
238266b0663SKrzysztof 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;
283266b0663SKrzysztof Zdziarski 
284266b0663SKrzysztof Zdziarski 		for (level = CPA_DC_L1; level <= CPA_DC_L12; level++) {
285266b0663SKrzysztof Zdziarski 			switch (level) {
286266b0663SKrzysztof Zdziarski 			case CPA_DC_L1:
287266b0663SKrzysztof Zdziarski 			case CPA_DC_L2:
288266b0663SKrzysztof Zdziarski 			case CPA_DC_L3:
289266b0663SKrzysztof Zdziarski 			case CPA_DC_L4:
290266b0663SKrzysztof Zdziarski 			case CPA_DC_L5:
291266b0663SKrzysztof Zdziarski 				pCompService->comp_device_data
292266b0663SKrzysztof Zdziarski 				    .uniqueCompressionLevels[level] = CPA_TRUE;
29378ee8d1cSJulian Grajkowski 				break;
294266b0663SKrzysztof Zdziarski 			default:
295266b0663SKrzysztof Zdziarski 				pCompService->comp_device_data
296266b0663SKrzysztof Zdziarski 				    .uniqueCompressionLevels[level] = CPA_FALSE;
297266b0663SKrzysztof Zdziarski 				break;
298266b0663SKrzysztof Zdziarski 			}
299266b0663SKrzysztof Zdziarski 		}
300266b0663SKrzysztof Zdziarski 		pCompService->comp_device_data.numCompressionLevels =
301266b0663SKrzysztof Zdziarski 		    DC_NUM_COMPRESSION_LEVELS;
302266b0663SKrzysztof Zdziarski 		break;
303266b0663SKrzysztof Zdziarski 	case DEVICE_4XXX:
304266b0663SKrzysztof 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);
326266b0663SKrzysztof 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 	if (CPA_FALSE == pCompressionService->generic_service_info.is_dyn) {
37578ee8d1cSJulian Grajkowski 		section = icpGetProcessName();
37678ee8d1cSJulian Grajkowski 	}
37778ee8d1cSJulian Grajkowski 
37878ee8d1cSJulian Grajkowski 	if (pStatsCollection == NULL) {
37978ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
38078ee8d1cSJulian Grajkowski 	}
38178ee8d1cSJulian Grajkowski 
38278ee8d1cSJulian Grajkowski 	/* Get Config Info: Accel Num, bank Num, packageID,
38378ee8d1cSJulian Grajkowski 				    coreAffinity, nodeAffinity and response mode
38478ee8d1cSJulian Grajkowski 	   */
38578ee8d1cSJulian Grajkowski 
38678ee8d1cSJulian Grajkowski 	pCompressionService->acceleratorNum = 0;
38778ee8d1cSJulian Grajkowski 
38878ee8d1cSJulian Grajkowski 	/* Initialise device specific compression data */
38978ee8d1cSJulian Grajkowski 	SalCtrl_CompressionInit_CompData(device, pCompressionService);
39078ee8d1cSJulian Grajkowski 
39178ee8d1cSJulian Grajkowski 	status = Sal_StringParsing(
39278ee8d1cSJulian Grajkowski 	    "Dc",
39378ee8d1cSJulian Grajkowski 	    pCompressionService->generic_service_info.instance,
39478ee8d1cSJulian Grajkowski 	    "BankNumber",
39578ee8d1cSJulian Grajkowski 	    temp_string);
39678ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
39778ee8d1cSJulian Grajkowski 	status =
39878ee8d1cSJulian Grajkowski 	    icp_adf_cfgGetParamValue(device, section, temp_string, adfGetParam);
39978ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
40078ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Failed to get %s from configuration.\n",
40178ee8d1cSJulian Grajkowski 			      temp_string);
40278ee8d1cSJulian Grajkowski 		return status;
40378ee8d1cSJulian Grajkowski 	}
40478ee8d1cSJulian Grajkowski 
40578ee8d1cSJulian Grajkowski 	pCompressionService->bankNum =
40678ee8d1cSJulian Grajkowski 	    Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC);
40778ee8d1cSJulian Grajkowski 
40878ee8d1cSJulian Grajkowski 	status = Sal_StringParsing(
40978ee8d1cSJulian Grajkowski 	    "Dc",
41078ee8d1cSJulian Grajkowski 	    pCompressionService->generic_service_info.instance,
41178ee8d1cSJulian Grajkowski 	    "IsPolled",
41278ee8d1cSJulian Grajkowski 	    temp_string);
41378ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
41478ee8d1cSJulian Grajkowski 	status =
41578ee8d1cSJulian Grajkowski 	    icp_adf_cfgGetParamValue(device, section, temp_string, adfGetParam);
41678ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
41778ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Failed to get %s from configuration.\n",
41878ee8d1cSJulian Grajkowski 			      temp_string);
41978ee8d1cSJulian Grajkowski 		return status;
42078ee8d1cSJulian Grajkowski 	}
42178ee8d1cSJulian Grajkowski 	pCompressionService->isPolled =
42278ee8d1cSJulian Grajkowski 	    (Cpa8U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC);
42378ee8d1cSJulian Grajkowski 
42478ee8d1cSJulian Grajkowski 	/* User instances only support poll and epoll mode */
42578ee8d1cSJulian Grajkowski 	if (SAL_RESP_POLL_CFG_FILE != pCompressionService->isPolled) {
42678ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG(
42778ee8d1cSJulian Grajkowski 		    "IsPolled %u is not supported for user instance %s.\n",
42878ee8d1cSJulian Grajkowski 		    pCompressionService->isPolled,
42978ee8d1cSJulian Grajkowski 		    temp_string);
43078ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
43178ee8d1cSJulian Grajkowski 	}
43278ee8d1cSJulian Grajkowski 
43378ee8d1cSJulian Grajkowski 	if (SAL_RESP_POLL_CFG_FILE == pCompressionService->isPolled) {
43478ee8d1cSJulian Grajkowski 		rx_resp_type = ICP_RESP_TYPE_POLL;
43578ee8d1cSJulian Grajkowski 	}
43678ee8d1cSJulian Grajkowski 
43778ee8d1cSJulian Grajkowski 	status = icp_adf_cfgGetParamValue(device,
43878ee8d1cSJulian Grajkowski 					  LAC_CFG_SECTION_GENERAL,
43978ee8d1cSJulian Grajkowski 					  ADF_DEV_PKG_ID,
44078ee8d1cSJulian Grajkowski 					  adfGetParam);
44178ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
44278ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Failed to get %s from configuration.\n",
44378ee8d1cSJulian Grajkowski 			      ADF_DEV_PKG_ID);
44478ee8d1cSJulian Grajkowski 		return status;
44578ee8d1cSJulian Grajkowski 	}
44678ee8d1cSJulian Grajkowski 	pCompressionService->pkgID =
44778ee8d1cSJulian Grajkowski 	    (Cpa16U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC);
44878ee8d1cSJulian Grajkowski 
44978ee8d1cSJulian Grajkowski 	status = icp_adf_cfgGetParamValue(device,
45078ee8d1cSJulian Grajkowski 					  LAC_CFG_SECTION_GENERAL,
45178ee8d1cSJulian Grajkowski 					  ADF_DEV_NODE_ID,
45278ee8d1cSJulian Grajkowski 					  adfGetParam);
45378ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
45478ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Failed to get %s from configuration.\n",
45578ee8d1cSJulian Grajkowski 			      ADF_DEV_NODE_ID);
45678ee8d1cSJulian Grajkowski 		return status;
45778ee8d1cSJulian Grajkowski 	}
45878ee8d1cSJulian Grajkowski 	pCompressionService->nodeAffinity =
45978ee8d1cSJulian Grajkowski 	    (Cpa32U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC);
46078ee8d1cSJulian Grajkowski 
46178ee8d1cSJulian Grajkowski 	/* In case of interrupt instance, use the bank affinity set by adf_ctl
46278ee8d1cSJulian Grajkowski 	 * Otherwise, use the instance affinity for backwards compatibility */
46378ee8d1cSJulian Grajkowski 	if (SAL_RESP_POLL_CFG_FILE != pCompressionService->isPolled) {
46478ee8d1cSJulian Grajkowski 		/* Next need to read the [AcceleratorX] section of the config
46578ee8d1cSJulian Grajkowski 		 * file */
46678ee8d1cSJulian Grajkowski 		status = Sal_StringParsing("Accelerator",
46778ee8d1cSJulian Grajkowski 					   pCompressionService->acceleratorNum,
46878ee8d1cSJulian Grajkowski 					   "",
46978ee8d1cSJulian Grajkowski 					   temp_string2);
47078ee8d1cSJulian Grajkowski 		LAC_CHECK_STATUS(status);
47178ee8d1cSJulian Grajkowski 
47278ee8d1cSJulian Grajkowski 		status = Sal_StringParsing("Bank",
47378ee8d1cSJulian Grajkowski 					   pCompressionService->bankNum,
47478ee8d1cSJulian Grajkowski 					   "CoreAffinity",
47578ee8d1cSJulian Grajkowski 					   temp_string);
47678ee8d1cSJulian Grajkowski 		LAC_CHECK_STATUS(status);
47778ee8d1cSJulian Grajkowski 	} else {
47878ee8d1cSJulian Grajkowski 		strncpy(temp_string2,
47978ee8d1cSJulian Grajkowski 			section,
48078ee8d1cSJulian Grajkowski 			sizeof(temp_string2) - SAL_NULL_TERM_SIZE);
48178ee8d1cSJulian Grajkowski 		temp_string2[SAL_CFG_MAX_VAL_LEN_IN_BYTES -
48278ee8d1cSJulian Grajkowski 			     SAL_NULL_TERM_SIZE] = '\0';
48378ee8d1cSJulian Grajkowski 
48478ee8d1cSJulian Grajkowski 		status = Sal_StringParsing(
48578ee8d1cSJulian Grajkowski 		    "Dc",
48678ee8d1cSJulian Grajkowski 		    pCompressionService->generic_service_info.instance,
48778ee8d1cSJulian Grajkowski 		    "CoreAffinity",
48878ee8d1cSJulian Grajkowski 		    temp_string);
48978ee8d1cSJulian Grajkowski 		LAC_CHECK_STATUS(status);
49078ee8d1cSJulian Grajkowski 	}
49178ee8d1cSJulian Grajkowski 
49278ee8d1cSJulian Grajkowski 	status = icp_adf_cfgGetParamValue(device,
49378ee8d1cSJulian Grajkowski 					  temp_string2,
49478ee8d1cSJulian Grajkowski 					  temp_string,
49578ee8d1cSJulian Grajkowski 					  adfGetParam);
49678ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
49778ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Failed to get %s from configuration.\n",
49878ee8d1cSJulian Grajkowski 			      temp_string);
49978ee8d1cSJulian Grajkowski 		return status;
50078ee8d1cSJulian Grajkowski 	}
50178ee8d1cSJulian Grajkowski 	pCompressionService->coreAffinity =
50278ee8d1cSJulian Grajkowski 	    (Cpa32U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC);
50378ee8d1cSJulian Grajkowski 
50478ee8d1cSJulian Grajkowski 	status = Sal_StringParsing(
50578ee8d1cSJulian Grajkowski 	    "Dc",
50678ee8d1cSJulian Grajkowski 	    pCompressionService->generic_service_info.instance,
50778ee8d1cSJulian Grajkowski 	    "NumConcurrentRequests",
50878ee8d1cSJulian Grajkowski 	    temp_string);
50978ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
51078ee8d1cSJulian Grajkowski 	status =
51178ee8d1cSJulian Grajkowski 	    icp_adf_cfgGetParamValue(device, section, temp_string, adfGetParam);
51278ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
51378ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Failed to get %s from configuration.\n",
51478ee8d1cSJulian Grajkowski 			      temp_string);
51578ee8d1cSJulian Grajkowski 		return status;
51678ee8d1cSJulian Grajkowski 	}
51778ee8d1cSJulian Grajkowski 
51878ee8d1cSJulian Grajkowski 	numCompConcurrentReq =
51978ee8d1cSJulian Grajkowski 	    (Cpa32U)Sal_Strtoul(adfGetParam, NULL, SAL_CFG_BASE_DEC);
52078ee8d1cSJulian Grajkowski 	if (validateConcurrRequest(numCompConcurrentReq)) {
52178ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG(
52278ee8d1cSJulian Grajkowski 		    "Invalid NumConcurrentRequests, valid values are: {64, 128, 256, ... 32768, 65536}.\n");
52378ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
52478ee8d1cSJulian Grajkowski 	}
52578ee8d1cSJulian Grajkowski 
52678ee8d1cSJulian Grajkowski 	/* ADF does not allow us to completely fill the ring for batch requests
52778ee8d1cSJulian Grajkowski 	 */
52878ee8d1cSJulian Grajkowski 	pCompressionService->maxNumCompConcurrentReq =
52978ee8d1cSJulian Grajkowski 	    (numCompConcurrentReq - SAL_BATCH_SUBMIT_FREE_SPACE);
53078ee8d1cSJulian Grajkowski 
53178ee8d1cSJulian Grajkowski 	/* 1. Create transport handles */
53278ee8d1cSJulian Grajkowski 	status = Sal_StringParsing(
53378ee8d1cSJulian Grajkowski 	    "Dc",
53478ee8d1cSJulian Grajkowski 	    pCompressionService->generic_service_info.instance,
53578ee8d1cSJulian Grajkowski 	    "RingTx",
53678ee8d1cSJulian Grajkowski 	    temp_string);
53778ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
53878ee8d1cSJulian Grajkowski 
53978ee8d1cSJulian Grajkowski 	msgSize = LAC_QAT_DC_REQ_SZ_LW * LAC_LONG_WORD_IN_BYTES;
54078ee8d1cSJulian Grajkowski 	status = icp_adf_transCreateHandle(
54178ee8d1cSJulian Grajkowski 	    device,
54278ee8d1cSJulian Grajkowski 	    ICP_TRANS_TYPE_ETR,
54378ee8d1cSJulian Grajkowski 	    section,
54478ee8d1cSJulian Grajkowski 	    pCompressionService->acceleratorNum,
54578ee8d1cSJulian Grajkowski 	    pCompressionService->bankNum,
54678ee8d1cSJulian Grajkowski 	    temp_string,
54778ee8d1cSJulian Grajkowski 	    lac_getRingType(SAL_RING_TYPE_DC),
54878ee8d1cSJulian Grajkowski 	    NULL,
54978ee8d1cSJulian Grajkowski 	    ICP_RESP_TYPE_NONE,
55078ee8d1cSJulian Grajkowski 	    numCompConcurrentReq,
55178ee8d1cSJulian Grajkowski 	    msgSize,
55278ee8d1cSJulian Grajkowski 	    (icp_comms_trans_handle *)&(
55378ee8d1cSJulian Grajkowski 		pCompressionService->trans_handle_compression_tx));
55478ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
55578ee8d1cSJulian Grajkowski 
55678ee8d1cSJulian Grajkowski 	if (icp_adf_transGetRingNum(
55778ee8d1cSJulian Grajkowski 		pCompressionService->trans_handle_compression_tx,
55878ee8d1cSJulian Grajkowski 		&request_ring_id) != CPA_STATUS_SUCCESS) {
55978ee8d1cSJulian Grajkowski 		icp_adf_transReleaseHandle(
56078ee8d1cSJulian Grajkowski 		    pCompressionService->trans_handle_compression_tx);
56178ee8d1cSJulian Grajkowski 
56278ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Failed to get DC TX ring number.\n");
56378ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
56478ee8d1cSJulian Grajkowski 	}
56578ee8d1cSJulian Grajkowski 
56678ee8d1cSJulian Grajkowski 	status = Sal_StringParsing(
56778ee8d1cSJulian Grajkowski 	    "Dc",
56878ee8d1cSJulian Grajkowski 	    pCompressionService->generic_service_info.instance,
56978ee8d1cSJulian Grajkowski 	    "RingRx",
57078ee8d1cSJulian Grajkowski 	    temp_string);
57178ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
57278ee8d1cSJulian Grajkowski 		icp_adf_transReleaseHandle(
57378ee8d1cSJulian Grajkowski 		    pCompressionService->trans_handle_compression_tx);
57478ee8d1cSJulian Grajkowski 		return status;
57578ee8d1cSJulian Grajkowski 	}
57678ee8d1cSJulian Grajkowski 
57778ee8d1cSJulian Grajkowski 	msgSize = LAC_QAT_DC_RESP_SZ_LW * LAC_LONG_WORD_IN_BYTES;
57878ee8d1cSJulian Grajkowski 	status = icp_adf_transCreateHandle(
57978ee8d1cSJulian Grajkowski 	    device,
58078ee8d1cSJulian Grajkowski 	    ICP_TRANS_TYPE_ETR,
58178ee8d1cSJulian Grajkowski 	    section,
58278ee8d1cSJulian Grajkowski 	    pCompressionService->acceleratorNum,
58378ee8d1cSJulian Grajkowski 	    pCompressionService->bankNum,
58478ee8d1cSJulian Grajkowski 	    temp_string,
58578ee8d1cSJulian Grajkowski 	    lac_getRingType(SAL_RING_TYPE_NONE),
58678ee8d1cSJulian Grajkowski 	    (icp_trans_callback)dcCompression_ProcessCallback,
58778ee8d1cSJulian Grajkowski 	    rx_resp_type,
58878ee8d1cSJulian Grajkowski 	    numCompConcurrentReq,
58978ee8d1cSJulian Grajkowski 	    msgSize,
59078ee8d1cSJulian Grajkowski 	    (icp_comms_trans_handle *)&(
59178ee8d1cSJulian Grajkowski 		pCompressionService->trans_handle_compression_rx));
59278ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
59378ee8d1cSJulian Grajkowski 		icp_adf_transReleaseHandle(
59478ee8d1cSJulian Grajkowski 		    pCompressionService->trans_handle_compression_tx);
59578ee8d1cSJulian Grajkowski 		return status;
59678ee8d1cSJulian Grajkowski 	}
59778ee8d1cSJulian Grajkowski 
59878ee8d1cSJulian Grajkowski 	if (icp_adf_transGetRingNum(
59978ee8d1cSJulian Grajkowski 		pCompressionService->trans_handle_compression_rx,
60078ee8d1cSJulian Grajkowski 		&response_ring_id) != CPA_STATUS_SUCCESS) {
60178ee8d1cSJulian Grajkowski 		icp_adf_transReleaseHandle(
60278ee8d1cSJulian Grajkowski 		    pCompressionService->trans_handle_compression_tx);
60378ee8d1cSJulian Grajkowski 
60478ee8d1cSJulian Grajkowski 		icp_adf_transReleaseHandle(
60578ee8d1cSJulian Grajkowski 		    pCompressionService->trans_handle_compression_rx);
60678ee8d1cSJulian Grajkowski 
60778ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Failed to get DC RX ring number.\n");
60878ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
60978ee8d1cSJulian Grajkowski 	}
61078ee8d1cSJulian Grajkowski 
61178ee8d1cSJulian Grajkowski 	/* 2. Allocates memory pools */
61278ee8d1cSJulian Grajkowski 
61378ee8d1cSJulian Grajkowski 	/* Valid initialisation value for a pool ID */
61478ee8d1cSJulian Grajkowski 	pCompressionService->compression_mem_pool = LAC_MEM_POOL_INIT_POOL_ID;
61578ee8d1cSJulian Grajkowski 
61678ee8d1cSJulian Grajkowski 	status = Sal_StringParsing(
61778ee8d1cSJulian Grajkowski 	    "Comp",
61878ee8d1cSJulian Grajkowski 	    pCompressionService->generic_service_info.instance,
61978ee8d1cSJulian Grajkowski 	    "_MemPool",
62078ee8d1cSJulian Grajkowski 	    compMemPool);
62178ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
62278ee8d1cSJulian Grajkowski 		icp_adf_transReleaseHandle(
62378ee8d1cSJulian Grajkowski 		    pCompressionService->trans_handle_compression_tx);
62478ee8d1cSJulian Grajkowski 
62578ee8d1cSJulian Grajkowski 		icp_adf_transReleaseHandle(
62678ee8d1cSJulian Grajkowski 		    pCompressionService->trans_handle_compression_rx);
62778ee8d1cSJulian Grajkowski 
62878ee8d1cSJulian Grajkowski 		return status;
62978ee8d1cSJulian Grajkowski 	}
63078ee8d1cSJulian Grajkowski 
63178ee8d1cSJulian Grajkowski 	status = Lac_MemPoolCreate(&pCompressionService->compression_mem_pool,
63278ee8d1cSJulian Grajkowski 				   compMemPool,
63378ee8d1cSJulian Grajkowski 				   (numCompConcurrentReq + 1),
63478ee8d1cSJulian Grajkowski 				   sizeof(dc_compression_cookie_t),
63578ee8d1cSJulian Grajkowski 				   LAC_64BYTE_ALIGNMENT,
63678ee8d1cSJulian Grajkowski 				   CPA_FALSE,
63778ee8d1cSJulian Grajkowski 				   pCompressionService->nodeAffinity);
63878ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
63978ee8d1cSJulian Grajkowski 		icp_adf_transReleaseHandle(
64078ee8d1cSJulian Grajkowski 		    pCompressionService->trans_handle_compression_tx);
64178ee8d1cSJulian Grajkowski 
64278ee8d1cSJulian Grajkowski 		icp_adf_transReleaseHandle(
64378ee8d1cSJulian Grajkowski 		    pCompressionService->trans_handle_compression_rx);
64478ee8d1cSJulian Grajkowski 
64578ee8d1cSJulian Grajkowski 		return status;
64678ee8d1cSJulian Grajkowski 	}
64778ee8d1cSJulian Grajkowski 
64878ee8d1cSJulian Grajkowski 	/* Init compression statistics */
64978ee8d1cSJulian Grajkowski 	status = dcStatsInit(pCompressionService);
65078ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
65178ee8d1cSJulian Grajkowski 		Lac_MemPoolDestroy(pCompressionService->compression_mem_pool);
65278ee8d1cSJulian Grajkowski 
65378ee8d1cSJulian Grajkowski 		icp_adf_transReleaseHandle(
65478ee8d1cSJulian Grajkowski 		    pCompressionService->trans_handle_compression_tx);
65578ee8d1cSJulian Grajkowski 
65678ee8d1cSJulian Grajkowski 		icp_adf_transReleaseHandle(
65778ee8d1cSJulian Grajkowski 		    pCompressionService->trans_handle_compression_rx);
65878ee8d1cSJulian Grajkowski 
65978ee8d1cSJulian Grajkowski 		return status;
66078ee8d1cSJulian Grajkowski 	}
66178ee8d1cSJulian Grajkowski 	if (CPA_TRUE == pStatsCollection->bDcStatsEnabled) {
66278ee8d1cSJulian Grajkowski 		/* Get instance name for stats */
66378ee8d1cSJulian Grajkowski 		instance_name = LAC_OS_MALLOC(ADF_CFG_MAX_VAL_LEN_IN_BYTES);
66478ee8d1cSJulian Grajkowski 		if (NULL == instance_name) {
66578ee8d1cSJulian Grajkowski 			Lac_MemPoolDestroy(
66678ee8d1cSJulian Grajkowski 			    pCompressionService->compression_mem_pool);
66778ee8d1cSJulian Grajkowski 
66878ee8d1cSJulian Grajkowski 			icp_adf_transReleaseHandle(
66978ee8d1cSJulian Grajkowski 			    pCompressionService->trans_handle_compression_tx);
67078ee8d1cSJulian Grajkowski 
67178ee8d1cSJulian Grajkowski 			icp_adf_transReleaseHandle(
67278ee8d1cSJulian Grajkowski 			    pCompressionService->trans_handle_compression_rx);
67378ee8d1cSJulian Grajkowski 
67478ee8d1cSJulian Grajkowski 			return CPA_STATUS_RESOURCE;
67578ee8d1cSJulian Grajkowski 		}
67678ee8d1cSJulian Grajkowski 
67778ee8d1cSJulian Grajkowski 		status = Sal_StringParsing(
67878ee8d1cSJulian Grajkowski 		    "Dc",
67978ee8d1cSJulian Grajkowski 		    pCompressionService->generic_service_info.instance,
68078ee8d1cSJulian Grajkowski 		    "Name",
68178ee8d1cSJulian Grajkowski 		    temp_string);
68278ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != status) {
68378ee8d1cSJulian Grajkowski 			Lac_MemPoolDestroy(
68478ee8d1cSJulian Grajkowski 			    pCompressionService->compression_mem_pool);
68578ee8d1cSJulian Grajkowski 
68678ee8d1cSJulian Grajkowski 			icp_adf_transReleaseHandle(
68778ee8d1cSJulian Grajkowski 			    pCompressionService->trans_handle_compression_tx);
68878ee8d1cSJulian Grajkowski 
68978ee8d1cSJulian Grajkowski 			icp_adf_transReleaseHandle(
69078ee8d1cSJulian Grajkowski 			    pCompressionService->trans_handle_compression_rx);
69178ee8d1cSJulian Grajkowski 			LAC_OS_FREE(instance_name);
69278ee8d1cSJulian Grajkowski 			return status;
69378ee8d1cSJulian Grajkowski 		}
69478ee8d1cSJulian Grajkowski 		status = icp_adf_cfgGetParamValue(device,
69578ee8d1cSJulian Grajkowski 						  section,
69678ee8d1cSJulian Grajkowski 						  temp_string,
69778ee8d1cSJulian Grajkowski 						  adfGetParam);
69878ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != status) {
69978ee8d1cSJulian Grajkowski 			QAT_UTILS_LOG("Failed to get %s from configuration.\n",
70078ee8d1cSJulian Grajkowski 				      temp_string);
70178ee8d1cSJulian Grajkowski 
70278ee8d1cSJulian Grajkowski 			Lac_MemPoolDestroy(
70378ee8d1cSJulian Grajkowski 			    pCompressionService->compression_mem_pool);
70478ee8d1cSJulian Grajkowski 
70578ee8d1cSJulian Grajkowski 			icp_adf_transReleaseHandle(
70678ee8d1cSJulian Grajkowski 			    pCompressionService->trans_handle_compression_tx);
70778ee8d1cSJulian Grajkowski 
70878ee8d1cSJulian Grajkowski 			icp_adf_transReleaseHandle(
70978ee8d1cSJulian Grajkowski 			    pCompressionService->trans_handle_compression_rx);
71078ee8d1cSJulian Grajkowski 			LAC_OS_FREE(instance_name);
71178ee8d1cSJulian Grajkowski 			return status;
71278ee8d1cSJulian Grajkowski 		}
71378ee8d1cSJulian Grajkowski 
71478ee8d1cSJulian Grajkowski 		snprintf(instance_name,
71578ee8d1cSJulian Grajkowski 			 ADF_CFG_MAX_VAL_LEN_IN_BYTES,
71678ee8d1cSJulian Grajkowski 			 "%s",
71778ee8d1cSJulian Grajkowski 			 adfGetParam);
71878ee8d1cSJulian Grajkowski 
71978ee8d1cSJulian Grajkowski 		pCompressionService->debug_file =
72078ee8d1cSJulian Grajkowski 		    LAC_OS_MALLOC(sizeof(debug_file_info_t));
72178ee8d1cSJulian Grajkowski 		if (NULL == pCompressionService->debug_file) {
72278ee8d1cSJulian Grajkowski 			Lac_MemPoolDestroy(
72378ee8d1cSJulian Grajkowski 			    pCompressionService->compression_mem_pool);
72478ee8d1cSJulian Grajkowski 
72578ee8d1cSJulian Grajkowski 			icp_adf_transReleaseHandle(
72678ee8d1cSJulian Grajkowski 			    pCompressionService->trans_handle_compression_tx);
72778ee8d1cSJulian Grajkowski 
72878ee8d1cSJulian Grajkowski 			icp_adf_transReleaseHandle(
72978ee8d1cSJulian Grajkowski 			    pCompressionService->trans_handle_compression_rx);
73078ee8d1cSJulian Grajkowski 			LAC_OS_FREE(instance_name);
73178ee8d1cSJulian Grajkowski 			return CPA_STATUS_RESOURCE;
73278ee8d1cSJulian Grajkowski 		}
73378ee8d1cSJulian Grajkowski 
73478ee8d1cSJulian Grajkowski 		memset(pCompressionService->debug_file,
73578ee8d1cSJulian Grajkowski 		       0,
73678ee8d1cSJulian Grajkowski 		       sizeof(debug_file_info_t));
73778ee8d1cSJulian Grajkowski 		pCompressionService->debug_file->name = instance_name;
73878ee8d1cSJulian Grajkowski 		pCompressionService->debug_file->seq_read =
73978ee8d1cSJulian Grajkowski 		    SalCtrl_CompresionDebug;
74078ee8d1cSJulian Grajkowski 		pCompressionService->debug_file->private_data =
74178ee8d1cSJulian Grajkowski 		    pCompressionService;
74278ee8d1cSJulian Grajkowski 		pCompressionService->debug_file->parent =
74378ee8d1cSJulian Grajkowski 		    pCompressionService->generic_service_info.debug_parent_dir;
74478ee8d1cSJulian Grajkowski 
74578ee8d1cSJulian Grajkowski 		status = icp_adf_debugAddFile(device,
74678ee8d1cSJulian Grajkowski 					      pCompressionService->debug_file);
74778ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != status) {
74878ee8d1cSJulian Grajkowski 			Lac_MemPoolDestroy(
74978ee8d1cSJulian Grajkowski 			    pCompressionService->compression_mem_pool);
75078ee8d1cSJulian Grajkowski 
75178ee8d1cSJulian Grajkowski 			icp_adf_transReleaseHandle(
75278ee8d1cSJulian Grajkowski 			    pCompressionService->trans_handle_compression_tx);
75378ee8d1cSJulian Grajkowski 
75478ee8d1cSJulian Grajkowski 			icp_adf_transReleaseHandle(
75578ee8d1cSJulian Grajkowski 			    pCompressionService->trans_handle_compression_rx);
75678ee8d1cSJulian Grajkowski 			LAC_OS_FREE(instance_name);
75778ee8d1cSJulian Grajkowski 			LAC_OS_FREE(pCompressionService->debug_file);
75878ee8d1cSJulian Grajkowski 			return status;
75978ee8d1cSJulian Grajkowski 		}
76078ee8d1cSJulian Grajkowski 	}
76178ee8d1cSJulian Grajkowski 	pCompressionService->generic_service_info.stats = pStatsCollection;
76278ee8d1cSJulian Grajkowski 	pCompressionService->generic_service_info.state =
76378ee8d1cSJulian Grajkowski 	    SAL_SERVICE_STATE_INITIALIZED;
76478ee8d1cSJulian Grajkowski 
76578ee8d1cSJulian Grajkowski 	return status;
76678ee8d1cSJulian Grajkowski }
76778ee8d1cSJulian Grajkowski 
76878ee8d1cSJulian Grajkowski CpaStatus
SalCtrl_CompressionStart(icp_accel_dev_t * device,sal_service_t * service)76978ee8d1cSJulian Grajkowski SalCtrl_CompressionStart(icp_accel_dev_t *device, sal_service_t *service)
77078ee8d1cSJulian Grajkowski {
77178ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
77278ee8d1cSJulian Grajkowski 
77378ee8d1cSJulian Grajkowski 	sal_compression_service_t *pCompressionService =
77478ee8d1cSJulian Grajkowski 	    (sal_compression_service_t *)service;
77578ee8d1cSJulian Grajkowski 
77678ee8d1cSJulian Grajkowski 	if (SAL_SERVICE_STATE_INITIALIZED !=
77778ee8d1cSJulian Grajkowski 	    pCompressionService->generic_service_info.state) {
77878ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Not in the correct state to call start.\n");
77978ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
78078ee8d1cSJulian Grajkowski 	}
78178ee8d1cSJulian Grajkowski 	/**************************************************************/
78278ee8d1cSJulian Grajkowski 	/* Obtain Extended Features. I.e. Compress And Verify         */
78378ee8d1cSJulian Grajkowski 	/**************************************************************/
78478ee8d1cSJulian Grajkowski 	pCompressionService->generic_service_info.dcExtendedFeatures =
78578ee8d1cSJulian Grajkowski 	    device->dcExtendedFeatures;
78678ee8d1cSJulian Grajkowski 	pCompressionService->generic_service_info.state =
78778ee8d1cSJulian Grajkowski 	    SAL_SERVICE_STATE_RUNNING;
78878ee8d1cSJulian Grajkowski 
78978ee8d1cSJulian Grajkowski 	return status;
79078ee8d1cSJulian Grajkowski }
79178ee8d1cSJulian Grajkowski 
79278ee8d1cSJulian Grajkowski CpaStatus
SalCtrl_CompressionStop(icp_accel_dev_t * device,sal_service_t * service)79378ee8d1cSJulian Grajkowski SalCtrl_CompressionStop(icp_accel_dev_t *device, sal_service_t *service)
79478ee8d1cSJulian Grajkowski {
79578ee8d1cSJulian Grajkowski 	sal_compression_service_t *pCompressionService =
79678ee8d1cSJulian Grajkowski 	    (sal_compression_service_t *)service;
79778ee8d1cSJulian Grajkowski 
79878ee8d1cSJulian Grajkowski 	if (SAL_SERVICE_STATE_RUNNING !=
79978ee8d1cSJulian Grajkowski 	    pCompressionService->generic_service_info.state) {
80078ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Not in the correct state to call stop.\n");
80178ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
80278ee8d1cSJulian Grajkowski 	}
80378ee8d1cSJulian Grajkowski 
80478ee8d1cSJulian Grajkowski 	if (icp_adf_is_dev_in_reset(device)) {
80578ee8d1cSJulian Grajkowski 		pCompressionService->generic_service_info.state =
80678ee8d1cSJulian Grajkowski 		    SAL_SERVICE_STATE_RESTARTING;
80778ee8d1cSJulian Grajkowski 		return CPA_STATUS_SUCCESS;
80878ee8d1cSJulian Grajkowski 	}
80978ee8d1cSJulian Grajkowski 
81078ee8d1cSJulian Grajkowski 	pCompressionService->generic_service_info.state =
81178ee8d1cSJulian Grajkowski 	    SAL_SERVICE_STATE_SHUTTING_DOWN;
81278ee8d1cSJulian Grajkowski 	return CPA_STATUS_RETRY;
81378ee8d1cSJulian Grajkowski }
81478ee8d1cSJulian Grajkowski 
81578ee8d1cSJulian Grajkowski CpaStatus
SalCtrl_CompressionShutdown(icp_accel_dev_t * device,sal_service_t * service)81678ee8d1cSJulian Grajkowski SalCtrl_CompressionShutdown(icp_accel_dev_t *device, sal_service_t *service)
81778ee8d1cSJulian Grajkowski {
81878ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
81978ee8d1cSJulian Grajkowski 
82078ee8d1cSJulian Grajkowski 	sal_compression_service_t *pCompressionService =
82178ee8d1cSJulian Grajkowski 	    (sal_compression_service_t *)service;
82278ee8d1cSJulian Grajkowski 	sal_statistics_collection_t *pStatsCollection =
82378ee8d1cSJulian Grajkowski 	    (sal_statistics_collection_t *)device->pQatStats;
82478ee8d1cSJulian Grajkowski 
82578ee8d1cSJulian Grajkowski 	if ((SAL_SERVICE_STATE_INITIALIZED !=
82678ee8d1cSJulian Grajkowski 	     pCompressionService->generic_service_info.state) &&
82778ee8d1cSJulian Grajkowski 	    (SAL_SERVICE_STATE_SHUTTING_DOWN !=
82878ee8d1cSJulian Grajkowski 	     pCompressionService->generic_service_info.state) &&
82978ee8d1cSJulian Grajkowski 	    (SAL_SERVICE_STATE_RESTARTING !=
83078ee8d1cSJulian Grajkowski 	     pCompressionService->generic_service_info.state)) {
83178ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Not in the correct state to call shutdown.\n");
83278ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
83378ee8d1cSJulian Grajkowski 	}
83478ee8d1cSJulian Grajkowski 
83578ee8d1cSJulian Grajkowski 	Lac_MemPoolDestroy(pCompressionService->compression_mem_pool);
83678ee8d1cSJulian Grajkowski 
83778ee8d1cSJulian Grajkowski 	status = icp_adf_transReleaseHandle(
83878ee8d1cSJulian Grajkowski 	    pCompressionService->trans_handle_compression_tx);
83978ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
84078ee8d1cSJulian Grajkowski 
84178ee8d1cSJulian Grajkowski 	status = icp_adf_transReleaseHandle(
84278ee8d1cSJulian Grajkowski 	    pCompressionService->trans_handle_compression_rx);
84378ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
84478ee8d1cSJulian Grajkowski 
84578ee8d1cSJulian Grajkowski 	if (CPA_TRUE == pStatsCollection->bDcStatsEnabled) {
84678ee8d1cSJulian Grajkowski 		/* Clean stats */
84778ee8d1cSJulian Grajkowski 		if (NULL != pCompressionService->debug_file) {
84878ee8d1cSJulian Grajkowski 			icp_adf_debugRemoveFile(
84978ee8d1cSJulian Grajkowski 			    pCompressionService->debug_file);
85078ee8d1cSJulian Grajkowski 			LAC_OS_FREE(pCompressionService->debug_file->name);
85178ee8d1cSJulian Grajkowski 			LAC_OS_FREE(pCompressionService->debug_file);
85278ee8d1cSJulian Grajkowski 			pCompressionService->debug_file = NULL;
85378ee8d1cSJulian Grajkowski 		}
85478ee8d1cSJulian Grajkowski 	}
85578ee8d1cSJulian Grajkowski 	pCompressionService->generic_service_info.stats = NULL;
85678ee8d1cSJulian Grajkowski 	dcStatsFree(pCompressionService);
85778ee8d1cSJulian Grajkowski 
85878ee8d1cSJulian Grajkowski 	if (icp_adf_is_dev_in_reset(device)) {
85978ee8d1cSJulian Grajkowski 		pCompressionService->generic_service_info.state =
86078ee8d1cSJulian Grajkowski 		    SAL_SERVICE_STATE_RESTARTING;
86178ee8d1cSJulian Grajkowski 		return CPA_STATUS_SUCCESS;
86278ee8d1cSJulian Grajkowski 	}
86378ee8d1cSJulian Grajkowski 	pCompressionService->generic_service_info.state =
86478ee8d1cSJulian Grajkowski 	    SAL_SERVICE_STATE_SHUTDOWN;
86578ee8d1cSJulian Grajkowski 	return status;
86678ee8d1cSJulian Grajkowski }
86778ee8d1cSJulian Grajkowski 
86878ee8d1cSJulian Grajkowski CpaStatus
cpaDcGetStatusText(const CpaInstanceHandle dcInstance,const CpaStatus errStatus,Cpa8S * pStatusText)86978ee8d1cSJulian Grajkowski cpaDcGetStatusText(const CpaInstanceHandle dcInstance,
87078ee8d1cSJulian Grajkowski 		   const CpaStatus errStatus,
87178ee8d1cSJulian Grajkowski 		   Cpa8S *pStatusText)
87278ee8d1cSJulian Grajkowski {
87378ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
87478ee8d1cSJulian Grajkowski 
87578ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pStatusText);
87678ee8d1cSJulian Grajkowski 
87778ee8d1cSJulian Grajkowski 	switch (errStatus) {
87878ee8d1cSJulian Grajkowski 	case CPA_STATUS_SUCCESS:
87978ee8d1cSJulian Grajkowski 		LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_SUCCESS);
88078ee8d1cSJulian Grajkowski 		break;
88178ee8d1cSJulian Grajkowski 	case CPA_STATUS_FAIL:
88278ee8d1cSJulian Grajkowski 		LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_FAIL);
88378ee8d1cSJulian Grajkowski 		break;
88478ee8d1cSJulian Grajkowski 	case CPA_STATUS_RETRY:
88578ee8d1cSJulian Grajkowski 		LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_RETRY);
88678ee8d1cSJulian Grajkowski 		break;
88778ee8d1cSJulian Grajkowski 	case CPA_STATUS_RESOURCE:
88878ee8d1cSJulian Grajkowski 		LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_RESOURCE);
88978ee8d1cSJulian Grajkowski 		break;
89078ee8d1cSJulian Grajkowski 	case CPA_STATUS_INVALID_PARAM:
89178ee8d1cSJulian Grajkowski 		LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_INVALID_PARAM);
89278ee8d1cSJulian Grajkowski 		break;
89378ee8d1cSJulian Grajkowski 	case CPA_STATUS_FATAL:
89478ee8d1cSJulian Grajkowski 		LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_FATAL);
89578ee8d1cSJulian Grajkowski 		break;
89678ee8d1cSJulian Grajkowski 	case CPA_STATUS_UNSUPPORTED:
89778ee8d1cSJulian Grajkowski 		LAC_COPY_STRING(pStatusText, CPA_STATUS_STR_UNSUPPORTED);
89878ee8d1cSJulian Grajkowski 		break;
89978ee8d1cSJulian Grajkowski 	default:
90078ee8d1cSJulian Grajkowski 		status = CPA_STATUS_INVALID_PARAM;
90178ee8d1cSJulian Grajkowski 		break;
90278ee8d1cSJulian Grajkowski 	}
90378ee8d1cSJulian Grajkowski 
90478ee8d1cSJulian Grajkowski 	return status;
90578ee8d1cSJulian Grajkowski }
90678ee8d1cSJulian Grajkowski 
90778ee8d1cSJulian Grajkowski CpaStatus
cpaDcGetNumIntermediateBuffers(CpaInstanceHandle dcInstance,Cpa16U * pNumBuffers)90878ee8d1cSJulian Grajkowski cpaDcGetNumIntermediateBuffers(CpaInstanceHandle dcInstance,
90978ee8d1cSJulian Grajkowski 			       Cpa16U *pNumBuffers)
91078ee8d1cSJulian Grajkowski {
91178ee8d1cSJulian Grajkowski 	CpaInstanceHandle insHandle = NULL;
91278ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
91378ee8d1cSJulian Grajkowski 
91478ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == dcInstance) {
91578ee8d1cSJulian Grajkowski 		insHandle = dcGetFirstHandle();
91678ee8d1cSJulian Grajkowski 	} else {
91778ee8d1cSJulian Grajkowski 		insHandle = dcInstance;
91878ee8d1cSJulian Grajkowski 	}
91978ee8d1cSJulian Grajkowski 
92078ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(insHandle);
92178ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pNumBuffers);
92278ee8d1cSJulian Grajkowski 
92378ee8d1cSJulian Grajkowski 	pService = (sal_compression_service_t *)insHandle;
92478ee8d1cSJulian Grajkowski 	*pNumBuffers = pService->numInterBuffs;
92578ee8d1cSJulian Grajkowski 
92678ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
92778ee8d1cSJulian Grajkowski }
92878ee8d1cSJulian Grajkowski 
92978ee8d1cSJulian Grajkowski CpaStatus
cpaDcStartInstance(CpaInstanceHandle instanceHandle,Cpa16U numBuffers,CpaBufferList ** pIntermediateBufferPtrsArray)93078ee8d1cSJulian Grajkowski cpaDcStartInstance(CpaInstanceHandle instanceHandle,
93178ee8d1cSJulian Grajkowski 		   Cpa16U numBuffers,
93278ee8d1cSJulian Grajkowski 		   CpaBufferList **pIntermediateBufferPtrsArray)
93378ee8d1cSJulian Grajkowski {
93478ee8d1cSJulian Grajkowski 	icp_qat_addr_width_t *pInterBuffPtrsArray = NULL;
93578ee8d1cSJulian Grajkowski 	icp_qat_addr_width_t pArrayBufferListDescPhyAddr = 0;
93678ee8d1cSJulian Grajkowski 	icp_qat_addr_width_t bufListDescPhyAddr;
93778ee8d1cSJulian Grajkowski 	icp_qat_addr_width_t bufListAlignedPhyAddr;
93878ee8d1cSJulian Grajkowski 	CpaFlatBuffer *pClientCurrFlatBuffer = NULL;
93978ee8d1cSJulian Grajkowski 	icp_buffer_list_desc_t *pBufferListDesc = NULL;
94078ee8d1cSJulian Grajkowski 	icp_flat_buffer_desc_t *pCurrFlatBufDesc = NULL;
94178ee8d1cSJulian Grajkowski 	CpaInstanceInfo2 info = { 0 };
94278ee8d1cSJulian Grajkowski 	icp_accel_dev_t *dev = NULL;
94378ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
94478ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
94578ee8d1cSJulian Grajkowski 	CpaInstanceHandle insHandle = NULL;
94678ee8d1cSJulian Grajkowski 	Cpa16U bufferIndex = 0;
94778ee8d1cSJulian Grajkowski 	Cpa32U numFlatBuffers = 0;
94878ee8d1cSJulian Grajkowski 	Cpa64U clientListSize = 0;
94978ee8d1cSJulian Grajkowski 	CpaBufferList *pClientCurrentIntermediateBuffer = NULL;
95078ee8d1cSJulian Grajkowski 	Cpa32U bufferIndex2 = 0;
95178ee8d1cSJulian Grajkowski 	CpaBufferList **pTempIntermediateBufferPtrsArray;
95278ee8d1cSJulian Grajkowski 	Cpa64U lastClientListSize = 0;
95378ee8d1cSJulian Grajkowski 
95478ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle) {
95578ee8d1cSJulian Grajkowski 		insHandle = dcGetFirstHandle();
95678ee8d1cSJulian Grajkowski 	} else {
95778ee8d1cSJulian Grajkowski 		insHandle = instanceHandle;
95878ee8d1cSJulian Grajkowski 	}
95978ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(insHandle);
96078ee8d1cSJulian Grajkowski 
96178ee8d1cSJulian Grajkowski 	status = cpaDcInstanceGetInfo2(insHandle, &info);
96278ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
96378ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Can not get instance info.\n");
96478ee8d1cSJulian Grajkowski 		return status;
96578ee8d1cSJulian Grajkowski 	}
96678ee8d1cSJulian Grajkowski 
96778ee8d1cSJulian Grajkowski 	dev = icp_adf_getAccelDevByAccelId(info.physInstId.packageId);
96878ee8d1cSJulian Grajkowski 	if (NULL == dev) {
96978ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Can not find device for the instance\n");
97078ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
97178ee8d1cSJulian Grajkowski 	}
97278ee8d1cSJulian Grajkowski 
97378ee8d1cSJulian Grajkowski 	if (NULL == pIntermediateBufferPtrsArray) {
97478ee8d1cSJulian Grajkowski 		/* Increment dev ref counter and return - DRAM is not used */
97578ee8d1cSJulian Grajkowski 		icp_qa_dev_get(dev);
97678ee8d1cSJulian Grajkowski 		return CPA_STATUS_SUCCESS;
97778ee8d1cSJulian Grajkowski 	}
97878ee8d1cSJulian Grajkowski 
97978ee8d1cSJulian Grajkowski 	if (0 == numBuffers) {
98078ee8d1cSJulian Grajkowski 		/* Increment dev ref counter and return - DRAM is not used */
98178ee8d1cSJulian Grajkowski 		icp_qa_dev_get(dev);
98278ee8d1cSJulian Grajkowski 		return CPA_STATUS_SUCCESS;
98378ee8d1cSJulian Grajkowski 	}
98478ee8d1cSJulian Grajkowski 
98578ee8d1cSJulian Grajkowski 	pService = (sal_compression_service_t *)insHandle;
98678ee8d1cSJulian Grajkowski 
98778ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(insHandle);
98878ee8d1cSJulian Grajkowski 
98978ee8d1cSJulian Grajkowski 	if ((numBuffers > 0) && (NULL == pIntermediateBufferPtrsArray)) {
99078ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Invalid Intermediate Buffers Array pointer\n");
99178ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
99278ee8d1cSJulian Grajkowski 	}
99378ee8d1cSJulian Grajkowski 
99478ee8d1cSJulian Grajkowski 	/* Check number of intermediate buffers allocated by user */
99578ee8d1cSJulian Grajkowski 	if ((pService->numInterBuffs != numBuffers)) {
99678ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Invalid number of buffers\n");
99778ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
99878ee8d1cSJulian Grajkowski 	}
99978ee8d1cSJulian Grajkowski 
100078ee8d1cSJulian Grajkowski 	pTempIntermediateBufferPtrsArray = pIntermediateBufferPtrsArray;
100178ee8d1cSJulian Grajkowski 	for (bufferIndex = 0; bufferIndex < numBuffers; bufferIndex++) {
100278ee8d1cSJulian Grajkowski 		if (NULL == *pTempIntermediateBufferPtrsArray) {
100378ee8d1cSJulian Grajkowski 			QAT_UTILS_LOG(
100478ee8d1cSJulian Grajkowski 			    "Intermediate Buffer - Invalid Buffer List pointer\n");
100578ee8d1cSJulian Grajkowski 			return CPA_STATUS_INVALID_PARAM;
100678ee8d1cSJulian Grajkowski 		}
100778ee8d1cSJulian Grajkowski 
100878ee8d1cSJulian Grajkowski 		if (NULL == (*pTempIntermediateBufferPtrsArray)->pBuffers) {
100978ee8d1cSJulian Grajkowski 			QAT_UTILS_LOG(
101078ee8d1cSJulian Grajkowski 			    "Intermediate Buffer - Invalid Flat Buffer descriptor pointer\n");
101178ee8d1cSJulian Grajkowski 			return CPA_STATUS_INVALID_PARAM;
101278ee8d1cSJulian Grajkowski 		}
101378ee8d1cSJulian Grajkowski 
101478ee8d1cSJulian Grajkowski 		if (NULL ==
101578ee8d1cSJulian Grajkowski 		    (*pTempIntermediateBufferPtrsArray)->pPrivateMetaData) {
101678ee8d1cSJulian Grajkowski 			QAT_UTILS_LOG(
101778ee8d1cSJulian Grajkowski 			    "Intermediate Buffer - Invalid Private MetaData descriptor pointer\n");
101878ee8d1cSJulian Grajkowski 			return CPA_STATUS_INVALID_PARAM;
101978ee8d1cSJulian Grajkowski 		}
102078ee8d1cSJulian Grajkowski 
102178ee8d1cSJulian Grajkowski 		clientListSize = 0;
102278ee8d1cSJulian Grajkowski 		for (bufferIndex2 = 0; bufferIndex2 <
102378ee8d1cSJulian Grajkowski 		     (*pTempIntermediateBufferPtrsArray)->numBuffers;
102478ee8d1cSJulian Grajkowski 		     bufferIndex2++) {
102578ee8d1cSJulian Grajkowski 
102678ee8d1cSJulian Grajkowski 			if ((0 !=
102778ee8d1cSJulian Grajkowski 			     (*pTempIntermediateBufferPtrsArray)
102878ee8d1cSJulian Grajkowski 				 ->pBuffers[bufferIndex2]
102978ee8d1cSJulian Grajkowski 				 .dataLenInBytes) &&
103078ee8d1cSJulian Grajkowski 			    NULL ==
103178ee8d1cSJulian Grajkowski 				(*pTempIntermediateBufferPtrsArray)
103278ee8d1cSJulian Grajkowski 				    ->pBuffers[bufferIndex2]
103378ee8d1cSJulian Grajkowski 				    .pData) {
103478ee8d1cSJulian Grajkowski 				QAT_UTILS_LOG(
103578ee8d1cSJulian Grajkowski 				    "Intermediate Buffer - Invalid Flat Buffer pointer\n");
103678ee8d1cSJulian Grajkowski 				return CPA_STATUS_INVALID_PARAM;
103778ee8d1cSJulian Grajkowski 			}
103878ee8d1cSJulian Grajkowski 
103978ee8d1cSJulian Grajkowski 			clientListSize += (*pTempIntermediateBufferPtrsArray)
104078ee8d1cSJulian Grajkowski 					      ->pBuffers[bufferIndex2]
104178ee8d1cSJulian Grajkowski 					      .dataLenInBytes;
104278ee8d1cSJulian Grajkowski 		}
104378ee8d1cSJulian Grajkowski 
104478ee8d1cSJulian Grajkowski 		if (bufferIndex != 0) {
104578ee8d1cSJulian Grajkowski 			if (lastClientListSize != clientListSize) {
104678ee8d1cSJulian Grajkowski 				QAT_UTILS_LOG(
104778ee8d1cSJulian Grajkowski 				    "SGLs have to be of the same size.\n");
104878ee8d1cSJulian Grajkowski 				return CPA_STATUS_INVALID_PARAM;
104978ee8d1cSJulian Grajkowski 			}
105078ee8d1cSJulian Grajkowski 		} else {
105178ee8d1cSJulian Grajkowski 			lastClientListSize = clientListSize;
105278ee8d1cSJulian Grajkowski 		}
105378ee8d1cSJulian Grajkowski 		pTempIntermediateBufferPtrsArray++;
105478ee8d1cSJulian Grajkowski 	}
105578ee8d1cSJulian Grajkowski 
105678ee8d1cSJulian Grajkowski 	/* Allocate array of physical pointers to icp_buffer_list_desc_t */
105778ee8d1cSJulian Grajkowski 	status = LAC_OS_CAMALLOC(&pInterBuffPtrsArray,
105878ee8d1cSJulian Grajkowski 				 (numBuffers * sizeof(icp_qat_addr_width_t)),
105978ee8d1cSJulian Grajkowski 				 LAC_64BYTE_ALIGNMENT,
106078ee8d1cSJulian Grajkowski 				 pService->nodeAffinity);
106178ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
106278ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Can not allocate Intermediate Buffers array.\n");
106378ee8d1cSJulian Grajkowski 		return status;
106478ee8d1cSJulian Grajkowski 	}
106578ee8d1cSJulian Grajkowski 
106678ee8d1cSJulian Grajkowski 	/* Get physical address of the intermediate buffer pointers array */
106778ee8d1cSJulian Grajkowski 	pArrayBufferListDescPhyAddr = LAC_MEM_CAST_PTR_TO_UINT64(
106878ee8d1cSJulian Grajkowski 	    LAC_OS_VIRT_TO_PHYS_INTERNAL(pInterBuffPtrsArray));
106978ee8d1cSJulian Grajkowski 
107078ee8d1cSJulian Grajkowski 	pService->pInterBuffPtrsArray = pInterBuffPtrsArray;
107178ee8d1cSJulian Grajkowski 	pService->pInterBuffPtrsArrayPhyAddr = pArrayBufferListDescPhyAddr;
107278ee8d1cSJulian Grajkowski 
107378ee8d1cSJulian Grajkowski 	/* Get the full size of the buffer list */
107478ee8d1cSJulian Grajkowski 	/* Assumption: all the SGLs allocated by the user have the same size */
107578ee8d1cSJulian Grajkowski 	clientListSize = 0;
107678ee8d1cSJulian Grajkowski 	for (bufferIndex = 0;
107778ee8d1cSJulian Grajkowski 	     bufferIndex < (*pIntermediateBufferPtrsArray)->numBuffers;
107878ee8d1cSJulian Grajkowski 	     bufferIndex++) {
107978ee8d1cSJulian Grajkowski 		clientListSize += ((*pIntermediateBufferPtrsArray)
108078ee8d1cSJulian Grajkowski 				       ->pBuffers[bufferIndex]
108178ee8d1cSJulian Grajkowski 				       .dataLenInBytes);
108278ee8d1cSJulian Grajkowski 	}
108378ee8d1cSJulian Grajkowski 	pService->minInterBuffSizeInBytes = clientListSize;
108478ee8d1cSJulian Grajkowski 
108578ee8d1cSJulian Grajkowski 	for (bufferIndex = 0; bufferIndex < numBuffers; bufferIndex++) {
108678ee8d1cSJulian Grajkowski 
108778ee8d1cSJulian Grajkowski 		/* Get pointer to the client Intermediate Buffer List
108878ee8d1cSJulian Grajkowski 		 * (CpaBufferList) */
108978ee8d1cSJulian Grajkowski 		pClientCurrentIntermediateBuffer =
109078ee8d1cSJulian Grajkowski 		    *pIntermediateBufferPtrsArray;
109178ee8d1cSJulian Grajkowski 
109278ee8d1cSJulian Grajkowski 		/* Get number of flat buffers in the buffer list */
109378ee8d1cSJulian Grajkowski 		numFlatBuffers = pClientCurrentIntermediateBuffer->numBuffers;
109478ee8d1cSJulian Grajkowski 
109578ee8d1cSJulian Grajkowski 		/* Get pointer to the client array of CpaFlatBuffers */
109678ee8d1cSJulian Grajkowski 		pClientCurrFlatBuffer =
109778ee8d1cSJulian Grajkowski 		    pClientCurrentIntermediateBuffer->pBuffers;
109878ee8d1cSJulian Grajkowski 
109978ee8d1cSJulian Grajkowski 		/* Calculate Physical address of current private SGL */
110078ee8d1cSJulian Grajkowski 		bufListDescPhyAddr = LAC_OS_VIRT_TO_PHYS_EXTERNAL(
110178ee8d1cSJulian Grajkowski 		    (*pService),
110278ee8d1cSJulian Grajkowski 		    pClientCurrentIntermediateBuffer->pPrivateMetaData);
110378ee8d1cSJulian Grajkowski 		if (bufListDescPhyAddr == 0) {
110478ee8d1cSJulian Grajkowski 			QAT_UTILS_LOG(
110578ee8d1cSJulian Grajkowski 			    "Unable to get the physical address of the metadata.\n");
110678ee8d1cSJulian Grajkowski 			return CPA_STATUS_FAIL;
110778ee8d1cSJulian Grajkowski 		}
110878ee8d1cSJulian Grajkowski 
110978ee8d1cSJulian Grajkowski 		/* Align SGL physical address */
111078ee8d1cSJulian Grajkowski 		bufListAlignedPhyAddr =
111178ee8d1cSJulian Grajkowski 		    LAC_ALIGN_POW2_ROUNDUP(bufListDescPhyAddr,
111278ee8d1cSJulian Grajkowski 					   ICP_DESCRIPTOR_ALIGNMENT_BYTES);
111378ee8d1cSJulian Grajkowski 
111478ee8d1cSJulian Grajkowski 		/* Set physical address of the Intermediate Buffer SGL in the
111578ee8d1cSJulian Grajkowski 		 * SGLs array
111678ee8d1cSJulian Grajkowski 		 */
111778ee8d1cSJulian Grajkowski 		*pInterBuffPtrsArray =
111878ee8d1cSJulian Grajkowski 		    LAC_MEM_CAST_PTR_TO_UINT64(bufListAlignedPhyAddr);
111978ee8d1cSJulian Grajkowski 
112078ee8d1cSJulian Grajkowski 		/* Calculate (virtual) offset to the buffer list descriptor */
112178ee8d1cSJulian Grajkowski 		pBufferListDesc =
112278ee8d1cSJulian Grajkowski 		    (icp_buffer_list_desc_t
112378ee8d1cSJulian Grajkowski 			 *)((LAC_ARCH_UINT)pClientCurrentIntermediateBuffer
112478ee8d1cSJulian Grajkowski 				->pPrivateMetaData +
112578ee8d1cSJulian Grajkowski 			    (LAC_ARCH_UINT)(bufListAlignedPhyAddr -
112678ee8d1cSJulian Grajkowski 					    bufListDescPhyAddr));
112778ee8d1cSJulian Grajkowski 
112878ee8d1cSJulian Grajkowski 		/* Set number of flat buffers in the physical Buffer List
112978ee8d1cSJulian Grajkowski 		 * descriptor */
113078ee8d1cSJulian Grajkowski 		pBufferListDesc->numBuffers = numFlatBuffers;
113178ee8d1cSJulian Grajkowski 
113278ee8d1cSJulian Grajkowski 		/* Go past the Buffer List descriptor to the list of buffer
113378ee8d1cSJulian Grajkowski 		 * descriptors
113478ee8d1cSJulian Grajkowski 		 */
113578ee8d1cSJulian Grajkowski 		pCurrFlatBufDesc =
113678ee8d1cSJulian Grajkowski 		    (icp_flat_buffer_desc_t *)((pBufferListDesc->phyBuffers));
113778ee8d1cSJulian Grajkowski 
113878ee8d1cSJulian Grajkowski 		/* Loop for each flat buffer in the SGL */
113978ee8d1cSJulian Grajkowski 		while (0 != numFlatBuffers) {
114078ee8d1cSJulian Grajkowski 			/* Set length of the current flat buffer */
114178ee8d1cSJulian Grajkowski 			pCurrFlatBufDesc->dataLenInBytes =
114278ee8d1cSJulian Grajkowski 			    pClientCurrFlatBuffer->dataLenInBytes;
114378ee8d1cSJulian Grajkowski 
114478ee8d1cSJulian Grajkowski 			/* Set physical address of the flat buffer */
114578ee8d1cSJulian Grajkowski 			pCurrFlatBufDesc->phyBuffer =
114678ee8d1cSJulian Grajkowski 			    LAC_MEM_CAST_PTR_TO_UINT64(
114778ee8d1cSJulian Grajkowski 				LAC_OS_VIRT_TO_PHYS_EXTERNAL(
114878ee8d1cSJulian Grajkowski 				    (*pService), pClientCurrFlatBuffer->pData));
114978ee8d1cSJulian Grajkowski 
115078ee8d1cSJulian Grajkowski 			if (pCurrFlatBufDesc->phyBuffer == 0) {
115178ee8d1cSJulian Grajkowski 				QAT_UTILS_LOG(
115278ee8d1cSJulian Grajkowski 				    "Unable to get the physical address of the flat buffer.\n");
115378ee8d1cSJulian Grajkowski 				return CPA_STATUS_FAIL;
115478ee8d1cSJulian Grajkowski 			}
115578ee8d1cSJulian Grajkowski 
115678ee8d1cSJulian Grajkowski 			pCurrFlatBufDesc++;
115778ee8d1cSJulian Grajkowski 			pClientCurrFlatBuffer++;
115878ee8d1cSJulian Grajkowski 			numFlatBuffers--;
115978ee8d1cSJulian Grajkowski 		}
116078ee8d1cSJulian Grajkowski 		pIntermediateBufferPtrsArray++;
116178ee8d1cSJulian Grajkowski 		pInterBuffPtrsArray++;
116278ee8d1cSJulian Grajkowski 	}
116378ee8d1cSJulian Grajkowski 
116478ee8d1cSJulian Grajkowski 	pService->generic_service_info.isInstanceStarted = CPA_TRUE;
116578ee8d1cSJulian Grajkowski 
116678ee8d1cSJulian Grajkowski 	/* Increment dev ref counter */
116778ee8d1cSJulian Grajkowski 	icp_qa_dev_get(dev);
116878ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
116978ee8d1cSJulian Grajkowski }
117078ee8d1cSJulian Grajkowski 
117178ee8d1cSJulian Grajkowski CpaStatus
cpaDcStopInstance(CpaInstanceHandle instanceHandle)117278ee8d1cSJulian Grajkowski cpaDcStopInstance(CpaInstanceHandle instanceHandle)
117378ee8d1cSJulian Grajkowski {
117478ee8d1cSJulian Grajkowski 	CpaInstanceHandle insHandle = NULL;
117578ee8d1cSJulian Grajkowski 	CpaInstanceInfo2 info = { 0 };
117678ee8d1cSJulian Grajkowski 	icp_accel_dev_t *dev = NULL;
117778ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
117878ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
117978ee8d1cSJulian Grajkowski 
118078ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle) {
118178ee8d1cSJulian Grajkowski 		insHandle = dcGetFirstHandle();
118278ee8d1cSJulian Grajkowski 	} else {
118378ee8d1cSJulian Grajkowski 		insHandle = instanceHandle;
118478ee8d1cSJulian Grajkowski 	}
118578ee8d1cSJulian Grajkowski 
118678ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(insHandle);
118778ee8d1cSJulian Grajkowski 	pService = (sal_compression_service_t *)insHandle;
118878ee8d1cSJulian Grajkowski 
118978ee8d1cSJulian Grajkowski 	/* Free Intermediate Buffer Pointers Array */
119078ee8d1cSJulian Grajkowski 	if (pService->pInterBuffPtrsArray != NULL) {
119178ee8d1cSJulian Grajkowski 		LAC_OS_CAFREE(pService->pInterBuffPtrsArray);
119278ee8d1cSJulian Grajkowski 		pService->pInterBuffPtrsArray = 0;
119378ee8d1cSJulian Grajkowski 	}
119478ee8d1cSJulian Grajkowski 
119578ee8d1cSJulian Grajkowski 	pService->pInterBuffPtrsArrayPhyAddr = 0;
119678ee8d1cSJulian Grajkowski 
119778ee8d1cSJulian Grajkowski 	status = cpaDcInstanceGetInfo2(insHandle, &info);
119878ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
119978ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Can not get instance info.\n");
120078ee8d1cSJulian Grajkowski 		return status;
120178ee8d1cSJulian Grajkowski 	}
120278ee8d1cSJulian Grajkowski 	dev = icp_adf_getAccelDevByAccelId(info.physInstId.packageId);
120378ee8d1cSJulian Grajkowski 	if (NULL == dev) {
120478ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Can not find device for the instance.\n");
120578ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
120678ee8d1cSJulian Grajkowski 	}
120778ee8d1cSJulian Grajkowski 
120878ee8d1cSJulian Grajkowski 	pService->generic_service_info.isInstanceStarted = CPA_FALSE;
120978ee8d1cSJulian Grajkowski 
121078ee8d1cSJulian Grajkowski 	/* Decrement dev ref counter */
121178ee8d1cSJulian Grajkowski 	icp_qa_dev_put(dev);
121278ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
121378ee8d1cSJulian Grajkowski }
121478ee8d1cSJulian Grajkowski 
121578ee8d1cSJulian Grajkowski CpaStatus
cpaDcGetNumInstances(Cpa16U * pNumInstances)121678ee8d1cSJulian Grajkowski cpaDcGetNumInstances(Cpa16U *pNumInstances)
121778ee8d1cSJulian Grajkowski {
121878ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
121978ee8d1cSJulian Grajkowski 	icp_accel_dev_t **pAdfInsts = NULL;
122078ee8d1cSJulian Grajkowski 	icp_accel_dev_t *dev_addr = NULL;
122178ee8d1cSJulian Grajkowski 	sal_t *base_addr = NULL;
122278ee8d1cSJulian Grajkowski 	sal_list_t *list_temp = NULL;
122378ee8d1cSJulian Grajkowski 	Cpa16U num_accel_dev = 0;
122478ee8d1cSJulian Grajkowski 	Cpa16U num = 0;
122578ee8d1cSJulian Grajkowski 	Cpa16U i = 0;
122678ee8d1cSJulian Grajkowski 
122778ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pNumInstances);
122878ee8d1cSJulian Grajkowski 
122978ee8d1cSJulian Grajkowski 	/* Get the number of accel_dev in the system */
123078ee8d1cSJulian Grajkowski 	status = icp_amgr_getNumInstances(&num_accel_dev);
123178ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
123278ee8d1cSJulian Grajkowski 
123378ee8d1cSJulian Grajkowski 	/* Allocate memory to store addr of accel_devs */
123478ee8d1cSJulian Grajkowski 	pAdfInsts =
123578ee8d1cSJulian Grajkowski 	    malloc(num_accel_dev * sizeof(icp_accel_dev_t *), M_QAT, M_WAITOK);
123678ee8d1cSJulian Grajkowski 	num_accel_dev = 0;
123778ee8d1cSJulian Grajkowski 
123878ee8d1cSJulian Grajkowski 	/* Get ADF to return accel_devs with dc enabled */
123978ee8d1cSJulian Grajkowski 	status = icp_amgr_getAllAccelDevByCapabilities(
124078ee8d1cSJulian Grajkowski 	    ICP_ACCEL_CAPABILITIES_COMPRESSION, pAdfInsts, &num_accel_dev);
124178ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
124278ee8d1cSJulian Grajkowski 		for (i = 0; i < num_accel_dev; i++) {
124378ee8d1cSJulian Grajkowski 			dev_addr = (icp_accel_dev_t *)pAdfInsts[i];
124478ee8d1cSJulian Grajkowski 			if (NULL != dev_addr) {
124578ee8d1cSJulian Grajkowski 				base_addr = dev_addr->pSalHandle;
124678ee8d1cSJulian Grajkowski 				if (NULL != base_addr) {
124778ee8d1cSJulian Grajkowski 					list_temp =
124878ee8d1cSJulian Grajkowski 					    base_addr->compression_services;
124978ee8d1cSJulian Grajkowski 					while (NULL != list_temp) {
125078ee8d1cSJulian Grajkowski 						num++;
125178ee8d1cSJulian Grajkowski 						list_temp =
125278ee8d1cSJulian Grajkowski 						    SalList_next(list_temp);
125378ee8d1cSJulian Grajkowski 					}
125478ee8d1cSJulian Grajkowski 				}
125578ee8d1cSJulian Grajkowski 			}
125678ee8d1cSJulian Grajkowski 		}
125778ee8d1cSJulian Grajkowski 
125878ee8d1cSJulian Grajkowski 		*pNumInstances = num;
125978ee8d1cSJulian Grajkowski 	}
126078ee8d1cSJulian Grajkowski 
126178ee8d1cSJulian Grajkowski 	free(pAdfInsts, M_QAT);
126278ee8d1cSJulian Grajkowski 
126378ee8d1cSJulian Grajkowski 	return status;
126478ee8d1cSJulian Grajkowski }
126578ee8d1cSJulian Grajkowski 
126678ee8d1cSJulian Grajkowski CpaStatus
cpaDcGetInstances(Cpa16U numInstances,CpaInstanceHandle * dcInstances)126778ee8d1cSJulian Grajkowski cpaDcGetInstances(Cpa16U numInstances, CpaInstanceHandle *dcInstances)
126878ee8d1cSJulian Grajkowski {
126978ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
127078ee8d1cSJulian Grajkowski 	icp_accel_dev_t **pAdfInsts = NULL;
127178ee8d1cSJulian Grajkowski 	icp_accel_dev_t *dev_addr = NULL;
127278ee8d1cSJulian Grajkowski 	sal_t *base_addr = NULL;
127378ee8d1cSJulian Grajkowski 	sal_list_t *list_temp = NULL;
127478ee8d1cSJulian Grajkowski 	Cpa16U num_accel_dev = 0;
127578ee8d1cSJulian Grajkowski 	Cpa16U index = 0;
127678ee8d1cSJulian Grajkowski 	Cpa16U i = 0;
127778ee8d1cSJulian Grajkowski 
127878ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(dcInstances);
127978ee8d1cSJulian Grajkowski 	if (0 == numInstances) {
128078ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("numInstances is 0.\n");
128178ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
128278ee8d1cSJulian Grajkowski 	}
128378ee8d1cSJulian Grajkowski 
128478ee8d1cSJulian Grajkowski 	/* Get the number of accel_dev in the system */
128578ee8d1cSJulian Grajkowski 	status = icp_amgr_getNumInstances(&num_accel_dev);
128678ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
128778ee8d1cSJulian Grajkowski 
128878ee8d1cSJulian Grajkowski 	/* Allocate memory to store addr of accel_devs */
128978ee8d1cSJulian Grajkowski 	pAdfInsts =
129078ee8d1cSJulian Grajkowski 	    malloc(num_accel_dev * sizeof(icp_accel_dev_t *), M_QAT, M_WAITOK);
129178ee8d1cSJulian Grajkowski 
129278ee8d1cSJulian Grajkowski 	num_accel_dev = 0;
129378ee8d1cSJulian Grajkowski 	/* Get ADF to return accel_devs with dc enabled */
129478ee8d1cSJulian Grajkowski 	status = icp_amgr_getAllAccelDevByCapabilities(
129578ee8d1cSJulian Grajkowski 	    ICP_ACCEL_CAPABILITIES_COMPRESSION, pAdfInsts, &num_accel_dev);
129678ee8d1cSJulian Grajkowski 
129778ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
129878ee8d1cSJulian Grajkowski 		/* First check the number of instances in the system */
129978ee8d1cSJulian Grajkowski 		for (i = 0; i < num_accel_dev; i++) {
130078ee8d1cSJulian Grajkowski 			dev_addr = (icp_accel_dev_t *)pAdfInsts[i];
130178ee8d1cSJulian Grajkowski 			if (NULL != dev_addr) {
130278ee8d1cSJulian Grajkowski 				base_addr = dev_addr->pSalHandle;
130378ee8d1cSJulian Grajkowski 				if (NULL != base_addr) {
130478ee8d1cSJulian Grajkowski 					list_temp =
130578ee8d1cSJulian Grajkowski 					    base_addr->compression_services;
130678ee8d1cSJulian Grajkowski 					while (NULL != list_temp) {
130778ee8d1cSJulian Grajkowski 						if (index >
130878ee8d1cSJulian Grajkowski 						    (numInstances - 1)) {
130978ee8d1cSJulian Grajkowski 							break;
131078ee8d1cSJulian Grajkowski 						}
131178ee8d1cSJulian Grajkowski 
131278ee8d1cSJulian Grajkowski 						dcInstances[index] =
131378ee8d1cSJulian Grajkowski 						    SalList_getObject(
131478ee8d1cSJulian Grajkowski 							list_temp);
131578ee8d1cSJulian Grajkowski 						list_temp =
131678ee8d1cSJulian Grajkowski 						    SalList_next(list_temp);
131778ee8d1cSJulian Grajkowski 						index++;
131878ee8d1cSJulian Grajkowski 					}
131978ee8d1cSJulian Grajkowski 				}
132078ee8d1cSJulian Grajkowski 			}
132178ee8d1cSJulian Grajkowski 		}
132278ee8d1cSJulian Grajkowski 
132378ee8d1cSJulian Grajkowski 		if (numInstances > index) {
132478ee8d1cSJulian Grajkowski 			QAT_UTILS_LOG("Only %d dc instances available.\n",
132578ee8d1cSJulian Grajkowski 				      index);
132678ee8d1cSJulian Grajkowski 			status = CPA_STATUS_RESOURCE;
132778ee8d1cSJulian Grajkowski 		}
132878ee8d1cSJulian Grajkowski 	}
132978ee8d1cSJulian Grajkowski 
133078ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
133178ee8d1cSJulian Grajkowski 		index = 0;
133278ee8d1cSJulian Grajkowski 		for (i = 0; i < num_accel_dev; i++) {
133378ee8d1cSJulian Grajkowski 			dev_addr = (icp_accel_dev_t *)pAdfInsts[i];
133478ee8d1cSJulian Grajkowski 			/* Note dev_addr cannot be NULL here as numInstances=0
133578ee8d1cSJulian Grajkowski 			   is not valid and if dev_addr=NULL then index=0 (which
133678ee8d1cSJulian Grajkowski 			   is less than numInstances and status is set to
133778ee8d1cSJulian Grajkowski 			   _RESOURCE
133878ee8d1cSJulian Grajkowski 			   above */
133978ee8d1cSJulian Grajkowski 			base_addr = dev_addr->pSalHandle;
134078ee8d1cSJulian Grajkowski 			if (NULL != base_addr) {
134178ee8d1cSJulian Grajkowski 				list_temp = base_addr->compression_services;
134278ee8d1cSJulian Grajkowski 				while (NULL != list_temp) {
134378ee8d1cSJulian Grajkowski 					if (index > (numInstances - 1)) {
134478ee8d1cSJulian Grajkowski 						break;
134578ee8d1cSJulian Grajkowski 					}
134678ee8d1cSJulian Grajkowski 
134778ee8d1cSJulian Grajkowski 					dcInstances[index] =
134878ee8d1cSJulian Grajkowski 					    SalList_getObject(list_temp);
134978ee8d1cSJulian Grajkowski 					list_temp = SalList_next(list_temp);
135078ee8d1cSJulian Grajkowski 					index++;
135178ee8d1cSJulian Grajkowski 				}
135278ee8d1cSJulian Grajkowski 			}
135378ee8d1cSJulian Grajkowski 		}
135478ee8d1cSJulian Grajkowski 	}
135578ee8d1cSJulian Grajkowski 
135678ee8d1cSJulian Grajkowski 	free(pAdfInsts, M_QAT);
135778ee8d1cSJulian Grajkowski 
135878ee8d1cSJulian Grajkowski 	return status;
135978ee8d1cSJulian Grajkowski }
136078ee8d1cSJulian Grajkowski 
136178ee8d1cSJulian Grajkowski CpaStatus
cpaDcInstanceGetInfo2(const CpaInstanceHandle instanceHandle,CpaInstanceInfo2 * pInstanceInfo2)136278ee8d1cSJulian Grajkowski cpaDcInstanceGetInfo2(const CpaInstanceHandle instanceHandle,
136378ee8d1cSJulian Grajkowski 		      CpaInstanceInfo2 *pInstanceInfo2)
136478ee8d1cSJulian Grajkowski {
136578ee8d1cSJulian Grajkowski 	sal_compression_service_t *pCompressionService = NULL;
136678ee8d1cSJulian Grajkowski 	CpaInstanceHandle insHandle = NULL;
136778ee8d1cSJulian Grajkowski 	icp_accel_dev_t *dev = NULL;
136878ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
136978ee8d1cSJulian Grajkowski 	char keyStr[ADF_CFG_MAX_KEY_LEN_IN_BYTES] = { 0 };
137078ee8d1cSJulian Grajkowski 	char valStr[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = { 0 };
137178ee8d1cSJulian Grajkowski 	char *section = DYN_SEC;
137278ee8d1cSJulian Grajkowski 
137378ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle) {
137478ee8d1cSJulian Grajkowski 		insHandle = dcGetFirstHandle();
137578ee8d1cSJulian Grajkowski 	} else {
137678ee8d1cSJulian Grajkowski 		insHandle = instanceHandle;
137778ee8d1cSJulian Grajkowski 	}
137878ee8d1cSJulian Grajkowski 
137978ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(insHandle);
138078ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(insHandle, SAL_SERVICE_TYPE_COMPRESSION);
138178ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pInstanceInfo2);
138278ee8d1cSJulian Grajkowski 
138378ee8d1cSJulian Grajkowski 	LAC_OS_BZERO(pInstanceInfo2, sizeof(CpaInstanceInfo2));
138478ee8d1cSJulian Grajkowski 	pInstanceInfo2->accelerationServiceType =
138578ee8d1cSJulian Grajkowski 	    CPA_ACC_SVC_TYPE_DATA_COMPRESSION;
138678ee8d1cSJulian Grajkowski 
138778ee8d1cSJulian Grajkowski 	snprintf((char *)pInstanceInfo2->vendorName,
138878ee8d1cSJulian Grajkowski 		 CPA_INST_VENDOR_NAME_SIZE,
138978ee8d1cSJulian Grajkowski 		 "%s",
139078ee8d1cSJulian Grajkowski 		 SAL_INFO2_VENDOR_NAME);
139178ee8d1cSJulian Grajkowski 	pInstanceInfo2->vendorName[CPA_INST_VENDOR_NAME_SIZE - 1] = '\0';
139278ee8d1cSJulian Grajkowski 
139378ee8d1cSJulian Grajkowski 	snprintf((char *)pInstanceInfo2->swVersion,
139478ee8d1cSJulian Grajkowski 		 CPA_INST_SW_VERSION_SIZE,
139578ee8d1cSJulian Grajkowski 		 "Version %d.%d",
139678ee8d1cSJulian Grajkowski 		 SAL_INFO2_DRIVER_SW_VERSION_MAJ_NUMBER,
139778ee8d1cSJulian Grajkowski 		 SAL_INFO2_DRIVER_SW_VERSION_MIN_NUMBER);
139878ee8d1cSJulian Grajkowski 	pInstanceInfo2->swVersion[CPA_INST_SW_VERSION_SIZE - 1] = '\0';
139978ee8d1cSJulian Grajkowski 
140078ee8d1cSJulian Grajkowski 	/* Note we can safely read the contents of the compression service
140178ee8d1cSJulian Grajkowski 	   instance
140278ee8d1cSJulian Grajkowski 	   here because icp_amgr_getAccelDevByCapabilities() only returns devs
140378ee8d1cSJulian Grajkowski 	   that have started */
140478ee8d1cSJulian Grajkowski 	pCompressionService = (sal_compression_service_t *)insHandle;
140578ee8d1cSJulian Grajkowski 	pInstanceInfo2->physInstId.packageId = pCompressionService->pkgID;
140678ee8d1cSJulian Grajkowski 	pInstanceInfo2->physInstId.acceleratorId =
140778ee8d1cSJulian Grajkowski 	    pCompressionService->acceleratorNum;
140878ee8d1cSJulian Grajkowski 	pInstanceInfo2->physInstId.executionEngineId = 0;
140978ee8d1cSJulian Grajkowski 	pInstanceInfo2->physInstId.busAddress =
141078ee8d1cSJulian Grajkowski 	    icp_adf_get_busAddress(pInstanceInfo2->physInstId.packageId);
141178ee8d1cSJulian Grajkowski 
141278ee8d1cSJulian Grajkowski 	/* set coreAffinity to zero before use */
141378ee8d1cSJulian Grajkowski 	LAC_OS_BZERO(pInstanceInfo2->coreAffinity,
141478ee8d1cSJulian Grajkowski 		     sizeof(pInstanceInfo2->coreAffinity));
141578ee8d1cSJulian Grajkowski 	CPA_BITMAP_BIT_SET(pInstanceInfo2->coreAffinity,
141678ee8d1cSJulian Grajkowski 			   pCompressionService->coreAffinity);
141778ee8d1cSJulian Grajkowski 
141878ee8d1cSJulian Grajkowski 	pInstanceInfo2->nodeAffinity = pCompressionService->nodeAffinity;
141978ee8d1cSJulian Grajkowski 
142078ee8d1cSJulian Grajkowski 	if (CPA_TRUE ==
142178ee8d1cSJulian Grajkowski 	    pCompressionService->generic_service_info.isInstanceStarted) {
142278ee8d1cSJulian Grajkowski 		pInstanceInfo2->operState = CPA_OPER_STATE_UP;
142378ee8d1cSJulian Grajkowski 	} else {
142478ee8d1cSJulian Grajkowski 		pInstanceInfo2->operState = CPA_OPER_STATE_DOWN;
142578ee8d1cSJulian Grajkowski 	}
142678ee8d1cSJulian Grajkowski 
142778ee8d1cSJulian Grajkowski 	pInstanceInfo2->requiresPhysicallyContiguousMemory = CPA_TRUE;
142878ee8d1cSJulian Grajkowski 
142978ee8d1cSJulian Grajkowski 	if (SAL_RESP_POLL_CFG_FILE == pCompressionService->isPolled) {
143078ee8d1cSJulian Grajkowski 		pInstanceInfo2->isPolled = CPA_TRUE;
143178ee8d1cSJulian Grajkowski 	} else {
143278ee8d1cSJulian Grajkowski 		pInstanceInfo2->isPolled = CPA_FALSE;
143378ee8d1cSJulian Grajkowski 	}
143478ee8d1cSJulian Grajkowski 
143578ee8d1cSJulian Grajkowski 	pInstanceInfo2->isOffloaded = CPA_TRUE;
143678ee8d1cSJulian Grajkowski 	/* Get the instance name and part name from the config file */
143778ee8d1cSJulian Grajkowski 	dev = icp_adf_getAccelDevByAccelId(pCompressionService->pkgID);
1438*ded037e6SHareshx Sankar Raj 	if (NULL == dev ||
1439*ded037e6SHareshx Sankar Raj 	    0 == strnlen(dev->deviceName, ADF_DEVICE_TYPE_LENGTH + 1)) {
144078ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Can not find device for the instance.\n");
144178ee8d1cSJulian Grajkowski 		LAC_OS_BZERO(pInstanceInfo2, sizeof(CpaInstanceInfo2));
144278ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
144378ee8d1cSJulian Grajkowski 	}
144478ee8d1cSJulian Grajkowski 	snprintf((char *)pInstanceInfo2->partName,
144578ee8d1cSJulian Grajkowski 		 CPA_INST_PART_NAME_SIZE,
144678ee8d1cSJulian Grajkowski 		 SAL_INFO2_PART_NAME,
144778ee8d1cSJulian Grajkowski 		 dev->deviceName);
144878ee8d1cSJulian Grajkowski 	pInstanceInfo2->partName[CPA_INST_PART_NAME_SIZE - 1] = '\0';
144978ee8d1cSJulian Grajkowski 
145078ee8d1cSJulian Grajkowski 	if (CPA_FALSE == pCompressionService->generic_service_info.is_dyn) {
145178ee8d1cSJulian Grajkowski 		section = icpGetProcessName();
145278ee8d1cSJulian Grajkowski 	}
145378ee8d1cSJulian Grajkowski 
145478ee8d1cSJulian Grajkowski 	status = Sal_StringParsing(
145578ee8d1cSJulian Grajkowski 	    "Dc",
145678ee8d1cSJulian Grajkowski 	    pCompressionService->generic_service_info.instance,
145778ee8d1cSJulian Grajkowski 	    "Name",
145878ee8d1cSJulian Grajkowski 	    keyStr);
145978ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
146078ee8d1cSJulian Grajkowski 	status = icp_adf_cfgGetParamValue(dev, section, keyStr, valStr);
146178ee8d1cSJulian Grajkowski 	LAC_CHECK_STATUS(status);
146278ee8d1cSJulian Grajkowski 	strncpy((char *)pInstanceInfo2->instName,
146378ee8d1cSJulian Grajkowski 		valStr,
146478ee8d1cSJulian Grajkowski 		sizeof(pInstanceInfo2->instName) - 1);
146578ee8d1cSJulian Grajkowski 	pInstanceInfo2->instName[CPA_INST_NAME_SIZE - 1] = '\0';
146678ee8d1cSJulian Grajkowski 
146778ee8d1cSJulian Grajkowski #if __GNUC__ >= 7
146878ee8d1cSJulian Grajkowski #pragma GCC diagnostic push
146978ee8d1cSJulian Grajkowski #pragma GCC diagnostic ignored "-Wformat-truncation"
147078ee8d1cSJulian Grajkowski #endif
147178ee8d1cSJulian Grajkowski 	snprintf((char *)pInstanceInfo2->instID,
147278ee8d1cSJulian Grajkowski 		 CPA_INST_ID_SIZE,
147378ee8d1cSJulian Grajkowski 		 "%s_%s",
147478ee8d1cSJulian Grajkowski 		 section,
147578ee8d1cSJulian Grajkowski 		 valStr);
147678ee8d1cSJulian Grajkowski #if __GNUC__ >= 7
147778ee8d1cSJulian Grajkowski #pragma GCC diagnostic pop
147878ee8d1cSJulian Grajkowski #endif
147978ee8d1cSJulian Grajkowski 
148078ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
148178ee8d1cSJulian Grajkowski }
148278ee8d1cSJulian Grajkowski 
148378ee8d1cSJulian Grajkowski CpaStatus
cpaDcQueryCapabilities(CpaInstanceHandle dcInstance,CpaDcInstanceCapabilities * pInstanceCapabilities)148478ee8d1cSJulian Grajkowski cpaDcQueryCapabilities(CpaInstanceHandle dcInstance,
148578ee8d1cSJulian Grajkowski 		       CpaDcInstanceCapabilities *pInstanceCapabilities)
148678ee8d1cSJulian Grajkowski {
148778ee8d1cSJulian Grajkowski 	CpaInstanceHandle insHandle = NULL;
148878ee8d1cSJulian Grajkowski 	sal_compression_service_t *pService = NULL;
148978ee8d1cSJulian Grajkowski 	Cpa32U capabilitiesMask = 0;
149078ee8d1cSJulian Grajkowski 	dc_extd_ftrs_t *pExtendedFtrs = NULL;
149178ee8d1cSJulian Grajkowski 
149278ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == dcInstance) {
149378ee8d1cSJulian Grajkowski 		insHandle = dcGetFirstHandle();
149478ee8d1cSJulian Grajkowski 		if (NULL == insHandle) {
149578ee8d1cSJulian Grajkowski 			QAT_UTILS_LOG("Can not get the instance.\n");
149678ee8d1cSJulian Grajkowski 			return CPA_STATUS_FAIL;
149778ee8d1cSJulian Grajkowski 		}
149878ee8d1cSJulian Grajkowski 	} else {
149978ee8d1cSJulian Grajkowski 		insHandle = dcInstance;
150078ee8d1cSJulian Grajkowski 	}
150178ee8d1cSJulian Grajkowski 
150278ee8d1cSJulian Grajkowski 	pService = (sal_compression_service_t *)insHandle;
150378ee8d1cSJulian Grajkowski 
150478ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(insHandle);
150578ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(insHandle, SAL_SERVICE_TYPE_COMPRESSION);
150678ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(pInstanceCapabilities);
150778ee8d1cSJulian Grajkowski 
150878ee8d1cSJulian Grajkowski 	memset(pInstanceCapabilities, 0, sizeof(CpaDcInstanceCapabilities));
150978ee8d1cSJulian Grajkowski 
151078ee8d1cSJulian Grajkowski 	capabilitiesMask = pService->generic_service_info.capabilitiesMask;
151178ee8d1cSJulian Grajkowski 
151278ee8d1cSJulian Grajkowski 	/* Set compression capabilities */
151378ee8d1cSJulian Grajkowski 	if (capabilitiesMask & ICP_ACCEL_CAPABILITIES_CNV_INTEGRITY) {
151478ee8d1cSJulian Grajkowski 		pInstanceCapabilities->integrityCrcs = CPA_TRUE;
151578ee8d1cSJulian Grajkowski 	}
151678ee8d1cSJulian Grajkowski 
151778ee8d1cSJulian Grajkowski 	pInstanceCapabilities->endOfLastBlock = CPA_TRUE;
151878ee8d1cSJulian Grajkowski 	pInstanceCapabilities->statefulDeflateCompression = CPA_FALSE;
151978ee8d1cSJulian Grajkowski 	pInstanceCapabilities->statefulDeflateDecompression = CPA_TRUE;
152078ee8d1cSJulian Grajkowski 	pInstanceCapabilities->statelessDeflateCompression = CPA_TRUE;
152178ee8d1cSJulian Grajkowski 	pInstanceCapabilities->statelessDeflateDecompression = CPA_TRUE;
152278ee8d1cSJulian Grajkowski 	pInstanceCapabilities->checksumCRC32 = CPA_TRUE;
152378ee8d1cSJulian Grajkowski 	pInstanceCapabilities->checksumAdler32 = CPA_TRUE;
152478ee8d1cSJulian Grajkowski 	pInstanceCapabilities->dynamicHuffman = CPA_TRUE;
152578ee8d1cSJulian Grajkowski 	pInstanceCapabilities->precompiledHuffman = CPA_FALSE;
152678ee8d1cSJulian Grajkowski 	pInstanceCapabilities->dynamicHuffmanBufferReq = CPA_TRUE;
152778ee8d1cSJulian Grajkowski 	pInstanceCapabilities->autoSelectBestHuffmanTree = CPA_TRUE;
152878ee8d1cSJulian Grajkowski 
152978ee8d1cSJulian Grajkowski 	pInstanceCapabilities->validWindowSizeMaskCompression =
153078ee8d1cSJulian Grajkowski 	    pService->comp_device_data.windowSizeMask;
153178ee8d1cSJulian Grajkowski 	pInstanceCapabilities->validWindowSizeMaskDecompression =
153278ee8d1cSJulian Grajkowski 	    pService->comp_device_data.windowSizeMask;
153378ee8d1cSJulian Grajkowski 	pExtendedFtrs = (dc_extd_ftrs_t *)&(
153478ee8d1cSJulian Grajkowski 	    ((sal_service_t *)insHandle)->dcExtendedFeatures);
153578ee8d1cSJulian Grajkowski 	pInstanceCapabilities->batchAndPack = CPA_FALSE;
153678ee8d1cSJulian Grajkowski 	pInstanceCapabilities->compressAndVerify =
153778ee8d1cSJulian Grajkowski 	    (CpaBoolean)pExtendedFtrs->is_cnv;
153878ee8d1cSJulian Grajkowski 	pInstanceCapabilities->compressAndVerifyStrict = CPA_TRUE;
153978ee8d1cSJulian Grajkowski 	pInstanceCapabilities->compressAndVerifyAndRecover =
154078ee8d1cSJulian Grajkowski 	    (CpaBoolean)pExtendedFtrs->is_cnvnr;
154178ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
154278ee8d1cSJulian Grajkowski }
154378ee8d1cSJulian Grajkowski 
154478ee8d1cSJulian Grajkowski CpaStatus
cpaDcSetAddressTranslation(const CpaInstanceHandle instanceHandle,CpaVirtualToPhysical virtual2Physical)154578ee8d1cSJulian Grajkowski cpaDcSetAddressTranslation(const CpaInstanceHandle instanceHandle,
154678ee8d1cSJulian Grajkowski 			   CpaVirtualToPhysical virtual2Physical)
154778ee8d1cSJulian Grajkowski {
154878ee8d1cSJulian Grajkowski 	sal_service_t *pService = NULL;
154978ee8d1cSJulian Grajkowski 	CpaInstanceHandle insHandle = NULL;
155078ee8d1cSJulian Grajkowski 
155178ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle) {
155278ee8d1cSJulian Grajkowski 		insHandle = dcGetFirstHandle();
155378ee8d1cSJulian Grajkowski 	} else {
155478ee8d1cSJulian Grajkowski 		insHandle = instanceHandle;
155578ee8d1cSJulian Grajkowski 	}
155678ee8d1cSJulian Grajkowski 
155778ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(insHandle);
155878ee8d1cSJulian Grajkowski 	SAL_CHECK_INSTANCE_TYPE(insHandle, SAL_SERVICE_TYPE_COMPRESSION);
155978ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(virtual2Physical);
156078ee8d1cSJulian Grajkowski 
156178ee8d1cSJulian Grajkowski 	pService = (sal_service_t *)insHandle;
156278ee8d1cSJulian Grajkowski 
156378ee8d1cSJulian Grajkowski 	pService->virt2PhysClient = virtual2Physical;
156478ee8d1cSJulian Grajkowski 
156578ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
156678ee8d1cSJulian Grajkowski }
156778ee8d1cSJulian Grajkowski 
156878ee8d1cSJulian Grajkowski /**
156978ee8d1cSJulian Grajkowski  ******************************************************************************
157078ee8d1cSJulian Grajkowski  * @ingroup cpaDcCommon
157178ee8d1cSJulian Grajkowski  * Data compression specific polling function which polls a DC instance.
157278ee8d1cSJulian Grajkowski  *****************************************************************************/
157378ee8d1cSJulian Grajkowski 
157478ee8d1cSJulian Grajkowski CpaStatus
icp_sal_DcPollInstance(CpaInstanceHandle instanceHandle_in,Cpa32U response_quota)157578ee8d1cSJulian Grajkowski icp_sal_DcPollInstance(CpaInstanceHandle instanceHandle_in,
157678ee8d1cSJulian Grajkowski 		       Cpa32U response_quota)
157778ee8d1cSJulian Grajkowski {
157878ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
157978ee8d1cSJulian Grajkowski 	sal_compression_service_t *dc_handle = NULL;
158078ee8d1cSJulian Grajkowski 	sal_service_t *gen_handle = NULL;
158178ee8d1cSJulian Grajkowski 	icp_comms_trans_handle trans_hndTable[DC_NUM_RX_RINGS];
158278ee8d1cSJulian Grajkowski 
158378ee8d1cSJulian Grajkowski 	if (CPA_INSTANCE_HANDLE_SINGLE == instanceHandle_in) {
158478ee8d1cSJulian Grajkowski 		dc_handle = (sal_compression_service_t *)dcGetFirstHandle();
158578ee8d1cSJulian Grajkowski 	} else {
158678ee8d1cSJulian Grajkowski 		dc_handle = (sal_compression_service_t *)instanceHandle_in;
158778ee8d1cSJulian Grajkowski 	}
158878ee8d1cSJulian Grajkowski 
158978ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(dc_handle);
159078ee8d1cSJulian Grajkowski 	SAL_RUNNING_CHECK(dc_handle);
159178ee8d1cSJulian Grajkowski 
159278ee8d1cSJulian Grajkowski 	gen_handle = &(dc_handle->generic_service_info);
159378ee8d1cSJulian Grajkowski 	if (SAL_SERVICE_TYPE_COMPRESSION != gen_handle->type) {
159478ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG("Instance handle type is incorrect.\n");
159578ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
159678ee8d1cSJulian Grajkowski 	}
159778ee8d1cSJulian Grajkowski 
159878ee8d1cSJulian Grajkowski 	/*
159978ee8d1cSJulian Grajkowski 	 * From the instanceHandle we must get the trans_handle and send
160078ee8d1cSJulian Grajkowski 	 * down to adf for polling.
160178ee8d1cSJulian Grajkowski 	 * Populate our trans handle table with the appropriate handles.
160278ee8d1cSJulian Grajkowski 	 */
160378ee8d1cSJulian Grajkowski 	trans_hndTable[0] = dc_handle->trans_handle_compression_rx;
160478ee8d1cSJulian Grajkowski 
160578ee8d1cSJulian Grajkowski 	/* Call adf to do the polling. */
160678ee8d1cSJulian Grajkowski 	status = icp_adf_pollInstance(trans_hndTable,
160778ee8d1cSJulian Grajkowski 				      DC_NUM_RX_RINGS,
160878ee8d1cSJulian Grajkowski 				      response_quota);
160978ee8d1cSJulian Grajkowski 	return status;
161078ee8d1cSJulian Grajkowski }
161178ee8d1cSJulian Grajkowski 
161278ee8d1cSJulian Grajkowski /**
161378ee8d1cSJulian Grajkowski  ******************************************************************************
161478ee8d1cSJulian Grajkowski  * @ingroup cpaDcCommon
161578ee8d1cSJulian Grajkowski  *****************************************************************************/
161678ee8d1cSJulian Grajkowski CpaStatus
cpaDcInstanceSetNotificationCb(const CpaInstanceHandle instanceHandle,const CpaDcInstanceNotificationCbFunc pInstanceNotificationCb,void * pCallbackTag)161778ee8d1cSJulian Grajkowski cpaDcInstanceSetNotificationCb(
161878ee8d1cSJulian Grajkowski     const CpaInstanceHandle instanceHandle,
161978ee8d1cSJulian Grajkowski     const CpaDcInstanceNotificationCbFunc pInstanceNotificationCb,
162078ee8d1cSJulian Grajkowski     void *pCallbackTag)
162178ee8d1cSJulian Grajkowski {
162278ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
162378ee8d1cSJulian Grajkowski 	sal_service_t *gen_handle = instanceHandle;
162478ee8d1cSJulian Grajkowski 
162578ee8d1cSJulian Grajkowski 	LAC_CHECK_NULL_PARAM(gen_handle);
162678ee8d1cSJulian Grajkowski 	gen_handle->notification_cb = pInstanceNotificationCb;
162778ee8d1cSJulian Grajkowski 	gen_handle->cb_tag = pCallbackTag;
162878ee8d1cSJulian Grajkowski 	return status;
162978ee8d1cSJulian Grajkowski }
163078ee8d1cSJulian Grajkowski 
163178ee8d1cSJulian Grajkowski CpaInstanceHandle
dcGetFirstHandle(void)163278ee8d1cSJulian Grajkowski dcGetFirstHandle(void)
163378ee8d1cSJulian Grajkowski {
163478ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
163578ee8d1cSJulian Grajkowski 	static icp_accel_dev_t *adfInsts[ADF_MAX_DEVICES] = { 0 };
163678ee8d1cSJulian Grajkowski 	CpaInstanceHandle dcInst = NULL;
163778ee8d1cSJulian Grajkowski 	icp_accel_dev_t *dev_addr = NULL;
163878ee8d1cSJulian Grajkowski 	sal_t *base_addr = NULL;
163978ee8d1cSJulian Grajkowski 	sal_list_t *list_temp = NULL;
164078ee8d1cSJulian Grajkowski 	Cpa16U i, num_dc = 0;
164178ee8d1cSJulian Grajkowski 
164278ee8d1cSJulian Grajkowski 	/* Only need 1 dev with compression enabled - so check all devices */
164378ee8d1cSJulian Grajkowski 	status = icp_amgr_getAllAccelDevByCapabilities(
164478ee8d1cSJulian Grajkowski 	    ICP_ACCEL_CAPABILITIES_COMPRESSION, adfInsts, &num_dc);
164578ee8d1cSJulian Grajkowski 	if ((0 == num_dc) || (CPA_STATUS_SUCCESS != status)) {
164678ee8d1cSJulian Grajkowski 		QAT_UTILS_LOG(
164778ee8d1cSJulian Grajkowski 		    "No compression devices enabled in the system.\n");
164878ee8d1cSJulian Grajkowski 		return dcInst;
164978ee8d1cSJulian Grajkowski 	}
165078ee8d1cSJulian Grajkowski 
165178ee8d1cSJulian Grajkowski 	for (i = 0; i < num_dc; i++) {
165278ee8d1cSJulian Grajkowski 		dev_addr = (icp_accel_dev_t *)adfInsts[i];
165378ee8d1cSJulian Grajkowski 		if (NULL != dev_addr) {
165478ee8d1cSJulian Grajkowski 			base_addr = dev_addr->pSalHandle;
165578ee8d1cSJulian Grajkowski 			if (NULL != base_addr) {
165678ee8d1cSJulian Grajkowski 				list_temp = base_addr->compression_services;
165778ee8d1cSJulian Grajkowski 				if (NULL != list_temp) {
165878ee8d1cSJulian Grajkowski 					dcInst = SalList_getObject(list_temp);
165978ee8d1cSJulian Grajkowski 					break;
166078ee8d1cSJulian Grajkowski 				}
166178ee8d1cSJulian Grajkowski 			}
166278ee8d1cSJulian Grajkowski 		}
166378ee8d1cSJulian Grajkowski 	}
166478ee8d1cSJulian Grajkowski 	return dcInst;
166578ee8d1cSJulian Grajkowski }
1666