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 */ 36 enum { 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 */ 60 struct 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 */ 94 struct 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 */ 111 struct mtk_aes_dma { 112 struct scatterlist *sg; 113 int nents; 114 u32 remainder; 115 u32 sg_len; 116 }; 117 118 struct mtk_aes_base_ctx; 119 struct mtk_aes_rec; 120 struct mtk_cryp; 121 122 typedef 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 */ 145 struct 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 */ 182 struct 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 */ 210 struct 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 226 int mtk_cipher_alg_register(struct mtk_cryp *cryp); 227 void mtk_cipher_alg_release(struct mtk_cryp *cryp); 228 int mtk_hash_alg_register(struct mtk_cryp *cryp); 229 void mtk_hash_alg_release(struct mtk_cryp *cryp); 230 231 #endif /* __MTK_PLATFORM_H_ */ 232