summaryrefslogtreecommitdiffstats
path: root/drivers/crypto/inside-secure/eip93/eip93-main.h
blob: 79b078f0e5dac50afc367ffc9c599b671a6c8c13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
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
/* SPDX-License-Identifier: GPL-2.0
 *
 * Copyright (C) 2019 - 2021
 *
 * Richard van Schagen <vschagen@icloud.com>
 * Christian Marangi <ansuelsmth@gmail.com
 */
#ifndef _EIP93_MAIN_H_
#define _EIP93_MAIN_H_

#include <crypto/internal/aead.h>
#include <crypto/internal/hash.h>
#include <crypto/internal/skcipher.h>
#include <linux/bitfield.h>
#include <linux/interrupt.h>

#define EIP93_RING_BUSY_DELAY		500

#define EIP93_RING_NUM			512
#define EIP93_RING_BUSY			32
#define EIP93_CRA_PRIORITY		1500

#define EIP93_RING_SA_STATE_ADDR(base, idx)	((base) + (idx))
#define EIP93_RING_SA_STATE_DMA(dma_base, idx)	((u32 __force)(dma_base) + \
						 ((idx) * sizeof(struct sa_state)))

/* cipher algorithms */
#define EIP93_ALG_DES			BIT(0)
#define EIP93_ALG_3DES			BIT(1)
#define EIP93_ALG_AES			BIT(2)
#define EIP93_ALG_MASK			GENMASK(2, 0)
/* hash and hmac algorithms */
#define EIP93_HASH_MD5			BIT(3)
#define EIP93_HASH_SHA1			BIT(4)
#define EIP93_HASH_SHA224			BIT(5)
#define EIP93_HASH_SHA256			BIT(6)
#define EIP93_HASH_HMAC			BIT(7)
#define EIP93_HASH_MASK			GENMASK(6, 3)
/* cipher modes */
#define EIP93_MODE_CBC			BIT(8)
#define EIP93_MODE_ECB			BIT(9)
#define EIP93_MODE_CTR			BIT(10)
#define EIP93_MODE_RFC3686		BIT(11)
#define EIP93_MODE_MASK			GENMASK(10, 8)

/* cipher encryption/decryption operations */
#define EIP93_ENCRYPT			BIT(12)
#define EIP93_DECRYPT			BIT(13)

#define EIP93_BUSY			BIT(14)

/* descriptor flags */
#define EIP93_DESC_DMA_IV			BIT(0)
#define EIP93_DESC_IPSEC			BIT(1)
#define EIP93_DESC_FINISH			BIT(2)
#define EIP93_DESC_LAST			BIT(3)
#define EIP93_DESC_FAKE_HMAC		BIT(4)
#define EIP93_DESC_PRNG			BIT(5)
#define EIP93_DESC_HASH			BIT(6)
#define EIP93_DESC_AEAD			BIT(7)
#define EIP93_DESC_SKCIPHER		BIT(8)
#define EIP93_DESC_ASYNC			BIT(9)

#define IS_DMA_IV(desc_flags)		((desc_flags) & EIP93_DESC_DMA_IV)

#define IS_DES(flags)			((flags) & EIP93_ALG_DES)
#define IS_3DES(flags)			((flags) & EIP93_ALG_3DES)
#define IS_AES(flags)			((flags) & EIP93_ALG_AES)

#define IS_HASH_MD5(flags)		((flags) & EIP93_HASH_MD5)
#define IS_HASH_SHA1(flags)		((flags) & EIP93_HASH_SHA1)
#define IS_HASH_SHA224(flags)		((flags) & EIP93_HASH_SHA224)
#define IS_HASH_SHA256(flags)		((flags) & EIP93_HASH_SHA256)
#define IS_HMAC(flags)			((flags) & EIP93_HASH_HMAC)

#define IS_CBC(mode)			((mode) & EIP93_MODE_CBC)
#define IS_ECB(mode)			((mode) & EIP93_MODE_ECB)
#define IS_CTR(mode)			((mode) & EIP93_MODE_CTR)
#define IS_RFC3686(mode)		((mode) & EIP93_MODE_RFC3686)

#define IS_BUSY(flags)			((flags) & EIP93_BUSY)

#define IS_ENCRYPT(dir)			((dir) & EIP93_ENCRYPT)
#define IS_DECRYPT(dir)			((dir) & EIP93_DECRYPT)

#define IS_CIPHER(flags)		((flags) & (EIP93_ALG_DES | \
						    EIP93_ALG_3DES |  \
						    EIP93_ALG_AES))

#define IS_HASH(flags)			((flags) & (EIP93_HASH_MD5 |  \
						    EIP93_HASH_SHA1 |   \
						    EIP93_HASH_SHA224 | \
						    EIP93_HASH_SHA256))

/**
 * struct eip93_device - crypto engine device structure
 */
struct eip93_device {
	void __iomem		*base;
	struct device		*dev;
	struct clk		*clk;
	int			irq;
	struct eip93_ring		*ring;
};

struct eip93_desc_ring {
	void			*base;
	void			*base_end;
	dma_addr_t		base_dma;
	/* write and read pointers */
	void			*read;
	void			*write;
	/* descriptor element offset */
	u32			offset;
};

struct eip93_state_pool {
	void			*base;
	dma_addr_t		base_dma;
};

struct eip93_ring {
	struct tasklet_struct		done_task;
	/* command/result rings */
	struct eip93_desc_ring		cdr;
	struct eip93_desc_ring		rdr;
	spinlock_t			write_lock;
	spinlock_t			read_lock;
	/* aync idr */
	spinlock_t			idr_lock;
	struct idr			crypto_async_idr;
};

enum eip93_alg_type {
	EIP93_ALG_TYPE_AEAD,
	EIP93_ALG_TYPE_SKCIPHER,
	EIP93_ALG_TYPE_HASH,
};

struct eip93_alg_template {
	struct eip93_device	*eip93;
	enum eip93_alg_type	type;
	u32			flags;
	union {
		struct aead_alg		aead;
		struct skcipher_alg	skcipher;
		struct ahash_alg	ahash;
	} alg;
};

#endif /* _EIP93_MAIN_H_ */