Loading...
Note: File does not exist in v6.2.
1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Driver for EIP97 cryptographic accelerator.
4 *
5 * Copyright (c) 2016 Ryder Lee <ryder.lee@mediatek.com>
6 */
7
8#ifndef __MTK_PLATFORM_H_
9#define __MTK_PLATFORM_H_
10
11#include <crypto/algapi.h>
12#include <crypto/internal/aead.h>
13#include <crypto/internal/hash.h>
14#include <crypto/scatterwalk.h>
15#include <crypto/skcipher.h>
16#include <linux/crypto.h>
17#include <linux/dma-mapping.h>
18#include <linux/interrupt.h>
19#include <linux/scatterlist.h>
20#include "mtk-regs.h"
21
22#define MTK_RDR_PROC_THRESH BIT(0)
23#define MTK_RDR_PROC_MODE BIT(23)
24#define MTK_CNT_RST BIT(31)
25#define MTK_IRQ_RDR0 BIT(1)
26#define MTK_IRQ_RDR1 BIT(3)
27#define MTK_IRQ_RDR2 BIT(5)
28#define MTK_IRQ_RDR3 BIT(7)
29
30#define SIZE_IN_WORDS(x) ((x) >> 2)
31
32/**
33 * Ring 0/1 are used by AES encrypt and decrypt.
34 * Ring 2/3 are used by SHA.
35 */
36enum {
37 MTK_RING0,
38 MTK_RING1,
39 MTK_RING2,
40 MTK_RING3,
41 MTK_RING_MAX
42};
43
44#define MTK_REC_NUM (MTK_RING_MAX / 2)
45#define MTK_IRQ_NUM 5
46
47/**
48 * struct mtk_desc - DMA descriptor
49 * @hdr: the descriptor control header
50 * @buf: DMA address of input buffer segment
51 * @ct: DMA address of command token that control operation flow
52 * @ct_hdr: the command token control header
53 * @tag: the user-defined field
54 * @tfm: DMA address of transform state
55 * @bound: align descriptors offset boundary
56 *
57 * Structure passed to the crypto engine to describe where source
58 * data needs to be fetched and how it needs to be processed.
59 */
60struct mtk_desc {
61 __le32 hdr;
62 __le32 buf;
63 __le32 ct;
64 __le32 ct_hdr;
65 __le32 tag;
66 __le32 tfm;
67 __le32 bound[2];
68};
69
70#define MTK_DESC_NUM 512
71#define MTK_DESC_OFF SIZE_IN_WORDS(sizeof(struct mtk_desc))
72#define MTK_DESC_SZ (MTK_DESC_OFF - 2)
73#define MTK_DESC_RING_SZ ((sizeof(struct mtk_desc) * MTK_DESC_NUM))
74#define MTK_DESC_CNT(x) ((MTK_DESC_OFF * (x)) << 2)
75#define MTK_DESC_LAST cpu_to_le32(BIT(22))
76#define MTK_DESC_FIRST cpu_to_le32(BIT(23))
77#define MTK_DESC_BUF_LEN(x) cpu_to_le32(x)
78#define MTK_DESC_CT_LEN(x) cpu_to_le32((x) << 24)
79
80/**
81 * struct mtk_ring - Descriptor ring
82 * @cmd_base: pointer to command descriptor ring base
83 * @cmd_next: pointer to the next command descriptor
84 * @cmd_dma: DMA address of command descriptor ring
85 * @res_base: pointer to result descriptor ring base
86 * @res_next: pointer to the next result descriptor
87 * @res_prev: pointer to the previous result descriptor
88 * @res_dma: DMA address of result descriptor ring
89 *
90 * A descriptor ring is a circular buffer that is used to manage
91 * one or more descriptors. There are two type of descriptor rings;
92 * the command descriptor ring and result descriptor ring.
93 */
94struct mtk_ring {
95 struct mtk_desc *cmd_base;
96 struct mtk_desc *cmd_next;
97 dma_addr_t cmd_dma;
98 struct mtk_desc *res_base;
99 struct mtk_desc *res_next;
100 struct mtk_desc *res_prev;
101 dma_addr_t res_dma;
102};
103
104/**
105 * struct mtk_aes_dma - Structure that holds sg list info
106 * @sg: pointer to scatter-gather list
107 * @nents: number of entries in the sg list
108 * @remainder: remainder of sg list
109 * @sg_len: number of entries in the sg mapped list
110 */
111struct mtk_aes_dma {
112 struct scatterlist *sg;
113 int nents;
114 u32 remainder;
115 u32 sg_len;
116};
117
118struct mtk_aes_base_ctx;
119struct mtk_aes_rec;
120struct mtk_cryp;
121
122typedef int (*mtk_aes_fn)(struct mtk_cryp *cryp, struct mtk_aes_rec *aes);
123
124/**
125 * struct mtk_aes_rec - AES operation record
126 * @cryp: pointer to Cryptographic device
127 * @queue: crypto request queue
128 * @areq: pointer to async request
129 * @done_task: the tasklet is use in AES interrupt
130 * @queue_task: the tasklet is used to dequeue request
131 * @ctx: pointer to current context
132 * @src: the structure that holds source sg list info
133 * @dst: the structure that holds destination sg list info
134 * @aligned_sg: the scatter list is use to alignment
135 * @real_dst: pointer to the destination sg list
136 * @resume: pointer to resume function
137 * @total: request buffer length
138 * @buf: pointer to page buffer
139 * @id: the current use of ring
140 * @flags: it's describing AES operation state
141 * @lock: the async queue lock
142 *
143 * Structure used to record AES execution state.
144 */
145struct mtk_aes_rec {
146 struct mtk_cryp *cryp;
147 struct crypto_queue queue;
148 struct crypto_async_request *areq;
149 struct tasklet_struct done_task;
150 struct tasklet_struct queue_task;
151 struct mtk_aes_base_ctx *ctx;
152 struct mtk_aes_dma src;
153 struct mtk_aes_dma dst;
154
155 struct scatterlist aligned_sg;
156 struct scatterlist *real_dst;
157
158 mtk_aes_fn resume;
159
160 size_t total;
161 void *buf;
162
163 u8 id;
164 unsigned long flags;
165 /* queue lock */
166 spinlock_t lock;
167};
168
169/**
170 * struct mtk_sha_rec - SHA operation record
171 * @cryp: pointer to Cryptographic device
172 * @queue: crypto request queue
173 * @req: pointer to ahash request
174 * @done_task: the tasklet is use in SHA interrupt
175 * @queue_task: the tasklet is used to dequeue request
176 * @id: the current use of ring
177 * @flags: it's describing SHA operation state
178 * @lock: the async queue lock
179 *
180 * Structure used to record SHA execution state.
181 */
182struct mtk_sha_rec {
183 struct mtk_cryp *cryp;
184 struct crypto_queue queue;
185 struct ahash_request *req;
186 struct tasklet_struct done_task;
187 struct tasklet_struct queue_task;
188
189 u8 id;
190 unsigned long flags;
191 /* queue lock */
192 spinlock_t lock;
193};
194
195/**
196 * struct mtk_cryp - Cryptographic device
197 * @base: pointer to mapped register I/O base
198 * @dev: pointer to device
199 * @clk_cryp: pointer to crypto clock
200 * @irq: global system and rings IRQ
201 * @ring: pointer to descriptor rings
202 * @aes: pointer to operation record of AES
203 * @sha: pointer to operation record of SHA
204 * @aes_list: device list of AES
205 * @sha_list: device list of SHA
206 * @rec: it's used to select SHA record for tfm
207 *
208 * Structure storing cryptographic device information.
209 */
210struct mtk_cryp {
211 void __iomem *base;
212 struct device *dev;
213 struct clk *clk_cryp;
214 int irq[MTK_IRQ_NUM];
215
216 struct mtk_ring *ring[MTK_RING_MAX];
217 struct mtk_aes_rec *aes[MTK_REC_NUM];
218 struct mtk_sha_rec *sha[MTK_REC_NUM];
219
220 struct list_head aes_list;
221 struct list_head sha_list;
222
223 bool rec;
224};
225
226int mtk_cipher_alg_register(struct mtk_cryp *cryp);
227void mtk_cipher_alg_release(struct mtk_cryp *cryp);
228int mtk_hash_alg_register(struct mtk_cryp *cryp);
229void mtk_hash_alg_release(struct mtk_cryp *cryp);
230
231#endif /* __MTK_PLATFORM_H_ */