18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright 2016 Broadcom 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci/* 78c2ecf20Sopenharmony_ci * This file contains SPU message definitions specific to SPU2. 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#ifndef _SPU2_H 118c2ecf20Sopenharmony_ci#define _SPU2_H 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_cienum spu2_cipher_type { 148c2ecf20Sopenharmony_ci SPU2_CIPHER_TYPE_NONE = 0x0, 158c2ecf20Sopenharmony_ci SPU2_CIPHER_TYPE_AES128 = 0x1, 168c2ecf20Sopenharmony_ci SPU2_CIPHER_TYPE_AES192 = 0x2, 178c2ecf20Sopenharmony_ci SPU2_CIPHER_TYPE_AES256 = 0x3, 188c2ecf20Sopenharmony_ci SPU2_CIPHER_TYPE_DES = 0x4, 198c2ecf20Sopenharmony_ci SPU2_CIPHER_TYPE_3DES = 0x5, 208c2ecf20Sopenharmony_ci SPU2_CIPHER_TYPE_LAST 218c2ecf20Sopenharmony_ci}; 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_cienum spu2_cipher_mode { 248c2ecf20Sopenharmony_ci SPU2_CIPHER_MODE_ECB = 0x0, 258c2ecf20Sopenharmony_ci SPU2_CIPHER_MODE_CBC = 0x1, 268c2ecf20Sopenharmony_ci SPU2_CIPHER_MODE_CTR = 0x2, 278c2ecf20Sopenharmony_ci SPU2_CIPHER_MODE_CFB = 0x3, 288c2ecf20Sopenharmony_ci SPU2_CIPHER_MODE_OFB = 0x4, 298c2ecf20Sopenharmony_ci SPU2_CIPHER_MODE_XTS = 0x5, 308c2ecf20Sopenharmony_ci SPU2_CIPHER_MODE_CCM = 0x6, 318c2ecf20Sopenharmony_ci SPU2_CIPHER_MODE_GCM = 0x7, 328c2ecf20Sopenharmony_ci SPU2_CIPHER_MODE_LAST 338c2ecf20Sopenharmony_ci}; 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_cienum spu2_hash_type { 368c2ecf20Sopenharmony_ci SPU2_HASH_TYPE_NONE = 0x0, 378c2ecf20Sopenharmony_ci SPU2_HASH_TYPE_AES128 = 0x1, 388c2ecf20Sopenharmony_ci SPU2_HASH_TYPE_AES192 = 0x2, 398c2ecf20Sopenharmony_ci SPU2_HASH_TYPE_AES256 = 0x3, 408c2ecf20Sopenharmony_ci SPU2_HASH_TYPE_MD5 = 0x6, 418c2ecf20Sopenharmony_ci SPU2_HASH_TYPE_SHA1 = 0x7, 428c2ecf20Sopenharmony_ci SPU2_HASH_TYPE_SHA224 = 0x8, 438c2ecf20Sopenharmony_ci SPU2_HASH_TYPE_SHA256 = 0x9, 448c2ecf20Sopenharmony_ci SPU2_HASH_TYPE_SHA384 = 0xa, 458c2ecf20Sopenharmony_ci SPU2_HASH_TYPE_SHA512 = 0xb, 468c2ecf20Sopenharmony_ci SPU2_HASH_TYPE_SHA512_224 = 0xc, 478c2ecf20Sopenharmony_ci SPU2_HASH_TYPE_SHA512_256 = 0xd, 488c2ecf20Sopenharmony_ci SPU2_HASH_TYPE_SHA3_224 = 0xe, 498c2ecf20Sopenharmony_ci SPU2_HASH_TYPE_SHA3_256 = 0xf, 508c2ecf20Sopenharmony_ci SPU2_HASH_TYPE_SHA3_384 = 0x10, 518c2ecf20Sopenharmony_ci SPU2_HASH_TYPE_SHA3_512 = 0x11, 528c2ecf20Sopenharmony_ci SPU2_HASH_TYPE_LAST 538c2ecf20Sopenharmony_ci}; 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_cienum spu2_hash_mode { 568c2ecf20Sopenharmony_ci SPU2_HASH_MODE_CMAC = 0x0, 578c2ecf20Sopenharmony_ci SPU2_HASH_MODE_CBC_MAC = 0x1, 588c2ecf20Sopenharmony_ci SPU2_HASH_MODE_XCBC_MAC = 0x2, 598c2ecf20Sopenharmony_ci SPU2_HASH_MODE_HMAC = 0x3, 608c2ecf20Sopenharmony_ci SPU2_HASH_MODE_RABIN = 0x4, 618c2ecf20Sopenharmony_ci SPU2_HASH_MODE_CCM = 0x5, 628c2ecf20Sopenharmony_ci SPU2_HASH_MODE_GCM = 0x6, 638c2ecf20Sopenharmony_ci SPU2_HASH_MODE_RESERVED = 0x7, 648c2ecf20Sopenharmony_ci SPU2_HASH_MODE_LAST 658c2ecf20Sopenharmony_ci}; 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_cienum spu2_ret_md_opts { 688c2ecf20Sopenharmony_ci SPU2_RET_NO_MD = 0, /* return no metadata */ 698c2ecf20Sopenharmony_ci SPU2_RET_FMD_OMD = 1, /* return both FMD and OMD */ 708c2ecf20Sopenharmony_ci SPU2_RET_FMD_ONLY = 2, /* return only FMD */ 718c2ecf20Sopenharmony_ci SPU2_RET_FMD_OMD_IV = 3, /* return FMD and OMD with just IVs */ 728c2ecf20Sopenharmony_ci}; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci/* Fixed Metadata format */ 758c2ecf20Sopenharmony_cistruct SPU2_FMD { 768c2ecf20Sopenharmony_ci u64 ctrl0; 778c2ecf20Sopenharmony_ci u64 ctrl1; 788c2ecf20Sopenharmony_ci u64 ctrl2; 798c2ecf20Sopenharmony_ci u64 ctrl3; 808c2ecf20Sopenharmony_ci}; 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci#define FMD_SIZE sizeof(struct SPU2_FMD) 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci/* Fixed part of request message header length in bytes. Just FMD. */ 858c2ecf20Sopenharmony_ci#define SPU2_REQ_FIXED_LEN FMD_SIZE 868c2ecf20Sopenharmony_ci#define SPU2_HEADER_ALLOC_LEN (SPU_REQ_FIXED_LEN + \ 878c2ecf20Sopenharmony_ci 2 * MAX_KEY_SIZE + 2 * MAX_IV_SIZE) 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci/* FMD ctrl0 field masks */ 908c2ecf20Sopenharmony_ci#define SPU2_CIPH_ENCRYPT_EN 0x1 /* 0: decrypt, 1: encrypt */ 918c2ecf20Sopenharmony_ci#define SPU2_CIPH_TYPE 0xF0 /* one of spu2_cipher_type */ 928c2ecf20Sopenharmony_ci#define SPU2_CIPH_TYPE_SHIFT 4 938c2ecf20Sopenharmony_ci#define SPU2_CIPH_MODE 0xF00 /* one of spu2_cipher_mode */ 948c2ecf20Sopenharmony_ci#define SPU2_CIPH_MODE_SHIFT 8 958c2ecf20Sopenharmony_ci#define SPU2_CFB_MASK 0x7000 /* cipher feedback mask */ 968c2ecf20Sopenharmony_ci#define SPU2_CFB_MASK_SHIFT 12 978c2ecf20Sopenharmony_ci#define SPU2_PROTO_SEL 0xF00000 /* MACsec, IPsec, TLS... */ 988c2ecf20Sopenharmony_ci#define SPU2_PROTO_SEL_SHIFT 20 998c2ecf20Sopenharmony_ci#define SPU2_HASH_FIRST 0x1000000 /* 1: hash input is input pkt 1008c2ecf20Sopenharmony_ci * data 1018c2ecf20Sopenharmony_ci */ 1028c2ecf20Sopenharmony_ci#define SPU2_CHK_TAG 0x2000000 /* 1: check digest provided */ 1038c2ecf20Sopenharmony_ci#define SPU2_HASH_TYPE 0x1F0000000 /* one of spu2_hash_type */ 1048c2ecf20Sopenharmony_ci#define SPU2_HASH_TYPE_SHIFT 28 1058c2ecf20Sopenharmony_ci#define SPU2_HASH_MODE 0xF000000000 /* one of spu2_hash_mode */ 1068c2ecf20Sopenharmony_ci#define SPU2_HASH_MODE_SHIFT 36 1078c2ecf20Sopenharmony_ci#define SPU2_CIPH_PAD_EN 0x100000000000 /* 1: Add pad to end of payload for 1088c2ecf20Sopenharmony_ci * enc 1098c2ecf20Sopenharmony_ci */ 1108c2ecf20Sopenharmony_ci#define SPU2_CIPH_PAD 0xFF000000000000 /* cipher pad value */ 1118c2ecf20Sopenharmony_ci#define SPU2_CIPH_PAD_SHIFT 48 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci/* FMD ctrl1 field masks */ 1148c2ecf20Sopenharmony_ci#define SPU2_TAG_LOC 0x1 /* 1: end of payload, 0: undef */ 1158c2ecf20Sopenharmony_ci#define SPU2_HAS_FR_DATA 0x2 /* 1: msg has frame data */ 1168c2ecf20Sopenharmony_ci#define SPU2_HAS_AAD1 0x4 /* 1: msg has AAD1 field */ 1178c2ecf20Sopenharmony_ci#define SPU2_HAS_NAAD 0x8 /* 1: msg has NAAD field */ 1188c2ecf20Sopenharmony_ci#define SPU2_HAS_AAD2 0x10 /* 1: msg has AAD2 field */ 1198c2ecf20Sopenharmony_ci#define SPU2_HAS_ESN 0x20 /* 1: msg has ESN field */ 1208c2ecf20Sopenharmony_ci#define SPU2_HASH_KEY_LEN 0xFF00 /* len of hash key in bytes. 1218c2ecf20Sopenharmony_ci * HMAC only. 1228c2ecf20Sopenharmony_ci */ 1238c2ecf20Sopenharmony_ci#define SPU2_HASH_KEY_LEN_SHIFT 8 1248c2ecf20Sopenharmony_ci#define SPU2_CIPH_KEY_LEN 0xFF00000 /* len of cipher key in bytes */ 1258c2ecf20Sopenharmony_ci#define SPU2_CIPH_KEY_LEN_SHIFT 20 1268c2ecf20Sopenharmony_ci#define SPU2_GENIV 0x10000000 /* 1: hw generates IV */ 1278c2ecf20Sopenharmony_ci#define SPU2_HASH_IV 0x20000000 /* 1: IV incl in hash */ 1288c2ecf20Sopenharmony_ci#define SPU2_RET_IV 0x40000000 /* 1: return IV in output msg 1298c2ecf20Sopenharmony_ci * b4 payload 1308c2ecf20Sopenharmony_ci */ 1318c2ecf20Sopenharmony_ci#define SPU2_RET_IV_LEN 0xF00000000 /* length in bytes of IV returned. 1328c2ecf20Sopenharmony_ci * 0 = 16 bytes 1338c2ecf20Sopenharmony_ci */ 1348c2ecf20Sopenharmony_ci#define SPU2_RET_IV_LEN_SHIFT 32 1358c2ecf20Sopenharmony_ci#define SPU2_IV_OFFSET 0xF000000000 /* gen IV offset */ 1368c2ecf20Sopenharmony_ci#define SPU2_IV_OFFSET_SHIFT 36 1378c2ecf20Sopenharmony_ci#define SPU2_IV_LEN 0x1F0000000000 /* length of input IV in bytes */ 1388c2ecf20Sopenharmony_ci#define SPU2_IV_LEN_SHIFT 40 1398c2ecf20Sopenharmony_ci#define SPU2_HASH_TAG_LEN 0x7F000000000000 /* hash tag length in bytes */ 1408c2ecf20Sopenharmony_ci#define SPU2_HASH_TAG_LEN_SHIFT 48 1418c2ecf20Sopenharmony_ci#define SPU2_RETURN_MD 0x300000000000000 /* return metadata */ 1428c2ecf20Sopenharmony_ci#define SPU2_RETURN_MD_SHIFT 56 1438c2ecf20Sopenharmony_ci#define SPU2_RETURN_FD 0x400000000000000 1448c2ecf20Sopenharmony_ci#define SPU2_RETURN_AAD1 0x800000000000000 1458c2ecf20Sopenharmony_ci#define SPU2_RETURN_NAAD 0x1000000000000000 1468c2ecf20Sopenharmony_ci#define SPU2_RETURN_AAD2 0x2000000000000000 1478c2ecf20Sopenharmony_ci#define SPU2_RETURN_PAY 0x4000000000000000 /* return payload */ 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ci/* FMD ctrl2 field masks */ 1508c2ecf20Sopenharmony_ci#define SPU2_AAD1_OFFSET 0xFFF /* byte offset of AAD1 field */ 1518c2ecf20Sopenharmony_ci#define SPU2_AAD1_LEN 0xFF000 /* length of AAD1 in bytes */ 1528c2ecf20Sopenharmony_ci#define SPU2_AAD1_LEN_SHIFT 12 1538c2ecf20Sopenharmony_ci#define SPU2_AAD2_OFFSET 0xFFF00000 /* byte offset of AAD2 field */ 1548c2ecf20Sopenharmony_ci#define SPU2_AAD2_OFFSET_SHIFT 20 1558c2ecf20Sopenharmony_ci#define SPU2_PL_OFFSET 0xFFFFFFFF00000000 /* payload offset from AAD2 */ 1568c2ecf20Sopenharmony_ci#define SPU2_PL_OFFSET_SHIFT 32 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_ci/* FMD ctrl3 field masks */ 1598c2ecf20Sopenharmony_ci#define SPU2_PL_LEN 0xFFFFFFFF /* payload length in bytes */ 1608c2ecf20Sopenharmony_ci#define SPU2_TLS_LEN 0xFFFF00000000 /* TLS encrypt: cipher len 1618c2ecf20Sopenharmony_ci * TLS decrypt: compressed len 1628c2ecf20Sopenharmony_ci */ 1638c2ecf20Sopenharmony_ci#define SPU2_TLS_LEN_SHIFT 32 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_ci/* 1668c2ecf20Sopenharmony_ci * Max value that can be represented in the Payload Length field of the 1678c2ecf20Sopenharmony_ci * ctrl3 word of FMD. 1688c2ecf20Sopenharmony_ci */ 1698c2ecf20Sopenharmony_ci#define SPU2_MAX_PAYLOAD SPU2_PL_LEN 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci/* Error values returned in STATUS field of response messages */ 1728c2ecf20Sopenharmony_ci#define SPU2_INVALID_ICV 1 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_civoid spu2_dump_msg_hdr(u8 *buf, unsigned int buf_len); 1758c2ecf20Sopenharmony_ciu32 spu2_ctx_max_payload(enum spu_cipher_alg cipher_alg, 1768c2ecf20Sopenharmony_ci enum spu_cipher_mode cipher_mode, 1778c2ecf20Sopenharmony_ci unsigned int blocksize); 1788c2ecf20Sopenharmony_ciu32 spu2_payload_length(u8 *spu_hdr); 1798c2ecf20Sopenharmony_ciu16 spu2_response_hdr_len(u16 auth_key_len, u16 enc_key_len, bool is_hash); 1808c2ecf20Sopenharmony_ciu16 spu2_hash_pad_len(enum hash_alg hash_alg, enum hash_mode hash_mode, 1818c2ecf20Sopenharmony_ci u32 chunksize, u16 hash_block_size); 1828c2ecf20Sopenharmony_ciu32 spu2_gcm_ccm_pad_len(enum spu_cipher_mode cipher_mode, 1838c2ecf20Sopenharmony_ci unsigned int data_size); 1848c2ecf20Sopenharmony_ciu32 spu2_assoc_resp_len(enum spu_cipher_mode cipher_mode, 1858c2ecf20Sopenharmony_ci unsigned int assoc_len, unsigned int iv_len, 1868c2ecf20Sopenharmony_ci bool is_encrypt); 1878c2ecf20Sopenharmony_ciu8 spu2_aead_ivlen(enum spu_cipher_mode cipher_mode, 1888c2ecf20Sopenharmony_ci u16 iv_len); 1898c2ecf20Sopenharmony_cienum hash_type spu2_hash_type(u32 src_sent); 1908c2ecf20Sopenharmony_ciu32 spu2_digest_size(u32 alg_digest_size, enum hash_alg alg, 1918c2ecf20Sopenharmony_ci enum hash_type htype); 1928c2ecf20Sopenharmony_ciu32 spu2_create_request(u8 *spu_hdr, 1938c2ecf20Sopenharmony_ci struct spu_request_opts *req_opts, 1948c2ecf20Sopenharmony_ci struct spu_cipher_parms *cipher_parms, 1958c2ecf20Sopenharmony_ci struct spu_hash_parms *hash_parms, 1968c2ecf20Sopenharmony_ci struct spu_aead_parms *aead_parms, 1978c2ecf20Sopenharmony_ci unsigned int data_size); 1988c2ecf20Sopenharmony_ciu16 spu2_cipher_req_init(u8 *spu_hdr, struct spu_cipher_parms *cipher_parms); 1998c2ecf20Sopenharmony_civoid spu2_cipher_req_finish(u8 *spu_hdr, 2008c2ecf20Sopenharmony_ci u16 spu_req_hdr_len, 2018c2ecf20Sopenharmony_ci unsigned int is_inbound, 2028c2ecf20Sopenharmony_ci struct spu_cipher_parms *cipher_parms, 2038c2ecf20Sopenharmony_ci unsigned int data_size); 2048c2ecf20Sopenharmony_civoid spu2_request_pad(u8 *pad_start, u32 gcm_padding, u32 hash_pad_len, 2058c2ecf20Sopenharmony_ci enum hash_alg auth_alg, enum hash_mode auth_mode, 2068c2ecf20Sopenharmony_ci unsigned int total_sent, u32 status_padding); 2078c2ecf20Sopenharmony_ciu8 spu2_xts_tweak_in_payload(void); 2088c2ecf20Sopenharmony_ciu8 spu2_tx_status_len(void); 2098c2ecf20Sopenharmony_ciu8 spu2_rx_status_len(void); 2108c2ecf20Sopenharmony_ciint spu2_status_process(u8 *statp); 2118c2ecf20Sopenharmony_civoid spu2_ccm_update_iv(unsigned int digestsize, 2128c2ecf20Sopenharmony_ci struct spu_cipher_parms *cipher_parms, 2138c2ecf20Sopenharmony_ci unsigned int assoclen, unsigned int chunksize, 2148c2ecf20Sopenharmony_ci bool is_encrypt, bool is_esp); 2158c2ecf20Sopenharmony_ciu32 spu2_wordalign_padlen(u32 data_size); 2168c2ecf20Sopenharmony_ci#endif 217