xref: /OK3568_Linux_fs/kernel/drivers/crypto/rockchip/rk3288_crypto.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef __RK3288_CRYPTO_H__
3*4882a593Smuzhiyun #define __RK3288_CRYPTO_H__
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <crypto/aes.h>
6*4882a593Smuzhiyun #include <crypto/internal/des.h>
7*4882a593Smuzhiyun #include <crypto/algapi.h>
8*4882a593Smuzhiyun #include <linux/interrupt.h>
9*4882a593Smuzhiyun #include <linux/delay.h>
10*4882a593Smuzhiyun #include <linux/scatterlist.h>
11*4882a593Smuzhiyun #include <crypto/internal/hash.h>
12*4882a593Smuzhiyun #include <crypto/internal/skcipher.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <crypto/md5.h>
15*4882a593Smuzhiyun #include <crypto/sha.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define _SBF(v, f)			((v) << (f))
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun /* Crypto control registers*/
20*4882a593Smuzhiyun #define RK_CRYPTO_INTSTS		0x0000
21*4882a593Smuzhiyun #define RK_CRYPTO_PKA_DONE_INT		BIT(5)
22*4882a593Smuzhiyun #define RK_CRYPTO_HASH_DONE_INT		BIT(4)
23*4882a593Smuzhiyun #define RK_CRYPTO_HRDMA_ERR_INT		BIT(3)
24*4882a593Smuzhiyun #define RK_CRYPTO_HRDMA_DONE_INT	BIT(2)
25*4882a593Smuzhiyun #define RK_CRYPTO_BCDMA_ERR_INT		BIT(1)
26*4882a593Smuzhiyun #define RK_CRYPTO_BCDMA_DONE_INT	BIT(0)
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun #define RK_CRYPTO_INTENA		0x0004
29*4882a593Smuzhiyun #define RK_CRYPTO_PKA_DONE_ENA		BIT(5)
30*4882a593Smuzhiyun #define RK_CRYPTO_HASH_DONE_ENA		BIT(4)
31*4882a593Smuzhiyun #define RK_CRYPTO_HRDMA_ERR_ENA		BIT(3)
32*4882a593Smuzhiyun #define RK_CRYPTO_HRDMA_DONE_ENA	BIT(2)
33*4882a593Smuzhiyun #define RK_CRYPTO_BCDMA_ERR_ENA		BIT(1)
34*4882a593Smuzhiyun #define RK_CRYPTO_BCDMA_DONE_ENA	BIT(0)
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #define RK_CRYPTO_CTRL			0x0008
37*4882a593Smuzhiyun #define RK_CRYPTO_WRITE_MASK		_SBF(0xFFFF, 16)
38*4882a593Smuzhiyun #define RK_CRYPTO_TRNG_FLUSH		BIT(9)
39*4882a593Smuzhiyun #define RK_CRYPTO_TRNG_START		BIT(8)
40*4882a593Smuzhiyun #define RK_CRYPTO_PKA_FLUSH		BIT(7)
41*4882a593Smuzhiyun #define RK_CRYPTO_HASH_FLUSH		BIT(6)
42*4882a593Smuzhiyun #define RK_CRYPTO_BLOCK_FLUSH		BIT(5)
43*4882a593Smuzhiyun #define RK_CRYPTO_PKA_START		BIT(4)
44*4882a593Smuzhiyun #define RK_CRYPTO_HASH_START		BIT(3)
45*4882a593Smuzhiyun #define RK_CRYPTO_BLOCK_START		BIT(2)
46*4882a593Smuzhiyun #define RK_CRYPTO_TDES_START		BIT(1)
47*4882a593Smuzhiyun #define RK_CRYPTO_AES_START		BIT(0)
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun #define RK_CRYPTO_CONF			0x000c
50*4882a593Smuzhiyun /* HASH Receive DMA Address Mode:   fix | increment */
51*4882a593Smuzhiyun #define RK_CRYPTO_HR_ADDR_MODE		BIT(8)
52*4882a593Smuzhiyun /* Block Transmit DMA Address Mode: fix | increment */
53*4882a593Smuzhiyun #define RK_CRYPTO_BT_ADDR_MODE		BIT(7)
54*4882a593Smuzhiyun /* Block Receive DMA Address Mode:  fix | increment */
55*4882a593Smuzhiyun #define RK_CRYPTO_BR_ADDR_MODE		BIT(6)
56*4882a593Smuzhiyun #define RK_CRYPTO_BYTESWAP_HRFIFO	BIT(5)
57*4882a593Smuzhiyun #define RK_CRYPTO_BYTESWAP_BTFIFO	BIT(4)
58*4882a593Smuzhiyun #define RK_CRYPTO_BYTESWAP_BRFIFO	BIT(3)
59*4882a593Smuzhiyun /* AES = 0 OR DES = 1 */
60*4882a593Smuzhiyun #define RK_CRYPTO_DESSEL				BIT(2)
61*4882a593Smuzhiyun #define RK_CYYPTO_HASHINSEL_INDEPENDENT_SOURCE		_SBF(0x00, 0)
62*4882a593Smuzhiyun #define RK_CYYPTO_HASHINSEL_BLOCK_CIPHER_INPUT		_SBF(0x01, 0)
63*4882a593Smuzhiyun #define RK_CYYPTO_HASHINSEL_BLOCK_CIPHER_OUTPUT		_SBF(0x02, 0)
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun /* Block Receiving DMA Start Address Register */
66*4882a593Smuzhiyun #define RK_CRYPTO_BRDMAS		0x0010
67*4882a593Smuzhiyun /* Block Transmitting DMA Start Address Register */
68*4882a593Smuzhiyun #define RK_CRYPTO_BTDMAS		0x0014
69*4882a593Smuzhiyun /* Block Receiving DMA Length Register */
70*4882a593Smuzhiyun #define RK_CRYPTO_BRDMAL		0x0018
71*4882a593Smuzhiyun /* Hash Receiving DMA Start Address Register */
72*4882a593Smuzhiyun #define RK_CRYPTO_HRDMAS		0x001c
73*4882a593Smuzhiyun /* Hash Receiving DMA Length Register */
74*4882a593Smuzhiyun #define RK_CRYPTO_HRDMAL		0x0020
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun /* AES registers */
77*4882a593Smuzhiyun #define RK_CRYPTO_AES_CTRL			  0x0080
78*4882a593Smuzhiyun #define RK_CRYPTO_AES_BYTESWAP_CNT	BIT(11)
79*4882a593Smuzhiyun #define RK_CRYPTO_AES_BYTESWAP_KEY	BIT(10)
80*4882a593Smuzhiyun #define RK_CRYPTO_AES_BYTESWAP_IV	BIT(9)
81*4882a593Smuzhiyun #define RK_CRYPTO_AES_BYTESWAP_DO	BIT(8)
82*4882a593Smuzhiyun #define RK_CRYPTO_AES_BYTESWAP_DI	BIT(7)
83*4882a593Smuzhiyun #define RK_CRYPTO_AES_KEY_CHANGE	BIT(6)
84*4882a593Smuzhiyun #define RK_CRYPTO_AES_ECB_MODE		_SBF(0x00, 4)
85*4882a593Smuzhiyun #define RK_CRYPTO_AES_CBC_MODE		_SBF(0x01, 4)
86*4882a593Smuzhiyun #define RK_CRYPTO_AES_CTR_MODE		_SBF(0x02, 4)
87*4882a593Smuzhiyun #define RK_CRYPTO_AES_128BIT_key	_SBF(0x00, 2)
88*4882a593Smuzhiyun #define RK_CRYPTO_AES_192BIT_key	_SBF(0x01, 2)
89*4882a593Smuzhiyun #define RK_CRYPTO_AES_256BIT_key	_SBF(0x02, 2)
90*4882a593Smuzhiyun /* Slave = 0 / fifo = 1 */
91*4882a593Smuzhiyun #define RK_CRYPTO_AES_FIFO_MODE		BIT(1)
92*4882a593Smuzhiyun /* Encryption = 0 , Decryption = 1 */
93*4882a593Smuzhiyun #define RK_CRYPTO_AES_DEC		BIT(0)
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun #define RK_CRYPTO_AES_STS		0x0084
96*4882a593Smuzhiyun #define RK_CRYPTO_AES_DONE		BIT(0)
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun /* AES Input Data 0-3 Register */
99*4882a593Smuzhiyun #define RK_CRYPTO_AES_DIN_0		0x0088
100*4882a593Smuzhiyun #define RK_CRYPTO_AES_DIN_1		0x008c
101*4882a593Smuzhiyun #define RK_CRYPTO_AES_DIN_2		0x0090
102*4882a593Smuzhiyun #define RK_CRYPTO_AES_DIN_3		0x0094
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun /* AES output Data 0-3 Register */
105*4882a593Smuzhiyun #define RK_CRYPTO_AES_DOUT_0		0x0098
106*4882a593Smuzhiyun #define RK_CRYPTO_AES_DOUT_1		0x009c
107*4882a593Smuzhiyun #define RK_CRYPTO_AES_DOUT_2		0x00a0
108*4882a593Smuzhiyun #define RK_CRYPTO_AES_DOUT_3		0x00a4
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun /* AES IV Data 0-3 Register */
111*4882a593Smuzhiyun #define RK_CRYPTO_AES_IV_0		0x00a8
112*4882a593Smuzhiyun #define RK_CRYPTO_AES_IV_1		0x00ac
113*4882a593Smuzhiyun #define RK_CRYPTO_AES_IV_2		0x00b0
114*4882a593Smuzhiyun #define RK_CRYPTO_AES_IV_3		0x00b4
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun /* AES Key Data 0-3 Register */
117*4882a593Smuzhiyun #define RK_CRYPTO_AES_KEY_0		0x00b8
118*4882a593Smuzhiyun #define RK_CRYPTO_AES_KEY_1		0x00bc
119*4882a593Smuzhiyun #define RK_CRYPTO_AES_KEY_2		0x00c0
120*4882a593Smuzhiyun #define RK_CRYPTO_AES_KEY_3		0x00c4
121*4882a593Smuzhiyun #define RK_CRYPTO_AES_KEY_4		0x00c8
122*4882a593Smuzhiyun #define RK_CRYPTO_AES_KEY_5		0x00cc
123*4882a593Smuzhiyun #define RK_CRYPTO_AES_KEY_6		0x00d0
124*4882a593Smuzhiyun #define RK_CRYPTO_AES_KEY_7		0x00d4
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun /* des/tdes */
127*4882a593Smuzhiyun #define RK_CRYPTO_TDES_CTRL		0x0100
128*4882a593Smuzhiyun #define RK_CRYPTO_TDES_BYTESWAP_KEY	BIT(8)
129*4882a593Smuzhiyun #define RK_CRYPTO_TDES_BYTESWAP_IV	BIT(7)
130*4882a593Smuzhiyun #define RK_CRYPTO_TDES_BYTESWAP_DO	BIT(6)
131*4882a593Smuzhiyun #define RK_CRYPTO_TDES_BYTESWAP_DI	BIT(5)
132*4882a593Smuzhiyun /* 0: ECB, 1: CBC */
133*4882a593Smuzhiyun #define RK_CRYPTO_TDES_CHAINMODE_CBC	BIT(4)
134*4882a593Smuzhiyun /* TDES Key Mode, 0 : EDE, 1 : EEE */
135*4882a593Smuzhiyun #define RK_CRYPTO_TDES_EEE		BIT(3)
136*4882a593Smuzhiyun /* 0: DES, 1:TDES */
137*4882a593Smuzhiyun #define RK_CRYPTO_TDES_SELECT		BIT(2)
138*4882a593Smuzhiyun /* 0: Slave, 1:Fifo */
139*4882a593Smuzhiyun #define RK_CRYPTO_TDES_FIFO_MODE	BIT(1)
140*4882a593Smuzhiyun /* Encryption = 0 , Decryption = 1 */
141*4882a593Smuzhiyun #define RK_CRYPTO_TDES_DEC		BIT(0)
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun #define RK_CRYPTO_TDES_STS		0x0104
144*4882a593Smuzhiyun #define RK_CRYPTO_TDES_DONE		BIT(0)
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun #define RK_CRYPTO_TDES_DIN_0		0x0108
147*4882a593Smuzhiyun #define RK_CRYPTO_TDES_DIN_1		0x010c
148*4882a593Smuzhiyun #define RK_CRYPTO_TDES_DOUT_0		0x0110
149*4882a593Smuzhiyun #define RK_CRYPTO_TDES_DOUT_1		0x0114
150*4882a593Smuzhiyun #define RK_CRYPTO_TDES_IV_0		0x0118
151*4882a593Smuzhiyun #define RK_CRYPTO_TDES_IV_1		0x011c
152*4882a593Smuzhiyun #define RK_CRYPTO_TDES_KEY1_0		0x0120
153*4882a593Smuzhiyun #define RK_CRYPTO_TDES_KEY1_1		0x0124
154*4882a593Smuzhiyun #define RK_CRYPTO_TDES_KEY2_0		0x0128
155*4882a593Smuzhiyun #define RK_CRYPTO_TDES_KEY2_1		0x012c
156*4882a593Smuzhiyun #define RK_CRYPTO_TDES_KEY3_0		0x0130
157*4882a593Smuzhiyun #define RK_CRYPTO_TDES_KEY3_1		0x0134
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun /* HASH */
160*4882a593Smuzhiyun #define RK_CRYPTO_HASH_CTRL		0x0180
161*4882a593Smuzhiyun #define RK_CRYPTO_HASH_SWAP_DO		BIT(3)
162*4882a593Smuzhiyun #define RK_CRYPTO_HASH_SWAP_DI		BIT(2)
163*4882a593Smuzhiyun #define RK_CRYPTO_HASH_SHA1		_SBF(0x00, 0)
164*4882a593Smuzhiyun #define RK_CRYPTO_HASH_MD5		_SBF(0x01, 0)
165*4882a593Smuzhiyun #define RK_CRYPTO_HASH_SHA256		_SBF(0x02, 0)
166*4882a593Smuzhiyun #define RK_CRYPTO_HASH_PRNG		_SBF(0x03, 0)
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun #define RK_CRYPTO_HASH_STS		0x0184
169*4882a593Smuzhiyun #define RK_CRYPTO_HASH_DONE		BIT(0)
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun #define RK_CRYPTO_HASH_MSG_LEN		0x0188
172*4882a593Smuzhiyun #define RK_CRYPTO_HASH_DOUT_0		0x018c
173*4882a593Smuzhiyun #define RK_CRYPTO_HASH_DOUT_1		0x0190
174*4882a593Smuzhiyun #define RK_CRYPTO_HASH_DOUT_2		0x0194
175*4882a593Smuzhiyun #define RK_CRYPTO_HASH_DOUT_3		0x0198
176*4882a593Smuzhiyun #define RK_CRYPTO_HASH_DOUT_4		0x019c
177*4882a593Smuzhiyun #define RK_CRYPTO_HASH_DOUT_5		0x01a0
178*4882a593Smuzhiyun #define RK_CRYPTO_HASH_DOUT_6		0x01a4
179*4882a593Smuzhiyun #define RK_CRYPTO_HASH_DOUT_7		0x01a8
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun #define CRYPTO_READ(dev, offset)		  \
182*4882a593Smuzhiyun 		readl_relaxed(((dev)->reg + (offset)))
183*4882a593Smuzhiyun #define CRYPTO_WRITE(dev, offset, val)	  \
184*4882a593Smuzhiyun 		writel_relaxed((val), ((dev)->reg + (offset)))
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun struct rk_crypto_info {
187*4882a593Smuzhiyun 	struct device			*dev;
188*4882a593Smuzhiyun 	struct clk			*aclk;
189*4882a593Smuzhiyun 	struct clk			*hclk;
190*4882a593Smuzhiyun 	struct clk			*sclk;
191*4882a593Smuzhiyun 	struct clk			*dmaclk;
192*4882a593Smuzhiyun 	struct reset_control		*rst;
193*4882a593Smuzhiyun 	void __iomem			*reg;
194*4882a593Smuzhiyun 	int				irq;
195*4882a593Smuzhiyun 	struct crypto_queue		queue;
196*4882a593Smuzhiyun 	struct tasklet_struct		queue_task;
197*4882a593Smuzhiyun 	struct tasklet_struct		done_task;
198*4882a593Smuzhiyun 	struct crypto_async_request	*async_req;
199*4882a593Smuzhiyun 	int 				err;
200*4882a593Smuzhiyun 	/* device lock */
201*4882a593Smuzhiyun 	spinlock_t			lock;
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun 	/* the public variable */
204*4882a593Smuzhiyun 	struct scatterlist		*sg_src;
205*4882a593Smuzhiyun 	struct scatterlist		*sg_dst;
206*4882a593Smuzhiyun 	struct scatterlist		sg_tmp;
207*4882a593Smuzhiyun 	struct scatterlist		*first;
208*4882a593Smuzhiyun 	unsigned int			left_bytes;
209*4882a593Smuzhiyun 	void				*addr_vir;
210*4882a593Smuzhiyun 	int				aligned;
211*4882a593Smuzhiyun 	int				align_size;
212*4882a593Smuzhiyun 	size_t				src_nents;
213*4882a593Smuzhiyun 	size_t				dst_nents;
214*4882a593Smuzhiyun 	unsigned int			total;
215*4882a593Smuzhiyun 	unsigned int			count;
216*4882a593Smuzhiyun 	dma_addr_t			addr_in;
217*4882a593Smuzhiyun 	dma_addr_t			addr_out;
218*4882a593Smuzhiyun 	bool				busy;
219*4882a593Smuzhiyun 	int (*start)(struct rk_crypto_info *dev);
220*4882a593Smuzhiyun 	int (*update)(struct rk_crypto_info *dev);
221*4882a593Smuzhiyun 	void (*complete)(struct crypto_async_request *base, int err);
222*4882a593Smuzhiyun 	int (*enable_clk)(struct rk_crypto_info *dev);
223*4882a593Smuzhiyun 	void (*disable_clk)(struct rk_crypto_info *dev);
224*4882a593Smuzhiyun 	int (*load_data)(struct rk_crypto_info *dev,
225*4882a593Smuzhiyun 			 struct scatterlist *sg_src,
226*4882a593Smuzhiyun 			 struct scatterlist *sg_dst);
227*4882a593Smuzhiyun 	void (*unload_data)(struct rk_crypto_info *dev);
228*4882a593Smuzhiyun 	int (*enqueue)(struct rk_crypto_info *dev,
229*4882a593Smuzhiyun 		       struct crypto_async_request *async_req);
230*4882a593Smuzhiyun };
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun /* the private variable of hash */
233*4882a593Smuzhiyun struct rk_ahash_ctx {
234*4882a593Smuzhiyun 	struct rk_crypto_info		*dev;
235*4882a593Smuzhiyun 	/* for fallback */
236*4882a593Smuzhiyun 	struct crypto_ahash		*fallback_tfm;
237*4882a593Smuzhiyun };
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun /* the privete variable of hash for fallback */
240*4882a593Smuzhiyun struct rk_ahash_rctx {
241*4882a593Smuzhiyun 	struct ahash_request		fallback_req;
242*4882a593Smuzhiyun 	u32				mode;
243*4882a593Smuzhiyun };
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun /* the private variable of cipher */
246*4882a593Smuzhiyun struct rk_cipher_ctx {
247*4882a593Smuzhiyun 	struct rk_crypto_info		*dev;
248*4882a593Smuzhiyun 	unsigned int			keylen;
249*4882a593Smuzhiyun 	u32				mode;
250*4882a593Smuzhiyun 	u8				iv[AES_BLOCK_SIZE];
251*4882a593Smuzhiyun };
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun enum alg_type {
254*4882a593Smuzhiyun 	ALG_TYPE_HASH,
255*4882a593Smuzhiyun 	ALG_TYPE_CIPHER,
256*4882a593Smuzhiyun };
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun struct rk_crypto_tmp {
259*4882a593Smuzhiyun 	struct rk_crypto_info		*dev;
260*4882a593Smuzhiyun 	union {
261*4882a593Smuzhiyun 		struct skcipher_alg	skcipher;
262*4882a593Smuzhiyun 		struct ahash_alg	hash;
263*4882a593Smuzhiyun 	} alg;
264*4882a593Smuzhiyun 	enum alg_type			type;
265*4882a593Smuzhiyun };
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun extern struct rk_crypto_tmp rk_ecb_aes_alg;
268*4882a593Smuzhiyun extern struct rk_crypto_tmp rk_cbc_aes_alg;
269*4882a593Smuzhiyun extern struct rk_crypto_tmp rk_ecb_des_alg;
270*4882a593Smuzhiyun extern struct rk_crypto_tmp rk_cbc_des_alg;
271*4882a593Smuzhiyun extern struct rk_crypto_tmp rk_ecb_des3_ede_alg;
272*4882a593Smuzhiyun extern struct rk_crypto_tmp rk_cbc_des3_ede_alg;
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun extern struct rk_crypto_tmp rk_ahash_sha1;
275*4882a593Smuzhiyun extern struct rk_crypto_tmp rk_ahash_sha256;
276*4882a593Smuzhiyun extern struct rk_crypto_tmp rk_ahash_md5;
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun #endif
279