2 * Copyright 2016 Broadcom
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License, version 2, as
6 * published by the Free Software Foundation (the "GPL").
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License version 2 (GPLv2) for more details.
13 * You should have received a copy of the GNU General Public License
14 * version 2 (GPLv2) along with this source code.
18 * This file contains SPU message definitions specific to SPU2.
24 enum spu2_cipher_type
{
25 SPU2_CIPHER_TYPE_NONE
= 0x0,
26 SPU2_CIPHER_TYPE_AES128
= 0x1,
27 SPU2_CIPHER_TYPE_AES192
= 0x2,
28 SPU2_CIPHER_TYPE_AES256
= 0x3,
29 SPU2_CIPHER_TYPE_DES
= 0x4,
30 SPU2_CIPHER_TYPE_3DES
= 0x5,
34 enum spu2_cipher_mode
{
35 SPU2_CIPHER_MODE_ECB
= 0x0,
36 SPU2_CIPHER_MODE_CBC
= 0x1,
37 SPU2_CIPHER_MODE_CTR
= 0x2,
38 SPU2_CIPHER_MODE_CFB
= 0x3,
39 SPU2_CIPHER_MODE_OFB
= 0x4,
40 SPU2_CIPHER_MODE_XTS
= 0x5,
41 SPU2_CIPHER_MODE_CCM
= 0x6,
42 SPU2_CIPHER_MODE_GCM
= 0x7,
47 SPU2_HASH_TYPE_NONE
= 0x0,
48 SPU2_HASH_TYPE_AES128
= 0x1,
49 SPU2_HASH_TYPE_AES192
= 0x2,
50 SPU2_HASH_TYPE_AES256
= 0x3,
51 SPU2_HASH_TYPE_MD5
= 0x6,
52 SPU2_HASH_TYPE_SHA1
= 0x7,
53 SPU2_HASH_TYPE_SHA224
= 0x8,
54 SPU2_HASH_TYPE_SHA256
= 0x9,
55 SPU2_HASH_TYPE_SHA384
= 0xa,
56 SPU2_HASH_TYPE_SHA512
= 0xb,
57 SPU2_HASH_TYPE_SHA512_224
= 0xc,
58 SPU2_HASH_TYPE_SHA512_256
= 0xd,
59 SPU2_HASH_TYPE_SHA3_224
= 0xe,
60 SPU2_HASH_TYPE_SHA3_256
= 0xf,
61 SPU2_HASH_TYPE_SHA3_384
= 0x10,
62 SPU2_HASH_TYPE_SHA3_512
= 0x11,
67 SPU2_HASH_MODE_CMAC
= 0x0,
68 SPU2_HASH_MODE_CBC_MAC
= 0x1,
69 SPU2_HASH_MODE_XCBC_MAC
= 0x2,
70 SPU2_HASH_MODE_HMAC
= 0x3,
71 SPU2_HASH_MODE_RABIN
= 0x4,
72 SPU2_HASH_MODE_CCM
= 0x5,
73 SPU2_HASH_MODE_GCM
= 0x6,
74 SPU2_HASH_MODE_RESERVED
= 0x7,
78 enum spu2_ret_md_opts
{
79 SPU2_RET_NO_MD
= 0, /* return no metadata */
80 SPU2_RET_FMD_OMD
= 1, /* return both FMD and OMD */
81 SPU2_RET_FMD_ONLY
= 2, /* return only FMD */
82 SPU2_RET_FMD_OMD_IV
= 3, /* return FMD and OMD with just IVs */
85 /* Fixed Metadata format */
93 #define FMD_SIZE sizeof(struct SPU2_FMD)
95 /* Fixed part of request message header length in bytes. Just FMD. */
96 #define SPU2_REQ_FIXED_LEN FMD_SIZE
97 #define SPU2_HEADER_ALLOC_LEN (SPU_REQ_FIXED_LEN + \
98 2 * MAX_KEY_SIZE + 2 * MAX_IV_SIZE)
100 /* FMD ctrl0 field masks */
101 #define SPU2_CIPH_ENCRYPT_EN 0x1 /* 0: decrypt, 1: encrypt */
102 #define SPU2_CIPH_TYPE 0xF0 /* one of spu2_cipher_type */
103 #define SPU2_CIPH_TYPE_SHIFT 4
104 #define SPU2_CIPH_MODE 0xF00 /* one of spu2_cipher_mode */
105 #define SPU2_CIPH_MODE_SHIFT 8
106 #define SPU2_CFB_MASK 0x7000 /* cipher feedback mask */
107 #define SPU2_CFB_MASK_SHIFT 12
108 #define SPU2_PROTO_SEL 0xF00000 /* MACsec, IPsec, TLS... */
109 #define SPU2_PROTO_SEL_SHIFT 20
110 #define SPU2_HASH_FIRST 0x1000000 /* 1: hash input is input pkt
113 #define SPU2_CHK_TAG 0x2000000 /* 1: check digest provided */
114 #define SPU2_HASH_TYPE 0x1F0000000 /* one of spu2_hash_type */
115 #define SPU2_HASH_TYPE_SHIFT 28
116 #define SPU2_HASH_MODE 0xF000000000 /* one of spu2_hash_mode */
117 #define SPU2_HASH_MODE_SHIFT 36
118 #define SPU2_CIPH_PAD_EN 0x100000000000 /* 1: Add pad to end of payload for
121 #define SPU2_CIPH_PAD 0xFF000000000000 /* cipher pad value */
122 #define SPU2_CIPH_PAD_SHIFT 48
124 /* FMD ctrl1 field masks */
125 #define SPU2_TAG_LOC 0x1 /* 1: end of payload, 0: undef */
126 #define SPU2_HAS_FR_DATA 0x2 /* 1: msg has frame data */
127 #define SPU2_HAS_AAD1 0x4 /* 1: msg has AAD1 field */
128 #define SPU2_HAS_NAAD 0x8 /* 1: msg has NAAD field */
129 #define SPU2_HAS_AAD2 0x10 /* 1: msg has AAD2 field */
130 #define SPU2_HAS_ESN 0x20 /* 1: msg has ESN field */
131 #define SPU2_HASH_KEY_LEN 0xFF00 /* len of hash key in bytes.
134 #define SPU2_HASH_KEY_LEN_SHIFT 8
135 #define SPU2_CIPH_KEY_LEN 0xFF00000 /* len of cipher key in bytes */
136 #define SPU2_CIPH_KEY_LEN_SHIFT 20
137 #define SPU2_GENIV 0x10000000 /* 1: hw generates IV */
138 #define SPU2_HASH_IV 0x20000000 /* 1: IV incl in hash */
139 #define SPU2_RET_IV 0x40000000 /* 1: return IV in output msg
142 #define SPU2_RET_IV_LEN 0xF00000000 /* length in bytes of IV returned.
145 #define SPU2_RET_IV_LEN_SHIFT 32
146 #define SPU2_IV_OFFSET 0xF000000000 /* gen IV offset */
147 #define SPU2_IV_OFFSET_SHIFT 36
148 #define SPU2_IV_LEN 0x1F0000000000 /* length of input IV in bytes */
149 #define SPU2_IV_LEN_SHIFT 40
150 #define SPU2_HASH_TAG_LEN 0x7F000000000000 /* hash tag length in bytes */
151 #define SPU2_HASH_TAG_LEN_SHIFT 48
152 #define SPU2_RETURN_MD 0x300000000000000 /* return metadata */
153 #define SPU2_RETURN_MD_SHIFT 56
154 #define SPU2_RETURN_FD 0x400000000000000
155 #define SPU2_RETURN_AAD1 0x800000000000000
156 #define SPU2_RETURN_NAAD 0x1000000000000000
157 #define SPU2_RETURN_AAD2 0x2000000000000000
158 #define SPU2_RETURN_PAY 0x4000000000000000 /* return payload */
160 /* FMD ctrl2 field masks */
161 #define SPU2_AAD1_OFFSET 0xFFF /* byte offset of AAD1 field */
162 #define SPU2_AAD1_LEN 0xFF000 /* length of AAD1 in bytes */
163 #define SPU2_AAD1_LEN_SHIFT 12
164 #define SPU2_AAD2_OFFSET 0xFFF00000 /* byte offset of AAD2 field */
165 #define SPU2_AAD2_OFFSET_SHIFT 20
166 #define SPU2_PL_OFFSET 0xFFFFFFFF00000000 /* payload offset from AAD2 */
167 #define SPU2_PL_OFFSET_SHIFT 32
169 /* FMD ctrl3 field masks */
170 #define SPU2_PL_LEN 0xFFFFFFFF /* payload length in bytes */
171 #define SPU2_TLS_LEN 0xFFFF00000000 /* TLS encrypt: cipher len
172 * TLS decrypt: compressed len
174 #define SPU2_TLS_LEN_SHIFT 32
177 * Max value that can be represented in the Payload Length field of the
180 #define SPU2_MAX_PAYLOAD SPU2_PL_LEN
182 /* Error values returned in STATUS field of response messages */
183 #define SPU2_INVALID_ICV 1
185 void spu2_dump_msg_hdr(u8
*buf
, unsigned int buf_len
);
186 u32
spu2_ctx_max_payload(enum spu_cipher_alg cipher_alg
,
187 enum spu_cipher_mode cipher_mode
,
188 unsigned int blocksize
);
189 u32
spu2_payload_length(u8
*spu_hdr
);
190 u16
spu2_response_hdr_len(u16 auth_key_len
, u16 enc_key_len
, bool is_hash
);
191 u16
spu2_hash_pad_len(enum hash_alg hash_alg
, enum hash_mode hash_mode
,
192 u32 chunksize
, u16 hash_block_size
);
193 u32
spu2_gcm_ccm_pad_len(enum spu_cipher_mode cipher_mode
,
194 unsigned int data_size
);
195 u32
spu2_assoc_resp_len(enum spu_cipher_mode cipher_mode
,
196 unsigned int assoc_len
, unsigned int iv_len
,
198 u8
spu2_aead_ivlen(enum spu_cipher_mode cipher_mode
,
200 enum hash_type
spu2_hash_type(u32 src_sent
);
201 u32
spu2_digest_size(u32 alg_digest_size
, enum hash_alg alg
,
202 enum hash_type htype
);
203 u32
spu2_create_request(u8
*spu_hdr
,
204 struct spu_request_opts
*req_opts
,
205 struct spu_cipher_parms
*cipher_parms
,
206 struct spu_hash_parms
*hash_parms
,
207 struct spu_aead_parms
*aead_parms
,
208 unsigned int data_size
);
209 u16
spu2_cipher_req_init(u8
*spu_hdr
, struct spu_cipher_parms
*cipher_parms
);
210 void spu2_cipher_req_finish(u8
*spu_hdr
,
212 unsigned int is_inbound
,
213 struct spu_cipher_parms
*cipher_parms
,
215 unsigned int data_size
);
216 void spu2_request_pad(u8
*pad_start
, u32 gcm_padding
, u32 hash_pad_len
,
217 enum hash_alg auth_alg
, enum hash_mode auth_mode
,
218 unsigned int total_sent
, u32 status_padding
);
219 u8
spu2_xts_tweak_in_payload(void);
220 u8
spu2_tx_status_len(void);
221 u8
spu2_rx_status_len(void);
222 int spu2_status_process(u8
*statp
);
223 void spu2_ccm_update_iv(unsigned int digestsize
,
224 struct spu_cipher_parms
*cipher_parms
,
225 unsigned int assoclen
, unsigned int chunksize
,
226 bool is_encrypt
, bool is_esp
);
227 u32
spu2_wordalign_padlen(u32 data_size
);