Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * Copyright 2016 Broadcom
0004  */
0005 
0006 /*
0007  * This file contains SPU message definitions specific to SPU2.
0008  */
0009 
0010 #ifndef _SPU2_H
0011 #define _SPU2_H
0012 
0013 enum spu2_cipher_type {
0014     SPU2_CIPHER_TYPE_NONE = 0x0,
0015     SPU2_CIPHER_TYPE_AES128 = 0x1,
0016     SPU2_CIPHER_TYPE_AES192 = 0x2,
0017     SPU2_CIPHER_TYPE_AES256 = 0x3,
0018     SPU2_CIPHER_TYPE_DES = 0x4,
0019     SPU2_CIPHER_TYPE_3DES = 0x5,
0020     SPU2_CIPHER_TYPE_LAST
0021 };
0022 
0023 enum spu2_cipher_mode {
0024     SPU2_CIPHER_MODE_ECB = 0x0,
0025     SPU2_CIPHER_MODE_CBC = 0x1,
0026     SPU2_CIPHER_MODE_CTR = 0x2,
0027     SPU2_CIPHER_MODE_CFB = 0x3,
0028     SPU2_CIPHER_MODE_OFB = 0x4,
0029     SPU2_CIPHER_MODE_XTS = 0x5,
0030     SPU2_CIPHER_MODE_CCM = 0x6,
0031     SPU2_CIPHER_MODE_GCM = 0x7,
0032     SPU2_CIPHER_MODE_LAST
0033 };
0034 
0035 enum spu2_hash_type {
0036     SPU2_HASH_TYPE_NONE = 0x0,
0037     SPU2_HASH_TYPE_AES128 = 0x1,
0038     SPU2_HASH_TYPE_AES192 = 0x2,
0039     SPU2_HASH_TYPE_AES256 = 0x3,
0040     SPU2_HASH_TYPE_MD5 = 0x6,
0041     SPU2_HASH_TYPE_SHA1 = 0x7,
0042     SPU2_HASH_TYPE_SHA224 = 0x8,
0043     SPU2_HASH_TYPE_SHA256 = 0x9,
0044     SPU2_HASH_TYPE_SHA384 = 0xa,
0045     SPU2_HASH_TYPE_SHA512 = 0xb,
0046     SPU2_HASH_TYPE_SHA512_224 = 0xc,
0047     SPU2_HASH_TYPE_SHA512_256 = 0xd,
0048     SPU2_HASH_TYPE_SHA3_224 = 0xe,
0049     SPU2_HASH_TYPE_SHA3_256 = 0xf,
0050     SPU2_HASH_TYPE_SHA3_384 = 0x10,
0051     SPU2_HASH_TYPE_SHA3_512 = 0x11,
0052     SPU2_HASH_TYPE_LAST
0053 };
0054 
0055 enum spu2_hash_mode {
0056     SPU2_HASH_MODE_CMAC = 0x0,
0057     SPU2_HASH_MODE_CBC_MAC = 0x1,
0058     SPU2_HASH_MODE_XCBC_MAC = 0x2,
0059     SPU2_HASH_MODE_HMAC = 0x3,
0060     SPU2_HASH_MODE_RABIN = 0x4,
0061     SPU2_HASH_MODE_CCM = 0x5,
0062     SPU2_HASH_MODE_GCM = 0x6,
0063     SPU2_HASH_MODE_RESERVED = 0x7,
0064     SPU2_HASH_MODE_LAST
0065 };
0066 
0067 enum spu2_ret_md_opts {
0068     SPU2_RET_NO_MD = 0, /* return no metadata */
0069     SPU2_RET_FMD_OMD = 1,   /* return both FMD and OMD */
0070     SPU2_RET_FMD_ONLY = 2,  /* return only FMD */
0071     SPU2_RET_FMD_OMD_IV = 3,    /* return FMD and OMD with just IVs */
0072 };
0073 
0074 /* Fixed Metadata format */
0075 struct SPU2_FMD {
0076     __le64 ctrl0;
0077     __le64 ctrl1;
0078     __le64 ctrl2;
0079     __le64 ctrl3;
0080 };
0081 
0082 #define FMD_SIZE  sizeof(struct SPU2_FMD)
0083 
0084 /* Fixed part of request message header length in bytes. Just FMD. */
0085 #define SPU2_REQ_FIXED_LEN FMD_SIZE
0086 #define SPU2_HEADER_ALLOC_LEN (SPU_REQ_FIXED_LEN + \
0087                 2 * MAX_KEY_SIZE + 2 * MAX_IV_SIZE)
0088 
0089 /* FMD ctrl0 field masks */
0090 #define SPU2_CIPH_ENCRYPT_EN            0x1 /* 0: decrypt, 1: encrypt */
0091 #define SPU2_CIPH_TYPE                 0xF0 /* one of spu2_cipher_type */
0092 #define SPU2_CIPH_TYPE_SHIFT              4
0093 #define SPU2_CIPH_MODE                0xF00 /* one of spu2_cipher_mode */
0094 #define SPU2_CIPH_MODE_SHIFT              8
0095 #define SPU2_CFB_MASK                0x7000 /* cipher feedback mask */
0096 #define SPU2_CFB_MASK_SHIFT              12
0097 #define SPU2_PROTO_SEL             0xF00000 /* MACsec, IPsec, TLS... */
0098 #define SPU2_PROTO_SEL_SHIFT             20
0099 #define SPU2_HASH_FIRST           0x1000000 /* 1: hash input is input pkt
0100                          * data
0101                          */
0102 #define SPU2_CHK_TAG              0x2000000 /* 1: check digest provided */
0103 #define SPU2_HASH_TYPE          0x1F0000000 /* one of spu2_hash_type */
0104 #define SPU2_HASH_TYPE_SHIFT             28
0105 #define SPU2_HASH_MODE         0xF000000000 /* one of spu2_hash_mode */
0106 #define SPU2_HASH_MODE_SHIFT             36
0107 #define SPU2_CIPH_PAD_EN     0x100000000000 /* 1: Add pad to end of payload for
0108                          *    enc
0109                          */
0110 #define SPU2_CIPH_PAD      0xFF000000000000 /* cipher pad value */
0111 #define SPU2_CIPH_PAD_SHIFT              48
0112 
0113 /* FMD ctrl1 field masks */
0114 #define SPU2_TAG_LOC                    0x1 /* 1: end of payload, 0: undef */
0115 #define SPU2_HAS_FR_DATA                0x2 /* 1: msg has frame data */
0116 #define SPU2_HAS_AAD1                   0x4 /* 1: msg has AAD1 field */
0117 #define SPU2_HAS_NAAD                   0x8 /* 1: msg has NAAD field */
0118 #define SPU2_HAS_AAD2                  0x10 /* 1: msg has AAD2 field */
0119 #define SPU2_HAS_ESN                   0x20 /* 1: msg has ESN field */
0120 #define SPU2_HASH_KEY_LEN            0xFF00 /* len of hash key in bytes.
0121                          * HMAC only.
0122                          */
0123 #define SPU2_HASH_KEY_LEN_SHIFT           8
0124 #define SPU2_CIPH_KEY_LEN         0xFF00000 /* len of cipher key in bytes */
0125 #define SPU2_CIPH_KEY_LEN_SHIFT          20
0126 #define SPU2_GENIV               0x10000000 /* 1: hw generates IV */
0127 #define SPU2_HASH_IV             0x20000000 /* 1: IV incl in hash */
0128 #define SPU2_RET_IV              0x40000000 /* 1: return IV in output msg
0129                          *    b4 payload
0130                          */
0131 #define SPU2_RET_IV_LEN         0xF00000000 /* length in bytes of IV returned.
0132                          * 0 = 16 bytes
0133                          */
0134 #define SPU2_RET_IV_LEN_SHIFT            32
0135 #define SPU2_IV_OFFSET         0xF000000000 /* gen IV offset */
0136 #define SPU2_IV_OFFSET_SHIFT             36
0137 #define SPU2_IV_LEN          0x1F0000000000 /* length of input IV in bytes */
0138 #define SPU2_IV_LEN_SHIFT                40
0139 #define SPU2_HASH_TAG_LEN  0x7F000000000000 /* hash tag length in bytes */
0140 #define SPU2_HASH_TAG_LEN_SHIFT          48
0141 #define SPU2_RETURN_MD    0x300000000000000 /* return metadata */
0142 #define SPU2_RETURN_MD_SHIFT             56
0143 #define SPU2_RETURN_FD    0x400000000000000
0144 #define SPU2_RETURN_AAD1  0x800000000000000
0145 #define SPU2_RETURN_NAAD 0x1000000000000000
0146 #define SPU2_RETURN_AAD2 0x2000000000000000
0147 #define SPU2_RETURN_PAY  0x4000000000000000 /* return payload */
0148 
0149 /* FMD ctrl2 field masks */
0150 #define SPU2_AAD1_OFFSET              0xFFF /* byte offset of AAD1 field */
0151 #define SPU2_AAD1_LEN               0xFF000 /* length of AAD1 in bytes */
0152 #define SPU2_AAD1_LEN_SHIFT              12
0153 #define SPU2_AAD2_OFFSET         0xFFF00000 /* byte offset of AAD2 field */
0154 #define SPU2_AAD2_OFFSET_SHIFT           20
0155 #define SPU2_PL_OFFSET   0xFFFFFFFF00000000 /* payload offset from AAD2 */
0156 #define SPU2_PL_OFFSET_SHIFT             32
0157 
0158 /* FMD ctrl3 field masks */
0159 #define SPU2_PL_LEN              0xFFFFFFFF /* payload length in bytes */
0160 #define SPU2_TLS_LEN         0xFFFF00000000 /* TLS encrypt: cipher len
0161                          * TLS decrypt: compressed len
0162                          */
0163 #define SPU2_TLS_LEN_SHIFT               32
0164 
0165 /*
0166  * Max value that can be represented in the Payload Length field of the
0167  * ctrl3 word of FMD.
0168  */
0169 #define SPU2_MAX_PAYLOAD  SPU2_PL_LEN
0170 
0171 /* Error values returned in STATUS field of response messages */
0172 #define SPU2_INVALID_ICV  1
0173 
0174 void spu2_dump_msg_hdr(u8 *buf, unsigned int buf_len);
0175 u32 spu2_ctx_max_payload(enum spu_cipher_alg cipher_alg,
0176              enum spu_cipher_mode cipher_mode,
0177              unsigned int blocksize);
0178 u32 spu2_payload_length(u8 *spu_hdr);
0179 u16 spu2_response_hdr_len(u16 auth_key_len, u16 enc_key_len, bool is_hash);
0180 u16 spu2_hash_pad_len(enum hash_alg hash_alg, enum hash_mode hash_mode,
0181               u32 chunksize, u16 hash_block_size);
0182 u32 spu2_gcm_ccm_pad_len(enum spu_cipher_mode cipher_mode,
0183              unsigned int data_size);
0184 u32 spu2_assoc_resp_len(enum spu_cipher_mode cipher_mode,
0185             unsigned int assoc_len, unsigned int iv_len,
0186             bool is_encrypt);
0187 u8 spu2_aead_ivlen(enum spu_cipher_mode cipher_mode,
0188            u16 iv_len);
0189 enum hash_type spu2_hash_type(u32 src_sent);
0190 u32 spu2_digest_size(u32 alg_digest_size, enum hash_alg alg,
0191              enum hash_type htype);
0192 u32 spu2_create_request(u8 *spu_hdr,
0193             struct spu_request_opts *req_opts,
0194             struct spu_cipher_parms *cipher_parms,
0195             struct spu_hash_parms *hash_parms,
0196             struct spu_aead_parms *aead_parms,
0197             unsigned int data_size);
0198 u16 spu2_cipher_req_init(u8 *spu_hdr, struct spu_cipher_parms *cipher_parms);
0199 void spu2_cipher_req_finish(u8 *spu_hdr,
0200                 u16 spu_req_hdr_len,
0201                 unsigned int is_inbound,
0202                 struct spu_cipher_parms *cipher_parms,
0203                 unsigned int data_size);
0204 void spu2_request_pad(u8 *pad_start, u32 gcm_padding, u32 hash_pad_len,
0205               enum hash_alg auth_alg, enum hash_mode auth_mode,
0206               unsigned int total_sent, u32 status_padding);
0207 u8 spu2_xts_tweak_in_payload(void);
0208 u8 spu2_tx_status_len(void);
0209 u8 spu2_rx_status_len(void);
0210 int spu2_status_process(u8 *statp);
0211 void spu2_ccm_update_iv(unsigned int digestsize,
0212             struct spu_cipher_parms *cipher_parms,
0213             unsigned int assoclen, unsigned int chunksize,
0214             bool is_encrypt, bool is_esp);
0215 u32 spu2_wordalign_padlen(u32 data_size);
0216 #endif