| #ifndef ASR_CIPHER_H |
| #define ASR_CIPHER_H |
| |
| #include <linux/irq.h> |
| #include <linux/interrupt.h> |
| #include <linux/crypto.h> |
| #include <crypto/aes.h> |
| #include <crypto/scatterwalk.h> |
| #include <crypto/algapi.h> |
| #include <crypto/internal/skcipher.h> |
| |
| /* CIHER flags */ |
| #define FLAGS_ENCRYPT (1 << 0) |
| #define FLAGS_ECB (0 << 1) |
| #define FLAGS_CBC (1 << 1) |
| #define FLAGS_CTR (2 << 1) |
| #define FLAGS_OPMODE_MASK (3 << 1) |
| #define FLAGS_BUSY (1 << 3) |
| #define FLAGS_AES (0 << 4) |
| #define FLAGS_SM4 (1 << 4) |
| |
| #define CIPHER_FLAGS_PERSISTENT FLAGS_BUSY |
| |
| #define BYTES_TO_BITS 8 |
| #define WORK_BUF_SIZE 2048 |
| |
| #define ASR_CIPHER_QUEUE_LENGTH 50 |
| #define ASR_CIPHER_PRIORITY 300 |
| |
| #define ASR_CIPHER_BUFFER_ORDER 2 |
| #define ASR_CIPHER_BUFFER_SIZE (PAGE_SIZE << ASR_CIPHER_BUFFER_ORDER) |
| |
| typedef enum { |
| EXT_KEY = 0, |
| RK_KEY, |
| SSK_KEY, |
| } AES_KEY_SELECT_T; |
| |
| typedef enum { |
| AES_128 = 128/8, |
| AES_192 = 192/8, |
| AES_256 = 256/8, |
| } AES_KEY_LEN_T; |
| |
| typedef enum { |
| AES_ECB_ALG = 0, |
| AES_CBC_ALG, |
| AES_CTR_ALG, |
| AES_XTS_ALG, |
| AES_KEYWRAP, |
| } AES_MODE_T; |
| |
| typedef enum { |
| AES_DECRYPT_OP = 0, |
| AES_ENCRYPT_OP, |
| } AES_OP_MODE_T; |
| |
| typedef enum { |
| ENG_AES = 0, |
| ENG_DES, |
| ENG_RC4, |
| } CRYPTO_ENG_SEL_T; |
| |
| typedef struct { |
| uint32_t paddr; |
| uint32_t size; |
| uint32_t next_desc; |
| uint32_t reserved; |
| } DMA_DESC_T; |
| |
| struct rijndael_key { |
| uint8_t K[(60 + 60 + 4) * sizeof(uint32_t)]; |
| uint32_t *eK; |
| uint32_t *dK; |
| int Nr; |
| }; |
| |
| typedef union Symmetric_key { |
| struct rijndael_key rijndael; |
| } symmetric_key; |
| |
| struct asr_bcm_cipher; |
| |
| typedef int (*asr_cipher_fn_t)(struct asr_bcm_cipher *dd); |
| typedef irqreturn_t (*asr_cipher_irq_t)(void *); |
| |
| |
| struct asr_cipher_ctx { |
| struct asr_bcm_cipher *dd; |
| asr_cipher_fn_t start; |
| int keylen; |
| u32 key[AES_KEYSIZE_256 / sizeof(u32)]; |
| u16 block_size; |
| bool use_rkek; |
| }; |
| |
| struct asr_cipher_reqctx { |
| unsigned long mode; |
| bool use_rkek; |
| u32 lastc[AES_BLOCK_SIZE / sizeof(u32)]; |
| }; |
| |
| struct asr_bcm_cipher { |
| struct device *dev; |
| struct crypto_async_request *areq; |
| |
| void __iomem *io_base; |
| unsigned long phys_base; |
| |
| struct asr_cipher_ctx *ctx; |
| |
| bool is_async; |
| bool rkek_burned; |
| unsigned long flags; |
| |
| spinlock_t lock; |
| struct mutex cipher_lock; |
| struct crypto_queue queue; |
| struct tasklet_struct queue_task; |
| |
| asr_cipher_fn_t resume; |
| struct tasklet_struct done_task; |
| |
| size_t total; |
| size_t datalen; |
| u32 *data; |
| |
| size_t buflen; |
| void *buf; |
| |
| struct scatterlist aligned_sg; |
| struct scatterlist *real_dst; |
| }; |
| |
| #endif |