Blame view

drivers/crypto/omap-aes.h 5.99 KB
d2912cb15   Thomas Gleixner   treewide: Replace...
1
  /* SPDX-License-Identifier: GPL-2.0-only */
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
2
3
4
5
6
7
  /*
   * Cryptographic API.
   *
   * Support for OMAP AES HW ACCELERATOR defines
   *
   * Copyright (c) 2015 Texas Instruments Incorporated
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
8
9
10
   */
  #ifndef __OMAP_AES_H__
  #define __OMAP_AES_H__
f0956d42c   Ard Biesheuvel   crypto: omap-aes-...
11
  #include <crypto/aes.h>
c21c8b898   Corentin LABBE   crypto: omap - co...
12
  #include <crypto/engine.h>
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  #define DST_MAXBURST			4
  #define DMA_MIN				(DST_MAXBURST * sizeof(u32))
  
  #define _calc_walked(inout) (dd->inout##_walk.offset - dd->inout##_sg->offset)
  
  /*
   * OMAP TRM gives bitfields as start:end, where start is the higher bit
   * number. For example 7:0
   */
  #define FLD_MASK(start, end)	(((1 << ((start) - (end) + 1)) - 1) << (end))
  #define FLD_VAL(val, start, end) (((val) << (end)) & FLD_MASK(start, end))
  
  #define AES_REG_KEY(dd, x)		((dd)->pdata->key_ofs - \
  						(((x) ^ 0x01) * 0x04))
  #define AES_REG_IV(dd, x)		((dd)->pdata->iv_ofs + ((x) * 0x04))
  
  #define AES_REG_CTRL(dd)		((dd)->pdata->ctrl_ofs)
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
30
  #define AES_REG_CTRL_CONTEXT_READY	BIT(31)
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
31
32
33
34
35
  #define AES_REG_CTRL_CTR_WIDTH_MASK	GENMASK(8, 7)
  #define AES_REG_CTRL_CTR_WIDTH_32	0
  #define AES_REG_CTRL_CTR_WIDTH_64	BIT(7)
  #define AES_REG_CTRL_CTR_WIDTH_96	BIT(8)
  #define AES_REG_CTRL_CTR_WIDTH_128	GENMASK(8, 7)
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
36
  #define AES_REG_CTRL_GCM		GENMASK(17, 16)
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
37
38
39
40
41
42
43
  #define AES_REG_CTRL_CTR		BIT(6)
  #define AES_REG_CTRL_CBC		BIT(5)
  #define AES_REG_CTRL_KEY_SIZE		GENMASK(4, 3)
  #define AES_REG_CTRL_DIRECTION		BIT(2)
  #define AES_REG_CTRL_INPUT_READY	BIT(1)
  #define AES_REG_CTRL_OUTPUT_READY	BIT(0)
  #define AES_REG_CTRL_MASK		GENMASK(24, 2)
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
44
45
46
  #define AES_REG_C_LEN_0			0x54
  #define AES_REG_C_LEN_1			0x58
  #define AES_REG_A_LEN			0x5C
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
47
  #define AES_REG_DATA_N(dd, x)		((dd)->pdata->data_ofs + ((x) * 0x04))
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
48
  #define AES_REG_TAG_N(dd, x)		(0x70 + ((x) * 0x04))
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
  
  #define AES_REG_REV(dd)			((dd)->pdata->rev_ofs)
  
  #define AES_REG_MASK(dd)		((dd)->pdata->mask_ofs)
  #define AES_REG_MASK_SIDLE		BIT(6)
  #define AES_REG_MASK_START		BIT(5)
  #define AES_REG_MASK_DMA_OUT_EN		BIT(3)
  #define AES_REG_MASK_DMA_IN_EN		BIT(2)
  #define AES_REG_MASK_SOFTRESET		BIT(1)
  #define AES_REG_AUTOIDLE		BIT(0)
  
  #define AES_REG_LENGTH_N(x)		(0x54 + ((x) * 0x04))
  
  #define AES_REG_IRQ_STATUS(dd)         ((dd)->pdata->irq_status_ofs)
  #define AES_REG_IRQ_ENABLE(dd)         ((dd)->pdata->irq_enable_ofs)
  #define AES_REG_IRQ_DATA_IN            BIT(1)
  #define AES_REG_IRQ_DATA_OUT           BIT(2)
  #define DEFAULT_TIMEOUT		(5 * HZ)
  
  #define DEFAULT_AUTOSUSPEND_DELAY	1000
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
69
  #define FLAGS_MODE_MASK		0x001f
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
70
71
  #define FLAGS_ENCRYPT		BIT(0)
  #define FLAGS_CBC		BIT(1)
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
72
73
74
  #define FLAGS_CTR		BIT(2)
  #define FLAGS_GCM		BIT(3)
  #define FLAGS_RFC4106_GCM	BIT(4)
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
75

