162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2016 Cavium, Inc.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef _CPTVF_ALGS_H_
762306a36Sopenharmony_ci#define _CPTVF_ALGS_H_
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include "request_manager.h"
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#define MAX_DEVICES 16
1262306a36Sopenharmony_ci#define MAJOR_OP_FC 0x33
1362306a36Sopenharmony_ci#define MAX_ENC_KEY_SIZE 32
1462306a36Sopenharmony_ci#define MAX_HASH_KEY_SIZE 64
1562306a36Sopenharmony_ci#define MAX_KEY_SIZE (MAX_ENC_KEY_SIZE + MAX_HASH_KEY_SIZE)
1662306a36Sopenharmony_ci#define CONTROL_WORD_LEN 8
1762306a36Sopenharmony_ci#define KEY2_OFFSET 48
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#define DMA_MODE_FLAG(dma_mode) \
2062306a36Sopenharmony_ci	(((dma_mode) == DMA_GATHER_SCATTER) ? (1 << 7) : 0)
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cienum req_type {
2362306a36Sopenharmony_ci	AE_CORE_REQ,
2462306a36Sopenharmony_ci	SE_CORE_REQ,
2562306a36Sopenharmony_ci};
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cienum cipher_type {
2862306a36Sopenharmony_ci	DES3_CBC = 0x1,
2962306a36Sopenharmony_ci	DES3_ECB = 0x2,
3062306a36Sopenharmony_ci	AES_CBC = 0x3,
3162306a36Sopenharmony_ci	AES_ECB = 0x4,
3262306a36Sopenharmony_ci	AES_CFB = 0x5,
3362306a36Sopenharmony_ci	AES_CTR = 0x6,
3462306a36Sopenharmony_ci	AES_GCM = 0x7,
3562306a36Sopenharmony_ci	AES_XTS = 0x8
3662306a36Sopenharmony_ci};
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cienum aes_type {
3962306a36Sopenharmony_ci	AES_128_BIT = 0x1,
4062306a36Sopenharmony_ci	AES_192_BIT = 0x2,
4162306a36Sopenharmony_ci	AES_256_BIT = 0x3
4262306a36Sopenharmony_ci};
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ciunion encr_ctrl {
4562306a36Sopenharmony_ci	u64 flags;
4662306a36Sopenharmony_ci	struct {
4762306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD)
4862306a36Sopenharmony_ci		u64 enc_cipher:4;
4962306a36Sopenharmony_ci		u64 reserved1:1;
5062306a36Sopenharmony_ci		u64 aes_key:2;
5162306a36Sopenharmony_ci		u64 iv_source:1;
5262306a36Sopenharmony_ci		u64 hash_type:4;
5362306a36Sopenharmony_ci		u64 reserved2:3;
5462306a36Sopenharmony_ci		u64 auth_input_type:1;
5562306a36Sopenharmony_ci		u64 mac_len:8;
5662306a36Sopenharmony_ci		u64 reserved3:8;
5762306a36Sopenharmony_ci		u64 encr_offset:16;
5862306a36Sopenharmony_ci		u64 iv_offset:8;
5962306a36Sopenharmony_ci		u64 auth_offset:8;
6062306a36Sopenharmony_ci#else
6162306a36Sopenharmony_ci		u64 auth_offset:8;
6262306a36Sopenharmony_ci		u64 iv_offset:8;
6362306a36Sopenharmony_ci		u64 encr_offset:16;
6462306a36Sopenharmony_ci		u64 reserved3:8;
6562306a36Sopenharmony_ci		u64 mac_len:8;
6662306a36Sopenharmony_ci		u64 auth_input_type:1;
6762306a36Sopenharmony_ci		u64 reserved2:3;
6862306a36Sopenharmony_ci		u64 hash_type:4;
6962306a36Sopenharmony_ci		u64 iv_source:1;
7062306a36Sopenharmony_ci		u64 aes_key:2;
7162306a36Sopenharmony_ci		u64 reserved1:1;
7262306a36Sopenharmony_ci		u64 enc_cipher:4;
7362306a36Sopenharmony_ci#endif
7462306a36Sopenharmony_ci	} e;
7562306a36Sopenharmony_ci};
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cistruct cvm_cipher {
7862306a36Sopenharmony_ci	const char *name;
7962306a36Sopenharmony_ci	u8 value;
8062306a36Sopenharmony_ci};
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_cistruct enc_context {
8362306a36Sopenharmony_ci	union encr_ctrl enc_ctrl;
8462306a36Sopenharmony_ci	u8 encr_key[32];
8562306a36Sopenharmony_ci	u8 encr_iv[16];
8662306a36Sopenharmony_ci};
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_cistruct fchmac_context {
8962306a36Sopenharmony_ci	u8 ipad[64];
9062306a36Sopenharmony_ci	u8 opad[64]; /* or OPAD */
9162306a36Sopenharmony_ci};
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_cistruct fc_context {
9462306a36Sopenharmony_ci	struct enc_context enc;
9562306a36Sopenharmony_ci	struct fchmac_context hmac;
9662306a36Sopenharmony_ci};
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_cistruct cvm_enc_ctx {
9962306a36Sopenharmony_ci	u32 key_len;
10062306a36Sopenharmony_ci	u8 enc_key[MAX_KEY_SIZE];
10162306a36Sopenharmony_ci	u8 cipher_type:4;
10262306a36Sopenharmony_ci	u8 key_type:2;
10362306a36Sopenharmony_ci};
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_cistruct cvm_des3_ctx {
10662306a36Sopenharmony_ci	u32 key_len;
10762306a36Sopenharmony_ci	u8 des3_key[MAX_KEY_SIZE];
10862306a36Sopenharmony_ci};
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_cistruct cvm_req_ctx {
11162306a36Sopenharmony_ci	struct cpt_request_info cpt_req;
11262306a36Sopenharmony_ci	u64 control_word;
11362306a36Sopenharmony_ci	struct fc_context fctx;
11462306a36Sopenharmony_ci};
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ciint cptvf_do_request(void *cptvf, struct cpt_request_info *req);
11762306a36Sopenharmony_ci#endif /*_CPTVF_ALGS_H_*/
118