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