1433cd2c6SZain Wang #ifndef __RK3288_CRYPTO_H__ 2433cd2c6SZain Wang #define __RK3288_CRYPTO_H__ 3433cd2c6SZain Wang 4433cd2c6SZain Wang #include <crypto/aes.h> 5433cd2c6SZain Wang #include <crypto/des.h> 6433cd2c6SZain Wang #include <crypto/algapi.h> 7433cd2c6SZain Wang #include <linux/interrupt.h> 8433cd2c6SZain Wang #include <linux/delay.h> 9433cd2c6SZain Wang 10433cd2c6SZain Wang #define _SBF(v, f) ((v) << (f)) 11433cd2c6SZain Wang 12433cd2c6SZain Wang /* Crypto control registers*/ 13433cd2c6SZain Wang #define RK_CRYPTO_INTSTS 0x0000 14433cd2c6SZain Wang #define RK_CRYPTO_PKA_DONE_INT BIT(5) 15433cd2c6SZain Wang #define RK_CRYPTO_HASH_DONE_INT BIT(4) 16433cd2c6SZain Wang #define RK_CRYPTO_HRDMA_ERR_INT BIT(3) 17433cd2c6SZain Wang #define RK_CRYPTO_HRDMA_DONE_INT BIT(2) 18433cd2c6SZain Wang #define RK_CRYPTO_BCDMA_ERR_INT BIT(1) 19433cd2c6SZain Wang #define RK_CRYPTO_BCDMA_DONE_INT BIT(0) 20433cd2c6SZain Wang 21433cd2c6SZain Wang #define RK_CRYPTO_INTENA 0x0004 22433cd2c6SZain Wang #define RK_CRYPTO_PKA_DONE_ENA BIT(5) 23433cd2c6SZain Wang #define RK_CRYPTO_HASH_DONE_ENA BIT(4) 24433cd2c6SZain Wang #define RK_CRYPTO_HRDMA_ERR_ENA BIT(3) 25433cd2c6SZain Wang #define RK_CRYPTO_HRDMA_DONE_ENA BIT(2) 26433cd2c6SZain Wang #define RK_CRYPTO_BCDMA_ERR_ENA BIT(1) 27433cd2c6SZain Wang #define RK_CRYPTO_BCDMA_DONE_ENA BIT(0) 28433cd2c6SZain Wang 29433cd2c6SZain Wang #define RK_CRYPTO_CTRL 0x0008 30433cd2c6SZain Wang #define RK_CRYPTO_WRITE_MASK _SBF(0xFFFF, 16) 31433cd2c6SZain Wang #define RK_CRYPTO_TRNG_FLUSH BIT(9) 32433cd2c6SZain Wang #define RK_CRYPTO_TRNG_START BIT(8) 33433cd2c6SZain Wang #define RK_CRYPTO_PKA_FLUSH BIT(7) 34433cd2c6SZain Wang #define RK_CRYPTO_HASH_FLUSH BIT(6) 35433cd2c6SZain Wang #define RK_CRYPTO_BLOCK_FLUSH BIT(5) 36433cd2c6SZain Wang #define RK_CRYPTO_PKA_START BIT(4) 37433cd2c6SZain Wang #define RK_CRYPTO_HASH_START BIT(3) 38433cd2c6SZain Wang #define RK_CRYPTO_BLOCK_START BIT(2) 39433cd2c6SZain Wang #define RK_CRYPTO_TDES_START BIT(1) 40433cd2c6SZain Wang #define RK_CRYPTO_AES_START BIT(0) 41433cd2c6SZain Wang 42433cd2c6SZain Wang #define RK_CRYPTO_CONF 0x000c 43433cd2c6SZain Wang /* HASH Receive DMA Address Mode: fix | increment */ 44433cd2c6SZain Wang #define RK_CRYPTO_HR_ADDR_MODE BIT(8) 45433cd2c6SZain Wang /* Block Transmit DMA Address Mode: fix | increment */ 46433cd2c6SZain Wang #define RK_CRYPTO_BT_ADDR_MODE BIT(7) 47433cd2c6SZain Wang /* Block Receive DMA Address Mode: fix | increment */ 48433cd2c6SZain Wang #define RK_CRYPTO_BR_ADDR_MODE BIT(6) 49433cd2c6SZain Wang #define RK_CRYPTO_BYTESWAP_HRFIFO BIT(5) 50433cd2c6SZain Wang #define RK_CRYPTO_BYTESWAP_BTFIFO BIT(4) 51433cd2c6SZain Wang #define RK_CRYPTO_BYTESWAP_BRFIFO BIT(3) 52433cd2c6SZain Wang /* AES = 0 OR DES = 1 */ 53433cd2c6SZain Wang #define RK_CRYPTO_DESSEL BIT(2) 54433cd2c6SZain Wang #define RK_CYYPTO_HASHINSEL_INDEPENDENT_SOURCE _SBF(0x00, 0) 55433cd2c6SZain Wang #define RK_CYYPTO_HASHINSEL_BLOCK_CIPHER_INPUT _SBF(0x01, 0) 56433cd2c6SZain Wang #define RK_CYYPTO_HASHINSEL_BLOCK_CIPHER_OUTPUT _SBF(0x02, 0) 57433cd2c6SZain Wang 58433cd2c6SZain Wang /* Block Receiving DMA Start Address Register */ 59433cd2c6SZain Wang #define RK_CRYPTO_BRDMAS 0x0010 60433cd2c6SZain Wang /* Block Transmitting DMA Start Address Register */ 61433cd2c6SZain Wang #define RK_CRYPTO_BTDMAS 0x0014 62433cd2c6SZain Wang /* Block Receiving DMA Length Register */ 63433cd2c6SZain Wang #define RK_CRYPTO_BRDMAL 0x0018 64433cd2c6SZain Wang /* Hash Receiving DMA Start Address Register */ 65433cd2c6SZain Wang #define RK_CRYPTO_HRDMAS 0x001c 66433cd2c6SZain Wang /* Hash Receiving DMA Length Register */ 67433cd2c6SZain Wang #define RK_CRYPTO_HRDMAL 0x0020 68433cd2c6SZain Wang 69433cd2c6SZain Wang /* AES registers */ 70433cd2c6SZain Wang #define RK_CRYPTO_AES_CTRL 0x0080 71433cd2c6SZain Wang #define RK_CRYPTO_AES_BYTESWAP_CNT BIT(11) 72433cd2c6SZain Wang #define RK_CRYPTO_AES_BYTESWAP_KEY BIT(10) 73433cd2c6SZain Wang #define RK_CRYPTO_AES_BYTESWAP_IV BIT(9) 74433cd2c6SZain Wang #define RK_CRYPTO_AES_BYTESWAP_DO BIT(8) 75433cd2c6SZain Wang #define RK_CRYPTO_AES_BYTESWAP_DI BIT(7) 76433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_CHANGE BIT(6) 77433cd2c6SZain Wang #define RK_CRYPTO_AES_ECB_MODE _SBF(0x00, 4) 78433cd2c6SZain Wang #define RK_CRYPTO_AES_CBC_MODE _SBF(0x01, 4) 79433cd2c6SZain Wang #define RK_CRYPTO_AES_CTR_MODE _SBF(0x02, 4) 80433cd2c6SZain Wang #define RK_CRYPTO_AES_128BIT_key _SBF(0x00, 2) 81433cd2c6SZain Wang #define RK_CRYPTO_AES_192BIT_key _SBF(0x01, 2) 82433cd2c6SZain Wang #define RK_CRYPTO_AES_256BIT_key _SBF(0x02, 2) 83433cd2c6SZain Wang /* Slave = 0 / fifo = 1 */ 84433cd2c6SZain Wang #define RK_CRYPTO_AES_FIFO_MODE BIT(1) 85433cd2c6SZain Wang /* Encryption = 0 , Decryption = 1 */ 86433cd2c6SZain Wang #define RK_CRYPTO_AES_DEC BIT(0) 87433cd2c6SZain Wang 88433cd2c6SZain Wang #define RK_CRYPTO_AES_STS 0x0084 89433cd2c6SZain Wang #define RK_CRYPTO_AES_DONE BIT(0) 90433cd2c6SZain Wang 91433cd2c6SZain Wang /* AES Input Data 0-3 Register */ 92433cd2c6SZain Wang #define RK_CRYPTO_AES_DIN_0 0x0088 93433cd2c6SZain Wang #define RK_CRYPTO_AES_DIN_1 0x008c 94433cd2c6SZain Wang #define RK_CRYPTO_AES_DIN_2 0x0090 95433cd2c6SZain Wang #define RK_CRYPTO_AES_DIN_3 0x0094 96433cd2c6SZain Wang 97433cd2c6SZain Wang /* AES output Data 0-3 Register */ 98433cd2c6SZain Wang #define RK_CRYPTO_AES_DOUT_0 0x0098 99433cd2c6SZain Wang #define RK_CRYPTO_AES_DOUT_1 0x009c 100433cd2c6SZain Wang #define RK_CRYPTO_AES_DOUT_2 0x00a0 101433cd2c6SZain Wang #define RK_CRYPTO_AES_DOUT_3 0x00a4 102433cd2c6SZain Wang 103433cd2c6SZain Wang /* AES IV Data 0-3 Register */ 104433cd2c6SZain Wang #define RK_CRYPTO_AES_IV_0 0x00a8 105433cd2c6SZain Wang #define RK_CRYPTO_AES_IV_1 0x00ac 106433cd2c6SZain Wang #define RK_CRYPTO_AES_IV_2 0x00b0 107433cd2c6SZain Wang #define RK_CRYPTO_AES_IV_3 0x00b4 108433cd2c6SZain Wang 109433cd2c6SZain Wang /* AES Key Data 0-3 Register */ 110433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_0 0x00b8 111433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_1 0x00bc 112433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_2 0x00c0 113433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_3 0x00c4 114433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_4 0x00c8 115433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_5 0x00cc 116433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_6 0x00d0 117433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_7 0x00d4 118433cd2c6SZain Wang 119433cd2c6SZain Wang /* des/tdes */ 120433cd2c6SZain Wang #define RK_CRYPTO_TDES_CTRL 0x0100 121433cd2c6SZain Wang #define RK_CRYPTO_TDES_BYTESWAP_KEY BIT(8) 122433cd2c6SZain Wang #define RK_CRYPTO_TDES_BYTESWAP_IV BIT(7) 123433cd2c6SZain Wang #define RK_CRYPTO_TDES_BYTESWAP_DO BIT(6) 124433cd2c6SZain Wang #define RK_CRYPTO_TDES_BYTESWAP_DI BIT(5) 125433cd2c6SZain Wang /* 0: ECB, 1: CBC */ 126433cd2c6SZain Wang #define RK_CRYPTO_TDES_CHAINMODE_CBC BIT(4) 127433cd2c6SZain Wang /* TDES Key Mode, 0 : EDE, 1 : EEE */ 128433cd2c6SZain Wang #define RK_CRYPTO_TDES_EEE BIT(3) 129433cd2c6SZain Wang /* 0: DES, 1:TDES */ 130433cd2c6SZain Wang #define RK_CRYPTO_TDES_SELECT BIT(2) 131433cd2c6SZain Wang /* 0: Slave, 1:Fifo */ 132433cd2c6SZain Wang #define RK_CRYPTO_TDES_FIFO_MODE BIT(1) 133433cd2c6SZain Wang /* Encryption = 0 , Decryption = 1 */ 134433cd2c6SZain Wang #define RK_CRYPTO_TDES_DEC BIT(0) 135433cd2c6SZain Wang 136433cd2c6SZain Wang #define RK_CRYPTO_TDES_STS 0x0104 137433cd2c6SZain Wang #define RK_CRYPTO_TDES_DONE BIT(0) 138433cd2c6SZain Wang 139433cd2c6SZain Wang #define RK_CRYPTO_TDES_DIN_0 0x0108 140433cd2c6SZain Wang #define RK_CRYPTO_TDES_DIN_1 0x010c 141433cd2c6SZain Wang #define RK_CRYPTO_TDES_DOUT_0 0x0110 142433cd2c6SZain Wang #define RK_CRYPTO_TDES_DOUT_1 0x0114 143433cd2c6SZain Wang #define RK_CRYPTO_TDES_IV_0 0x0118 144433cd2c6SZain Wang #define RK_CRYPTO_TDES_IV_1 0x011c 145433cd2c6SZain Wang #define RK_CRYPTO_TDES_KEY1_0 0x0120 146433cd2c6SZain Wang #define RK_CRYPTO_TDES_KEY1_1 0x0124 147433cd2c6SZain Wang #define RK_CRYPTO_TDES_KEY2_0 0x0128 148433cd2c6SZain Wang #define RK_CRYPTO_TDES_KEY2_1 0x012c 149433cd2c6SZain Wang #define RK_CRYPTO_TDES_KEY3_0 0x0130 150433cd2c6SZain Wang #define RK_CRYPTO_TDES_KEY3_1 0x0134 151433cd2c6SZain Wang 152433cd2c6SZain Wang #define CRYPTO_READ(dev, offset) \ 153433cd2c6SZain Wang readl_relaxed(((dev)->reg + (offset))) 154433cd2c6SZain Wang #define CRYPTO_WRITE(dev, offset, val) \ 155433cd2c6SZain Wang writel_relaxed((val), ((dev)->reg + (offset))) 156433cd2c6SZain Wang 157433cd2c6SZain Wang struct rk_crypto_info { 158433cd2c6SZain Wang struct device *dev; 159433cd2c6SZain Wang struct clk *aclk; 160433cd2c6SZain Wang struct clk *hclk; 161433cd2c6SZain Wang struct clk *sclk; 162433cd2c6SZain Wang struct clk *dmaclk; 163433cd2c6SZain Wang struct reset_control *rst; 164433cd2c6SZain Wang void __iomem *reg; 165433cd2c6SZain Wang int irq; 166433cd2c6SZain Wang struct crypto_queue queue; 167433cd2c6SZain Wang struct tasklet_struct crypto_tasklet; 168433cd2c6SZain Wang struct ablkcipher_request *ablk_req; 169433cd2c6SZain Wang /* device lock */ 170433cd2c6SZain Wang spinlock_t lock; 171433cd2c6SZain Wang 172433cd2c6SZain Wang /* the public variable */ 173433cd2c6SZain Wang struct scatterlist *sg_src; 174433cd2c6SZain Wang struct scatterlist *sg_dst; 175433cd2c6SZain Wang struct scatterlist sg_tmp; 176433cd2c6SZain Wang struct scatterlist *first; 177433cd2c6SZain Wang unsigned int left_bytes; 178433cd2c6SZain Wang void *addr_vir; 179433cd2c6SZain Wang int aligned; 180433cd2c6SZain Wang int align_size; 181433cd2c6SZain Wang size_t nents; 182433cd2c6SZain Wang unsigned int total; 183433cd2c6SZain Wang unsigned int count; 184433cd2c6SZain Wang u32 mode; 185433cd2c6SZain Wang dma_addr_t addr_in; 186433cd2c6SZain Wang dma_addr_t addr_out; 187433cd2c6SZain Wang int (*start)(struct rk_crypto_info *dev); 188433cd2c6SZain Wang int (*update)(struct rk_crypto_info *dev); 189433cd2c6SZain Wang void (*complete)(struct rk_crypto_info *dev, int err); 190433cd2c6SZain Wang int (*enable_clk)(struct rk_crypto_info *dev); 191433cd2c6SZain Wang void (*disable_clk)(struct rk_crypto_info *dev); 192433cd2c6SZain Wang int (*load_data)(struct rk_crypto_info *dev, 193433cd2c6SZain Wang struct scatterlist *sg_src, 194433cd2c6SZain Wang struct scatterlist *sg_dst); 195433cd2c6SZain Wang void (*unload_data)(struct rk_crypto_info *dev); 196433cd2c6SZain Wang }; 197433cd2c6SZain Wang 198433cd2c6SZain Wang /* the private variable of cipher */ 199433cd2c6SZain Wang struct rk_cipher_ctx { 200433cd2c6SZain Wang struct rk_crypto_info *dev; 201433cd2c6SZain Wang unsigned int keylen; 202433cd2c6SZain Wang }; 203433cd2c6SZain Wang 204433cd2c6SZain Wang struct rk_crypto_tmp { 205433cd2c6SZain Wang struct rk_crypto_info *dev; 206433cd2c6SZain Wang struct crypto_alg alg; 207433cd2c6SZain Wang }; 208433cd2c6SZain Wang 209433cd2c6SZain Wang extern struct rk_crypto_tmp rk_ecb_aes_alg; 210433cd2c6SZain Wang extern struct rk_crypto_tmp rk_cbc_aes_alg; 211433cd2c6SZain Wang extern struct rk_crypto_tmp rk_ecb_des_alg; 212433cd2c6SZain Wang extern struct rk_crypto_tmp rk_cbc_des_alg; 213433cd2c6SZain Wang extern struct rk_crypto_tmp rk_ecb_des3_ede_alg; 214433cd2c6SZain Wang extern struct rk_crypto_tmp rk_cbc_des3_ede_alg; 215433cd2c6SZain Wang 216433cd2c6SZain Wang #endif 217