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