GNU Linux-libre 4.14.265-gnu1
[releases.git] / drivers / crypto / cavium / cpt / cptvf_algs.h
1 /*
2  * Copyright (C) 2016 Cavium, Inc.
3  *
4  * This program is free software; you can redistribute it and/or modify it
5  * under the terms of version 2 of the GNU General Public License
6  * as published by the Free Software Foundation.
7  */
8
9 #ifndef _CPTVF_ALGS_H_
10 #define _CPTVF_ALGS_H_
11
12 #include "request_manager.h"
13
14 #define MAX_DEVICES 16
15 #define MAJOR_OP_FC 0x33
16 #define MAX_ENC_KEY_SIZE 32
17 #define MAX_HASH_KEY_SIZE 64
18 #define MAX_KEY_SIZE (MAX_ENC_KEY_SIZE + MAX_HASH_KEY_SIZE)
19 #define CONTROL_WORD_LEN 8
20 #define KEY2_OFFSET 48
21
22 #define DMA_MODE_FLAG(dma_mode) \
23         (((dma_mode) == DMA_GATHER_SCATTER) ? (1 << 7) : 0)
24
25 enum req_type {
26         AE_CORE_REQ,
27         SE_CORE_REQ,
28 };
29
30 enum cipher_type {
31         DES3_CBC = 0x1,
32         DES3_ECB = 0x2,
33         AES_CBC = 0x3,
34         AES_ECB = 0x4,
35         AES_CFB = 0x5,
36         AES_CTR = 0x6,
37         AES_GCM = 0x7,
38         AES_XTS = 0x8
39 };
40
41 enum aes_type {
42         AES_128_BIT = 0x1,
43         AES_192_BIT = 0x2,
44         AES_256_BIT = 0x3
45 };
46
47 union encr_ctrl {
48         u64 flags;
49         struct {
50 #if defined(__BIG_ENDIAN_BITFIELD)
51                 u64 enc_cipher:4;
52                 u64 reserved1:1;
53                 u64 aes_key:2;
54                 u64 iv_source:1;
55                 u64 hash_type:4;
56                 u64 reserved2:3;
57                 u64 auth_input_type:1;
58                 u64 mac_len:8;
59                 u64 reserved3:8;
60                 u64 encr_offset:16;
61                 u64 iv_offset:8;
62                 u64 auth_offset:8;
63 #else
64                 u64 auth_offset:8;
65                 u64 iv_offset:8;
66                 u64 encr_offset:16;
67                 u64 reserved3:8;
68                 u64 mac_len:8;
69                 u64 auth_input_type:1;
70                 u64 reserved2:3;
71                 u64 hash_type:4;
72                 u64 iv_source:1;
73                 u64 aes_key:2;
74                 u64 reserved1:1;
75                 u64 enc_cipher:4;
76 #endif
77         } e;
78 };
79
80 struct cvm_cipher {
81         const char *name;
82         u8 value;
83 };
84
85 struct enc_context {
86         union encr_ctrl enc_ctrl;
87         u8 encr_key[32];
88         u8 encr_iv[16];
89 };
90
91 struct fchmac_context {
92         u8 ipad[64];
93         u8 opad[64]; /* or OPAD */
94 };
95
96 struct fc_context {
97         struct enc_context enc;
98         struct fchmac_context hmac;
99 };
100
101 struct cvm_enc_ctx {
102         u32 key_len;
103         u8 enc_key[MAX_KEY_SIZE];
104         u8 cipher_type:4;
105         u8 key_type:2;
106 };
107
108 struct cvm_des3_ctx {
109         u32 key_len;
110         u8 des3_key[MAX_KEY_SIZE];
111 };
112
113 struct cvm_req_ctx {
114         struct cpt_request_info cpt_req;
115         u64 control_word;
116         struct fc_context fctx;
117 };
118
119 int cptvf_do_request(void *cptvf, struct cpt_request_info *req);
120 #endif /*_CPTVF_ALGS_H_*/