162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci * Marvell OcteonTX CPT driver 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) 2019 Marvell International Ltd. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * This program is free software; you can redistribute it and/or modify 762306a36Sopenharmony_ci * it under the terms of the GNU General Public License version 2 as 862306a36Sopenharmony_ci * published by the Free Software Foundation. 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#ifndef __OTX_CPT_ALGS_H 1262306a36Sopenharmony_ci#define __OTX_CPT_ALGS_H 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <crypto/hash.h> 1562306a36Sopenharmony_ci#include "otx_cpt_common.h" 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define OTX_CPT_MAX_ENC_KEY_SIZE 32 1862306a36Sopenharmony_ci#define OTX_CPT_MAX_HASH_KEY_SIZE 64 1962306a36Sopenharmony_ci#define OTX_CPT_MAX_KEY_SIZE (OTX_CPT_MAX_ENC_KEY_SIZE + \ 2062306a36Sopenharmony_ci OTX_CPT_MAX_HASH_KEY_SIZE) 2162306a36Sopenharmony_cienum otx_cpt_request_type { 2262306a36Sopenharmony_ci OTX_CPT_ENC_DEC_REQ = 0x1, 2362306a36Sopenharmony_ci OTX_CPT_AEAD_ENC_DEC_REQ = 0x2, 2462306a36Sopenharmony_ci OTX_CPT_AEAD_ENC_DEC_NULL_REQ = 0x3, 2562306a36Sopenharmony_ci OTX_CPT_PASSTHROUGH_REQ = 0x4 2662306a36Sopenharmony_ci}; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cienum otx_cpt_major_opcodes { 2962306a36Sopenharmony_ci OTX_CPT_MAJOR_OP_MISC = 0x01, 3062306a36Sopenharmony_ci OTX_CPT_MAJOR_OP_FC = 0x33, 3162306a36Sopenharmony_ci OTX_CPT_MAJOR_OP_HMAC = 0x35, 3262306a36Sopenharmony_ci}; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cienum otx_cpt_req_type { 3562306a36Sopenharmony_ci OTX_CPT_AE_CORE_REQ, 3662306a36Sopenharmony_ci OTX_CPT_SE_CORE_REQ 3762306a36Sopenharmony_ci}; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cienum otx_cpt_cipher_type { 4062306a36Sopenharmony_ci OTX_CPT_CIPHER_NULL = 0x0, 4162306a36Sopenharmony_ci OTX_CPT_DES3_CBC = 0x1, 4262306a36Sopenharmony_ci OTX_CPT_DES3_ECB = 0x2, 4362306a36Sopenharmony_ci OTX_CPT_AES_CBC = 0x3, 4462306a36Sopenharmony_ci OTX_CPT_AES_ECB = 0x4, 4562306a36Sopenharmony_ci OTX_CPT_AES_CFB = 0x5, 4662306a36Sopenharmony_ci OTX_CPT_AES_CTR = 0x6, 4762306a36Sopenharmony_ci OTX_CPT_AES_GCM = 0x7, 4862306a36Sopenharmony_ci OTX_CPT_AES_XTS = 0x8 4962306a36Sopenharmony_ci}; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cienum otx_cpt_mac_type { 5262306a36Sopenharmony_ci OTX_CPT_MAC_NULL = 0x0, 5362306a36Sopenharmony_ci OTX_CPT_MD5 = 0x1, 5462306a36Sopenharmony_ci OTX_CPT_SHA1 = 0x2, 5562306a36Sopenharmony_ci OTX_CPT_SHA224 = 0x3, 5662306a36Sopenharmony_ci OTX_CPT_SHA256 = 0x4, 5762306a36Sopenharmony_ci OTX_CPT_SHA384 = 0x5, 5862306a36Sopenharmony_ci OTX_CPT_SHA512 = 0x6, 5962306a36Sopenharmony_ci OTX_CPT_GMAC = 0x7 6062306a36Sopenharmony_ci}; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cienum otx_cpt_aes_key_len { 6362306a36Sopenharmony_ci OTX_CPT_AES_128_BIT = 0x1, 6462306a36Sopenharmony_ci OTX_CPT_AES_192_BIT = 0x2, 6562306a36Sopenharmony_ci OTX_CPT_AES_256_BIT = 0x3 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ciunion otx_cpt_encr_ctrl { 6962306a36Sopenharmony_ci __be64 flags; 7062306a36Sopenharmony_ci u64 cflags; 7162306a36Sopenharmony_ci struct { 7262306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 7362306a36Sopenharmony_ci u64 enc_cipher:4; 7462306a36Sopenharmony_ci u64 reserved1:1; 7562306a36Sopenharmony_ci u64 aes_key:2; 7662306a36Sopenharmony_ci u64 iv_source:1; 7762306a36Sopenharmony_ci u64 mac_type:4; 7862306a36Sopenharmony_ci u64 reserved2:3; 7962306a36Sopenharmony_ci u64 auth_input_type:1; 8062306a36Sopenharmony_ci u64 mac_len:8; 8162306a36Sopenharmony_ci u64 reserved3:8; 8262306a36Sopenharmony_ci u64 encr_offset:16; 8362306a36Sopenharmony_ci u64 iv_offset:8; 8462306a36Sopenharmony_ci u64 auth_offset:8; 8562306a36Sopenharmony_ci#else 8662306a36Sopenharmony_ci u64 auth_offset:8; 8762306a36Sopenharmony_ci u64 iv_offset:8; 8862306a36Sopenharmony_ci u64 encr_offset:16; 8962306a36Sopenharmony_ci u64 reserved3:8; 9062306a36Sopenharmony_ci u64 mac_len:8; 9162306a36Sopenharmony_ci u64 auth_input_type:1; 9262306a36Sopenharmony_ci u64 reserved2:3; 9362306a36Sopenharmony_ci u64 mac_type:4; 9462306a36Sopenharmony_ci u64 iv_source:1; 9562306a36Sopenharmony_ci u64 aes_key:2; 9662306a36Sopenharmony_ci u64 reserved1:1; 9762306a36Sopenharmony_ci u64 enc_cipher:4; 9862306a36Sopenharmony_ci#endif 9962306a36Sopenharmony_ci } e; 10062306a36Sopenharmony_ci}; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_cistruct otx_cpt_cipher { 10362306a36Sopenharmony_ci const char *name; 10462306a36Sopenharmony_ci u8 value; 10562306a36Sopenharmony_ci}; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cistruct otx_cpt_enc_context { 10862306a36Sopenharmony_ci union otx_cpt_encr_ctrl enc_ctrl; 10962306a36Sopenharmony_ci u8 encr_key[32]; 11062306a36Sopenharmony_ci u8 encr_iv[16]; 11162306a36Sopenharmony_ci}; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ciunion otx_cpt_fchmac_ctx { 11462306a36Sopenharmony_ci struct { 11562306a36Sopenharmony_ci u8 ipad[64]; 11662306a36Sopenharmony_ci u8 opad[64]; 11762306a36Sopenharmony_ci } e; 11862306a36Sopenharmony_ci struct { 11962306a36Sopenharmony_ci u8 hmac_calc[64]; /* HMAC calculated */ 12062306a36Sopenharmony_ci u8 hmac_recv[64]; /* HMAC received */ 12162306a36Sopenharmony_ci } s; 12262306a36Sopenharmony_ci}; 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_cistruct otx_cpt_fc_ctx { 12562306a36Sopenharmony_ci struct otx_cpt_enc_context enc; 12662306a36Sopenharmony_ci union otx_cpt_fchmac_ctx hmac; 12762306a36Sopenharmony_ci}; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_cistruct otx_cpt_enc_ctx { 13062306a36Sopenharmony_ci u32 key_len; 13162306a36Sopenharmony_ci u8 enc_key[OTX_CPT_MAX_KEY_SIZE]; 13262306a36Sopenharmony_ci u8 cipher_type; 13362306a36Sopenharmony_ci u8 key_type; 13462306a36Sopenharmony_ci}; 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_cistruct otx_cpt_des3_ctx { 13762306a36Sopenharmony_ci u32 key_len; 13862306a36Sopenharmony_ci u8 des3_key[OTX_CPT_MAX_KEY_SIZE]; 13962306a36Sopenharmony_ci}; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ciunion otx_cpt_offset_ctrl_word { 14262306a36Sopenharmony_ci __be64 flags; 14362306a36Sopenharmony_ci u64 cflags; 14462306a36Sopenharmony_ci struct { 14562306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 14662306a36Sopenharmony_ci u64 reserved:32; 14762306a36Sopenharmony_ci u64 enc_data_offset:16; 14862306a36Sopenharmony_ci u64 iv_offset:8; 14962306a36Sopenharmony_ci u64 auth_offset:8; 15062306a36Sopenharmony_ci#else 15162306a36Sopenharmony_ci u64 auth_offset:8; 15262306a36Sopenharmony_ci u64 iv_offset:8; 15362306a36Sopenharmony_ci u64 enc_data_offset:16; 15462306a36Sopenharmony_ci u64 reserved:32; 15562306a36Sopenharmony_ci#endif 15662306a36Sopenharmony_ci } e; 15762306a36Sopenharmony_ci}; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cistruct otx_cpt_req_ctx { 16062306a36Sopenharmony_ci struct otx_cpt_req_info cpt_req; 16162306a36Sopenharmony_ci union otx_cpt_offset_ctrl_word ctrl_word; 16262306a36Sopenharmony_ci struct otx_cpt_fc_ctx fctx; 16362306a36Sopenharmony_ci}; 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_cistruct otx_cpt_sdesc { 16662306a36Sopenharmony_ci struct shash_desc shash; 16762306a36Sopenharmony_ci}; 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_cistruct otx_cpt_aead_ctx { 17062306a36Sopenharmony_ci u8 key[OTX_CPT_MAX_KEY_SIZE]; 17162306a36Sopenharmony_ci struct crypto_shash *hashalg; 17262306a36Sopenharmony_ci struct otx_cpt_sdesc *sdesc; 17362306a36Sopenharmony_ci u8 *ipad; 17462306a36Sopenharmony_ci u8 *opad; 17562306a36Sopenharmony_ci u32 enc_key_len; 17662306a36Sopenharmony_ci u32 auth_key_len; 17762306a36Sopenharmony_ci u8 cipher_type; 17862306a36Sopenharmony_ci u8 mac_type; 17962306a36Sopenharmony_ci u8 key_type; 18062306a36Sopenharmony_ci u8 is_trunc_hmac; 18162306a36Sopenharmony_ci}; 18262306a36Sopenharmony_ciint otx_cpt_crypto_init(struct pci_dev *pdev, struct module *mod, 18362306a36Sopenharmony_ci enum otx_cptpf_type pf_type, 18462306a36Sopenharmony_ci enum otx_cptvf_type engine_type, 18562306a36Sopenharmony_ci int num_queues, int num_devices); 18662306a36Sopenharmony_civoid otx_cpt_crypto_exit(struct pci_dev *pdev, struct module *mod, 18762306a36Sopenharmony_ci enum otx_cptvf_type engine_type); 18862306a36Sopenharmony_civoid otx_cpt_callback(int status, void *arg, void *req); 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci#endif /* __OTX_CPT_ALGS_H */ 191