ad18cc9d0   Tero Kristo   crypto: omap-aes ...
76
77
  #define FLAGS_INIT		BIT(5)
  #define FLAGS_FAST		BIT(6)
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
78
79
80
  
  #define FLAGS_IN_DATA_ST_SHIFT	8
  #define FLAGS_OUT_DATA_ST_SHIFT	10
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
81
  #define FLAGS_ASSOC_DATA_ST_SHIFT	12
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
82
83
  
  #define AES_BLOCK_WORDS		(AES_BLOCK_SIZE >> 2)
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
84
85
86
87
  struct omap_aes_gcm_result {
  	struct completion completion;
  	int err;
  };
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
88
  struct omap_aes_ctx {
c21c8b898   Corentin LABBE   crypto: omap - co...
89
  	struct crypto_engine_ctx enginectx;
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
90
91
  	int		keylen;
  	u32		key[AES_KEYSIZE_256 / sizeof(u32)];
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
92
  	u8		nonce[4];
6a99d7a2d   Ard Biesheuvel   crypto: omap-aes ...
93
  	struct crypto_skcipher	*fallback;
f0956d42c   Ard Biesheuvel   crypto: omap-aes-...
94
95
96
97
98
  };
  
  struct omap_aes_gcm_ctx {
  	struct omap_aes_ctx	octx;
  	struct crypto_aes_ctx	actx;
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
99
100
101
102
103
  };
  
  struct omap_aes_reqctx {
  	struct omap_aes_dev *dd;
  	unsigned long mode;
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
104
105
  	u8 iv[AES_BLOCK_SIZE];
  	u32 auth_tag[AES_BLOCK_SIZE / sizeof(u32)];
6a99d7a2d   Ard Biesheuvel   crypto: omap-aes ...
106
  	struct skcipher_request fallback_req;	// keep at the end
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
107
108
109
110
111
112
  };
  
  #define OMAP_AES_QUEUE_LENGTH	1
  #define OMAP_AES_CACHE_SIZE	0
  
  struct omap_aes_algs_info {
b3e3f0fe4   Ard Biesheuvel   crypto: omap - sw...
113
  	struct skcipher_alg	*algs_list;
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
114
115
116
  	unsigned int		size;
  	unsigned int		registered;
  };
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
117
118
119
120
121
  struct omap_aes_aead_algs {
  	struct aead_alg	*algs_list;
  	unsigned int	size;
  	unsigned int	registered;
  };
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
122
123
124
  struct omap_aes_pdata {
  	struct omap_aes_algs_info	*algs_info;
  	unsigned int	algs_info_size;
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
125
  	struct omap_aes_aead_algs	*aead_algs_info;
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
  
  	void		(*trigger)(struct omap_aes_dev *dd, int length);
  
  	u32		key_ofs;
  	u32		iv_ofs;
  	u32		ctrl_ofs;
  	u32		data_ofs;
  	u32		rev_ofs;
  	u32		mask_ofs;
  	u32             irq_enable_ofs;
  	u32             irq_status_ofs;
  
  	u32		dma_enable_in;
  	u32		dma_enable_out;
  	u32		dma_start;
  
  	u32		major_mask;
  	u32		major_shift;
  	u32		minor_mask;
  	u32		minor_shift;
  };
  
  struct omap_aes_dev {
  	struct list_head	list;
  	unsigned long		phys_base;
  	void __iomem		*io_base;
  	struct omap_aes_ctx	*ctx;
  	struct device		*dev;
  	unsigned long		flags;
  	int			err;
  
  	struct tasklet_struct	done_task;
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
158
159
  	struct aead_queue	aead_queue;
  	spinlock_t		lock;
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
160

b3e3f0fe4   Ard Biesheuvel   crypto: omap - sw...
161
  	struct skcipher_request		*req;
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
162
  	struct aead_request		*aead_req;
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
163
164
165
166
167
168
169
170
  	struct crypto_engine		*engine;
  
  	/*
  	 * total is used by PIO mode for book keeping so introduce
  	 * variable total_save as need it to calc page_order
  	 */
  	size_t				total;
  	size_t				total_save;
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
171
172
  	size_t				assoc_len;
  	size_t				authsize;
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
173
174
175
176
177
  
  	struct scatterlist		*in_sg;
  	struct scatterlist		*out_sg;
  
  	/* Buffers for copying for unaligned cases */
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
178
  	struct scatterlist		in_sgl[2];
5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
179
180
181
182
183
184
185
186
187
188
189
190
  	struct scatterlist		out_sgl;
  	struct scatterlist		*orig_out;
  
  	struct scatter_walk		in_walk;
  	struct scatter_walk		out_walk;
  	struct dma_chan		*dma_lch_in;
  	struct dma_chan		*dma_lch_out;
  	int			in_sg_len;
  	int			out_sg_len;
  	int			pio_only;
  	const struct omap_aes_pdata	*pdata;
  };
