1 /* SPDX-License-Identifier: GPL-2.0 2 * Marvell OcteonTX CPT driver 3 * 4 * Copyright (C) 2019 Marvell International Ltd. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 */ 10 11 #ifndef __OTX_CPT_ALGS_H 12 #define __OTX_CPT_ALGS_H 13 14 #include <crypto/hash.h> 15 #include "otx_cpt_common.h" 16 17 #define OTX_CPT_MAX_ENC_KEY_SIZE 32 18 #define OTX_CPT_MAX_HASH_KEY_SIZE 64 19 #define OTX_CPT_MAX_KEY_SIZE (OTX_CPT_MAX_ENC_KEY_SIZE + \ 20 OTX_CPT_MAX_HASH_KEY_SIZE) 21 enum otx_cpt_request_type { 22 OTX_CPT_ENC_DEC_REQ = 0x1, 23 OTX_CPT_AEAD_ENC_DEC_REQ = 0x2, 24 OTX_CPT_AEAD_ENC_DEC_NULL_REQ = 0x3, 25 OTX_CPT_PASSTHROUGH_REQ = 0x4 26 }; 27 28 enum otx_cpt_major_opcodes { 29 OTX_CPT_MAJOR_OP_MISC = 0x01, 30 OTX_CPT_MAJOR_OP_FC = 0x33, 31 OTX_CPT_MAJOR_OP_HMAC = 0x35, 32 }; 33 34 enum otx_cpt_req_type { 35 OTX_CPT_AE_CORE_REQ, 36 OTX_CPT_SE_CORE_REQ 37 }; 38 39 enum otx_cpt_cipher_type { 40 OTX_CPT_CIPHER_NULL = 0x0, 41 OTX_CPT_DES3_CBC = 0x1, 42 OTX_CPT_DES3_ECB = 0x2, 43 OTX_CPT_AES_CBC = 0x3, 44 OTX_CPT_AES_ECB = 0x4, 45 OTX_CPT_AES_CFB = 0x5, 46 OTX_CPT_AES_CTR = 0x6, 47 OTX_CPT_AES_GCM = 0x7, 48 OTX_CPT_AES_XTS = 0x8 49 }; 50 51 enum otx_cpt_mac_type { 52 OTX_CPT_MAC_NULL = 0x0, 53 OTX_CPT_MD5 = 0x1, 54 OTX_CPT_SHA1 = 0x2, 55 OTX_CPT_SHA224 = 0x3, 56 OTX_CPT_SHA256 = 0x4, 57 OTX_CPT_SHA384 = 0x5, 58 OTX_CPT_SHA512 = 0x6, 59 OTX_CPT_GMAC = 0x7 60 }; 61 62 enum otx_cpt_aes_key_len { 63 OTX_CPT_AES_128_BIT = 0x1, 64 OTX_CPT_AES_192_BIT = 0x2, 65 OTX_CPT_AES_256_BIT = 0x3 66 }; 67 68 union otx_cpt_encr_ctrl { 69 u64 flags; 70 struct { 71 #if defined(__BIG_ENDIAN_BITFIELD) 72 u64 enc_cipher:4; 73 u64 reserved1:1; 74 u64 aes_key:2; 75 u64 iv_source:1; 76 u64 mac_type:4; 77 u64 reserved2:3; 78 u64 auth_input_type:1; 79 u64 mac_len:8; 80 u64 reserved3:8; 81 u64 encr_offset:16; 82 u64 iv_offset:8; 83 u64 auth_offset:8; 84 #else 85 u64 auth_offset:8; 86 u64 iv_offset:8; 87 u64 encr_offset:16; 88 u64 reserved3:8; 89 u64 mac_len:8; 90 u64 auth_input_type:1; 91 u64 reserved2:3; 92 u64 mac_type:4; 93 u64 iv_source:1; 94 u64 aes_key:2; 95 u64 reserved1:1; 96 u64 enc_cipher:4; 97 #endif 98 } e; 99 }; 100 101 struct otx_cpt_cipher { 102 const char *name; 103 u8 value; 104 }; 105 106 struct otx_cpt_enc_context { 107 union otx_cpt_encr_ctrl enc_ctrl; 108 u8 encr_key[32]; 109 u8 encr_iv[16]; 110 }; 111 112 union otx_cpt_fchmac_ctx { 113 struct { 114 u8 ipad[64]; 115 u8 opad[64]; 116 } e; 117 struct { 118 u8 hmac_calc[64]; /* HMAC calculated */ 119 u8 hmac_recv[64]; /* HMAC received */ 120 } s; 121 }; 122 123 struct otx_cpt_fc_ctx { 124 struct otx_cpt_enc_context enc; 125 union otx_cpt_fchmac_ctx hmac; 126 }; 127 128 struct otx_cpt_enc_ctx { 129 u32 key_len; 130 u8 enc_key[OTX_CPT_MAX_KEY_SIZE]; 131 u8 cipher_type; 132 u8 key_type; 133 }; 134 135 struct otx_cpt_des3_ctx { 136 u32 key_len; 137 u8 des3_key[OTX_CPT_MAX_KEY_SIZE]; 138 }; 139 140 union otx_cpt_offset_ctrl_word { 141 u64 flags; 142 struct { 143 #if defined(__BIG_ENDIAN_BITFIELD) 144 u64 reserved:32; 145 u64 enc_data_offset:16; 146 u64 iv_offset:8; 147 u64 auth_offset:8; 148 #else 149 u64 auth_offset:8; 150 u64 iv_offset:8; 151 u64 enc_data_offset:16; 152 u64 reserved:32; 153 #endif 154 } e; 155 }; 156 157 struct otx_cpt_req_ctx { 158 struct otx_cpt_req_info cpt_req; 159 union otx_cpt_offset_ctrl_word ctrl_word; 160 struct otx_cpt_fc_ctx fctx; 161 }; 162 163 struct otx_cpt_sdesc { 164 struct shash_desc shash; 165 }; 166 167 struct otx_cpt_aead_ctx { 168 u8 key[OTX_CPT_MAX_KEY_SIZE]; 169 struct crypto_shash *hashalg; 170 struct otx_cpt_sdesc *sdesc; 171 u8 *ipad; 172 u8 *opad; 173 u32 enc_key_len; 174 u32 auth_key_len; 175 u8 cipher_type; 176 u8 mac_type; 177 u8 key_type; 178 u8 is_trunc_hmac; 179 }; 180 int otx_cpt_crypto_init(struct pci_dev *pdev, struct module *mod, 181 enum otx_cptpf_type pf_type, 182 enum otx_cptvf_type engine_type, 183 int num_queues, int num_devices); 184 void otx_cpt_crypto_exit(struct pci_dev *pdev, struct module *mod, 185 enum otx_cptvf_type engine_type); 186 void otx_cpt_callback(int status, void *arg, void *req); 187 188 #endif /* __OTX_CPT_ALGS_H */ 189