summaryrefslogtreecommitdiff
path: root/drivers/crypto/starfive/jh7110/jh7110-regs.h
blob: 89ae69f542c3285b5bcddcee00ba22b223dc1fbd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __JH7110_REGS_H__
#define __JH7110_REGS_H__

#include <crypto/aes.h>
#include <crypto/sha.h>

#define JH7110_ALG_CR_OFFSET					0x0
#define JH7110_ALG_FIFO_OFFSET					0x4
#define JH7110_IE_MASK_OFFSET					0x8
#define JH7110_IE_FLAG_OFFSET					0xc
#define JH7110_DMA_IN_LEN_OFFSET				0x10
#define JH7110_DMA_OUT_LEN_OFFSET				0x14

#define JH7110_AES_REGS_OFFSET					0x100
#define JH7110_SHA_REGS_OFFSET					0x300
#define JH7110_CRYPTO_REGS_OFFSET				0x400

union jh7110_alg_cr {
	u32 v;
	struct {
		u32 start				:1;
		u32 aes_dma_en			:1;
		u32 des_dma_en			:1;
		u32 sha_dma_en			:1;
		u32 alg_done			:1;
		u32 rsvd_0				:3;
		u32 clear				:1;
		u32 rsvd_1				:23;
	};
};

union jh7110_ie_mask {
	u32 v;
	struct {
		u32 aes_ie_mask			:1;
		u32 des_ie_mask			:1;
		u32 sha_ie_mask			:1;
		u32 crypto_ie_mask		:1;
		u32 rsvd_0				:28;
	};
};

union jh7110_ie_flag {
	u32 v;
	struct {
		u32 aes_ie_done			:1;
		u32 des_ie_done			:1;
		u32 sha_ie_done			:1;
		u32 crypto_ie_done		:1;
		u32 rsvd_0				:28;
	};
};

#define JH7110_CRYPTO_CACR_OFFSET				(JH7110_CRYPTO_REGS_OFFSET + 0x0)
#define JH7110_CRYPTO_CASR_OFFSET				(JH7110_CRYPTO_REGS_OFFSET + 0x4)
#define JH7110_CRYPTO_CAAR_OFFSET				(JH7110_CRYPTO_REGS_OFFSET + 0x8)
#define JH7110_CRYPTO_CAER_OFFSET				(JH7110_CRYPTO_REGS_OFFSET + 0x108)
#define JH7110_CRYPTO_CANR_OFFSET				(JH7110_CRYPTO_REGS_OFFSET + 0x208)
#define JH7110_CRYPTO_CAAFR_OFFSET				(JH7110_CRYPTO_REGS_OFFSET + 0x308)
#define JH7110_CRYPTO_CAEFR_OFFSET				(JH7110_CRYPTO_REGS_OFFSET + 0x30c)
#define JH7110_CRYPTO_CANFR_OFFSET				(JH7110_CRYPTO_REGS_OFFSET + 0x310)
#define JH7110_FIFO_COUNTER_OFFSET				(JH7110_CRYPTO_REGS_OFFSET + 0x314)

// R^2 mod N and N0'
#define CRYPTO_CMD_PRE						0x0
// (A + A) mod N, ==> A
#define CRYPTO_CMD_AAN						0x1
// A ^ E mod N   ==> A
#define CRYPTO_CMD_AMEN						0x2
// A + E mod N   ==> A
#define CRYPTO_CMD_AAEN						0x3
// A - E mod N   ==> A
#define CRYPTO_CMD_ADEN						0x4
// A * R mod N   ==> A
#define CRYPTO_CMD_ARN						0x5
// A * E * R mod N ==> A
#define CRYPTO_CMD_AERN						0x6
// A * A * R mod N ==> A
#define CRYPTO_CMD_AARN						0x7
// ECC2P      ==> A
#define CRYPTO_CMD_ECC2P					0x8
// ECCPQ      ==> A
#define CRYPTO_CMD_ECCPQ					0x9

union jh7110_crypto_cacr {
	u32 v;
	struct {
		u32 start			:1;
		u32 reset			:1;
		u32 ie				:1;
		u32 rsvd_0			:1;
		u32 fifo_mode			:1;
		u32 not_r2			:1;
		u32 ecc_sub			:1;
		u32 pre_expf			:1;

		u32 cmd				:4;
		u32 rsvd_1			:1;
		u32 ctrl_dummy			:1;
		u32 ctrl_false			:1;
		u32 cln_done			:1;

		u32 opsize			:6;
		u32 rsvd_2			:2;

		u32 exposize			:6;
		u32 rsvd_3			:1;
		u32 bigendian			:1;
	};
};

union jh7110_crypto_casr {
	u32 v;
	struct {
#define JH7110_PKA_DONE_FLAGS					BIT(0)
		u32 done			:1;
		u32 rsvd_0			:31;
	};
};

