xref: /linux/drivers/crypto/inside-secure/eip93/eip93-main.h (revision bbfd5594756011167b8f8de9a00e0c946afda1e6)
1*9739f5f9SChristian Marangi /* SPDX-License-Identifier: GPL-2.0
2*9739f5f9SChristian Marangi  *
3*9739f5f9SChristian Marangi  * Copyright (C) 2019 - 2021
4*9739f5f9SChristian Marangi  *
5*9739f5f9SChristian Marangi  * Richard van Schagen <vschagen@icloud.com>
6*9739f5f9SChristian Marangi  * Christian Marangi <ansuelsmth@gmail.com
7*9739f5f9SChristian Marangi  */
8*9739f5f9SChristian Marangi #ifndef _EIP93_MAIN_H_
9*9739f5f9SChristian Marangi #define _EIP93_MAIN_H_
10*9739f5f9SChristian Marangi 
11*9739f5f9SChristian Marangi #include <crypto/internal/aead.h>
12*9739f5f9SChristian Marangi #include <crypto/internal/hash.h>
13*9739f5f9SChristian Marangi #include <crypto/internal/skcipher.h>
14*9739f5f9SChristian Marangi #include <linux/bitfield.h>
15*9739f5f9SChristian Marangi #include <linux/interrupt.h>
16*9739f5f9SChristian Marangi 
17*9739f5f9SChristian Marangi #define EIP93_RING_BUSY_DELAY		500
18*9739f5f9SChristian Marangi 
19*9739f5f9SChristian Marangi #define EIP93_RING_NUM			512
20*9739f5f9SChristian Marangi #define EIP93_RING_BUSY			32
21*9739f5f9SChristian Marangi #define EIP93_CRA_PRIORITY		1500
22*9739f5f9SChristian Marangi 
23*9739f5f9SChristian Marangi #define EIP93_RING_SA_STATE_ADDR(base, idx)	((base) + (idx))
24*9739f5f9SChristian Marangi #define EIP93_RING_SA_STATE_DMA(dma_base, idx)	((u32 __force)(dma_base) + \
25*9739f5f9SChristian Marangi 						 ((idx) * sizeof(struct sa_state)))
26*9739f5f9SChristian Marangi 
27*9739f5f9SChristian Marangi /* cipher algorithms */
28*9739f5f9SChristian Marangi #define EIP93_ALG_DES			BIT(0)
29*9739f5f9SChristian Marangi #define EIP93_ALG_3DES			BIT(1)
30*9739f5f9SChristian Marangi #define EIP93_ALG_AES			BIT(2)
31*9739f5f9SChristian Marangi #define EIP93_ALG_MASK			GENMASK(2, 0)
32*9739f5f9SChristian Marangi /* hash and hmac algorithms */
33*9739f5f9SChristian Marangi #define EIP93_HASH_MD5			BIT(3)
34*9739f5f9SChristian Marangi #define EIP93_HASH_SHA1			BIT(4)
35*9739f5f9SChristian Marangi #define EIP93_HASH_SHA224			BIT(5)
36*9739f5f9SChristian Marangi #define EIP93_HASH_SHA256			BIT(6)
37*9739f5f9SChristian Marangi #define EIP93_HASH_HMAC			BIT(7)
38*9739f5f9SChristian Marangi #define EIP93_HASH_MASK			GENMASK(6, 3)
39*9739f5f9SChristian Marangi /* cipher modes */
40*9739f5f9SChristian Marangi #define EIP93_MODE_CBC			BIT(8)
41*9739f5f9SChristian Marangi #define EIP93_MODE_ECB			BIT(9)
42*9739f5f9SChristian Marangi #define EIP93_MODE_CTR			BIT(10)
43*9739f5f9SChristian Marangi #define EIP93_MODE_RFC3686		BIT(11)
44*9739f5f9SChristian Marangi #define EIP93_MODE_MASK			GENMASK(10, 8)
45*9739f5f9SChristian Marangi 
46*9739f5f9SChristian Marangi /* cipher encryption/decryption operations */
47*9739f5f9SChristian Marangi #define EIP93_ENCRYPT			BIT(12)
48*9739f5f9SChristian Marangi #define EIP93_DECRYPT			BIT(13)
49*9739f5f9SChristian Marangi 
50*9739f5f9SChristian Marangi #define EIP93_BUSY			BIT(14)
51*9739f5f9SChristian Marangi 
52*9739f5f9SChristian Marangi /* descriptor flags */
53*9739f5f9SChristian Marangi #define EIP93_DESC_DMA_IV			BIT(0)
54*9739f5f9SChristian Marangi #define EIP93_DESC_IPSEC			BIT(1)
55*9739f5f9SChristian Marangi #define EIP93_DESC_FINISH			BIT(2)
56*9739f5f9SChristian Marangi #define EIP93_DESC_LAST			BIT(3)
57*9739f5f9SChristian Marangi #define EIP93_DESC_FAKE_HMAC		BIT(4)
58*9739f5f9SChristian Marangi #define EIP93_DESC_PRNG			BIT(5)
59*9739f5f9SChristian Marangi #define EIP93_DESC_HASH			BIT(6)
60*9739f5f9SChristian Marangi #define EIP93_DESC_AEAD			BIT(7)
61*9739f5f9SChristian Marangi #define EIP93_DESC_SKCIPHER		BIT(8)
62*9739f5f9SChristian Marangi #define EIP93_DESC_ASYNC			BIT(9)
63*9739f5f9SChristian Marangi 
64*9739f5f9SChristian Marangi #define IS_DMA_IV(desc_flags)		((desc_flags) & EIP93_DESC_DMA_IV)
65*9739f5f9SChristian Marangi 
66*9739f5f9SChristian Marangi #define IS_DES(flags)			((flags) & EIP93_ALG_DES)
67*9739f5f9SChristian Marangi #define IS_3DES(flags)			((flags) & EIP93_ALG_3DES)
68*9739f5f9SChristian Marangi #define IS_AES(flags)			((flags) & EIP93_ALG_AES)
69*9739f5f9SChristian Marangi 
70*9739f5f9SChristian Marangi #define IS_HASH_MD5(flags)		((flags) & EIP93_HASH_MD5)
71*9739f5f9SChristian Marangi #define IS_HASH_SHA1(flags)		((flags) & EIP93_HASH_SHA1)
72*9739f5f9SChristian Marangi #define IS_HASH_SHA224(flags)		((flags) & EIP93_HASH_SHA224)
73*9739f5f9SChristian Marangi #define IS_HASH_SHA256(flags)		((flags) & EIP93_HASH_SHA256)
74*9739f5f9SChristian Marangi #define IS_HMAC(flags)			((flags) & EIP93_HASH_HMAC)
75*9739f5f9SChristian Marangi 
76*9739f5f9SChristian Marangi #define IS_CBC(mode)			((mode) & EIP93_MODE_CBC)
77*9739f5f9SChristian Marangi #define IS_ECB(mode)			((mode) & EIP93_MODE_ECB)
78*9739f5f9SChristian Marangi #define IS_CTR(mode)			((mode) & EIP93_MODE_CTR)
79*9739f5f9SChristian Marangi #define IS_RFC3686(mode)		((mode) & EIP93_MODE_RFC3686)
80*9739f5f9SChristian Marangi 
81*9739f5f9SChristian Marangi #define IS_BUSY(flags)			((flags) & EIP93_BUSY)
82*9739f5f9SChristian Marangi 
83*9739f5f9SChristian Marangi #define IS_ENCRYPT(dir)			((dir) & EIP93_ENCRYPT)
84*9739f5f9SChristian Marangi #define IS_DECRYPT(dir)			((dir) & EIP93_DECRYPT)
85*9739f5f9SChristian Marangi 
86*9739f5f9SChristian Marangi #define IS_CIPHER(flags)		((flags) & (EIP93_ALG_DES | \
87*9739f5f9SChristian Marangi 						    EIP93_ALG_3DES |  \
88*9739f5f9SChristian Marangi 						    EIP93_ALG_AES))
89*9739f5f9SChristian Marangi 
90*9739f5f9SChristian Marangi #define IS_HASH(flags)			((flags) & (EIP93_HASH_MD5 |  \
91*9739f5f9SChristian Marangi 						    EIP93_HASH_SHA1 |   \
92*9739f5f9SChristian Marangi 						    EIP93_HASH_SHA224 | \
93*9739f5f9SChristian Marangi 						    EIP93_HASH_SHA256))
94*9739f5f9SChristian Marangi 
95*9739f5f9SChristian Marangi /**
96*9739f5f9SChristian Marangi  * struct eip93_device - crypto engine device structure
97*9739f5f9SChristian Marangi  */
98*9739f5f9SChristian Marangi struct eip93_device {
99*9739f5f9SChristian Marangi 	void __iomem		*base;
100*9739f5f9SChristian Marangi 	struct device		*dev;
101*9739f5f9SChristian Marangi 	struct clk		*clk;
102*9739f5f9SChristian Marangi 	int			irq;
103*9739f5f9SChristian Marangi 	struct eip93_ring		*ring;
104*9739f5f9SChristian Marangi };
105*9739f5f9SChristian Marangi 
106*9739f5f9SChristian Marangi struct eip93_desc_ring {
107*9739f5f9SChristian Marangi 	void			*base;
108*9739f5f9SChristian Marangi 	void			*base_end;
109*9739f5f9SChristian Marangi 	dma_addr_t		base_dma;
110*9739f5f9SChristian Marangi 	/* write and read pointers */
111*9739f5f9SChristian Marangi 	void			*read;
112*9739f5f9SChristian Marangi 	void			*write;
113*9739f5f9SChristian Marangi 	/* descriptor element offset */
114*9739f5f9SChristian Marangi 	u32			offset;
115*9739f5f9SChristian Marangi };
116*9739f5f9SChristian Marangi 
117*9739f5f9SChristian Marangi struct eip93_state_pool {
118*9739f5f9SChristian Marangi 	void			*base;
119*9739f5f9SChristian Marangi 	dma_addr_t		base_dma;
120*9739f5f9SChristian Marangi };
121*9739f5f9SChristian Marangi 
122*9739f5f9SChristian Marangi struct eip93_ring {
123*9739f5f9SChristian Marangi 	struct tasklet_struct		done_task;
124*9739f5f9SChristian Marangi 	/* command/result rings */
125*9739f5f9SChristian Marangi 	struct eip93_desc_ring		cdr;
126*9739f5f9SChristian Marangi 	struct eip93_desc_ring		rdr;
127*9739f5f9SChristian Marangi 	spinlock_t			write_lock;
128*9739f5f9SChristian Marangi 	spinlock_t			read_lock;
129*9739f5f9SChristian Marangi 	/* aync idr */
130*9739f5f9SChristian Marangi 	spinlock_t			idr_lock;
131*9739f5f9SChristian Marangi 	struct idr			crypto_async_idr;
132*9739f5f9SChristian Marangi };
133*9739f5f9SChristian Marangi 
134*9739f5f9SChristian Marangi enum eip93_alg_type {
135*9739f5f9SChristian Marangi 	EIP93_ALG_TYPE_AEAD,
136*9739f5f9SChristian Marangi 	EIP93_ALG_TYPE_SKCIPHER,
137*9739f5f9SChristian Marangi 	EIP93_ALG_TYPE_HASH,
138*9739f5f9SChristian Marangi };
139*9739f5f9SChristian Marangi 
140*9739f5f9SChristian Marangi struct eip93_alg_template {
141*9739f5f9SChristian Marangi 	struct eip93_device	*eip93;
142*9739f5f9SChristian Marangi 	enum eip93_alg_type	type;
143*9739f5f9SChristian Marangi 	u32			flags;
144*9739f5f9SChristian Marangi 	union {
145*9739f5f9SChristian Marangi 		struct aead_alg		aead;
146*9739f5f9SChristian Marangi 		struct skcipher_alg	skcipher;
147*9739f5f9SChristian Marangi 		struct ahash_alg	ahash;
148*9739f5f9SChristian Marangi 	} alg;
149*9739f5f9SChristian Marangi };
150*9739f5f9SChristian Marangi 
151*9739f5f9SChristian Marangi #endif /* _EIP93_MAIN_H_ */
152