xref: /OK3568_Linux_fs/kernel/drivers/crypto/omap-aes.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Cryptographic API.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Support for OMAP AES HW ACCELERATOR defines
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Copyright (c) 2015 Texas Instruments Incorporated
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun #ifndef __OMAP_AES_H__
10*4882a593Smuzhiyun #define __OMAP_AES_H__
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <crypto/aes.h>
13*4882a593Smuzhiyun #include <crypto/engine.h>
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #define DST_MAXBURST			4
16*4882a593Smuzhiyun #define DMA_MIN				(DST_MAXBURST * sizeof(u32))
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define _calc_walked(inout) (dd->inout##_walk.offset - dd->inout##_sg->offset)
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun /*
21*4882a593Smuzhiyun  * OMAP TRM gives bitfields as start:end, where start is the higher bit
22*4882a593Smuzhiyun  * number. For example 7:0
23*4882a593Smuzhiyun  */
24*4882a593Smuzhiyun #define FLD_MASK(start, end)	(((1 << ((start) - (end) + 1)) - 1) << (end))
25*4882a593Smuzhiyun #define FLD_VAL(val, start, end) (((val) << (end)) & FLD_MASK(start, end))
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #define AES_REG_KEY(dd, x)		((dd)->pdata->key_ofs - \
28*4882a593Smuzhiyun 						(((x) ^ 0x01) * 0x04))
29*4882a593Smuzhiyun #define AES_REG_IV(dd, x)		((dd)->pdata->iv_ofs + ((x) * 0x04))
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #define AES_REG_CTRL(dd)		((dd)->pdata->ctrl_ofs)
32*4882a593Smuzhiyun #define AES_REG_CTRL_CONTEXT_READY	BIT(31)
33*4882a593Smuzhiyun #define AES_REG_CTRL_CTR_WIDTH_MASK	GENMASK(8, 7)
34*4882a593Smuzhiyun #define AES_REG_CTRL_CTR_WIDTH_32	0
35*4882a593Smuzhiyun #define AES_REG_CTRL_CTR_WIDTH_64	BIT(7)
36*4882a593Smuzhiyun #define AES_REG_CTRL_CTR_WIDTH_96	BIT(8)
37*4882a593Smuzhiyun #define AES_REG_CTRL_CTR_WIDTH_128	GENMASK(8, 7)
38*4882a593Smuzhiyun #define AES_REG_CTRL_GCM		GENMASK(17, 16)
39*4882a593Smuzhiyun #define AES_REG_CTRL_CTR		BIT(6)
40*4882a593Smuzhiyun #define AES_REG_CTRL_CBC		BIT(5)
41*4882a593Smuzhiyun #define AES_REG_CTRL_KEY_SIZE		GENMASK(4, 3)
42*4882a593Smuzhiyun #define AES_REG_CTRL_DIRECTION		BIT(2)
43*4882a593Smuzhiyun #define AES_REG_CTRL_INPUT_READY	BIT(1)
44*4882a593Smuzhiyun #define AES_REG_CTRL_OUTPUT_READY	BIT(0)
45*4882a593Smuzhiyun #define AES_REG_CTRL_MASK		GENMASK(24, 2)
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun #define AES_REG_C_LEN_0			0x54
48*4882a593Smuzhiyun #define AES_REG_C_LEN_1			0x58
49*4882a593Smuzhiyun #define AES_REG_A_LEN			0x5C
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #define AES_REG_DATA_N(dd, x)		((dd)->pdata->data_ofs + ((x) * 0x04))
52*4882a593Smuzhiyun #define AES_REG_TAG_N(dd, x)		(0x70 + ((x) * 0x04))
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun #define AES_REG_REV(dd)			((dd)->pdata->rev_ofs)
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun #define AES_REG_MASK(dd)		((dd)->pdata->mask_ofs)
57*4882a593Smuzhiyun #define AES_REG_MASK_SIDLE		BIT(6)
58*4882a593Smuzhiyun #define AES_REG_MASK_START		BIT(5)
59*4882a593Smuzhiyun #define AES_REG_MASK_DMA_OUT_EN		BIT(3)
60*4882a593Smuzhiyun #define AES_REG_MASK_DMA_IN_EN		BIT(2)
61*4882a593Smuzhiyun #define AES_REG_MASK_SOFTRESET		BIT(1)
62*4882a593Smuzhiyun #define AES_REG_AUTOIDLE		BIT(0)
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun #define AES_REG_LENGTH_N(x)		(0x54 + ((x) * 0x04))
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun #define AES_REG_IRQ_STATUS(dd)         ((dd)->pdata->irq_status_ofs)
67*4882a593Smuzhiyun #define AES_REG_IRQ_ENABLE(dd)         ((dd)->pdata->irq_enable_ofs)
68*4882a593Smuzhiyun #define AES_REG_IRQ_DATA_IN            BIT(1)
69*4882a593Smuzhiyun #define AES_REG_IRQ_DATA_OUT           BIT(2)
70*4882a593Smuzhiyun #define DEFAULT_TIMEOUT		(5 * HZ)
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun #define DEFAULT_AUTOSUSPEND_DELAY	1000
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun #define FLAGS_MODE_MASK		0x001f
75*4882a593Smuzhiyun #define FLAGS_ENCRYPT		BIT(0)
76*4882a593Smuzhiyun #define FLAGS_CBC		BIT(1)
77*4882a593Smuzhiyun #define FLAGS_CTR		BIT(2)
78*4882a593Smuzhiyun #define FLAGS_GCM		BIT(3)
79*4882a593Smuzhiyun #define FLAGS_RFC4106_GCM	BIT(4)
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun #define FLAGS_INIT		BIT(5)
82*4882a593Smuzhiyun #define FLAGS_FAST		BIT(6)
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun #define FLAGS_IN_DATA_ST_SHIFT	8
85*4882a593Smuzhiyun #define FLAGS_OUT_DATA_ST_SHIFT	10
86*4882a593Smuzhiyun #define FLAGS_ASSOC_DATA_ST_SHIFT	12
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun #define AES_BLOCK_WORDS		(AES_BLOCK_SIZE >> 2)
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun struct omap_aes_gcm_result {
91*4882a593Smuzhiyun 	struct completion completion;
92*4882a593Smuzhiyun 	int err;
93*4882a593Smuzhiyun };
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun struct omap_aes_ctx {
96*4882a593Smuzhiyun 	struct crypto_engine_ctx enginectx;
97*4882a593Smuzhiyun 	int		keylen;
98*4882a593Smuzhiyun 	u32		key[AES_KEYSIZE_256 / sizeof(u32)];
99*4882a593Smuzhiyun 	u8		nonce[4];
100*4882a593Smuzhiyun 	struct crypto_skcipher	*fallback;
101*4882a593Smuzhiyun };
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun struct omap_aes_gcm_ctx {
104*4882a593Smuzhiyun 	struct omap_aes_ctx	octx;
105*4882a593Smuzhiyun 	struct crypto_aes_ctx	actx;
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun struct omap_aes_reqctx {
109*4882a593Smuzhiyun 	struct omap_aes_dev *dd;
110*4882a593Smuzhiyun 	unsigned long mode;
111*4882a593Smuzhiyun 	u8 iv[AES_BLOCK_SIZE];
112*4882a593Smuzhiyun 	u32 auth_tag[AES_BLOCK_SIZE / sizeof(u32)];
113*4882a593Smuzhiyun 	struct skcipher_request fallback_req;	// keep at the end
114*4882a593Smuzhiyun };
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun #define OMAP_AES_QUEUE_LENGTH	1
117*4882a593Smuzhiyun #define OMAP_AES_CACHE_SIZE	0
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun struct omap_aes_algs_info {
120*4882a593Smuzhiyun 	struct skcipher_alg	*algs_list;
121*4882a593Smuzhiyun 	unsigned int		size;
122*4882a593Smuzhiyun 	unsigned int		registered;
123*4882a593Smuzhiyun };
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun struct omap_aes_aead_algs {
126*4882a593Smuzhiyun 	struct aead_alg	*algs_list;
127*4882a593Smuzhiyun 	unsigned int	size;
128*4882a593Smuzhiyun 	unsigned int	registered;
129*4882a593Smuzhiyun };
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun struct omap_aes_pdata {
132*4882a593Smuzhiyun 	struct omap_aes_algs_info	*algs_info;
133*4882a593Smuzhiyun 	unsigned int	algs_info_size;
134*4882a593Smuzhiyun 	struct omap_aes_aead_algs	*aead_algs_info;
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun 	void		(*trigger)(struct omap_aes_dev *dd, int length);
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun 	u32		key_ofs;
139*4882a593Smuzhiyun 	u32		iv_ofs;
140*4882a593Smuzhiyun 	u32		ctrl_ofs;
141*4882a593Smuzhiyun 	u32		data_ofs;
142*4882a593Smuzhiyun 	u32		rev_ofs;
143*4882a593Smuzhiyun 	u32		mask_ofs;
144*4882a593Smuzhiyun 	u32             irq_enable_ofs;
145*4882a593Smuzhiyun 	u32             irq_status_ofs;
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	u32		dma_enable_in;
148*4882a593Smuzhiyun 	u32		dma_enable_out;
149*4882a593Smuzhiyun 	u32		dma_start;
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	u32		major_mask;
152*4882a593Smuzhiyun 	u32		major_shift;
153*4882a593Smuzhiyun 	u32		minor_mask;
154*4882a593Smuzhiyun 	u32		minor_shift;
155*4882a593Smuzhiyun };
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun struct omap_aes_dev {
158*4882a593Smuzhiyun 	struct list_head	list;
159*4882a593Smuzhiyun 	unsigned long		phys_base;
160*4882a593Smuzhiyun 	void __iomem		*io_base;
161*4882a593Smuzhiyun 	struct omap_aes_ctx	*ctx;
162*4882a593Smuzhiyun 	struct device		*dev;
163*4882a593Smuzhiyun 	unsigned long		flags;
164*4882a593Smuzhiyun 	int			err;
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	struct tasklet_struct	done_task;
167*4882a593Smuzhiyun 	struct aead_queue	aead_queue;
168*4882a593Smuzhiyun 	spinlock_t		lock;
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun 	struct skcipher_request		*req;
171*4882a593Smuzhiyun 	struct aead_request		*aead_req;
172*4882a593Smuzhiyun 	struct crypto_engine		*engine;
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	/*
175*4882a593Smuzhiyun 	 * total is used by PIO mode for book keeping so introduce
176*4882a593Smuzhiyun 	 * variable total_save as need it to calc page_order
177*4882a593Smuzhiyun 	 */
178*4882a593Smuzhiyun 	size_t				total;
179*4882a593Smuzhiyun 	size_t				total_save;
180*4882a593Smuzhiyun 	size_t				assoc_len;
181*4882a593Smuzhiyun 	size_t				authsize;
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	struct scatterlist		*in_sg;
184*4882a593Smuzhiyun 	struct scatterlist		*out_sg;
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	/* Buffers for copying for unaligned cases */
187*4882a593Smuzhiyun 	struct scatterlist		in_sgl[2];
188*4882a593Smuzhiyun 	struct scatterlist		out_sgl;
189*4882a593Smuzhiyun 	struct scatterlist		*orig_out;
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun 	struct scatter_walk		in_walk;
192*4882a593Smuzhiyun 	struct scatter_walk		out_walk;
193*4882a593Smuzhiyun 	struct dma_chan		*dma_lch_in;
194*4882a593Smuzhiyun 	struct dma_chan		*dma_lch_out;
195*4882a593Smuzhiyun 	int			in_sg_len;
196*4882a593Smuzhiyun 	int			out_sg_len;
197*4882a593Smuzhiyun 	int			pio_only;
198*4882a593Smuzhiyun 	const struct omap_aes_pdata	*pdata;
199*4882a593Smuzhiyun };
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun u32 omap_aes_read(struct omap_aes_dev *dd, u32 offset);
202*4882a593Smuzhiyun void omap_aes_write(struct omap_aes_dev *dd, u32 offset, u32 value);
203*4882a593Smuzhiyun struct omap_aes_dev *omap_aes_find_dev(struct omap_aes_reqctx *rctx);
204*4882a593Smuzhiyun int omap_aes_gcm_setkey(struct crypto_aead *tfm, const u8 *key,
205*4882a593Smuzhiyun 			unsigned int keylen);
206*4882a593Smuzhiyun int omap_aes_4106gcm_setkey(struct crypto_aead *tfm, const u8 *key,
207*4882a593Smuzhiyun 			    unsigned int keylen);
208*4882a593Smuzhiyun int omap_aes_gcm_encrypt(struct aead_request *req);
209*4882a593Smuzhiyun int omap_aes_gcm_decrypt(struct aead_request *req);
210*4882a593Smuzhiyun int omap_aes_gcm_setauthsize(struct crypto_aead *tfm, unsigned int authsize);
211*4882a593Smuzhiyun int omap_aes_4106gcm_encrypt(struct aead_request *req);
212*4882a593Smuzhiyun int omap_aes_4106gcm_decrypt(struct aead_request *req);
213*4882a593Smuzhiyun int omap_aes_4106gcm_setauthsize(struct crypto_aead *parent,
214*4882a593Smuzhiyun 				 unsigned int authsize);
215*4882a593Smuzhiyun int omap_aes_gcm_cra_init(struct crypto_aead *tfm);
216*4882a593Smuzhiyun int omap_aes_write_ctrl(struct omap_aes_dev *dd);
217*4882a593Smuzhiyun int omap_aes_crypt_dma_start(struct omap_aes_dev *dd);
218*4882a593Smuzhiyun int omap_aes_crypt_dma_stop(struct omap_aes_dev *dd);
219*4882a593Smuzhiyun void omap_aes_gcm_dma_out_callback(void *data);
220*4882a593Smuzhiyun void omap_aes_clear_copy_flags(struct omap_aes_dev *dd);
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun #endif
223