xref: /OK3568_Linux_fs/kernel/drivers/crypto/bcm/spu2.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright 2016 Broadcom
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun 
6*4882a593Smuzhiyun /*
7*4882a593Smuzhiyun  * This file contains SPU message definitions specific to SPU2.
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef _SPU2_H
11*4882a593Smuzhiyun #define _SPU2_H
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun enum spu2_cipher_type {
14*4882a593Smuzhiyun 	SPU2_CIPHER_TYPE_NONE = 0x0,
15*4882a593Smuzhiyun 	SPU2_CIPHER_TYPE_AES128 = 0x1,
16*4882a593Smuzhiyun 	SPU2_CIPHER_TYPE_AES192 = 0x2,
17*4882a593Smuzhiyun 	SPU2_CIPHER_TYPE_AES256 = 0x3,
18*4882a593Smuzhiyun 	SPU2_CIPHER_TYPE_DES = 0x4,
19*4882a593Smuzhiyun 	SPU2_CIPHER_TYPE_3DES = 0x5,
20*4882a593Smuzhiyun 	SPU2_CIPHER_TYPE_LAST
21*4882a593Smuzhiyun };
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun enum spu2_cipher_mode {
24*4882a593Smuzhiyun 	SPU2_CIPHER_MODE_ECB = 0x0,
25*4882a593Smuzhiyun 	SPU2_CIPHER_MODE_CBC = 0x1,
26*4882a593Smuzhiyun 	SPU2_CIPHER_MODE_CTR = 0x2,
27*4882a593Smuzhiyun 	SPU2_CIPHER_MODE_CFB = 0x3,
28*4882a593Smuzhiyun 	SPU2_CIPHER_MODE_OFB = 0x4,
29*4882a593Smuzhiyun 	SPU2_CIPHER_MODE_XTS = 0x5,
30*4882a593Smuzhiyun 	SPU2_CIPHER_MODE_CCM = 0x6,
31*4882a593Smuzhiyun 	SPU2_CIPHER_MODE_GCM = 0x7,
32*4882a593Smuzhiyun 	SPU2_CIPHER_MODE_LAST
33*4882a593Smuzhiyun };
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun enum spu2_hash_type {
36*4882a593Smuzhiyun 	SPU2_HASH_TYPE_NONE = 0x0,
37*4882a593Smuzhiyun 	SPU2_HASH_TYPE_AES128 = 0x1,
38*4882a593Smuzhiyun 	SPU2_HASH_TYPE_AES192 = 0x2,
39*4882a593Smuzhiyun 	SPU2_HASH_TYPE_AES256 = 0x3,
40*4882a593Smuzhiyun 	SPU2_HASH_TYPE_MD5 = 0x6,
41*4882a593Smuzhiyun 	SPU2_HASH_TYPE_SHA1 = 0x7,
42*4882a593Smuzhiyun 	SPU2_HASH_TYPE_SHA224 = 0x8,
43*4882a593Smuzhiyun 	SPU2_HASH_TYPE_SHA256 = 0x9,
44*4882a593Smuzhiyun 	SPU2_HASH_TYPE_SHA384 = 0xa,
45*4882a593Smuzhiyun 	SPU2_HASH_TYPE_SHA512 = 0xb,
46*4882a593Smuzhiyun 	SPU2_HASH_TYPE_SHA512_224 = 0xc,
47*4882a593Smuzhiyun 	SPU2_HASH_TYPE_SHA512_256 = 0xd,
48*4882a593Smuzhiyun 	SPU2_HASH_TYPE_SHA3_224 = 0xe,
49*4882a593Smuzhiyun 	SPU2_HASH_TYPE_SHA3_256 = 0xf,
50*4882a593Smuzhiyun 	SPU2_HASH_TYPE_SHA3_384 = 0x10,
51*4882a593Smuzhiyun 	SPU2_HASH_TYPE_SHA3_512 = 0x11,
52*4882a593Smuzhiyun 	SPU2_HASH_TYPE_LAST
53*4882a593Smuzhiyun };
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun enum spu2_hash_mode {
56*4882a593Smuzhiyun 	SPU2_HASH_MODE_CMAC = 0x0,
57*4882a593Smuzhiyun 	SPU2_HASH_MODE_CBC_MAC = 0x1,
58*4882a593Smuzhiyun 	SPU2_HASH_MODE_XCBC_MAC = 0x2,
59*4882a593Smuzhiyun 	SPU2_HASH_MODE_HMAC = 0x3,
60*4882a593Smuzhiyun 	SPU2_HASH_MODE_RABIN = 0x4,
61*4882a593Smuzhiyun 	SPU2_HASH_MODE_CCM = 0x5,
62*4882a593Smuzhiyun 	SPU2_HASH_MODE_GCM = 0x6,
63*4882a593Smuzhiyun 	SPU2_HASH_MODE_RESERVED = 0x7,
64*4882a593Smuzhiyun 	SPU2_HASH_MODE_LAST
65*4882a593Smuzhiyun };
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun enum spu2_ret_md_opts {
68*4882a593Smuzhiyun 	SPU2_RET_NO_MD = 0,	/* return no metadata */
69*4882a593Smuzhiyun 	SPU2_RET_FMD_OMD = 1,	/* return both FMD and OMD */
70*4882a593Smuzhiyun 	SPU2_RET_FMD_ONLY = 2,	/* return only FMD */
71*4882a593Smuzhiyun 	SPU2_RET_FMD_OMD_IV = 3,	/* return FMD and OMD with just IVs */
72*4882a593Smuzhiyun };
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun /* Fixed Metadata format */
75*4882a593Smuzhiyun struct SPU2_FMD {
76*4882a593Smuzhiyun 	u64 ctrl0;
77*4882a593Smuzhiyun 	u64 ctrl1;
78*4882a593Smuzhiyun 	u64 ctrl2;
79*4882a593Smuzhiyun 	u64 ctrl3;
80*4882a593Smuzhiyun };
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun #define FMD_SIZE  sizeof(struct SPU2_FMD)
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun /* Fixed part of request message header length in bytes. Just FMD. */
85*4882a593Smuzhiyun #define SPU2_REQ_FIXED_LEN FMD_SIZE
86*4882a593Smuzhiyun #define SPU2_HEADER_ALLOC_LEN (SPU_REQ_FIXED_LEN + \
87*4882a593Smuzhiyun 				2 * MAX_KEY_SIZE + 2 * MAX_IV_SIZE)
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun /* FMD ctrl0 field masks */
90*4882a593Smuzhiyun #define SPU2_CIPH_ENCRYPT_EN            0x1 /* 0: decrypt, 1: encrypt */
91*4882a593Smuzhiyun #define SPU2_CIPH_TYPE                 0xF0 /* one of spu2_cipher_type */
92*4882a593Smuzhiyun #define SPU2_CIPH_TYPE_SHIFT              4
93*4882a593Smuzhiyun #define SPU2_CIPH_MODE                0xF00 /* one of spu2_cipher_mode */
94*4882a593Smuzhiyun #define SPU2_CIPH_MODE_SHIFT              8
95*4882a593Smuzhiyun #define SPU2_CFB_MASK                0x7000 /* cipher feedback mask */
96*4882a593Smuzhiyun #define SPU2_CFB_MASK_SHIFT              12
97*4882a593Smuzhiyun #define SPU2_PROTO_SEL             0xF00000 /* MACsec, IPsec, TLS... */
98*4882a593Smuzhiyun #define SPU2_PROTO_SEL_SHIFT             20
99*4882a593Smuzhiyun #define SPU2_HASH_FIRST           0x1000000 /* 1: hash input is input pkt
100*4882a593Smuzhiyun 					     * data
101*4882a593Smuzhiyun 					     */
102*4882a593Smuzhiyun #define SPU2_CHK_TAG              0x2000000 /* 1: check digest provided */
103*4882a593Smuzhiyun #define SPU2_HASH_TYPE          0x1F0000000 /* one of spu2_hash_type */
104*4882a593Smuzhiyun #define SPU2_HASH_TYPE_SHIFT             28
105*4882a593Smuzhiyun #define SPU2_HASH_MODE         0xF000000000 /* one of spu2_hash_mode */
106*4882a593Smuzhiyun #define SPU2_HASH_MODE_SHIFT             36
107*4882a593Smuzhiyun #define SPU2_CIPH_PAD_EN     0x100000000000 /* 1: Add pad to end of payload for
108*4882a593Smuzhiyun 					     *    enc
109*4882a593Smuzhiyun 					     */
110*4882a593Smuzhiyun #define SPU2_CIPH_PAD      0xFF000000000000 /* cipher pad value */
111*4882a593Smuzhiyun #define SPU2_CIPH_PAD_SHIFT              48
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun /* FMD ctrl1 field masks */
114*4882a593Smuzhiyun #define SPU2_TAG_LOC                    0x1 /* 1: end of payload, 0: undef */
115*4882a593Smuzhiyun #define SPU2_HAS_FR_DATA                0x2 /* 1: msg has frame data */
116*4882a593Smuzhiyun #define SPU2_HAS_AAD1                   0x4 /* 1: msg has AAD1 field */
117*4882a593Smuzhiyun #define SPU2_HAS_NAAD                   0x8 /* 1: msg has NAAD field */
118*4882a593Smuzhiyun #define SPU2_HAS_AAD2                  0x10 /* 1: msg has AAD2 field */
119*4882a593Smuzhiyun #define SPU2_HAS_ESN                   0x20 /* 1: msg has ESN field */
120*4882a593Smuzhiyun #define SPU2_HASH_KEY_LEN            0xFF00 /* len of hash key in bytes.
121*4882a593Smuzhiyun 					     * HMAC only.
122*4882a593Smuzhiyun 					     */
123*4882a593Smuzhiyun #define SPU2_HASH_KEY_LEN_SHIFT           8
124*4882a593Smuzhiyun #define SPU2_CIPH_KEY_LEN         0xFF00000 /* len of cipher key in bytes */
125*4882a593Smuzhiyun #define SPU2_CIPH_KEY_LEN_SHIFT          20
126*4882a593Smuzhiyun #define SPU2_GENIV               0x10000000 /* 1: hw generates IV */
127*4882a593Smuzhiyun #define SPU2_HASH_IV             0x20000000 /* 1: IV incl in hash */
128*4882a593Smuzhiyun #define SPU2_RET_IV              0x40000000 /* 1: return IV in output msg
129*4882a593Smuzhiyun 					     *    b4 payload
130*4882a593Smuzhiyun 					     */
131*4882a593Smuzhiyun #define SPU2_RET_IV_LEN         0xF00000000 /* length in bytes of IV returned.
132*4882a593Smuzhiyun 					     * 0 = 16 bytes
133*4882a593Smuzhiyun 					     */
134*4882a593Smuzhiyun #define SPU2_RET_IV_LEN_SHIFT            32
135*4882a593Smuzhiyun #define SPU2_IV_OFFSET         0xF000000000 /* gen IV offset */
136*4882a593Smuzhiyun #define SPU2_IV_OFFSET_SHIFT             36
137*4882a593Smuzhiyun #define SPU2_IV_LEN          0x1F0000000000 /* length of input IV in bytes */
138*4882a593Smuzhiyun #define SPU2_IV_LEN_SHIFT                40
139*4882a593Smuzhiyun #define SPU2_HASH_TAG_LEN  0x7F000000000000 /* hash tag length in bytes */
140*4882a593Smuzhiyun #define SPU2_HASH_TAG_LEN_SHIFT          48
141*4882a593Smuzhiyun #define SPU2_RETURN_MD    0x300000000000000 /* return metadata */
142*4882a593Smuzhiyun #define SPU2_RETURN_MD_SHIFT             56
143*4882a593Smuzhiyun #define SPU2_RETURN_FD    0x400000000000000
144*4882a593Smuzhiyun #define SPU2_RETURN_AAD1  0x800000000000000
145*4882a593Smuzhiyun #define SPU2_RETURN_NAAD 0x1000000000000000
146*4882a593Smuzhiyun #define SPU2_RETURN_AAD2 0x2000000000000000
147*4882a593Smuzhiyun #define SPU2_RETURN_PAY  0x4000000000000000 /* return payload */
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun /* FMD ctrl2 field masks */
150*4882a593Smuzhiyun #define SPU2_AAD1_OFFSET              0xFFF /* byte offset of AAD1 field */
151*4882a593Smuzhiyun #define SPU2_AAD1_LEN               0xFF000 /* length of AAD1 in bytes */
152*4882a593Smuzhiyun #define SPU2_AAD1_LEN_SHIFT              12
153*4882a593Smuzhiyun #define SPU2_AAD2_OFFSET         0xFFF00000 /* byte offset of AAD2 field */
154*4882a593Smuzhiyun #define SPU2_AAD2_OFFSET_SHIFT           20
155*4882a593Smuzhiyun #define SPU2_PL_OFFSET   0xFFFFFFFF00000000 /* payload offset from AAD2 */
156*4882a593Smuzhiyun #define SPU2_PL_OFFSET_SHIFT             32
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun /* FMD ctrl3 field masks */
159*4882a593Smuzhiyun #define SPU2_PL_LEN              0xFFFFFFFF /* payload length in bytes */
160*4882a593Smuzhiyun #define SPU2_TLS_LEN         0xFFFF00000000 /* TLS encrypt: cipher len
161*4882a593Smuzhiyun 					     * TLS decrypt: compressed len
162*4882a593Smuzhiyun 					     */
163*4882a593Smuzhiyun #define SPU2_TLS_LEN_SHIFT               32
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun /*
166*4882a593Smuzhiyun  * Max value that can be represented in the Payload Length field of the
167*4882a593Smuzhiyun  * ctrl3 word of FMD.
168*4882a593Smuzhiyun  */
169*4882a593Smuzhiyun #define SPU2_MAX_PAYLOAD  SPU2_PL_LEN
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun /* Error values returned in STATUS field of response messages */
172*4882a593Smuzhiyun #define SPU2_INVALID_ICV  1
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun void spu2_dump_msg_hdr(u8 *buf, unsigned int buf_len);
175*4882a593Smuzhiyun u32 spu2_ctx_max_payload(enum spu_cipher_alg cipher_alg,
176*4882a593Smuzhiyun 			 enum spu_cipher_mode cipher_mode,
177*4882a593Smuzhiyun 			 unsigned int blocksize);
178*4882a593Smuzhiyun u32 spu2_payload_length(u8 *spu_hdr);
179*4882a593Smuzhiyun u16 spu2_response_hdr_len(u16 auth_key_len, u16 enc_key_len, bool is_hash);
180*4882a593Smuzhiyun u16 spu2_hash_pad_len(enum hash_alg hash_alg, enum hash_mode hash_mode,
181*4882a593Smuzhiyun 		      u32 chunksize, u16 hash_block_size);
182*4882a593Smuzhiyun u32 spu2_gcm_ccm_pad_len(enum spu_cipher_mode cipher_mode,
183*4882a593Smuzhiyun 			 unsigned int data_size);
184*4882a593Smuzhiyun u32 spu2_assoc_resp_len(enum spu_cipher_mode cipher_mode,
185*4882a593Smuzhiyun 			unsigned int assoc_len, unsigned int iv_len,
186*4882a593Smuzhiyun 			bool is_encrypt);
187*4882a593Smuzhiyun u8 spu2_aead_ivlen(enum spu_cipher_mode cipher_mode,
188*4882a593Smuzhiyun 		   u16 iv_len);
189*4882a593Smuzhiyun enum hash_type spu2_hash_type(u32 src_sent);
190*4882a593Smuzhiyun u32 spu2_digest_size(u32 alg_digest_size, enum hash_alg alg,
191*4882a593Smuzhiyun 		     enum hash_type htype);
192*4882a593Smuzhiyun u32 spu2_create_request(u8 *spu_hdr,
193*4882a593Smuzhiyun 			struct spu_request_opts *req_opts,
194*4882a593Smuzhiyun 			struct spu_cipher_parms *cipher_parms,
195*4882a593Smuzhiyun 			struct spu_hash_parms *hash_parms,
196*4882a593Smuzhiyun 			struct spu_aead_parms *aead_parms,
197*4882a593Smuzhiyun 			unsigned int data_size);
198*4882a593Smuzhiyun u16 spu2_cipher_req_init(u8 *spu_hdr, struct spu_cipher_parms *cipher_parms);
199*4882a593Smuzhiyun void spu2_cipher_req_finish(u8 *spu_hdr,
200*4882a593Smuzhiyun 			    u16 spu_req_hdr_len,
201*4882a593Smuzhiyun 			    unsigned int is_inbound,
202*4882a593Smuzhiyun 			    struct spu_cipher_parms *cipher_parms,
203*4882a593Smuzhiyun 			    unsigned int data_size);
204*4882a593Smuzhiyun void spu2_request_pad(u8 *pad_start, u32 gcm_padding, u32 hash_pad_len,
205*4882a593Smuzhiyun 		      enum hash_alg auth_alg, enum hash_mode auth_mode,
206*4882a593Smuzhiyun 		      unsigned int total_sent, u32 status_padding);
207*4882a593Smuzhiyun u8 spu2_xts_tweak_in_payload(void);
208*4882a593Smuzhiyun u8 spu2_tx_status_len(void);
209*4882a593Smuzhiyun u8 spu2_rx_status_len(void);
210*4882a593Smuzhiyun int spu2_status_process(u8 *statp);
211*4882a593Smuzhiyun void spu2_ccm_update_iv(unsigned int digestsize,
212*4882a593Smuzhiyun 			struct spu_cipher_parms *cipher_parms,
213*4882a593Smuzhiyun 			unsigned int assoclen, unsigned int chunksize,
214*4882a593Smuzhiyun 			bool is_encrypt, bool is_esp);
215*4882a593Smuzhiyun u32 spu2_wordalign_padlen(u32 data_size);
216*4882a593Smuzhiyun #endif
217