Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
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 /* Crypto control registers*/
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 /* HASH Receive DMA Address Mode:   fix | increment */
0052 #define RK_CRYPTO_HR_ADDR_MODE      BIT(8)
0053 /* Block Transmit DMA Address Mode: fix | increment */
0054 #define RK_CRYPTO_BT_ADDR_MODE      BIT(7)
0055 /* Block Receive DMA Address Mode:  fix | increment */
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 /* AES = 0 OR DES = 1 */
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 /* Block Receiving DMA Start Address Register */
0067 #define RK_CRYPTO_BRDMAS        0x0010
0068 /* Block Transmitting DMA Start Address Register */
0069 #define RK_CRYPTO_BTDMAS        0x0014
0070 /* Block Receiving DMA Length Register */
0071 #define RK_CRYPTO_BRDMAL        0x0018
0072 /* Hash Receiving DMA Start Address Register */
0073 #define RK_CRYPTO_HRDMAS        0x001c
0074 /* Hash Receiving DMA Length Register */
0075 #define RK_CRYPTO_HRDMAL        0x0020
0076 
0077 /* AES registers */
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 /* Slave = 0 / fifo = 1 */
0092 #define RK_CRYPTO_AES_FIFO_MODE     BIT(1)
0093 /* Encryption = 0 , Decryption = 1 */
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 /* AES Input Data 0-3 Register */
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 /* AES output Data 0-3 Register */
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 /* AES IV Data 0-3 Register */
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 /* AES Key Data 0-3 Register */
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 /* des/tdes */
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 /* 0: ECB, 1: CBC */
0134 #define RK_CRYPTO_TDES_CHAINMODE_CBC    BIT(4)
0135 /* TDES Key Mode, 0 : EDE, 1 : EEE */
0136 #define RK_CRYPTO_TDES_EEE      BIT(3)
0137 /* 0: DES, 1:TDES */
0138 #define RK_CRYPTO_TDES_SELECT       BIT(2)
0139 /* 0: Slave, 1:Fifo */
0140 #define RK_CRYPTO_TDES_FIFO_MODE    BIT(1)
0141 /* Encryption = 0 , Decryption = 1 */
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 /* HASH */
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     /* device lock */
0202     spinlock_t          lock;
0203 
0204     /* the public variable */
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 /* the private variable of hash */
0234 struct rk_ahash_ctx {
0235     struct rk_crypto_info       *dev;
0236     /* for fallback */
0237     struct crypto_ahash     *fallback_tfm;
0238 };
0239 
0240 /* the privete variable of hash for fallback */
0241 struct rk_ahash_rctx {
0242     struct ahash_request        fallback_req;
0243     u32             mode;
0244 };
0245 
0246 /* the private variable of cipher */
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