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