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