@@ -265,17 +265,19 @@ static void init_sh_desc_key_aead(u32 * const desc,
265265 * split key is to be used, the size of the split key itself is
266266 * specified. Valid algorithm values - one of OP_ALG_ALGSEL_{MD5, SHA1,
267267 * SHA224, SHA256, SHA384, SHA512} ANDed with OP_ALG_AAI_HMAC_PRECOMP.
268+ * @ivsize: initialization vector size
268269 * @icvsize: integrity check value (ICV) size (truncated or full)
269270 * @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
270271 * @nonce: pointer to rfc3686 nonce
271272 * @ctx1_iv_off: IV offset in CONTEXT1 register
273+ * @is_qi: true when called from caam/qi
272274 *
273275 * Note: Requires an MDHA split key.
274276 */
275277void cnstr_shdsc_aead_encap (u32 * const desc , struct alginfo * cdata ,
276- struct alginfo * adata , unsigned int icvsize ,
277- const bool is_rfc3686 , u32 * nonce ,
278- const u32 ctx1_iv_off )
278+ struct alginfo * adata , unsigned int ivsize ,
279+ unsigned int icvsize , const bool is_rfc3686 ,
280+ u32 * nonce , const u32 ctx1_iv_off , const bool is_qi )
279281{
280282 /* Note: Context registers are saved. */
281283 init_sh_desc_key_aead (desc , cdata , adata , is_rfc3686 , nonce );
@@ -284,6 +286,25 @@ void cnstr_shdsc_aead_encap(u32 * const desc, struct alginfo *cdata,
284286 append_operation (desc , adata -> algtype | OP_ALG_AS_INITFINAL |
285287 OP_ALG_ENCRYPT );
286288
289+ if (is_qi ) {
290+ u32 * wait_load_cmd ;
291+
292+ /* REG3 = assoclen */
293+ append_seq_load (desc , 4 , LDST_CLASS_DECO |
294+ LDST_SRCDST_WORD_DECO_MATH3 |
295+ (4 << LDST_OFFSET_SHIFT ));
296+
297+ wait_load_cmd = append_jump (desc , JUMP_JSL | JUMP_TEST_ALL |
298+ JUMP_COND_CALM | JUMP_COND_NCP |
299+ JUMP_COND_NOP | JUMP_COND_NIP |
300+ JUMP_COND_NIFP );
301+ set_jump_tgt_here (desc , wait_load_cmd );
302+
303+ append_seq_load (desc , ivsize , LDST_CLASS_1_CCB |
304+ LDST_SRCDST_BYTE_CONTEXT |
305+ (ctx1_iv_off << LDST_OFFSET_SHIFT ));
306+ }
307+
287308 /* Read and write assoclen bytes */
288309 append_math_add (desc , VARSEQINLEN , ZERO , REG3 , CAAM_CMD_SZ );
289310 append_math_add (desc , VARSEQOUTLEN , ZERO , REG3 , CAAM_CMD_SZ );
@@ -338,14 +359,15 @@ EXPORT_SYMBOL(cnstr_shdsc_aead_encap);
338359 * @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
339360 * @nonce: pointer to rfc3686 nonce
340361 * @ctx1_iv_off: IV offset in CONTEXT1 register
362+ * @is_qi: true when called from caam/qi
341363 *
342364 * Note: Requires an MDHA split key.
343365 */
344366void cnstr_shdsc_aead_decap (u32 * const desc , struct alginfo * cdata ,
345367 struct alginfo * adata , unsigned int ivsize ,
346368 unsigned int icvsize , const bool geniv ,
347369 const bool is_rfc3686 , u32 * nonce ,
348- const u32 ctx1_iv_off )
370+ const u32 ctx1_iv_off , const bool is_qi )
349371{
350372 /* Note: Context registers are saved. */
351373 init_sh_desc_key_aead (desc , cdata , adata , is_rfc3686 , nonce );
@@ -354,6 +376,26 @@ void cnstr_shdsc_aead_decap(u32 * const desc, struct alginfo *cdata,
354376 append_operation (desc , adata -> algtype | OP_ALG_AS_INITFINAL |
355377 OP_ALG_DECRYPT | OP_ALG_ICV_ON );
356378
379+ if (is_qi ) {
380+ u32 * wait_load_cmd ;
381+
382+ /* REG3 = assoclen */
383+ append_seq_load (desc , 4 , LDST_CLASS_DECO |
384+ LDST_SRCDST_WORD_DECO_MATH3 |
385+ (4 << LDST_OFFSET_SHIFT ));
386+
387+ wait_load_cmd = append_jump (desc , JUMP_JSL | JUMP_TEST_ALL |
388+ JUMP_COND_CALM | JUMP_COND_NCP |
389+ JUMP_COND_NOP | JUMP_COND_NIP |
390+ JUMP_COND_NIFP );
391+ set_jump_tgt_here (desc , wait_load_cmd );
392+
393+ if (!geniv )
394+ append_seq_load (desc , ivsize , LDST_CLASS_1_CCB |
395+ LDST_SRCDST_BYTE_CONTEXT |
396+ (ctx1_iv_off << LDST_OFFSET_SHIFT ));
397+ }
398+
357399 /* Read and write assoclen bytes */
358400 append_math_add (desc , VARSEQINLEN , ZERO , REG3 , CAAM_CMD_SZ );
359401 if (geniv )
@@ -423,21 +465,44 @@ EXPORT_SYMBOL(cnstr_shdsc_aead_decap);
423465 * @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
424466 * @nonce: pointer to rfc3686 nonce
425467 * @ctx1_iv_off: IV offset in CONTEXT1 register
468+ * @is_qi: true when called from caam/qi
426469 *
427470 * Note: Requires an MDHA split key.
428471 */
429472void cnstr_shdsc_aead_givencap (u32 * const desc , struct alginfo * cdata ,
430473 struct alginfo * adata , unsigned int ivsize ,
431474 unsigned int icvsize , const bool is_rfc3686 ,
432- u32 * nonce , const u32 ctx1_iv_off )
475+ u32 * nonce , const u32 ctx1_iv_off ,
476+ const bool is_qi )
433477{
434478 u32 geniv , moveiv ;
435479
436480 /* Note: Context registers are saved. */
437481 init_sh_desc_key_aead (desc , cdata , adata , is_rfc3686 , nonce );
438482
439- if (is_rfc3686 )
483+ if (is_qi ) {
484+ u32 * wait_load_cmd ;
485+
486+ /* REG3 = assoclen */
487+ append_seq_load (desc , 4 , LDST_CLASS_DECO |
488+ LDST_SRCDST_WORD_DECO_MATH3 |
489+ (4 << LDST_OFFSET_SHIFT ));
490+
491+ wait_load_cmd = append_jump (desc , JUMP_JSL | JUMP_TEST_ALL |
492+ JUMP_COND_CALM | JUMP_COND_NCP |
493+ JUMP_COND_NOP | JUMP_COND_NIP |
494+ JUMP_COND_NIFP );
495+ set_jump_tgt_here (desc , wait_load_cmd );
496+ }
497+
498+ if (is_rfc3686 ) {
499+ if (is_qi )
500+ append_seq_load (desc , ivsize , LDST_CLASS_1_CCB |
501+ LDST_SRCDST_BYTE_CONTEXT |
502+ (ctx1_iv_off << LDST_OFFSET_SHIFT ));
503+
440504 goto copy_iv ;
505+ }
441506
442507 /* Generate IV */
443508 geniv = NFIFOENTRY_STYPE_PAD | NFIFOENTRY_DEST_DECO |
0 commit comments