0001
0002 #ifndef __RK3288_CRYPTO_H__
0003 #define __RK3288_CRYPTO_H__
0004
0005 #include <crypto/aes.h>
0006 #include <crypto/internal/des.h>
0007 #include <crypto/algapi.h>
0008 #include <linux/interrupt.h>
0009 #include <linux/delay.h>
0010 #include <linux/scatterlist.h>
0011 #include <crypto/internal/hash.h>
0012 #include <crypto/internal/skcipher.h>
0013
0014 #include <crypto/md5.h>
0015 #include <crypto/sha1.h>
0016 #include <crypto/sha2.h>
0017
0018 #define _SBF(v, f) ((v) << (f))
0019
0020
0021 #define RK_CRYPTO_INTSTS 0x0000
0022 #define RK_CRYPTO_PKA_DONE_INT BIT(5)
0023 #define RK_CRYPTO_HASH_DONE_INT BIT(4)
0024 #define RK_CRYPTO_HRDMA_ERR_INT BIT(3)
0025 #define RK_CRYPTO_HRDMA_DONE_INT BIT(2)
0026 #define RK_CRYPTO_BCDMA_ERR_INT BIT(1)
0027 #define RK_CRYPTO_BCDMA_DONE_INT BIT(0)
0028
0029 #define RK_CRYPTO_INTENA 0x0004
0030 #define RK_CRYPTO_PKA_DONE_ENA BIT(5)
0031 #define RK_CRYPTO_HASH_DONE_ENA BIT(4)
0032 #define RK_CRYPTO_HRDMA_ERR_ENA BIT(3)
0033 #define RK_CRYPTO_HRDMA_DONE_ENA BIT(2)
0034 #define RK_CRYPTO_BCDMA_ERR_ENA BIT(1)
0035 #define RK_CRYPTO_BCDMA_DONE_ENA BIT(0)
0036
0037 #define RK_CRYPTO_CTRL 0x0008
0038 #define RK_CRYPTO_WRITE_MASK _SBF(0xFFFF, 16)
0039 #define RK_CRYPTO_TRNG_FLUSH BIT(9)
0040 #define RK_CRYPTO_TRNG_START BIT(8)
0041 #define RK_CRYPTO_PKA_FLUSH BIT(7)
0042 #define RK_CRYPTO_HASH_FLUSH BIT(6)
0043 #define RK_CRYPTO_BLOCK_FLUSH BIT(5)
0044 #define RK_CRYPTO_PKA_START BIT(4)
0045 #define RK_CRYPTO_HASH_START BIT(3)
0046 #define RK_CRYPTO_BLOCK_START BIT(2)
0047 #define RK_CRYPTO_TDES_START BIT(1)
0048 #define RK_CRYPTO_AES_START BIT(0)
0049
0050 #define RK_CRYPTO_CONF 0x000c
0051
0052 #define RK_CRYPTO_HR_ADDR_MODE BIT(8)
0053
0054 #define RK_CRYPTO_BT_ADDR_MODE BIT(7)
0055
0056 #define RK_CRYPTO_BR_ADDR_MODE BIT(6)
0057 #define RK_CRYPTO_BYTESWAP_HRFIFO BIT(5)
0058 #define RK_CRYPTO_BYTESWAP_BTFIFO BIT(4)
0059 #define RK_CRYPTO_BYTESWAP_BRFIFO BIT(3)
0060
0061 #define RK_CRYPTO_DESSEL BIT(2)
0062 #define RK_CYYPTO_HASHINSEL_INDEPENDENT_SOURCE _SBF(0x00, 0)
0063 #define RK_CYYPTO_HASHINSEL_BLOCK_CIPHER_INPUT _SBF(0x01, 0)
0064 #define RK_CYYPTO_HASHINSEL_BLOCK_CIPHER_OUTPUT _SBF(0x02, 0)
0065
0066
0067 #define RK_CRYPTO_BRDMAS 0x0010
0068
0069 #define RK_CRYPTO_BTDMAS 0x0014
0070
0071 #define RK_CRYPTO_BRDMAL 0x0018
0072
0073 #define RK_CRYPTO_HRDMAS 0x001c
0074
0075 #define RK_CRYPTO_HRDMAL 0x0020
0076
0077
0078 #define RK_CRYPTO_AES_CTRL 0x0080
0079 #define RK_CRYPTO_AES_BYTESWAP_CNT BIT(11)
0080 #define RK_CRYPTO_AES_BYTESWAP_KEY BIT(10)
0081 #define RK_CRYPTO_AES_BYTESWAP_IV BIT(9)
0082 #define RK_CRYPTO_AES_BYTESWAP_DO BIT(8)
0083 #define RK_CRYPTO_AES_BYTESWAP_DI BIT(7)
0084 #define RK_CRYPTO_AES_KEY_CHANGE BIT(6)
0085 #define RK_CRYPTO_AES_ECB_MODE _SBF(0x00, 4)
0086 #define RK_CRYPTO_AES_CBC_MODE _SBF(0x01, 4)
0087 #define RK_CRYPTO_AES_CTR_MODE _SBF(0x02, 4)
0088 #define RK_CRYPTO_AES_128BIT_key _SBF(0x00, 2)
0089 #define RK_CRYPTO_AES_192BIT_key _SBF(0x01, 2)
0090 #define RK_CRYPTO_AES_256BIT_key _SBF(0x02, 2)
0091
0092 #define RK_CRYPTO_AES_FIFO_MODE BIT(1)
0093
0094 #define RK_CRYPTO_AES_DEC BIT(0)
0095
0096 #define RK_CRYPTO_AES_STS 0x0084
0097 #define RK_CRYPTO_AES_DONE BIT(0)
0098
0099
0100 #define RK_CRYPTO_AES_DIN_0 0x0088
0101 #define RK_CRYPTO_AES_DIN_1 0x008c
0102 #define RK_CRYPTO_AES_DIN_2 0x0090
0103 #define RK_CRYPTO_AES_DIN_3 0x0094
0104
0105
0106 #define RK_CRYPTO_AES_DOUT_0 0x0098
0107 #define RK_CRYPTO_AES_DOUT_1 0x009c
0108 #define RK_CRYPTO_AES_DOUT_2 0x00a0
0109 #define RK_CRYPTO_AES_DOUT_3 0x00a4
0110
0111
0112 #define RK_CRYPTO_AES_IV_0 0x00a8
0113 #define RK_CRYPTO_AES_IV_1 0x00ac
0114 #define RK_CRYPTO_AES_IV_2 0x00b0
0115 #define RK_CRYPTO_AES_IV_3 0x00b4
0116
0117
0118 #define RK_CRYPTO_AES_KEY_0 0x00b8
0119 #define RK_CRYPTO_AES_KEY_1 0x00bc
0120 #define RK_CRYPTO_AES_KEY_2 0x00c0
0121 #define RK_CRYPTO_AES_KEY_3 0x00c4
0122 #define RK_CRYPTO_AES_KEY_4 0x00c8
0123 #define RK_CRYPTO_AES_KEY_5 0x00cc
0124 #define RK_CRYPTO_AES_KEY_6 0x00d0
0125 #define RK_CRYPTO_AES_KEY_7 0x00d4
0126
0127
0128 #define RK_CRYPTO_TDES_CTRL 0x0100
0129 #define RK_CRYPTO_TDES_BYTESWAP_KEY BIT(8)
0130 #define RK_CRYPTO_TDES_BYTESWAP_IV BIT(7)
0131 #define RK_CRYPTO_TDES_BYTESWAP_DO BIT(6)
0132 #define RK_CRYPTO_TDES_BYTESWAP_DI BIT(5)
0133
0134 #define RK_CRYPTO_TDES_CHAINMODE_CBC BIT(4)
0135
0136 #define RK_CRYPTO_TDES_EEE BIT(3)
0137
0138 #define RK_CRYPTO_TDES_SELECT BIT(2)
0139
0140 #define RK_CRYPTO_TDES_FIFO_MODE BIT(1)
0141
0142 #define RK_CRYPTO_TDES_DEC BIT(0)
0143
0144 #define RK_CRYPTO_TDES_STS 0x0104
0145 #define RK_CRYPTO_TDES_DONE BIT(0)
0146
0147 #define RK_CRYPTO_TDES_DIN_0 0x0108
0148 #define RK_CRYPTO_TDES_DIN_1 0x010c
0149 #define RK_CRYPTO_TDES_DOUT_0 0x0110
0150 #define RK_CRYPTO_TDES_DOUT_1 0x0114
0151 #define RK_CRYPTO_TDES_IV_0 0x0118
0152 #define RK_CRYPTO_TDES_IV_1 0x011c
0153 #define RK_CRYPTO_TDES_KEY1_0 0x0120
0154 #define RK_CRYPTO_TDES_KEY1_1 0x0124
0155 #define RK_CRYPTO_TDES_KEY2_0 0x0128
0156 #define RK_CRYPTO_TDES_KEY2_1 0x012c
0157 #define RK_CRYPTO_TDES_KEY3_0 0x0130
0158 #define RK_CRYPTO_TDES_KEY3_1 0x0134
0159
0160
0161 #define RK_CRYPTO_HASH_CTRL 0x0180
0162 #define RK_CRYPTO_HASH_SWAP_DO BIT(3)
0163 #define RK_CRYPTO_HASH_SWAP_DI BIT(2)
0164 #define RK_CRYPTO_HASH_SHA1 _SBF(0x00, 0)
0165 #define RK_CRYPTO_HASH_MD5 _SBF(0x01, 0)
0166 #define RK_CRYPTO_HASH_SHA256 _SBF(0x02, 0)
0167 #define RK_CRYPTO_HASH_PRNG _SBF(0x03, 0)
0168
0169 #define RK_CRYPTO_HASH_STS 0x0184
0170 #define RK_CRYPTO_HASH_DONE BIT(0)
0171
0172 #define RK_CRYPTO_HASH_MSG_LEN 0x0188
0173 #define RK_CRYPTO_HASH_DOUT_0 0x018c
0174 #define RK_CRYPTO_HASH_DOUT_1 0x0190
0175 #define RK_CRYPTO_HASH_DOUT_2 0x0194
0176 #define RK_CRYPTO_HASH_DOUT_3 0x0198
0177 #define RK_CRYPTO_HASH_DOUT_4 0x019c
0178 #define RK_CRYPTO_HASH_DOUT_5 0x01a0
0179 #define RK_CRYPTO_HASH_DOUT_6 0x01a4
0180 #define RK_CRYPTO_HASH_DOUT_7 0x01a8
0181
0182 #define CRYPTO_READ(dev, offset) \
0183 readl_relaxed(((dev)->reg + (offset)))
0184 #define CRYPTO_WRITE(dev, offset, val) \
0185 writel_relaxed((val), ((dev)->reg + (offset)))
0186
0187 struct rk_crypto_info {
0188 struct device *dev;
0189 struct clk *aclk;
0190 struct clk *hclk;
0191 struct clk *sclk;
0192 struct clk *dmaclk;
0193 struct reset_control *rst;
0194 void __iomem *reg;
0195 int irq;
0196 struct crypto_queue queue;
0197 struct tasklet_struct queue_task;
0198 struct tasklet_struct done_task;
0199 struct crypto_async_request *async_req;
0200 int err;
0201
0202 spinlock_t lock;
0203
0204
0205 struct scatterlist *sg_src;
0206 struct scatterlist *sg_dst;
0207 struct scatterlist sg_tmp;
0208 struct scatterlist *first;
0209 unsigned int left_bytes;
0210 void *addr_vir;
0211 int aligned;
0212 int align_size;
0213 size_t src_nents;
0214 size_t dst_nents;
0215 unsigned int total;
0216 unsigned int count;
0217 dma_addr_t addr_in;
0218 dma_addr_t addr_out;
0219 bool busy;
0220 int (*start)(struct rk_crypto_info *dev);
0221 int (*update)(struct rk_crypto_info *dev);
0222 void (*complete)(struct crypto_async_request *base, int err);
0223 int (*enable_clk)(struct rk_crypto_info *dev);
0224 void (*disable_clk)(struct rk_crypto_info *dev);
0225 int (*load_data)(struct rk_crypto_info *dev,
0226 struct scatterlist *sg_src,
0227 struct scatterlist *sg_dst);
0228 void (*unload_data)(struct rk_crypto_info *dev);
0229 int (*enqueue)(struct rk_crypto_info *dev,
0230 struct crypto_async_request *async_req);
0231 };
0232
0233
0234 struct rk_ahash_ctx {
0235 struct rk_crypto_info *dev;
0236
0237 struct crypto_ahash *fallback_tfm;
0238 };
0239
0240
0241 struct rk_ahash_rctx {
0242 struct ahash_request fallback_req;
0243 u32 mode;
0244 };
0245
0246
0247 struct rk_cipher_ctx {
0248 struct rk_crypto_info *dev;
0249 unsigned int keylen;
0250 u32 mode;
0251 u8 iv[AES_BLOCK_SIZE];
0252 };
0253
0254 enum alg_type {
0255 ALG_TYPE_HASH,
0256 ALG_TYPE_CIPHER,
0257 };
0258
0259 struct rk_crypto_tmp {
0260 struct rk_crypto_info *dev;
0261 union {
0262 struct skcipher_alg skcipher;
0263 struct ahash_alg hash;
0264 } alg;
0265 enum alg_type type;
0266 };
0267
0268 extern struct rk_crypto_tmp rk_ecb_aes_alg;
0269 extern struct rk_crypto_tmp rk_cbc_aes_alg;
0270 extern struct rk_crypto_tmp rk_ecb_des_alg;
0271 extern struct rk_crypto_tmp rk_cbc_des_alg;
0272 extern struct rk_crypto_tmp rk_ecb_des3_ede_alg;
0273 extern struct rk_crypto_tmp rk_cbc_des3_ede_alg;
0274
0275 extern struct rk_crypto_tmp rk_ahash_sha1;
0276 extern struct rk_crypto_tmp rk_ahash_sha256;
0277 extern struct rk_crypto_tmp rk_ahash_md5;
0278
0279 #endif