1a8c16e8eSRohit Maheshwari /* SPDX-License-Identifier: GPL-2.0-only */
2a8c16e8eSRohit Maheshwari /* Copyright (C) 2020 Chelsio Communications.  All rights reserved. */
3a8c16e8eSRohit Maheshwari 
4a8c16e8eSRohit Maheshwari #ifndef __CHCR_COMMON_H__
5a8c16e8eSRohit Maheshwari #define __CHCR_COMMON_H__
6a8c16e8eSRohit Maheshwari 
7a8c16e8eSRohit Maheshwari #include "cxgb4.h"
8a8c16e8eSRohit Maheshwari 
9a8c16e8eSRohit Maheshwari #define CHCR_MAX_SALT                      4
10a8c16e8eSRohit Maheshwari #define CHCR_KEYCTX_MAC_KEY_SIZE_128       0
11a8c16e8eSRohit Maheshwari #define CHCR_KEYCTX_CIPHER_KEY_SIZE_128    0
12a8c16e8eSRohit Maheshwari #define CHCR_SCMD_CIPHER_MODE_AES_GCM      2
13a8c16e8eSRohit Maheshwari #define CHCR_SCMD_CIPHER_MODE_AES_CTR      3
14a8c16e8eSRohit Maheshwari #define CHCR_CPL_TX_SEC_PDU_LEN_64BIT      2
15a8c16e8eSRohit Maheshwari #define CHCR_SCMD_SEQ_NO_CTRL_64BIT        3
16a8c16e8eSRohit Maheshwari #define CHCR_SCMD_PROTO_VERSION_TLS        0
17a8c16e8eSRohit Maheshwari #define CHCR_SCMD_PROTO_VERSION_GENERIC    4
18a8c16e8eSRohit Maheshwari #define CHCR_SCMD_AUTH_MODE_GHASH          4
19a8c16e8eSRohit Maheshwari #define AES_BLOCK_LEN                      16
20a8c16e8eSRohit Maheshwari 
21a8c16e8eSRohit Maheshwari struct ktls_key_ctx {
22a8c16e8eSRohit Maheshwari 	__be32 ctx_hdr;
23a8c16e8eSRohit Maheshwari 	u8 salt[CHCR_MAX_SALT];
24a8c16e8eSRohit Maheshwari 	__be64 iv_to_auth;
25a8c16e8eSRohit Maheshwari 	unsigned char key[TLS_CIPHER_AES_GCM_128_KEY_SIZE +
26a8c16e8eSRohit Maheshwari 			  TLS_CIPHER_AES_GCM_256_TAG_SIZE];
27a8c16e8eSRohit Maheshwari };
28a8c16e8eSRohit Maheshwari 
29a8c16e8eSRohit Maheshwari /* Crypto key context */
30a8c16e8eSRohit Maheshwari #define KEY_CONTEXT_CTX_LEN_S           24
31a8c16e8eSRohit Maheshwari #define KEY_CONTEXT_CTX_LEN_V(x)        ((x) << KEY_CONTEXT_CTX_LEN_S)
32a8c16e8eSRohit Maheshwari 
33a8c16e8eSRohit Maheshwari #define KEY_CONTEXT_SALT_PRESENT_S      10
34a8c16e8eSRohit Maheshwari #define KEY_CONTEXT_SALT_PRESENT_V(x)   ((x) << KEY_CONTEXT_SALT_PRESENT_S)
35a8c16e8eSRohit Maheshwari #define KEY_CONTEXT_SALT_PRESENT_F      KEY_CONTEXT_SALT_PRESENT_V(1U)
36a8c16e8eSRohit Maheshwari 
37a8c16e8eSRohit Maheshwari #define KEY_CONTEXT_VALID_S     0
38a8c16e8eSRohit Maheshwari #define KEY_CONTEXT_VALID_V(x)  ((x) << KEY_CONTEXT_VALID_S)
39a8c16e8eSRohit Maheshwari #define KEY_CONTEXT_VALID_F     KEY_CONTEXT_VALID_V(1U)
40a8c16e8eSRohit Maheshwari 
41a8c16e8eSRohit Maheshwari #define KEY_CONTEXT_CK_SIZE_S           6
42a8c16e8eSRohit Maheshwari #define KEY_CONTEXT_CK_SIZE_V(x)        ((x) << KEY_CONTEXT_CK_SIZE_S)
43a8c16e8eSRohit Maheshwari 
44a8c16e8eSRohit Maheshwari #define KEY_CONTEXT_MK_SIZE_S           2
45a8c16e8eSRohit Maheshwari #define KEY_CONTEXT_MK_SIZE_V(x)        ((x) << KEY_CONTEXT_MK_SIZE_S)
46a8c16e8eSRohit Maheshwari 
47a8c16e8eSRohit Maheshwari #define KEY_CONTEXT_OPAD_PRESENT_S      11
48a8c16e8eSRohit Maheshwari #define KEY_CONTEXT_OPAD_PRESENT_V(x)   ((x) << KEY_CONTEXT_OPAD_PRESENT_S)
49a8c16e8eSRohit Maheshwari #define KEY_CONTEXT_OPAD_PRESENT_F      KEY_CONTEXT_OPAD_PRESENT_V(1U)
50a8c16e8eSRohit Maheshwari 
51a8c16e8eSRohit Maheshwari #define FILL_KEY_CTX_HDR(ck_size, mk_size, ctx_len) \
52a8c16e8eSRohit Maheshwari 		htonl(KEY_CONTEXT_MK_SIZE_V(mk_size) | \
53a8c16e8eSRohit Maheshwari 		      KEY_CONTEXT_CK_SIZE_V(ck_size) | \
54a8c16e8eSRohit Maheshwari 		      KEY_CONTEXT_VALID_F | \
55a8c16e8eSRohit Maheshwari 		      KEY_CONTEXT_SALT_PRESENT_F | \
56a8c16e8eSRohit Maheshwari 		      KEY_CONTEXT_CTX_LEN_V((ctx_len)))
57a8c16e8eSRohit Maheshwari 
chcr_copy_to_txd(const void * src,const struct sge_txq * q,void * pos,int length)58a8c16e8eSRohit Maheshwari static inline void *chcr_copy_to_txd(const void *src, const struct sge_txq *q,
59a8c16e8eSRohit Maheshwari 				     void *pos, int length)
60a8c16e8eSRohit Maheshwari {
61a8c16e8eSRohit Maheshwari 	int left = (void *)q->stat - pos;
62a8c16e8eSRohit Maheshwari 	u64 *p;
63a8c16e8eSRohit Maheshwari 
64a8c16e8eSRohit Maheshwari 	if (likely(length <= left)) {
65a8c16e8eSRohit Maheshwari 		memcpy(pos, src, length);
66a8c16e8eSRohit Maheshwari 		pos += length;
67a8c16e8eSRohit Maheshwari 	} else {
68a8c16e8eSRohit Maheshwari 		memcpy(pos, src, left);
69a8c16e8eSRohit Maheshwari 		memcpy(q->desc, src + left, length - left);
70a8c16e8eSRohit Maheshwari 		pos = (void *)q->desc + (length - left);
71a8c16e8eSRohit Maheshwari 	}
72a8c16e8eSRohit Maheshwari 	/* 0-pad to multiple of 16 */
73a8c16e8eSRohit Maheshwari 	p = PTR_ALIGN(pos, 8);
74a8c16e8eSRohit Maheshwari 	if ((uintptr_t)p & 8) {
75a8c16e8eSRohit Maheshwari 		*p = 0;
76a8c16e8eSRohit Maheshwari 		return p + 1;
77a8c16e8eSRohit Maheshwari 	}
78a8c16e8eSRohit Maheshwari 	return p;
79a8c16e8eSRohit Maheshwari }
80a8c16e8eSRohit Maheshwari 
chcr_txq_avail(const struct sge_txq * q)81a8c16e8eSRohit Maheshwari static inline unsigned int chcr_txq_avail(const struct sge_txq *q)
82a8c16e8eSRohit Maheshwari {
83a8c16e8eSRohit Maheshwari 	return q->size - 1 - q->in_use;
84a8c16e8eSRohit Maheshwari }
85a8c16e8eSRohit Maheshwari 
chcr_txq_advance(struct sge_txq * q,unsigned int n)86a8c16e8eSRohit Maheshwari static inline void chcr_txq_advance(struct sge_txq *q, unsigned int n)
87a8c16e8eSRohit Maheshwari {
88a8c16e8eSRohit Maheshwari 	q->in_use += n;
89a8c16e8eSRohit Maheshwari 	q->pidx += n;
90a8c16e8eSRohit Maheshwari 	if (q->pidx >= q->size)
91a8c16e8eSRohit Maheshwari 		q->pidx -= q->size;
92a8c16e8eSRohit Maheshwari }
93a8c16e8eSRohit Maheshwari 
chcr_eth_txq_stop(struct sge_eth_txq * q)94a8c16e8eSRohit Maheshwari static inline void chcr_eth_txq_stop(struct sge_eth_txq *q)
95a8c16e8eSRohit Maheshwari {
96a8c16e8eSRohit Maheshwari 	netif_tx_stop_queue(q->txq);
97a8c16e8eSRohit Maheshwari 	q->q.stops++;
98a8c16e8eSRohit Maheshwari }
99a8c16e8eSRohit Maheshwari 
chcr_sgl_len(unsigned int n)100a8c16e8eSRohit Maheshwari static inline unsigned int chcr_sgl_len(unsigned int n)
101a8c16e8eSRohit Maheshwari {
102a8c16e8eSRohit Maheshwari 	n--;
103a8c16e8eSRohit Maheshwari 	return (3 * n) / 2 + (n & 1) + 2;
104a8c16e8eSRohit Maheshwari }
105a8c16e8eSRohit Maheshwari 
chcr_flits_to_desc(unsigned int n)106a8c16e8eSRohit Maheshwari static inline unsigned int chcr_flits_to_desc(unsigned int n)
107a8c16e8eSRohit Maheshwari {
108a8c16e8eSRohit Maheshwari 	WARN_ON(n > SGE_MAX_WR_LEN / 8);
109a8c16e8eSRohit Maheshwari 	return DIV_ROUND_UP(n, 8);
110a8c16e8eSRohit Maheshwari }
111a8c16e8eSRohit Maheshwari #endif /* __CHCR_COMMON_H__ */
112