d695bfd6f   Tero Kristo   crypto: omap-aes ...
191
192
193
  u32 omap_aes_read(struct omap_aes_dev *dd, u32 offset);
  void omap_aes_write(struct omap_aes_dev *dd, u32 offset, u32 value);
  struct omap_aes_dev *omap_aes_find_dev(struct omap_aes_reqctx *rctx);
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
194
195
196
197
198
199
  int omap_aes_gcm_setkey(struct crypto_aead *tfm, const u8 *key,
  			unsigned int keylen);
  int omap_aes_4106gcm_setkey(struct crypto_aead *tfm, const u8 *key,
  			    unsigned int keylen);
  int omap_aes_gcm_encrypt(struct aead_request *req);
  int omap_aes_gcm_decrypt(struct aead_request *req);
12adf9d63   Ard Biesheuvel   crypto: omap-aes-...
200
  int omap_aes_gcm_setauthsize(struct crypto_aead *tfm, unsigned int authsize);
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
201
202
  int omap_aes_4106gcm_encrypt(struct aead_request *req);
  int omap_aes_4106gcm_decrypt(struct aead_request *req);
12adf9d63   Ard Biesheuvel   crypto: omap-aes-...
203
204
  int omap_aes_4106gcm_setauthsize(struct crypto_aead *parent,
  				 unsigned int authsize);
04a4616e6   Tero Kristo   crypto: omap-aes-...
205
  int omap_aes_gcm_cra_init(struct crypto_aead *tfm);
d695bfd6f   Tero Kristo   crypto: omap-aes ...
206
207
208
  int omap_aes_write_ctrl(struct omap_aes_dev *dd);
  int omap_aes_crypt_dma_start(struct omap_aes_dev *dd);
  int omap_aes_crypt_dma_stop(struct omap_aes_dev *dd);
ad18cc9d0   Tero Kristo   crypto: omap-aes ...
209
210
  void omap_aes_gcm_dma_out_callback(void *data);
  void omap_aes_clear_copy_flags(struct omap_aes_dev *dd);
d695bfd6f   Tero Kristo   crypto: omap-aes ...
211

5b3d4d2e6   Tero Kristo   crypto: omap-aes ...
212
  #endif