1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __STARFIVE_STR_H__
3#define __STARFIVE_STR_H__
4
5#include <crypto/aes.h>
6#include <crypto/hash.h>
7#include <crypto/scatterwalk.h>
8#include <crypto/sha2.h>
9#include <crypto/sm3.h>
10#include <linux/delay.h>
11#include <linux/dma-mapping.h>
12#include <linux/dmaengine.h>
13#include <linux/interrupt.h>
14
15#define STARFIVE_ALG_CR_OFFSET			0x0
16#define STARFIVE_ALG_FIFO_OFFSET		0x4
17#define STARFIVE_IE_MASK_OFFSET			0x8
18#define STARFIVE_IE_FLAG_OFFSET			0xc
19#define STARFIVE_DMA_IN_LEN_OFFSET		0x10
20#define STARFIVE_DMA_OUT_LEN_OFFSET		0x14
21
22#define STARFIVE_IE_MASK_AES_DONE		0x1
23#define STARFIVE_IE_MASK_HASH_DONE		0x4
24#define STARFIVE_IE_MASK_PKA_DONE		0x8
25#define STARFIVE_IE_FLAG_AES_DONE		0x1
26#define STARFIVE_IE_FLAG_HASH_DONE		0x4
27#define STARFIVE_IE_FLAG_PKA_DONE		0x8
28
29#define STARFIVE_MSG_BUFFER_SIZE		SZ_16K
30#define MAX_KEY_SIZE				SHA512_BLOCK_SIZE
31#define STARFIVE_AES_IV_LEN			AES_BLOCK_SIZE
32#define STARFIVE_AES_CTR_LEN			AES_BLOCK_SIZE
33
34union starfive_aes_csr {
35	u32 v;
36	struct {
37		u32 cmode			:1;
38#define STARFIVE_AES_KEYMODE_128		0x0
39#define STARFIVE_AES_KEYMODE_192		0x1
40#define STARFIVE_AES_KEYMODE_256		0x2
41		u32 keymode			:2;
42#define STARFIVE_AES_BUSY			BIT(3)
43		u32 busy			:1;
44		u32 done			:1;
45#define STARFIVE_AES_KEY_DONE			BIT(5)
46		u32 krdy			:1;
47		u32 aesrst			:1;
48		u32 ie				:1;
49#define STARFIVE_AES_CCM_START			BIT(8)
50		u32 ccm_start			:1;
51#define STARFIVE_AES_MODE_ECB			0x0
52#define STARFIVE_AES_MODE_CBC			0x1
53#define STARFIVE_AES_MODE_CFB			0x2
54#define STARFIVE_AES_MODE_OFB			0x3
55#define STARFIVE_AES_MODE_CTR			0x4
56#define STARFIVE_AES_MODE_CCM			0x5
57#define STARFIVE_AES_MODE_GCM			0x6
58		u32 mode			:3;
59#define STARFIVE_AES_GCM_START			BIT(12)
60		u32 gcm_start			:1;
61#define STARFIVE_AES_GCM_DONE			BIT(13)
62		u32 gcm_done			:1;
63		u32 delay_aes			:1;
64		u32 vaes_start			:1;
65		u32 rsvd_0			:8;
66#define STARFIVE_AES_MODE_XFB_1			0x0
67#define STARFIVE_AES_MODE_XFB_128		0x5
68		u32 stmode			:3;
69		u32 rsvd_1			:5;
70	};
71};
72
73union starfive_hash_csr {
74	u32 v;
75	struct {
76		u32 start			:1;
77		u32 reset			:1;
78		u32 ie				:1;
79		u32 firstb			:1;
80#define STARFIVE_HASH_SM3			0x0
81#define STARFIVE_HASH_SHA224			0x3
82#define STARFIVE_HASH_SHA256			0x4
83#define STARFIVE_HASH_SHA384			0x5
84#define STARFIVE_HASH_SHA512			0x6
85#define STARFIVE_HASH_MODE_MASK			0x7
86		u32 mode			:3;
87		u32 rsvd_1			:1;
88		u32 final			:1;
89		u32 rsvd_2			:2;
90#define STARFIVE_HASH_HMAC_FLAGS		0x800
91		u32 hmac			:1;
92		u32 rsvd_3			:1;
93#define STARFIVE_HASH_KEY_DONE			BIT(13)
94		u32 key_done			:1;
95		u32 key_flag			:1;
96		u32 hmac_done			:1;
97#define STARFIVE_HASH_BUSY			BIT(16)
98		u32 busy			:1;
99		u32 hashdone			:1;
100		u32 rsvd_4			:14;
101	};
102};
103
104union starfive_pka_cacr {
105	u32 v;
106	struct {
107		u32 start			:1;
108		u32 reset			:1;
109		u32 ie				:1;
110		u32 rsvd_0			:1;
111		u32 fifo_mode			:1;
112		u32 not_r2			:1;
113		u32 ecc_sub			:1;
114		u32 pre_expf			:1;
115		u32 cmd				:4;
116		u32 rsvd_1			:1;
117		u32 ctrl_dummy			:1;
118		u32 ctrl_false			:1;
119		u32 cln_done			:1;
120		u32 opsize			:6;
121		u32 rsvd_2			:2;
122		u32 exposize			:6;
123		u32 rsvd_3			:1;
124		u32 bigendian			:1;
125	};
126};
127
128struct starfive_rsa_key {
129	u8	*n;
130	u8	*e;
131	u8	*d;
132	int	e_bitlen;
133	int	d_bitlen;
134	int	bitlen;
135	size_t	key_sz;
136};
137
138union starfive_alg_cr {
139	u32 v;
140	struct {
141		u32 start			:1;
142		u32 aes_dma_en			:1;
143		u32 rsvd_0			:1;
144		u32 hash_dma_en			:1;
145		u32 alg_done			:1;
146		u32 rsvd_1			:3;
147		u32 clear			:1;
148		u32 rsvd_2			:23;
149	};
150};
151
152struct starfive_cryp_ctx {
153	struct starfive_cryp_dev		*cryp;
154	struct starfive_cryp_request_ctx	*rctx;
155
156	unsigned int				hash_mode;
157	u8					key[MAX_KEY_SIZE];
158	int					keylen;
159	bool					is_hmac;
160	struct starfive_rsa_key			rsa_key;
161	struct crypto_akcipher			*akcipher_fbk;
162	struct crypto_ahash			*ahash_fbk;
163	struct crypto_aead			*aead_fbk;
164};
165
166struct starfive_cryp_dev {
167	struct list_head			list;
168	struct device				*dev;
169	struct clk				*hclk;
170	struct clk				*ahb;
171	struct reset_control			*rst;
172
173	void __iomem				*base;
174	phys_addr_t				phys_base;
175
176	u32					dma_maxburst;
177	struct dma_chan				*tx;
178	struct dma_chan				*rx;
179	struct dma_slave_config			cfg_in;
180	struct dma_slave_config			cfg_out;
181	struct scatter_walk			in_walk;
182	struct scatter_walk			out_walk;
183	struct crypto_engine			*engine;
184	struct tasklet_struct			aes_done;
185	struct tasklet_struct			hash_done;
186	struct completion			pka_done;
187	size_t					assoclen;
188	size_t					total_in;
189	size_t					total_out;
190	u32					tag_in[4];
191	u32					tag_out[4];
192	unsigned int				authsize;
193	unsigned long				flags;
194	int					err;
195	bool					side_chan;
196	union starfive_alg_cr			alg_cr;
197	union {
198		struct ahash_request		*hreq;
199		struct aead_request		*areq;
200		struct skcipher_request		*sreq;
201	} req;
202};
203
204struct starfive_cryp_request_ctx {
205	union {
206		union starfive_hash_csr		hash;
207		union starfive_pka_cacr		pka;
208		union starfive_aes_csr		aes;
209	} csr;
210
211	struct scatterlist			*in_sg;
212	struct scatterlist			*out_sg;
213	struct ahash_request			ahash_fbk_req;
214	size_t					total;
215	size_t					nents;
216	unsigned int				blksize;
217	unsigned int				digsize;
218	unsigned long				in_sg_len;
219	unsigned char				*adata;
220	u8 rsa_data[] __aligned(sizeof(u32));
221};
222
223struct starfive_cryp_dev *starfive_cryp_find_dev(struct starfive_cryp_ctx *ctx);
224
225int starfive_hash_register_algs(void);
226void starfive_hash_unregister_algs(void);
227
228int starfive_rsa_register_algs(void);
229void starfive_rsa_unregister_algs(void);
230
231int starfive_aes_register_algs(void);
232void starfive_aes_unregister_algs(void);
233
234void starfive_hash_done_task(unsigned long param);
235void starfive_aes_done_task(unsigned long param);
236#endif
237