xref: /openbmc/linux/drivers/crypto/marvell/octeontx2/otx2_cptvf_algs.h (revision d0034a7a4ac7fae708146ac0059b9c47a1543f0d)
1*6f03f0e8SSrujana Challa /* SPDX-License-Identifier: GPL-2.0-only
2*6f03f0e8SSrujana Challa  * Copyright (C) 2020 Marvell.
3*6f03f0e8SSrujana Challa  */
4*6f03f0e8SSrujana Challa 
5*6f03f0e8SSrujana Challa #ifndef __OTX2_CPT_ALGS_H
6*6f03f0e8SSrujana Challa #define __OTX2_CPT_ALGS_H
7*6f03f0e8SSrujana Challa 
8*6f03f0e8SSrujana Challa #include <crypto/hash.h>
9*6f03f0e8SSrujana Challa #include <crypto/skcipher.h>
10*6f03f0e8SSrujana Challa #include <crypto/aead.h>
11*6f03f0e8SSrujana Challa #include "otx2_cpt_common.h"
12*6f03f0e8SSrujana Challa 
13*6f03f0e8SSrujana Challa #define OTX2_CPT_MAX_ENC_KEY_SIZE    32
14*6f03f0e8SSrujana Challa #define OTX2_CPT_MAX_HASH_KEY_SIZE   64
15*6f03f0e8SSrujana Challa #define OTX2_CPT_MAX_KEY_SIZE (OTX2_CPT_MAX_ENC_KEY_SIZE + \
16*6f03f0e8SSrujana Challa 			       OTX2_CPT_MAX_HASH_KEY_SIZE)
17*6f03f0e8SSrujana Challa enum otx2_cpt_request_type {
18*6f03f0e8SSrujana Challa 	OTX2_CPT_ENC_DEC_REQ            = 0x1,
19*6f03f0e8SSrujana Challa 	OTX2_CPT_AEAD_ENC_DEC_REQ       = 0x2,
20*6f03f0e8SSrujana Challa 	OTX2_CPT_AEAD_ENC_DEC_NULL_REQ  = 0x3,
21*6f03f0e8SSrujana Challa 	OTX2_CPT_PASSTHROUGH_REQ	= 0x4
22*6f03f0e8SSrujana Challa };
23*6f03f0e8SSrujana Challa 
24*6f03f0e8SSrujana Challa enum otx2_cpt_major_opcodes {
25*6f03f0e8SSrujana Challa 	OTX2_CPT_MAJOR_OP_MISC = 0x01,
26*6f03f0e8SSrujana Challa 	OTX2_CPT_MAJOR_OP_FC   = 0x33,
27*6f03f0e8SSrujana Challa 	OTX2_CPT_MAJOR_OP_HMAC = 0x35,
28*6f03f0e8SSrujana Challa };
29*6f03f0e8SSrujana Challa 
30*6f03f0e8SSrujana Challa enum otx2_cpt_cipher_type {
31*6f03f0e8SSrujana Challa 	OTX2_CPT_CIPHER_NULL = 0x0,
32*6f03f0e8SSrujana Challa 	OTX2_CPT_DES3_CBC = 0x1,
33*6f03f0e8SSrujana Challa 	OTX2_CPT_DES3_ECB = 0x2,
34*6f03f0e8SSrujana Challa 	OTX2_CPT_AES_CBC  = 0x3,
35*6f03f0e8SSrujana Challa 	OTX2_CPT_AES_ECB  = 0x4,
36*6f03f0e8SSrujana Challa 	OTX2_CPT_AES_CFB  = 0x5,
37*6f03f0e8SSrujana Challa 	OTX2_CPT_AES_CTR  = 0x6,
38*6f03f0e8SSrujana Challa 	OTX2_CPT_AES_GCM  = 0x7,
39*6f03f0e8SSrujana Challa 	OTX2_CPT_AES_XTS  = 0x8
40*6f03f0e8SSrujana Challa };
41*6f03f0e8SSrujana Challa 
42*6f03f0e8SSrujana Challa enum otx2_cpt_mac_type {
43*6f03f0e8SSrujana Challa 	OTX2_CPT_MAC_NULL = 0x0,
44*6f03f0e8SSrujana Challa 	OTX2_CPT_MD5      = 0x1,
45*6f03f0e8SSrujana Challa 	OTX2_CPT_SHA1     = 0x2,
46*6f03f0e8SSrujana Challa 	OTX2_CPT_SHA224   = 0x3,
47*6f03f0e8SSrujana Challa 	OTX2_CPT_SHA256   = 0x4,
48*6f03f0e8SSrujana Challa 	OTX2_CPT_SHA384   = 0x5,
49*6f03f0e8SSrujana Challa 	OTX2_CPT_SHA512   = 0x6,
50*6f03f0e8SSrujana Challa 	OTX2_CPT_GMAC     = 0x7
51*6f03f0e8SSrujana Challa };
52*6f03f0e8SSrujana Challa 
53*6f03f0e8SSrujana Challa enum otx2_cpt_aes_key_len {
54*6f03f0e8SSrujana Challa 	OTX2_CPT_AES_128_BIT = 0x1,
55*6f03f0e8SSrujana Challa 	OTX2_CPT_AES_192_BIT = 0x2,
56*6f03f0e8SSrujana Challa 	OTX2_CPT_AES_256_BIT = 0x3
57*6f03f0e8SSrujana Challa };
58*6f03f0e8SSrujana Challa 
59*6f03f0e8SSrujana Challa union otx2_cpt_encr_ctrl {
60*6f03f0e8SSrujana Challa 	u64 u;
61*6f03f0e8SSrujana Challa 	struct {
62*6f03f0e8SSrujana Challa #if defined(__BIG_ENDIAN_BITFIELD)
63*6f03f0e8SSrujana Challa 		u64 enc_cipher:4;
64*6f03f0e8SSrujana Challa 		u64 reserved_59:1;
65*6f03f0e8SSrujana Challa 		u64 aes_key:2;
66*6f03f0e8SSrujana Challa 		u64 iv_source:1;
67*6f03f0e8SSrujana Challa 		u64 mac_type:4;
68*6f03f0e8SSrujana Challa 		u64 reserved_49_51:3;
69*6f03f0e8SSrujana Challa 		u64 auth_input_type:1;
70*6f03f0e8SSrujana Challa 		u64 mac_len:8;
71*6f03f0e8SSrujana Challa 		u64 reserved_32_39:8;
72*6f03f0e8SSrujana Challa 		u64 encr_offset:16;
73*6f03f0e8SSrujana Challa 		u64 iv_offset:8;
74*6f03f0e8SSrujana Challa 		u64 auth_offset:8;
75*6f03f0e8SSrujana Challa #else
76*6f03f0e8SSrujana Challa 		u64 auth_offset:8;
77*6f03f0e8SSrujana Challa 		u64 iv_offset:8;
78*6f03f0e8SSrujana Challa 		u64 encr_offset:16;
79*6f03f0e8SSrujana Challa 		u64 reserved_32_39:8;
80*6f03f0e8SSrujana Challa 		u64 mac_len:8;
81*6f03f0e8SSrujana Challa 		u64 auth_input_type:1;
82*6f03f0e8SSrujana Challa 		u64 reserved_49_51:3;
83*6f03f0e8SSrujana Challa 		u64 mac_type:4;
84*6f03f0e8SSrujana Challa 		u64 iv_source:1;
85*6f03f0e8SSrujana Challa 		u64 aes_key:2;
86*6f03f0e8SSrujana Challa 		u64 reserved_59:1;
87*6f03f0e8SSrujana Challa 		u64 enc_cipher:4;
88*6f03f0e8SSrujana Challa #endif
89*6f03f0e8SSrujana Challa 	} e;
90*6f03f0e8SSrujana Challa };
91*6f03f0e8SSrujana Challa 
92*6f03f0e8SSrujana Challa struct otx2_cpt_cipher {
93*6f03f0e8SSrujana Challa 	const char *name;
94*6f03f0e8SSrujana Challa 	u8 value;
95*6f03f0e8SSrujana Challa };
96*6f03f0e8SSrujana Challa 
97*6f03f0e8SSrujana Challa struct otx2_cpt_fc_enc_ctx {
98*6f03f0e8SSrujana Challa 	union otx2_cpt_encr_ctrl enc_ctrl;
99*6f03f0e8SSrujana Challa 	u8 encr_key[32];
100*6f03f0e8SSrujana Challa 	u8 encr_iv[16];
101*6f03f0e8SSrujana Challa };
102*6f03f0e8SSrujana Challa 
103*6f03f0e8SSrujana Challa union otx2_cpt_fc_hmac_ctx {
104*6f03f0e8SSrujana Challa 	struct {
105*6f03f0e8SSrujana Challa 		u8 ipad[64];
106*6f03f0e8SSrujana Challa 		u8 opad[64];
107*6f03f0e8SSrujana Challa 	} e;
108*6f03f0e8SSrujana Challa 	struct {
109*6f03f0e8SSrujana Challa 		u8 hmac_calc[64]; /* HMAC calculated */
110*6f03f0e8SSrujana Challa 		u8 hmac_recv[64]; /* HMAC received */
111*6f03f0e8SSrujana Challa 	} s;
112*6f03f0e8SSrujana Challa };
113*6f03f0e8SSrujana Challa 
114*6f03f0e8SSrujana Challa struct otx2_cpt_fc_ctx {
115*6f03f0e8SSrujana Challa 	struct otx2_cpt_fc_enc_ctx enc;
116*6f03f0e8SSrujana Challa 	union otx2_cpt_fc_hmac_ctx hmac;
117*6f03f0e8SSrujana Challa };
118*6f03f0e8SSrujana Challa 
119*6f03f0e8SSrujana Challa struct otx2_cpt_enc_ctx {
120*6f03f0e8SSrujana Challa 	u32 key_len;
121*6f03f0e8SSrujana Challa 	u8 enc_key[OTX2_CPT_MAX_KEY_SIZE];
122*6f03f0e8SSrujana Challa 	u8 cipher_type;
123*6f03f0e8SSrujana Challa 	u8 key_type;
124*6f03f0e8SSrujana Challa 	u8 enc_align_len;
125*6f03f0e8SSrujana Challa 	struct crypto_skcipher *fbk_cipher;
126*6f03f0e8SSrujana Challa };
127*6f03f0e8SSrujana Challa 
128*6f03f0e8SSrujana Challa union otx2_cpt_offset_ctrl {
129*6f03f0e8SSrujana Challa 	u64 flags;
130*6f03f0e8SSrujana Challa 	struct {
131*6f03f0e8SSrujana Challa #if defined(__BIG_ENDIAN_BITFIELD)
132*6f03f0e8SSrujana Challa 		u64 reserved:32;
133*6f03f0e8SSrujana Challa 		u64 enc_data_offset:16;
134*6f03f0e8SSrujana Challa 		u64 iv_offset:8;
135*6f03f0e8SSrujana Challa 		u64 auth_offset:8;
136*6f03f0e8SSrujana Challa #else
137*6f03f0e8SSrujana Challa 		u64 auth_offset:8;
138*6f03f0e8SSrujana Challa 		u64 iv_offset:8;
139*6f03f0e8SSrujana Challa 		u64 enc_data_offset:16;
140*6f03f0e8SSrujana Challa 		u64 reserved:32;
141*6f03f0e8SSrujana Challa #endif
142*6f03f0e8SSrujana Challa 	} e;
143*6f03f0e8SSrujana Challa };
144*6f03f0e8SSrujana Challa 
145*6f03f0e8SSrujana Challa struct otx2_cpt_req_ctx {
146*6f03f0e8SSrujana Challa 	struct otx2_cpt_req_info cpt_req;
147*6f03f0e8SSrujana Challa 	union otx2_cpt_offset_ctrl ctrl_word;
148*6f03f0e8SSrujana Challa 	struct otx2_cpt_fc_ctx fctx;
149*6f03f0e8SSrujana Challa 	union {
150*6f03f0e8SSrujana Challa 		struct skcipher_request sk_fbk_req;
151*6f03f0e8SSrujana Challa 		struct aead_request fbk_req;
152*6f03f0e8SSrujana Challa 	};
153*6f03f0e8SSrujana Challa };
154*6f03f0e8SSrujana Challa 
155*6f03f0e8SSrujana Challa struct otx2_cpt_sdesc {
156*6f03f0e8SSrujana Challa 	struct shash_desc shash;
157*6f03f0e8SSrujana Challa };
158*6f03f0e8SSrujana Challa 
159*6f03f0e8SSrujana Challa struct otx2_cpt_aead_ctx {
160*6f03f0e8SSrujana Challa 	u8 key[OTX2_CPT_MAX_KEY_SIZE];
161*6f03f0e8SSrujana Challa 	struct crypto_shash *hashalg;
162*6f03f0e8SSrujana Challa 	struct otx2_cpt_sdesc *sdesc;
163*6f03f0e8SSrujana Challa 	struct crypto_aead *fbk_cipher;
164*6f03f0e8SSrujana Challa 	u8 *ipad;
165*6f03f0e8SSrujana Challa 	u8 *opad;
166*6f03f0e8SSrujana Challa 	u32 enc_key_len;
167*6f03f0e8SSrujana Challa 	u32 auth_key_len;
168*6f03f0e8SSrujana Challa 	u8 cipher_type;
169*6f03f0e8SSrujana Challa 	u8 mac_type;
170*6f03f0e8SSrujana Challa 	u8 key_type;
171*6f03f0e8SSrujana Challa 	u8 is_trunc_hmac;
172*6f03f0e8SSrujana Challa 	u8 enc_align_len;
173*6f03f0e8SSrujana Challa };
174*6f03f0e8SSrujana Challa int otx2_cpt_crypto_init(struct pci_dev *pdev, struct module *mod,
175*6f03f0e8SSrujana Challa 			 int num_queues, int num_devices);
176*6f03f0e8SSrujana Challa void otx2_cpt_crypto_exit(struct pci_dev *pdev, struct module *mod);
177*6f03f0e8SSrujana Challa 
178*6f03f0e8SSrujana Challa #endif /* __OTX2_CPT_ALGS_H */
179