#define JH7110_AES_AESDIO0R					(JH7110_AES_REGS_OFFSET + 0x0)
#define JH7110_AES_KEY0						(JH7110_AES_REGS_OFFSET + 0x4)
#define JH7110_AES_KEY1						(JH7110_AES_REGS_OFFSET + 0x8)
#define JH7110_AES_KEY2						(JH7110_AES_REGS_OFFSET + 0xC)
#define JH7110_AES_KEY3						(JH7110_AES_REGS_OFFSET + 0x10)
#define JH7110_AES_KEY4						(JH7110_AES_REGS_OFFSET + 0x14)
#define JH7110_AES_KEY5						(JH7110_AES_REGS_OFFSET + 0x18)
#define JH7110_AES_KEY6						(JH7110_AES_REGS_OFFSET + 0x1C)
#define JH7110_AES_KEY7						(JH7110_AES_REGS_OFFSET + 0x20)
#define JH7110_AES_CSR						(JH7110_AES_REGS_OFFSET + 0x24)
#define JH7110_AES_IV0						(JH7110_AES_REGS_OFFSET + 0x28)
#define JH7110_AES_IV1						(JH7110_AES_REGS_OFFSET + 0x2C)
#define JH7110_AES_IV2						(JH7110_AES_REGS_OFFSET + 0x30)
#define JH7110_AES_IV3						(JH7110_AES_REGS_OFFSET + 0x34)
#define JH7110_AES_NONCE0					(JH7110_AES_REGS_OFFSET + 0x3C)
#define JH7110_AES_NONCE1					(JH7110_AES_REGS_OFFSET + 0x40)
#define JH7110_AES_NONCE2					(JH7110_AES_REGS_OFFSET + 0x44)
#define JH7110_AES_NONCE3					(JH7110_AES_REGS_OFFSET + 0x48)
#define JH7110_AES_ALEN0					(JH7110_AES_REGS_OFFSET + 0x4C)
#define JH7110_AES_ALEN1					(JH7110_AES_REGS_OFFSET + 0x50)
#define JH7110_AES_MLEN0					(JH7110_AES_REGS_OFFSET + 0x54)
#define JH7110_AES_MLEN1					(JH7110_AES_REGS_OFFSET + 0x58)
#define JH7110_AES_IVLEN					(JH7110_AES_REGS_OFFSET + 0x5C)

union jh7110_aes_csr {
	u32 v;
	struct {
		u32 cmode			:1;
#define JH7110_AES_KEYMODE_128					0x0
#define JH7110_AES_KEYMODE_192					0x1
#define JH7110_AES_KEYMODE_256					0x2
		u32 keymode			:2;
#define JH7110_AES_BUSY						BIT(3)
		u32 busy			:1;
		u32 done			:1;
#define JH7110_AES_KEY_DONE					BIT(5)
		u32 krdy			:1;
		u32 aesrst			:1;
		u32 aesie			:1;

#define JH7110_AES_CCM_START					BIT(8)
		u32 ccm_start			:1;
#define JH7110_AES_MODE_ECB					0x0
#define JH7110_AES_MODE_CBC					0x1
#define JH7110_AES_MODE_CFB					0x2
#define JH7110_AES_MODE_OFB					0x3
#define JH7110_AES_MODE_CTR					0x4
#define JH7110_AES_MODE_CCM					0x5
#define JH7110_AES_MODE_GCM					0x6
		u32 mode			:3;
#define JH7110_AES_GCM_START					BIT(12)
		u32 gcm_start			:1;
#define JH7110_AES_GCM_DONE					BIT(13)
		u32 gcm_done			:1;
		u32 delay_aes			:1;
		u32 vaes_start			:1;

		u32 rsvd_0			:8;

#define JH7110_AES_MODE_XFB_1					0x0
#define JH7110_AES_MODE_XFB_128					0x5
		u32 stream_mode			:3;
		u32 rsvd_1			:5;
	};
};

#define JH7110_SHA_SHACSR					(JH7110_SHA_REGS_OFFSET + 0x0)
#define JH7110_SHA_SHAWDR					(JH7110_SHA_REGS_OFFSET + 0x4)
#define JH7110_SHA_SHARDR					(JH7110_SHA_REGS_OFFSET + 0x8)
#define JH7110_SHA_SHAWSR					(JH7110_SHA_REGS_OFFSET + 0xC)
#define JH7110_SHA_SHAWLEN3					(JH7110_SHA_REGS_OFFSET + 0x10)
#define JH7110_SHA_SHAWLEN2					(JH7110_SHA_REGS_OFFSET + 0x14)
#define JH7110_SHA_SHAWLEN1					(JH7110_SHA_REGS_OFFSET + 0x18)
#define JH7110_SHA_SHAWLEN0					(JH7110_SHA_REGS_OFFSET + 0x1C)
#define JH7110_SHA_SHAWKR					(JH7110_SHA_REGS_OFFSET + 0x20)
#define JH7110_SHA_SHAWKLEN					(JH7110_SHA_REGS_OFFSET + 0x24)

union jh7110_sha_shacsr {
	u32 v;
	struct {
		u32 start			:1;
		u32 reset			:1;
		u32 ie				:1;
		u32 firstb			:1;
#define JH7110_SHA_SM3						0x0
#define JH7110_SHA_SHA0						0x1
#define JH7110_SHA_SHA1						0x2
#define JH7110_SHA_SHA224					0x3
#define JH7110_SHA_SHA256					0x4
#define JH7110_SHA_SHA384					0x5
#define JH7110_SHA_SHA512					0x6
#define JH7110_SHA_MODE_MASK					0x7
		u32 mode			:3;
		u32 rsvd_0			:1;

		u32 final			:1;
		u32 rsvd_1			:2;
#define JH7110_SHA_HMAC_FLAGS					0x800
		u32 hmac			:1;
		u32 rsvd_2			:1;
#define JH7110_SHA_KEY_DONE					BIT(13)
		u32 key_done			:1;
		u32 key_flag			:1;
#define JH7110_SHA_HMAC_DONE					BIT(15)
		u32 hmac_done			:1;
#define JH7110_SHA_BUSY						BIT(16)
		u32 busy			:1;
		u32 shadone			:1;
		u32 rsvd_3			:14;
	};
};

#endif