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
cn10k_ipsec_init(struct net_device * netdev)235 static inline __maybe_unused int cn10k_ipsec_init(struct net_device *netdev)
236 {
237 	return 0;
238 }
239 
cn10k_ipsec_clean(struct otx2_nic * pf)240 static inline __maybe_unused void cn10k_ipsec_clean(struct otx2_nic *pf)
241 {
242 }
243 
244 static inline __maybe_unused
cn10k_ipsec_ethtool_init(struct net_device * netdev,bool enable)245 int cn10k_ipsec_ethtool_init(struct net_device *netdev, bool enable)
246 {
247 	return 0;
248 }
249 
250 static inline bool __maybe_unused
otx2_sqe_add_sg_ipsec(struct otx2_nic * pfvf,struct otx2_snd_queue * sq,struct sk_buff * skb,int num_segs,int * offset)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
cn10k_ipsec_transmit(struct otx2_nic * pf,struct netdev_queue * txq,struct otx2_snd_queue * sq,struct sk_buff * skb,int num_segs,int size)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