18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2016 Cavium, Inc.
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#ifndef _CPTVF_ALGS_H_
78c2ecf20Sopenharmony_ci#define _CPTVF_ALGS_H_
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include "request_manager.h"
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#define MAX_DEVICES 16
128c2ecf20Sopenharmony_ci#define MAJOR_OP_FC 0x33
138c2ecf20Sopenharmony_ci#define MAX_ENC_KEY_SIZE 32
148c2ecf20Sopenharmony_ci#define MAX_HASH_KEY_SIZE 64
158c2ecf20Sopenharmony_ci#define MAX_KEY_SIZE (MAX_ENC_KEY_SIZE + MAX_HASH_KEY_SIZE)
168c2ecf20Sopenharmony_ci#define CONTROL_WORD_LEN 8
178c2ecf20Sopenharmony_ci#define KEY2_OFFSET 48
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#define DMA_MODE_FLAG(dma_mode) \
208c2ecf20Sopenharmony_ci	(((dma_mode) == DMA_GATHER_SCATTER) ? (1 << 7) : 0)
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_cienum req_type {
238c2ecf20Sopenharmony_ci	AE_CORE_REQ,
248c2ecf20Sopenharmony_ci	SE_CORE_REQ,
258c2ecf20Sopenharmony_ci};
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_cienum cipher_type {
288c2ecf20Sopenharmony_ci	DES3_CBC = 0x1,
298c2ecf20Sopenharmony_ci	DES3_ECB = 0x2,
308c2ecf20Sopenharmony_ci	AES_CBC = 0x3,
318c2ecf20Sopenharmony_ci	AES_ECB = 0x4,
328c2ecf20Sopenharmony_ci	AES_CFB = 0x5,
338c2ecf20Sopenharmony_ci	AES_CTR = 0x6,
348c2ecf20Sopenharmony_ci	AES_GCM = 0x7,
358c2ecf20Sopenharmony_ci	AES_XTS = 0x8
368c2ecf20Sopenharmony_ci};
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_cienum aes_type {
398c2ecf20Sopenharmony_ci	AES_128_BIT = 0x1,
408c2ecf20Sopenharmony_ci	AES_192_BIT = 0x2,
418c2ecf20Sopenharmony_ci	AES_256_BIT = 0x3
428c2ecf20Sopenharmony_ci};
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ciunion encr_ctrl {
458c2ecf20Sopenharmony_ci	u64 flags;
468c2ecf20Sopenharmony_ci	struct {
478c2ecf20Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD)
488c2ecf20Sopenharmony_ci		u64 enc_cipher:4;
498c2ecf20Sopenharmony_ci		u64 reserved1:1;
508c2ecf20Sopenharmony_ci		u64 aes_key:2;
518c2ecf20Sopenharmony_ci		u64 iv_source:1;
528c2ecf20Sopenharmony_ci		u64 hash_type:4;
538c2ecf20Sopenharmony_ci		u64 reserved2:3;
548c2ecf20Sopenharmony_ci		u64 auth_input_type:1;
558c2ecf20Sopenharmony_ci		u64 mac_len:8;
568c2ecf20Sopenharmony_ci		u64 reserved3:8;
578c2ecf20Sopenharmony_ci		u64 encr_offset:16;
588c2ecf20Sopenharmony_ci		u64 iv_offset:8;
598c2ecf20Sopenharmony_ci		u64 auth_offset:8;
608c2ecf20Sopenharmony_ci#else
618c2ecf20Sopenharmony_ci		u64 auth_offset:8;
628c2ecf20Sopenharmony_ci		u64 iv_offset:8;
638c2ecf20Sopenharmony_ci		u64 encr_offset:16;
648c2ecf20Sopenharmony_ci		u64 reserved3:8;
658c2ecf20Sopenharmony_ci		u64 mac_len:8;
668c2ecf20Sopenharmony_ci		u64 auth_input_type:1;
678c2ecf20Sopenharmony_ci		u64 reserved2:3;
688c2ecf20Sopenharmony_ci		u64 hash_type:4;
698c2ecf20Sopenharmony_ci		u64 iv_source:1;
708c2ecf20Sopenharmony_ci		u64 aes_key:2;
718c2ecf20Sopenharmony_ci		u64 reserved1:1;
728c2ecf20Sopenharmony_ci		u64 enc_cipher:4;
738c2ecf20Sopenharmony_ci#endif
748c2ecf20Sopenharmony_ci	} e;
758c2ecf20Sopenharmony_ci};
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_cistruct cvm_cipher {
788c2ecf20Sopenharmony_ci	const char *name;
798c2ecf20Sopenharmony_ci	u8 value;
808c2ecf20Sopenharmony_ci};
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_cistruct enc_context {
838c2ecf20Sopenharmony_ci	union encr_ctrl enc_ctrl;
848c2ecf20Sopenharmony_ci	u8 encr_key[32];
858c2ecf20Sopenharmony_ci	u8 encr_iv[16];
868c2ecf20Sopenharmony_ci};
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_cistruct fchmac_context {
898c2ecf20Sopenharmony_ci	u8 ipad[64];
908c2ecf20Sopenharmony_ci	u8 opad[64]; /* or OPAD */
918c2ecf20Sopenharmony_ci};
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_cistruct fc_context {
948c2ecf20Sopenharmony_ci	struct enc_context enc;
958c2ecf20Sopenharmony_ci	struct fchmac_context hmac;
968c2ecf20Sopenharmony_ci};
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_cistruct cvm_enc_ctx {
998c2ecf20Sopenharmony_ci	u32 key_len;
1008c2ecf20Sopenharmony_ci	u8 enc_key[MAX_KEY_SIZE];
1018c2ecf20Sopenharmony_ci	u8 cipher_type:4;
1028c2ecf20Sopenharmony_ci	u8 key_type:2;
1038c2ecf20Sopenharmony_ci};
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_cistruct cvm_des3_ctx {
1068c2ecf20Sopenharmony_ci	u32 key_len;
1078c2ecf20Sopenharmony_ci	u8 des3_key[MAX_KEY_SIZE];
1088c2ecf20Sopenharmony_ci};
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_cistruct cvm_req_ctx {
1118c2ecf20Sopenharmony_ci	struct cpt_request_info cpt_req;
1128c2ecf20Sopenharmony_ci	u64 control_word;
1138c2ecf20Sopenharmony_ci	struct fc_context fctx;
1148c2ecf20Sopenharmony_ci};
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_ciint cptvf_do_request(void *cptvf, struct cpt_request_info *req);
1178c2ecf20Sopenharmony_ci#endif /*_CPTVF_ALGS_H_*/
118