New upstream version 18.08
[deb_dpdk.git] / drivers / crypto / armv8 / rte_armv8_pmd_private.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2017 Cavium, Inc
3  */
4
5 #ifndef _RTE_ARMV8_PMD_PRIVATE_H_
6 #define _RTE_ARMV8_PMD_PRIVATE_H_
7
8 #define CRYPTODEV_NAME_ARMV8_PMD        crypto_armv8
9 /**< ARMv8 Crypto PMD device name */
10
11 #define ARMV8_CRYPTO_LOG_ERR(fmt, args...) \
12         RTE_LOG(ERR, CRYPTODEV, "[%s] %s() line %u: " fmt "\n",  \
13                         RTE_STR(CRYPTODEV_NAME_ARMV8_CRYPTO_PMD), \
14                         __func__, __LINE__, ## args)
15
16 #ifdef RTE_LIBRTE_ARMV8_CRYPTO_DEBUG
17 #define ARMV8_CRYPTO_LOG_INFO(fmt, args...) \
18         RTE_LOG(INFO, CRYPTODEV, "[%s] %s() line %u: " fmt "\n", \
19                         RTE_STR(CRYPTODEV_NAME_ARMV8_CRYPTO_PMD), \
20                         __func__, __LINE__, ## args)
21
22 #define ARMV8_CRYPTO_LOG_DBG(fmt, args...) \
23         RTE_LOG(DEBUG, CRYPTODEV, "[%s] %s() line %u: " fmt "\n", \
24                         RTE_STR(CRYPTODEV_NAME_ARMV8_CRYPTO_PMD), \
25                         __func__, __LINE__, ## args)
26
27 #define ARMV8_CRYPTO_ASSERT(con)                                \
28 do {                                                            \
29         if (!(con)) {                                           \
30                 rte_panic("%s(): "                              \
31                     con "condition failed, line %u", __func__); \
32         }                                                       \
33 } while (0)
34
35 #else
36 #define ARMV8_CRYPTO_LOG_INFO(fmt, args...)
37 #define ARMV8_CRYPTO_LOG_DBG(fmt, args...)
38 #define ARMV8_CRYPTO_ASSERT(con)
39 #endif
40
41 #define NBBY            8               /* Number of bits in a byte */
42 #define BYTE_LENGTH(x)  ((x) / NBBY)    /* Number of bytes in x (round down) */
43
44 /* Maximum length for digest (SHA-256 needs 32 bytes) */
45 #define DIGEST_LENGTH_MAX 32
46
47 /** ARMv8 operation order mode enumerator */
48 enum armv8_crypto_chain_order {
49         ARMV8_CRYPTO_CHAIN_CIPHER_AUTH,
50         ARMV8_CRYPTO_CHAIN_AUTH_CIPHER,
51         ARMV8_CRYPTO_CHAIN_NOT_SUPPORTED,
52         ARMV8_CRYPTO_CHAIN_LIST_END = ARMV8_CRYPTO_CHAIN_NOT_SUPPORTED
53 };
54
55 /** ARMv8 cipher operation enumerator */
56 enum armv8_crypto_cipher_operation {
57         ARMV8_CRYPTO_CIPHER_OP_ENCRYPT = RTE_CRYPTO_CIPHER_OP_ENCRYPT,
58         ARMV8_CRYPTO_CIPHER_OP_DECRYPT = RTE_CRYPTO_CIPHER_OP_DECRYPT,
59         ARMV8_CRYPTO_CIPHER_OP_NOT_SUPPORTED,
60         ARMV8_CRYPTO_CIPHER_OP_LIST_END = ARMV8_CRYPTO_CIPHER_OP_NOT_SUPPORTED
61 };
62
63 enum armv8_crypto_cipher_keylen {
64         ARMV8_CRYPTO_CIPHER_KEYLEN_128,
65         ARMV8_CRYPTO_CIPHER_KEYLEN_192,
66         ARMV8_CRYPTO_CIPHER_KEYLEN_256,
67         ARMV8_CRYPTO_CIPHER_KEYLEN_NOT_SUPPORTED,
68         ARMV8_CRYPTO_CIPHER_KEYLEN_LIST_END =
69                 ARMV8_CRYPTO_CIPHER_KEYLEN_NOT_SUPPORTED
70 };
71
72 /** ARMv8 auth mode enumerator */
73 enum armv8_crypto_auth_mode {
74         ARMV8_CRYPTO_AUTH_AS_AUTH,
75         ARMV8_CRYPTO_AUTH_AS_HMAC,
76         ARMV8_CRYPTO_AUTH_AS_CIPHER,
77         ARMV8_CRYPTO_AUTH_NOT_SUPPORTED,
78         ARMV8_CRYPTO_AUTH_LIST_END = ARMV8_CRYPTO_AUTH_NOT_SUPPORTED
79 };
80
81 #define CRYPTO_ORDER_MAX                ARMV8_CRYPTO_CHAIN_LIST_END
82 #define CRYPTO_CIPHER_OP_MAX            ARMV8_CRYPTO_CIPHER_OP_LIST_END
83 #define CRYPTO_CIPHER_KEYLEN_MAX        ARMV8_CRYPTO_CIPHER_KEYLEN_LIST_END
84 #define CRYPTO_CIPHER_MAX               RTE_CRYPTO_CIPHER_LIST_END
85 #define CRYPTO_AUTH_MAX                 RTE_CRYPTO_AUTH_LIST_END
86
87 #define HMAC_IPAD_VALUE                 (0x36)
88 #define HMAC_OPAD_VALUE                 (0x5C)
89
90 #define SHA256_AUTH_KEY_LENGTH          (BYTE_LENGTH(256))
91 #define SHA256_BLOCK_SIZE               (BYTE_LENGTH(512))
92
93 #define SHA1_AUTH_KEY_LENGTH            (BYTE_LENGTH(160))
94 #define SHA1_BLOCK_SIZE                 (BYTE_LENGTH(512))
95
96 #define SHA_AUTH_KEY_MAX                SHA256_AUTH_KEY_LENGTH
97 #define SHA_BLOCK_MAX                   SHA256_BLOCK_SIZE
98
99 typedef int (*crypto_func_t)(uint8_t *, uint8_t *, uint64_t,
100                                 uint8_t *, uint8_t *, uint64_t,
101                                 crypto_arg_t *);
102
103 typedef void (*crypto_key_sched_t)(uint8_t *, const uint8_t *);
104
105 /** private data structure for each ARMv8 crypto device */
106 struct armv8_crypto_private {
107         unsigned int max_nb_qpairs;
108         /**< Max number of queue pairs */
109 };
110
111 /** ARMv8 crypto queue pair */
112 struct armv8_crypto_qp {
113         uint16_t id;
114         /**< Queue Pair Identifier */
115         struct rte_ring *processed_ops;
116         /**< Ring for placing process packets */
117         struct rte_mempool *sess_mp;
118         /**< Session Mempool */
119         struct rte_cryptodev_stats stats;
120         /**< Queue pair statistics */
121         char name[RTE_CRYPTODEV_NAME_MAX_LEN];
122         /**< Unique Queue Pair Name */
123         uint8_t temp_digest[DIGEST_LENGTH_MAX];
124         /**< Buffer used to store the digest generated
125          * by the driver when verifying a digest provided
126          * by the user (using authentication verify operation)
127          */
128 } __rte_cache_aligned;
129
130 /** ARMv8 crypto private session structure */
131 struct armv8_crypto_session {
132         enum armv8_crypto_chain_order chain_order;
133         /**< chain order mode */
134         crypto_func_t crypto_func;
135         /**< cryptographic function to use for this session */
136
137         /** Cipher Parameters */
138         struct {
139                 enum rte_crypto_cipher_operation direction;
140                 /**< cipher operation direction */
141                 enum rte_crypto_cipher_algorithm algo;
142                 /**< cipher algorithm */
143                 struct {
144                         uint16_t length;
145                         uint16_t offset;
146                 } iv;
147                 /**< IV parameters */
148
149                 struct {
150                         uint8_t data[256];
151                         /**< key data */
152                         size_t length;
153                         /**< key length in bytes */
154                 } key;
155
156                 crypto_key_sched_t key_sched;
157                 /**< Key schedule function */
158         } cipher;
159
160         /** Authentication Parameters */
161         struct {
162                 enum rte_crypto_auth_operation operation;
163                 /**< auth operation generate or verify */
164                 enum armv8_crypto_auth_mode mode;
165                 /**< auth operation mode */
166
167                 union {
168                         struct {
169                                 /* Add data if needed */
170                         } auth;
171
172                         struct {
173                                 uint8_t i_key_pad[SHA_BLOCK_MAX]
174                                                         __rte_cache_aligned;
175                                 /**< inner pad (max supported block length) */
176                                 uint8_t o_key_pad[SHA_BLOCK_MAX]
177                                                         __rte_cache_aligned;
178                                 /**< outer pad (max supported block length) */
179                                 uint8_t key[SHA_BLOCK_MAX];
180                                 /**< HMAC key (max supported block length)*/
181                         } hmac;
182                 };
183                 uint16_t digest_length;
184                 /* Digest length */
185         } auth;
186
187 } __rte_cache_aligned;
188
189 /** Set and validate ARMv8 crypto session parameters */
190 extern int armv8_crypto_set_session_parameters(
191                 struct armv8_crypto_session *sess,
192                 const struct rte_crypto_sym_xform *xform);
193
194 /** device specific operations function pointer structure */
195 extern struct rte_cryptodev_ops *rte_armv8_crypto_pmd_ops;
196
197 #endif /* _RTE_ARMV8_PMD_PRIVATE_H_ */