xref: /OK3568_Linux_fs/kernel/drivers/crypto/marvell/octeontx/otx_cptvf_algs.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun  * Marvell OcteonTX CPT driver
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) 2019 Marvell International Ltd.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify
7*4882a593Smuzhiyun  * it under the terms of the GNU General Public License version 2 as
8*4882a593Smuzhiyun  * published by the Free Software Foundation.
9*4882a593Smuzhiyun  */
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #ifndef __OTX_CPT_ALGS_H
12*4882a593Smuzhiyun #define __OTX_CPT_ALGS_H
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <crypto/hash.h>
15*4882a593Smuzhiyun #include "otx_cpt_common.h"
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define OTX_CPT_MAX_ENC_KEY_SIZE    32
18*4882a593Smuzhiyun #define OTX_CPT_MAX_HASH_KEY_SIZE   64
19*4882a593Smuzhiyun #define OTX_CPT_MAX_KEY_SIZE (OTX_CPT_MAX_ENC_KEY_SIZE + \
20*4882a593Smuzhiyun 			      OTX_CPT_MAX_HASH_KEY_SIZE)
21*4882a593Smuzhiyun enum otx_cpt_request_type {
22*4882a593Smuzhiyun 	OTX_CPT_ENC_DEC_REQ            = 0x1,
23*4882a593Smuzhiyun 	OTX_CPT_AEAD_ENC_DEC_REQ       = 0x2,
24*4882a593Smuzhiyun 	OTX_CPT_AEAD_ENC_DEC_NULL_REQ  = 0x3,
25*4882a593Smuzhiyun 	OTX_CPT_PASSTHROUGH_REQ	       = 0x4
26*4882a593Smuzhiyun };
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun enum otx_cpt_major_opcodes {
29*4882a593Smuzhiyun 	OTX_CPT_MAJOR_OP_MISC = 0x01,
30*4882a593Smuzhiyun 	OTX_CPT_MAJOR_OP_FC   = 0x33,
31*4882a593Smuzhiyun 	OTX_CPT_MAJOR_OP_HMAC = 0x35,
32*4882a593Smuzhiyun };
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun enum otx_cpt_req_type {
35*4882a593Smuzhiyun 		OTX_CPT_AE_CORE_REQ,
36*4882a593Smuzhiyun 		OTX_CPT_SE_CORE_REQ
37*4882a593Smuzhiyun };
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun enum otx_cpt_cipher_type {
40*4882a593Smuzhiyun 	OTX_CPT_CIPHER_NULL = 0x0,
41*4882a593Smuzhiyun 	OTX_CPT_DES3_CBC = 0x1,
42*4882a593Smuzhiyun 	OTX_CPT_DES3_ECB = 0x2,
43*4882a593Smuzhiyun 	OTX_CPT_AES_CBC  = 0x3,
44*4882a593Smuzhiyun 	OTX_CPT_AES_ECB  = 0x4,
45*4882a593Smuzhiyun 	OTX_CPT_AES_CFB  = 0x5,
46*4882a593Smuzhiyun 	OTX_CPT_AES_CTR  = 0x6,
47*4882a593Smuzhiyun 	OTX_CPT_AES_GCM  = 0x7,
48*4882a593Smuzhiyun 	OTX_CPT_AES_XTS  = 0x8
49*4882a593Smuzhiyun };
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun enum otx_cpt_mac_type {
52*4882a593Smuzhiyun 	OTX_CPT_MAC_NULL = 0x0,
53*4882a593Smuzhiyun 	OTX_CPT_MD5      = 0x1,
54*4882a593Smuzhiyun 	OTX_CPT_SHA1     = 0x2,
55*4882a593Smuzhiyun 	OTX_CPT_SHA224   = 0x3,
56*4882a593Smuzhiyun 	OTX_CPT_SHA256   = 0x4,
57*4882a593Smuzhiyun 	OTX_CPT_SHA384   = 0x5,
58*4882a593Smuzhiyun 	OTX_CPT_SHA512   = 0x6,
59*4882a593Smuzhiyun 	OTX_CPT_GMAC     = 0x7
60*4882a593Smuzhiyun };
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun enum otx_cpt_aes_key_len {
63*4882a593Smuzhiyun 	OTX_CPT_AES_128_BIT = 0x1,
64*4882a593Smuzhiyun 	OTX_CPT_AES_192_BIT = 0x2,
65*4882a593Smuzhiyun 	OTX_CPT_AES_256_BIT = 0x3
66*4882a593Smuzhiyun };
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun union otx_cpt_encr_ctrl {
69*4882a593Smuzhiyun 	__be64 flags;
70*4882a593Smuzhiyun 	u64 cflags;
71*4882a593Smuzhiyun 	struct {
72*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD)
73*4882a593Smuzhiyun 		u64 enc_cipher:4;
74*4882a593Smuzhiyun 		u64 reserved1:1;
75*4882a593Smuzhiyun 		u64 aes_key:2;
76*4882a593Smuzhiyun 		u64 iv_source:1;
77*4882a593Smuzhiyun 		u64 mac_type:4;
78*4882a593Smuzhiyun 		u64 reserved2:3;
79*4882a593Smuzhiyun 		u64 auth_input_type:1;
80*4882a593Smuzhiyun 		u64 mac_len:8;
81*4882a593Smuzhiyun 		u64 reserved3:8;
82*4882a593Smuzhiyun 		u64 encr_offset:16;
83*4882a593Smuzhiyun 		u64 iv_offset:8;
84*4882a593Smuzhiyun 		u64 auth_offset:8;
85*4882a593Smuzhiyun #else
86*4882a593Smuzhiyun 		u64 auth_offset:8;
87*4882a593Smuzhiyun 		u64 iv_offset:8;
88*4882a593Smuzhiyun 		u64 encr_offset:16;
89*4882a593Smuzhiyun 		u64 reserved3:8;
90*4882a593Smuzhiyun 		u64 mac_len:8;
91*4882a593Smuzhiyun 		u64 auth_input_type:1;
92*4882a593Smuzhiyun 		u64 reserved2:3;
93*4882a593Smuzhiyun 		u64 mac_type:4;
94*4882a593Smuzhiyun 		u64 iv_source:1;
95*4882a593Smuzhiyun 		u64 aes_key:2;
96*4882a593Smuzhiyun 		u64 reserved1:1;
97*4882a593Smuzhiyun 		u64 enc_cipher:4;
98*4882a593Smuzhiyun #endif
99*4882a593Smuzhiyun 	} e;
100*4882a593Smuzhiyun };
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun struct otx_cpt_cipher {
103*4882a593Smuzhiyun 	const char *name;
104*4882a593Smuzhiyun 	u8 value;
105*4882a593Smuzhiyun };
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun struct otx_cpt_enc_context {
108*4882a593Smuzhiyun 	union otx_cpt_encr_ctrl enc_ctrl;
109*4882a593Smuzhiyun 	u8 encr_key[32];
110*4882a593Smuzhiyun 	u8 encr_iv[16];
111*4882a593Smuzhiyun };
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun union otx_cpt_fchmac_ctx {
114*4882a593Smuzhiyun 	struct {
115*4882a593Smuzhiyun 		u8 ipad[64];
116*4882a593Smuzhiyun 		u8 opad[64];
117*4882a593Smuzhiyun 	} e;
118*4882a593Smuzhiyun 	struct {
119*4882a593Smuzhiyun 		u8 hmac_calc[64]; /* HMAC calculated */
120*4882a593Smuzhiyun 		u8 hmac_recv[64]; /* HMAC received */
121*4882a593Smuzhiyun 	} s;
122*4882a593Smuzhiyun };
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun struct otx_cpt_fc_ctx {
125*4882a593Smuzhiyun 	struct otx_cpt_enc_context enc;
126*4882a593Smuzhiyun 	union otx_cpt_fchmac_ctx hmac;
127*4882a593Smuzhiyun };
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun struct otx_cpt_enc_ctx {
130*4882a593Smuzhiyun 	u32 key_len;
131*4882a593Smuzhiyun 	u8 enc_key[OTX_CPT_MAX_KEY_SIZE];
132*4882a593Smuzhiyun 	u8 cipher_type;
133*4882a593Smuzhiyun 	u8 key_type;
134*4882a593Smuzhiyun };
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun struct otx_cpt_des3_ctx {
137*4882a593Smuzhiyun 	u32 key_len;
138*4882a593Smuzhiyun 	u8 des3_key[OTX_CPT_MAX_KEY_SIZE];
139*4882a593Smuzhiyun };
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun union otx_cpt_offset_ctrl_word {
142*4882a593Smuzhiyun 	__be64 flags;
143*4882a593Smuzhiyun 	u64 cflags;
144*4882a593Smuzhiyun 	struct {
145*4882a593Smuzhiyun #if defined(__BIG_ENDIAN_BITFIELD)
146*4882a593Smuzhiyun 		u64 reserved:32;
147*4882a593Smuzhiyun 		u64 enc_data_offset:16;
148*4882a593Smuzhiyun 		u64 iv_offset:8;
149*4882a593Smuzhiyun 		u64 auth_offset:8;
150*4882a593Smuzhiyun #else
151*4882a593Smuzhiyun 		u64 auth_offset:8;
152*4882a593Smuzhiyun 		u64 iv_offset:8;
153*4882a593Smuzhiyun 		u64 enc_data_offset:16;
154*4882a593Smuzhiyun 		u64 reserved:32;
155*4882a593Smuzhiyun #endif
156*4882a593Smuzhiyun 	} e;
157*4882a593Smuzhiyun };
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun struct otx_cpt_req_ctx {
160*4882a593Smuzhiyun 	struct otx_cpt_req_info cpt_req;
161*4882a593Smuzhiyun 	union otx_cpt_offset_ctrl_word ctrl_word;
162*4882a593Smuzhiyun 	struct otx_cpt_fc_ctx fctx;
163*4882a593Smuzhiyun };
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun struct otx_cpt_sdesc {
166*4882a593Smuzhiyun 	struct shash_desc shash;
167*4882a593Smuzhiyun };
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun struct otx_cpt_aead_ctx {
170*4882a593Smuzhiyun 	u8 key[OTX_CPT_MAX_KEY_SIZE];
171*4882a593Smuzhiyun 	struct crypto_shash *hashalg;
172*4882a593Smuzhiyun 	struct otx_cpt_sdesc *sdesc;
173*4882a593Smuzhiyun 	u8 *ipad;
174*4882a593Smuzhiyun 	u8 *opad;
175*4882a593Smuzhiyun 	u32 enc_key_len;
176*4882a593Smuzhiyun 	u32 auth_key_len;
177*4882a593Smuzhiyun 	u8 cipher_type;
178*4882a593Smuzhiyun 	u8 mac_type;
179*4882a593Smuzhiyun 	u8 key_type;
180*4882a593Smuzhiyun 	u8 is_trunc_hmac;
181*4882a593Smuzhiyun };
182*4882a593Smuzhiyun int otx_cpt_crypto_init(struct pci_dev *pdev, struct module *mod,
183*4882a593Smuzhiyun 			enum otx_cptpf_type pf_type,
184*4882a593Smuzhiyun 			enum otx_cptvf_type engine_type,
185*4882a593Smuzhiyun 			int num_queues, int num_devices);
186*4882a593Smuzhiyun void otx_cpt_crypto_exit(struct pci_dev *pdev, struct module *mod,
187*4882a593Smuzhiyun 			 enum otx_cptvf_type engine_type);
188*4882a593Smuzhiyun void otx_cpt_callback(int status, void *arg, void *req);
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun #endif /* __OTX_CPT_ALGS_H */
191