1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* Marvell IPSEC offload driver 3 * 4 * Copyright (C) 2024 Marvell. 5 */ 6 7 #ifndef CN10K_IPSEC_H 8 #define CN10K_IPSEC_H 9 10 #include <linux/types.h> 11 12 DECLARE_STATIC_KEY_FALSE(cn10k_ipsec_sa_enabled); 13 14 /* CPT instruction size in bytes */ 15 #define CN10K_CPT_INST_SIZE 64 16 17 /* CPT instruction (CPT_INST_S) queue length */ 18 #define CN10K_CPT_INST_QLEN 8200 19 20 /* CPT instruction queue size passed to HW is in units of 21 * 40*CPT_INST_S messages. 22 */ 23 #define CN10K_CPT_SIZE_DIV40 (CN10K_CPT_INST_QLEN / 40) 24 25 /* CPT needs 320 free entries */ 26 #define CN10K_CPT_INST_QLEN_EXTRA_BYTES (320 * CN10K_CPT_INST_SIZE) 27 #define CN10K_CPT_EXTRA_SIZE_DIV40 (320 / 40) 28 29 /* CPT instruction queue length in bytes */ 30 #define CN10K_CPT_INST_QLEN_BYTES \ 31 ((CN10K_CPT_SIZE_DIV40 * 40 * CN10K_CPT_INST_SIZE) + \ 32 CN10K_CPT_INST_QLEN_EXTRA_BYTES) 33 34 /* CPT instruction group queue length in bytes */ 35 #define CN10K_CPT_INST_GRP_QLEN_BYTES \ 36 ((CN10K_CPT_SIZE_DIV40 + CN10K_CPT_EXTRA_SIZE_DIV40) * 16) 37 38 /* CPT FC length in bytes */ 39 #define CN10K_CPT_Q_FC_LEN 128 40 41 /* Default CPT engine group for ipsec offload */ 42 #define CN10K_DEF_CPT_IPSEC_EGRP 1 43 44 /* CN10K CPT LF registers */ 45 #define CPT_LFBASE (BLKTYPE_CPT << RVU_FUNC_BLKADDR_SHIFT) 46 #define CN10K_CPT_LF_CTL (CPT_LFBASE | 0x10) 47 #define CN10K_CPT_LF_INPROG (CPT_LFBASE | 0x40) 48 #define CN10K_CPT_LF_Q_BASE (CPT_LFBASE | 0xf0) 49 #define CN10K_CPT_LF_Q_SIZE (CPT_LFBASE | 0x100) 50 #define CN10K_CPT_LF_Q_INST_PTR (CPT_LFBASE | 0x110) 51 #define CN10K_CPT_LF_Q_GRP_PTR (CPT_LFBASE | 0x120) 52 #define CN10K_CPT_LF_NQX(a) (CPT_LFBASE | 0x400 | (a) << 3) 53 #define CN10K_CPT_LF_CTX_FLUSH (CPT_LFBASE | 0x510) 54 55 /* IPSEC Instruction opcodes */ 56 #define CN10K_IPSEC_MAJOR_OP_WRITE_SA 0x01UL 57 #define CN10K_IPSEC_MINOR_OP_WRITE_SA 0x09UL 58 #define CN10K_IPSEC_MAJOR_OP_OUTB_IPSEC 0x2AUL 59 60 enum cn10k_cpt_comp_e { 61 CN10K_CPT_COMP_E_NOTDONE = 0x00, 62 CN10K_CPT_COMP_E_GOOD = 0x01, 63 CN10K_CPT_COMP_E_FAULT = 0x02, 64 CN10K_CPT_COMP_E_HWERR = 0x04, 65 CN10K_CPT_COMP_E_INSTERR = 0x05, 66 CN10K_CPT_COMP_E_WARN = 0x06, 67 CN10K_CPT_COMP_E_MASK = 0x3F 68 }; 69 70 struct cn10k_cpt_inst_queue { 71 u8 *vaddr; 72 u8 *real_vaddr; 73 dma_addr_t dma_addr; 74 dma_addr_t real_dma_addr; 75 u32 size; 76 }; 77 78 enum cn10k_cpt_hw_state_e { 79 CN10K_CPT_HW_UNAVAILABLE, 80 CN10K_CPT_HW_AVAILABLE, 81 CN10K_CPT_HW_IN_USE 82 }; 83 84 struct cn10k_ipsec { 85 /* Outbound CPT */ 86 u64 io_addr; 87 atomic_t cpt_state; 88 struct cn10k_cpt_inst_queue iq; 89 90 /* SA info */ 91 u32 sa_size; 92 u32 outb_sa_count; 93 struct work_struct sa_work; 94 struct workqueue_struct *sa_workq; 95 }; 96 97 /* CN10K IPSEC Security Association (SA) */ 98 /* SA direction */ 99 #define CN10K_IPSEC_SA_DIR_INB 0 100 #define CN10K_IPSEC_SA_DIR_OUTB 1 101 /* SA protocol */ 102 #define CN10K_IPSEC_SA_IPSEC_PROTO_AH 0 103 #define CN10K_IPSEC_SA_IPSEC_PROTO_ESP 1 104 /* SA Encryption Type */ 105 #define CN10K_IPSEC_SA_ENCAP_TYPE_AES_GCM 5 106 /* SA IPSEC mode Transport/Tunnel */ 107 #define CN10K_IPSEC_SA_IPSEC_MODE_TRANSPORT 0 108 #define CN10K_IPSEC_SA_IPSEC_MODE_TUNNEL 1 109 /* SA AES Key Length */ 110 #define CN10K_IPSEC_SA_AES_KEY_LEN_128 1 111 #define CN10K_IPSEC_SA_AES_KEY_LEN_192 2 112 #define CN10K_IPSEC_SA_AES_KEY_LEN_256 3 113 /* IV Source */ 114 #define CN10K_IPSEC_SA_IV_SRC_COUNTER 0 115 #define CN10K_IPSEC_SA_IV_SRC_PACKET 3 116 117 struct cn10k_tx_sa_s { 118 u64 esn_en : 1; /* W0 */ 119 u64 rsvd_w0_1_8 : 8; 120 u64 hw_ctx_off : 7; 121 u64 ctx_id : 16; 122 u64 rsvd_w0_32_47 : 16; 123 u64 ctx_push_size : 7; 124 u64 rsvd_w0_55 : 1; 125 u64 ctx_hdr_size : 2; 126 u64 aop_valid : 1; 127 u64 rsvd_w0_59 : 1; 128 u64 ctx_size : 4; 129 u64 w1; /* W1 */ 130 u64 sa_valid : 1; /* W2 */ 131 u64 sa_dir : 1; 132 u64 rsvd_w2_2_3 : 2; 133 u64 ipsec_mode : 1; 134 u64 ipsec_protocol : 1; 135 u64 aes_key_len : 2; 136 u64 enc_type : 3; 137 u64 rsvd_w2_11_19 : 9; 138 u64 iv_src : 2; 139 u64 rsvd_w2_22_31 : 10; 140 u64 rsvd_w2_32_63 : 32; 141 u64 w3; /* W3 */ 142 u8 cipher_key[32]; /* W4 - W7 */ 143 u32 rsvd_w8_0_31; /* W8 : IV */ 144 u32 iv_gcm_salt; 145 u64 rsvd_w9_w30[22]; /* W9 - W30 */ 146 u64 hw_ctx[6]; /* W31 - W36 */ 147 }; 148 149 /* CPT instruction parameter-1 */ 150 #define CN10K_IPSEC_INST_PARAM1_DIS_L4_CSUM 0x1 151 #define CN10K_IPSEC_INST_PARAM1_DIS_L3_CSUM 0x2 152 #define CN10K_IPSEC_INST_PARAM1_CRYPTO_MODE 0x20 153 #define CN10K_IPSEC_INST_PARAM1_IV_OFFSET_SHIFT 8 154 155 /* CPT instruction parameter-2 */ 156 #define CN10K_IPSEC_INST_PARAM2_ENC_DATA_OFFSET_SHIFT 0 157 #define CN10K_IPSEC_INST_PARAM2_AUTH_DATA_OFFSET_SHIFT 8 158 159 /* CPT Instruction Structure */ 160 struct cpt_inst_s { 161 u64 nixtxl : 3; /* W0 */ 162 u64 doneint : 1; 163 u64 rsvd_w0_4_15 : 12; 164 u64 dat_offset : 8; 165 u64 ext_param1 : 8; 166 u64 nixtx_offset : 20; 167 u64 rsvd_w0_52_63 : 12; 168 u64 res_addr; /* W1 */ 169 u64 tag : 32; /* W2 */ 170 u64 tt : 2; 171 u64 grp : 10; 172 u64 rsvd_w2_44_47 : 4; 173 u64 rvu_pf_func : 16; 174 u64 qord : 1; /* W3 */ 175 u64 rsvd_w3_1_2 : 2; 176 u64 wqe_ptr : 61; 177 u64 dlen : 16; /* W4 */ 178 u64 param2 : 16; 179 u64 param1 : 16; 180 u64 opcode_major : 8; 181 u64 opcode_minor : 8; 182 u64 dptr; /* W5 */ 183 u64 rptr; /* W6 */ 184 u64 cptr : 60; /* W7 */ 185 u64 ctx_val : 1; 186 u64 egrp : 3; 187 }; 188 189 /* CPT Instruction Result Structure */ 190 struct cpt_res_s { 191 u64 compcode : 7; /* W0 */ 192 u64 doneint : 1; 193 u64 uc_compcode : 8; 194 u64 uc_info : 48; 195 u64 esn; /* W1 */ 196 }; 197 198 /* CPT SG structure */ 199 struct cpt_sg_s { 200 u64 seg1_size : 16; 201 u64 seg2_size : 16; 202 u64 seg3_size : 16; 203 u64 segs : 2; 204 u64 rsvd_63_50 : 14; 205 }; 206 207 /* CPT LF_INPROG Register */ 208 #define CPT_LF_INPROG_INFLIGHT GENMASK_ULL(8, 0) 209 #define CPT_LF_INPROG_GRB_CNT GENMASK_ULL(39, 32) 210 #define CPT_LF_INPROG_GWB_CNT GENMASK_ULL(47, 40) 211 212 /* CPT LF_Q_GRP_PTR Register */ 213 #define CPT_LF_Q_GRP_PTR_DQ_PTR GENMASK_ULL(14, 0) 214 #define CPT_LF_Q_GRP_PTR_NQ_PTR GENMASK_ULL(46, 32) 215 216 /* CPT LF_Q_SIZE Register */ 217 #define CPT_LF_Q_BASE_ADDR GENMASK_ULL(52, 7) 218 219 /* CPT LF_Q_SIZE Register */ 220 #define CPT_LF_Q_SIZE_DIV40 GENMASK_ULL(14, 0) 221 222 /* CPT LF CTX Flush Register */ 223 #define CPT_LF_CTX_FLUSH GENMASK_ULL(45, 0) 224 225 #ifdef CONFIG_XFRM_OFFLOAD 226 int cn10k_ipsec_init(struct net_device *netdev); 227 void cn10k_ipsec_clean(struct otx2_nic *pf); 228 int cn10k_ipsec_ethtool_init(struct net_device *netdev, bool enable); 229 bool otx2_sqe_add_sg_ipsec(struct otx2_nic *pfvf, struct otx2_snd_queue *sq, 230 struct sk_buff *skb, int num_segs, int *offset); 231 bool cn10k_ipsec_transmit(struct otx2_nic *pf, struct netdev_queue *txq, 232 struct otx2_snd_queue *sq, struct sk_buff *skb, 233 int num_segs, int size); 234 #else 235 static inline __maybe_unused int cn10k_ipsec_init(struct net_device *netdev) 236 { 237 return 0; 238 } 239 240 static inline __maybe_unused void cn10k_ipsec_clean(struct otx2_nic *pf) 241 { 242 } 243 244 static inline __maybe_unused 245 int cn10k_ipsec_ethtool_init(struct net_device *netdev, bool enable) 246 { 247 return 0; 248 } 249 250 static inline bool __maybe_unused 251 otx2_sqe_add_sg_ipsec(struct otx2_nic *pfvf, struct otx2_snd_queue *sq, 252 struct sk_buff *skb, int num_segs, int *offset) 253 { 254 return true; 255 } 256 257 static inline bool __maybe_unused 258 cn10k_ipsec_transmit(struct otx2_nic *pf, struct netdev_queue *txq, 259 struct otx2_snd_queue *sq, struct sk_buff *skb, 260 int num_segs, int size) 261 { 262 return true; 263 } 264 #endif 265 #endif // CN10K_IPSEC_H 266