1*9739f5f9SChristian Marangi /* SPDX-License-Identifier: GPL-2.0 2*9739f5f9SChristian Marangi * 3*9739f5f9SChristian Marangi * Copyright (C) 2019 - 2021 4*9739f5f9SChristian Marangi * 5*9739f5f9SChristian Marangi * Richard van Schagen <vschagen@icloud.com> 6*9739f5f9SChristian Marangi * Christian Marangi <ansuelsmth@gmail.com 7*9739f5f9SChristian Marangi */ 8*9739f5f9SChristian Marangi #ifndef _EIP93_MAIN_H_ 9*9739f5f9SChristian Marangi #define _EIP93_MAIN_H_ 10*9739f5f9SChristian Marangi 11*9739f5f9SChristian Marangi #include <crypto/internal/aead.h> 12*9739f5f9SChristian Marangi #include <crypto/internal/hash.h> 13*9739f5f9SChristian Marangi #include <crypto/internal/skcipher.h> 14*9739f5f9SChristian Marangi #include <linux/bitfield.h> 15*9739f5f9SChristian Marangi #include <linux/interrupt.h> 16*9739f5f9SChristian Marangi 17*9739f5f9SChristian Marangi #define EIP93_RING_BUSY_DELAY 500 18*9739f5f9SChristian Marangi 19*9739f5f9SChristian Marangi #define EIP93_RING_NUM 512 20*9739f5f9SChristian Marangi #define EIP93_RING_BUSY 32 21*9739f5f9SChristian Marangi #define EIP93_CRA_PRIORITY 1500 22*9739f5f9SChristian Marangi 23*9739f5f9SChristian Marangi #define EIP93_RING_SA_STATE_ADDR(base, idx) ((base) + (idx)) 24*9739f5f9SChristian Marangi #define EIP93_RING_SA_STATE_DMA(dma_base, idx) ((u32 __force)(dma_base) + \ 25*9739f5f9SChristian Marangi ((idx) * sizeof(struct sa_state))) 26*9739f5f9SChristian Marangi 27*9739f5f9SChristian Marangi /* cipher algorithms */ 28*9739f5f9SChristian Marangi #define EIP93_ALG_DES BIT(0) 29*9739f5f9SChristian Marangi #define EIP93_ALG_3DES BIT(1) 30*9739f5f9SChristian Marangi #define EIP93_ALG_AES BIT(2) 31*9739f5f9SChristian Marangi #define EIP93_ALG_MASK GENMASK(2, 0) 32*9739f5f9SChristian Marangi /* hash and hmac algorithms */ 33*9739f5f9SChristian Marangi #define EIP93_HASH_MD5 BIT(3) 34*9739f5f9SChristian Marangi #define EIP93_HASH_SHA1 BIT(4) 35*9739f5f9SChristian Marangi #define EIP93_HASH_SHA224 BIT(5) 36*9739f5f9SChristian Marangi #define EIP93_HASH_SHA256 BIT(6) 37*9739f5f9SChristian Marangi #define EIP93_HASH_HMAC BIT(7) 38*9739f5f9SChristian Marangi #define EIP93_HASH_MASK GENMASK(6, 3) 39*9739f5f9SChristian Marangi /* cipher modes */ 40*9739f5f9SChristian Marangi #define EIP93_MODE_CBC BIT(8) 41*9739f5f9SChristian Marangi #define EIP93_MODE_ECB BIT(9) 42*9739f5f9SChristian Marangi #define EIP93_MODE_CTR BIT(10) 43*9739f5f9SChristian Marangi #define EIP93_MODE_RFC3686 BIT(11) 44*9739f5f9SChristian Marangi #define EIP93_MODE_MASK GENMASK(10, 8) 45*9739f5f9SChristian Marangi 46*9739f5f9SChristian Marangi /* cipher encryption/decryption operations */ 47*9739f5f9SChristian Marangi #define EIP93_ENCRYPT BIT(12) 48*9739f5f9SChristian Marangi #define EIP93_DECRYPT BIT(13) 49*9739f5f9SChristian Marangi 50*9739f5f9SChristian Marangi #define EIP93_BUSY BIT(14) 51*9739f5f9SChristian Marangi 52*9739f5f9SChristian Marangi /* descriptor flags */ 53*9739f5f9SChristian Marangi #define EIP93_DESC_DMA_IV BIT(0) 54*9739f5f9SChristian Marangi #define EIP93_DESC_IPSEC BIT(1) 55*9739f5f9SChristian Marangi #define EIP93_DESC_FINISH BIT(2) 56*9739f5f9SChristian Marangi #define EIP93_DESC_LAST BIT(3) 57*9739f5f9SChristian Marangi #define EIP93_DESC_FAKE_HMAC BIT(4) 58*9739f5f9SChristian Marangi #define EIP93_DESC_PRNG BIT(5) 59*9739f5f9SChristian Marangi #define EIP93_DESC_HASH BIT(6) 60*9739f5f9SChristian Marangi #define EIP93_DESC_AEAD BIT(7) 61*9739f5f9SChristian Marangi #define EIP93_DESC_SKCIPHER BIT(8) 62*9739f5f9SChristian Marangi #define EIP93_DESC_ASYNC BIT(9) 63*9739f5f9SChristian Marangi 64*9739f5f9SChristian Marangi #define IS_DMA_IV(desc_flags) ((desc_flags) & EIP93_DESC_DMA_IV) 65*9739f5f9SChristian Marangi 66*9739f5f9SChristian Marangi #define IS_DES(flags) ((flags) & EIP93_ALG_DES) 67*9739f5f9SChristian Marangi #define IS_3DES(flags) ((flags) & EIP93_ALG_3DES) 68*9739f5f9SChristian Marangi #define IS_AES(flags) ((flags) & EIP93_ALG_AES) 69*9739f5f9SChristian Marangi 70*9739f5f9SChristian Marangi #define IS_HASH_MD5(flags) ((flags) & EIP93_HASH_MD5) 71*9739f5f9SChristian Marangi #define IS_HASH_SHA1(flags) ((flags) & EIP93_HASH_SHA1) 72*9739f5f9SChristian Marangi #define IS_HASH_SHA224(flags) ((flags) & EIP93_HASH_SHA224) 73*9739f5f9SChristian Marangi #define IS_HASH_SHA256(flags) ((flags) & EIP93_HASH_SHA256) 74*9739f5f9SChristian Marangi #define IS_HMAC(flags) ((flags) & EIP93_HASH_HMAC) 75*9739f5f9SChristian Marangi 76*9739f5f9SChristian Marangi #define IS_CBC(mode) ((mode) & EIP93_MODE_CBC) 77*9739f5f9SChristian Marangi #define IS_ECB(mode) ((mode) & EIP93_MODE_ECB) 78*9739f5f9SChristian Marangi #define IS_CTR(mode) ((mode) & EIP93_MODE_CTR) 79*9739f5f9SChristian Marangi #define IS_RFC3686(mode) ((mode) & EIP93_MODE_RFC3686) 80*9739f5f9SChristian Marangi 81*9739f5f9SChristian Marangi #define IS_BUSY(flags) ((flags) & EIP93_BUSY) 82*9739f5f9SChristian Marangi 83*9739f5f9SChristian Marangi #define IS_ENCRYPT(dir) ((dir) & EIP93_ENCRYPT) 84*9739f5f9SChristian Marangi #define IS_DECRYPT(dir) ((dir) & EIP93_DECRYPT) 85*9739f5f9SChristian Marangi 86*9739f5f9SChristian Marangi #define IS_CIPHER(flags) ((flags) & (EIP93_ALG_DES | \ 87*9739f5f9SChristian Marangi EIP93_ALG_3DES | \ 88*9739f5f9SChristian Marangi EIP93_ALG_AES)) 89*9739f5f9SChristian Marangi 90*9739f5f9SChristian Marangi #define IS_HASH(flags) ((flags) & (EIP93_HASH_MD5 | \ 91*9739f5f9SChristian Marangi EIP93_HASH_SHA1 | \ 92*9739f5f9SChristian Marangi EIP93_HASH_SHA224 | \ 93*9739f5f9SChristian Marangi EIP93_HASH_SHA256)) 94*9739f5f9SChristian Marangi 95*9739f5f9SChristian Marangi /** 96*9739f5f9SChristian Marangi * struct eip93_device - crypto engine device structure 97*9739f5f9SChristian Marangi */ 98*9739f5f9SChristian Marangi struct eip93_device { 99*9739f5f9SChristian Marangi void __iomem *base; 100*9739f5f9SChristian Marangi struct device *dev; 101*9739f5f9SChristian Marangi struct clk *clk; 102*9739f5f9SChristian Marangi int irq; 103*9739f5f9SChristian Marangi struct eip93_ring *ring; 104*9739f5f9SChristian Marangi }; 105*9739f5f9SChristian Marangi 106*9739f5f9SChristian Marangi struct eip93_desc_ring { 107*9739f5f9SChristian Marangi void *base; 108*9739f5f9SChristian Marangi void *base_end; 109*9739f5f9SChristian Marangi dma_addr_t base_dma; 110*9739f5f9SChristian Marangi /* write and read pointers */ 111*9739f5f9SChristian Marangi void *read; 112*9739f5f9SChristian Marangi void *write; 113*9739f5f9SChristian Marangi /* descriptor element offset */ 114*9739f5f9SChristian Marangi u32 offset; 115*9739f5f9SChristian Marangi }; 116*9739f5f9SChristian Marangi 117*9739f5f9SChristian Marangi struct eip93_state_pool { 118*9739f5f9SChristian Marangi void *base; 119*9739f5f9SChristian Marangi dma_addr_t base_dma; 120*9739f5f9SChristian Marangi }; 121*9739f5f9SChristian Marangi 122*9739f5f9SChristian Marangi struct eip93_ring { 123*9739f5f9SChristian Marangi struct tasklet_struct done_task; 124*9739f5f9SChristian Marangi /* command/result rings */ 125*9739f5f9SChristian Marangi struct eip93_desc_ring cdr; 126*9739f5f9SChristian Marangi struct eip93_desc_ring rdr; 127*9739f5f9SChristian Marangi spinlock_t write_lock; 128*9739f5f9SChristian Marangi spinlock_t read_lock; 129*9739f5f9SChristian Marangi /* aync idr */ 130*9739f5f9SChristian Marangi spinlock_t idr_lock; 131*9739f5f9SChristian Marangi struct idr crypto_async_idr; 132*9739f5f9SChristian Marangi }; 133*9739f5f9SChristian Marangi 134*9739f5f9SChristian Marangi enum eip93_alg_type { 135*9739f5f9SChristian Marangi EIP93_ALG_TYPE_AEAD, 136*9739f5f9SChristian Marangi EIP93_ALG_TYPE_SKCIPHER, 137*9739f5f9SChristian Marangi EIP93_ALG_TYPE_HASH, 138*9739f5f9SChristian Marangi }; 139*9739f5f9SChristian Marangi 140*9739f5f9SChristian Marangi struct eip93_alg_template { 141*9739f5f9SChristian Marangi struct eip93_device *eip93; 142*9739f5f9SChristian Marangi enum eip93_alg_type type; 143*9739f5f9SChristian Marangi u32 flags; 144*9739f5f9SChristian Marangi union { 145*9739f5f9SChristian Marangi struct aead_alg aead; 146*9739f5f9SChristian Marangi struct skcipher_alg skcipher; 147*9739f5f9SChristian Marangi struct ahash_alg ahash; 148*9739f5f9SChristian Marangi } alg; 149*9739f5f9SChristian Marangi }; 150*9739f5f9SChristian Marangi 151*9739f5f9SChristian Marangi #endif /* _EIP93_MAIN_H_ */ 152