162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci * Copyright (C) 2020 Marvell. 362306a36Sopenharmony_ci */ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#ifndef __OTX2_CPT_ALGS_H 662306a36Sopenharmony_ci#define __OTX2_CPT_ALGS_H 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <crypto/hash.h> 962306a36Sopenharmony_ci#include <crypto/skcipher.h> 1062306a36Sopenharmony_ci#include <crypto/aead.h> 1162306a36Sopenharmony_ci#include "otx2_cpt_common.h" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#define OTX2_CPT_MAX_ENC_KEY_SIZE 32 1462306a36Sopenharmony_ci#define OTX2_CPT_MAX_HASH_KEY_SIZE 64 1562306a36Sopenharmony_ci#define OTX2_CPT_MAX_KEY_SIZE (OTX2_CPT_MAX_ENC_KEY_SIZE + \ 1662306a36Sopenharmony_ci OTX2_CPT_MAX_HASH_KEY_SIZE) 1762306a36Sopenharmony_cienum otx2_cpt_request_type { 1862306a36Sopenharmony_ci OTX2_CPT_ENC_DEC_REQ = 0x1, 1962306a36Sopenharmony_ci OTX2_CPT_AEAD_ENC_DEC_REQ = 0x2, 2062306a36Sopenharmony_ci OTX2_CPT_AEAD_ENC_DEC_NULL_REQ = 0x3, 2162306a36Sopenharmony_ci OTX2_CPT_PASSTHROUGH_REQ = 0x4 2262306a36Sopenharmony_ci}; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cienum otx2_cpt_major_opcodes { 2562306a36Sopenharmony_ci OTX2_CPT_MAJOR_OP_MISC = 0x01, 2662306a36Sopenharmony_ci OTX2_CPT_MAJOR_OP_FC = 0x33, 2762306a36Sopenharmony_ci OTX2_CPT_MAJOR_OP_HMAC = 0x35, 2862306a36Sopenharmony_ci}; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cienum otx2_cpt_cipher_type { 3162306a36Sopenharmony_ci OTX2_CPT_CIPHER_NULL = 0x0, 3262306a36Sopenharmony_ci OTX2_CPT_DES3_CBC = 0x1, 3362306a36Sopenharmony_ci OTX2_CPT_DES3_ECB = 0x2, 3462306a36Sopenharmony_ci OTX2_CPT_AES_CBC = 0x3, 3562306a36Sopenharmony_ci OTX2_CPT_AES_ECB = 0x4, 3662306a36Sopenharmony_ci OTX2_CPT_AES_CFB = 0x5, 3762306a36Sopenharmony_ci OTX2_CPT_AES_CTR = 0x6, 3862306a36Sopenharmony_ci OTX2_CPT_AES_GCM = 0x7, 3962306a36Sopenharmony_ci OTX2_CPT_AES_XTS = 0x8 4062306a36Sopenharmony_ci}; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cienum otx2_cpt_mac_type { 4362306a36Sopenharmony_ci OTX2_CPT_MAC_NULL = 0x0, 4462306a36Sopenharmony_ci OTX2_CPT_MD5 = 0x1, 4562306a36Sopenharmony_ci OTX2_CPT_SHA1 = 0x2, 4662306a36Sopenharmony_ci OTX2_CPT_SHA224 = 0x3, 4762306a36Sopenharmony_ci OTX2_CPT_SHA256 = 0x4, 4862306a36Sopenharmony_ci OTX2_CPT_SHA384 = 0x5, 4962306a36Sopenharmony_ci OTX2_CPT_SHA512 = 0x6, 5062306a36Sopenharmony_ci OTX2_CPT_GMAC = 0x7 5162306a36Sopenharmony_ci}; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cienum otx2_cpt_aes_key_len { 5462306a36Sopenharmony_ci OTX2_CPT_AES_128_BIT = 0x1, 5562306a36Sopenharmony_ci OTX2_CPT_AES_192_BIT = 0x2, 5662306a36Sopenharmony_ci OTX2_CPT_AES_256_BIT = 0x3 5762306a36Sopenharmony_ci}; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ciunion otx2_cpt_encr_ctrl { 6062306a36Sopenharmony_ci u64 u; 6162306a36Sopenharmony_ci struct { 6262306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 6362306a36Sopenharmony_ci u64 enc_cipher:4; 6462306a36Sopenharmony_ci u64 reserved_59:1; 6562306a36Sopenharmony_ci u64 aes_key:2; 6662306a36Sopenharmony_ci u64 iv_source:1; 6762306a36Sopenharmony_ci u64 mac_type:4; 6862306a36Sopenharmony_ci u64 reserved_49_51:3; 6962306a36Sopenharmony_ci u64 auth_input_type:1; 7062306a36Sopenharmony_ci u64 mac_len:8; 7162306a36Sopenharmony_ci u64 reserved_32_39:8; 7262306a36Sopenharmony_ci u64 encr_offset:16; 7362306a36Sopenharmony_ci u64 iv_offset:8; 7462306a36Sopenharmony_ci u64 auth_offset:8; 7562306a36Sopenharmony_ci#else 7662306a36Sopenharmony_ci u64 auth_offset:8; 7762306a36Sopenharmony_ci u64 iv_offset:8; 7862306a36Sopenharmony_ci u64 encr_offset:16; 7962306a36Sopenharmony_ci u64 reserved_32_39:8; 8062306a36Sopenharmony_ci u64 mac_len:8; 8162306a36Sopenharmony_ci u64 auth_input_type:1; 8262306a36Sopenharmony_ci u64 reserved_49_51:3; 8362306a36Sopenharmony_ci u64 mac_type:4; 8462306a36Sopenharmony_ci u64 iv_source:1; 8562306a36Sopenharmony_ci u64 aes_key:2; 8662306a36Sopenharmony_ci u64 reserved_59:1; 8762306a36Sopenharmony_ci u64 enc_cipher:4; 8862306a36Sopenharmony_ci#endif 8962306a36Sopenharmony_ci } e; 9062306a36Sopenharmony_ci}; 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_cistruct otx2_cpt_cipher { 9362306a36Sopenharmony_ci const char *name; 9462306a36Sopenharmony_ci u8 value; 9562306a36Sopenharmony_ci}; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cistruct otx2_cpt_fc_enc_ctx { 9862306a36Sopenharmony_ci union otx2_cpt_encr_ctrl enc_ctrl; 9962306a36Sopenharmony_ci u8 encr_key[32]; 10062306a36Sopenharmony_ci u8 encr_iv[16]; 10162306a36Sopenharmony_ci}; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ciunion otx2_cpt_fc_hmac_ctx { 10462306a36Sopenharmony_ci struct { 10562306a36Sopenharmony_ci u8 ipad[64]; 10662306a36Sopenharmony_ci u8 opad[64]; 10762306a36Sopenharmony_ci } e; 10862306a36Sopenharmony_ci struct { 10962306a36Sopenharmony_ci u8 hmac_calc[64]; /* HMAC calculated */ 11062306a36Sopenharmony_ci u8 hmac_recv[64]; /* HMAC received */ 11162306a36Sopenharmony_ci } s; 11262306a36Sopenharmony_ci}; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_cistruct otx2_cpt_fc_ctx { 11562306a36Sopenharmony_ci struct otx2_cpt_fc_enc_ctx enc; 11662306a36Sopenharmony_ci union otx2_cpt_fc_hmac_ctx hmac; 11762306a36Sopenharmony_ci}; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cistruct otx2_cpt_enc_ctx { 12062306a36Sopenharmony_ci u32 key_len; 12162306a36Sopenharmony_ci u8 enc_key[OTX2_CPT_MAX_KEY_SIZE]; 12262306a36Sopenharmony_ci u8 cipher_type; 12362306a36Sopenharmony_ci u8 key_type; 12462306a36Sopenharmony_ci u8 enc_align_len; 12562306a36Sopenharmony_ci struct crypto_skcipher *fbk_cipher; 12662306a36Sopenharmony_ci}; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ciunion otx2_cpt_offset_ctrl { 12962306a36Sopenharmony_ci u64 flags; 13062306a36Sopenharmony_ci struct { 13162306a36Sopenharmony_ci#if defined(__BIG_ENDIAN_BITFIELD) 13262306a36Sopenharmony_ci u64 reserved:32; 13362306a36Sopenharmony_ci u64 enc_data_offset:16; 13462306a36Sopenharmony_ci u64 iv_offset:8; 13562306a36Sopenharmony_ci u64 auth_offset:8; 13662306a36Sopenharmony_ci#else 13762306a36Sopenharmony_ci u64 auth_offset:8; 13862306a36Sopenharmony_ci u64 iv_offset:8; 13962306a36Sopenharmony_ci u64 enc_data_offset:16; 14062306a36Sopenharmony_ci u64 reserved:32; 14162306a36Sopenharmony_ci#endif 14262306a36Sopenharmony_ci } e; 14362306a36Sopenharmony_ci}; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_cistruct otx2_cpt_req_ctx { 14662306a36Sopenharmony_ci struct otx2_cpt_req_info cpt_req; 14762306a36Sopenharmony_ci union otx2_cpt_offset_ctrl ctrl_word; 14862306a36Sopenharmony_ci struct otx2_cpt_fc_ctx fctx; 14962306a36Sopenharmony_ci union { 15062306a36Sopenharmony_ci struct skcipher_request sk_fbk_req; 15162306a36Sopenharmony_ci struct aead_request fbk_req; 15262306a36Sopenharmony_ci }; 15362306a36Sopenharmony_ci}; 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_cistruct otx2_cpt_sdesc { 15662306a36Sopenharmony_ci struct shash_desc shash; 15762306a36Sopenharmony_ci}; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cistruct otx2_cpt_aead_ctx { 16062306a36Sopenharmony_ci u8 key[OTX2_CPT_MAX_KEY_SIZE]; 16162306a36Sopenharmony_ci struct crypto_shash *hashalg; 16262306a36Sopenharmony_ci struct otx2_cpt_sdesc *sdesc; 16362306a36Sopenharmony_ci struct crypto_aead *fbk_cipher; 16462306a36Sopenharmony_ci u8 *ipad; 16562306a36Sopenharmony_ci u8 *opad; 16662306a36Sopenharmony_ci u32 enc_key_len; 16762306a36Sopenharmony_ci u32 auth_key_len; 16862306a36Sopenharmony_ci u8 cipher_type; 16962306a36Sopenharmony_ci u8 mac_type; 17062306a36Sopenharmony_ci u8 key_type; 17162306a36Sopenharmony_ci u8 is_trunc_hmac; 17262306a36Sopenharmony_ci u8 enc_align_len; 17362306a36Sopenharmony_ci}; 17462306a36Sopenharmony_ciint otx2_cpt_crypto_init(struct pci_dev *pdev, struct module *mod, 17562306a36Sopenharmony_ci int num_queues, int num_devices); 17662306a36Sopenharmony_civoid otx2_cpt_crypto_exit(struct pci_dev *pdev, struct module *mod); 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci#endif /* __OTX2_CPT_ALGS_H */ 179