File Index
Files and directories
Sign in
FILE

jh7110-cryp.h

File preview with syntax highlighting.

linux-6.19.14/drivers/crypto/starfive/jh7110-cryp.h C
  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#define STARFIVE_RSA_MAX_KEYSZ			256
 34
 35union starfive_aes_csr {
 36	u32 v;
 37	struct {
 38		u32 cmode			:1;
 39#define STARFIVE_AES_KEYMODE_128		0x0
 40#define STARFIVE_AES_KEYMODE_192		0x1
 41#define STARFIVE_AES_KEYMODE_256		0x2
 42		u32 keymode			:2;
 43#define STARFIVE_AES_BUSY			BIT(3)
 44		u32 busy			:1;
 45		u32 done			:1;
 46#define STARFIVE_AES_KEY_DONE			BIT(5)
 47		u32 krdy			:1;
 48		u32 aesrst			:1;
 49		u32 ie				:1;
 50#define STARFIVE_AES_CCM_START			BIT(8)
 51		u32 ccm_start			:1;
 52#define STARFIVE_AES_MODE_ECB			0x0
 53#define STARFIVE_AES_MODE_CBC			0x1
 54#define STARFIVE_AES_MODE_CTR			0x4
 55#define STARFIVE_AES_MODE_CCM			0x5
 56#define STARFIVE_AES_MODE_GCM			0x6
 57		u32 mode			:3;
 58#define STARFIVE_AES_GCM_START			BIT(12)
 59		u32 gcm_start			:1;
 60#define STARFIVE_AES_GCM_DONE			BIT(13)
 61		u32 gcm_done			:1;
 62		u32 delay_aes			:1;
 63		u32 vaes_start			:1;
 64		u32 rsvd_0			:8;
 65#define STARFIVE_AES_MODE_XFB_1			0x0
 66#define STARFIVE_AES_MODE_XFB_128		0x5
 67		u32 stmode			:3;
 68		u32 rsvd_1			:5;
 69	};
 70};
 71
 72union starfive_hash_csr {
 73	u32 v;
 74	struct {
 75		u32 start			:1;
 76		u32 reset			:1;
 77		u32 ie				:1;
 78		u32 firstb			:1;
 79#define STARFIVE_HASH_SM3			0x0
 80#define STARFIVE_HASH_SHA224			0x3
 81#define STARFIVE_HASH_SHA256			0x4
 82#define STARFIVE_HASH_SHA384			0x5
 83#define STARFIVE_HASH_SHA512			0x6
 84#define STARFIVE_HASH_MODE_MASK			0x7
 85		u32 mode			:3;
 86		u32 rsvd_1			:1;
 87		u32 final			:1;
 88		u32 rsvd_2			:2;
 89#define STARFIVE_HASH_HMAC_FLAGS		0x800
 90		u32 hmac			:1;
 91		u32 rsvd_3			:1;
 92#define STARFIVE_HASH_KEY_DONE			BIT(13)
 93		u32 key_done			:1;
 94		u32 key_flag			:1;
 95#define STARFIVE_HASH_HMAC_DONE			BIT(15)
 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
128union starfive_pka_casr {
129	u32 v;
130	struct {
131#define STARFIVE_PKA_DONE			BIT(0)
132		u32 done			:1;
133		u32 rsvd_0			:31;
134	};
135};
136
137struct starfive_rsa_key {
138	u8	*n;
139	u8	*e;
140	u8	*d;
141	int	e_bitlen;
142	int	d_bitlen;
143	int	bitlen;
144	size_t	key_sz;
145};
146
147union starfive_alg_cr {
148	u32 v;
149	struct {
150		u32 start			:1;
151		u32 aes_dma_en			:1;
152		u32 rsvd_0			:1;
153		u32 hash_dma_en			:1;
154		u32 alg_done			:1;
155		u32 rsvd_1			:3;
156		u32 clear			:1;
157		u32 rsvd_2			:23;
158	};
159};
160
161struct starfive_cryp_ctx {
162	struct starfive_cryp_dev		*cryp;
163	struct starfive_cryp_request_ctx	*rctx;
164
165	unsigned int				hash_mode;
166	u8					key[MAX_KEY_SIZE];
167	int					keylen;
168	bool					is_hmac;
169	struct starfive_rsa_key			rsa_key;
170	struct crypto_akcipher			*akcipher_fbk;
171	struct crypto_ahash			*ahash_fbk;
172	struct crypto_aead			*aead_fbk;
173	struct crypto_skcipher			*skcipher_fbk;
174};
175
176struct starfive_cryp_dev {
177	struct list_head			list;
178	struct device				*dev;
179	struct clk				*hclk;
180	struct clk				*ahb;
181	struct reset_control			*rst;
182
183	void __iomem				*base;
184	phys_addr_t				phys_base;
185
186	u32					dma_maxburst;
187	struct dma_chan				*tx;
188	struct dma_chan				*rx;
189	struct dma_slave_config			cfg_in;
190	struct dma_slave_config			cfg_out;
191	struct crypto_engine			*engine;
192	struct completion			dma_done;
193	size_t					assoclen;
194	size_t					total_in;
195	size_t					total_out;
196	u32					tag_in[4];
197	u32					tag_out[4];
198	unsigned int				authsize;
199	unsigned long				flags;
200	int					err;
201	bool					side_chan;
202	union starfive_alg_cr			alg_cr;
203	union {
204		struct ahash_request		*hreq;
205		struct aead_request		*areq;
206		struct skcipher_request		*sreq;
207	} req;
208};
209
210struct starfive_cryp_request_ctx {
211	union {
212		union starfive_hash_csr		hash;
213		union starfive_pka_cacr		pka;
214		union starfive_aes_csr		aes;
215	} csr;
216
217	struct scatterlist			*in_sg;
218	struct scatterlist			*out_sg;
219	struct ahash_request			ahash_fbk_req;
220	size_t					total;
221	unsigned int				blksize;
222	unsigned int				digsize;
223	unsigned long				in_sg_len;
224	unsigned char				*adata;
225	u8 rsa_data[STARFIVE_RSA_MAX_KEYSZ] __aligned(sizeof(u32));
226};
227
228struct starfive_cryp_dev *starfive_cryp_find_dev(struct starfive_cryp_ctx *ctx);
229
230int starfive_hash_register_algs(void);
231void starfive_hash_unregister_algs(void);
232
233int starfive_rsa_register_algs(void);
234void starfive_rsa_unregister_algs(void);
235
236int starfive_aes_register_algs(void);
237void starfive_aes_unregister_algs(void);
238#endif
~/ Read-only file preview.