1433cd2c6SZain Wang #ifndef __RK3288_CRYPTO_H__
2433cd2c6SZain Wang #define __RK3288_CRYPTO_H__
3433cd2c6SZain Wang 
4433cd2c6SZain Wang #include <crypto/aes.h>
5433cd2c6SZain Wang #include <crypto/des.h>
6433cd2c6SZain Wang #include <crypto/algapi.h>
7433cd2c6SZain Wang #include <linux/interrupt.h>
8433cd2c6SZain Wang #include <linux/delay.h>
9433cd2c6SZain Wang 
10433cd2c6SZain Wang #define _SBF(v, f)			((v) << (f))
11433cd2c6SZain Wang 
12433cd2c6SZain Wang /* Crypto control registers*/
13433cd2c6SZain Wang #define RK_CRYPTO_INTSTS		0x0000
14433cd2c6SZain Wang #define RK_CRYPTO_PKA_DONE_INT		BIT(5)
15433cd2c6SZain Wang #define RK_CRYPTO_HASH_DONE_INT		BIT(4)
16433cd2c6SZain Wang #define RK_CRYPTO_HRDMA_ERR_INT		BIT(3)
17433cd2c6SZain Wang #define RK_CRYPTO_HRDMA_DONE_INT	BIT(2)
18433cd2c6SZain Wang #define RK_CRYPTO_BCDMA_ERR_INT		BIT(1)
19433cd2c6SZain Wang #define RK_CRYPTO_BCDMA_DONE_INT	BIT(0)
20433cd2c6SZain Wang 
21433cd2c6SZain Wang #define RK_CRYPTO_INTENA		0x0004
22433cd2c6SZain Wang #define RK_CRYPTO_PKA_DONE_ENA		BIT(5)
23433cd2c6SZain Wang #define RK_CRYPTO_HASH_DONE_ENA		BIT(4)
24433cd2c6SZain Wang #define RK_CRYPTO_HRDMA_ERR_ENA		BIT(3)
25433cd2c6SZain Wang #define RK_CRYPTO_HRDMA_DONE_ENA	BIT(2)
26433cd2c6SZain Wang #define RK_CRYPTO_BCDMA_ERR_ENA		BIT(1)
27433cd2c6SZain Wang #define RK_CRYPTO_BCDMA_DONE_ENA	BIT(0)
28433cd2c6SZain Wang 
29433cd2c6SZain Wang #define RK_CRYPTO_CTRL			0x0008
30433cd2c6SZain Wang #define RK_CRYPTO_WRITE_MASK		_SBF(0xFFFF, 16)
31433cd2c6SZain Wang #define RK_CRYPTO_TRNG_FLUSH		BIT(9)
32433cd2c6SZain Wang #define RK_CRYPTO_TRNG_START		BIT(8)
33433cd2c6SZain Wang #define RK_CRYPTO_PKA_FLUSH		BIT(7)
34433cd2c6SZain Wang #define RK_CRYPTO_HASH_FLUSH		BIT(6)
35433cd2c6SZain Wang #define RK_CRYPTO_BLOCK_FLUSH		BIT(5)
36433cd2c6SZain Wang #define RK_CRYPTO_PKA_START		BIT(4)
37433cd2c6SZain Wang #define RK_CRYPTO_HASH_START		BIT(3)
38433cd2c6SZain Wang #define RK_CRYPTO_BLOCK_START		BIT(2)
39433cd2c6SZain Wang #define RK_CRYPTO_TDES_START		BIT(1)
40433cd2c6SZain Wang #define RK_CRYPTO_AES_START		BIT(0)
41433cd2c6SZain Wang 
42433cd2c6SZain Wang #define RK_CRYPTO_CONF			0x000c
43433cd2c6SZain Wang /* HASH Receive DMA Address Mode:   fix | increment */
44433cd2c6SZain Wang #define RK_CRYPTO_HR_ADDR_MODE		BIT(8)
45433cd2c6SZain Wang /* Block Transmit DMA Address Mode: fix | increment */
46433cd2c6SZain Wang #define RK_CRYPTO_BT_ADDR_MODE		BIT(7)
47433cd2c6SZain Wang /* Block Receive DMA Address Mode:  fix | increment */
48433cd2c6SZain Wang #define RK_CRYPTO_BR_ADDR_MODE		BIT(6)
49433cd2c6SZain Wang #define RK_CRYPTO_BYTESWAP_HRFIFO	BIT(5)
50433cd2c6SZain Wang #define RK_CRYPTO_BYTESWAP_BTFIFO	BIT(4)
51433cd2c6SZain Wang #define RK_CRYPTO_BYTESWAP_BRFIFO	BIT(3)
52433cd2c6SZain Wang /* AES = 0 OR DES = 1 */
53433cd2c6SZain Wang #define RK_CRYPTO_DESSEL				BIT(2)
54433cd2c6SZain Wang #define RK_CYYPTO_HASHINSEL_INDEPENDENT_SOURCE		_SBF(0x00, 0)
55433cd2c6SZain Wang #define RK_CYYPTO_HASHINSEL_BLOCK_CIPHER_INPUT		_SBF(0x01, 0)
56433cd2c6SZain Wang #define RK_CYYPTO_HASHINSEL_BLOCK_CIPHER_OUTPUT		_SBF(0x02, 0)
57433cd2c6SZain Wang 
58433cd2c6SZain Wang /* Block Receiving DMA Start Address Register */
59433cd2c6SZain Wang #define RK_CRYPTO_BRDMAS		0x0010
60433cd2c6SZain Wang /* Block Transmitting DMA Start Address Register */
61433cd2c6SZain Wang #define RK_CRYPTO_BTDMAS		0x0014
62433cd2c6SZain Wang /* Block Receiving DMA Length Register */
63433cd2c6SZain Wang #define RK_CRYPTO_BRDMAL		0x0018
64433cd2c6SZain Wang /* Hash Receiving DMA Start Address Register */
65433cd2c6SZain Wang #define RK_CRYPTO_HRDMAS		0x001c
66433cd2c6SZain Wang /* Hash Receiving DMA Length Register */
67433cd2c6SZain Wang #define RK_CRYPTO_HRDMAL		0x0020
68433cd2c6SZain Wang 
69433cd2c6SZain Wang /* AES registers */
70433cd2c6SZain Wang #define RK_CRYPTO_AES_CTRL			  0x0080
71433cd2c6SZain Wang #define RK_CRYPTO_AES_BYTESWAP_CNT	BIT(11)
72433cd2c6SZain Wang #define RK_CRYPTO_AES_BYTESWAP_KEY	BIT(10)
73433cd2c6SZain Wang #define RK_CRYPTO_AES_BYTESWAP_IV	BIT(9)
74433cd2c6SZain Wang #define RK_CRYPTO_AES_BYTESWAP_DO	BIT(8)
75433cd2c6SZain Wang #define RK_CRYPTO_AES_BYTESWAP_DI	BIT(7)
76433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_CHANGE	BIT(6)
77433cd2c6SZain Wang #define RK_CRYPTO_AES_ECB_MODE		_SBF(0x00, 4)
78433cd2c6SZain Wang #define RK_CRYPTO_AES_CBC_MODE		_SBF(0x01, 4)
79433cd2c6SZain Wang #define RK_CRYPTO_AES_CTR_MODE		_SBF(0x02, 4)
80433cd2c6SZain Wang #define RK_CRYPTO_AES_128BIT_key	_SBF(0x00, 2)
81433cd2c6SZain Wang #define RK_CRYPTO_AES_192BIT_key	_SBF(0x01, 2)
82433cd2c6SZain Wang #define RK_CRYPTO_AES_256BIT_key	_SBF(0x02, 2)
83433cd2c6SZain Wang /* Slave = 0 / fifo = 1 */
84433cd2c6SZain Wang #define RK_CRYPTO_AES_FIFO_MODE		BIT(1)
85433cd2c6SZain Wang /* Encryption = 0 , Decryption = 1 */
86433cd2c6SZain Wang #define RK_CRYPTO_AES_DEC		BIT(0)
87433cd2c6SZain Wang 
88433cd2c6SZain Wang #define RK_CRYPTO_AES_STS		0x0084
89433cd2c6SZain Wang #define RK_CRYPTO_AES_DONE		BIT(0)
90433cd2c6SZain Wang 
91433cd2c6SZain Wang /* AES Input Data 0-3 Register */
92433cd2c6SZain Wang #define RK_CRYPTO_AES_DIN_0		0x0088
93433cd2c6SZain Wang #define RK_CRYPTO_AES_DIN_1		0x008c
94433cd2c6SZain Wang #define RK_CRYPTO_AES_DIN_2		0x0090
95433cd2c6SZain Wang #define RK_CRYPTO_AES_DIN_3		0x0094
96433cd2c6SZain Wang 
97433cd2c6SZain Wang /* AES output Data 0-3 Register */
98433cd2c6SZain Wang #define RK_CRYPTO_AES_DOUT_0		0x0098
99433cd2c6SZain Wang #define RK_CRYPTO_AES_DOUT_1		0x009c
100433cd2c6SZain Wang #define RK_CRYPTO_AES_DOUT_2		0x00a0
101433cd2c6SZain Wang #define RK_CRYPTO_AES_DOUT_3		0x00a4
102433cd2c6SZain Wang 
103433cd2c6SZain Wang /* AES IV Data 0-3 Register */
104433cd2c6SZain Wang #define RK_CRYPTO_AES_IV_0		0x00a8
105433cd2c6SZain Wang #define RK_CRYPTO_AES_IV_1		0x00ac
106433cd2c6SZain Wang #define RK_CRYPTO_AES_IV_2		0x00b0
107433cd2c6SZain Wang #define RK_CRYPTO_AES_IV_3		0x00b4
108433cd2c6SZain Wang 
109433cd2c6SZain Wang /* AES Key Data 0-3 Register */
110433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_0		0x00b8
111433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_1		0x00bc
112433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_2		0x00c0
113433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_3		0x00c4
114433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_4		0x00c8
115433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_5		0x00cc
116433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_6		0x00d0
117433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_7		0x00d4
118433cd2c6SZain Wang 
119433cd2c6SZain Wang /* des/tdes */
120433cd2c6SZain Wang #define RK_CRYPTO_TDES_CTRL		0x0100
121433cd2c6SZain Wang #define RK_CRYPTO_TDES_BYTESWAP_KEY	BIT(8)
122433cd2c6SZain Wang #define RK_CRYPTO_TDES_BYTESWAP_IV	BIT(7)
123433cd2c6SZain Wang #define RK_CRYPTO_TDES_BYTESWAP_DO	BIT(6)
124433cd2c6SZain Wang #define RK_CRYPTO_TDES_BYTESWAP_DI	BIT(5)
125433cd2c6SZain Wang /* 0: ECB, 1: CBC */
126433cd2c6SZain Wang #define RK_CRYPTO_TDES_CHAINMODE_CBC	BIT(4)
127433cd2c6SZain Wang /* TDES Key Mode, 0 : EDE, 1 : EEE */
128433cd2c6SZain Wang #define RK_CRYPTO_TDES_EEE		BIT(3)
129433cd2c6SZain Wang /* 0: DES, 1:TDES */
130433cd2c6SZain Wang #define RK_CRYPTO_TDES_SELECT		BIT(2)
131433cd2c6SZain Wang /* 0: Slave, 1:Fifo */
132433cd2c6SZain Wang #define RK_CRYPTO_TDES_FIFO_MODE	BIT(1)
133433cd2c6SZain Wang /* Encryption = 0 , Decryption = 1 */
134433cd2c6SZain Wang #define RK_CRYPTO_TDES_DEC		BIT(0)
135433cd2c6SZain Wang 
136433cd2c6SZain Wang #define RK_CRYPTO_TDES_STS		0x0104
137433cd2c6SZain Wang #define RK_CRYPTO_TDES_DONE		BIT(0)
138433cd2c6SZain Wang 
139433cd2c6SZain Wang #define RK_CRYPTO_TDES_DIN_0		0x0108
140433cd2c6SZain Wang #define RK_CRYPTO_TDES_DIN_1		0x010c
141433cd2c6SZain Wang #define RK_CRYPTO_TDES_DOUT_0		0x0110
142433cd2c6SZain Wang #define RK_CRYPTO_TDES_DOUT_1		0x0114
143433cd2c6SZain Wang #define RK_CRYPTO_TDES_IV_0		0x0118
144433cd2c6SZain Wang #define RK_CRYPTO_TDES_IV_1		0x011c
145433cd2c6SZain Wang #define RK_CRYPTO_TDES_KEY1_0		0x0120
146433cd2c6SZain Wang #define RK_CRYPTO_TDES_KEY1_1		0x0124
147433cd2c6SZain Wang #define RK_CRYPTO_TDES_KEY2_0		0x0128
148433cd2c6SZain Wang #define RK_CRYPTO_TDES_KEY2_1		0x012c
149433cd2c6SZain Wang #define RK_CRYPTO_TDES_KEY3_0		0x0130
150433cd2c6SZain Wang #define RK_CRYPTO_TDES_KEY3_1		0x0134
151433cd2c6SZain Wang 
152433cd2c6SZain Wang #define CRYPTO_READ(dev, offset)		  \
153433cd2c6SZain Wang 		readl_relaxed(((dev)->reg + (offset)))
154433cd2c6SZain Wang #define CRYPTO_WRITE(dev, offset, val)	  \
155433cd2c6SZain Wang 		writel_relaxed((val), ((dev)->reg + (offset)))
156433cd2c6SZain Wang 
157433cd2c6SZain Wang struct rk_crypto_info {
158433cd2c6SZain Wang 	struct device			*dev;
159433cd2c6SZain Wang 	struct clk			*aclk;
160433cd2c6SZain Wang 	struct clk			*hclk;
161433cd2c6SZain Wang 	struct clk			*sclk;
162433cd2c6SZain Wang 	struct clk			*dmaclk;
163433cd2c6SZain Wang 	struct reset_control		*rst;
164433cd2c6SZain Wang 	void __iomem			*reg;
165433cd2c6SZain Wang 	int				irq;
166433cd2c6SZain Wang 	struct crypto_queue		queue;
167433cd2c6SZain Wang 	struct tasklet_struct		crypto_tasklet;
168433cd2c6SZain Wang 	struct ablkcipher_request	*ablk_req;
169433cd2c6SZain Wang 	/* device lock */
170433cd2c6SZain Wang 	spinlock_t			lock;
171433cd2c6SZain Wang 
172433cd2c6SZain Wang 	/* the public variable */
173433cd2c6SZain Wang 	struct scatterlist		*sg_src;
174433cd2c6SZain Wang 	struct scatterlist		*sg_dst;
175433cd2c6SZain Wang 	struct scatterlist		sg_tmp;
176433cd2c6SZain Wang 	struct scatterlist		*first;
177433cd2c6SZain Wang 	unsigned int			left_bytes;
178433cd2c6SZain Wang 	void				*addr_vir;
179433cd2c6SZain Wang 	int				aligned;
180433cd2c6SZain Wang 	int				align_size;
181433cd2c6SZain Wang 	size_t				nents;
182433cd2c6SZain Wang 	unsigned int			total;
183433cd2c6SZain Wang 	unsigned int			count;
184433cd2c6SZain Wang 	u32				mode;
185433cd2c6SZain Wang 	dma_addr_t			addr_in;
186433cd2c6SZain Wang 	dma_addr_t			addr_out;
187433cd2c6SZain Wang 	int (*start)(struct rk_crypto_info *dev);
188433cd2c6SZain Wang 	int (*update)(struct rk_crypto_info *dev);
189433cd2c6SZain Wang 	void (*complete)(struct rk_crypto_info *dev, int err);
190433cd2c6SZain Wang 	int (*enable_clk)(struct rk_crypto_info *dev);
191433cd2c6SZain Wang 	void (*disable_clk)(struct rk_crypto_info *dev);
192433cd2c6SZain Wang 	int (*load_data)(struct rk_crypto_info *dev,
193433cd2c6SZain Wang 			 struct scatterlist *sg_src,
194433cd2c6SZain Wang 			 struct scatterlist *sg_dst);
195433cd2c6SZain Wang 	void (*unload_data)(struct rk_crypto_info *dev);
196433cd2c6SZain Wang };
197433cd2c6SZain Wang 
198433cd2c6SZain Wang /* the private variable of cipher */
199433cd2c6SZain Wang struct rk_cipher_ctx {
200433cd2c6SZain Wang 	struct rk_crypto_info		*dev;
201433cd2c6SZain Wang 	unsigned int			keylen;
202433cd2c6SZain Wang };
203433cd2c6SZain Wang 
204433cd2c6SZain Wang struct rk_crypto_tmp {
205433cd2c6SZain Wang 	struct rk_crypto_info *dev;
206433cd2c6SZain Wang 	struct crypto_alg alg;
207433cd2c6SZain Wang };
208433cd2c6SZain Wang 
209433cd2c6SZain Wang extern struct rk_crypto_tmp rk_ecb_aes_alg;
210433cd2c6SZain Wang extern struct rk_crypto_tmp rk_cbc_aes_alg;
211433cd2c6SZain Wang extern struct rk_crypto_tmp rk_ecb_des_alg;
212433cd2c6SZain Wang extern struct rk_crypto_tmp rk_cbc_des_alg;
213433cd2c6SZain Wang extern struct rk_crypto_tmp rk_ecb_des3_ede_alg;
214433cd2c6SZain Wang extern struct rk_crypto_tmp rk_cbc_des3_ede_alg;
215433cd2c6SZain Wang 
216433cd2c6SZain Wang #endif
217