Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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