@@ -265,17 +265,19 @@ static void init_sh_desc_key_aead(u32 * const desc,
265
265
* split key is to be used, the size of the split key itself is
266
266
* specified. Valid algorithm values - one of OP_ALG_ALGSEL_{MD5, SHA1,
267
267
* SHA224, SHA256, SHA384, SHA512} ANDed with OP_ALG_AAI_HMAC_PRECOMP.
268
+ * @ivsize: initialization vector size
268
269
* @icvsize: integrity check value (ICV) size (truncated or full)
269
270
* @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
270
271
* @nonce: pointer to rfc3686 nonce
271
272
* @ctx1_iv_off: IV offset in CONTEXT1 register
273
+ * @is_qi: true when called from caam/qi
272
274
*
273
275
* Note: Requires an MDHA split key.
274
276
*/
275
277
void 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 )
279
281
{
280
282
/* Note: Context registers are saved. */
281
283
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,
284
286
append_operation (desc , adata -> algtype | OP_ALG_AS_INITFINAL |
285
287
OP_ALG_ENCRYPT );
286
288
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
+
287
308
/* Read and write assoclen bytes */
288
309
append_math_add (desc , VARSEQINLEN , ZERO , REG3 , CAAM_CMD_SZ );
289
310
append_math_add (desc , VARSEQOUTLEN , ZERO , REG3 , CAAM_CMD_SZ );
@@ -338,14 +359,15 @@ EXPORT_SYMBOL(cnstr_shdsc_aead_encap);
338
359
* @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
339
360
* @nonce: pointer to rfc3686 nonce
340
361
* @ctx1_iv_off: IV offset in CONTEXT1 register
362
+ * @is_qi: true when called from caam/qi
341
363
*
342
364
* Note: Requires an MDHA split key.
343
365
*/
344
366
void cnstr_shdsc_aead_decap (u32 * const desc , struct alginfo * cdata ,
345
367
struct alginfo * adata , unsigned int ivsize ,
346
368
unsigned int icvsize , const bool geniv ,
347
369
const bool is_rfc3686 , u32 * nonce ,
348
- const u32 ctx1_iv_off )
370
+ const u32 ctx1_iv_off , const bool is_qi )
349
371
{
350
372
/* Note: Context registers are saved. */
351
373
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,
354
376
append_operation (desc , adata -> algtype | OP_ALG_AS_INITFINAL |
355
377
OP_ALG_DECRYPT | OP_ALG_ICV_ON );
356
378
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
+
357
399
/* Read and write assoclen bytes */
358
400
append_math_add (desc , VARSEQINLEN , ZERO , REG3 , CAAM_CMD_SZ );
359
401
if (geniv )
@@ -423,21 +465,44 @@ EXPORT_SYMBOL(cnstr_shdsc_aead_decap);
423
465
* @is_rfc3686: true when ctr(aes) is wrapped by rfc3686 template
424
466
* @nonce: pointer to rfc3686 nonce
425
467
* @ctx1_iv_off: IV offset in CONTEXT1 register
468
+ * @is_qi: true when called from caam/qi
426
469
*
427
470
* Note: Requires an MDHA split key.
428
471
*/
429
472
void cnstr_shdsc_aead_givencap (u32 * const desc , struct alginfo * cdata ,
430
473
struct alginfo * adata , unsigned int ivsize ,
431
474
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 )
433
477
{
434
478
u32 geniv , moveiv ;
435
479
436
480
/* Note: Context registers are saved. */
437
481
init_sh_desc_key_aead (desc , cdata , adata , is_rfc3686 , nonce );
438
482
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
+
440
504
goto copy_iv ;
505
+ }
441
506
442
507
/* Generate IV */
443
508
geniv = NFIFOENTRY_STYPE_PAD | NFIFOENTRY_DEST_DECO |
0 commit comments