New upstream version 17.08
[deb_dpdk.git] / drivers / crypto / dpaa2_sec / hw / desc / ipsec.h
index c63d0da..cc63736 100644 (file)
@@ -5,7 +5,7 @@
  *   BSD LICENSE
  *
  * Copyright 2008-2016 Freescale Semiconductor Inc.
- * Copyright (c) 2016 NXP.
+ * Copyright 2016 NXP.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -1311,8 +1311,11 @@ cnstr_shdsc_ipsec_new_decap(uint32_t *descbuf, bool ps,
  * @descbuf: pointer to buffer used for descriptor construction
  * @ps: if 36/40bit addressing is desired, this parameter must be true
  * @swap: if true, perform descriptor byte swapping on a 4-byte boundary
- * @cipherdata: ointer to block cipher transform definitions.
+ * @cipherdata: pointer to block cipher transform definitions.
  *              Valid algorithm values one of OP_ALG_ALGSEL_* {DES, 3DES, AES}
+ *              Valid modes for:
+ *                  AES: OP_ALG_AAI_* {CBC, CTR}
+ *                  DES, 3DES: OP_ALG_AAI_CBC
  * @authdata: pointer to authentication transform definitions.
  *            Valid algorithm values - one of OP_ALG_ALGSEL_* {MD5, SHA1,
  *            SHA224, SHA256, SHA384, SHA512}
@@ -1379,8 +1382,9 @@ cnstr_shdsc_authenc(uint32_t *descbuf, bool ps, bool swap,
 {
        struct program prg;
        struct program *p = &prg;
-       const bool is_aes_dec = (dir == DIR_DEC) &&
-                               (cipherdata->algtype == OP_ALG_ALGSEL_AES);
+       const bool need_dk = (dir == DIR_DEC) &&
+                            (cipherdata->algtype == OP_ALG_ALGSEL_AES) &&
+                            (cipherdata->algmode == OP_ALG_AAI_CBC);
 
        LABEL(skip_patch_len);
        LABEL(keyjmp);
@@ -1466,7 +1470,7 @@ cnstr_shdsc_authenc(uint32_t *descbuf, bool ps, bool swap,
                      dir == DIR_ENC ? ICV_CHECK_DISABLE : ICV_CHECK_ENABLE,
                      dir);
 
-       if (is_aes_dec)
+       if (need_dk)
                ALG_OPERATION(p, OP_ALG_ALGSEL_AES, cipherdata->algmode,
                              OP_ALG_AS_INITFINAL, ICV_CHECK_DISABLE, dir);
        pskipkeys = JUMP(p, skipkeys, LOCAL_JUMP, ALL_TRUE, 0);
@@ -1478,7 +1482,7 @@ cnstr_shdsc_authenc(uint32_t *descbuf, bool ps, bool swap,
                      dir == DIR_ENC ? ICV_CHECK_DISABLE : ICV_CHECK_ENABLE,
                      dir);
 
-       if (is_aes_dec) {
+       if (need_dk) {
                ALG_OPERATION(p, OP_ALG_ALGSEL_AES, cipherdata->algmode |
                              OP_ALG_AAI_DK, OP_ALG_AS_INITFINAL,
                              ICV_CHECK_DISABLE, dir);
@@ -1503,7 +1507,10 @@ cnstr_shdsc_authenc(uint32_t *descbuf, bool ps, bool swap,
        SET_LABEL(p, aonly_len_offset);
 
        /* Read IV */
-       SEQLOAD(p, CONTEXT1, 0, ivlen, 0);
+       if (cipherdata->algmode == OP_ALG_AAI_CTR)
+               SEQLOAD(p, CONTEXT1, 16, ivlen, 0);
+       else
+               SEQLOAD(p, CONTEXT1, 0, ivlen, 0);
 
        /*
         * Read data needed only for authentication. This is overwritten above