1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2433cd2c6SZain Wang #ifndef __RK3288_CRYPTO_H__ 3433cd2c6SZain Wang #define __RK3288_CRYPTO_H__ 4433cd2c6SZain Wang 5433cd2c6SZain Wang #include <crypto/aes.h> 657d67c6eSCorentin Labbe #include <crypto/engine.h> 7*1a15d26cSHerbert Xu #include <crypto/internal/des.h> 8bfd927ffSZain Wang #include <crypto/internal/hash.h> 9ce0183cbSArd Biesheuvel #include <crypto/internal/skcipher.h> 10bfd927ffSZain Wang #include <crypto/md5.h> 11a24d22b2SEric Biggers #include <crypto/sha1.h> 12a24d22b2SEric Biggers #include <crypto/sha2.h> 13*1a15d26cSHerbert Xu #include <linux/dma-mapping.h> 14*1a15d26cSHerbert Xu #include <linux/interrupt.h> 15*1a15d26cSHerbert Xu #include <linux/pm_runtime.h> 16*1a15d26cSHerbert Xu #include <linux/scatterlist.h> 17*1a15d26cSHerbert Xu #include <linux/types.h> 18433cd2c6SZain Wang 19433cd2c6SZain Wang #define _SBF(v, f) ((v) << (f)) 20433cd2c6SZain Wang 21433cd2c6SZain Wang /* Crypto control registers*/ 22433cd2c6SZain Wang #define RK_CRYPTO_INTSTS 0x0000 23433cd2c6SZain Wang #define RK_CRYPTO_PKA_DONE_INT BIT(5) 24433cd2c6SZain Wang #define RK_CRYPTO_HASH_DONE_INT BIT(4) 25433cd2c6SZain Wang #define RK_CRYPTO_HRDMA_ERR_INT BIT(3) 26433cd2c6SZain Wang #define RK_CRYPTO_HRDMA_DONE_INT BIT(2) 27433cd2c6SZain Wang #define RK_CRYPTO_BCDMA_ERR_INT BIT(1) 28433cd2c6SZain Wang #define RK_CRYPTO_BCDMA_DONE_INT BIT(0) 29433cd2c6SZain Wang 30433cd2c6SZain Wang #define RK_CRYPTO_INTENA 0x0004 31433cd2c6SZain Wang #define RK_CRYPTO_PKA_DONE_ENA BIT(5) 32433cd2c6SZain Wang #define RK_CRYPTO_HASH_DONE_ENA BIT(4) 33433cd2c6SZain Wang #define RK_CRYPTO_HRDMA_ERR_ENA BIT(3) 34433cd2c6SZain Wang #define RK_CRYPTO_HRDMA_DONE_ENA BIT(2) 35433cd2c6SZain Wang #define RK_CRYPTO_BCDMA_ERR_ENA BIT(1) 36433cd2c6SZain Wang #define RK_CRYPTO_BCDMA_DONE_ENA BIT(0) 37433cd2c6SZain Wang 38433cd2c6SZain Wang #define RK_CRYPTO_CTRL 0x0008 39433cd2c6SZain Wang #define RK_CRYPTO_WRITE_MASK _SBF(0xFFFF, 16) 40433cd2c6SZain Wang #define RK_CRYPTO_TRNG_FLUSH BIT(9) 41433cd2c6SZain Wang #define RK_CRYPTO_TRNG_START BIT(8) 42433cd2c6SZain Wang #define RK_CRYPTO_PKA_FLUSH BIT(7) 43433cd2c6SZain Wang #define RK_CRYPTO_HASH_FLUSH BIT(6) 44433cd2c6SZain Wang #define RK_CRYPTO_BLOCK_FLUSH BIT(5) 45433cd2c6SZain Wang #define RK_CRYPTO_PKA_START BIT(4) 46433cd2c6SZain Wang #define RK_CRYPTO_HASH_START BIT(3) 47433cd2c6SZain Wang #define RK_CRYPTO_BLOCK_START BIT(2) 48433cd2c6SZain Wang #define RK_CRYPTO_TDES_START BIT(1) 49433cd2c6SZain Wang #define RK_CRYPTO_AES_START BIT(0) 50433cd2c6SZain Wang 51433cd2c6SZain Wang #define RK_CRYPTO_CONF 0x000c 52433cd2c6SZain Wang /* HASH Receive DMA Address Mode: fix | increment */ 53433cd2c6SZain Wang #define RK_CRYPTO_HR_ADDR_MODE BIT(8) 54433cd2c6SZain Wang /* Block Transmit DMA Address Mode: fix | increment */ 55433cd2c6SZain Wang #define RK_CRYPTO_BT_ADDR_MODE BIT(7) 56433cd2c6SZain Wang /* Block Receive DMA Address Mode: fix | increment */ 57433cd2c6SZain Wang #define RK_CRYPTO_BR_ADDR_MODE BIT(6) 58433cd2c6SZain Wang #define RK_CRYPTO_BYTESWAP_HRFIFO BIT(5) 59433cd2c6SZain Wang #define RK_CRYPTO_BYTESWAP_BTFIFO BIT(4) 60433cd2c6SZain Wang #define RK_CRYPTO_BYTESWAP_BRFIFO BIT(3) 61433cd2c6SZain Wang /* AES = 0 OR DES = 1 */ 62433cd2c6SZain Wang #define RK_CRYPTO_DESSEL BIT(2) 63433cd2c6SZain Wang #define RK_CYYPTO_HASHINSEL_INDEPENDENT_SOURCE _SBF(0x00, 0) 64433cd2c6SZain Wang #define RK_CYYPTO_HASHINSEL_BLOCK_CIPHER_INPUT _SBF(0x01, 0) 65433cd2c6SZain Wang #define RK_CYYPTO_HASHINSEL_BLOCK_CIPHER_OUTPUT _SBF(0x02, 0) 66433cd2c6SZain Wang 67433cd2c6SZain Wang /* Block Receiving DMA Start Address Register */ 68433cd2c6SZain Wang #define RK_CRYPTO_BRDMAS 0x0010 69433cd2c6SZain Wang /* Block Transmitting DMA Start Address Register */ 70433cd2c6SZain Wang #define RK_CRYPTO_BTDMAS 0x0014 71433cd2c6SZain Wang /* Block Receiving DMA Length Register */ 72433cd2c6SZain Wang #define RK_CRYPTO_BRDMAL 0x0018 73433cd2c6SZain Wang /* Hash Receiving DMA Start Address Register */ 74433cd2c6SZain Wang #define RK_CRYPTO_HRDMAS 0x001c 75433cd2c6SZain Wang /* Hash Receiving DMA Length Register */ 76433cd2c6SZain Wang #define RK_CRYPTO_HRDMAL 0x0020 77433cd2c6SZain Wang 78433cd2c6SZain Wang /* AES registers */ 79433cd2c6SZain Wang #define RK_CRYPTO_AES_CTRL 0x0080 80433cd2c6SZain Wang #define RK_CRYPTO_AES_BYTESWAP_CNT BIT(11) 81433cd2c6SZain Wang #define RK_CRYPTO_AES_BYTESWAP_KEY BIT(10) 82433cd2c6SZain Wang #define RK_CRYPTO_AES_BYTESWAP_IV BIT(9) 83433cd2c6SZain Wang #define RK_CRYPTO_AES_BYTESWAP_DO BIT(8) 84433cd2c6SZain Wang #define RK_CRYPTO_AES_BYTESWAP_DI BIT(7) 85433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_CHANGE BIT(6) 86433cd2c6SZain Wang #define RK_CRYPTO_AES_ECB_MODE _SBF(0x00, 4) 87433cd2c6SZain Wang #define RK_CRYPTO_AES_CBC_MODE _SBF(0x01, 4) 88433cd2c6SZain Wang #define RK_CRYPTO_AES_CTR_MODE _SBF(0x02, 4) 89433cd2c6SZain Wang #define RK_CRYPTO_AES_128BIT_key _SBF(0x00, 2) 90433cd2c6SZain Wang #define RK_CRYPTO_AES_192BIT_key _SBF(0x01, 2) 91433cd2c6SZain Wang #define RK_CRYPTO_AES_256BIT_key _SBF(0x02, 2) 92433cd2c6SZain Wang /* Slave = 0 / fifo = 1 */ 93433cd2c6SZain Wang #define RK_CRYPTO_AES_FIFO_MODE BIT(1) 94433cd2c6SZain Wang /* Encryption = 0 , Decryption = 1 */ 95433cd2c6SZain Wang #define RK_CRYPTO_AES_DEC BIT(0) 96433cd2c6SZain Wang 97433cd2c6SZain Wang #define RK_CRYPTO_AES_STS 0x0084 98433cd2c6SZain Wang #define RK_CRYPTO_AES_DONE BIT(0) 99433cd2c6SZain Wang 100433cd2c6SZain Wang /* AES Input Data 0-3 Register */ 101433cd2c6SZain Wang #define RK_CRYPTO_AES_DIN_0 0x0088 102433cd2c6SZain Wang #define RK_CRYPTO_AES_DIN_1 0x008c 103433cd2c6SZain Wang #define RK_CRYPTO_AES_DIN_2 0x0090 104433cd2c6SZain Wang #define RK_CRYPTO_AES_DIN_3 0x0094 105433cd2c6SZain Wang 106433cd2c6SZain Wang /* AES output Data 0-3 Register */ 107433cd2c6SZain Wang #define RK_CRYPTO_AES_DOUT_0 0x0098 108433cd2c6SZain Wang #define RK_CRYPTO_AES_DOUT_1 0x009c 109433cd2c6SZain Wang #define RK_CRYPTO_AES_DOUT_2 0x00a0 110433cd2c6SZain Wang #define RK_CRYPTO_AES_DOUT_3 0x00a4 111433cd2c6SZain Wang 112433cd2c6SZain Wang /* AES IV Data 0-3 Register */ 113433cd2c6SZain Wang #define RK_CRYPTO_AES_IV_0 0x00a8 114433cd2c6SZain Wang #define RK_CRYPTO_AES_IV_1 0x00ac 115433cd2c6SZain Wang #define RK_CRYPTO_AES_IV_2 0x00b0 116433cd2c6SZain Wang #define RK_CRYPTO_AES_IV_3 0x00b4 117433cd2c6SZain Wang 118433cd2c6SZain Wang /* AES Key Data 0-3 Register */ 119433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_0 0x00b8 120433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_1 0x00bc 121433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_2 0x00c0 122433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_3 0x00c4 123433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_4 0x00c8 124433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_5 0x00cc 125433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_6 0x00d0 126433cd2c6SZain Wang #define RK_CRYPTO_AES_KEY_7 0x00d4 127433cd2c6SZain Wang 128433cd2c6SZain Wang /* des/tdes */ 129433cd2c6SZain Wang #define RK_CRYPTO_TDES_CTRL 0x0100 130433cd2c6SZain Wang #define RK_CRYPTO_TDES_BYTESWAP_KEY BIT(8) 131433cd2c6SZain Wang #define RK_CRYPTO_TDES_BYTESWAP_IV BIT(7) 132433cd2c6SZain Wang #define RK_CRYPTO_TDES_BYTESWAP_DO BIT(6) 133433cd2c6SZain Wang #define RK_CRYPTO_TDES_BYTESWAP_DI BIT(5) 134433cd2c6SZain Wang /* 0: ECB, 1: CBC */ 135433cd2c6SZain Wang #define RK_CRYPTO_TDES_CHAINMODE_CBC BIT(4) 136433cd2c6SZain Wang /* TDES Key Mode, 0 : EDE, 1 : EEE */ 137433cd2c6SZain Wang #define RK_CRYPTO_TDES_EEE BIT(3) 138433cd2c6SZain Wang /* 0: DES, 1:TDES */ 139433cd2c6SZain Wang #define RK_CRYPTO_TDES_SELECT BIT(2) 140433cd2c6SZain Wang /* 0: Slave, 1:Fifo */ 141433cd2c6SZain Wang #define RK_CRYPTO_TDES_FIFO_MODE BIT(1) 142433cd2c6SZain Wang /* Encryption = 0 , Decryption = 1 */ 143433cd2c6SZain Wang #define RK_CRYPTO_TDES_DEC BIT(0) 144433cd2c6SZain Wang 145433cd2c6SZain Wang #define RK_CRYPTO_TDES_STS 0x0104 146433cd2c6SZain Wang #define RK_CRYPTO_TDES_DONE BIT(0) 147433cd2c6SZain Wang 148433cd2c6SZain Wang #define RK_CRYPTO_TDES_DIN_0 0x0108 149433cd2c6SZain Wang #define RK_CRYPTO_TDES_DIN_1 0x010c 150433cd2c6SZain Wang #define RK_CRYPTO_TDES_DOUT_0 0x0110 151433cd2c6SZain Wang #define RK_CRYPTO_TDES_DOUT_1 0x0114 152433cd2c6SZain Wang #define RK_CRYPTO_TDES_IV_0 0x0118 153433cd2c6SZain Wang #define RK_CRYPTO_TDES_IV_1 0x011c 154433cd2c6SZain Wang #define RK_CRYPTO_TDES_KEY1_0 0x0120 155433cd2c6SZain Wang #define RK_CRYPTO_TDES_KEY1_1 0x0124 156433cd2c6SZain Wang #define RK_CRYPTO_TDES_KEY2_0 0x0128 157433cd2c6SZain Wang #define RK_CRYPTO_TDES_KEY2_1 0x012c 158433cd2c6SZain Wang #define RK_CRYPTO_TDES_KEY3_0 0x0130 159433cd2c6SZain Wang #define RK_CRYPTO_TDES_KEY3_1 0x0134 160433cd2c6SZain Wang 161bfd927ffSZain Wang /* HASH */ 162bfd927ffSZain Wang #define RK_CRYPTO_HASH_CTRL 0x0180 163bfd927ffSZain Wang #define RK_CRYPTO_HASH_SWAP_DO BIT(3) 164bfd927ffSZain Wang #define RK_CRYPTO_HASH_SWAP_DI BIT(2) 165bfd927ffSZain Wang #define RK_CRYPTO_HASH_SHA1 _SBF(0x00, 0) 166bfd927ffSZain Wang #define RK_CRYPTO_HASH_MD5 _SBF(0x01, 0) 167bfd927ffSZain Wang #define RK_CRYPTO_HASH_SHA256 _SBF(0x02, 0) 168bfd927ffSZain Wang #define RK_CRYPTO_HASH_PRNG _SBF(0x03, 0) 169bfd927ffSZain Wang 170bfd927ffSZain Wang #define RK_CRYPTO_HASH_STS 0x0184 171bfd927ffSZain Wang #define RK_CRYPTO_HASH_DONE BIT(0) 172bfd927ffSZain Wang 173bfd927ffSZain Wang #define RK_CRYPTO_HASH_MSG_LEN 0x0188 174bfd927ffSZain Wang #define RK_CRYPTO_HASH_DOUT_0 0x018c 175bfd927ffSZain Wang #define RK_CRYPTO_HASH_DOUT_1 0x0190 176bfd927ffSZain Wang #define RK_CRYPTO_HASH_DOUT_2 0x0194 177bfd927ffSZain Wang #define RK_CRYPTO_HASH_DOUT_3 0x0198 178bfd927ffSZain Wang #define RK_CRYPTO_HASH_DOUT_4 0x019c 179bfd927ffSZain Wang #define RK_CRYPTO_HASH_DOUT_5 0x01a0 180bfd927ffSZain Wang #define RK_CRYPTO_HASH_DOUT_6 0x01a4 181bfd927ffSZain Wang #define RK_CRYPTO_HASH_DOUT_7 0x01a8 182bfd927ffSZain Wang 183433cd2c6SZain Wang #define CRYPTO_READ(dev, offset) \ 184433cd2c6SZain Wang readl_relaxed(((dev)->reg + (offset))) 185433cd2c6SZain Wang #define CRYPTO_WRITE(dev, offset, val) \ 186433cd2c6SZain Wang writel_relaxed((val), ((dev)->reg + (offset))) 187433cd2c6SZain Wang 188e220e671SCorentin Labbe #define RK_MAX_CLKS 4 189e220e671SCorentin Labbe 1909dcd71c8SCorentin Labbe /* 1919dcd71c8SCorentin Labbe * struct rockchip_ip - struct for managing a list of RK crypto instance 1929dcd71c8SCorentin Labbe * @dev_list: Used for doing a list of rk_crypto_info 1939dcd71c8SCorentin Labbe * @lock: Control access to dev_list 1949dcd71c8SCorentin Labbe * @dbgfs_dir: Debugfs dentry for statistic directory 1959dcd71c8SCorentin Labbe * @dbgfs_stats: Debugfs dentry for statistic counters 1969dcd71c8SCorentin Labbe */ 1979dcd71c8SCorentin Labbe struct rockchip_ip { 1989dcd71c8SCorentin Labbe struct list_head dev_list; 1999dcd71c8SCorentin Labbe spinlock_t lock; /* Control access to dev_list */ 2009dcd71c8SCorentin Labbe struct dentry *dbgfs_dir; 2019dcd71c8SCorentin Labbe struct dentry *dbgfs_stats; 2029dcd71c8SCorentin Labbe }; 2039dcd71c8SCorentin Labbe 204e220e671SCorentin Labbe struct rk_clks { 205e220e671SCorentin Labbe const char *name; 206e220e671SCorentin Labbe unsigned long max; 207e220e671SCorentin Labbe }; 208e220e671SCorentin Labbe 209e220e671SCorentin Labbe struct rk_variant { 210e220e671SCorentin Labbe int num_clks; 211e220e671SCorentin Labbe struct rk_clks rkclks[RK_MAX_CLKS]; 212e220e671SCorentin Labbe }; 213e220e671SCorentin Labbe 214433cd2c6SZain Wang struct rk_crypto_info { 2159dcd71c8SCorentin Labbe struct list_head list; 216433cd2c6SZain Wang struct device *dev; 2173a6fd464SCorentin Labbe struct clk_bulk_data *clks; 2183a6fd464SCorentin Labbe int num_clks; 219433cd2c6SZain Wang struct reset_control *rst; 220433cd2c6SZain Wang void __iomem *reg; 221433cd2c6SZain Wang int irq; 222e220e671SCorentin Labbe const struct rk_variant *variant; 2239dcd71c8SCorentin Labbe unsigned long nreq; 22457d67c6eSCorentin Labbe struct crypto_engine *engine; 22557d67c6eSCorentin Labbe struct completion complete; 22657d67c6eSCorentin Labbe int status; 227433cd2c6SZain Wang }; 228433cd2c6SZain Wang 229bfd927ffSZain Wang /* the private variable of hash */ 230bfd927ffSZain Wang struct rk_ahash_ctx { 231bfd927ffSZain Wang /* for fallback */ 232bfd927ffSZain Wang struct crypto_ahash *fallback_tfm; 233bfd927ffSZain Wang }; 234bfd927ffSZain Wang 2356d11c938SCorentin Labbe /* the private variable of hash for fallback */ 236bfd927ffSZain Wang struct rk_ahash_rctx { 2372d3c756aSCorentin Labbe struct rk_crypto_info *dev; 238bfd927ffSZain Wang struct ahash_request fallback_req; 2395a7801f6SZain Wang u32 mode; 24057d67c6eSCorentin Labbe int nrsg; 241bfd927ffSZain Wang }; 242bfd927ffSZain Wang 243433cd2c6SZain Wang /* the private variable of cipher */ 244433cd2c6SZain Wang struct rk_cipher_ctx { 245433cd2c6SZain Wang unsigned int keylen; 246d6b23cceSCorentin Labbe u8 key[AES_MAX_KEY_SIZE]; 247c1c214adSZhang Zhijie u8 iv[AES_BLOCK_SIZE]; 24868ef8af0SCorentin Labbe struct crypto_skcipher *fallback_tfm; 249433cd2c6SZain Wang }; 250433cd2c6SZain Wang 25187e356c4SCorentin Labbe struct rk_cipher_rctx { 2522d3c756aSCorentin Labbe struct rk_crypto_info *dev; 25357d67c6eSCorentin Labbe u8 backup_iv[AES_BLOCK_SIZE]; 25487e356c4SCorentin Labbe u32 mode; 25568ef8af0SCorentin Labbe struct skcipher_request fallback_req; // keep at the end 25687e356c4SCorentin Labbe }; 25787e356c4SCorentin Labbe 258433cd2c6SZain Wang struct rk_crypto_tmp { 2596d55c4a2SCorentin Labbe u32 type; 260433cd2c6SZain Wang struct rk_crypto_info *dev; 261bfd927ffSZain Wang union { 262*1a15d26cSHerbert Xu struct skcipher_engine_alg skcipher; 263*1a15d26cSHerbert Xu struct ahash_engine_alg hash; 264bfd927ffSZain Wang } alg; 26548d904d4SCorentin Labbe unsigned long stat_req; 26648d904d4SCorentin Labbe unsigned long stat_fb; 26748d904d4SCorentin Labbe unsigned long stat_fb_len; 26848d904d4SCorentin Labbe unsigned long stat_fb_sglen; 26948d904d4SCorentin Labbe unsigned long stat_fb_align; 27048d904d4SCorentin Labbe unsigned long stat_fb_sgdiff; 271433cd2c6SZain Wang }; 272433cd2c6SZain Wang 273433cd2c6SZain Wang extern struct rk_crypto_tmp rk_ecb_aes_alg; 274433cd2c6SZain Wang extern struct rk_crypto_tmp rk_cbc_aes_alg; 275433cd2c6SZain Wang extern struct rk_crypto_tmp rk_ecb_des_alg; 276433cd2c6SZain Wang extern struct rk_crypto_tmp rk_cbc_des_alg; 277433cd2c6SZain Wang extern struct rk_crypto_tmp rk_ecb_des3_ede_alg; 278433cd2c6SZain Wang extern struct rk_crypto_tmp rk_cbc_des3_ede_alg; 279433cd2c6SZain Wang 280bfd927ffSZain Wang extern struct rk_crypto_tmp rk_ahash_sha1; 281bfd927ffSZain Wang extern struct rk_crypto_tmp rk_ahash_sha256; 282bfd927ffSZain Wang extern struct rk_crypto_tmp rk_ahash_md5; 283bfd927ffSZain Wang 2849dcd71c8SCorentin Labbe struct rk_crypto_info *get_rk_crypto(void); 285433cd2c6SZain Wang #endif 286