110b4f094SSrujanaChalla /* SPDX-License-Identifier: GPL-2.0 210b4f094SSrujanaChalla * Marvell OcteonTX CPT driver 310b4f094SSrujanaChalla * 410b4f094SSrujanaChalla * Copyright (C) 2019 Marvell International Ltd. 510b4f094SSrujanaChalla * 610b4f094SSrujanaChalla * This program is free software; you can redistribute it and/or modify 710b4f094SSrujanaChalla * it under the terms of the GNU General Public License version 2 as 810b4f094SSrujanaChalla * published by the Free Software Foundation. 910b4f094SSrujanaChalla */ 1010b4f094SSrujanaChalla 1110b4f094SSrujanaChalla #ifndef __OTX_CPT_ALGS_H 1210b4f094SSrujanaChalla #define __OTX_CPT_ALGS_H 1310b4f094SSrujanaChalla 1410b4f094SSrujanaChalla #include <crypto/hash.h> 1510b4f094SSrujanaChalla #include "otx_cpt_common.h" 1610b4f094SSrujanaChalla 1710b4f094SSrujanaChalla #define OTX_CPT_MAX_ENC_KEY_SIZE 32 1810b4f094SSrujanaChalla #define OTX_CPT_MAX_HASH_KEY_SIZE 64 1910b4f094SSrujanaChalla #define OTX_CPT_MAX_KEY_SIZE (OTX_CPT_MAX_ENC_KEY_SIZE + \ 2010b4f094SSrujanaChalla OTX_CPT_MAX_HASH_KEY_SIZE) 2110b4f094SSrujanaChalla enum otx_cpt_request_type { 2210b4f094SSrujanaChalla OTX_CPT_ENC_DEC_REQ = 0x1, 2310b4f094SSrujanaChalla OTX_CPT_AEAD_ENC_DEC_REQ = 0x2, 2410b4f094SSrujanaChalla OTX_CPT_AEAD_ENC_DEC_NULL_REQ = 0x3, 2510b4f094SSrujanaChalla OTX_CPT_PASSTHROUGH_REQ = 0x4 2610b4f094SSrujanaChalla }; 2710b4f094SSrujanaChalla 2810b4f094SSrujanaChalla enum otx_cpt_major_opcodes { 2910b4f094SSrujanaChalla OTX_CPT_MAJOR_OP_MISC = 0x01, 3010b4f094SSrujanaChalla OTX_CPT_MAJOR_OP_FC = 0x33, 3110b4f094SSrujanaChalla OTX_CPT_MAJOR_OP_HMAC = 0x35, 3210b4f094SSrujanaChalla }; 3310b4f094SSrujanaChalla 3410b4f094SSrujanaChalla enum otx_cpt_req_type { 3510b4f094SSrujanaChalla OTX_CPT_AE_CORE_REQ, 3610b4f094SSrujanaChalla OTX_CPT_SE_CORE_REQ 3710b4f094SSrujanaChalla }; 3810b4f094SSrujanaChalla 3910b4f094SSrujanaChalla enum otx_cpt_cipher_type { 4010b4f094SSrujanaChalla OTX_CPT_CIPHER_NULL = 0x0, 4110b4f094SSrujanaChalla OTX_CPT_DES3_CBC = 0x1, 4210b4f094SSrujanaChalla OTX_CPT_DES3_ECB = 0x2, 4310b4f094SSrujanaChalla OTX_CPT_AES_CBC = 0x3, 4410b4f094SSrujanaChalla OTX_CPT_AES_ECB = 0x4, 4510b4f094SSrujanaChalla OTX_CPT_AES_CFB = 0x5, 4610b4f094SSrujanaChalla OTX_CPT_AES_CTR = 0x6, 4710b4f094SSrujanaChalla OTX_CPT_AES_GCM = 0x7, 4810b4f094SSrujanaChalla OTX_CPT_AES_XTS = 0x8 4910b4f094SSrujanaChalla }; 5010b4f094SSrujanaChalla 5110b4f094SSrujanaChalla enum otx_cpt_mac_type { 5210b4f094SSrujanaChalla OTX_CPT_MAC_NULL = 0x0, 5310b4f094SSrujanaChalla OTX_CPT_MD5 = 0x1, 5410b4f094SSrujanaChalla OTX_CPT_SHA1 = 0x2, 5510b4f094SSrujanaChalla OTX_CPT_SHA224 = 0x3, 5610b4f094SSrujanaChalla OTX_CPT_SHA256 = 0x4, 5710b4f094SSrujanaChalla OTX_CPT_SHA384 = 0x5, 5810b4f094SSrujanaChalla OTX_CPT_SHA512 = 0x6, 5910b4f094SSrujanaChalla OTX_CPT_GMAC = 0x7 6010b4f094SSrujanaChalla }; 6110b4f094SSrujanaChalla 6210b4f094SSrujanaChalla enum otx_cpt_aes_key_len { 6310b4f094SSrujanaChalla OTX_CPT_AES_128_BIT = 0x1, 6410b4f094SSrujanaChalla OTX_CPT_AES_192_BIT = 0x2, 6510b4f094SSrujanaChalla OTX_CPT_AES_256_BIT = 0x3 6610b4f094SSrujanaChalla }; 6710b4f094SSrujanaChalla 6810b4f094SSrujanaChalla union otx_cpt_encr_ctrl { 69*a05b1c15SHerbert Xu __be64 flags; 70*a05b1c15SHerbert Xu u64 cflags; 7110b4f094SSrujanaChalla struct { 7210b4f094SSrujanaChalla #if defined(__BIG_ENDIAN_BITFIELD) 7310b4f094SSrujanaChalla u64 enc_cipher:4; 7410b4f094SSrujanaChalla u64 reserved1:1; 7510b4f094SSrujanaChalla u64 aes_key:2; 7610b4f094SSrujanaChalla u64 iv_source:1; 7710b4f094SSrujanaChalla u64 mac_type:4; 7810b4f094SSrujanaChalla u64 reserved2:3; 7910b4f094SSrujanaChalla u64 auth_input_type:1; 8010b4f094SSrujanaChalla u64 mac_len:8; 8110b4f094SSrujanaChalla u64 reserved3:8; 8210b4f094SSrujanaChalla u64 encr_offset:16; 8310b4f094SSrujanaChalla u64 iv_offset:8; 8410b4f094SSrujanaChalla u64 auth_offset:8; 8510b4f094SSrujanaChalla #else 8610b4f094SSrujanaChalla u64 auth_offset:8; 8710b4f094SSrujanaChalla u64 iv_offset:8; 8810b4f094SSrujanaChalla u64 encr_offset:16; 8910b4f094SSrujanaChalla u64 reserved3:8; 9010b4f094SSrujanaChalla u64 mac_len:8; 9110b4f094SSrujanaChalla u64 auth_input_type:1; 9210b4f094SSrujanaChalla u64 reserved2:3; 9310b4f094SSrujanaChalla u64 mac_type:4; 9410b4f094SSrujanaChalla u64 iv_source:1; 9510b4f094SSrujanaChalla u64 aes_key:2; 9610b4f094SSrujanaChalla u64 reserved1:1; 9710b4f094SSrujanaChalla u64 enc_cipher:4; 9810b4f094SSrujanaChalla #endif 9910b4f094SSrujanaChalla } e; 10010b4f094SSrujanaChalla }; 10110b4f094SSrujanaChalla 10210b4f094SSrujanaChalla struct otx_cpt_cipher { 10310b4f094SSrujanaChalla const char *name; 10410b4f094SSrujanaChalla u8 value; 10510b4f094SSrujanaChalla }; 10610b4f094SSrujanaChalla 10710b4f094SSrujanaChalla struct otx_cpt_enc_context { 10810b4f094SSrujanaChalla union otx_cpt_encr_ctrl enc_ctrl; 10910b4f094SSrujanaChalla u8 encr_key[32]; 11010b4f094SSrujanaChalla u8 encr_iv[16]; 11110b4f094SSrujanaChalla }; 11210b4f094SSrujanaChalla 11310b4f094SSrujanaChalla union otx_cpt_fchmac_ctx { 11410b4f094SSrujanaChalla struct { 11510b4f094SSrujanaChalla u8 ipad[64]; 11610b4f094SSrujanaChalla u8 opad[64]; 11710b4f094SSrujanaChalla } e; 11810b4f094SSrujanaChalla struct { 11910b4f094SSrujanaChalla u8 hmac_calc[64]; /* HMAC calculated */ 12010b4f094SSrujanaChalla u8 hmac_recv[64]; /* HMAC received */ 12110b4f094SSrujanaChalla } s; 12210b4f094SSrujanaChalla }; 12310b4f094SSrujanaChalla 12410b4f094SSrujanaChalla struct otx_cpt_fc_ctx { 12510b4f094SSrujanaChalla struct otx_cpt_enc_context enc; 12610b4f094SSrujanaChalla union otx_cpt_fchmac_ctx hmac; 12710b4f094SSrujanaChalla }; 12810b4f094SSrujanaChalla 12910b4f094SSrujanaChalla struct otx_cpt_enc_ctx { 13010b4f094SSrujanaChalla u32 key_len; 13110b4f094SSrujanaChalla u8 enc_key[OTX_CPT_MAX_KEY_SIZE]; 13210b4f094SSrujanaChalla u8 cipher_type; 13310b4f094SSrujanaChalla u8 key_type; 13410b4f094SSrujanaChalla }; 13510b4f094SSrujanaChalla 13610b4f094SSrujanaChalla struct otx_cpt_des3_ctx { 13710b4f094SSrujanaChalla u32 key_len; 13810b4f094SSrujanaChalla u8 des3_key[OTX_CPT_MAX_KEY_SIZE]; 13910b4f094SSrujanaChalla }; 14010b4f094SSrujanaChalla 14110b4f094SSrujanaChalla union otx_cpt_offset_ctrl_word { 142*a05b1c15SHerbert Xu __be64 flags; 143*a05b1c15SHerbert Xu u64 cflags; 14410b4f094SSrujanaChalla struct { 14510b4f094SSrujanaChalla #if defined(__BIG_ENDIAN_BITFIELD) 14610b4f094SSrujanaChalla u64 reserved:32; 14710b4f094SSrujanaChalla u64 enc_data_offset:16; 14810b4f094SSrujanaChalla u64 iv_offset:8; 14910b4f094SSrujanaChalla u64 auth_offset:8; 15010b4f094SSrujanaChalla #else 15110b4f094SSrujanaChalla u64 auth_offset:8; 15210b4f094SSrujanaChalla u64 iv_offset:8; 15310b4f094SSrujanaChalla u64 enc_data_offset:16; 15410b4f094SSrujanaChalla u64 reserved:32; 15510b4f094SSrujanaChalla #endif 15610b4f094SSrujanaChalla } e; 15710b4f094SSrujanaChalla }; 15810b4f094SSrujanaChalla 15910b4f094SSrujanaChalla struct otx_cpt_req_ctx { 16010b4f094SSrujanaChalla struct otx_cpt_req_info cpt_req; 16110b4f094SSrujanaChalla union otx_cpt_offset_ctrl_word ctrl_word; 16210b4f094SSrujanaChalla struct otx_cpt_fc_ctx fctx; 16310b4f094SSrujanaChalla }; 16410b4f094SSrujanaChalla 16510b4f094SSrujanaChalla struct otx_cpt_sdesc { 16610b4f094SSrujanaChalla struct shash_desc shash; 16710b4f094SSrujanaChalla }; 16810b4f094SSrujanaChalla 16910b4f094SSrujanaChalla struct otx_cpt_aead_ctx { 17010b4f094SSrujanaChalla u8 key[OTX_CPT_MAX_KEY_SIZE]; 17110b4f094SSrujanaChalla struct crypto_shash *hashalg; 17210b4f094SSrujanaChalla struct otx_cpt_sdesc *sdesc; 17310b4f094SSrujanaChalla u8 *ipad; 17410b4f094SSrujanaChalla u8 *opad; 17510b4f094SSrujanaChalla u32 enc_key_len; 17610b4f094SSrujanaChalla u32 auth_key_len; 17710b4f094SSrujanaChalla u8 cipher_type; 17810b4f094SSrujanaChalla u8 mac_type; 17910b4f094SSrujanaChalla u8 key_type; 18010b4f094SSrujanaChalla u8 is_trunc_hmac; 18110b4f094SSrujanaChalla }; 18210b4f094SSrujanaChalla int otx_cpt_crypto_init(struct pci_dev *pdev, struct module *mod, 18310b4f094SSrujanaChalla enum otx_cptpf_type pf_type, 18410b4f094SSrujanaChalla enum otx_cptvf_type engine_type, 18510b4f094SSrujanaChalla int num_queues, int num_devices); 18610b4f094SSrujanaChalla void otx_cpt_crypto_exit(struct pci_dev *pdev, struct module *mod, 18710b4f094SSrujanaChalla enum otx_cptvf_type engine_type); 18810b4f094SSrujanaChalla void otx_cpt_callback(int status, void *arg, void *req); 18910b4f094SSrujanaChalla 19010b4f094SSrujanaChalla #endif /* __OTX_CPT_ALGS_H */ 191