GNU Linux-libre 6.8.7-gnu
[releases.git] / drivers / crypto / starfive / jh7110-cryp.h
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
34 union 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_CTR                   0x4
54 #define STARFIVE_AES_MODE_CCM                   0x5
55 #define STARFIVE_AES_MODE_GCM                   0x6
56                 u32 mode                        :3;
57 #define STARFIVE_AES_GCM_START                  BIT(12)
58                 u32 gcm_start                   :1;
59 #define STARFIVE_AES_GCM_DONE                   BIT(13)
60                 u32 gcm_done                    :1;
61                 u32 delay_aes                   :1;
62                 u32 vaes_start                  :1;
63                 u32 rsvd_0                      :8;
64 #define STARFIVE_AES_MODE_XFB_1                 0x0
65 #define STARFIVE_AES_MODE_XFB_128               0x5
66                 u32 stmode                      :3;
67                 u32 rsvd_1                      :5;
68         };
69 };
70
71 union starfive_hash_csr {
72         u32 v;
73         struct {
74                 u32 start                       :1;
75                 u32 reset                       :1;
76                 u32 ie                          :1;
77                 u32 firstb                      :1;
78 #define STARFIVE_HASH_SM3                       0x0
79 #define STARFIVE_HASH_SHA224                    0x3
80 #define STARFIVE_HASH_SHA256                    0x4
81 #define STARFIVE_HASH_SHA384                    0x5
82 #define STARFIVE_HASH_SHA512                    0x6
83 #define STARFIVE_HASH_MODE_MASK                 0x7
84                 u32 mode                        :3;
85                 u32 rsvd_1                      :1;
86                 u32 final                       :1;
87                 u32 rsvd_2                      :2;
88 #define STARFIVE_HASH_HMAC_FLAGS                0x800
89                 u32 hmac                        :1;
90                 u32 rsvd_3                      :1;
91 #define STARFIVE_HASH_KEY_DONE                  BIT(13)
92                 u32 key_done                    :1;
93                 u32 key_flag                    :1;
94                 u32 hmac_done                   :1;
95 #define STARFIVE_HASH_BUSY                      BIT(16)
96                 u32 busy                        :1;
97                 u32 hashdone                    :1;
98                 u32 rsvd_4                      :14;
99         };
100 };
101
102 union starfive_pka_cacr {
103         u32 v;
104         struct {
105                 u32 start                       :1;
106                 u32 reset                       :1;
107                 u32 ie                          :1;
108                 u32 rsvd_0                      :1;
109                 u32 fifo_mode                   :1;
110                 u32 not_r2                      :1;
111                 u32 ecc_sub                     :1;
112                 u32 pre_expf                    :1;
113                 u32 cmd                         :4;
114                 u32 rsvd_1                      :1;
115                 u32 ctrl_dummy                  :1;
116                 u32 ctrl_false                  :1;
117                 u32 cln_done                    :1;
118                 u32 opsize                      :6;
119                 u32 rsvd_2                      :2;
120                 u32 exposize                    :6;
121                 u32 rsvd_3                      :1;
122                 u32 bigendian                   :1;
123         };
124 };
125
126 union starfive_pka_casr {
127         u32 v;
128         struct {
129 #define STARFIVE_PKA_DONE                       BIT(0)
130                 u32 done                        :1;
131                 u32 rsvd_0                      :31;
132         };
133 };
134
135 struct starfive_rsa_key {
136         u8      *n;
137         u8      *e;
138         u8      *d;
139         int     e_bitlen;
140         int     d_bitlen;
141         int     bitlen;
142         size_t  key_sz;
143 };
144
145 union starfive_alg_cr {
146         u32 v;
147         struct {
148                 u32 start                       :1;
149                 u32 aes_dma_en                  :1;
150                 u32 rsvd_0                      :1;
151                 u32 hash_dma_en                 :1;
152                 u32 alg_done                    :1;
153                 u32 rsvd_1                      :3;
154                 u32 clear                       :1;
155                 u32 rsvd_2                      :23;
156         };
157 };
158
159 struct starfive_cryp_ctx {
160         struct starfive_cryp_dev                *cryp;
161         struct starfive_cryp_request_ctx        *rctx;
162
163         unsigned int                            hash_mode;
164         u8                                      key[MAX_KEY_SIZE];
165         int                                     keylen;
166         bool                                    is_hmac;
167         struct starfive_rsa_key                 rsa_key;
168         struct crypto_akcipher                  *akcipher_fbk;
169         struct crypto_ahash                     *ahash_fbk;
170         struct crypto_aead                      *aead_fbk;
171 };
172
173 struct starfive_cryp_dev {
174         struct list_head                        list;
175         struct device                           *dev;
176         struct clk                              *hclk;
177         struct clk                              *ahb;
178         struct reset_control                    *rst;
179
180         void __iomem                            *base;
181         phys_addr_t                             phys_base;
182
183         u32                                     dma_maxburst;
184         struct dma_chan                         *tx;
185         struct dma_chan                         *rx;
186         struct dma_slave_config                 cfg_in;
187         struct dma_slave_config                 cfg_out;
188         struct scatter_walk                     in_walk;
189         struct scatter_walk                     out_walk;
190         struct crypto_engine                    *engine;
191         struct tasklet_struct                   aes_done;
192         struct tasklet_struct                   hash_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
210 struct 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         size_t                                  nents;
222         unsigned int                            blksize;
223         unsigned int                            digsize;
224         unsigned long                           in_sg_len;
225         unsigned char                           *adata;
226         u8 rsa_data[] __aligned(sizeof(u32));
227 };
228
229 struct starfive_cryp_dev *starfive_cryp_find_dev(struct starfive_cryp_ctx *ctx);
230
231 int starfive_hash_register_algs(void);
232 void starfive_hash_unregister_algs(void);
233
234 int starfive_rsa_register_algs(void);
235 void starfive_rsa_unregister_algs(void);
236
237 int starfive_aes_register_algs(void);
238 void starfive_aes_unregister_algs(void);
239
240 void starfive_hash_done_task(unsigned long param);
241 void starfive_aes_done_task(unsigned long param);
242 #endif