1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright 2016 Broadcom 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun /* 7*4882a593Smuzhiyun * This file contains SPU message definitions specific to SPU2. 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef _SPU2_H 11*4882a593Smuzhiyun #define _SPU2_H 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun enum spu2_cipher_type { 14*4882a593Smuzhiyun SPU2_CIPHER_TYPE_NONE = 0x0, 15*4882a593Smuzhiyun SPU2_CIPHER_TYPE_AES128 = 0x1, 16*4882a593Smuzhiyun SPU2_CIPHER_TYPE_AES192 = 0x2, 17*4882a593Smuzhiyun SPU2_CIPHER_TYPE_AES256 = 0x3, 18*4882a593Smuzhiyun SPU2_CIPHER_TYPE_DES = 0x4, 19*4882a593Smuzhiyun SPU2_CIPHER_TYPE_3DES = 0x5, 20*4882a593Smuzhiyun SPU2_CIPHER_TYPE_LAST 21*4882a593Smuzhiyun }; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun enum spu2_cipher_mode { 24*4882a593Smuzhiyun SPU2_CIPHER_MODE_ECB = 0x0, 25*4882a593Smuzhiyun SPU2_CIPHER_MODE_CBC = 0x1, 26*4882a593Smuzhiyun SPU2_CIPHER_MODE_CTR = 0x2, 27*4882a593Smuzhiyun SPU2_CIPHER_MODE_CFB = 0x3, 28*4882a593Smuzhiyun SPU2_CIPHER_MODE_OFB = 0x4, 29*4882a593Smuzhiyun SPU2_CIPHER_MODE_XTS = 0x5, 30*4882a593Smuzhiyun SPU2_CIPHER_MODE_CCM = 0x6, 31*4882a593Smuzhiyun SPU2_CIPHER_MODE_GCM = 0x7, 32*4882a593Smuzhiyun SPU2_CIPHER_MODE_LAST 33*4882a593Smuzhiyun }; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun enum spu2_hash_type { 36*4882a593Smuzhiyun SPU2_HASH_TYPE_NONE = 0x0, 37*4882a593Smuzhiyun SPU2_HASH_TYPE_AES128 = 0x1, 38*4882a593Smuzhiyun SPU2_HASH_TYPE_AES192 = 0x2, 39*4882a593Smuzhiyun SPU2_HASH_TYPE_AES256 = 0x3, 40*4882a593Smuzhiyun SPU2_HASH_TYPE_MD5 = 0x6, 41*4882a593Smuzhiyun SPU2_HASH_TYPE_SHA1 = 0x7, 42*4882a593Smuzhiyun SPU2_HASH_TYPE_SHA224 = 0x8, 43*4882a593Smuzhiyun SPU2_HASH_TYPE_SHA256 = 0x9, 44*4882a593Smuzhiyun SPU2_HASH_TYPE_SHA384 = 0xa, 45*4882a593Smuzhiyun SPU2_HASH_TYPE_SHA512 = 0xb, 46*4882a593Smuzhiyun SPU2_HASH_TYPE_SHA512_224 = 0xc, 47*4882a593Smuzhiyun SPU2_HASH_TYPE_SHA512_256 = 0xd, 48*4882a593Smuzhiyun SPU2_HASH_TYPE_SHA3_224 = 0xe, 49*4882a593Smuzhiyun SPU2_HASH_TYPE_SHA3_256 = 0xf, 50*4882a593Smuzhiyun SPU2_HASH_TYPE_SHA3_384 = 0x10, 51*4882a593Smuzhiyun SPU2_HASH_TYPE_SHA3_512 = 0x11, 52*4882a593Smuzhiyun SPU2_HASH_TYPE_LAST 53*4882a593Smuzhiyun }; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun enum spu2_hash_mode { 56*4882a593Smuzhiyun SPU2_HASH_MODE_CMAC = 0x0, 57*4882a593Smuzhiyun SPU2_HASH_MODE_CBC_MAC = 0x1, 58*4882a593Smuzhiyun SPU2_HASH_MODE_XCBC_MAC = 0x2, 59*4882a593Smuzhiyun SPU2_HASH_MODE_HMAC = 0x3, 60*4882a593Smuzhiyun SPU2_HASH_MODE_RABIN = 0x4, 61*4882a593Smuzhiyun SPU2_HASH_MODE_CCM = 0x5, 62*4882a593Smuzhiyun SPU2_HASH_MODE_GCM = 0x6, 63*4882a593Smuzhiyun SPU2_HASH_MODE_RESERVED = 0x7, 64*4882a593Smuzhiyun SPU2_HASH_MODE_LAST 65*4882a593Smuzhiyun }; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun enum spu2_ret_md_opts { 68*4882a593Smuzhiyun SPU2_RET_NO_MD = 0, /* return no metadata */ 69*4882a593Smuzhiyun SPU2_RET_FMD_OMD = 1, /* return both FMD and OMD */ 70*4882a593Smuzhiyun SPU2_RET_FMD_ONLY = 2, /* return only FMD */ 71*4882a593Smuzhiyun SPU2_RET_FMD_OMD_IV = 3, /* return FMD and OMD with just IVs */ 72*4882a593Smuzhiyun }; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun /* Fixed Metadata format */ 75*4882a593Smuzhiyun struct SPU2_FMD { 76*4882a593Smuzhiyun u64 ctrl0; 77*4882a593Smuzhiyun u64 ctrl1; 78*4882a593Smuzhiyun u64 ctrl2; 79*4882a593Smuzhiyun u64 ctrl3; 80*4882a593Smuzhiyun }; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun #define FMD_SIZE sizeof(struct SPU2_FMD) 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun /* Fixed part of request message header length in bytes. Just FMD. */ 85*4882a593Smuzhiyun #define SPU2_REQ_FIXED_LEN FMD_SIZE 86*4882a593Smuzhiyun #define SPU2_HEADER_ALLOC_LEN (SPU_REQ_FIXED_LEN + \ 87*4882a593Smuzhiyun 2 * MAX_KEY_SIZE + 2 * MAX_IV_SIZE) 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* FMD ctrl0 field masks */ 90*4882a593Smuzhiyun #define SPU2_CIPH_ENCRYPT_EN 0x1 /* 0: decrypt, 1: encrypt */ 91*4882a593Smuzhiyun #define SPU2_CIPH_TYPE 0xF0 /* one of spu2_cipher_type */ 92*4882a593Smuzhiyun #define SPU2_CIPH_TYPE_SHIFT 4 93*4882a593Smuzhiyun #define SPU2_CIPH_MODE 0xF00 /* one of spu2_cipher_mode */ 94*4882a593Smuzhiyun #define SPU2_CIPH_MODE_SHIFT 8 95*4882a593Smuzhiyun #define SPU2_CFB_MASK 0x7000 /* cipher feedback mask */ 96*4882a593Smuzhiyun #define SPU2_CFB_MASK_SHIFT 12 97*4882a593Smuzhiyun #define SPU2_PROTO_SEL 0xF00000 /* MACsec, IPsec, TLS... */ 98*4882a593Smuzhiyun #define SPU2_PROTO_SEL_SHIFT 20 99*4882a593Smuzhiyun #define SPU2_HASH_FIRST 0x1000000 /* 1: hash input is input pkt 100*4882a593Smuzhiyun * data 101*4882a593Smuzhiyun */ 102*4882a593Smuzhiyun #define SPU2_CHK_TAG 0x2000000 /* 1: check digest provided */ 103*4882a593Smuzhiyun #define SPU2_HASH_TYPE 0x1F0000000 /* one of spu2_hash_type */ 104*4882a593Smuzhiyun #define SPU2_HASH_TYPE_SHIFT 28 105*4882a593Smuzhiyun #define SPU2_HASH_MODE 0xF000000000 /* one of spu2_hash_mode */ 106*4882a593Smuzhiyun #define SPU2_HASH_MODE_SHIFT 36 107*4882a593Smuzhiyun #define SPU2_CIPH_PAD_EN 0x100000000000 /* 1: Add pad to end of payload for 108*4882a593Smuzhiyun * enc 109*4882a593Smuzhiyun */ 110*4882a593Smuzhiyun #define SPU2_CIPH_PAD 0xFF000000000000 /* cipher pad value */ 111*4882a593Smuzhiyun #define SPU2_CIPH_PAD_SHIFT 48 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun /* FMD ctrl1 field masks */ 114*4882a593Smuzhiyun #define SPU2_TAG_LOC 0x1 /* 1: end of payload, 0: undef */ 115*4882a593Smuzhiyun #define SPU2_HAS_FR_DATA 0x2 /* 1: msg has frame data */ 116*4882a593Smuzhiyun #define SPU2_HAS_AAD1 0x4 /* 1: msg has AAD1 field */ 117*4882a593Smuzhiyun #define SPU2_HAS_NAAD 0x8 /* 1: msg has NAAD field */ 118*4882a593Smuzhiyun #define SPU2_HAS_AAD2 0x10 /* 1: msg has AAD2 field */ 119*4882a593Smuzhiyun #define SPU2_HAS_ESN 0x20 /* 1: msg has ESN field */ 120*4882a593Smuzhiyun #define SPU2_HASH_KEY_LEN 0xFF00 /* len of hash key in bytes. 121*4882a593Smuzhiyun * HMAC only. 122*4882a593Smuzhiyun */ 123*4882a593Smuzhiyun #define SPU2_HASH_KEY_LEN_SHIFT 8 124*4882a593Smuzhiyun #define SPU2_CIPH_KEY_LEN 0xFF00000 /* len of cipher key in bytes */ 125*4882a593Smuzhiyun #define SPU2_CIPH_KEY_LEN_SHIFT 20 126*4882a593Smuzhiyun #define SPU2_GENIV 0x10000000 /* 1: hw generates IV */ 127*4882a593Smuzhiyun #define SPU2_HASH_IV 0x20000000 /* 1: IV incl in hash */ 128*4882a593Smuzhiyun #define SPU2_RET_IV 0x40000000 /* 1: return IV in output msg 129*4882a593Smuzhiyun * b4 payload 130*4882a593Smuzhiyun */ 131*4882a593Smuzhiyun #define SPU2_RET_IV_LEN 0xF00000000 /* length in bytes of IV returned. 132*4882a593Smuzhiyun * 0 = 16 bytes 133*4882a593Smuzhiyun */ 134*4882a593Smuzhiyun #define SPU2_RET_IV_LEN_SHIFT 32 135*4882a593Smuzhiyun #define SPU2_IV_OFFSET 0xF000000000 /* gen IV offset */ 136*4882a593Smuzhiyun #define SPU2_IV_OFFSET_SHIFT 36 137*4882a593Smuzhiyun #define SPU2_IV_LEN 0x1F0000000000 /* length of input IV in bytes */ 138*4882a593Smuzhiyun #define SPU2_IV_LEN_SHIFT 40 139*4882a593Smuzhiyun #define SPU2_HASH_TAG_LEN 0x7F000000000000 /* hash tag length in bytes */ 140*4882a593Smuzhiyun #define SPU2_HASH_TAG_LEN_SHIFT 48 141*4882a593Smuzhiyun #define SPU2_RETURN_MD 0x300000000000000 /* return metadata */ 142*4882a593Smuzhiyun #define SPU2_RETURN_MD_SHIFT 56 143*4882a593Smuzhiyun #define SPU2_RETURN_FD 0x400000000000000 144*4882a593Smuzhiyun #define SPU2_RETURN_AAD1 0x800000000000000 145*4882a593Smuzhiyun #define SPU2_RETURN_NAAD 0x1000000000000000 146*4882a593Smuzhiyun #define SPU2_RETURN_AAD2 0x2000000000000000 147*4882a593Smuzhiyun #define SPU2_RETURN_PAY 0x4000000000000000 /* return payload */ 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun /* FMD ctrl2 field masks */ 150*4882a593Smuzhiyun #define SPU2_AAD1_OFFSET 0xFFF /* byte offset of AAD1 field */ 151*4882a593Smuzhiyun #define SPU2_AAD1_LEN 0xFF000 /* length of AAD1 in bytes */ 152*4882a593Smuzhiyun #define SPU2_AAD1_LEN_SHIFT 12 153*4882a593Smuzhiyun #define SPU2_AAD2_OFFSET 0xFFF00000 /* byte offset of AAD2 field */ 154*4882a593Smuzhiyun #define SPU2_AAD2_OFFSET_SHIFT 20 155*4882a593Smuzhiyun #define SPU2_PL_OFFSET 0xFFFFFFFF00000000 /* payload offset from AAD2 */ 156*4882a593Smuzhiyun #define SPU2_PL_OFFSET_SHIFT 32 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun /* FMD ctrl3 field masks */ 159*4882a593Smuzhiyun #define SPU2_PL_LEN 0xFFFFFFFF /* payload length in bytes */ 160*4882a593Smuzhiyun #define SPU2_TLS_LEN 0xFFFF00000000 /* TLS encrypt: cipher len 161*4882a593Smuzhiyun * TLS decrypt: compressed len 162*4882a593Smuzhiyun */ 163*4882a593Smuzhiyun #define SPU2_TLS_LEN_SHIFT 32 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun /* 166*4882a593Smuzhiyun * Max value that can be represented in the Payload Length field of the 167*4882a593Smuzhiyun * ctrl3 word of FMD. 168*4882a593Smuzhiyun */ 169*4882a593Smuzhiyun #define SPU2_MAX_PAYLOAD SPU2_PL_LEN 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun /* Error values returned in STATUS field of response messages */ 172*4882a593Smuzhiyun #define SPU2_INVALID_ICV 1 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun void spu2_dump_msg_hdr(u8 *buf, unsigned int buf_len); 175*4882a593Smuzhiyun u32 spu2_ctx_max_payload(enum spu_cipher_alg cipher_alg, 176*4882a593Smuzhiyun enum spu_cipher_mode cipher_mode, 177*4882a593Smuzhiyun unsigned int blocksize); 178*4882a593Smuzhiyun u32 spu2_payload_length(u8 *spu_hdr); 179*4882a593Smuzhiyun u16 spu2_response_hdr_len(u16 auth_key_len, u16 enc_key_len, bool is_hash); 180*4882a593Smuzhiyun u16 spu2_hash_pad_len(enum hash_alg hash_alg, enum hash_mode hash_mode, 181*4882a593Smuzhiyun u32 chunksize, u16 hash_block_size); 182*4882a593Smuzhiyun u32 spu2_gcm_ccm_pad_len(enum spu_cipher_mode cipher_mode, 183*4882a593Smuzhiyun unsigned int data_size); 184*4882a593Smuzhiyun u32 spu2_assoc_resp_len(enum spu_cipher_mode cipher_mode, 185*4882a593Smuzhiyun unsigned int assoc_len, unsigned int iv_len, 186*4882a593Smuzhiyun bool is_encrypt); 187*4882a593Smuzhiyun u8 spu2_aead_ivlen(enum spu_cipher_mode cipher_mode, 188*4882a593Smuzhiyun u16 iv_len); 189*4882a593Smuzhiyun enum hash_type spu2_hash_type(u32 src_sent); 190*4882a593Smuzhiyun u32 spu2_digest_size(u32 alg_digest_size, enum hash_alg alg, 191*4882a593Smuzhiyun enum hash_type htype); 192*4882a593Smuzhiyun u32 spu2_create_request(u8 *spu_hdr, 193*4882a593Smuzhiyun struct spu_request_opts *req_opts, 194*4882a593Smuzhiyun struct spu_cipher_parms *cipher_parms, 195*4882a593Smuzhiyun struct spu_hash_parms *hash_parms, 196*4882a593Smuzhiyun struct spu_aead_parms *aead_parms, 197*4882a593Smuzhiyun unsigned int data_size); 198*4882a593Smuzhiyun u16 spu2_cipher_req_init(u8 *spu_hdr, struct spu_cipher_parms *cipher_parms); 199*4882a593Smuzhiyun void spu2_cipher_req_finish(u8 *spu_hdr, 200*4882a593Smuzhiyun u16 spu_req_hdr_len, 201*4882a593Smuzhiyun unsigned int is_inbound, 202*4882a593Smuzhiyun struct spu_cipher_parms *cipher_parms, 203*4882a593Smuzhiyun unsigned int data_size); 204*4882a593Smuzhiyun void spu2_request_pad(u8 *pad_start, u32 gcm_padding, u32 hash_pad_len, 205*4882a593Smuzhiyun enum hash_alg auth_alg, enum hash_mode auth_mode, 206*4882a593Smuzhiyun unsigned int total_sent, u32 status_padding); 207*4882a593Smuzhiyun u8 spu2_xts_tweak_in_payload(void); 208*4882a593Smuzhiyun u8 spu2_tx_status_len(void); 209*4882a593Smuzhiyun u8 spu2_rx_status_len(void); 210*4882a593Smuzhiyun int spu2_status_process(u8 *statp); 211*4882a593Smuzhiyun void spu2_ccm_update_iv(unsigned int digestsize, 212*4882a593Smuzhiyun struct spu_cipher_parms *cipher_parms, 213*4882a593Smuzhiyun unsigned int assoclen, unsigned int chunksize, 214*4882a593Smuzhiyun bool is_encrypt, bool is_esp); 215*4882a593Smuzhiyun u32 spu2_wordalign_padlen(u32 data_size); 216*4882a593Smuzhiyun #endif 217