xref: /linux/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_common.h (revision cbecf716ca618fd44feda6bd9a64a8179d031fc5)
134aba2c4SRohit Maheshwari /* SPDX-License-Identifier: GPL-2.0-only */
234aba2c4SRohit Maheshwari /* Copyright (C) 2020 Chelsio Communications.  All rights reserved. */
334aba2c4SRohit Maheshwari 
434aba2c4SRohit Maheshwari #ifndef __CHCR_COMMON_H__
534aba2c4SRohit Maheshwari #define __CHCR_COMMON_H__
634aba2c4SRohit Maheshwari 
734aba2c4SRohit Maheshwari #include "cxgb4.h"
834aba2c4SRohit Maheshwari 
98a30923eSRohit Maheshwari #define CHCR_MAX_SALT                      4
108a30923eSRohit Maheshwari #define CHCR_KEYCTX_MAC_KEY_SIZE_128       0
118a30923eSRohit Maheshwari #define CHCR_KEYCTX_CIPHER_KEY_SIZE_128    0
125a4b9fe7SRohit Maheshwari #define CHCR_SCMD_CIPHER_MODE_AES_GCM      2
13*dc05f3dfSRohit Maheshwari #define CHCR_SCMD_CIPHER_MODE_AES_CTR      3
145a4b9fe7SRohit Maheshwari #define CHCR_CPL_TX_SEC_PDU_LEN_64BIT      2
155a4b9fe7SRohit Maheshwari #define CHCR_SCMD_SEQ_NO_CTRL_64BIT        3
165a4b9fe7SRohit Maheshwari #define CHCR_SCMD_PROTO_VERSION_TLS        0
17*dc05f3dfSRohit Maheshwari #define CHCR_SCMD_PROTO_VERSION_GENERIC    4
185a4b9fe7SRohit Maheshwari #define CHCR_SCMD_AUTH_MODE_GHASH          4
19*dc05f3dfSRohit Maheshwari #define AES_BLOCK_LEN                      16
208a30923eSRohit Maheshwari 
218a30923eSRohit Maheshwari struct ktls_key_ctx {
228a30923eSRohit Maheshwari 	__be32 ctx_hdr;
238a30923eSRohit Maheshwari 	u8 salt[CHCR_MAX_SALT];
248a30923eSRohit Maheshwari 	__be64 iv_to_auth;
258a30923eSRohit Maheshwari 	unsigned char key[TLS_CIPHER_AES_GCM_128_KEY_SIZE +
268a30923eSRohit Maheshwari 			  TLS_CIPHER_AES_GCM_256_TAG_SIZE];
278a30923eSRohit Maheshwari };
288a30923eSRohit Maheshwari 
298a30923eSRohit Maheshwari /* Crypto key context */
308a30923eSRohit Maheshwari #define KEY_CONTEXT_CTX_LEN_S           24
318a30923eSRohit Maheshwari #define KEY_CONTEXT_CTX_LEN_V(x)        ((x) << KEY_CONTEXT_CTX_LEN_S)
328a30923eSRohit Maheshwari 
338a30923eSRohit Maheshwari #define KEY_CONTEXT_SALT_PRESENT_S      10
348a30923eSRohit Maheshwari #define KEY_CONTEXT_SALT_PRESENT_V(x)   ((x) << KEY_CONTEXT_SALT_PRESENT_S)
358a30923eSRohit Maheshwari #define KEY_CONTEXT_SALT_PRESENT_F      KEY_CONTEXT_SALT_PRESENT_V(1U)
368a30923eSRohit Maheshwari 
378a30923eSRohit Maheshwari #define KEY_CONTEXT_VALID_S     0
388a30923eSRohit Maheshwari #define KEY_CONTEXT_VALID_V(x)  ((x) << KEY_CONTEXT_VALID_S)
398a30923eSRohit Maheshwari #define KEY_CONTEXT_VALID_F     KEY_CONTEXT_VALID_V(1U)
408a30923eSRohit Maheshwari 
418a30923eSRohit Maheshwari #define KEY_CONTEXT_CK_SIZE_S           6
428a30923eSRohit Maheshwari #define KEY_CONTEXT_CK_SIZE_V(x)        ((x) << KEY_CONTEXT_CK_SIZE_S)
438a30923eSRohit Maheshwari 
448a30923eSRohit Maheshwari #define KEY_CONTEXT_MK_SIZE_S           2
458a30923eSRohit Maheshwari #define KEY_CONTEXT_MK_SIZE_V(x)        ((x) << KEY_CONTEXT_MK_SIZE_S)
468a30923eSRohit Maheshwari 
478a30923eSRohit Maheshwari #define KEY_CONTEXT_OPAD_PRESENT_S      11
488a30923eSRohit Maheshwari #define KEY_CONTEXT_OPAD_PRESENT_V(x)   ((x) << KEY_CONTEXT_OPAD_PRESENT_S)
498a30923eSRohit Maheshwari #define KEY_CONTEXT_OPAD_PRESENT_F      KEY_CONTEXT_OPAD_PRESENT_V(1U)
508a30923eSRohit Maheshwari 
518a30923eSRohit Maheshwari #define FILL_KEY_CTX_HDR(ck_size, mk_size, ctx_len) \
528a30923eSRohit Maheshwari 		htonl(KEY_CONTEXT_MK_SIZE_V(mk_size) | \
538a30923eSRohit Maheshwari 		      KEY_CONTEXT_CK_SIZE_V(ck_size) | \
548a30923eSRohit Maheshwari 		      KEY_CONTEXT_VALID_F | \
558a30923eSRohit Maheshwari 		      KEY_CONTEXT_SALT_PRESENT_F | \
568a30923eSRohit Maheshwari 		      KEY_CONTEXT_CTX_LEN_V((ctx_len)))
578a30923eSRohit Maheshwari 
588a30923eSRohit Maheshwari static inline void *chcr_copy_to_txd(const void *src, const struct sge_txq *q,
598a30923eSRohit Maheshwari 				     void *pos, int length)
608a30923eSRohit Maheshwari {
618a30923eSRohit Maheshwari 	int left = (void *)q->stat - pos;
628a30923eSRohit Maheshwari 	u64 *p;
638a30923eSRohit Maheshwari 
648a30923eSRohit Maheshwari 	if (likely(length <= left)) {
658a30923eSRohit Maheshwari 		memcpy(pos, src, length);
668a30923eSRohit Maheshwari 		pos += length;
678a30923eSRohit Maheshwari 	} else {
688a30923eSRohit Maheshwari 		memcpy(pos, src, left);
698a30923eSRohit Maheshwari 		memcpy(q->desc, src + left, length - left);
708a30923eSRohit Maheshwari 		pos = (void *)q->desc + (length - left);
718a30923eSRohit Maheshwari 	}
728a30923eSRohit Maheshwari 	/* 0-pad to multiple of 16 */
738a30923eSRohit Maheshwari 	p = PTR_ALIGN(pos, 8);
748a30923eSRohit Maheshwari 	if ((uintptr_t)p & 8) {
758a30923eSRohit Maheshwari 		*p = 0;
768a30923eSRohit Maheshwari 		return p + 1;
778a30923eSRohit Maheshwari 	}
788a30923eSRohit Maheshwari 	return p;
798a30923eSRohit Maheshwari }
805a4b9fe7SRohit Maheshwari 
815a4b9fe7SRohit Maheshwari static inline unsigned int chcr_txq_avail(const struct sge_txq *q)
825a4b9fe7SRohit Maheshwari {
835a4b9fe7SRohit Maheshwari 	return q->size - 1 - q->in_use;
845a4b9fe7SRohit Maheshwari }
855a4b9fe7SRohit Maheshwari 
865a4b9fe7SRohit Maheshwari static inline void chcr_txq_advance(struct sge_txq *q, unsigned int n)
875a4b9fe7SRohit Maheshwari {
885a4b9fe7SRohit Maheshwari 	q->in_use += n;
895a4b9fe7SRohit Maheshwari 	q->pidx += n;
905a4b9fe7SRohit Maheshwari 	if (q->pidx >= q->size)
915a4b9fe7SRohit Maheshwari 		q->pidx -= q->size;
925a4b9fe7SRohit Maheshwari }
935a4b9fe7SRohit Maheshwari 
945a4b9fe7SRohit Maheshwari static inline void chcr_eth_txq_stop(struct sge_eth_txq *q)
955a4b9fe7SRohit Maheshwari {
965a4b9fe7SRohit Maheshwari 	netif_tx_stop_queue(q->txq);
975a4b9fe7SRohit Maheshwari 	q->q.stops++;
985a4b9fe7SRohit Maheshwari }
995a4b9fe7SRohit Maheshwari 
1005a4b9fe7SRohit Maheshwari static inline unsigned int chcr_sgl_len(unsigned int n)
1015a4b9fe7SRohit Maheshwari {
1025a4b9fe7SRohit Maheshwari 	n--;
1035a4b9fe7SRohit Maheshwari 	return (3 * n) / 2 + (n & 1) + 2;
1045a4b9fe7SRohit Maheshwari }
1055a4b9fe7SRohit Maheshwari 
1065a4b9fe7SRohit Maheshwari static inline unsigned int chcr_flits_to_desc(unsigned int n)
1075a4b9fe7SRohit Maheshwari {
1085a4b9fe7SRohit Maheshwari 	WARN_ON(n > SGE_MAX_WR_LEN / 8);
1095a4b9fe7SRohit Maheshwari 	return DIV_ROUND_UP(n, 8);
1105a4b9fe7SRohit Maheshwari }
11134aba2c4SRohit Maheshwari #endif /* __CHCR_COMMON_H__ */
112