178ee8d1cSJulian Grajkowski /***************************************************************************
278ee8d1cSJulian Grajkowski  *
378ee8d1cSJulian Grajkowski  * <COPYRIGHT_TAG>
478ee8d1cSJulian Grajkowski  *
578ee8d1cSJulian Grajkowski  ***************************************************************************/
678ee8d1cSJulian Grajkowski 
778ee8d1cSJulian Grajkowski /**
878ee8d1cSJulian Grajkowski  ***************************************************************************
978ee8d1cSJulian Grajkowski  * @file lac_sym_alg_chain.c      Algorithm Chaining Perform
1078ee8d1cSJulian Grajkowski  *
1178ee8d1cSJulian Grajkowski  * @ingroup LacAlgChain
1278ee8d1cSJulian Grajkowski  ***************************************************************************/
1378ee8d1cSJulian Grajkowski 
1478ee8d1cSJulian Grajkowski /*
1578ee8d1cSJulian Grajkowski *******************************************************************************
1678ee8d1cSJulian Grajkowski * Include public/global header files
1778ee8d1cSJulian Grajkowski *******************************************************************************
1878ee8d1cSJulian Grajkowski */
1978ee8d1cSJulian Grajkowski 
2078ee8d1cSJulian Grajkowski #include "cpa.h"
2178ee8d1cSJulian Grajkowski #include "cpa_cy_sym.h"
2278ee8d1cSJulian Grajkowski 
2378ee8d1cSJulian Grajkowski #include "icp_accel_devices.h"
2478ee8d1cSJulian Grajkowski #include "icp_adf_init.h"
2578ee8d1cSJulian Grajkowski #include "icp_adf_transport.h"
2678ee8d1cSJulian Grajkowski #include "icp_adf_debug.h"
2778ee8d1cSJulian Grajkowski 
2878ee8d1cSJulian Grajkowski /*
2978ee8d1cSJulian Grajkowski *******************************************************************************
3078ee8d1cSJulian Grajkowski * Include private header files
3178ee8d1cSJulian Grajkowski *******************************************************************************
3278ee8d1cSJulian Grajkowski */
3378ee8d1cSJulian Grajkowski 
3478ee8d1cSJulian Grajkowski #include "lac_mem.h"
3578ee8d1cSJulian Grajkowski #include "lac_log.h"
3678ee8d1cSJulian Grajkowski #include "lac_sym.h"
3778ee8d1cSJulian Grajkowski #include "lac_list.h"
3878ee8d1cSJulian Grajkowski #include "icp_qat_fw_la.h"
3978ee8d1cSJulian Grajkowski #include "lac_sal_types_crypto.h"
4078ee8d1cSJulian Grajkowski #include "lac_sal.h"
4178ee8d1cSJulian Grajkowski #include "lac_sal_ctrl.h"
4278ee8d1cSJulian Grajkowski #include "lac_sym_alg_chain.h"
4378ee8d1cSJulian Grajkowski #include "lac_sym_cipher.h"
4478ee8d1cSJulian Grajkowski #include "lac_sym_cipher_defs.h"
4578ee8d1cSJulian Grajkowski #include "lac_sym_hash.h"
4678ee8d1cSJulian Grajkowski #include "lac_sym_hash_defs.h"
4778ee8d1cSJulian Grajkowski #include "lac_sym_qat_cipher.h"
4878ee8d1cSJulian Grajkowski #include "lac_sym_qat_hash.h"
4978ee8d1cSJulian Grajkowski #include "lac_sym_stats.h"
5078ee8d1cSJulian Grajkowski #include "lac_sym_queue.h"
5178ee8d1cSJulian Grajkowski #include "lac_sym_cb.h"
5278ee8d1cSJulian Grajkowski #include "sal_string_parse.h"
5378ee8d1cSJulian Grajkowski #include "lac_sym_auth_enc.h"
5478ee8d1cSJulian Grajkowski #include "lac_sym_qat.h"
55a977168cSMichal Gulbicki #include "sal_hw_gen.h"
5678ee8d1cSJulian Grajkowski 
5778ee8d1cSJulian Grajkowski /**
5878ee8d1cSJulian Grajkowski  * @ingroup LacAlgChain
5978ee8d1cSJulian Grajkowski  * This callback function will be invoked whenever a hash precompute
6078ee8d1cSJulian Grajkowski  * operation completes.  It will dequeue and send any QAT requests
6178ee8d1cSJulian Grajkowski  * which were queued up while the precompute was in progress.
6278ee8d1cSJulian Grajkowski  *
6378ee8d1cSJulian Grajkowski  * @param[in] callbackTag  Opaque value provided by user. This will
6478ee8d1cSJulian Grajkowski  *                         be a pointer to the session descriptor.
6578ee8d1cSJulian Grajkowski  *
6678ee8d1cSJulian Grajkowski  * @retval
6778ee8d1cSJulian Grajkowski  *     None
6878ee8d1cSJulian Grajkowski  *
6978ee8d1cSJulian Grajkowski  */
7078ee8d1cSJulian Grajkowski static void
LacSymAlgChain_HashPrecomputeDoneCb(void * callbackTag)7178ee8d1cSJulian Grajkowski LacSymAlgChain_HashPrecomputeDoneCb(void *callbackTag)
7278ee8d1cSJulian Grajkowski {
7378ee8d1cSJulian Grajkowski 	LacSymCb_PendingReqsDequeue((lac_session_desc_t *)callbackTag);
7478ee8d1cSJulian Grajkowski }
7578ee8d1cSJulian Grajkowski 
7678ee8d1cSJulian Grajkowski /**
7778ee8d1cSJulian Grajkowski  * @ingroup LacAlgChain
7878ee8d1cSJulian Grajkowski  * Walk the buffer list and find the address for the given offset within
7978ee8d1cSJulian Grajkowski  * a buffer.
8078ee8d1cSJulian Grajkowski  *
8178ee8d1cSJulian Grajkowski  * @param[in] pBufferList   Buffer List
8278ee8d1cSJulian Grajkowski  * @param[in] packetOffset  Offset in the buffer list for which address
8378ee8d1cSJulian Grajkowski  *                          is to be found.
8478ee8d1cSJulian Grajkowski  * @param[out] ppDataPtr    This is where the sought pointer will be put
8578ee8d1cSJulian Grajkowski  * @param[out] pSpaceLeft   Pointer to a variable in which information about
8678ee8d1cSJulian Grajkowski  *                          available space from the given offset to the end
8778ee8d1cSJulian Grajkowski  *                          of the flat buffer it is located in will be returned
8878ee8d1cSJulian Grajkowski  *
8978ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_SUCCESS Address with a given offset is found in the list
9078ee8d1cSJulian Grajkowski  * @retval CPA_STATUS_FAIL    Address with a given offset not found in the list.
9178ee8d1cSJulian Grajkowski  *
9278ee8d1cSJulian Grajkowski  */
9378ee8d1cSJulian Grajkowski static CpaStatus
LacSymAlgChain_PtrFromOffsetGet(const CpaBufferList * pBufferList,const Cpa32U packetOffset,Cpa8U ** ppDataPtr)9478ee8d1cSJulian Grajkowski LacSymAlgChain_PtrFromOffsetGet(const CpaBufferList *pBufferList,
9578ee8d1cSJulian Grajkowski 				const Cpa32U packetOffset,
9678ee8d1cSJulian Grajkowski 				Cpa8U **ppDataPtr)
9778ee8d1cSJulian Grajkowski {
9878ee8d1cSJulian Grajkowski 	Cpa32U currentOffset = 0;
9978ee8d1cSJulian Grajkowski 	Cpa32U i = 0;
10078ee8d1cSJulian Grajkowski 
10178ee8d1cSJulian Grajkowski 	for (i = 0; i < pBufferList->numBuffers; i++) {
10278ee8d1cSJulian Grajkowski 		Cpa8U *pCurrData = pBufferList->pBuffers[i].pData;
10378ee8d1cSJulian Grajkowski 		Cpa32U currDataSize = pBufferList->pBuffers[i].dataLenInBytes;
10478ee8d1cSJulian Grajkowski 
10578ee8d1cSJulian Grajkowski 		/* If the offset is within the address space of the current
10678ee8d1cSJulian Grajkowski 		 * buffer */
10778ee8d1cSJulian Grajkowski 		if ((packetOffset >= currentOffset) &&
10878ee8d1cSJulian Grajkowski 		    (packetOffset < (currentOffset + currDataSize))) {
10978ee8d1cSJulian Grajkowski 			/* increment by offset of the address in the current
11078ee8d1cSJulian Grajkowski 			 * buffer */
11178ee8d1cSJulian Grajkowski 			*ppDataPtr = pCurrData + (packetOffset - currentOffset);
11278ee8d1cSJulian Grajkowski 			return CPA_STATUS_SUCCESS;
11378ee8d1cSJulian Grajkowski 		}
11478ee8d1cSJulian Grajkowski 
11578ee8d1cSJulian Grajkowski 		/* Increment by the size of the buffer */
11678ee8d1cSJulian Grajkowski 		currentOffset += currDataSize;
11778ee8d1cSJulian Grajkowski 	}
11878ee8d1cSJulian Grajkowski 
11978ee8d1cSJulian Grajkowski 	return CPA_STATUS_FAIL;
12078ee8d1cSJulian Grajkowski }
12178ee8d1cSJulian Grajkowski 
122a977168cSMichal Gulbicki /**
123a977168cSMichal Gulbicki  * @ingroup LacAlgChain
124a977168cSMichal Gulbicki  * Function which checks for support of partial packets for symmetric
125a977168cSMichal Gulbicki  * crypto operations
126a977168cSMichal Gulbicki  *
127a977168cSMichal Gulbicki  * @param[in] pService            Pointer to service descriptor
128a977168cSMichal Gulbicki  * @param[in/out] pSessionDesc    Pointer to session descriptor
129a977168cSMichal Gulbicki  *
130a977168cSMichal Gulbicki  */
131a977168cSMichal Gulbicki static void
LacSymCheck_IsPartialSupported(Cpa32U capabilitiesMask,lac_session_desc_t * pSessionDesc)132a977168cSMichal Gulbicki LacSymCheck_IsPartialSupported(Cpa32U capabilitiesMask,
133a977168cSMichal Gulbicki 			       lac_session_desc_t *pSessionDesc)
134a977168cSMichal Gulbicki {
135a977168cSMichal Gulbicki 	CpaBoolean isHashPartialSupported = CPA_FALSE;
136a977168cSMichal Gulbicki 	CpaBoolean isCipherPartialSupported = CPA_FALSE;
137a977168cSMichal Gulbicki 	CpaBoolean isPartialSupported = CPA_FALSE;
138a977168cSMichal Gulbicki 
139a977168cSMichal Gulbicki 	switch (pSessionDesc->cipherAlgorithm) {
140a977168cSMichal Gulbicki 	/* Following ciphers don't support partial */
141a977168cSMichal Gulbicki 	case CPA_CY_SYM_CIPHER_KASUMI_F8:
142a977168cSMichal Gulbicki 	case CPA_CY_SYM_CIPHER_AES_F8:
143a977168cSMichal Gulbicki 	case CPA_CY_SYM_CIPHER_SNOW3G_UEA2:
144a977168cSMichal Gulbicki 	case CPA_CY_SYM_CIPHER_CHACHA:
145a977168cSMichal Gulbicki 	case CPA_CY_SYM_CIPHER_ZUC_EEA3:
146a977168cSMichal Gulbicki 		break;
147a977168cSMichal Gulbicki 	/* All others support partial */
148a977168cSMichal Gulbicki 	default:
149a977168cSMichal Gulbicki 		isCipherPartialSupported = CPA_TRUE;
150a977168cSMichal Gulbicki 		break;
151a977168cSMichal Gulbicki 	}
152a977168cSMichal Gulbicki 	switch (pSessionDesc->hashAlgorithm) {
153a977168cSMichal Gulbicki 	/* Following hash don't support partial */
154a977168cSMichal Gulbicki 	case CPA_CY_SYM_HASH_KASUMI_F9:
155a977168cSMichal Gulbicki 	case CPA_CY_SYM_HASH_SNOW3G_UIA2:
156a977168cSMichal Gulbicki 	case CPA_CY_SYM_HASH_POLY:
157a977168cSMichal Gulbicki 	case CPA_CY_SYM_HASH_ZUC_EIA3:
158a977168cSMichal Gulbicki 		break;
159a977168cSMichal Gulbicki 	/* Following hash may support partial based on device capabilities */
160a977168cSMichal Gulbicki 	case CPA_CY_SYM_HASH_SHA3_256:
161a977168cSMichal Gulbicki 		if (ICP_ACCEL_CAPABILITIES_SHA3_EXT & capabilitiesMask) {
162a977168cSMichal Gulbicki 			isHashPartialSupported = CPA_TRUE;
163a977168cSMichal Gulbicki 		}
164a977168cSMichal Gulbicki 		break;
165a977168cSMichal Gulbicki 	/* All others support partial */
166a977168cSMichal Gulbicki 	default:
167a977168cSMichal Gulbicki 		isHashPartialSupported = CPA_TRUE;
168a977168cSMichal Gulbicki 		break;
169a977168cSMichal Gulbicki 	}
170a977168cSMichal Gulbicki 	switch (pSessionDesc->symOperation) {
171a977168cSMichal Gulbicki 	case CPA_CY_SYM_OP_CIPHER:
172a977168cSMichal Gulbicki 		isPartialSupported = isCipherPartialSupported;
173a977168cSMichal Gulbicki 		break;
174a977168cSMichal Gulbicki 	case CPA_CY_SYM_OP_HASH:
175a977168cSMichal Gulbicki 		isPartialSupported = isHashPartialSupported;
176a977168cSMichal Gulbicki 		break;
177a977168cSMichal Gulbicki 	case CPA_CY_SYM_OP_ALGORITHM_CHAINING:
178a977168cSMichal Gulbicki 		if (isCipherPartialSupported && isHashPartialSupported) {
179a977168cSMichal Gulbicki 			isPartialSupported = CPA_TRUE;
180a977168cSMichal Gulbicki 		}
181a977168cSMichal Gulbicki 		break;
182a977168cSMichal Gulbicki 	case CPA_CY_SYM_OP_NONE:
183a977168cSMichal Gulbicki 		break;
184a977168cSMichal Gulbicki 	default:
185a977168cSMichal Gulbicki 		break;
186a977168cSMichal Gulbicki 	}
187a977168cSMichal Gulbicki 
188a977168cSMichal Gulbicki 	if (ICP_QAT_FW_LA_USE_UCS_SLICE_TYPE == pSessionDesc->cipherSliceType) {
189a977168cSMichal Gulbicki 		/* UCS slice has no support for state flush and
190a977168cSMichal Gulbicki 		 * because of that is not able to do partial processing */
191a977168cSMichal Gulbicki 		isPartialSupported = CPA_FALSE;
192a977168cSMichal Gulbicki 	}
193a977168cSMichal Gulbicki 
194a977168cSMichal Gulbicki 	pSessionDesc->isPartialSupported = isPartialSupported;
195a977168cSMichal Gulbicki }
196a977168cSMichal Gulbicki 
197a977168cSMichal Gulbicki static void
LacAlgChain_CipherCDBuild_ForOptimisedCD(const CpaCySymCipherSetupData * pCipherData,lac_session_desc_t * pSessionDesc,icp_qat_fw_slice_t nextSlice,Cpa8U cipherOffsetInConstantsTable,Cpa8U * pOptimisedHwBlockBaseInDRAM,Cpa32U * pOptimisedHwBlockOffsetInDRAM)198a977168cSMichal Gulbicki LacAlgChain_CipherCDBuild_ForOptimisedCD(
199a977168cSMichal Gulbicki     const CpaCySymCipherSetupData *pCipherData,
200a977168cSMichal Gulbicki     lac_session_desc_t *pSessionDesc,
201a977168cSMichal Gulbicki     icp_qat_fw_slice_t nextSlice,
202a977168cSMichal Gulbicki     Cpa8U cipherOffsetInConstantsTable,
203a977168cSMichal Gulbicki     Cpa8U *pOptimisedHwBlockBaseInDRAM,
204a977168cSMichal Gulbicki     Cpa32U *pOptimisedHwBlockOffsetInDRAM)
205a977168cSMichal Gulbicki {
206a977168cSMichal Gulbicki 	Cpa8U *pCipherKeyField = NULL;
207a977168cSMichal Gulbicki 	Cpa32U sizeInBytes = 0;
208a977168cSMichal Gulbicki 	pCipherKeyField = pOptimisedHwBlockBaseInDRAM;
209a977168cSMichal Gulbicki 
210a977168cSMichal Gulbicki 	/* Need to build up the alternative CD for SHRAM Constants Table use
211a977168cSMichal Gulbicki 	 * with an optimised content desc of 64 bytes for this case. Cipher key
212a977168cSMichal Gulbicki 	 * will be in the Content desc in DRAM, The cipher config data
213a977168cSMichal Gulbicki 	 * is now in the SHRAM constants table. */
214a977168cSMichal Gulbicki 
215a977168cSMichal Gulbicki 	LacSymQat_CipherHwBlockPopulateKeySetup(
216a977168cSMichal Gulbicki 	    pSessionDesc,
217a977168cSMichal Gulbicki 	    pCipherData,
218a977168cSMichal Gulbicki 	    pCipherData->cipherKeyLenInBytes,
219a977168cSMichal Gulbicki 	    pSessionDesc->cipherSliceType,
220a977168cSMichal Gulbicki 	    pCipherKeyField,
221a977168cSMichal Gulbicki 	    &sizeInBytes);
222a977168cSMichal Gulbicki 
223a977168cSMichal Gulbicki 	LacSymQat_CipherCtrlBlockWrite(&(pSessionDesc->shramReqCacheFtr),
224a977168cSMichal Gulbicki 				       pSessionDesc->cipherAlgorithm,
225a977168cSMichal Gulbicki 				       pSessionDesc->cipherKeyLenInBytes,
226a977168cSMichal Gulbicki 				       pSessionDesc->cipherSliceType,
227a977168cSMichal Gulbicki 				       nextSlice,
228a977168cSMichal Gulbicki 				       cipherOffsetInConstantsTable);
229a977168cSMichal Gulbicki 
230a977168cSMichal Gulbicki 	*pOptimisedHwBlockOffsetInDRAM += sizeInBytes;
231a977168cSMichal Gulbicki }
232a977168cSMichal Gulbicki 
233a977168cSMichal Gulbicki static void
LacAlgChain_CipherCDBuild_ForSHRAM(const CpaCySymCipherSetupData * pCipherData,lac_session_desc_t * pSessionDesc,icp_qat_fw_slice_t nextSlice,Cpa8U cipherOffsetInConstantsTable)234a977168cSMichal Gulbicki LacAlgChain_CipherCDBuild_ForSHRAM(const CpaCySymCipherSetupData *pCipherData,
235a977168cSMichal Gulbicki 				   lac_session_desc_t *pSessionDesc,
236a977168cSMichal Gulbicki 				   icp_qat_fw_slice_t nextSlice,
237a977168cSMichal Gulbicki 				   Cpa8U cipherOffsetInConstantsTable)
238a977168cSMichal Gulbicki {
239a977168cSMichal Gulbicki 	Cpa32U sizeInBytes = 0;
240a977168cSMichal Gulbicki 	Cpa8U *pCipherKeyField = NULL;
241a977168cSMichal Gulbicki 	/* Need to build up the alternative CD for SHRAM Constants Table use
242a977168cSMichal Gulbicki 	 * Cipher key will be in the Request, The cipher config data is now in
243a977168cSMichal Gulbicki 	 * the SHRAM constants table. And nothing is now stored in the content
244a977168cSMichal Gulbicki 	 * desc */
245a977168cSMichal Gulbicki 	pCipherKeyField = (Cpa8U *)&(
246a977168cSMichal Gulbicki 	    pSessionDesc->shramReqCacheHdr.cd_pars.s1.serv_specif_fields);
247a977168cSMichal Gulbicki 
248a977168cSMichal Gulbicki 	LacSymQat_CipherHwBlockPopulateKeySetup(
249a977168cSMichal Gulbicki 	    pSessionDesc,
250a977168cSMichal Gulbicki 	    pCipherData,
251a977168cSMichal Gulbicki 	    pCipherData->cipherKeyLenInBytes,
252a977168cSMichal Gulbicki 	    pSessionDesc->cipherSliceType,
253a977168cSMichal Gulbicki 	    pCipherKeyField,
254a977168cSMichal Gulbicki 	    &sizeInBytes);
255a977168cSMichal Gulbicki 
256a977168cSMichal Gulbicki 	LacSymQat_CipherCtrlBlockWrite(&(pSessionDesc->shramReqCacheFtr),
257a977168cSMichal Gulbicki 				       pSessionDesc->cipherAlgorithm,
258a977168cSMichal Gulbicki 				       pSessionDesc->cipherKeyLenInBytes,
259a977168cSMichal Gulbicki 				       pSessionDesc->cipherSliceType,
260a977168cSMichal Gulbicki 				       nextSlice,
261a977168cSMichal Gulbicki 				       cipherOffsetInConstantsTable);
262a977168cSMichal Gulbicki }
263a977168cSMichal Gulbicki 
26478ee8d1cSJulian Grajkowski static void
LacAlgChain_CipherCDBuild(const CpaCySymCipherSetupData * pCipherData,lac_session_desc_t * pSessionDesc,icp_qat_fw_slice_t nextSlice,Cpa8U cipherOffsetInConstantsTable,icp_qat_fw_comn_flags * pCmnRequestFlags,icp_qat_fw_serv_specif_flags * pLaCmdFlags,Cpa8U * pHwBlockBaseInDRAM,Cpa32U * pHwBlockOffsetInDRAM,Cpa32U capabilitiesMask)26578ee8d1cSJulian Grajkowski LacAlgChain_CipherCDBuild(const CpaCySymCipherSetupData *pCipherData,
26678ee8d1cSJulian Grajkowski 			  lac_session_desc_t *pSessionDesc,
26778ee8d1cSJulian Grajkowski 			  icp_qat_fw_slice_t nextSlice,
26878ee8d1cSJulian Grajkowski 			  Cpa8U cipherOffsetInConstantsTable,
26978ee8d1cSJulian Grajkowski 			  icp_qat_fw_comn_flags *pCmnRequestFlags,
27078ee8d1cSJulian Grajkowski 			  icp_qat_fw_serv_specif_flags *pLaCmdFlags,
27178ee8d1cSJulian Grajkowski 			  Cpa8U *pHwBlockBaseInDRAM,
272a977168cSMichal Gulbicki 			  Cpa32U *pHwBlockOffsetInDRAM,
273a977168cSMichal Gulbicki 			  Cpa32U capabilitiesMask)
27478ee8d1cSJulian Grajkowski {
27578ee8d1cSJulian Grajkowski 	Cpa8U *pCipherKeyField = NULL;
27678ee8d1cSJulian Grajkowski 	Cpa8U cipherOffsetInReqQW = 0;
27778ee8d1cSJulian Grajkowski 	Cpa32U sizeInBytes = 0;
278a977168cSMichal Gulbicki 	void *pCfgData = NULL;
279a977168cSMichal Gulbicki 	Cpa32U cfgOffset = 0;
28078ee8d1cSJulian Grajkowski 
28178ee8d1cSJulian Grajkowski 	/* Construct the ContentDescriptor in DRAM */
28278ee8d1cSJulian Grajkowski 	cipherOffsetInReqQW = (*pHwBlockOffsetInDRAM / LAC_QUAD_WORD_IN_BYTES);
28378ee8d1cSJulian Grajkowski 	ICP_QAT_FW_LA_CIPH_AUTH_CFG_OFFSET_FLAG_SET(
28478ee8d1cSJulian Grajkowski 	    *pLaCmdFlags, ICP_QAT_FW_CIPH_AUTH_CFG_OFFSET_IN_CD_SETUP);
28578ee8d1cSJulian Grajkowski 
28678ee8d1cSJulian Grajkowski 	/* construct cipherConfig in CD in DRAM */
287a977168cSMichal Gulbicki 	cfgOffset = *pHwBlockOffsetInDRAM;
288a977168cSMichal Gulbicki 	pCfgData = pHwBlockBaseInDRAM + cfgOffset;
28978ee8d1cSJulian Grajkowski 	LacSymQat_CipherHwBlockPopulateCfgData(pSessionDesc,
290a977168cSMichal Gulbicki 					       pCfgData,
29178ee8d1cSJulian Grajkowski 					       &sizeInBytes);
29278ee8d1cSJulian Grajkowski 
293a977168cSMichal Gulbicki 	ICP_QAT_FW_LA_SLICE_TYPE_SET(*pLaCmdFlags,
294a977168cSMichal Gulbicki 				     pSessionDesc->cipherSliceType);
295a977168cSMichal Gulbicki 
29678ee8d1cSJulian Grajkowski 	*pHwBlockOffsetInDRAM += sizeInBytes;
29778ee8d1cSJulian Grajkowski 
29878ee8d1cSJulian Grajkowski 	/* Cipher key will be in CD in DRAM.
29978ee8d1cSJulian Grajkowski 	 * The Request contains a ptr to the CD.
30078ee8d1cSJulian Grajkowski 	 * This ptr will be copied into the request later once the CD is
30178ee8d1cSJulian Grajkowski 	 * fully constructed, but the flag is set here.  */
30278ee8d1cSJulian Grajkowski 	pCipherKeyField = pHwBlockBaseInDRAM + *pHwBlockOffsetInDRAM;
30378ee8d1cSJulian Grajkowski 	ICP_QAT_FW_COMN_CD_FLD_TYPE_SET(*pCmnRequestFlags,
30478ee8d1cSJulian Grajkowski 					QAT_COMN_CD_FLD_TYPE_64BIT_ADR);
30578ee8d1cSJulian Grajkowski 
30678ee8d1cSJulian Grajkowski 	LacSymQat_CipherHwBlockPopulateKeySetup(
307a977168cSMichal Gulbicki 	    pSessionDesc,
30878ee8d1cSJulian Grajkowski 	    pCipherData,
30978ee8d1cSJulian Grajkowski 	    pCipherData->cipherKeyLenInBytes,
310a977168cSMichal Gulbicki 	    pSessionDesc->cipherSliceType,
31178ee8d1cSJulian Grajkowski 	    pCipherKeyField,
31278ee8d1cSJulian Grajkowski 	    &sizeInBytes);
31378ee8d1cSJulian Grajkowski 	/* update offset */
31478ee8d1cSJulian Grajkowski 	*pHwBlockOffsetInDRAM += sizeInBytes;
31578ee8d1cSJulian Grajkowski 
31678ee8d1cSJulian Grajkowski 	LacSymQat_CipherCtrlBlockWrite(&(pSessionDesc->reqCacheFtr),
31778ee8d1cSJulian Grajkowski 				       pSessionDesc->cipherAlgorithm,
31878ee8d1cSJulian Grajkowski 				       pSessionDesc->cipherKeyLenInBytes,
319a977168cSMichal Gulbicki 				       pSessionDesc->cipherSliceType,
32078ee8d1cSJulian Grajkowski 				       nextSlice,
32178ee8d1cSJulian Grajkowski 				       cipherOffsetInReqQW);
322a977168cSMichal Gulbicki 	if (NON_SPC != pSessionDesc->singlePassState) {
32378ee8d1cSJulian Grajkowski 		LacSymQat_CipherCtrlBlockWrite(
32478ee8d1cSJulian Grajkowski 		    &(pSessionDesc->reqSpcCacheFtr),
32578ee8d1cSJulian Grajkowski 		    pSessionDesc->cipherAlgorithm,
32678ee8d1cSJulian Grajkowski 		    pSessionDesc->cipherKeyLenInBytes,
327a977168cSMichal Gulbicki 		    pSessionDesc->cipherSliceType,
32878ee8d1cSJulian Grajkowski 		    ICP_QAT_FW_SLICE_DRAM_WR,
32978ee8d1cSJulian Grajkowski 		    cipherOffsetInReqQW);
33078ee8d1cSJulian Grajkowski 	}
33178ee8d1cSJulian Grajkowski }
33278ee8d1cSJulian Grajkowski 
33378ee8d1cSJulian Grajkowski static void
LacAlgChain_HashCDBuild(const CpaCySymHashSetupData * pHashData,CpaInstanceHandle instanceHandle,lac_session_desc_t * pSessionDesc,icp_qat_fw_slice_t nextSlice,Cpa8U hashOffsetInConstantsTable,icp_qat_fw_comn_flags * pCmnRequestFlags,icp_qat_fw_serv_specif_flags * pLaCmdFlags,lac_sym_qat_hash_precompute_info_t * pPrecomputeData,lac_sym_qat_hash_precompute_info_t * pPrecomputeDataOptimisedCd,Cpa8U * pHwBlockBaseInDRAM,Cpa32U * pHwBlockOffsetInDRAM,Cpa8U * pOptimisedHwBlockBaseInDRAM,Cpa32U * pOptimisedHwBlockOffsetInDRAM)33478ee8d1cSJulian Grajkowski LacAlgChain_HashCDBuild(
33578ee8d1cSJulian Grajkowski     const CpaCySymHashSetupData *pHashData,
33678ee8d1cSJulian Grajkowski     CpaInstanceHandle instanceHandle,
33778ee8d1cSJulian Grajkowski     lac_session_desc_t *pSessionDesc,
33878ee8d1cSJulian Grajkowski     icp_qat_fw_slice_t nextSlice,
33978ee8d1cSJulian Grajkowski     Cpa8U hashOffsetInConstantsTable,
34078ee8d1cSJulian Grajkowski     icp_qat_fw_comn_flags *pCmnRequestFlags,
34178ee8d1cSJulian Grajkowski     icp_qat_fw_serv_specif_flags *pLaCmdFlags,
34278ee8d1cSJulian Grajkowski     lac_sym_qat_hash_precompute_info_t *pPrecomputeData,
34378ee8d1cSJulian Grajkowski     lac_sym_qat_hash_precompute_info_t *pPrecomputeDataOptimisedCd,
34478ee8d1cSJulian Grajkowski     Cpa8U *pHwBlockBaseInDRAM,
34578ee8d1cSJulian Grajkowski     Cpa32U *pHwBlockOffsetInDRAM,
34678ee8d1cSJulian Grajkowski     Cpa8U *pOptimisedHwBlockBaseInDRAM,
34778ee8d1cSJulian Grajkowski     Cpa32U *pOptimisedHwBlockOffsetInDRAM)
34878ee8d1cSJulian Grajkowski {
34978ee8d1cSJulian Grajkowski 	Cpa32U sizeInBytes = 0;
35078ee8d1cSJulian Grajkowski 	Cpa32U hwBlockOffsetInQuadWords =
35178ee8d1cSJulian Grajkowski 	    *pHwBlockOffsetInDRAM / LAC_QUAD_WORD_IN_BYTES;
35278ee8d1cSJulian Grajkowski 
35378ee8d1cSJulian Grajkowski 	/* build:
35478ee8d1cSJulian Grajkowski 	 * - the hash part of the ContentDescriptor in DRAM */
35578ee8d1cSJulian Grajkowski 	/* - the hash part of the CD control block in the Request template */
35678ee8d1cSJulian Grajkowski 	LacSymQat_HashContentDescInit(&(pSessionDesc->reqCacheFtr),
35778ee8d1cSJulian Grajkowski 				      instanceHandle,
35878ee8d1cSJulian Grajkowski 				      pHashData,
35978ee8d1cSJulian Grajkowski 				      pHwBlockBaseInDRAM,
36078ee8d1cSJulian Grajkowski 				      hwBlockOffsetInQuadWords,
36178ee8d1cSJulian Grajkowski 				      nextSlice,
36278ee8d1cSJulian Grajkowski 				      pSessionDesc->qatHashMode,
36378ee8d1cSJulian Grajkowski 				      CPA_FALSE,
36478ee8d1cSJulian Grajkowski 				      CPA_FALSE,
365a977168cSMichal Gulbicki 				      pSessionDesc->useStatefulSha3ContentDesc,
36678ee8d1cSJulian Grajkowski 				      pPrecomputeData,
36778ee8d1cSJulian Grajkowski 				      &sizeInBytes);
36878ee8d1cSJulian Grajkowski 
36978ee8d1cSJulian Grajkowski 	/* Using DRAM CD so update offset */
37078ee8d1cSJulian Grajkowski 	*pHwBlockOffsetInDRAM += sizeInBytes;
37178ee8d1cSJulian Grajkowski 
37278ee8d1cSJulian Grajkowski 	sizeInBytes = 0;
373a977168cSMichal Gulbicki 
374a977168cSMichal Gulbicki 	if (pSessionDesc->useOptimisedContentDesc) {
375a977168cSMichal Gulbicki 		LacSymQat_HashContentDescInit(&(pSessionDesc->shramReqCacheFtr),
376a977168cSMichal Gulbicki 					      instanceHandle,
377a977168cSMichal Gulbicki 					      pHashData,
378a977168cSMichal Gulbicki 					      pOptimisedHwBlockBaseInDRAM,
379a977168cSMichal Gulbicki 					      hashOffsetInConstantsTable,
380a977168cSMichal Gulbicki 					      nextSlice,
381a977168cSMichal Gulbicki 					      pSessionDesc->qatHashMode,
382a977168cSMichal Gulbicki 					      CPA_TRUE,
383a977168cSMichal Gulbicki 					      CPA_TRUE,
384a977168cSMichal Gulbicki 					      CPA_FALSE,
385a977168cSMichal Gulbicki 					      pPrecomputeDataOptimisedCd,
386a977168cSMichal Gulbicki 					      &sizeInBytes);
387a977168cSMichal Gulbicki 
388a977168cSMichal Gulbicki 		*pOptimisedHwBlockOffsetInDRAM += sizeInBytes;
389a977168cSMichal Gulbicki 	} else if (pSessionDesc->useSymConstantsTable) {
390a977168cSMichal Gulbicki 		/* Need to build up the alternative CD for SHRAM Constants Table
391a977168cSMichal Gulbicki 		 * use */
392a977168cSMichal Gulbicki 		LacSymQat_HashContentDescInit(&(pSessionDesc->shramReqCacheFtr),
393a977168cSMichal Gulbicki 					      instanceHandle,
394a977168cSMichal Gulbicki 					      pHashData,
395a977168cSMichal Gulbicki 					      pHwBlockBaseInDRAM,
396a977168cSMichal Gulbicki 					      hashOffsetInConstantsTable,
397a977168cSMichal Gulbicki 					      nextSlice,
398a977168cSMichal Gulbicki 					      pSessionDesc->qatHashMode,
399a977168cSMichal Gulbicki 					      CPA_TRUE,
400a977168cSMichal Gulbicki 					      CPA_FALSE,
401a977168cSMichal Gulbicki 					      CPA_FALSE,
402a977168cSMichal Gulbicki 					      pPrecomputeData,
403a977168cSMichal Gulbicki 					      &sizeInBytes);
404a977168cSMichal Gulbicki 	}
405a977168cSMichal Gulbicki }
406a977168cSMichal Gulbicki 
407a977168cSMichal Gulbicki static Cpa16U
LacAlgChain_GetCipherConfigSize(lac_session_desc_t * pSessionDesc)408a977168cSMichal Gulbicki LacAlgChain_GetCipherConfigSize(lac_session_desc_t *pSessionDesc)
409a977168cSMichal Gulbicki {
410a977168cSMichal Gulbicki 	if (ICP_QAT_FW_LA_USE_UCS_SLICE_TYPE == pSessionDesc->cipherSliceType) {
411a977168cSMichal Gulbicki 		return sizeof(icp_qat_hw_ucs_cipher_config_t);
412a977168cSMichal Gulbicki 	} else {
413a977168cSMichal Gulbicki 		return sizeof(icp_qat_hw_cipher_config_t);
414a977168cSMichal Gulbicki 	}
415a977168cSMichal Gulbicki }
416a977168cSMichal Gulbicki 
417a977168cSMichal Gulbicki static Cpa16U
LacAlgChain_GetCipherConfigOffset(lac_session_desc_t * pSessionDesc)418a977168cSMichal Gulbicki LacAlgChain_GetCipherConfigOffset(lac_session_desc_t *pSessionDesc)
419a977168cSMichal Gulbicki {
420a977168cSMichal Gulbicki 	Cpa16U offset = 0;
421a977168cSMichal Gulbicki 
422a977168cSMichal Gulbicki 	if (CPA_CY_SYM_OP_ALGORITHM_CHAINING == pSessionDesc->symOperation ||
423a977168cSMichal Gulbicki 	    SPC == pSessionDesc->singlePassState) {
424a977168cSMichal Gulbicki 		icp_qat_fw_cipher_auth_cd_ctrl_hdr_t *cd_ctrl =
425a977168cSMichal Gulbicki 		    (icp_qat_fw_cipher_auth_cd_ctrl_hdr_t *)&pSessionDesc
426a977168cSMichal Gulbicki 			->reqCacheFtr.cd_ctrl;
427a977168cSMichal Gulbicki 		offset = cd_ctrl->cipher_cfg_offset;
428a977168cSMichal Gulbicki 	} else if (CPA_CY_SYM_OP_CIPHER == pSessionDesc->symOperation) {
429a977168cSMichal Gulbicki 		icp_qat_fw_cipher_cd_ctrl_hdr_t *cd_ctrl =
430a977168cSMichal Gulbicki 		    (icp_qat_fw_cipher_cd_ctrl_hdr_t *)&pSessionDesc
431a977168cSMichal Gulbicki 			->reqCacheFtr.cd_ctrl;
432a977168cSMichal Gulbicki 		offset = cd_ctrl->cipher_cfg_offset;
433a977168cSMichal Gulbicki 	}
434a977168cSMichal Gulbicki 
435a977168cSMichal Gulbicki 	return offset * LAC_QUAD_WORD_IN_BYTES;
43678ee8d1cSJulian Grajkowski }
43778ee8d1cSJulian Grajkowski 
43878ee8d1cSJulian Grajkowski CpaStatus
LacAlgChain_SessionAADUpdate(lac_session_desc_t * pSessionDesc,Cpa32U newAADLength)43978ee8d1cSJulian Grajkowski LacAlgChain_SessionAADUpdate(lac_session_desc_t *pSessionDesc,
44078ee8d1cSJulian Grajkowski 			     Cpa32U newAADLength)
44178ee8d1cSJulian Grajkowski {
44278ee8d1cSJulian Grajkowski 	icp_qat_la_bulk_req_ftr_t *req_ftr = &pSessionDesc->reqCacheFtr;
44378ee8d1cSJulian Grajkowski 	icp_qat_la_auth_req_params_t *req_params = &req_ftr->serv_specif_rqpars;
44478ee8d1cSJulian Grajkowski 
44578ee8d1cSJulian Grajkowski 	if (!pSessionDesc)
44678ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
44778ee8d1cSJulian Grajkowski 
44878ee8d1cSJulian Grajkowski 	pSessionDesc->aadLenInBytes = newAADLength;
44978ee8d1cSJulian Grajkowski 	req_params->u2.aad_sz =
45078ee8d1cSJulian Grajkowski 	    LAC_ALIGN_POW2_ROUNDUP(newAADLength, LAC_HASH_AES_GCM_BLOCK_SIZE);
45178ee8d1cSJulian Grajkowski 
452a977168cSMichal Gulbicki 	if (SPC == pSessionDesc->singlePassState) {
45378ee8d1cSJulian Grajkowski 		Cpa8U *pHwBlockBaseInDRAM = NULL;
45478ee8d1cSJulian Grajkowski 		Cpa32U hwBlockOffsetInDRAM = 0;
45578ee8d1cSJulian Grajkowski 		Cpa32U pSizeInBytes = 0;
45678ee8d1cSJulian Grajkowski 		CpaCySymCipherAlgorithm cipher = pSessionDesc->cipherAlgorithm;
45778ee8d1cSJulian Grajkowski 
45878ee8d1cSJulian Grajkowski 		pHwBlockBaseInDRAM =
45978ee8d1cSJulian Grajkowski 		    (Cpa8U *)pSessionDesc->contentDescInfo.pData;
46078ee8d1cSJulian Grajkowski 		if (pSessionDesc->cipherDirection ==
46178ee8d1cSJulian Grajkowski 		    CPA_CY_SYM_CIPHER_DIRECTION_DECRYPT) {
46278ee8d1cSJulian Grajkowski 			if (LAC_CIPHER_IS_GCM(cipher)) {
46378ee8d1cSJulian Grajkowski 				hwBlockOffsetInDRAM = LAC_QUADWORDS_TO_BYTES(
464a977168cSMichal Gulbicki 				    LAC_SYM_QAT_CIPHER_GCM_SPC_OFFSET_IN_DRAM);
46578ee8d1cSJulian Grajkowski 			} else {
46678ee8d1cSJulian Grajkowski 				hwBlockOffsetInDRAM = LAC_QUADWORDS_TO_BYTES(
467a977168cSMichal Gulbicki 				    LAC_SYM_QAT_CIPHER_CHACHA_SPC_OFFSET_IN_DRAM);
46878ee8d1cSJulian Grajkowski 			}
46978ee8d1cSJulian Grajkowski 		}
47078ee8d1cSJulian Grajkowski 		LacSymQat_CipherHwBlockPopulateCfgData(pSessionDesc,
47178ee8d1cSJulian Grajkowski 						       pHwBlockBaseInDRAM +
47278ee8d1cSJulian Grajkowski 							   hwBlockOffsetInDRAM,
47378ee8d1cSJulian Grajkowski 						       &pSizeInBytes);
47478ee8d1cSJulian Grajkowski 	}
47578ee8d1cSJulian Grajkowski 
47678ee8d1cSJulian Grajkowski 	return CPA_STATUS_SUCCESS;
47778ee8d1cSJulian Grajkowski }
47878ee8d1cSJulian Grajkowski 
47978ee8d1cSJulian Grajkowski CpaStatus
LacAlgChain_SessionCipherKeyUpdate(lac_session_desc_t * pSessionDesc,Cpa8U * pCipherKey)48078ee8d1cSJulian Grajkowski LacAlgChain_SessionCipherKeyUpdate(lac_session_desc_t *pSessionDesc,
48178ee8d1cSJulian Grajkowski 				   Cpa8U *pCipherKey)
48278ee8d1cSJulian Grajkowski {
48378ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
48478ee8d1cSJulian Grajkowski 
48578ee8d1cSJulian Grajkowski 	if (pSessionDesc == NULL || pCipherKey == NULL)
48678ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
48778ee8d1cSJulian Grajkowski 
48878ee8d1cSJulian Grajkowski 	if (LAC_CIPHER_IS_ARC4(pSessionDesc->cipherAlgorithm)) {
48978ee8d1cSJulian Grajkowski 		LacSymQat_CipherArc4StateInit(
49078ee8d1cSJulian Grajkowski 		    pCipherKey,
49178ee8d1cSJulian Grajkowski 		    pSessionDesc->cipherKeyLenInBytes,
49278ee8d1cSJulian Grajkowski 		    pSessionDesc->cipherARC4InitialState);
49378ee8d1cSJulian Grajkowski 	} else {
49478ee8d1cSJulian Grajkowski 		CpaCySymCipherSetupData cipherSetupData = { 0 };
49578ee8d1cSJulian Grajkowski 		Cpa32U sizeInBytes;
49678ee8d1cSJulian Grajkowski 		Cpa8U *pCipherKeyField;
497a977168cSMichal Gulbicki 		Cpa16U cipherConfigSize;
498a977168cSMichal Gulbicki 		Cpa16U cipherConfigOffset;
49978ee8d1cSJulian Grajkowski 		sal_qat_content_desc_info_t *pCdInfo =
50078ee8d1cSJulian Grajkowski 		    &(pSessionDesc->contentDescInfo);
50178ee8d1cSJulian Grajkowski 
50278ee8d1cSJulian Grajkowski 		cipherSetupData.cipherAlgorithm = pSessionDesc->cipherAlgorithm;
50378ee8d1cSJulian Grajkowski 		cipherSetupData.cipherKeyLenInBytes =
50478ee8d1cSJulian Grajkowski 		    pSessionDesc->cipherKeyLenInBytes;
50578ee8d1cSJulian Grajkowski 		cipherSetupData.pCipherKey = pCipherKey;
506a977168cSMichal Gulbicki 		cipherSetupData.cipherDirection = pSessionDesc->cipherDirection;
507a977168cSMichal Gulbicki 
508a977168cSMichal Gulbicki 		cipherConfigSize =
509a977168cSMichal Gulbicki 		    LacAlgChain_GetCipherConfigSize(pSessionDesc);
510a977168cSMichal Gulbicki 		cipherConfigOffset =
511a977168cSMichal Gulbicki 		    LacAlgChain_GetCipherConfigOffset(pSessionDesc);
512a977168cSMichal Gulbicki 
513a977168cSMichal Gulbicki 		pCipherKeyField = (Cpa8U *)pCdInfo->pData + cipherConfigOffset +
514a977168cSMichal Gulbicki 		    cipherConfigSize;
51578ee8d1cSJulian Grajkowski 
51678ee8d1cSJulian Grajkowski 		switch (pSessionDesc->symOperation) {
51778ee8d1cSJulian Grajkowski 		case CPA_CY_SYM_OP_CIPHER: {
51878ee8d1cSJulian Grajkowski 			LacSymQat_CipherHwBlockPopulateKeySetup(
519a977168cSMichal Gulbicki 			    pSessionDesc,
52078ee8d1cSJulian Grajkowski 			    &(cipherSetupData),
52178ee8d1cSJulian Grajkowski 			    cipherSetupData.cipherKeyLenInBytes,
522a977168cSMichal Gulbicki 			    pSessionDesc->cipherSliceType,
52378ee8d1cSJulian Grajkowski 			    pCipherKeyField,
52478ee8d1cSJulian Grajkowski 			    &sizeInBytes);
52578ee8d1cSJulian Grajkowski 
52678ee8d1cSJulian Grajkowski 			if (pSessionDesc->useSymConstantsTable) {
52778ee8d1cSJulian Grajkowski 				pCipherKeyField = (Cpa8U *)&(
52878ee8d1cSJulian Grajkowski 				    pSessionDesc->shramReqCacheHdr.cd_pars.s1
52978ee8d1cSJulian Grajkowski 					.serv_specif_fields);
53078ee8d1cSJulian Grajkowski 
53178ee8d1cSJulian Grajkowski 				LacSymQat_CipherHwBlockPopulateKeySetup(
532a977168cSMichal Gulbicki 				    pSessionDesc,
53378ee8d1cSJulian Grajkowski 				    &(cipherSetupData),
53478ee8d1cSJulian Grajkowski 				    cipherSetupData.cipherKeyLenInBytes,
535a977168cSMichal Gulbicki 				    pSessionDesc->cipherSliceType,
53678ee8d1cSJulian Grajkowski 				    pCipherKeyField,
53778ee8d1cSJulian Grajkowski 				    &sizeInBytes);
53878ee8d1cSJulian Grajkowski 			}
53978ee8d1cSJulian Grajkowski 		} break;
54078ee8d1cSJulian Grajkowski 
54178ee8d1cSJulian Grajkowski 		case CPA_CY_SYM_OP_ALGORITHM_CHAINING: {
54278ee8d1cSJulian Grajkowski 			LacSymQat_CipherHwBlockPopulateKeySetup(
543a977168cSMichal Gulbicki 			    pSessionDesc,
54478ee8d1cSJulian Grajkowski 			    &(cipherSetupData),
54578ee8d1cSJulian Grajkowski 			    cipherSetupData.cipherKeyLenInBytes,
546a977168cSMichal Gulbicki 			    pSessionDesc->cipherSliceType,
54778ee8d1cSJulian Grajkowski 			    pCipherKeyField,
54878ee8d1cSJulian Grajkowski 			    &sizeInBytes);
54978ee8d1cSJulian Grajkowski 		} break;
55078ee8d1cSJulian Grajkowski 
55178ee8d1cSJulian Grajkowski 		default:
55278ee8d1cSJulian Grajkowski 			LAC_LOG_ERROR("Invalid sym operation\n");
55378ee8d1cSJulian Grajkowski 			status = CPA_STATUS_INVALID_PARAM;
55478ee8d1cSJulian Grajkowski 			break;
55578ee8d1cSJulian Grajkowski 		}
55678ee8d1cSJulian Grajkowski 	}
55778ee8d1cSJulian Grajkowski 	return status;
55878ee8d1cSJulian Grajkowski }
55978ee8d1cSJulian Grajkowski 
56078ee8d1cSJulian Grajkowski CpaStatus
LacAlgChain_SessionAuthKeyUpdate(lac_session_desc_t * pSessionDesc,Cpa8U * pAuthKey)56178ee8d1cSJulian Grajkowski LacAlgChain_SessionAuthKeyUpdate(lac_session_desc_t *pSessionDesc,
56278ee8d1cSJulian Grajkowski 				 Cpa8U *pAuthKey)
56378ee8d1cSJulian Grajkowski {
56478ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
56578ee8d1cSJulian Grajkowski 	Cpa8U *pHwBlockBaseInDRAM = NULL;
56678ee8d1cSJulian Grajkowski 	Cpa8U *pOutHashSetup = NULL;
56778ee8d1cSJulian Grajkowski 	Cpa8U *pInnerState1 = NULL;
56878ee8d1cSJulian Grajkowski 	Cpa8U *pInnerState2 = NULL;
56978ee8d1cSJulian Grajkowski 	CpaCySymSessionSetupData sessionSetup = { 0 };
570a977168cSMichal Gulbicki 	Cpa16U cipherConfigSize;
57178ee8d1cSJulian Grajkowski 
57278ee8d1cSJulian Grajkowski 	if (pSessionDesc == NULL || pAuthKey == NULL)
57378ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
57478ee8d1cSJulian Grajkowski 
575a977168cSMichal Gulbicki 	cipherConfigSize = LacAlgChain_GetCipherConfigSize(pSessionDesc);
576a977168cSMichal Gulbicki 
57778ee8d1cSJulian Grajkowski 	icp_qat_fw_cipher_auth_cd_ctrl_hdr_t *cd_ctrl =
57878ee8d1cSJulian Grajkowski 	    (icp_qat_fw_cipher_auth_cd_ctrl_hdr_t *)&pSessionDesc->reqCacheFtr
57978ee8d1cSJulian Grajkowski 		.cd_ctrl;
58078ee8d1cSJulian Grajkowski 
58178ee8d1cSJulian Grajkowski 	pHwBlockBaseInDRAM = (Cpa8U *)pSessionDesc->contentDescInfo.pData;
58278ee8d1cSJulian Grajkowski 
58378ee8d1cSJulian Grajkowski 	sessionSetup.hashSetupData.hashAlgorithm = pSessionDesc->hashAlgorithm;
58478ee8d1cSJulian Grajkowski 	sessionSetup.hashSetupData.hashMode = pSessionDesc->hashMode;
58578ee8d1cSJulian Grajkowski 	sessionSetup.hashSetupData.authModeSetupData.authKey = pAuthKey;
58678ee8d1cSJulian Grajkowski 	sessionSetup.hashSetupData.authModeSetupData.authKeyLenInBytes =
58778ee8d1cSJulian Grajkowski 	    pSessionDesc->authKeyLenInBytes;
58878ee8d1cSJulian Grajkowski 	sessionSetup.hashSetupData.authModeSetupData.aadLenInBytes =
58978ee8d1cSJulian Grajkowski 	    pSessionDesc->aadLenInBytes;
59078ee8d1cSJulian Grajkowski 	sessionSetup.hashSetupData.digestResultLenInBytes =
59178ee8d1cSJulian Grajkowski 	    pSessionDesc->hashResultSize;
59278ee8d1cSJulian Grajkowski 
59378ee8d1cSJulian Grajkowski 	sessionSetup.cipherSetupData.cipherAlgorithm =
59478ee8d1cSJulian Grajkowski 	    pSessionDesc->cipherAlgorithm;
59578ee8d1cSJulian Grajkowski 	sessionSetup.cipherSetupData.cipherKeyLenInBytes =
59678ee8d1cSJulian Grajkowski 	    pSessionDesc->cipherKeyLenInBytes;
59778ee8d1cSJulian Grajkowski 
59878ee8d1cSJulian Grajkowski 	/* Calculate hash states offsets */
59978ee8d1cSJulian Grajkowski 	pInnerState1 = pHwBlockBaseInDRAM +
60078ee8d1cSJulian Grajkowski 	    cd_ctrl->hash_cfg_offset * LAC_QUAD_WORD_IN_BYTES +
60178ee8d1cSJulian Grajkowski 	    sizeof(icp_qat_hw_auth_setup_t);
60278ee8d1cSJulian Grajkowski 
60378ee8d1cSJulian Grajkowski 	pInnerState2 = pInnerState1 + cd_ctrl->inner_state1_sz;
60478ee8d1cSJulian Grajkowski 
60578ee8d1cSJulian Grajkowski 	pOutHashSetup = pInnerState2 + cd_ctrl->inner_state2_sz;
60678ee8d1cSJulian Grajkowski 
60778ee8d1cSJulian Grajkowski 	/* Calculate offset of cipher key */
60878ee8d1cSJulian Grajkowski 	if (pSessionDesc->laCmdId == ICP_QAT_FW_LA_CMD_CIPHER_HASH) {
60978ee8d1cSJulian Grajkowski 		sessionSetup.cipherSetupData.pCipherKey =
610a977168cSMichal Gulbicki 		    (Cpa8U *)pHwBlockBaseInDRAM + cipherConfigSize;
61178ee8d1cSJulian Grajkowski 	} else if (pSessionDesc->laCmdId == ICP_QAT_FW_LA_CMD_HASH_CIPHER) {
61278ee8d1cSJulian Grajkowski 		sessionSetup.cipherSetupData.pCipherKey =
613a977168cSMichal Gulbicki 		    pOutHashSetup + cipherConfigSize;
614a977168cSMichal Gulbicki 	} else if (SPC == pSessionDesc->singlePassState) {
61578ee8d1cSJulian Grajkowski 		CpaCySymCipherAlgorithm cipher = pSessionDesc->cipherAlgorithm;
61678ee8d1cSJulian Grajkowski 		Cpa32U hwBlockOffsetInDRAM = 0;
61778ee8d1cSJulian Grajkowski 
61878ee8d1cSJulian Grajkowski 		if (pSessionDesc->cipherDirection ==
61978ee8d1cSJulian Grajkowski 		    CPA_CY_SYM_CIPHER_DIRECTION_ENCRYPT) {
62078ee8d1cSJulian Grajkowski 			sessionSetup.cipherSetupData.pCipherKey =
621a977168cSMichal Gulbicki 			    (Cpa8U *)pHwBlockBaseInDRAM + cipherConfigSize;
62278ee8d1cSJulian Grajkowski 		} else {
62378ee8d1cSJulian Grajkowski 			if (LAC_CIPHER_IS_GCM(cipher))
62478ee8d1cSJulian Grajkowski 				hwBlockOffsetInDRAM = LAC_QUADWORDS_TO_BYTES(
625a977168cSMichal Gulbicki 				    LAC_SYM_QAT_CIPHER_GCM_SPC_OFFSET_IN_DRAM);
62678ee8d1cSJulian Grajkowski 			else
62778ee8d1cSJulian Grajkowski 				hwBlockOffsetInDRAM = LAC_QUADWORDS_TO_BYTES(
628a977168cSMichal Gulbicki 				    LAC_SYM_QAT_CIPHER_CHACHA_SPC_OFFSET_IN_DRAM);
62978ee8d1cSJulian Grajkowski 			sessionSetup.cipherSetupData.pCipherKey =
63078ee8d1cSJulian Grajkowski 			    (Cpa8U *)pHwBlockBaseInDRAM + hwBlockOffsetInDRAM +
631a977168cSMichal Gulbicki 			    cipherConfigSize;
63278ee8d1cSJulian Grajkowski 		}
63378ee8d1cSJulian Grajkowski 	}
63478ee8d1cSJulian Grajkowski 
63578ee8d1cSJulian Grajkowski 	if (!sessionSetup.cipherSetupData.pCipherKey)
63678ee8d1cSJulian Grajkowski 		return CPA_STATUS_FAIL;
63778ee8d1cSJulian Grajkowski 
63878ee8d1cSJulian Grajkowski 	if (CPA_CY_SYM_HASH_SHA3_256 == pSessionDesc->hashAlgorithm) {
63978ee8d1cSJulian Grajkowski 		if (CPA_FALSE == pSessionDesc->isAuthEncryptOp) {
64078ee8d1cSJulian Grajkowski 			lac_sym_qat_hash_state_buffer_info_t
64178ee8d1cSJulian Grajkowski 			    *pHashStateBufferInfo =
64278ee8d1cSJulian Grajkowski 				&(pSessionDesc->hashStateBufferInfo);
64378ee8d1cSJulian Grajkowski 
64478ee8d1cSJulian Grajkowski 			sal_crypto_service_t *pService =
64578ee8d1cSJulian Grajkowski 			    (sal_crypto_service_t *)pSessionDesc->pInstance;
64678ee8d1cSJulian Grajkowski 
64778ee8d1cSJulian Grajkowski 			status = LacHash_StatePrefixAadBufferInit(
64878ee8d1cSJulian Grajkowski 			    &(pService->generic_service_info),
64978ee8d1cSJulian Grajkowski 			    &(sessionSetup.hashSetupData),
65078ee8d1cSJulian Grajkowski 			    &(pSessionDesc->reqCacheFtr),
65178ee8d1cSJulian Grajkowski 			    pSessionDesc->qatHashMode,
65278ee8d1cSJulian Grajkowski 			    pSessionDesc->hashStatePrefixBuffer,
65378ee8d1cSJulian Grajkowski 			    pHashStateBufferInfo);
65478ee8d1cSJulian Grajkowski 			/* SHRAM Constants Table not used for Auth-Enc */
65578ee8d1cSJulian Grajkowski 		}
65678ee8d1cSJulian Grajkowski 	} else if (CPA_CY_SYM_HASH_SNOW3G_UIA2 == pSessionDesc->hashAlgorithm) {
657a977168cSMichal Gulbicki 		Cpa8U *authKey = (Cpa8U *)pOutHashSetup + cipherConfigSize;
65878ee8d1cSJulian Grajkowski 		memcpy(authKey, pAuthKey, pSessionDesc->authKeyLenInBytes);
65978ee8d1cSJulian Grajkowski 	} else if (CPA_CY_SYM_HASH_ZUC_EIA3 == pSessionDesc->hashAlgorithm ||
66078ee8d1cSJulian Grajkowski 		   CPA_CY_SYM_HASH_AES_CBC_MAC == pSessionDesc->hashAlgorithm) {
66178ee8d1cSJulian Grajkowski 		memcpy(pInnerState2, pAuthKey, pSessionDesc->authKeyLenInBytes);
66278ee8d1cSJulian Grajkowski 	} else if (CPA_CY_SYM_HASH_AES_CMAC == pSessionDesc->hashAlgorithm ||
66378ee8d1cSJulian Grajkowski 		   CPA_CY_SYM_HASH_KASUMI_F9 == pSessionDesc->hashAlgorithm ||
66478ee8d1cSJulian Grajkowski 		   IS_HASH_MODE_1(pSessionDesc->qatHashMode)) {
66578ee8d1cSJulian Grajkowski 		if (CPA_CY_SYM_HASH_AES_CMAC == pSessionDesc->hashAlgorithm) {
66678ee8d1cSJulian Grajkowski 			memset(pInnerState2, 0, cd_ctrl->inner_state2_sz);
66778ee8d1cSJulian Grajkowski 		}
66878ee8d1cSJulian Grajkowski 
66978ee8d1cSJulian Grajkowski 		/* Block messages until precompute is completed */
67078ee8d1cSJulian Grajkowski 		pSessionDesc->nonBlockingOpsInProgress = CPA_FALSE;
67178ee8d1cSJulian Grajkowski 
67278ee8d1cSJulian Grajkowski 		status = LacHash_PrecomputeDataCreate(
67378ee8d1cSJulian Grajkowski 		    pSessionDesc->pInstance,
67478ee8d1cSJulian Grajkowski 		    (CpaCySymSessionSetupData *)&(sessionSetup),
67578ee8d1cSJulian Grajkowski 		    LacSymAlgChain_HashPrecomputeDoneCb,
67678ee8d1cSJulian Grajkowski 		    pSessionDesc,
67778ee8d1cSJulian Grajkowski 		    pSessionDesc->hashStatePrefixBuffer,
67878ee8d1cSJulian Grajkowski 		    pInnerState1,
67978ee8d1cSJulian Grajkowski 		    pInnerState2);
68078ee8d1cSJulian Grajkowski 	}
68178ee8d1cSJulian Grajkowski 
68278ee8d1cSJulian Grajkowski 	return status;
68378ee8d1cSJulian Grajkowski }
68478ee8d1cSJulian Grajkowski 
685a977168cSMichal Gulbicki static void
buildCmdData(sal_crypto_service_t * pService,lac_session_desc_t * pSessionDesc,CpaCySymAlgChainOrder * chainOrder,Cpa16U * proto,icp_qat_fw_serv_specif_flags * laCmdFlags,icp_qat_fw_comn_flags * cmnRequestFlags)686a977168cSMichal Gulbicki buildCmdData(sal_crypto_service_t *pService,
687a977168cSMichal Gulbicki 	     lac_session_desc_t *pSessionDesc,
688a977168cSMichal Gulbicki 	     CpaCySymAlgChainOrder *chainOrder,
689a977168cSMichal Gulbicki 	     Cpa16U *proto,
690a977168cSMichal Gulbicki 	     icp_qat_fw_serv_specif_flags *laCmdFlags,
691a977168cSMichal Gulbicki 	     icp_qat_fw_comn_flags *cmnRequestFlags)
692a977168cSMichal Gulbicki {
693a977168cSMichal Gulbicki 	/* LW 28 is used to set hash flags for AlgChaining. */
694a977168cSMichal Gulbicki 	icp_qat_fw_cipher_auth_cd_ctrl_hdr_t *cd_ctrl =
695a977168cSMichal Gulbicki 	    (icp_qat_fw_cipher_auth_cd_ctrl_hdr_t *)&pSessionDesc->reqCacheFtr
696a977168cSMichal Gulbicki 		.cd_ctrl;
697a977168cSMichal Gulbicki 
698a977168cSMichal Gulbicki 	/* proto refers to Protocol Flags, which is legacy FW <=> IA interface
699a977168cSMichal Gulbicki 	 * for ZUC and Snow3G. Use extended protocol flags for AlgChaining.
700a977168cSMichal Gulbicki 	 */
701a977168cSMichal Gulbicki 	*proto = ICP_QAT_FW_LA_NO_PROTO; /* no CCM/GCM/Snow3G */
702a977168cSMichal Gulbicki 
703a977168cSMichal Gulbicki 	switch (pSessionDesc->symOperation) {
704a977168cSMichal Gulbicki 	case CPA_CY_SYM_OP_CIPHER:
705a977168cSMichal Gulbicki 		pSessionDesc->laCmdId = ICP_QAT_FW_LA_CMD_CIPHER;
706a977168cSMichal Gulbicki 
707a977168cSMichal Gulbicki 		if (CPA_CY_SYM_CIPHER_SNOW3G_UEA2 ==
708a977168cSMichal Gulbicki 		    pSessionDesc->cipherAlgorithm) {
709a977168cSMichal Gulbicki 			*proto = ICP_QAT_FW_LA_SNOW_3G_PROTO;
710a977168cSMichal Gulbicki 		} else if (CPA_CY_SYM_CIPHER_ZUC_EEA3 ==
711a977168cSMichal Gulbicki 			   pSessionDesc->cipherAlgorithm) {
712a977168cSMichal Gulbicki 			*proto = ICP_QAT_FW_LA_ZUC_3G_PROTO;
713a977168cSMichal Gulbicki 		}
714a977168cSMichal Gulbicki 		if (LAC_CIPHER_IS_CCM(pSessionDesc->cipherAlgorithm)) {
715a977168cSMichal Gulbicki 			*proto = ICP_QAT_FW_LA_CCM_PROTO;
716a977168cSMichal Gulbicki 		}
717a977168cSMichal Gulbicki 		break;
718a977168cSMichal Gulbicki 
719a977168cSMichal Gulbicki 	case CPA_CY_SYM_OP_HASH:
720a977168cSMichal Gulbicki 		pSessionDesc->laCmdId = ICP_QAT_FW_LA_CMD_AUTH;
721a977168cSMichal Gulbicki 		if (CPA_CY_SYM_HASH_SNOW3G_UIA2 ==
722a977168cSMichal Gulbicki 		    pSessionDesc->hashAlgorithm) {
723a977168cSMichal Gulbicki 			*proto = ICP_QAT_FW_LA_SNOW_3G_PROTO;
724a977168cSMichal Gulbicki 		} else if (CPA_CY_SYM_HASH_ZUC_EIA3 ==
725a977168cSMichal Gulbicki 			   pSessionDesc->hashAlgorithm) {
726a977168cSMichal Gulbicki 			*proto = ICP_QAT_FW_LA_ZUC_3G_PROTO;
727a977168cSMichal Gulbicki 		}
728a977168cSMichal Gulbicki 		break;
729a977168cSMichal Gulbicki 
730a977168cSMichal Gulbicki 	case CPA_CY_SYM_OP_ALGORITHM_CHAINING:
731a977168cSMichal Gulbicki 		if (LAC_CIPHER_IS_CCM(pSessionDesc->cipherAlgorithm)) {
732a977168cSMichal Gulbicki 			*proto = ICP_QAT_FW_LA_CCM_PROTO;
733a977168cSMichal Gulbicki 
734a977168cSMichal Gulbicki 			/* Derive chainOrder from direction for isAuthEncryptOp
735a977168cSMichal Gulbicki 			 * cases */
736a977168cSMichal Gulbicki 			/* For CCM & GCM modes: force digest verify flag _TRUE
737a977168cSMichal Gulbicki 			   for decrypt and _FALSE for encrypt. For all other
738a977168cSMichal Gulbicki 			   cases use user defined value */
739a977168cSMichal Gulbicki 
740a977168cSMichal Gulbicki 			if (CPA_CY_SYM_CIPHER_DIRECTION_ENCRYPT ==
741a977168cSMichal Gulbicki 			    pSessionDesc->cipherDirection) {
742a977168cSMichal Gulbicki 				*chainOrder =
743a977168cSMichal Gulbicki 				    CPA_CY_SYM_ALG_CHAIN_ORDER_HASH_THEN_CIPHER;
744a977168cSMichal Gulbicki 				pSessionDesc->digestVerify = CPA_FALSE;
745a977168cSMichal Gulbicki 			} else {
746a977168cSMichal Gulbicki 				*chainOrder =
747a977168cSMichal Gulbicki 				    CPA_CY_SYM_ALG_CHAIN_ORDER_CIPHER_THEN_HASH;
748a977168cSMichal Gulbicki 				if (CPA_TRUE == pService->forceAEADMacVerify) {
749a977168cSMichal Gulbicki 					pSessionDesc->digestVerify = CPA_TRUE;
750a977168cSMichal Gulbicki 				}
751a977168cSMichal Gulbicki 			}
752a977168cSMichal Gulbicki 		} else if (LAC_CIPHER_IS_GCM(pSessionDesc->cipherAlgorithm)) {
753a977168cSMichal Gulbicki 			*proto = ICP_QAT_FW_LA_GCM_PROTO;
754a977168cSMichal Gulbicki 
755a977168cSMichal Gulbicki 			/* Derive chainOrder from direction for isAuthEncryptOp
756a977168cSMichal Gulbicki 			 * cases */
757a977168cSMichal Gulbicki 			/* For CCM & GCM modes: force digest verify flag _TRUE
758a977168cSMichal Gulbicki 			   for decrypt and _FALSE for encrypt. For all other
759a977168cSMichal Gulbicki 			   cases use user defined value */
760a977168cSMichal Gulbicki 
761a977168cSMichal Gulbicki 			if (CPA_CY_SYM_CIPHER_DIRECTION_ENCRYPT ==
762a977168cSMichal Gulbicki 			    pSessionDesc->cipherDirection) {
763a977168cSMichal Gulbicki 				*chainOrder =
764a977168cSMichal Gulbicki 				    CPA_CY_SYM_ALG_CHAIN_ORDER_CIPHER_THEN_HASH;
765a977168cSMichal Gulbicki 				pSessionDesc->digestVerify = CPA_FALSE;
766a977168cSMichal Gulbicki 			} else {
767a977168cSMichal Gulbicki 				*chainOrder =
768a977168cSMichal Gulbicki 				    CPA_CY_SYM_ALG_CHAIN_ORDER_HASH_THEN_CIPHER;
769a977168cSMichal Gulbicki 				if (CPA_TRUE == pService->forceAEADMacVerify) {
770a977168cSMichal Gulbicki 					pSessionDesc->digestVerify = CPA_TRUE;
771a977168cSMichal Gulbicki 				}
772a977168cSMichal Gulbicki 			}
773a977168cSMichal Gulbicki 		} else if (LAC_CIPHER_IS_CHACHA(
774a977168cSMichal Gulbicki 			       pSessionDesc->cipherAlgorithm)) {
775a977168cSMichal Gulbicki 			if (CPA_CY_SYM_CIPHER_DIRECTION_ENCRYPT ==
776a977168cSMichal Gulbicki 			    pSessionDesc->cipherDirection) {
777a977168cSMichal Gulbicki 				*chainOrder =
778a977168cSMichal Gulbicki 				    CPA_CY_SYM_ALG_CHAIN_ORDER_CIPHER_THEN_HASH;
779a977168cSMichal Gulbicki 			} else {
780a977168cSMichal Gulbicki 				*chainOrder =
781a977168cSMichal Gulbicki 				    CPA_CY_SYM_ALG_CHAIN_ORDER_HASH_THEN_CIPHER;
782a977168cSMichal Gulbicki 			}
783a977168cSMichal Gulbicki 		} else {
784a977168cSMichal Gulbicki 			pSessionDesc->isAuthEncryptOp = CPA_FALSE;
785a977168cSMichal Gulbicki 
786a977168cSMichal Gulbicki 			if (CPA_CY_SYM_CIPHER_SNOW3G_UEA2 ==
787a977168cSMichal Gulbicki 			    pSessionDesc->cipherAlgorithm) {
788a977168cSMichal Gulbicki 				*proto = ICP_QAT_FW_LA_SNOW_3G_PROTO;
789a977168cSMichal Gulbicki 			} else if (CPA_CY_SYM_CIPHER_ZUC_EEA3 ==
790a977168cSMichal Gulbicki 				   pSessionDesc->cipherAlgorithm) {
791a977168cSMichal Gulbicki 				*proto = ICP_QAT_FW_LA_ZUC_3G_PROTO;
792a977168cSMichal Gulbicki 			}
793a977168cSMichal Gulbicki 
794a977168cSMichal Gulbicki 			if (CPA_CY_SYM_HASH_SNOW3G_UIA2 ==
795a977168cSMichal Gulbicki 			    pSessionDesc->hashAlgorithm) {
796a977168cSMichal Gulbicki 				/* Need to set LW 28 hash flags as well. */
797a977168cSMichal Gulbicki 				ICP_QAT_FW_HASH_FLAG_SNOW3G_UIA2_SET(
798a977168cSMichal Gulbicki 				    cd_ctrl->hash_flags, QAT_FW_LA_SNOW3G_UIA2);
799a977168cSMichal Gulbicki 			} else if (CPA_CY_SYM_HASH_ZUC_EIA3 ==
800a977168cSMichal Gulbicki 				   pSessionDesc->hashAlgorithm) {
801a977168cSMichal Gulbicki 				/* Need to set LW 28 hash flags as well. */
802a977168cSMichal Gulbicki 				ICP_QAT_FW_HASH_FLAG_ZUC_EIA3_SET(
803a977168cSMichal Gulbicki 				    cd_ctrl->hash_flags, QAT_FW_LA_ZUC_EIA3);
804a977168cSMichal Gulbicki 			}
805a977168cSMichal Gulbicki 		}
806a977168cSMichal Gulbicki 
807a977168cSMichal Gulbicki 		if (CPA_CY_SYM_ALG_CHAIN_ORDER_CIPHER_THEN_HASH ==
808a977168cSMichal Gulbicki 		    *chainOrder) {
809a977168cSMichal Gulbicki 			pSessionDesc->laCmdId = ICP_QAT_FW_LA_CMD_CIPHER_HASH;
810a977168cSMichal Gulbicki 		} else if (CPA_CY_SYM_ALG_CHAIN_ORDER_HASH_THEN_CIPHER ==
811a977168cSMichal Gulbicki 			   *chainOrder) {
812a977168cSMichal Gulbicki 			pSessionDesc->laCmdId = ICP_QAT_FW_LA_CMD_HASH_CIPHER;
813a977168cSMichal Gulbicki 		}
814a977168cSMichal Gulbicki 		break;
815a977168cSMichal Gulbicki 
816a977168cSMichal Gulbicki 	default:
817a977168cSMichal Gulbicki 		break;
818a977168cSMichal Gulbicki 	}
819a977168cSMichal Gulbicki 
820a977168cSMichal Gulbicki 	/*
821a977168cSMichal Gulbicki 	 * Build the header flags with the default settings for this session.
822a977168cSMichal Gulbicki 	 */
823a977168cSMichal Gulbicki 	if (pSessionDesc->isDPSession == CPA_TRUE) {
824a977168cSMichal Gulbicki 		*cmnRequestFlags =
825a977168cSMichal Gulbicki 		    ICP_QAT_FW_COMN_FLAGS_BUILD(QAT_COMN_CD_FLD_TYPE_64BIT_ADR,
826a977168cSMichal Gulbicki 						LAC_SYM_DP_QAT_PTR_TYPE);
827a977168cSMichal Gulbicki 	} else {
828a977168cSMichal Gulbicki 		*cmnRequestFlags =
829a977168cSMichal Gulbicki 		    ICP_QAT_FW_COMN_FLAGS_BUILD(QAT_COMN_CD_FLD_TYPE_64BIT_ADR,
830a977168cSMichal Gulbicki 						LAC_SYM_DEFAULT_QAT_PTR_TYPE);
831a977168cSMichal Gulbicki 	}
832a977168cSMichal Gulbicki 
833a977168cSMichal Gulbicki 	LacSymQat_LaSetDefaultFlags(laCmdFlags, pSessionDesc->symOperation);
834a977168cSMichal Gulbicki 
835a977168cSMichal Gulbicki 	return;
836a977168cSMichal Gulbicki }
837a977168cSMichal Gulbicki 
838a977168cSMichal Gulbicki static void
updateLaCmdFlags(lac_session_desc_t * pSessionDesc,Cpa16U proto,icp_qat_fw_serv_specif_flags * laCmdFlags)839a977168cSMichal Gulbicki updateLaCmdFlags(lac_session_desc_t *pSessionDesc,
840a977168cSMichal Gulbicki 		 Cpa16U proto,
841a977168cSMichal Gulbicki 		 icp_qat_fw_serv_specif_flags *laCmdFlags)
842a977168cSMichal Gulbicki {
843a977168cSMichal Gulbicki 	if (pSessionDesc->isAuth) {
844a977168cSMichal Gulbicki 		if (pSessionDesc->digestVerify) {
845a977168cSMichal Gulbicki 			ICP_QAT_FW_LA_CMP_AUTH_SET(*laCmdFlags,
846a977168cSMichal Gulbicki 						   ICP_QAT_FW_LA_CMP_AUTH_RES);
847a977168cSMichal Gulbicki 			ICP_QAT_FW_LA_RET_AUTH_SET(
848a977168cSMichal Gulbicki 			    *laCmdFlags, ICP_QAT_FW_LA_NO_RET_AUTH_RES);
849a977168cSMichal Gulbicki 		} else {
850a977168cSMichal Gulbicki 			ICP_QAT_FW_LA_RET_AUTH_SET(*laCmdFlags,
851a977168cSMichal Gulbicki 						   ICP_QAT_FW_LA_RET_AUTH_RES);
852a977168cSMichal Gulbicki 			ICP_QAT_FW_LA_CMP_AUTH_SET(
853a977168cSMichal Gulbicki 			    *laCmdFlags, ICP_QAT_FW_LA_NO_CMP_AUTH_RES);
854a977168cSMichal Gulbicki 		}
855a977168cSMichal Gulbicki 	}
856a977168cSMichal Gulbicki 
857a977168cSMichal Gulbicki 	if ((CPA_CY_SYM_CIPHER_ZUC_EEA3 == pSessionDesc->cipherAlgorithm) ||
858a977168cSMichal Gulbicki 	    (CPA_CY_SYM_HASH_ZUC_EIA3 == pSessionDesc->hashAlgorithm)) {
859a977168cSMichal Gulbicki 		/* New bit position (12) for ZUC. The FW provides a specific
860a977168cSMichal Gulbicki 		 * macro to use to set the ZUC proto flag. With the new FW I/F
861a977168cSMichal Gulbicki 		 * this needs to be set for both Cipher and Auth */
862a977168cSMichal Gulbicki 		ICP_QAT_FW_LA_ZUC_3G_PROTO_FLAG_SET(*laCmdFlags, proto);
863a977168cSMichal Gulbicki 	} else {
864a977168cSMichal Gulbicki 		/* Configure the common header */
865a977168cSMichal Gulbicki 		ICP_QAT_FW_LA_PROTO_SET(*laCmdFlags, proto);
866a977168cSMichal Gulbicki 	}
867a977168cSMichal Gulbicki 
868a977168cSMichal Gulbicki 	/* set Append flag, if digest is appended */
869a977168cSMichal Gulbicki 	if (pSessionDesc->digestIsAppended) {
870a977168cSMichal Gulbicki 		ICP_QAT_FW_LA_DIGEST_IN_BUFFER_SET(
871a977168cSMichal Gulbicki 		    *laCmdFlags, ICP_QAT_FW_LA_DIGEST_IN_BUFFER);
872a977168cSMichal Gulbicki 	} else {
873a977168cSMichal Gulbicki 		ICP_QAT_FW_LA_DIGEST_IN_BUFFER_SET(
874a977168cSMichal Gulbicki 		    *laCmdFlags, ICP_QAT_FW_LA_NO_DIGEST_IN_BUFFER);
875a977168cSMichal Gulbicki 	}
876a977168cSMichal Gulbicki }
877a977168cSMichal Gulbicki 
878a977168cSMichal Gulbicki static lac_single_pass_state_t
LacSymAlgChain_GetSpcState(CpaCySymCipherAlgorithm cipher,CpaCySymHashAlgorithm hash,Cpa32U capabilitiesMask)879a977168cSMichal Gulbicki LacSymAlgChain_GetSpcState(CpaCySymCipherAlgorithm cipher,
880a977168cSMichal Gulbicki 			   CpaCySymHashAlgorithm hash,
881a977168cSMichal Gulbicki 			   Cpa32U capabilitiesMask)
882a977168cSMichal Gulbicki {
883a977168cSMichal Gulbicki 	lac_single_pass_state_t state = NON_SPC;
884a977168cSMichal Gulbicki 	if (capabilitiesMask & ICP_ACCEL_CAPABILITIES_CHACHA_POLY) {
885a977168cSMichal Gulbicki 		switch (cipher) {
886a977168cSMichal Gulbicki 		case CPA_CY_SYM_CIPHER_CHACHA: {
887a977168cSMichal Gulbicki 			if (CPA_CY_SYM_HASH_POLY == hash)
888a977168cSMichal Gulbicki 				state = SPC;
889a977168cSMichal Gulbicki 			break;
890a977168cSMichal Gulbicki 		}
891a977168cSMichal Gulbicki 		case CPA_CY_SYM_CIPHER_AES_GCM: {
892a977168cSMichal Gulbicki 			if ((CPA_CY_SYM_HASH_AES_GCM == hash) ||
893a977168cSMichal Gulbicki 			    (CPA_CY_SYM_HASH_AES_GMAC == hash))
894a977168cSMichal Gulbicki 				state = LIKELY_SPC;
895a977168cSMichal Gulbicki 			break;
896a977168cSMichal Gulbicki 		}
897a977168cSMichal Gulbicki 		case CPA_CY_SYM_CIPHER_AES_CCM: {
898a977168cSMichal Gulbicki 			if (LAC_CIPHER_AES_V2(capabilitiesMask))
899a977168cSMichal Gulbicki 				state = SPC;
900a977168cSMichal Gulbicki 		}
901a977168cSMichal Gulbicki 		default:
902a977168cSMichal Gulbicki 			/* Do Nothing as it is NON_SPC */
903a977168cSMichal Gulbicki 			break;
904a977168cSMichal Gulbicki 		}
905a977168cSMichal Gulbicki 	}
906a977168cSMichal Gulbicki 	return state;
907a977168cSMichal Gulbicki }
908a977168cSMichal Gulbicki 
909a977168cSMichal Gulbicki static CpaBoolean
LacAlgChain_UseStatefulSha3ContentDesc(CpaBoolean partialsNotRequired,Cpa32U capabilitiesMask,lac_session_desc_t * pSessionDesc)910a977168cSMichal Gulbicki LacAlgChain_UseStatefulSha3ContentDesc(CpaBoolean partialsNotRequired,
911a977168cSMichal Gulbicki 				       Cpa32U capabilitiesMask,
912a977168cSMichal Gulbicki 				       lac_session_desc_t *pSessionDesc)
913a977168cSMichal Gulbicki {
914a977168cSMichal Gulbicki 	CpaBoolean hasSha3Ext =
915a977168cSMichal Gulbicki 	    ICP_ACCEL_CAPABILITIES_SHA3_EXT & capabilitiesMask;
916a977168cSMichal Gulbicki 	CpaBoolean useStatefulSha3DescFlag = CPA_FALSE;
917a977168cSMichal Gulbicki 
918a977168cSMichal Gulbicki 	if (hasSha3Ext && !partialsNotRequired &&
919a977168cSMichal Gulbicki 	    (pSessionDesc->symOperation == CPA_CY_SYM_OP_HASH) &&
920a977168cSMichal Gulbicki 	    LAC_HASH_IS_SHA3(pSessionDesc->hashAlgorithm)) {
921a977168cSMichal Gulbicki 		useStatefulSha3DescFlag = CPA_TRUE;
922a977168cSMichal Gulbicki 	}
923a977168cSMichal Gulbicki 	return useStatefulSha3DescFlag;
924a977168cSMichal Gulbicki }
925a977168cSMichal Gulbicki 
92678ee8d1cSJulian Grajkowski /** @ingroup LacAlgChain */
92778ee8d1cSJulian Grajkowski CpaStatus
LacAlgChain_SessionInit(const CpaInstanceHandle instanceHandle,const CpaCySymSessionSetupData * pSessionSetupData,lac_session_desc_t * pSessionDesc)92878ee8d1cSJulian Grajkowski LacAlgChain_SessionInit(const CpaInstanceHandle instanceHandle,
92978ee8d1cSJulian Grajkowski 			const CpaCySymSessionSetupData *pSessionSetupData,
93078ee8d1cSJulian Grajkowski 			lac_session_desc_t *pSessionDesc)
93178ee8d1cSJulian Grajkowski {
93278ee8d1cSJulian Grajkowski 	CpaStatus stat, status = CPA_STATUS_SUCCESS;
93378ee8d1cSJulian Grajkowski 	sal_qat_content_desc_info_t *pCdInfo = NULL;
934a977168cSMichal Gulbicki 	sal_qat_content_desc_info_t *pCdInfoOptimised = NULL;
93578ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pService = (sal_crypto_service_t *)instanceHandle;
93678ee8d1cSJulian Grajkowski 	Cpa32U capabilitiesMask =
93778ee8d1cSJulian Grajkowski 	    pService->generic_service_info.capabilitiesMask;
93878ee8d1cSJulian Grajkowski 	Cpa8U *pHwBlockBaseInDRAM = NULL;
93978ee8d1cSJulian Grajkowski 	Cpa8U *pOptimisedHwBlockBaseInDRAM = NULL;
94078ee8d1cSJulian Grajkowski 	Cpa32U hwBlockOffsetInDRAM = 0;
94178ee8d1cSJulian Grajkowski 	Cpa32U optimisedHwBlockOffsetInDRAM = 0;
94278ee8d1cSJulian Grajkowski 	Cpa8U cipherOffsetInConstantsTable = 0;
94378ee8d1cSJulian Grajkowski 	Cpa8U hashOffsetInConstantsTable = 0;
944a977168cSMichal Gulbicki 	icp_qat_fw_comn_flags cmnRequestFlags = 0;
94578ee8d1cSJulian Grajkowski 	icp_qat_fw_comn_req_t *pMsg = NULL;
946a977168cSMichal Gulbicki 	icp_qat_fw_comn_req_t *pMsgS = NULL;
94778ee8d1cSJulian Grajkowski 	const CpaCySymCipherSetupData *pCipherData;
94878ee8d1cSJulian Grajkowski 	const CpaCySymHashSetupData *pHashData;
94978ee8d1cSJulian Grajkowski 	Cpa16U proto = ICP_QAT_FW_LA_NO_PROTO; /* no CCM/GCM/Snow3G */
95078ee8d1cSJulian Grajkowski 	CpaCySymAlgChainOrder chainOrder = 0;
95178ee8d1cSJulian Grajkowski 	lac_sym_qat_hash_precompute_info_t precomputeData = { 0 };
95278ee8d1cSJulian Grajkowski 	lac_sym_qat_hash_precompute_info_t precomputeDataOptimisedCd = { 0 };
95378ee8d1cSJulian Grajkowski 
95478ee8d1cSJulian Grajkowski 	pCipherData = &(pSessionSetupData->cipherSetupData);
95578ee8d1cSJulian Grajkowski 	pHashData = &(pSessionSetupData->hashSetupData);
95678ee8d1cSJulian Grajkowski 
95778ee8d1cSJulian Grajkowski 	/*-------------------------------------------------------------------------
95878ee8d1cSJulian Grajkowski 	 * Populate session data
95978ee8d1cSJulian Grajkowski 	 *-----------------------------------------------------------------------*/
96078ee8d1cSJulian Grajkowski 
96178ee8d1cSJulian Grajkowski 	/* Initialise Request Queue */
96278ee8d1cSJulian Grajkowski 	stat = LAC_SPINLOCK_INIT(&pSessionDesc->requestQueueLock);
96378ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != stat) {
96478ee8d1cSJulian Grajkowski 		LAC_LOG_ERROR("Spinlock init failed for sessionLock");
96578ee8d1cSJulian Grajkowski 		return CPA_STATUS_RESOURCE;
96678ee8d1cSJulian Grajkowski 	}
96778ee8d1cSJulian Grajkowski 
96878ee8d1cSJulian Grajkowski 	pSessionDesc->pRequestQueueHead = NULL;
96978ee8d1cSJulian Grajkowski 	pSessionDesc->pRequestQueueTail = NULL;
97078ee8d1cSJulian Grajkowski 	pSessionDesc->nonBlockingOpsInProgress = CPA_TRUE;
97178ee8d1cSJulian Grajkowski 	pSessionDesc->pInstance = instanceHandle;
97278ee8d1cSJulian Grajkowski 	pSessionDesc->digestIsAppended = pSessionSetupData->digestIsAppended;
97378ee8d1cSJulian Grajkowski 	pSessionDesc->digestVerify = pSessionSetupData->verifyDigest;
97478ee8d1cSJulian Grajkowski 
97578ee8d1cSJulian Grajkowski 	/* Reset the pending callback counter */
97678ee8d1cSJulian Grajkowski 	qatUtilsAtomicSet(0, &pSessionDesc->u.pendingCbCount);
97778ee8d1cSJulian Grajkowski 	qatUtilsAtomicSet(0, &pSessionDesc->u.pendingDpCbCount);
97878ee8d1cSJulian Grajkowski 
97978ee8d1cSJulian Grajkowski 	/* Partial state must be set to full, to indicate that next packet
98078ee8d1cSJulian Grajkowski 	 * expected on the session is a full packet or the start of a
98178ee8d1cSJulian Grajkowski 	 * partial packet. */
98278ee8d1cSJulian Grajkowski 	pSessionDesc->partialState = CPA_CY_SYM_PACKET_TYPE_FULL;
98378ee8d1cSJulian Grajkowski 
98478ee8d1cSJulian Grajkowski 	pSessionDesc->symOperation = pSessionSetupData->symOperation;
98578ee8d1cSJulian Grajkowski 	switch (pSessionDesc->symOperation) {
98678ee8d1cSJulian Grajkowski 	case CPA_CY_SYM_OP_CIPHER:
987a977168cSMichal Gulbicki 		pSessionDesc->isCipher = CPA_TRUE;
988a977168cSMichal Gulbicki 		pSessionDesc->isAuth = CPA_FALSE;
98978ee8d1cSJulian Grajkowski 		pSessionDesc->isAuthEncryptOp = CPA_FALSE;
990a977168cSMichal Gulbicki 		pSessionDesc->singlePassState = NON_SPC;
99178ee8d1cSJulian Grajkowski 		break;
99278ee8d1cSJulian Grajkowski 	case CPA_CY_SYM_OP_HASH:
993a977168cSMichal Gulbicki 		pSessionDesc->isCipher = CPA_FALSE;
994a977168cSMichal Gulbicki 		pSessionDesc->isAuth = CPA_TRUE;
99578ee8d1cSJulian Grajkowski 		pSessionDesc->isAuthEncryptOp = CPA_FALSE;
996a977168cSMichal Gulbicki 		pSessionDesc->singlePassState = NON_SPC;
99778ee8d1cSJulian Grajkowski 		break;
998a977168cSMichal Gulbicki 	case CPA_CY_SYM_OP_ALGORITHM_CHAINING: {
999a977168cSMichal Gulbicki 		pSessionDesc->isCipher = CPA_TRUE;
1000a977168cSMichal Gulbicki 		pSessionDesc->isAuth = CPA_TRUE;
1001a977168cSMichal Gulbicki 		pSessionDesc->singlePassState =
1002a977168cSMichal Gulbicki 		    LacSymAlgChain_GetSpcState(pCipherData->cipherAlgorithm,
1003a977168cSMichal Gulbicki 					       pHashData->hashAlgorithm,
1004a977168cSMichal Gulbicki 					       capabilitiesMask);
100578ee8d1cSJulian Grajkowski 
1006a977168cSMichal Gulbicki 		switch (pSessionSetupData->cipherSetupData.cipherAlgorithm) {
1007a977168cSMichal Gulbicki 		case CPA_CY_SYM_CIPHER_AES_CCM: {
100878ee8d1cSJulian Grajkowski 			pSessionDesc->isAuthEncryptOp = CPA_TRUE;
100978ee8d1cSJulian Grajkowski 			pSessionDesc->digestIsAppended = CPA_TRUE;
1010a977168cSMichal Gulbicki 		} break;
1011a977168cSMichal Gulbicki 		case CPA_CY_SYM_CIPHER_AES_GCM:
1012a977168cSMichal Gulbicki 		case CPA_CY_SYM_CIPHER_CHACHA:
101378ee8d1cSJulian Grajkowski 			pSessionDesc->isAuthEncryptOp = CPA_TRUE;
1014a977168cSMichal Gulbicki 			break;
1015a977168cSMichal Gulbicki 		default: {
101678ee8d1cSJulian Grajkowski 			pSessionDesc->isAuthEncryptOp = CPA_FALSE;
101778ee8d1cSJulian Grajkowski 			/* Use the chainOrder passed in */
101878ee8d1cSJulian Grajkowski 			chainOrder = pSessionSetupData->algChainOrder;
101978ee8d1cSJulian Grajkowski 			if ((chainOrder !=
102078ee8d1cSJulian Grajkowski 			     CPA_CY_SYM_ALG_CHAIN_ORDER_HASH_THEN_CIPHER) &&
102178ee8d1cSJulian Grajkowski 			    (chainOrder !=
102278ee8d1cSJulian Grajkowski 			     CPA_CY_SYM_ALG_CHAIN_ORDER_CIPHER_THEN_HASH)) {
102378ee8d1cSJulian Grajkowski 				LAC_INVALID_PARAM_LOG("algChainOrder");
102478ee8d1cSJulian Grajkowski 				return CPA_STATUS_INVALID_PARAM;
102578ee8d1cSJulian Grajkowski 			}
1026a977168cSMichal Gulbicki 		} break;
102778ee8d1cSJulian Grajkowski 		}
1028a977168cSMichal Gulbicki 	} break;
102978ee8d1cSJulian Grajkowski 	default:
1030a977168cSMichal Gulbicki 		pSessionDesc->singlePassState = NON_SPC;
103178ee8d1cSJulian Grajkowski 		break;
103278ee8d1cSJulian Grajkowski 	}
103378ee8d1cSJulian Grajkowski 
103478ee8d1cSJulian Grajkowski 	if (pSessionDesc->isCipher) {
103578ee8d1cSJulian Grajkowski 		/* Populate cipher specific session data */
103678ee8d1cSJulian Grajkowski 
1037a977168cSMichal Gulbicki 		status = LacCipher_SessionSetupDataCheck(pCipherData,
1038a977168cSMichal Gulbicki 							 capabilitiesMask);
103978ee8d1cSJulian Grajkowski 
104078ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS == status) {
104178ee8d1cSJulian Grajkowski 			pSessionDesc->cipherAlgorithm =
104278ee8d1cSJulian Grajkowski 			    pCipherData->cipherAlgorithm;
104378ee8d1cSJulian Grajkowski 			pSessionDesc->cipherKeyLenInBytes =
104478ee8d1cSJulian Grajkowski 			    pCipherData->cipherKeyLenInBytes;
104578ee8d1cSJulian Grajkowski 			pSessionDesc->cipherDirection =
104678ee8d1cSJulian Grajkowski 			    pCipherData->cipherDirection;
104778ee8d1cSJulian Grajkowski 
104878ee8d1cSJulian Grajkowski 			/* ARC4 base key isn't added to the content descriptor,
1049a977168cSMichal Gulbicki 			 * because we don't need to pass it directly to the QAT
1050a977168cSMichal Gulbicki 			 * engine. Instead an initial cipher state & key matrix
1051a977168cSMichal Gulbicki 			 * is derived from the base key and provided to the QAT
1052a977168cSMichal Gulbicki 			 * through the state pointer in the request params.
1053a977168cSMichal Gulbicki 			 * We'll store this initial state in the session
1054a977168cSMichal Gulbicki 			 * descriptor. */
105578ee8d1cSJulian Grajkowski 
105678ee8d1cSJulian Grajkowski 			if (LAC_CIPHER_IS_ARC4(pSessionDesc->cipherAlgorithm)) {
105778ee8d1cSJulian Grajkowski 				LacSymQat_CipherArc4StateInit(
105878ee8d1cSJulian Grajkowski 				    pCipherData->pCipherKey,
105978ee8d1cSJulian Grajkowski 				    pSessionDesc->cipherKeyLenInBytes,
106078ee8d1cSJulian Grajkowski 				    pSessionDesc->cipherARC4InitialState);
106178ee8d1cSJulian Grajkowski 
106278ee8d1cSJulian Grajkowski 				pSessionDesc->cipherARC4InitialStatePhysAddr =
106378ee8d1cSJulian Grajkowski 				    LAC_OS_VIRT_TO_PHYS_EXTERNAL(
106478ee8d1cSJulian Grajkowski 					pService->generic_service_info,
106578ee8d1cSJulian Grajkowski 					pSessionDesc->cipherARC4InitialState);
106678ee8d1cSJulian Grajkowski 
106778ee8d1cSJulian Grajkowski 				if (0 ==
106878ee8d1cSJulian Grajkowski 				    pSessionDesc
106978ee8d1cSJulian Grajkowski 					->cipherARC4InitialStatePhysAddr) {
107078ee8d1cSJulian Grajkowski 					LAC_LOG_ERROR(
107178ee8d1cSJulian Grajkowski 					    "Unable to get the physical address of "
107278ee8d1cSJulian Grajkowski 					    "the initial state for ARC4\n");
107378ee8d1cSJulian Grajkowski 					status = CPA_STATUS_FAIL;
107478ee8d1cSJulian Grajkowski 				}
107578ee8d1cSJulian Grajkowski 			}
107678ee8d1cSJulian Grajkowski 		}
107778ee8d1cSJulian Grajkowski 	}
107878ee8d1cSJulian Grajkowski 
107978ee8d1cSJulian Grajkowski 	if ((CPA_STATUS_SUCCESS == status) && pSessionDesc->isAuth) {
108078ee8d1cSJulian Grajkowski 		/* Populate auth-specific session data */
108178ee8d1cSJulian Grajkowski 		const CpaCySymHashSetupData *pHashData =
108278ee8d1cSJulian Grajkowski 		    &pSessionSetupData->hashSetupData;
108378ee8d1cSJulian Grajkowski 
108478ee8d1cSJulian Grajkowski 		status = LacHash_HashContextCheck(instanceHandle, pHashData);
108578ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS == status) {
108678ee8d1cSJulian Grajkowski 			pSessionDesc->hashResultSize =
108778ee8d1cSJulian Grajkowski 			    pHashData->digestResultLenInBytes;
108878ee8d1cSJulian Grajkowski 			pSessionDesc->hashMode = pHashData->hashMode;
108978ee8d1cSJulian Grajkowski 			pSessionDesc->hashAlgorithm = pHashData->hashAlgorithm;
109078ee8d1cSJulian Grajkowski 
109178ee8d1cSJulian Grajkowski 			/* Save the authentication key length for further update
109278ee8d1cSJulian Grajkowski 			 */
109378ee8d1cSJulian Grajkowski 			if (CPA_CY_SYM_HASH_MODE_AUTH == pHashData->hashMode) {
109478ee8d1cSJulian Grajkowski 				pSessionDesc->authKeyLenInBytes =
109578ee8d1cSJulian Grajkowski 				    pHashData->authModeSetupData
109678ee8d1cSJulian Grajkowski 					.authKeyLenInBytes;
109778ee8d1cSJulian Grajkowski 			}
109878ee8d1cSJulian Grajkowski 			if (CPA_TRUE == pSessionDesc->isAuthEncryptOp ||
109978ee8d1cSJulian Grajkowski 			    (pHashData->hashAlgorithm ==
110078ee8d1cSJulian Grajkowski 				 CPA_CY_SYM_HASH_SNOW3G_UIA2 ||
110178ee8d1cSJulian Grajkowski 			     pHashData->hashAlgorithm ==
110278ee8d1cSJulian Grajkowski 				 CPA_CY_SYM_HASH_ZUC_EIA3)) {
110378ee8d1cSJulian Grajkowski 				pSessionDesc->aadLenInBytes =
110478ee8d1cSJulian Grajkowski 				    pHashData->authModeSetupData.aadLenInBytes;
110578ee8d1cSJulian Grajkowski 			}
110678ee8d1cSJulian Grajkowski 
110778ee8d1cSJulian Grajkowski 			/* Set the QAT hash mode */
110878ee8d1cSJulian Grajkowski 			if ((pHashData->hashMode ==
110978ee8d1cSJulian Grajkowski 			     CPA_CY_SYM_HASH_MODE_NESTED) ||
111078ee8d1cSJulian Grajkowski 			    (pHashData->hashMode ==
111178ee8d1cSJulian Grajkowski 			     CPA_CY_SYM_HASH_MODE_PLAIN) ||
111278ee8d1cSJulian Grajkowski 			    (pHashData->hashMode == CPA_CY_SYM_HASH_MODE_AUTH &&
111378ee8d1cSJulian Grajkowski 			     pHashData->hashAlgorithm ==
111478ee8d1cSJulian Grajkowski 				 CPA_CY_SYM_HASH_AES_CBC_MAC)) {
111578ee8d1cSJulian Grajkowski 				pSessionDesc->qatHashMode =
111678ee8d1cSJulian Grajkowski 				    ICP_QAT_HW_AUTH_MODE0;
111778ee8d1cSJulian Grajkowski 			} else /* CPA_CY_SYM_HASH_MODE_AUTH
111878ee8d1cSJulian Grajkowski 				  && anything except CPA_CY_SYM_HASH_AES_CBC_MAC
111978ee8d1cSJulian Grajkowski 				*/
112078ee8d1cSJulian Grajkowski 			{
112178ee8d1cSJulian Grajkowski 				if (IS_HMAC_ALG(pHashData->hashAlgorithm)) {
1122a977168cSMichal Gulbicki 					/* SHA3 HMAC and SM3  do not support
1123a977168cSMichal Gulbicki 					 * precompute, force MODE2 for AUTH */
1124a977168cSMichal Gulbicki 					if (LAC_HASH_IS_SHA3(
112578ee8d1cSJulian Grajkowski 						pHashData->hashAlgorithm) ||
112678ee8d1cSJulian Grajkowski 					    (CPA_CY_SYM_HASH_SM3 ==
112778ee8d1cSJulian Grajkowski 					     pHashData->hashAlgorithm)) {
112878ee8d1cSJulian Grajkowski 						pSessionDesc->qatHashMode =
112978ee8d1cSJulian Grajkowski 						    ICP_QAT_HW_AUTH_MODE2;
113078ee8d1cSJulian Grajkowski 					} else {
113178ee8d1cSJulian Grajkowski 						pSessionDesc->qatHashMode =
1132a977168cSMichal Gulbicki 						    pService->qatHmacMode;
113378ee8d1cSJulian Grajkowski 					}
113478ee8d1cSJulian Grajkowski 				} else if (CPA_CY_SYM_HASH_ZUC_EIA3 ==
113578ee8d1cSJulian Grajkowski 					   pHashData->hashAlgorithm) {
113678ee8d1cSJulian Grajkowski 					pSessionDesc->qatHashMode =
113778ee8d1cSJulian Grajkowski 					    ICP_QAT_HW_AUTH_MODE0;
113878ee8d1cSJulian Grajkowski 				} else {
113978ee8d1cSJulian Grajkowski 					pSessionDesc->qatHashMode =
114078ee8d1cSJulian Grajkowski 					    ICP_QAT_HW_AUTH_MODE1;
114178ee8d1cSJulian Grajkowski 				}
114278ee8d1cSJulian Grajkowski 			}
114378ee8d1cSJulian Grajkowski 		}
114478ee8d1cSJulian Grajkowski 	}
114578ee8d1cSJulian Grajkowski 
114678ee8d1cSJulian Grajkowski 	/*-------------------------------------------------------------------------
114778ee8d1cSJulian Grajkowski 	 * build the message templates
114878ee8d1cSJulian Grajkowski 	 * create two content descriptors in the case we can support using SHRAM
114978ee8d1cSJulian Grajkowski 	 * constants and an optimised content descriptor. we have to do this in
1150266b0663SKrzysztof Zdziarski 	 * case of partials. 64 byte content descriptor is used in the SHRAM
1151266b0663SKrzysztof Zdziarski 	 * case for AES-128-HMAC-SHA1
115278ee8d1cSJulian Grajkowski 	 *-----------------------------------------------------------------------*/
115378ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
1154a977168cSMichal Gulbicki 		pSessionDesc->cipherSliceType =
1155a977168cSMichal Gulbicki 		    LacCipher_GetCipherSliceType(pService,
1156a977168cSMichal Gulbicki 						 pSessionDesc->cipherAlgorithm,
1157a977168cSMichal Gulbicki 						 pSessionDesc->hashAlgorithm);
115878ee8d1cSJulian Grajkowski 
115978ee8d1cSJulian Grajkowski 		LacSymCheck_IsPartialSupported(capabilitiesMask, pSessionDesc);
1160a977168cSMichal Gulbicki 		pSessionDesc->useOptimisedContentDesc = CPA_FALSE;
1161a977168cSMichal Gulbicki 		pSessionDesc->useStatefulSha3ContentDesc = CPA_FALSE;
1162a977168cSMichal Gulbicki 
1163a977168cSMichal Gulbicki 		/* Build configuration data */
1164a977168cSMichal Gulbicki 		buildCmdData(pService,
1165a977168cSMichal Gulbicki 			     pSessionDesc,
1166a977168cSMichal Gulbicki 			     &chainOrder,
1167a977168cSMichal Gulbicki 			     &proto,
1168a977168cSMichal Gulbicki 			     &pSessionDesc->laCmdFlags,
1169a977168cSMichal Gulbicki 			     &cmnRequestFlags);
1170a977168cSMichal Gulbicki 
1171a977168cSMichal Gulbicki 		if (ICP_QAT_FW_LA_USE_UCS_SLICE_TYPE ==
1172a977168cSMichal Gulbicki 		    pSessionDesc->cipherSliceType)
1173a977168cSMichal Gulbicki 			pSessionDesc->useSymConstantsTable = CPA_FALSE;
1174a977168cSMichal Gulbicki 		else
1175a977168cSMichal Gulbicki 			pSessionDesc->useSymConstantsTable =
1176a977168cSMichal Gulbicki 			    LacSymQat_UseSymConstantsTable(
1177a977168cSMichal Gulbicki 				pSessionDesc,
1178a977168cSMichal Gulbicki 				&cipherOffsetInConstantsTable,
1179a977168cSMichal Gulbicki 				&hashOffsetInConstantsTable);
1180a977168cSMichal Gulbicki 
1181a977168cSMichal Gulbicki 		/* for a certain combination of Algorthm Chaining we want to
1182a977168cSMichal Gulbicki 		   use an optimised cd block */
1183a977168cSMichal Gulbicki 
1184a977168cSMichal Gulbicki 		if (pSessionDesc->symOperation ==
1185a977168cSMichal Gulbicki 			CPA_CY_SYM_OP_ALGORITHM_CHAINING &&
1186a977168cSMichal Gulbicki 		    pSessionDesc->useSymConstantsTable == CPA_TRUE) {
1187a977168cSMichal Gulbicki 			pSessionDesc->useOptimisedContentDesc =
1188a977168cSMichal Gulbicki 			    LacSymQat_UseOptimisedContentDesc(pSessionDesc);
1189a977168cSMichal Gulbicki 		}
1190a977168cSMichal Gulbicki 
1191a977168cSMichal Gulbicki 		/* check whether we need to construct content desc for stateful
1192a977168cSMichal Gulbicki 		 * SHA3 */
1193a977168cSMichal Gulbicki 		pSessionDesc->useStatefulSha3ContentDesc =
1194a977168cSMichal Gulbicki 		    LacAlgChain_UseStatefulSha3ContentDesc(
1195a977168cSMichal Gulbicki 			pSessionSetupData->partialsNotRequired,
1196a977168cSMichal Gulbicki 			capabilitiesMask,
1197a977168cSMichal Gulbicki 			pSessionDesc);
119878ee8d1cSJulian Grajkowski 
119978ee8d1cSJulian Grajkowski 		/* setup some convenience pointers */
120078ee8d1cSJulian Grajkowski 		pCdInfo = &(pSessionDesc->contentDescInfo);
120178ee8d1cSJulian Grajkowski 		pHwBlockBaseInDRAM = (Cpa8U *)pCdInfo->pData;
120278ee8d1cSJulian Grajkowski 		hwBlockOffsetInDRAM = 0;
120378ee8d1cSJulian Grajkowski 
1204a977168cSMichal Gulbicki 		/* set up the pointer for the optimised content desc if this is
1205a977168cSMichal Gulbicki 		 * possible we still have to support both cd types in case of
1206a977168cSMichal Gulbicki 		 * partials so we construct both */
1207a977168cSMichal Gulbicki 		if (pSessionDesc->useOptimisedContentDesc == CPA_TRUE) {
1208a977168cSMichal Gulbicki 			pCdInfoOptimised =
1209a977168cSMichal Gulbicki 			    &(pSessionDesc->contentDescOptimisedInfo);
1210a977168cSMichal Gulbicki 			pOptimisedHwBlockBaseInDRAM =
1211a977168cSMichal Gulbicki 			    (Cpa8U *)pCdInfoOptimised->pData;
1212a977168cSMichal Gulbicki 			optimisedHwBlockOffsetInDRAM = 0;
121378ee8d1cSJulian Grajkowski 		}
121478ee8d1cSJulian Grajkowski 
121578ee8d1cSJulian Grajkowski 		switch (pSessionDesc->symOperation) {
121678ee8d1cSJulian Grajkowski 		case CPA_CY_SYM_OP_CIPHER: {
121778ee8d1cSJulian Grajkowski 			LacAlgChain_CipherCDBuild(
121878ee8d1cSJulian Grajkowski 			    pCipherData,
121978ee8d1cSJulian Grajkowski 			    pSessionDesc,
122078ee8d1cSJulian Grajkowski 			    ICP_QAT_FW_SLICE_DRAM_WR,
122178ee8d1cSJulian Grajkowski 			    cipherOffsetInConstantsTable,
122278ee8d1cSJulian Grajkowski 			    &pSessionDesc->cmnRequestFlags,
122378ee8d1cSJulian Grajkowski 			    &pSessionDesc->laCmdFlags,
122478ee8d1cSJulian Grajkowski 			    pHwBlockBaseInDRAM,
1225a977168cSMichal Gulbicki 			    &hwBlockOffsetInDRAM,
1226a977168cSMichal Gulbicki 			    capabilitiesMask);
1227a977168cSMichal Gulbicki 
1228a977168cSMichal Gulbicki 			if (pSessionDesc->useSymConstantsTable) {
1229a977168cSMichal Gulbicki 				LacAlgChain_CipherCDBuild_ForSHRAM(
1230a977168cSMichal Gulbicki 				    pCipherData,
1231a977168cSMichal Gulbicki 				    pSessionDesc,
1232a977168cSMichal Gulbicki 				    ICP_QAT_FW_SLICE_DRAM_WR,
1233a977168cSMichal Gulbicki 				    cipherOffsetInConstantsTable);
1234a977168cSMichal Gulbicki 			}
123578ee8d1cSJulian Grajkowski 		} break;
123678ee8d1cSJulian Grajkowski 		case CPA_CY_SYM_OP_HASH:
123778ee8d1cSJulian Grajkowski 			LacAlgChain_HashCDBuild(pHashData,
123878ee8d1cSJulian Grajkowski 						instanceHandle,
123978ee8d1cSJulian Grajkowski 						pSessionDesc,
1240a977168cSMichal Gulbicki 						ICP_QAT_FW_SLICE_NULL,
124178ee8d1cSJulian Grajkowski 						hashOffsetInConstantsTable,
124278ee8d1cSJulian Grajkowski 						&pSessionDesc->cmnRequestFlags,
124378ee8d1cSJulian Grajkowski 						&pSessionDesc->laCmdFlags,
124478ee8d1cSJulian Grajkowski 						&precomputeData,
124578ee8d1cSJulian Grajkowski 						&precomputeDataOptimisedCd,
124678ee8d1cSJulian Grajkowski 						pHwBlockBaseInDRAM,
124778ee8d1cSJulian Grajkowski 						&hwBlockOffsetInDRAM,
124878ee8d1cSJulian Grajkowski 						NULL,
124978ee8d1cSJulian Grajkowski 						NULL);
125078ee8d1cSJulian Grajkowski 			break;
125178ee8d1cSJulian Grajkowski 		case CPA_CY_SYM_OP_ALGORITHM_CHAINING:
125278ee8d1cSJulian Grajkowski 			/* For CCM/GCM, CPM firmware currently expects the
1253a977168cSMichal Gulbicki 			 * cipher and hash h/w setup blocks to be arranged
1254a977168cSMichal Gulbicki 			 * according to the chain order (Except for GCM/CCM,
1255a977168cSMichal Gulbicki 			 * order doesn't actually matter as long as the config
1256a977168cSMichal Gulbicki 			 * offsets are set correctly in CD control blocks
125778ee8d1cSJulian Grajkowski 			 */
125878ee8d1cSJulian Grajkowski 			if (CPA_CY_SYM_ALG_CHAIN_ORDER_HASH_THEN_CIPHER ==
125978ee8d1cSJulian Grajkowski 			    chainOrder) {
126078ee8d1cSJulian Grajkowski 				LacAlgChain_HashCDBuild(
126178ee8d1cSJulian Grajkowski 				    pHashData,
126278ee8d1cSJulian Grajkowski 				    instanceHandle,
126378ee8d1cSJulian Grajkowski 				    pSessionDesc,
126478ee8d1cSJulian Grajkowski 				    ICP_QAT_FW_SLICE_CIPHER,
126578ee8d1cSJulian Grajkowski 				    hashOffsetInConstantsTable,
126678ee8d1cSJulian Grajkowski 				    &pSessionDesc->cmnRequestFlags,
126778ee8d1cSJulian Grajkowski 				    &pSessionDesc->laCmdFlags,
126878ee8d1cSJulian Grajkowski 				    &precomputeData,
126978ee8d1cSJulian Grajkowski 				    &precomputeDataOptimisedCd,
127078ee8d1cSJulian Grajkowski 				    pHwBlockBaseInDRAM,
127178ee8d1cSJulian Grajkowski 				    &hwBlockOffsetInDRAM,
127278ee8d1cSJulian Grajkowski 				    pOptimisedHwBlockBaseInDRAM,
127378ee8d1cSJulian Grajkowski 				    &optimisedHwBlockOffsetInDRAM);
127478ee8d1cSJulian Grajkowski 
127578ee8d1cSJulian Grajkowski 				LacAlgChain_CipherCDBuild(
127678ee8d1cSJulian Grajkowski 				    pCipherData,
127778ee8d1cSJulian Grajkowski 				    pSessionDesc,
127878ee8d1cSJulian Grajkowski 				    ICP_QAT_FW_SLICE_DRAM_WR,
127978ee8d1cSJulian Grajkowski 				    cipherOffsetInConstantsTable,
128078ee8d1cSJulian Grajkowski 				    &pSessionDesc->cmnRequestFlags,
128178ee8d1cSJulian Grajkowski 				    &pSessionDesc->laCmdFlags,
128278ee8d1cSJulian Grajkowski 				    pHwBlockBaseInDRAM,
1283a977168cSMichal Gulbicki 				    &hwBlockOffsetInDRAM,
1284a977168cSMichal Gulbicki 				    capabilitiesMask);
1285a977168cSMichal Gulbicki 
1286a977168cSMichal Gulbicki 				if (pSessionDesc->useOptimisedContentDesc) {
1287a977168cSMichal Gulbicki 					LacAlgChain_CipherCDBuild_ForOptimisedCD(
1288a977168cSMichal Gulbicki 					    pCipherData,
1289a977168cSMichal Gulbicki 					    pSessionDesc,
1290a977168cSMichal Gulbicki 					    ICP_QAT_FW_SLICE_DRAM_WR,
1291a977168cSMichal Gulbicki 					    cipherOffsetInConstantsTable,
1292a977168cSMichal Gulbicki 					    pOptimisedHwBlockBaseInDRAM,
1293a977168cSMichal Gulbicki 					    &optimisedHwBlockOffsetInDRAM);
1294a977168cSMichal Gulbicki 				}
1295a977168cSMichal Gulbicki 
1296a977168cSMichal Gulbicki 				if (NON_SPC != pSessionDesc->singlePassState) {
129778ee8d1cSJulian Grajkowski 					pCdInfo->hwBlkSzQuadWords =
129878ee8d1cSJulian Grajkowski 					    (LAC_BYTES_TO_QUADWORDS(
129978ee8d1cSJulian Grajkowski 						hwBlockOffsetInDRAM));
130078ee8d1cSJulian Grajkowski 					pMsg = (icp_qat_fw_comn_req_t *)&(
130178ee8d1cSJulian Grajkowski 					    pSessionDesc->reqSpcCacheHdr);
130278ee8d1cSJulian Grajkowski 					SalQatMsg_ContentDescHdrWrite(
130378ee8d1cSJulian Grajkowski 					    (icp_qat_fw_comn_req_t *)pMsg,
130478ee8d1cSJulian Grajkowski 					    pCdInfo);
130578ee8d1cSJulian Grajkowski 				}
1306a977168cSMichal Gulbicki 			} else /* CPA_CY_SYM_ALG_CHAIN_ORDER_CIPHER_THEN_HASH */
1307a977168cSMichal Gulbicki 			{
130878ee8d1cSJulian Grajkowski 				LacAlgChain_CipherCDBuild(
130978ee8d1cSJulian Grajkowski 				    pCipherData,
131078ee8d1cSJulian Grajkowski 				    pSessionDesc,
131178ee8d1cSJulian Grajkowski 				    ICP_QAT_FW_SLICE_AUTH,
131278ee8d1cSJulian Grajkowski 				    cipherOffsetInConstantsTable,
131378ee8d1cSJulian Grajkowski 				    &pSessionDesc->cmnRequestFlags,
131478ee8d1cSJulian Grajkowski 				    &pSessionDesc->laCmdFlags,
131578ee8d1cSJulian Grajkowski 				    pHwBlockBaseInDRAM,
1316a977168cSMichal Gulbicki 				    &hwBlockOffsetInDRAM,
1317a977168cSMichal Gulbicki 				    capabilitiesMask);
131878ee8d1cSJulian Grajkowski 
1319a977168cSMichal Gulbicki 				if (pSessionDesc->useOptimisedContentDesc) {
1320a977168cSMichal Gulbicki 					LacAlgChain_CipherCDBuild_ForOptimisedCD(
1321a977168cSMichal Gulbicki 					    pCipherData,
1322a977168cSMichal Gulbicki 					    pSessionDesc,
1323a977168cSMichal Gulbicki 					    ICP_QAT_FW_SLICE_AUTH,
1324a977168cSMichal Gulbicki 					    cipherOffsetInConstantsTable,
1325a977168cSMichal Gulbicki 					    pOptimisedHwBlockBaseInDRAM,
1326a977168cSMichal Gulbicki 					    &optimisedHwBlockOffsetInDRAM);
1327a977168cSMichal Gulbicki 				}
1328a977168cSMichal Gulbicki 
1329a977168cSMichal Gulbicki 				if (NON_SPC != pSessionDesc->singlePassState) {
133078ee8d1cSJulian Grajkowski 					pCdInfo->hwBlkSzQuadWords =
133178ee8d1cSJulian Grajkowski 					    LAC_BYTES_TO_QUADWORDS(
133278ee8d1cSJulian Grajkowski 						hwBlockOffsetInDRAM);
133378ee8d1cSJulian Grajkowski 					pMsg = (icp_qat_fw_comn_req_t *)&(
133478ee8d1cSJulian Grajkowski 					    pSessionDesc->reqSpcCacheHdr);
133578ee8d1cSJulian Grajkowski 					SalQatMsg_ContentDescHdrWrite(
133678ee8d1cSJulian Grajkowski 					    (icp_qat_fw_comn_req_t *)pMsg,
133778ee8d1cSJulian Grajkowski 					    pCdInfo);
133878ee8d1cSJulian Grajkowski 				}
133978ee8d1cSJulian Grajkowski 				LacAlgChain_HashCDBuild(
134078ee8d1cSJulian Grajkowski 				    pHashData,
134178ee8d1cSJulian Grajkowski 				    instanceHandle,
134278ee8d1cSJulian Grajkowski 				    pSessionDesc,
134378ee8d1cSJulian Grajkowski 				    ICP_QAT_FW_SLICE_DRAM_WR,
134478ee8d1cSJulian Grajkowski 				    hashOffsetInConstantsTable,
134578ee8d1cSJulian Grajkowski 				    &pSessionDesc->cmnRequestFlags,
134678ee8d1cSJulian Grajkowski 				    &pSessionDesc->laCmdFlags,
134778ee8d1cSJulian Grajkowski 				    &precomputeData,
134878ee8d1cSJulian Grajkowski 				    &precomputeDataOptimisedCd,
134978ee8d1cSJulian Grajkowski 				    pHwBlockBaseInDRAM,
135078ee8d1cSJulian Grajkowski 				    &hwBlockOffsetInDRAM,
135178ee8d1cSJulian Grajkowski 				    pOptimisedHwBlockBaseInDRAM,
135278ee8d1cSJulian Grajkowski 				    &optimisedHwBlockOffsetInDRAM);
135378ee8d1cSJulian Grajkowski 			}
135478ee8d1cSJulian Grajkowski 			break;
135578ee8d1cSJulian Grajkowski 		default:
135678ee8d1cSJulian Grajkowski 			LAC_LOG_ERROR("Invalid sym operation\n");
135778ee8d1cSJulian Grajkowski 			status = CPA_STATUS_INVALID_PARAM;
135878ee8d1cSJulian Grajkowski 		}
135978ee8d1cSJulian Grajkowski 	}
136078ee8d1cSJulian Grajkowski 
136178ee8d1cSJulian Grajkowski 	if ((CPA_STATUS_SUCCESS == status) && pSessionDesc->isAuth) {
136278ee8d1cSJulian Grajkowski 		lac_sym_qat_hash_state_buffer_info_t *pHashStateBufferInfo =
136378ee8d1cSJulian Grajkowski 		    &(pSessionDesc->hashStateBufferInfo);
136478ee8d1cSJulian Grajkowski 		CpaBoolean hashStateBuffer = CPA_TRUE;
136578ee8d1cSJulian Grajkowski 
136678ee8d1cSJulian Grajkowski 		/* set up fields in both the cd_ctrl and reqParams which
1367a977168cSMichal Gulbicki 		 * describe the ReqParams block */
136878ee8d1cSJulian Grajkowski 		LacSymQat_HashSetupReqParamsMetaData(
136978ee8d1cSJulian Grajkowski 		    &(pSessionDesc->reqCacheFtr),
137078ee8d1cSJulian Grajkowski 		    instanceHandle,
137178ee8d1cSJulian Grajkowski 		    pHashData,
137278ee8d1cSJulian Grajkowski 		    hashStateBuffer,
137378ee8d1cSJulian Grajkowski 		    pSessionDesc->qatHashMode,
137478ee8d1cSJulian Grajkowski 		    pSessionDesc->digestVerify);
137578ee8d1cSJulian Grajkowski 
1376a977168cSMichal Gulbicki 		if (pSessionDesc->useSymConstantsTable) {
1377a977168cSMichal Gulbicki 			/* Need to set up for SHRAM Constants Table use also */
1378a977168cSMichal Gulbicki 			LacSymQat_HashSetupReqParamsMetaData(
1379a977168cSMichal Gulbicki 			    &(pSessionDesc->shramReqCacheFtr),
1380a977168cSMichal Gulbicki 			    instanceHandle,
1381a977168cSMichal Gulbicki 			    pHashData,
1382a977168cSMichal Gulbicki 			    hashStateBuffer,
1383a977168cSMichal Gulbicki 			    pSessionDesc->qatHashMode,
1384a977168cSMichal Gulbicki 			    pSessionDesc->digestVerify);
1385a977168cSMichal Gulbicki 		}
1386a977168cSMichal Gulbicki 
138778ee8d1cSJulian Grajkowski 		/* populate the hash state prefix buffer info structure
138878ee8d1cSJulian Grajkowski 		 * (part of user allocated session memory & the
138978ee8d1cSJulian Grajkowski 		 * buffer itself. For CCM/GCM the buffer is stored in the
139078ee8d1cSJulian Grajkowski 		 * cookie and is not initialised here) */
139178ee8d1cSJulian Grajkowski 		if (CPA_FALSE == pSessionDesc->isAuthEncryptOp) {
139278ee8d1cSJulian Grajkowski 			LAC_CHECK_64_BYTE_ALIGNMENT(
139378ee8d1cSJulian Grajkowski 			    &(pSessionDesc->hashStatePrefixBuffer[0]));
139478ee8d1cSJulian Grajkowski 			status = LacHash_StatePrefixAadBufferInit(
139578ee8d1cSJulian Grajkowski 			    &(pService->generic_service_info),
139678ee8d1cSJulian Grajkowski 			    pHashData,
139778ee8d1cSJulian Grajkowski 			    &(pSessionDesc->reqCacheFtr),
139878ee8d1cSJulian Grajkowski 			    pSessionDesc->qatHashMode,
139978ee8d1cSJulian Grajkowski 			    pSessionDesc->hashStatePrefixBuffer,
140078ee8d1cSJulian Grajkowski 			    pHashStateBufferInfo);
140178ee8d1cSJulian Grajkowski 			/* SHRAM Constants Table not used for Auth-Enc */
140278ee8d1cSJulian Grajkowski 		}
140378ee8d1cSJulian Grajkowski 
140478ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS == status) {
140578ee8d1cSJulian Grajkowski 			if (IS_HASH_MODE_1(pSessionDesc->qatHashMode) ||
140678ee8d1cSJulian Grajkowski 			    CPA_CY_SYM_HASH_ZUC_EIA3 ==
140778ee8d1cSJulian Grajkowski 				pHashData->hashAlgorithm) {
140878ee8d1cSJulian Grajkowski 				LAC_CHECK_64_BYTE_ALIGNMENT(
140978ee8d1cSJulian Grajkowski 				    &(pSessionDesc->hashStatePrefixBuffer[0]));
141078ee8d1cSJulian Grajkowski 
141178ee8d1cSJulian Grajkowski 				/* Block messages until precompute is completed
141278ee8d1cSJulian Grajkowski 				 */
141378ee8d1cSJulian Grajkowski 				pSessionDesc->nonBlockingOpsInProgress =
141478ee8d1cSJulian Grajkowski 				    CPA_FALSE;
141578ee8d1cSJulian Grajkowski 				status = LacHash_PrecomputeDataCreate(
141678ee8d1cSJulian Grajkowski 				    instanceHandle,
141778ee8d1cSJulian Grajkowski 				    (CpaCySymSessionSetupData *)
141878ee8d1cSJulian Grajkowski 					pSessionSetupData,
141978ee8d1cSJulian Grajkowski 				    LacSymAlgChain_HashPrecomputeDoneCb,
142078ee8d1cSJulian Grajkowski 				    pSessionDesc,
142178ee8d1cSJulian Grajkowski 				    pSessionDesc->hashStatePrefixBuffer,
142278ee8d1cSJulian Grajkowski 				    precomputeData.pState1,
142378ee8d1cSJulian Grajkowski 				    precomputeData.pState2);
1424a977168cSMichal Gulbicki 				if (pSessionDesc->useOptimisedContentDesc) {
1425a977168cSMichal Gulbicki 					status = LacHash_PrecomputeDataCreate(
1426a977168cSMichal Gulbicki 					    instanceHandle,
1427a977168cSMichal Gulbicki 					    (CpaCySymSessionSetupData *)
1428a977168cSMichal Gulbicki 						pSessionSetupData,
1429a977168cSMichal Gulbicki 					    LacSymAlgChain_HashPrecomputeDoneCb,
1430a977168cSMichal Gulbicki 					    pSessionDesc,
1431a977168cSMichal Gulbicki 					    pSessionDesc->hashStatePrefixBuffer,
1432a977168cSMichal Gulbicki 					    precomputeDataOptimisedCd.pState1,
1433a977168cSMichal Gulbicki 					    precomputeDataOptimisedCd.pState2);
1434a977168cSMichal Gulbicki 				}
143578ee8d1cSJulian Grajkowski 			} else if (pHashData->hashAlgorithm ==
143678ee8d1cSJulian Grajkowski 				   CPA_CY_SYM_HASH_AES_CBC_MAC) {
1437a977168cSMichal Gulbicki 				if (NULL != precomputeData.pState2) {
143878ee8d1cSJulian Grajkowski 					LAC_OS_BZERO(precomputeData.pState2,
143978ee8d1cSJulian Grajkowski 						     precomputeData.state2Size);
144078ee8d1cSJulian Grajkowski 					memcpy(precomputeData.pState2,
1441a977168cSMichal Gulbicki 					       pHashData->authModeSetupData
1442a977168cSMichal Gulbicki 						   .authKey,
144378ee8d1cSJulian Grajkowski 					       pHashData->authModeSetupData
144478ee8d1cSJulian Grajkowski 						   .authKeyLenInBytes);
144578ee8d1cSJulian Grajkowski 				}
144678ee8d1cSJulian Grajkowski 			}
144778ee8d1cSJulian Grajkowski 		}
144878ee8d1cSJulian Grajkowski 	}
144978ee8d1cSJulian Grajkowski 
145078ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
145178ee8d1cSJulian Grajkowski 
1452a977168cSMichal Gulbicki 		/* Configure the ContentDescriptor field
1453a977168cSMichal Gulbicki 		    in the request if not done already */
145478ee8d1cSJulian Grajkowski 		pCdInfo->hwBlkSzQuadWords =
145578ee8d1cSJulian Grajkowski 		    LAC_BYTES_TO_QUADWORDS(hwBlockOffsetInDRAM);
145678ee8d1cSJulian Grajkowski 		pMsg = (icp_qat_fw_comn_req_t *)&(pSessionDesc->reqCacheHdr);
145778ee8d1cSJulian Grajkowski 		SalQatMsg_ContentDescHdrWrite((icp_qat_fw_comn_req_t *)pMsg,
145878ee8d1cSJulian Grajkowski 					      pCdInfo);
145978ee8d1cSJulian Grajkowski 
1460a977168cSMichal Gulbicki 		pMsgS =
1461a977168cSMichal Gulbicki 		    (icp_qat_fw_comn_req_t *)&(pSessionDesc->shramReqCacheHdr);
1462a977168cSMichal Gulbicki 		/*If we are using the optimised CD then
1463a977168cSMichal Gulbicki 		  we have to set this up correctly in the SHARM reqCache*/
1464a977168cSMichal Gulbicki 		if (pSessionDesc->useOptimisedContentDesc) {
1465a977168cSMichal Gulbicki 			pCdInfoOptimised->hwBlkSzQuadWords =
1466a977168cSMichal Gulbicki 			    LAC_BYTES_TO_QUADWORDS(
1467a977168cSMichal Gulbicki 				optimisedHwBlockOffsetInDRAM);
1468a977168cSMichal Gulbicki 			SalQatMsg_ContentDescHdrWrite(
1469a977168cSMichal Gulbicki 			    (icp_qat_fw_comn_req_t *)pMsgS, pCdInfoOptimised);
147078ee8d1cSJulian Grajkowski 		}
147178ee8d1cSJulian Grajkowski 
1472a977168cSMichal Gulbicki 		/* Updates command flags basing on configured alg */
1473a977168cSMichal Gulbicki 		updateLaCmdFlags(pSessionDesc,
1474a977168cSMichal Gulbicki 				 proto,
1475a977168cSMichal Gulbicki 				 &pSessionDesc->laCmdFlags);
147678ee8d1cSJulian Grajkowski 
147778ee8d1cSJulian Grajkowski 		SalQatMsg_CmnHdrWrite((icp_qat_fw_comn_req_t *)pMsg,
147878ee8d1cSJulian Grajkowski 				      ICP_QAT_FW_COMN_REQ_CPM_FW_LA,
147978ee8d1cSJulian Grajkowski 				      pSessionDesc->laCmdId,
148078ee8d1cSJulian Grajkowski 				      pSessionDesc->cmnRequestFlags,
148178ee8d1cSJulian Grajkowski 				      pSessionDesc->laCmdFlags);
1482a977168cSMichal Gulbicki 
1483a977168cSMichal Gulbicki 		/* Need to duplicate if SHRAM Constants Table used */
1484a977168cSMichal Gulbicki 		if (pSessionDesc->useSymConstantsTable) {
1485a977168cSMichal Gulbicki 			ICP_QAT_FW_LA_CIPH_AUTH_CFG_OFFSET_FLAG_SET(
1486a977168cSMichal Gulbicki 			    pSessionDesc->laCmdFlags,
1487a977168cSMichal Gulbicki 			    ICP_QAT_FW_CIPH_AUTH_CFG_OFFSET_IN_SHRAM_CP);
1488a977168cSMichal Gulbicki 
1489a977168cSMichal Gulbicki 			if (pSessionDesc->isCipher &&
1490a977168cSMichal Gulbicki 			    !pSessionDesc->useOptimisedContentDesc) {
1491a977168cSMichal Gulbicki 				ICP_QAT_FW_COMN_CD_FLD_TYPE_SET(
1492a977168cSMichal Gulbicki 				    cmnRequestFlags,
1493a977168cSMichal Gulbicki 				    QAT_COMN_CD_FLD_TYPE_16BYTE_DATA);
1494a977168cSMichal Gulbicki 			}
1495a977168cSMichal Gulbicki 
1496a977168cSMichal Gulbicki 			SalQatMsg_CmnHdrWrite((icp_qat_fw_comn_req_t *)pMsgS,
1497a977168cSMichal Gulbicki 					      ICP_QAT_FW_COMN_REQ_CPM_FW_LA,
1498a977168cSMichal Gulbicki 					      pSessionDesc->laCmdId,
1499a977168cSMichal Gulbicki 					      cmnRequestFlags,
1500a977168cSMichal Gulbicki 					      pSessionDesc->laCmdFlags);
1501a977168cSMichal Gulbicki 		}
150278ee8d1cSJulian Grajkowski 	}
150378ee8d1cSJulian Grajkowski 
150478ee8d1cSJulian Grajkowski 	return status;
150578ee8d1cSJulian Grajkowski }
150678ee8d1cSJulian Grajkowski 
1507a977168cSMichal Gulbicki static void
LacAlgChain_StatefulSha3_SkipStateLoadFlags(icp_qat_fw_la_bulk_req_t * pMsg,Cpa32U packetType,icp_qat_hw_auth_mode_t qatHashMode)1508a977168cSMichal Gulbicki LacAlgChain_StatefulSha3_SkipStateLoadFlags(icp_qat_fw_la_bulk_req_t *pMsg,
1509a977168cSMichal Gulbicki 					    Cpa32U packetType,
1510a977168cSMichal Gulbicki 					    icp_qat_hw_auth_mode_t qatHashMode)
1511a977168cSMichal Gulbicki {
1512a977168cSMichal Gulbicki 	icp_qat_fw_auth_cd_ctrl_hdr_t *pAuthCdCtrlHdr = NULL;
1513a977168cSMichal Gulbicki 
1514a977168cSMichal Gulbicki 	pAuthCdCtrlHdr = (icp_qat_fw_auth_cd_ctrl_hdr_t *)&(pMsg->cd_ctrl);
1515a977168cSMichal Gulbicki 
1516a977168cSMichal Gulbicki 	if (IS_HASH_MODE_2(qatHashMode)) {
1517a977168cSMichal Gulbicki 		if ((ICP_QAT_FW_LA_PARTIAL_START == packetType) ||
1518a977168cSMichal Gulbicki 		    (ICP_QAT_FW_LA_PARTIAL_NONE == packetType)) {
1519a977168cSMichal Gulbicki 			ICP_QAT_FW_HASH_FLAG_SKIP_INNER_STATE1_LOAD_SET(
1520a977168cSMichal Gulbicki 			    pAuthCdCtrlHdr->hash_flags,
1521a977168cSMichal Gulbicki 			    QAT_FW_LA_SKIP_INNER_STATE1_LOAD);
1522a977168cSMichal Gulbicki 			ICP_QAT_FW_HASH_FLAG_SKIP_OUTER_STATE1_LOAD_SET(
1523a977168cSMichal Gulbicki 			    pAuthCdCtrlHdr->hash_flags,
1524a977168cSMichal Gulbicki 			    QAT_FW_LA_SKIP_OUTER_STATE1_LOAD);
1525a977168cSMichal Gulbicki 		} else if (ICP_QAT_FW_LA_PARTIAL_END == packetType) {
1526a977168cSMichal Gulbicki 			ICP_QAT_FW_HASH_FLAG_SKIP_OUTER_STATE1_LOAD_SET(
1527a977168cSMichal Gulbicki 			    pAuthCdCtrlHdr->hash_flags,
1528a977168cSMichal Gulbicki 			    QAT_FW_LA_SKIP_OUTER_STATE1_LOAD);
1529a977168cSMichal Gulbicki 		}
1530a977168cSMichal Gulbicki 	} else {
1531a977168cSMichal Gulbicki 		if ((ICP_QAT_FW_LA_PARTIAL_START == packetType) ||
1532a977168cSMichal Gulbicki 		    (ICP_QAT_FW_LA_PARTIAL_NONE == packetType)) {
1533a977168cSMichal Gulbicki 			ICP_QAT_FW_HASH_FLAG_SKIP_INNER_STATE1_LOAD_SET(
1534a977168cSMichal Gulbicki 			    pAuthCdCtrlHdr->hash_flags,
1535a977168cSMichal Gulbicki 			    QAT_FW_LA_SKIP_INNER_STATE1_LOAD);
1536a977168cSMichal Gulbicki 		}
1537a977168cSMichal Gulbicki 	}
1538a977168cSMichal Gulbicki }
1539a977168cSMichal Gulbicki 
154078ee8d1cSJulian Grajkowski /** @ingroup LacAlgChain */
154178ee8d1cSJulian Grajkowski CpaStatus
LacAlgChain_Perform(const CpaInstanceHandle instanceHandle,lac_session_desc_t * pSessionDesc,void * pCallbackTag,const CpaCySymOpData * pOpData,const CpaBufferList * pSrcBuffer,CpaBufferList * pDstBuffer,CpaBoolean * pVerifyResult)154278ee8d1cSJulian Grajkowski LacAlgChain_Perform(const CpaInstanceHandle instanceHandle,
154378ee8d1cSJulian Grajkowski 		    lac_session_desc_t *pSessionDesc,
154478ee8d1cSJulian Grajkowski 		    void *pCallbackTag,
154578ee8d1cSJulian Grajkowski 		    const CpaCySymOpData *pOpData,
154678ee8d1cSJulian Grajkowski 		    const CpaBufferList *pSrcBuffer,
154778ee8d1cSJulian Grajkowski 		    CpaBufferList *pDstBuffer,
154878ee8d1cSJulian Grajkowski 		    CpaBoolean *pVerifyResult)
154978ee8d1cSJulian Grajkowski {
155078ee8d1cSJulian Grajkowski 	CpaStatus status = CPA_STATUS_SUCCESS;
155178ee8d1cSJulian Grajkowski 	sal_crypto_service_t *pService = (sal_crypto_service_t *)instanceHandle;
155278ee8d1cSJulian Grajkowski 	Cpa32U capabilitiesMask =
155378ee8d1cSJulian Grajkowski 	    pService->generic_service_info.capabilitiesMask;
155478ee8d1cSJulian Grajkowski 	lac_sym_bulk_cookie_t *pCookie = NULL;
155578ee8d1cSJulian Grajkowski 	lac_sym_cookie_t *pSymCookie = NULL;
155678ee8d1cSJulian Grajkowski 	icp_qat_fw_la_bulk_req_t *pMsg = NULL;
155778ee8d1cSJulian Grajkowski 	Cpa8U *pMsgDummy = NULL;
155878ee8d1cSJulian Grajkowski 	Cpa8U *pCacheDummyHdr = NULL;
155978ee8d1cSJulian Grajkowski 	Cpa8U *pCacheDummyFtr = NULL;
156078ee8d1cSJulian Grajkowski 	Cpa32U qatPacketType = 0;
156178ee8d1cSJulian Grajkowski 	CpaBufferList *pBufferList = NULL;
156278ee8d1cSJulian Grajkowski 	Cpa8U *pDigestResult = NULL;
156378ee8d1cSJulian Grajkowski 	Cpa64U srcAddrPhys = 0;
156478ee8d1cSJulian Grajkowski 	Cpa64U dstAddrPhys = 0;
156578ee8d1cSJulian Grajkowski 	icp_qat_fw_la_cmd_id_t laCmdId;
156678ee8d1cSJulian Grajkowski 	sal_qat_content_desc_info_t *pCdInfo = NULL;
156778ee8d1cSJulian Grajkowski 	Cpa8U *pHwBlockBaseInDRAM = NULL;
156878ee8d1cSJulian Grajkowski 	Cpa32U hwBlockOffsetInDRAM = 0;
156978ee8d1cSJulian Grajkowski 	Cpa32U sizeInBytes = 0;
157078ee8d1cSJulian Grajkowski 	icp_qat_fw_cipher_cd_ctrl_hdr_t *pSpcCdCtrlHdr = NULL;
157178ee8d1cSJulian Grajkowski 	CpaCySymCipherAlgorithm cipher;
157278ee8d1cSJulian Grajkowski 	CpaCySymHashAlgorithm hash;
157378ee8d1cSJulian Grajkowski 	Cpa8U paddingLen = 0;
157478ee8d1cSJulian Grajkowski 	Cpa8U blockLen = 0;
1575a977168cSMichal Gulbicki 	CpaBoolean digestIsAppended = CPA_FALSE;
1576a977168cSMichal Gulbicki 	Cpa32U aadLenInBytes = 0;
157778ee8d1cSJulian Grajkowski 	Cpa64U srcPktSize = 0;
1578a977168cSMichal Gulbicki 	Cpa64U dstPktSize = 0;
157978ee8d1cSJulian Grajkowski 
158078ee8d1cSJulian Grajkowski 	/* Set the command id */
158178ee8d1cSJulian Grajkowski 	laCmdId = pSessionDesc->laCmdId;
158278ee8d1cSJulian Grajkowski 
158378ee8d1cSJulian Grajkowski 	cipher = pSessionDesc->cipherAlgorithm;
158478ee8d1cSJulian Grajkowski 	hash = pSessionDesc->hashAlgorithm;
158578ee8d1cSJulian Grajkowski 
1586a977168cSMichal Gulbicki 	CpaBoolean isSpCcm =
1587a977168cSMichal Gulbicki 	    (LAC_CIPHER_IS_CCM(cipher) && LAC_CIPHER_AES_V2(capabilitiesMask));
1588a977168cSMichal Gulbicki 
1589a977168cSMichal Gulbicki 	if (CPA_CY_SYM_HASH_AES_GMAC == hash) {
1590a977168cSMichal Gulbicki 		pSessionDesc->aadLenInBytes = pOpData->messageLenToHashInBytes;
1591a977168cSMichal Gulbicki 		if (pOpData->messageLenToHashInBytes == 0 ||
1592a977168cSMichal Gulbicki 		    pOpData->pAdditionalAuthData != NULL) {
1593a977168cSMichal Gulbicki 			LAC_INVALID_PARAM_LOG(
1594a977168cSMichal Gulbicki 			    "For AES_GMAC, AAD Length "
1595a977168cSMichal Gulbicki 			    "(messageLenToHashInBytes) must "
1596a977168cSMichal Gulbicki 			    "be non zero and pAdditionalAuthData "
1597a977168cSMichal Gulbicki 			    "must be NULL");
1598a977168cSMichal Gulbicki 			return CPA_STATUS_INVALID_PARAM;
1599a977168cSMichal Gulbicki 		}
1600a977168cSMichal Gulbicki 	}
1601a977168cSMichal Gulbicki 
1602a977168cSMichal Gulbicki 	aadLenInBytes = pSessionDesc->aadLenInBytes;
1603a977168cSMichal Gulbicki 
160478ee8d1cSJulian Grajkowski 	/* Convert Alg Chain Request to Cipher Request for CCP and
160578ee8d1cSJulian Grajkowski 	 * AES_GCM single pass */
1606a977168cSMichal Gulbicki 	if ((NON_SPC != pSessionDesc->singlePassState) &&
1607a977168cSMichal Gulbicki 	    (isSpCcm || (LAC_CIPHER_SPC_IV_SIZE == pOpData->ivLenInBytes))) {
160878ee8d1cSJulian Grajkowski 		pSessionDesc->laCmdId = ICP_QAT_FW_LA_CMD_CIPHER;
160978ee8d1cSJulian Grajkowski 		laCmdId = pSessionDesc->laCmdId;
161078ee8d1cSJulian Grajkowski 		pSessionDesc->symOperation = CPA_CY_SYM_OP_CIPHER;
1611a977168cSMichal Gulbicki 		pSessionDesc->singlePassState = SPC;
161278ee8d1cSJulian Grajkowski 		pSessionDesc->isCipher = CPA_TRUE;
161378ee8d1cSJulian Grajkowski 		pSessionDesc->isAuthEncryptOp = CPA_FALSE;
161478ee8d1cSJulian Grajkowski 		pSessionDesc->isAuth = CPA_FALSE;
1615a977168cSMichal Gulbicki 
1616a977168cSMichal Gulbicki 		if (CPA_CY_SYM_HASH_AES_GMAC == hash) {
1617a977168cSMichal Gulbicki 			if (ICP_QAT_FW_SPC_AAD_SZ_MAX < aadLenInBytes) {
161878ee8d1cSJulian Grajkowski 				LAC_INVALID_PARAM_LOG(
161978ee8d1cSJulian Grajkowski 				    "aadLenInBytes for AES_GMAC");
162078ee8d1cSJulian Grajkowski 				return CPA_STATUS_INVALID_PARAM;
162178ee8d1cSJulian Grajkowski 			}
162278ee8d1cSJulian Grajkowski 		}
162378ee8d1cSJulian Grajkowski 		/* New bit position (13) for SINGLE PASS.
162478ee8d1cSJulian Grajkowski 		 * The FW provides a specific macro to use to set the proto flag
162578ee8d1cSJulian Grajkowski 		 */
162678ee8d1cSJulian Grajkowski 		ICP_QAT_FW_LA_SINGLE_PASS_PROTO_FLAG_SET(
162778ee8d1cSJulian Grajkowski 		    pSessionDesc->laCmdFlags, ICP_QAT_FW_LA_SINGLE_PASS_PROTO);
1628a977168cSMichal Gulbicki 		if (isCyGen2x(pService)) {
162978ee8d1cSJulian Grajkowski 			ICP_QAT_FW_LA_PROTO_SET(pSessionDesc->laCmdFlags, 0);
1630a977168cSMichal Gulbicki 		}
163178ee8d1cSJulian Grajkowski 
163278ee8d1cSJulian Grajkowski 		pCdInfo = &(pSessionDesc->contentDescInfo);
163378ee8d1cSJulian Grajkowski 		pHwBlockBaseInDRAM = (Cpa8U *)pCdInfo->pData;
163478ee8d1cSJulian Grajkowski 		if (CPA_CY_SYM_CIPHER_DIRECTION_DECRYPT ==
163578ee8d1cSJulian Grajkowski 		    pSessionDesc->cipherDirection) {
163678ee8d1cSJulian Grajkowski 			if (LAC_CIPHER_IS_GCM(cipher))
163778ee8d1cSJulian Grajkowski 				hwBlockOffsetInDRAM = LAC_QUADWORDS_TO_BYTES(
1638a977168cSMichal Gulbicki 				    LAC_SYM_QAT_CIPHER_GCM_SPC_OFFSET_IN_DRAM);
1639a977168cSMichal Gulbicki 			else if (LAC_CIPHER_IS_CHACHA(cipher))
164078ee8d1cSJulian Grajkowski 				hwBlockOffsetInDRAM = LAC_QUADWORDS_TO_BYTES(
1641a977168cSMichal Gulbicki 				    LAC_SYM_QAT_CIPHER_CHACHA_SPC_OFFSET_IN_DRAM);
1642a977168cSMichal Gulbicki 		} else if (isSpCcm) {
1643a977168cSMichal Gulbicki 			hwBlockOffsetInDRAM = LAC_QUADWORDS_TO_BYTES(
1644a977168cSMichal Gulbicki 			    LAC_SYM_QAT_CIPHER_CCM_SPC_OFFSET_IN_DRAM);
164578ee8d1cSJulian Grajkowski 		}
1646a977168cSMichal Gulbicki 
1647a977168cSMichal Gulbicki 		/* Update cipher slice type */
1648a977168cSMichal Gulbicki 		pSessionDesc->cipherSliceType =
1649a977168cSMichal Gulbicki 		    LacCipher_GetCipherSliceType(pService,
1650a977168cSMichal Gulbicki 						 pSessionDesc->cipherAlgorithm,
1651a977168cSMichal Gulbicki 						 pSessionDesc->hashAlgorithm);
1652a977168cSMichal Gulbicki 
1653a977168cSMichal Gulbicki 		ICP_QAT_FW_LA_SLICE_TYPE_SET(pSessionDesc->laCmdFlags,
1654a977168cSMichal Gulbicki 					     pSessionDesc->cipherSliceType);
1655a977168cSMichal Gulbicki 
165678ee8d1cSJulian Grajkowski 		/* construct cipherConfig in CD in DRAM */
165778ee8d1cSJulian Grajkowski 		LacSymQat_CipherHwBlockPopulateCfgData(pSessionDesc,
165878ee8d1cSJulian Grajkowski 						       pHwBlockBaseInDRAM +
165978ee8d1cSJulian Grajkowski 							   hwBlockOffsetInDRAM,
166078ee8d1cSJulian Grajkowski 						       &sizeInBytes);
166178ee8d1cSJulian Grajkowski 		SalQatMsg_CmnHdrWrite((icp_qat_fw_comn_req_t *)&(
166278ee8d1cSJulian Grajkowski 					  pSessionDesc->reqSpcCacheHdr),
166378ee8d1cSJulian Grajkowski 				      ICP_QAT_FW_COMN_REQ_CPM_FW_LA,
1664a977168cSMichal Gulbicki 				      laCmdId,
166578ee8d1cSJulian Grajkowski 				      pSessionDesc->cmnRequestFlags,
166678ee8d1cSJulian Grajkowski 				      pSessionDesc->laCmdFlags);
1667a977168cSMichal Gulbicki 	} else if ((SPC == pSessionDesc->singlePassState) &&
1668a977168cSMichal Gulbicki 		   (LAC_CIPHER_SPC_IV_SIZE != pOpData->ivLenInBytes)) {
1669a977168cSMichal Gulbicki 		pSessionDesc->symOperation = CPA_CY_SYM_OP_ALGORITHM_CHAINING;
1670a977168cSMichal Gulbicki 		pSessionDesc->singlePassState = LIKELY_SPC;
1671a977168cSMichal Gulbicki 		pSessionDesc->isCipher = CPA_TRUE;
1672a977168cSMichal Gulbicki 		pSessionDesc->isAuthEncryptOp = CPA_TRUE;
1673a977168cSMichal Gulbicki 		pSessionDesc->isAuth = CPA_TRUE;
1674a977168cSMichal Gulbicki 		pCdInfo = &(pSessionDesc->contentDescInfo);
1675a977168cSMichal Gulbicki 		pHwBlockBaseInDRAM = (Cpa8U *)pCdInfo->pData;
1676a977168cSMichal Gulbicki 
1677a977168cSMichal Gulbicki 		if (CPA_CY_SYM_CIPHER_DIRECTION_ENCRYPT ==
1678a977168cSMichal Gulbicki 		    pSessionDesc->cipherDirection) {
1679a977168cSMichal Gulbicki 			pSessionDesc->laCmdId = ICP_QAT_FW_LA_CMD_CIPHER_HASH;
1680a977168cSMichal Gulbicki 		} else {
1681a977168cSMichal Gulbicki 			pSessionDesc->laCmdId = ICP_QAT_FW_LA_CMD_HASH_CIPHER;
168278ee8d1cSJulian Grajkowski 		}
168378ee8d1cSJulian Grajkowski 
1684a977168cSMichal Gulbicki 		laCmdId = pSessionDesc->laCmdId;
1685a977168cSMichal Gulbicki 		ICP_QAT_FW_LA_SINGLE_PASS_PROTO_FLAG_SET(
1686a977168cSMichal Gulbicki 		    pSessionDesc->laCmdFlags, 0);
1687a977168cSMichal Gulbicki 		ICP_QAT_FW_LA_PROTO_SET(pSessionDesc->laCmdFlags,
1688a977168cSMichal Gulbicki 					ICP_QAT_FW_LA_GCM_PROTO);
1689a977168cSMichal Gulbicki 
1690a977168cSMichal Gulbicki 		LacSymQat_CipherHwBlockPopulateCfgData(pSessionDesc,
1691a977168cSMichal Gulbicki 						       pHwBlockBaseInDRAM +
1692a977168cSMichal Gulbicki 							   hwBlockOffsetInDRAM,
1693a977168cSMichal Gulbicki 						       &sizeInBytes);
1694a977168cSMichal Gulbicki 
1695a977168cSMichal Gulbicki 		SalQatMsg_CmnHdrWrite((icp_qat_fw_comn_req_t *)&(
1696a977168cSMichal Gulbicki 					  pSessionDesc->reqCacheHdr),
1697a977168cSMichal Gulbicki 				      ICP_QAT_FW_COMN_REQ_CPM_FW_LA,
1698a977168cSMichal Gulbicki 				      laCmdId,
1699a977168cSMichal Gulbicki 				      pSessionDesc->cmnRequestFlags,
1700a977168cSMichal Gulbicki 				      pSessionDesc->laCmdFlags);
1701a977168cSMichal Gulbicki 	}
1702a977168cSMichal Gulbicki 
1703a977168cSMichal Gulbicki 	else if (LAC_CIPHER_IS_CHACHA(cipher) &&
170478ee8d1cSJulian Grajkowski 		 (LAC_CIPHER_SPC_IV_SIZE != pOpData->ivLenInBytes)) {
170578ee8d1cSJulian Grajkowski 		LAC_INVALID_PARAM_LOG("IV for CHACHA");
170678ee8d1cSJulian Grajkowski 		return CPA_STATUS_INVALID_PARAM;
170778ee8d1cSJulian Grajkowski 	}
170878ee8d1cSJulian Grajkowski 
1709a977168cSMichal Gulbicki 	if ((CPA_TRUE == pSessionDesc->isAuthEncryptOp) || isSpCcm) {
1710a977168cSMichal Gulbicki 		if (CPA_CY_SYM_HASH_AES_CCM == hash) {
171178ee8d1cSJulian Grajkowski 			status = LacSymAlgChain_CheckCCMData(
171278ee8d1cSJulian Grajkowski 			    pOpData->pAdditionalAuthData,
171378ee8d1cSJulian Grajkowski 			    pOpData->pIv,
171478ee8d1cSJulian Grajkowski 			    pOpData->messageLenToCipherInBytes,
171578ee8d1cSJulian Grajkowski 			    pOpData->ivLenInBytes);
171678ee8d1cSJulian Grajkowski 			if (CPA_STATUS_SUCCESS == status) {
171778ee8d1cSJulian Grajkowski 				LacSymAlgChain_PrepareCCMData(
171878ee8d1cSJulian Grajkowski 				    pSessionDesc,
171978ee8d1cSJulian Grajkowski 				    pOpData->pAdditionalAuthData,
172078ee8d1cSJulian Grajkowski 				    pOpData->pIv,
172178ee8d1cSJulian Grajkowski 				    pOpData->messageLenToCipherInBytes,
172278ee8d1cSJulian Grajkowski 				    pOpData->ivLenInBytes);
172378ee8d1cSJulian Grajkowski 			}
1724a977168cSMichal Gulbicki 		} else if (CPA_CY_SYM_HASH_AES_GCM == hash) {
1725a977168cSMichal Gulbicki 			if (aadLenInBytes != 0 &&
172678ee8d1cSJulian Grajkowski 			    pOpData->pAdditionalAuthData == NULL) {
172778ee8d1cSJulian Grajkowski 				LAC_INVALID_PARAM_LOG("pAdditionalAuthData");
172878ee8d1cSJulian Grajkowski 				status = CPA_STATUS_INVALID_PARAM;
172978ee8d1cSJulian Grajkowski 			}
173078ee8d1cSJulian Grajkowski 			if (CPA_STATUS_SUCCESS == status) {
173178ee8d1cSJulian Grajkowski 				LacSymAlgChain_PrepareGCMData(
173278ee8d1cSJulian Grajkowski 				    pSessionDesc, pOpData->pAdditionalAuthData);
173378ee8d1cSJulian Grajkowski 			}
173478ee8d1cSJulian Grajkowski 		}
173578ee8d1cSJulian Grajkowski 	}
173678ee8d1cSJulian Grajkowski 
173778ee8d1cSJulian Grajkowski 	/* allocate cookie (used by callback function) */
173878ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
173978ee8d1cSJulian Grajkowski 		pSymCookie = (lac_sym_cookie_t *)Lac_MemPoolEntryAlloc(
174078ee8d1cSJulian Grajkowski 		    pService->lac_sym_cookie_pool);
174178ee8d1cSJulian Grajkowski 		if (pSymCookie == NULL) {
174278ee8d1cSJulian Grajkowski 			LAC_LOG_ERROR("Cannot allocate cookie - NULL");
174378ee8d1cSJulian Grajkowski 			status = CPA_STATUS_RESOURCE;
174478ee8d1cSJulian Grajkowski 		} else if ((void *)CPA_STATUS_RETRY == pSymCookie) {
174578ee8d1cSJulian Grajkowski 			pSymCookie = NULL;
174678ee8d1cSJulian Grajkowski 			status = CPA_STATUS_RETRY;
174778ee8d1cSJulian Grajkowski 		} else {
174878ee8d1cSJulian Grajkowski 			pCookie = &(pSymCookie->u.bulkCookie);
174978ee8d1cSJulian Grajkowski 		}
175078ee8d1cSJulian Grajkowski 	}
175178ee8d1cSJulian Grajkowski 
175278ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
175378ee8d1cSJulian Grajkowski 		/* write the buffer descriptors */
175478ee8d1cSJulian Grajkowski 		if (IS_ZERO_LENGTH_BUFFER_SUPPORTED(cipher, hash)) {
175578ee8d1cSJulian Grajkowski 			status =
175678ee8d1cSJulian Grajkowski 			    LacBuffDesc_BufferListDescWriteAndAllowZeroBuffer(
175778ee8d1cSJulian Grajkowski 				(CpaBufferList *)pSrcBuffer,
175878ee8d1cSJulian Grajkowski 				&srcAddrPhys,
175978ee8d1cSJulian Grajkowski 				CPA_FALSE,
176078ee8d1cSJulian Grajkowski 				&(pService->generic_service_info));
176178ee8d1cSJulian Grajkowski 			if (CPA_STATUS_SUCCESS != status) {
1762a977168cSMichal Gulbicki 				LAC_LOG_ERROR(
1763a977168cSMichal Gulbicki 				    "Unable to write src buffer descriptors");
176478ee8d1cSJulian Grajkowski 			}
176578ee8d1cSJulian Grajkowski 			/* For out of place operations */
176678ee8d1cSJulian Grajkowski 			if ((pSrcBuffer != pDstBuffer) &&
176778ee8d1cSJulian Grajkowski 			    (CPA_STATUS_SUCCESS == status)) {
176878ee8d1cSJulian Grajkowski 				status =
176978ee8d1cSJulian Grajkowski 				    LacBuffDesc_BufferListDescWriteAndAllowZeroBuffer(
177078ee8d1cSJulian Grajkowski 					pDstBuffer,
177178ee8d1cSJulian Grajkowski 					&dstAddrPhys,
177278ee8d1cSJulian Grajkowski 					CPA_FALSE,
177378ee8d1cSJulian Grajkowski 					&(pService->generic_service_info));
1774a977168cSMichal Gulbicki 				if (CPA_STATUS_SUCCESS != status) {
1775a977168cSMichal Gulbicki 					LAC_LOG_ERROR(
1776a977168cSMichal Gulbicki 					    "Unable to write dest buffer descriptors");
1777a977168cSMichal Gulbicki 				}
1778a977168cSMichal Gulbicki 			}
177978ee8d1cSJulian Grajkowski 		} else {
178078ee8d1cSJulian Grajkowski 			status = LacBuffDesc_BufferListDescWrite(
1781a977168cSMichal Gulbicki 			    (CpaBufferList *)pSrcBuffer,
1782a977168cSMichal Gulbicki 			    &srcAddrPhys,
1783a977168cSMichal Gulbicki 			    CPA_FALSE,
1784a977168cSMichal Gulbicki 			    &(pService->generic_service_info));
1785a977168cSMichal Gulbicki 			if (CPA_STATUS_SUCCESS != status) {
1786a977168cSMichal Gulbicki 				LAC_LOG_ERROR(
1787a977168cSMichal Gulbicki 				    "Unable to write src buffer descriptors in "
1788a977168cSMichal Gulbicki 				    "LacBuffDesc_BufferListDescWrite");
1789a977168cSMichal Gulbicki 			}
1790a977168cSMichal Gulbicki 			/* For out of place operations */
1791a977168cSMichal Gulbicki 			if ((pSrcBuffer != pDstBuffer) &&
1792a977168cSMichal Gulbicki 			    (CPA_STATUS_SUCCESS == status)) {
1793a977168cSMichal Gulbicki 				status = LacBuffDesc_BufferListDescWrite(
179478ee8d1cSJulian Grajkowski 				    pDstBuffer,
179578ee8d1cSJulian Grajkowski 				    &dstAddrPhys,
179678ee8d1cSJulian Grajkowski 				    CPA_FALSE,
179778ee8d1cSJulian Grajkowski 				    &(pService->generic_service_info));
179878ee8d1cSJulian Grajkowski 				if (CPA_STATUS_SUCCESS != status) {
179978ee8d1cSJulian Grajkowski 					LAC_LOG_ERROR(
1800a977168cSMichal Gulbicki 					    "Unable to write dest buffer descriptors in "
1801a977168cSMichal Gulbicki 					    "LacBuffDesc_BufferListDescWrite");
1802a977168cSMichal Gulbicki 				}
180378ee8d1cSJulian Grajkowski 			}
180478ee8d1cSJulian Grajkowski 		}
180578ee8d1cSJulian Grajkowski 	}
180678ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
180778ee8d1cSJulian Grajkowski 		/* populate the cookie */
180878ee8d1cSJulian Grajkowski 		pCookie->pCallbackTag = pCallbackTag;
180978ee8d1cSJulian Grajkowski 		pCookie->sessionCtx = pOpData->sessionCtx;
181078ee8d1cSJulian Grajkowski 		pCookie->pOpData = (const CpaCySymOpData *)pOpData;
181178ee8d1cSJulian Grajkowski 		pCookie->pDstBuffer = pDstBuffer;
181278ee8d1cSJulian Grajkowski 		pCookie->updateSessionIvOnSend = CPA_FALSE;
181378ee8d1cSJulian Grajkowski 		pCookie->updateUserIvOnRecieve = CPA_FALSE;
181478ee8d1cSJulian Grajkowski 		pCookie->updateKeySizeOnRecieve = CPA_FALSE;
181578ee8d1cSJulian Grajkowski 		pCookie->pNext = NULL;
181678ee8d1cSJulian Grajkowski 		pCookie->instanceHandle = pService;
181778ee8d1cSJulian Grajkowski 
181878ee8d1cSJulian Grajkowski 		/* get the qat packet type for LAC packet type */
181978ee8d1cSJulian Grajkowski 		LacSymQat_packetTypeGet(pOpData->packetType,
182078ee8d1cSJulian Grajkowski 					pSessionDesc->partialState,
182178ee8d1cSJulian Grajkowski 					&qatPacketType);
182278ee8d1cSJulian Grajkowski 		/*
182378ee8d1cSJulian Grajkowski 		 * For XTS mode, the key size must be updated after
182478ee8d1cSJulian Grajkowski 		 * the first partial has been sent. Set a flag here so the
182578ee8d1cSJulian Grajkowski 		 * response knows to do this.
182678ee8d1cSJulian Grajkowski 		 */
1827a977168cSMichal Gulbicki 		if (LAC_CIPHER_IS_XTS_MODE(cipher) &&
1828a977168cSMichal Gulbicki 		    (laCmdId != ICP_QAT_FW_LA_CMD_AUTH) &&
182978ee8d1cSJulian Grajkowski 		    (CPA_CY_SYM_PACKET_TYPE_PARTIAL == pOpData->packetType) &&
183078ee8d1cSJulian Grajkowski 		    (qatPacketType == ICP_QAT_FW_LA_PARTIAL_START)) {
183178ee8d1cSJulian Grajkowski 			pCookie->updateKeySizeOnRecieve = CPA_TRUE;
183278ee8d1cSJulian Grajkowski 		}
183378ee8d1cSJulian Grajkowski 
183478ee8d1cSJulian Grajkowski 		/*
183578ee8d1cSJulian Grajkowski 		 * Now create the Request.
183678ee8d1cSJulian Grajkowski 		 * Start by populating it from the cache in the session
183778ee8d1cSJulian Grajkowski 		 * descriptor.
183878ee8d1cSJulian Grajkowski 		 */
183978ee8d1cSJulian Grajkowski 		pMsg = &(pCookie->qatMsg);
184078ee8d1cSJulian Grajkowski 		pMsgDummy = (Cpa8U *)pMsg;
184178ee8d1cSJulian Grajkowski 
1842a977168cSMichal Gulbicki 		if (SPC == pSessionDesc->singlePassState) {
184378ee8d1cSJulian Grajkowski 			pCacheDummyHdr =
184478ee8d1cSJulian Grajkowski 			    (Cpa8U *)&(pSessionDesc->reqSpcCacheHdr);
184578ee8d1cSJulian Grajkowski 			pCacheDummyFtr =
184678ee8d1cSJulian Grajkowski 			    (Cpa8U *)&(pSessionDesc->reqSpcCacheFtr);
184778ee8d1cSJulian Grajkowski 		} else {
184878ee8d1cSJulian Grajkowski 			/* Normally, we want to use the SHRAM Constants Table if
1849a977168cSMichal Gulbicki 			 * possible for best performance (less DRAM accesses
1850a977168cSMichal Gulbicki 			 * incurred by CPM).  But we can't use it for
1851a977168cSMichal Gulbicki 			 * partial-packet hash operations.  This is why we build
1852a977168cSMichal Gulbicki 			 * 2 versions of the message template at sessionInit,
185378ee8d1cSJulian Grajkowski 			 * one for SHRAM Constants Table usage and the other
1854a977168cSMichal Gulbicki 			 * (default) for Content Descriptor h/w setup data in
1855a977168cSMichal Gulbicki 			 * DRAM.  And we chose between them here on a
1856a977168cSMichal Gulbicki 			 * per-request basis, when we know the packetType
185778ee8d1cSJulian Grajkowski 			 */
185878ee8d1cSJulian Grajkowski 			if ((!pSessionDesc->useSymConstantsTable) ||
185978ee8d1cSJulian Grajkowski 			    (pSessionDesc->isAuth &&
186078ee8d1cSJulian Grajkowski 			     (CPA_CY_SYM_PACKET_TYPE_FULL !=
186178ee8d1cSJulian Grajkowski 			      pOpData->packetType))) {
186278ee8d1cSJulian Grajkowski 				pCacheDummyHdr =
186378ee8d1cSJulian Grajkowski 				    (Cpa8U *)&(pSessionDesc->reqCacheHdr);
186478ee8d1cSJulian Grajkowski 				pCacheDummyFtr =
186578ee8d1cSJulian Grajkowski 				    (Cpa8U *)&(pSessionDesc->reqCacheFtr);
186678ee8d1cSJulian Grajkowski 			} else {
186778ee8d1cSJulian Grajkowski 				pCacheDummyHdr =
186878ee8d1cSJulian Grajkowski 				    (Cpa8U *)&(pSessionDesc->shramReqCacheHdr);
186978ee8d1cSJulian Grajkowski 				pCacheDummyFtr =
187078ee8d1cSJulian Grajkowski 				    (Cpa8U *)&(pSessionDesc->shramReqCacheFtr);
187178ee8d1cSJulian Grajkowski 			}
187278ee8d1cSJulian Grajkowski 		}
187378ee8d1cSJulian Grajkowski 		memcpy(pMsgDummy,
187478ee8d1cSJulian Grajkowski 		       pCacheDummyHdr,
187578ee8d1cSJulian Grajkowski 		       (LAC_LONG_WORD_IN_BYTES * LAC_SIZE_OF_CACHE_HDR_IN_LW));
187678ee8d1cSJulian Grajkowski 		memset((pMsgDummy +
187778ee8d1cSJulian Grajkowski 			(LAC_LONG_WORD_IN_BYTES * LAC_SIZE_OF_CACHE_HDR_IN_LW)),
187878ee8d1cSJulian Grajkowski 		       0,
187978ee8d1cSJulian Grajkowski 		       (LAC_LONG_WORD_IN_BYTES *
188078ee8d1cSJulian Grajkowski 			LAC_SIZE_OF_CACHE_TO_CLEAR_IN_LW));
1881a977168cSMichal Gulbicki 		memcpy(pMsgDummy +
1882a977168cSMichal Gulbicki 			   (LAC_LONG_WORD_IN_BYTES *
188378ee8d1cSJulian Grajkowski 			    LAC_START_OF_CACHE_FTR_IN_LW),
188478ee8d1cSJulian Grajkowski 		       pCacheDummyFtr,
188578ee8d1cSJulian Grajkowski 		       (LAC_LONG_WORD_IN_BYTES * LAC_SIZE_OF_CACHE_FTR_IN_LW));
188678ee8d1cSJulian Grajkowski 		/*
188778ee8d1cSJulian Grajkowski 		 * Populate the comn_mid section
188878ee8d1cSJulian Grajkowski 		 */
188978ee8d1cSJulian Grajkowski 		SalQatMsg_CmnMidWrite(pMsg,
189078ee8d1cSJulian Grajkowski 				      pCookie,
189178ee8d1cSJulian Grajkowski 				      LAC_SYM_DEFAULT_QAT_PTR_TYPE,
189278ee8d1cSJulian Grajkowski 				      srcAddrPhys,
189378ee8d1cSJulian Grajkowski 				      dstAddrPhys,
189478ee8d1cSJulian Grajkowski 				      0,
189578ee8d1cSJulian Grajkowski 				      0);
189678ee8d1cSJulian Grajkowski 
189778ee8d1cSJulian Grajkowski 		/*
189878ee8d1cSJulian Grajkowski 		 * Populate the serv_specif_flags field of the Request header
189978ee8d1cSJulian Grajkowski 		 * Some of the flags are set up here.
190078ee8d1cSJulian Grajkowski 		 * Others are set up later when the RequestParams are set up.
190178ee8d1cSJulian Grajkowski 		 */
190278ee8d1cSJulian Grajkowski 
190378ee8d1cSJulian Grajkowski 		LacSymQat_LaPacketCommandFlagSet(
190478ee8d1cSJulian Grajkowski 		    qatPacketType,
190578ee8d1cSJulian Grajkowski 		    laCmdId,
1906a977168cSMichal Gulbicki 		    cipher,
190778ee8d1cSJulian Grajkowski 		    &pMsg->comn_hdr.serv_specif_flags,
190878ee8d1cSJulian Grajkowski 		    pOpData->ivLenInBytes);
190978ee8d1cSJulian Grajkowski 
1910a977168cSMichal Gulbicki 		if (SPC == pSessionDesc->singlePassState) {
191178ee8d1cSJulian Grajkowski 			ICP_QAT_FW_LA_GCM_IV_LEN_FLAG_SET(
191278ee8d1cSJulian Grajkowski 			    pMsg->comn_hdr.serv_specif_flags,
191378ee8d1cSJulian Grajkowski 			    ICP_QAT_FW_LA_GCM_IV_LEN_NOT_12_OCTETS);
191478ee8d1cSJulian Grajkowski 
191578ee8d1cSJulian Grajkowski 			if (CPA_CY_SYM_PACKET_TYPE_PARTIAL ==
191678ee8d1cSJulian Grajkowski 			    pOpData->packetType) {
191778ee8d1cSJulian Grajkowski 				ICP_QAT_FW_LA_RET_AUTH_SET(
191878ee8d1cSJulian Grajkowski 				    pMsg->comn_hdr.serv_specif_flags,
191978ee8d1cSJulian Grajkowski 				    ICP_QAT_FW_LA_NO_RET_AUTH_RES);
192078ee8d1cSJulian Grajkowski 
192178ee8d1cSJulian Grajkowski 				ICP_QAT_FW_LA_CMP_AUTH_SET(
192278ee8d1cSJulian Grajkowski 				    pMsg->comn_hdr.serv_specif_flags,
192378ee8d1cSJulian Grajkowski 				    ICP_QAT_FW_LA_NO_CMP_AUTH_RES);
192478ee8d1cSJulian Grajkowski 			}
192578ee8d1cSJulian Grajkowski 		}
192678ee8d1cSJulian Grajkowski 
1927a977168cSMichal Gulbicki 		ICP_QAT_FW_LA_SLICE_TYPE_SET(pMsg->comn_hdr.serv_specif_flags,
1928a977168cSMichal Gulbicki 					     pSessionDesc->cipherSliceType);
1929a977168cSMichal Gulbicki 
193078ee8d1cSJulian Grajkowski 		LacBuffDesc_BufferListTotalSizeGet(pSrcBuffer, &srcPktSize);
1931a977168cSMichal Gulbicki 		LacBuffDesc_BufferListTotalSizeGet(pDstBuffer, &dstPktSize);
193278ee8d1cSJulian Grajkowski 
193378ee8d1cSJulian Grajkowski 		/*
193478ee8d1cSJulian Grajkowski 		 * Populate the CipherRequestParams section of the Request
193578ee8d1cSJulian Grajkowski 		 */
193678ee8d1cSJulian Grajkowski 		if (laCmdId != ICP_QAT_FW_LA_CMD_AUTH) {
193778ee8d1cSJulian Grajkowski 
193878ee8d1cSJulian Grajkowski 			Cpa8U *pIvBuffer = NULL;
193978ee8d1cSJulian Grajkowski 
1940a977168cSMichal Gulbicki 			status = LacCipher_PerformParamCheck(cipher,
1941a977168cSMichal Gulbicki 							     pOpData,
1942a977168cSMichal Gulbicki 							     srcPktSize);
194378ee8d1cSJulian Grajkowski 			if (CPA_STATUS_SUCCESS != status) {
194478ee8d1cSJulian Grajkowski 				/* free the cookie */
194578ee8d1cSJulian Grajkowski 				Lac_MemPoolEntryFree(pCookie);
194678ee8d1cSJulian Grajkowski 				return status;
194778ee8d1cSJulian Grajkowski 			}
194878ee8d1cSJulian Grajkowski 
194978ee8d1cSJulian Grajkowski 			if (CPA_STATUS_SUCCESS == status) {
195078ee8d1cSJulian Grajkowski 				/* align cipher IV */
195178ee8d1cSJulian Grajkowski 				status = LacCipher_PerformIvCheck(
195278ee8d1cSJulian Grajkowski 				    &(pService->generic_service_info),
195378ee8d1cSJulian Grajkowski 				    pCookie,
195478ee8d1cSJulian Grajkowski 				    qatPacketType,
195578ee8d1cSJulian Grajkowski 				    &pIvBuffer);
195678ee8d1cSJulian Grajkowski 			}
1957a977168cSMichal Gulbicki 			if ((SPC == pSessionDesc->singlePassState) &&
195878ee8d1cSJulian Grajkowski 			    ((ICP_QAT_FW_LA_PARTIAL_MID == qatPacketType) ||
195978ee8d1cSJulian Grajkowski 			     (ICP_QAT_FW_LA_PARTIAL_END == qatPacketType))) {
196078ee8d1cSJulian Grajkowski 				/* For SPC stateful cipher state size for mid
1961a977168cSMichal Gulbicki 				 * and end partial packet is 48 bytes
196278ee8d1cSJulian Grajkowski 				 */
196378ee8d1cSJulian Grajkowski 				pSpcCdCtrlHdr =
196478ee8d1cSJulian Grajkowski 				    (icp_qat_fw_cipher_cd_ctrl_hdr_t *)&(
196578ee8d1cSJulian Grajkowski 					pMsg->cd_ctrl);
196678ee8d1cSJulian Grajkowski 				pSpcCdCtrlHdr->cipher_state_sz =
196778ee8d1cSJulian Grajkowski 				    LAC_BYTES_TO_QUADWORDS(
1968a977168cSMichal Gulbicki 					LAC_SYM_QAT_CIPHER_SPC_STATE_SIZE);
196978ee8d1cSJulian Grajkowski 			}
197078ee8d1cSJulian Grajkowski 			/*populate the cipher request parameters */
197178ee8d1cSJulian Grajkowski 			if (CPA_STATUS_SUCCESS == status) {
197278ee8d1cSJulian Grajkowski 				Cpa64U ivBufferPhysAddr = 0;
197378ee8d1cSJulian Grajkowski 
197478ee8d1cSJulian Grajkowski 				if (pIvBuffer != NULL) {
197578ee8d1cSJulian Grajkowski 					/* User OpData memory being used for IV
197678ee8d1cSJulian Grajkowski 					 * buffer */
197778ee8d1cSJulian Grajkowski 					/* get the physical address */
197878ee8d1cSJulian Grajkowski 					ivBufferPhysAddr =
197978ee8d1cSJulian Grajkowski 					    LAC_OS_VIRT_TO_PHYS_EXTERNAL(
198078ee8d1cSJulian Grajkowski 						pService->generic_service_info,
198178ee8d1cSJulian Grajkowski 						pIvBuffer);
198278ee8d1cSJulian Grajkowski 					if (0 == ivBufferPhysAddr) {
198378ee8d1cSJulian Grajkowski 						LAC_LOG_ERROR(
198478ee8d1cSJulian Grajkowski 						    "Unable to get the physical address "
198578ee8d1cSJulian Grajkowski 						    "of the IV\n");
198678ee8d1cSJulian Grajkowski 						status = CPA_STATUS_FAIL;
198778ee8d1cSJulian Grajkowski 					}
198878ee8d1cSJulian Grajkowski 				}
198978ee8d1cSJulian Grajkowski 
199078ee8d1cSJulian Grajkowski 				if (status == CPA_STATUS_SUCCESS) {
199178ee8d1cSJulian Grajkowski 					status =
199278ee8d1cSJulian Grajkowski 					    LacSymQat_CipherRequestParamsPopulate(
1993a977168cSMichal Gulbicki 						pSessionDesc,
199478ee8d1cSJulian Grajkowski 						pMsg,
199578ee8d1cSJulian Grajkowski 						pOpData
199678ee8d1cSJulian Grajkowski 						    ->cryptoStartSrcOffsetInBytes,
199778ee8d1cSJulian Grajkowski 						pOpData
199878ee8d1cSJulian Grajkowski 						    ->messageLenToCipherInBytes,
199978ee8d1cSJulian Grajkowski 						ivBufferPhysAddr,
200078ee8d1cSJulian Grajkowski 						pIvBuffer);
200178ee8d1cSJulian Grajkowski 				}
200278ee8d1cSJulian Grajkowski 			}
200378ee8d1cSJulian Grajkowski 
2004a977168cSMichal Gulbicki 			if ((SPC == pSessionDesc->singlePassState) &&
2005a977168cSMichal Gulbicki 			    CPA_STATUS_SUCCESS == status) {
200678ee8d1cSJulian Grajkowski 				Cpa64U aadBufferPhysAddr = 0;
200778ee8d1cSJulian Grajkowski 
200878ee8d1cSJulian Grajkowski 				/* For CHACHA and AES-GCM there is an AAD buffer
2009a977168cSMichal Gulbicki 				 * if aadLenInBytes is nonzero In case of
2010a977168cSMichal Gulbicki 				 * AES-GMAC, AAD buffer passed in the src
2011a977168cSMichal Gulbicki 				 * buffer.
201278ee8d1cSJulian Grajkowski 				 */
2013a977168cSMichal Gulbicki 				if ((0 != aadLenInBytes &&
2014a977168cSMichal Gulbicki 				     CPA_CY_SYM_HASH_AES_GMAC != hash) ||
2015a977168cSMichal Gulbicki 				    isSpCcm) {
201678ee8d1cSJulian Grajkowski 					LAC_CHECK_NULL_PARAM(
201778ee8d1cSJulian Grajkowski 					    pOpData->pAdditionalAuthData);
2018a977168cSMichal Gulbicki 					Cpa32U aadDataLen =
2019a977168cSMichal Gulbicki 					    pSessionDesc->aadLenInBytes;
2020a977168cSMichal Gulbicki 
2021a977168cSMichal Gulbicki 					/* In case of AES_CCM, B0 block size and
2022a977168cSMichal Gulbicki 					 * 2 bytes of AAD len encoding need to
2023a977168cSMichal Gulbicki 					 * be added to total AAD data len */
2024a977168cSMichal Gulbicki 					if (isSpCcm)
2025a977168cSMichal Gulbicki 						aadDataLen +=
2026a977168cSMichal Gulbicki 						    LAC_CIPHER_CCM_AAD_OFFSET;
2027a977168cSMichal Gulbicki 
202878ee8d1cSJulian Grajkowski 					blockLen =
202978ee8d1cSJulian Grajkowski 					    LacSymQat_CipherBlockSizeBytesGet(
2030a977168cSMichal Gulbicki 						cipher);
2031a977168cSMichal Gulbicki 					if ((aadDataLen % blockLen) != 0) {
203278ee8d1cSJulian Grajkowski 						paddingLen = blockLen -
2033a977168cSMichal Gulbicki 						    (aadDataLen % blockLen);
203478ee8d1cSJulian Grajkowski 						memset(
2035a977168cSMichal Gulbicki 						    &pOpData
2036a977168cSMichal Gulbicki 							 ->pAdditionalAuthData
2037a977168cSMichal Gulbicki 							     [aadDataLen],
203878ee8d1cSJulian Grajkowski 						    0,
203978ee8d1cSJulian Grajkowski 						    paddingLen);
204078ee8d1cSJulian Grajkowski 					}
204178ee8d1cSJulian Grajkowski 
2042a977168cSMichal Gulbicki 					/* User OpData memory being used for AAD
204378ee8d1cSJulian Grajkowski 					 * buffer */
204478ee8d1cSJulian Grajkowski 					/* get the physical address */
204578ee8d1cSJulian Grajkowski 					aadBufferPhysAddr =
204678ee8d1cSJulian Grajkowski 					    LAC_OS_VIRT_TO_PHYS_EXTERNAL(
204778ee8d1cSJulian Grajkowski 						pService->generic_service_info,
204878ee8d1cSJulian Grajkowski 						pOpData->pAdditionalAuthData);
204978ee8d1cSJulian Grajkowski 					if (0 == aadBufferPhysAddr) {
205078ee8d1cSJulian Grajkowski 						LAC_LOG_ERROR(
205178ee8d1cSJulian Grajkowski 						    "Unable to get the physical address "
205278ee8d1cSJulian Grajkowski 						    "of the aad\n");
205378ee8d1cSJulian Grajkowski 						status = CPA_STATUS_FAIL;
205478ee8d1cSJulian Grajkowski 					}
205578ee8d1cSJulian Grajkowski 				}
205678ee8d1cSJulian Grajkowski 
205778ee8d1cSJulian Grajkowski 				if (CPA_STATUS_SUCCESS == status) {
205878ee8d1cSJulian Grajkowski 					icp_qat_fw_la_cipher_req_params_t *pCipherReqParams =
205978ee8d1cSJulian Grajkowski 					    (icp_qat_fw_la_cipher_req_params_t
206078ee8d1cSJulian Grajkowski 						 *)((Cpa8U *)&(
206178ee8d1cSJulian Grajkowski 							pMsg->serv_specif_rqpars) +
206278ee8d1cSJulian Grajkowski 						    ICP_QAT_FW_CIPHER_REQUEST_PARAMETERS_OFFSET);
2063a977168cSMichal Gulbicki 
2064a977168cSMichal Gulbicki 					icp_qat_fw_la_cipher_20_req_params_t
2065a977168cSMichal Gulbicki 					    *pCipher20ReqParams =
2066a977168cSMichal Gulbicki 						(void
2067a977168cSMichal Gulbicki 						     *)((Cpa8U *)&(
2068a977168cSMichal Gulbicki 							    pMsg->serv_specif_rqpars) +
2069a977168cSMichal Gulbicki 							ICP_QAT_FW_CIPHER_REQUEST_PARAMETERS_OFFSET);
2070a977168cSMichal Gulbicki 
2071a977168cSMichal Gulbicki 					if (isCyGen4x(pService)) {
2072a977168cSMichal Gulbicki 						pCipher20ReqParams
2073a977168cSMichal Gulbicki 						    ->spc_aad_addr =
2074a977168cSMichal Gulbicki 						    aadBufferPhysAddr;
2075a977168cSMichal Gulbicki 						pCipher20ReqParams->spc_aad_sz =
2076a977168cSMichal Gulbicki 						    pSessionDesc->aadLenInBytes;
2077a977168cSMichal Gulbicki 						pCipher20ReqParams
2078a977168cSMichal Gulbicki 						    ->spc_aad_offset = 0;
2079a977168cSMichal Gulbicki 						if (isSpCcm)
2080a977168cSMichal Gulbicki 							pCipher20ReqParams
2081a977168cSMichal Gulbicki 							    ->spc_aad_sz +=
2082a977168cSMichal Gulbicki 							    LAC_CIPHER_CCM_AAD_OFFSET;
2083a977168cSMichal Gulbicki 					} else {
208478ee8d1cSJulian Grajkowski 						pCipherReqParams->spc_aad_addr =
208578ee8d1cSJulian Grajkowski 						    aadBufferPhysAddr;
208678ee8d1cSJulian Grajkowski 						pCipherReqParams->spc_aad_sz =
2087a977168cSMichal Gulbicki 						    (Cpa16U)pSessionDesc
2088a977168cSMichal Gulbicki 							->aadLenInBytes;
2089a977168cSMichal Gulbicki 					}
209078ee8d1cSJulian Grajkowski 
209178ee8d1cSJulian Grajkowski 					if (CPA_TRUE !=
209278ee8d1cSJulian Grajkowski 					    pSessionDesc->digestIsAppended) {
209378ee8d1cSJulian Grajkowski 						Cpa64U digestBufferPhysAddr = 0;
209478ee8d1cSJulian Grajkowski 						/* User OpData memory being used
209578ee8d1cSJulian Grajkowski 						 * for digest buffer */
209678ee8d1cSJulian Grajkowski 						/* get the physical address */
209778ee8d1cSJulian Grajkowski 						digestBufferPhysAddr =
209878ee8d1cSJulian Grajkowski 						    LAC_OS_VIRT_TO_PHYS_EXTERNAL(
209978ee8d1cSJulian Grajkowski 							pService
210078ee8d1cSJulian Grajkowski 							    ->generic_service_info,
210178ee8d1cSJulian Grajkowski 							pOpData->pDigestResult);
210278ee8d1cSJulian Grajkowski 						if (0 != digestBufferPhysAddr) {
2103a977168cSMichal Gulbicki 							if (isCyGen4x(
2104a977168cSMichal Gulbicki 								pService)) {
2105a977168cSMichal Gulbicki 								pCipher20ReqParams
2106a977168cSMichal Gulbicki 								    ->spc_auth_res_addr =
2107a977168cSMichal Gulbicki 								    digestBufferPhysAddr;
2108a977168cSMichal Gulbicki 								pCipher20ReqParams
2109a977168cSMichal Gulbicki 								    ->spc_auth_res_sz =
2110a977168cSMichal Gulbicki 								    (Cpa8U)pSessionDesc
2111a977168cSMichal Gulbicki 									->hashResultSize;
2112a977168cSMichal Gulbicki 							} else {
211378ee8d1cSJulian Grajkowski 								pCipherReqParams
211478ee8d1cSJulian Grajkowski 								    ->spc_auth_res_addr =
211578ee8d1cSJulian Grajkowski 								    digestBufferPhysAddr;
211678ee8d1cSJulian Grajkowski 								pCipherReqParams
211778ee8d1cSJulian Grajkowski 								    ->spc_auth_res_sz =
2118a977168cSMichal Gulbicki 								    (Cpa8U)pSessionDesc
211978ee8d1cSJulian Grajkowski 									->hashResultSize;
2120a977168cSMichal Gulbicki 							}
212178ee8d1cSJulian Grajkowski 						} else {
212278ee8d1cSJulian Grajkowski 							LAC_LOG_ERROR(
212378ee8d1cSJulian Grajkowski 							    "Unable to get the physical address "
212478ee8d1cSJulian Grajkowski 							    "of the digest\n");
212578ee8d1cSJulian Grajkowski 							status =
212678ee8d1cSJulian Grajkowski 							    CPA_STATUS_FAIL;
212778ee8d1cSJulian Grajkowski 						}
2128a977168cSMichal Gulbicki 					} else {
2129a977168cSMichal Gulbicki 						/* Check if the dest buffer can
2130a977168cSMichal Gulbicki 						 * handle the digest, only for
2131a977168cSMichal Gulbicki 						 * last packet */
2132a977168cSMichal Gulbicki 						if (((ICP_QAT_FW_LA_PARTIAL_NONE ==
2133a977168cSMichal Gulbicki 						      qatPacketType) ||
2134a977168cSMichal Gulbicki 						     (ICP_QAT_FW_LA_PARTIAL_END ==
2135a977168cSMichal Gulbicki 						      qatPacketType))) {
2136a977168cSMichal Gulbicki 							if (dstPktSize <
2137a977168cSMichal Gulbicki 							    (pOpData
2138a977168cSMichal Gulbicki 								 ->cryptoStartSrcOffsetInBytes +
2139a977168cSMichal Gulbicki 							     pOpData
2140a977168cSMichal Gulbicki 								 ->messageLenToCipherInBytes +
2141a977168cSMichal Gulbicki 							     pSessionDesc
2142a977168cSMichal Gulbicki 								 ->hashResultSize))
2143a977168cSMichal Gulbicki 								status =
2144a977168cSMichal Gulbicki 								    CPA_STATUS_INVALID_PARAM;
2145a977168cSMichal Gulbicki 						}
2146a977168cSMichal Gulbicki 						if (isCyGen4x(pService)) {
2147a977168cSMichal Gulbicki 							pCipher20ReqParams
2148a977168cSMichal Gulbicki 							    ->spc_auth_res_sz =
2149a977168cSMichal Gulbicki 							    (Cpa8U)pSessionDesc
2150a977168cSMichal Gulbicki 								->hashResultSize;
2151a977168cSMichal Gulbicki 						} else {
2152a977168cSMichal Gulbicki 							pCipherReqParams
2153a977168cSMichal Gulbicki 							    ->spc_auth_res_sz =
2154a977168cSMichal Gulbicki 							    (Cpa8U)pSessionDesc
2155a977168cSMichal Gulbicki 								->hashResultSize;
2156a977168cSMichal Gulbicki 						}
215778ee8d1cSJulian Grajkowski 					}
215878ee8d1cSJulian Grajkowski 				}
215978ee8d1cSJulian Grajkowski 			}
216078ee8d1cSJulian Grajkowski 		}
216178ee8d1cSJulian Grajkowski 
216278ee8d1cSJulian Grajkowski 		/*
216378ee8d1cSJulian Grajkowski 		 * Set up HashRequestParams part of Request
216478ee8d1cSJulian Grajkowski 		 */
216578ee8d1cSJulian Grajkowski 		if ((status == CPA_STATUS_SUCCESS) &&
216678ee8d1cSJulian Grajkowski 		    (laCmdId != ICP_QAT_FW_LA_CMD_CIPHER)) {
216778ee8d1cSJulian Grajkowski 			Cpa32U authOffsetInBytes =
216878ee8d1cSJulian Grajkowski 			    pOpData->hashStartSrcOffsetInBytes;
216978ee8d1cSJulian Grajkowski 			Cpa32U authLenInBytes =
217078ee8d1cSJulian Grajkowski 			    pOpData->messageLenToHashInBytes;
217178ee8d1cSJulian Grajkowski 
217278ee8d1cSJulian Grajkowski 			status = LacHash_PerformParamCheck(instanceHandle,
217378ee8d1cSJulian Grajkowski 							   pSessionDesc,
217478ee8d1cSJulian Grajkowski 							   pOpData,
217578ee8d1cSJulian Grajkowski 							   srcPktSize,
217678ee8d1cSJulian Grajkowski 							   pVerifyResult);
217778ee8d1cSJulian Grajkowski 			if (CPA_STATUS_SUCCESS != status) {
217878ee8d1cSJulian Grajkowski 				/* free the cookie */
217978ee8d1cSJulian Grajkowski 				Lac_MemPoolEntryFree(pCookie);
218078ee8d1cSJulian Grajkowski 				return status;
218178ee8d1cSJulian Grajkowski 			}
218278ee8d1cSJulian Grajkowski 			if (CPA_STATUS_SUCCESS == status) {
218378ee8d1cSJulian Grajkowski 				/* Info structure for CCM/GCM */
218478ee8d1cSJulian Grajkowski 				lac_sym_qat_hash_state_buffer_info_t
218578ee8d1cSJulian Grajkowski 				    hashStateBufferInfo = { 0 };
218678ee8d1cSJulian Grajkowski 				lac_sym_qat_hash_state_buffer_info_t
218778ee8d1cSJulian Grajkowski 				    *pHashStateBufferInfo =
218878ee8d1cSJulian Grajkowski 					&(pSessionDesc->hashStateBufferInfo);
218978ee8d1cSJulian Grajkowski 
219078ee8d1cSJulian Grajkowski 				if (CPA_TRUE == pSessionDesc->isAuthEncryptOp) {
219178ee8d1cSJulian Grajkowski 					icp_qat_fw_la_auth_req_params_t *pHashReqParams =
219278ee8d1cSJulian Grajkowski 					    (icp_qat_fw_la_auth_req_params_t
219378ee8d1cSJulian Grajkowski 						 *)((Cpa8U *)&(
219478ee8d1cSJulian Grajkowski 							pMsg->serv_specif_rqpars) +
219578ee8d1cSJulian Grajkowski 						    ICP_QAT_FW_HASH_REQUEST_PARAMETERS_OFFSET);
219678ee8d1cSJulian Grajkowski 
219778ee8d1cSJulian Grajkowski 					hashStateBufferInfo.pData =
219878ee8d1cSJulian Grajkowski 					    pOpData->pAdditionalAuthData;
219978ee8d1cSJulian Grajkowski 					if (pOpData->pAdditionalAuthData ==
220078ee8d1cSJulian Grajkowski 					    NULL) {
220178ee8d1cSJulian Grajkowski 						hashStateBufferInfo.pDataPhys =
220278ee8d1cSJulian Grajkowski 						    0;
220378ee8d1cSJulian Grajkowski 					} else {
220478ee8d1cSJulian Grajkowski 						hashStateBufferInfo
220578ee8d1cSJulian Grajkowski 						    .pDataPhys = LAC_MEM_CAST_PTR_TO_UINT64(
220678ee8d1cSJulian Grajkowski 						    LAC_OS_VIRT_TO_PHYS_EXTERNAL(
220778ee8d1cSJulian Grajkowski 							pService
220878ee8d1cSJulian Grajkowski 							    ->generic_service_info,
220978ee8d1cSJulian Grajkowski 							pOpData
221078ee8d1cSJulian Grajkowski 							    ->pAdditionalAuthData));
221178ee8d1cSJulian Grajkowski 					}
221278ee8d1cSJulian Grajkowski 
221378ee8d1cSJulian Grajkowski 					hashStateBufferInfo
221478ee8d1cSJulian Grajkowski 					    .stateStorageSzQuadWords = 0;
221578ee8d1cSJulian Grajkowski 					hashStateBufferInfo
221678ee8d1cSJulian Grajkowski 					    .prefixAadSzQuadWords =
221778ee8d1cSJulian Grajkowski 					    LAC_BYTES_TO_QUADWORDS(
221878ee8d1cSJulian Grajkowski 						pHashReqParams->u2.aad_sz);
221978ee8d1cSJulian Grajkowski 
222078ee8d1cSJulian Grajkowski 					/* Overwrite hash state buffer info
2221a977168cSMichal Gulbicki 					 * structure pointer with the one
2222a977168cSMichal Gulbicki 					 * created for CCM/GCM */
222378ee8d1cSJulian Grajkowski 					pHashStateBufferInfo =
222478ee8d1cSJulian Grajkowski 					    &hashStateBufferInfo;
222578ee8d1cSJulian Grajkowski 
222678ee8d1cSJulian Grajkowski 					/* Aad buffer could be null in the GCM
222778ee8d1cSJulian Grajkowski 					 * case */
222878ee8d1cSJulian Grajkowski 					if (0 ==
222978ee8d1cSJulian Grajkowski 						hashStateBufferInfo.pDataPhys &&
2230a977168cSMichal Gulbicki 					    CPA_CY_SYM_HASH_AES_GCM != hash &&
2231a977168cSMichal Gulbicki 					    CPA_CY_SYM_HASH_AES_GMAC != hash) {
223278ee8d1cSJulian Grajkowski 						LAC_LOG_ERROR(
223378ee8d1cSJulian Grajkowski 						    "Unable to get the physical address"
223478ee8d1cSJulian Grajkowski 						    "of the AAD\n");
223578ee8d1cSJulian Grajkowski 						status = CPA_STATUS_FAIL;
223678ee8d1cSJulian Grajkowski 					}
223778ee8d1cSJulian Grajkowski 
223878ee8d1cSJulian Grajkowski 					/* for CCM/GCM the hash and cipher data
2239a977168cSMichal Gulbicki 					 * regions are equal */
224078ee8d1cSJulian Grajkowski 					authOffsetInBytes =
224178ee8d1cSJulian Grajkowski 					    pOpData
224278ee8d1cSJulian Grajkowski 						->cryptoStartSrcOffsetInBytes;
224378ee8d1cSJulian Grajkowski 
224478ee8d1cSJulian Grajkowski 					/* For authenticated encryption,
2245a977168cSMichal Gulbicki 					 * authentication length is determined
2246a977168cSMichal Gulbicki 					 * by messageLenToCipherInBytes for
2247a977168cSMichal Gulbicki 					 * AES-GCM and AES-CCM, and by
224878ee8d1cSJulian Grajkowski 					 * messageLenToHashInBytes for AES-GMAC.
224978ee8d1cSJulian Grajkowski 					 * You don't see the latter here, as
2250a977168cSMichal Gulbicki 					 * that is the initial value of
2251a977168cSMichal Gulbicki 					 * authLenInBytes. */
2252a977168cSMichal Gulbicki 					if (hash != CPA_CY_SYM_HASH_AES_GMAC)
225378ee8d1cSJulian Grajkowski 						authLenInBytes =
225478ee8d1cSJulian Grajkowski 						    pOpData
225578ee8d1cSJulian Grajkowski 							->messageLenToCipherInBytes;
225678ee8d1cSJulian Grajkowski 				} else if (CPA_CY_SYM_HASH_SNOW3G_UIA2 ==
2257a977168cSMichal Gulbicki 					       hash ||
2258a977168cSMichal Gulbicki 					   CPA_CY_SYM_HASH_ZUC_EIA3 == hash) {
225978ee8d1cSJulian Grajkowski 					hashStateBufferInfo.pData =
226078ee8d1cSJulian Grajkowski 					    pOpData->pAdditionalAuthData;
226178ee8d1cSJulian Grajkowski 					hashStateBufferInfo.pDataPhys =
226278ee8d1cSJulian Grajkowski 					    LAC_OS_VIRT_TO_PHYS_EXTERNAL(
226378ee8d1cSJulian Grajkowski 						pService->generic_service_info,
226478ee8d1cSJulian Grajkowski 						hashStateBufferInfo.pData);
226578ee8d1cSJulian Grajkowski 					hashStateBufferInfo
226678ee8d1cSJulian Grajkowski 					    .stateStorageSzQuadWords = 0;
226778ee8d1cSJulian Grajkowski 					hashStateBufferInfo
226878ee8d1cSJulian Grajkowski 					    .prefixAadSzQuadWords =
226978ee8d1cSJulian Grajkowski 					    LAC_BYTES_TO_QUADWORDS(
2270a977168cSMichal Gulbicki 						aadLenInBytes);
227178ee8d1cSJulian Grajkowski 
227278ee8d1cSJulian Grajkowski 					pHashStateBufferInfo =
227378ee8d1cSJulian Grajkowski 					    &hashStateBufferInfo;
227478ee8d1cSJulian Grajkowski 
227578ee8d1cSJulian Grajkowski 					if (0 ==
227678ee8d1cSJulian Grajkowski 					    hashStateBufferInfo.pDataPhys) {
227778ee8d1cSJulian Grajkowski 						LAC_LOG_ERROR(
227878ee8d1cSJulian Grajkowski 						    "Unable to get the physical address"
227978ee8d1cSJulian Grajkowski 						    "of the AAD\n");
228078ee8d1cSJulian Grajkowski 						status = CPA_STATUS_FAIL;
228178ee8d1cSJulian Grajkowski 					}
228278ee8d1cSJulian Grajkowski 				}
2283a977168cSMichal Gulbicki 				if (CPA_CY_SYM_HASH_AES_CCM == hash) {
228478ee8d1cSJulian Grajkowski 					if (CPA_CY_SYM_CIPHER_DIRECTION_DECRYPT ==
228578ee8d1cSJulian Grajkowski 					    pSessionDesc->cipherDirection) {
228678ee8d1cSJulian Grajkowski 						/* On a decrypt path pSrcBuffer
2287a977168cSMichal Gulbicki 						 * is used as this is where
2288a977168cSMichal Gulbicki 						 * encrypted digest is located.
2289a977168cSMichal Gulbicki 						 * Firmware uses encrypted
2290a977168cSMichal Gulbicki 						 * digest for
229178ee8d1cSJulian Grajkowski 						 * compare/verification*/
229278ee8d1cSJulian Grajkowski 						pBufferList =
229378ee8d1cSJulian Grajkowski 						    (CpaBufferList *)pSrcBuffer;
229478ee8d1cSJulian Grajkowski 					} else {
229578ee8d1cSJulian Grajkowski 						/* On an encrypt path pDstBuffer
2296a977168cSMichal Gulbicki 						 * is used as this is where
2297a977168cSMichal Gulbicki 						 * encrypted digest will be
2298a977168cSMichal Gulbicki 						 * written */
229978ee8d1cSJulian Grajkowski 						pBufferList =
230078ee8d1cSJulian Grajkowski 						    (CpaBufferList *)pDstBuffer;
230178ee8d1cSJulian Grajkowski 					}
230278ee8d1cSJulian Grajkowski 					status = LacSymAlgChain_PtrFromOffsetGet(
230378ee8d1cSJulian Grajkowski 					    pBufferList,
230478ee8d1cSJulian Grajkowski 					    pOpData->cryptoStartSrcOffsetInBytes +
230578ee8d1cSJulian Grajkowski 						pOpData
230678ee8d1cSJulian Grajkowski 						    ->messageLenToCipherInBytes,
230778ee8d1cSJulian Grajkowski 					    &pDigestResult);
230878ee8d1cSJulian Grajkowski 					if (CPA_STATUS_SUCCESS != status) {
230978ee8d1cSJulian Grajkowski 						LAC_LOG_ERROR(
231078ee8d1cSJulian Grajkowski 						    "Cannot set digest pointer within the"
231178ee8d1cSJulian Grajkowski 						    " buffer list - offset out of bounds");
231278ee8d1cSJulian Grajkowski 					}
231378ee8d1cSJulian Grajkowski 				} else {
231478ee8d1cSJulian Grajkowski 					pDigestResult = pOpData->pDigestResult;
231578ee8d1cSJulian Grajkowski 				}
231678ee8d1cSJulian Grajkowski 
2317a977168cSMichal Gulbicki 				if (CPA_TRUE ==
2318a977168cSMichal Gulbicki 				    pSessionDesc->useStatefulSha3ContentDesc) {
2319a977168cSMichal Gulbicki 					LacAlgChain_StatefulSha3_SkipStateLoadFlags(
2320a977168cSMichal Gulbicki 					    pMsg,
2321a977168cSMichal Gulbicki 					    qatPacketType,
2322a977168cSMichal Gulbicki 					    pSessionDesc->qatHashMode);
2323a977168cSMichal Gulbicki 				}
2324a977168cSMichal Gulbicki 
232578ee8d1cSJulian Grajkowski 				if (CPA_CY_SYM_OP_ALGORITHM_CHAINING ==
232678ee8d1cSJulian Grajkowski 				    pSessionDesc->symOperation) {
232778ee8d1cSJulian Grajkowski 					/* In alg chaining mode, packets are not
2328a977168cSMichal Gulbicki 					 * seen as partials for hash operations.
2329a977168cSMichal Gulbicki 					 * Override to NONE.
233078ee8d1cSJulian Grajkowski 					 */
233178ee8d1cSJulian Grajkowski 					qatPacketType =
233278ee8d1cSJulian Grajkowski 					    ICP_QAT_FW_LA_PARTIAL_NONE;
233378ee8d1cSJulian Grajkowski 				}
2334a977168cSMichal Gulbicki 				digestIsAppended =
2335a977168cSMichal Gulbicki 				    pSessionDesc->digestIsAppended;
2336a977168cSMichal Gulbicki 				if (CPA_TRUE == digestIsAppended) {
233778ee8d1cSJulian Grajkowski 					/*Check if the destination buffer can
2338a977168cSMichal Gulbicki 					 * handle the digest if digestIsAppend
2339a977168cSMichal Gulbicki 					 * is true*/
234078ee8d1cSJulian Grajkowski 					if (srcPktSize <
234178ee8d1cSJulian Grajkowski 					    (authOffsetInBytes +
234278ee8d1cSJulian Grajkowski 					     authLenInBytes +
234378ee8d1cSJulian Grajkowski 					     pSessionDesc->hashResultSize)) {
234478ee8d1cSJulian Grajkowski 						status =
234578ee8d1cSJulian Grajkowski 						    CPA_STATUS_INVALID_PARAM;
234678ee8d1cSJulian Grajkowski 					}
234778ee8d1cSJulian Grajkowski 				}
234878ee8d1cSJulian Grajkowski 				if (CPA_STATUS_SUCCESS == status) {
234978ee8d1cSJulian Grajkowski 					/* populate the hash request parameters
235078ee8d1cSJulian Grajkowski 					 */
235178ee8d1cSJulian Grajkowski 					status =
235278ee8d1cSJulian Grajkowski 					    LacSymQat_HashRequestParamsPopulate(
235378ee8d1cSJulian Grajkowski 						pMsg,
235478ee8d1cSJulian Grajkowski 						authOffsetInBytes,
235578ee8d1cSJulian Grajkowski 						authLenInBytes,
235678ee8d1cSJulian Grajkowski 						&(pService
235778ee8d1cSJulian Grajkowski 						      ->generic_service_info),
235878ee8d1cSJulian Grajkowski 						pHashStateBufferInfo,
235978ee8d1cSJulian Grajkowski 						qatPacketType,
236078ee8d1cSJulian Grajkowski 						pSessionDesc->hashResultSize,
236178ee8d1cSJulian Grajkowski 						pSessionDesc->digestVerify,
2362a977168cSMichal Gulbicki 						digestIsAppended ?
236378ee8d1cSJulian Grajkowski 						    NULL :
236478ee8d1cSJulian Grajkowski 						    pDigestResult,
2365a977168cSMichal Gulbicki 						hash,
236678ee8d1cSJulian Grajkowski 						NULL);
236778ee8d1cSJulian Grajkowski 				}
236878ee8d1cSJulian Grajkowski 			}
236978ee8d1cSJulian Grajkowski 		}
237078ee8d1cSJulian Grajkowski 	}
237178ee8d1cSJulian Grajkowski 
237278ee8d1cSJulian Grajkowski 	/*
237378ee8d1cSJulian Grajkowski 	 * send the message to the QAT
237478ee8d1cSJulian Grajkowski 	 */
237578ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS == status) {
237678ee8d1cSJulian Grajkowski 		qatUtilsAtomicInc(&(pSessionDesc->u.pendingCbCount));
237778ee8d1cSJulian Grajkowski 
237878ee8d1cSJulian Grajkowski 		status = LacSymQueue_RequestSend(instanceHandle,
237978ee8d1cSJulian Grajkowski 						 pCookie,
238078ee8d1cSJulian Grajkowski 						 pSessionDesc);
238178ee8d1cSJulian Grajkowski 
238278ee8d1cSJulian Grajkowski 		if (CPA_STATUS_SUCCESS != status) {
238378ee8d1cSJulian Grajkowski 			/* Decrease pending callback counter on send fail. */
238478ee8d1cSJulian Grajkowski 			qatUtilsAtomicDec(&(pSessionDesc->u.pendingCbCount));
238578ee8d1cSJulian Grajkowski 		}
238678ee8d1cSJulian Grajkowski 	}
238778ee8d1cSJulian Grajkowski 	/* Case that will catch all error status's for this function */
238878ee8d1cSJulian Grajkowski 	if (CPA_STATUS_SUCCESS != status) {
238978ee8d1cSJulian Grajkowski 		/* free the cookie */
239078ee8d1cSJulian Grajkowski 		if (NULL != pSymCookie) {
239178ee8d1cSJulian Grajkowski 			Lac_MemPoolEntryFree(pSymCookie);
239278ee8d1cSJulian Grajkowski 		}
239378ee8d1cSJulian Grajkowski 	}
239478ee8d1cSJulian Grajkowski 	return status;
239578ee8d1cSJulian Grajkowski }
2396