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