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