summaryrefslogtreecommitdiffstats
path: root/drivers/net/phy/mscc/mscc_macsec.h
blob: 453304bae778449dc1ee2a65d64910da97ee94c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
/* SPDX-License-Identifier: (GPL-2.0 OR MIT) */
/*
 * Driver for Microsemi VSC85xx PHYs
 *
 * Copyright (c) 2020 Microsemi Corporation
 */

#ifndef _MSCC_PHY_MACSEC_H_
#define _MSCC_PHY_MACSEC_H_

#include <net/macsec.h>

#define MSCC_MS_MAX_FLOWS		16

#define CONTROL_TYPE_EGRESS		0x6
#define CONTROL_TYPE_INGRESS		0xf
#define CONTROL_IV0			BIT(5)
#define CONTROL_IV1			BIT(6)
#define CONTROL_IV2			BIT(7)
#define CONTROL_UPDATE_SEQ		BIT(13)
#define CONTROL_IV_IN_SEQ		BIT(14)
#define CONTROL_ENCRYPT_AUTH		BIT(15)
#define CONTROL_KEY_IN_CTX		BIT(16)
#define CONTROL_CRYPTO_ALG(x)		((x) << 17)
#define     CTRYPTO_ALG_AES_CTR_128	0x5
#define     CTRYPTO_ALG_AES_CTR_192	0x6
#define     CTRYPTO_ALG_AES_CTR_256	0x7
#define CONTROL_DIGEST_TYPE(x)		((x) << 21)
#define CONTROL_AUTH_ALG(x)		((x) << 23)
#define     AUTH_ALG_AES_GHAS		0x4
#define CONTROL_AN(x)			((x) << 26)
#define CONTROL_SEQ_TYPE(x)		((x) << 28)
#define CONTROL_SEQ_MASK		BIT(30)
#define CONTROL_CONTEXT_ID		BIT(31)

enum mscc_macsec_destination_ports {
	MSCC_MS_PORT_COMMON		= 0,
	MSCC_MS_PORT_RSVD		= 1,
	MSCC_MS_PORT_CONTROLLED		= 2,
	MSCC_MS_PORT_UNCONTROLLED	= 3,
};

enum mscc_macsec_drop_actions {
	MSCC_MS_ACTION_BYPASS_CRC	= 0,
	MSCC_MS_ACTION_BYPASS_BAD	= 1,
	MSCC_MS_ACTION_DROP		= 2,
	MSCC_MS_ACTION_BYPASS		= 3,
};

enum mscc_macsec_flow_types {
	MSCC_MS_FLOW_BYPASS		= 0,
	MSCC_MS_FLOW_DROP		= 1,
	MSCC_MS_FLOW_INGRESS		= 2,
	MSCC_MS_FLOW_EGRESS		= 3,
};

enum mscc_macsec_validate_levels {
	MSCC_MS_VALIDATE_DISABLED	= 0,
	MSCC_MS_VALIDATE_CHECK		= 1,
	MSCC_MS_VALIDATE_STRICT		= 2,
};

enum macsec_bank {
	FC_BUFFER   = 0x04,
	HOST_MAC    = 0x05,
	LINE_MAC    = 0x06,
	PROC_0      = 0x0e,
	PROC_2      = 0x0f,
	MACSEC_INGR = 0x38,
	MACSEC_EGR  = 0x3c,
};

struct macsec_flow {
	struct list_head list;
	enum mscc_macsec_destination_ports port;
	enum macsec_bank bank;
	u32 index;
	int assoc_num;
	bool has_transformation;

	/* Highest takes precedence [0..15] */
	u8 priority;

	u8 key[MACSEC_MAX_KEY_LEN];

	union {
		struct macsec_rx_sa *rx_sa;
		struct macsec_tx_sa *tx_sa;
	};

	/* Matching */
	struct {
		u8 sci:1;
		u8 tagged:1;
		u8 untagged:1;
		u8 etype:1;
	} match;

	u16 etype;

	/* Action */
	struct {
		u8 bypass:1;
		u8 drop:1;
	} action;
};

#define MSCC_EXT_PAGE_MACSEC_17		17
#define MSCC_EXT_PAGE_MACSEC_18		18

#define MSCC_EXT_PAGE_MACSEC_19		19
#define MSCC_PHY_MACSEC_19_REG_ADDR(x)	(x)
#define MSCC_PHY_MACSEC_19_TARGET(x)	((x) << 12)
#define MSCC_PHY_MACSEC_19_READ		BIT(14)
#define MSCC_PHY_MACSEC_19_CMD		BIT(15)

#define MSCC_EXT_PAGE_MACSEC_20		20
#define MSCC_PHY_MACSEC_20_TARGET(x)	(x)

#define MSCC_MS_XFORM_REC(x, y)		(((x) << 5) + (y))
#define MSCC_MS_ENA_CFG			0x800
#define MSCC_MS_FC_CFG			0x804
#define MSCC_MS_SAM_MAC_SA_MATCH_LO(x)	(0x1000 + ((x) << 4))
#define MSCC_MS_SAM_MAC_SA_MATCH_HI(x)	(0x1001 + ((x) << 4))
#define MSCC_MS_SAM_MISC_MATCH(x)	(0x1004 + ((x) << 4))
#define MSCC_MS_SAM_MATCH_SCI_LO(x)	(0x1005 + ((x) << 4))
#define MSCC_MS_SAM_MATCH_SCI_HI(x)	(0x1006 + ((x) << 4))
#define MSCC_MS_SAM_MASK(x)		(0x1007 + ((x) << 4))
#define MSCC_MS_SAM_ENTRY_SET1		0x1808
#define MSCC_MS_SAM_ENTRY_CLEAR1	0x180c
#define MSCC_MS_SAM_FLOW_CTRL(x)	(0x1c00 + (x))
#define MSCC_MS_SAM_CP_TAG		0x1e40
#define MSCC_MS_SAM_NM_FLOW_NCP		0x1e51
#define MSCC_MS_SAM_NM_FLOW_CP		0x1e52
#define MSCC_MS_MISC_CONTROL		0x1e5f
#define MSCC_MS_COUNT_CONTROL		0x3204
#define MSCC_MS_PARAMS2_IG_CC_CONTROL	0x3a10
#define MSCC_MS_PARAMS2_IG_CP_TAG	0x3a14
#define MSCC_MS_VLAN_MTU_CHECK(x)	(0x3c40 + (x))
#define MSCC_MS_NON_VLAN_MTU_CHECK	0x3c48
#define MSCC_MS_PP_CTRL			0x3c4b
#define MSCC_MS_STATUS_CONTEXT_CTRL	0x3d02
#define MSCC_MS_INTR_CTRL_STATUS	0x3d04
#define MSCC_MS_BLOCK_CTX_UPDATE	0x3d0c
#define MSCC_MS_AIC_CTRL		0x3e02

/* MACSEC_ENA_CFG */
#define MSCC_MS_ENA_CFG_CLK_ENA				BIT(0)
#define MSCC_MS_ENA_CFG_SW_RST				BIT(1)
#define MSCC_MS_ENA_CFG_MACSEC_BYPASS_ENA		BIT(8)
#define MSCC_MS_ENA_CFG_MACSEC_ENA			BIT(9)
#define MSCC_MS_ENA_CFG_MACSEC_SPEED_MODE(x)		((x) << 10)
#define MSCC_MS_ENA_CFG_MACSEC_SPEED_MODE_M		GENMASK(12, 10)

/* MACSEC_FC_CFG */
#define MSCC_MS_FC_CFG_FCBUF_ENA			BIT(0)
#define MSCC_MS_FC_CFG_USE_PKT_EXPANSION_INDICATION	BIT(1)
#define MSCC_MS_FC_CFG_LOW_THRESH(x)			((x) << 4)
#define MSCC_MS_FC_CFG_LOW_THRESH_M			GENMASK(7, 4)
#define MSCC_MS_FC_CFG_HIGH_THRESH(x)			((x) << 8)
#define MSCC_MS_FC_CFG_HIGH_THRESH_M			GENMASK(11, 8)
#define MSCC_MS_FC_CFG_LOW_BYTES_VAL(x)			((x) << 12)
#define MSCC_MS_FC_CFG_LOW_BYTES_VAL_M			GENMASK(14, 12)
#define MSCC_MS_FC_CFG_HIGH_BYTES_VAL(x)		((x) << 16)
#define MSCC_MS_FC_CFG_HIGH_BYTES_VAL_M			GENMASK(18, 16)

/* MSCC_MS_SAM_MAC_SA_MATCH_HI */
#define MSCC_MS_SAM_MAC_SA_MATCH_HI_ETYPE(x)		((x) << 16)
#define MSCC_MS_SAM_MAC_SA_MATCH_HI_ETYPE_M		GENMASK(31, 16)

/* MACSEC_SAM_MISC_MATCH */
#define MSCC_MS_SAM_MISC_MATCH_VLAN_VALID		BIT(0)
#define MSCC_MS_SAM_MISC_MATCH_QINQ_FOUND		BIT(1)
#define MSCC_MS_SAM_MISC_MATCH_STAG_VALID		BIT(2)
#define MSCC_MS_SAM_MISC_MATCH_QTAG_VALID		BIT(3)
#define MSCC_MS_SAM_MISC_MATCH_VLAN_UP(x)		((x) << 4)
#define MSCC_MS_SAM_MISC_MATCH_VLAN_UP_M		GENMASK(6, 4)
#define MSCC_MS_SAM_MISC_MATCH_CONTROL_PACKET		BIT(7)
#define MSCC_MS_SAM_MISC_MATCH_UNTAGGED			BIT(8)
#define MSCC_MS_SAM_MISC_MATCH_TAGGED			BIT(9)
#define MSCC_MS_SAM_MISC_MATCH_BAD_TAG			BIT(10)
#define MSCC_MS_SAM_MISC_MATCH_KAY_TAG			BIT(11)
#define MSCC_MS_SAM_MISC_MATCH_SOURCE_PORT(x)		((x) << 12)
#define MSCC_MS_SAM_MISC_MATCH_SOURCE_PORT_M		GENMASK(13, 12)
#define MSCC_MS_SAM_MISC_MATCH_PRIORITY(x)		((x) << 16)
#define MSCC_MS_SAM_MISC_MATCH_PRIORITY_M		GENMASK(19, 16)
#define MSCC_MS_SAM_MISC_MATCH_AN(x)			((x) << 24)
#define MSCC_MS_SAM_MISC_MATCH_TCI(x)			((x) << 26)

/* MACSEC_SAM_MASK */
#define MSCC_MS_SAM_MASK_MAC_SA_MASK(x)			(x)
#define MSCC_MS_SAM_MASK_MAC_SA_MASK_M			GENMASK(5, 0)
#define MSCC_MS_SAM_MASK_MAC_DA_MASK(x)			((x) << 6)
#define MSCC_MS_SAM_MASK_MAC_DA_MASK_M			GENMASK(11, 6)
#define MSCC_MS_SAM_MASK_MAC_ETYPE_MASK			BIT(12)
#define MSCC_MS_SAM_MASK_VLAN_VLD_MASK			BIT(13)
#define MSCC_MS_SAM_MASK_QINQ_FOUND_MASK		BIT(14)
#define MSCC_MS_SAM_MASK_STAG_VLD_MASK			BIT(15)
#define MSCC_MS_SAM_MASK_QTAG_VLD_MASK			BIT(16)
#define MSCC_MS_SAM_MASK_VLAN_UP_MASK			BIT(17)
#define MSCC_MS_SAM_MASK_VLAN_ID_MASK			BIT(18)
#define MSCC_MS_SAM_MASK_SOURCE_PORT_MASK		BIT(19)
#define MSCC_MS_SAM_MASK_CTL_PACKET_MASK		BIT(20)
#define MSCC_MS_SAM_MASK_VLAN_UP_INNER_MASK		BIT(21)
#define MSCC_MS_SAM_MASK_VLAN_ID_INNER_MASK		BIT(22)
#define MSCC_MS_SAM_MASK_SCI_MASK			BIT(23)
#define MSCC_MS_SAM_MASK_AN_MASK(x)			((x) << 24)
#define MSCC_MS_SAM_MASK_TCI_MASK(x)			((x) << 26)

/* MACSEC_SAM_FLOW_CTRL_EGR */
#define MSCC_MS_SAM_FLOW_CTRL_FLOW_TYPE(x)		(x)
#define MSCC_MS_SAM_FLOW_CTRL_FLOW_TYPE_M		GENMASK(1, 0)
#define MSCC_MS_SAM_FLOW_CTRL_DEST_PORT(x)		((x) << 2)
#define MSCC_MS_SAM_FLOW_CTRL_DEST_PORT_M		GENMASK(3, 2)
#define MSCC_MS_SAM_FLOW_CTRL_RESV_4			BIT(4)
#define MSCC_MS_SAM_FLOW_CTRL_FLOW_CRYPT_AUTH		BIT(5)
#define MSCC_MS_SAM_FLOW_CTRL_DROP_ACTION(x)		((x) << 6)
#define MSCC_MS_SAM_FLOW_CTRL_DROP_ACTION_M		GENMASK(7, 6)
#define MSCC_MS_SAM_FLOW_CTRL_RESV_15_TO_8(x)		((x) << 8)
#define MSCC_MS_SAM_FLOW_CTRL_RESV_15_TO_8_M		GENMASK(15, 8)
#define MSCC_MS_SAM_FLOW_CTRL_PROTECT_FRAME		BIT(16)
#define MSCC_MS_SAM_FLOW_CTRL_REPLAY_PROTECT		BIT(16)
#define MSCC_MS_SAM_FLOW_CTRL_SA_IN_USE			BIT(17)
#define MSCC_MS_SAM_FLOW_CTRL_INCLUDE_SCI		BIT(18)
#define MSCC_MS_SAM_FLOW_CTRL_USE_ES			BIT(19)
#define MSCC_MS_SAM_FLOW_CTRL_USE_SCB			BIT(20)
#define MSCC_MS_SAM_FLOW_CTRL_VALIDATE_FRAMES(x)	((x) << 19)
#define MSCC_MS_SAM_FLOW_CTRL_TAG_BYPASS_SIZE(x)	((x) << 21)
#define MSCC_MS_SAM_FLOW_CTRL_TAG_BYPASS_SIZE_M		GENMASK(22, 21)
#define MSCC_MS_SAM_FLOW_CTRL_RESV_23			BIT(23)
#define MSCC_MS_SAM_FLOW_CTRL_CONFIDENTIALITY_OFFSET(x)	((x) << 24)
#define MSCC_MS_SAM_FLOW_CTRL_CONFIDENTIALITY_OFFSET_M	GENMASK(30, 24)
#define MSCC_MS_SAM_FLOW_CTRL_CONF_PROTECT		BIT(31)

/* MACSEC_SAM_CP_TAG */
#define MSCC_MS_SAM_CP_TAG_MAP_TBL(x)			(x)
#define MSCC_MS_SAM_CP_TAG_MAP_TBL_M			GENMASK(23, 0)
#define MSCC_MS_SAM_CP_TAG_DEF_UP(x)			((x) << 24)
#define MSCC_MS_SAM_CP_TAG_DEF_UP_M			GENMASK(26, 24)
#define MSCC_MS_SAM_CP_TAG_STAG_UP_EN			BIT(27)
#define MSCC_MS_SAM_CP_TAG_QTAG_UP_EN			BIT(28)
#define MSCC_MS_SAM_CP_TAG_PARSE_QINQ			BIT(29)
#define MSCC_MS_SAM_CP_TAG_PARSE_STAG			BIT(30)
#define MSCC_MS_SAM_CP_TAG_PARSE_QTAG			BIT(31)

/* MACSEC_SAM_NM_FLOW_NCP */
#define MSCC_MS_SAM_NM_FLOW_NCP_UNTAGGED_FLOW_TYPE(x)	(x)
#define MSCC_MS_SAM_NM_FLOW_NCP_UNTAGGED_DEST_PORT(x)	((x) << 2)
#define MSCC_MS_SAM_NM_FLOW_NCP_UNTAGGED_DROP_ACTION(x)	((x) << 6)
#define MSCC_MS_SAM_NM_FLOW_NCP_TAGGED_FLOW_TYPE(x)	((x) << 8)
#define MSCC_MS_SAM_NM_FLOW_NCP_TAGGED_DEST_PORT(x)	((x) << 10)
#define MSCC_MS_SAM_NM_FLOW_NCP_TAGGED_DROP_ACTION(x)	((x) << 14)
#define MSCC_MS_SAM_NM_FLOW_NCP_BADTAG_FLOW_TYPE(x)	((x) << 16)
#define MSCC_MS_SAM_NM_FLOW_NCP_BADTAG_DEST_PORT(x)	((x) << 18)
#define MSCC_MS_SAM_NM_FLOW_NCP_BADTAG_DROP_ACTION(x)	((x) << 22)
#define MSCC_MS_SAM_NM_FLOW_NCP_KAY_FLOW_TYPE(x)	((x) << 24)
#define MSCC_MS_SAM_NM_FLOW_NCP_KAY_DEST_PORT(x)	((x) << 26)
#define MSCC_MS_SAM_NM_FLOW_NCP_KAY_DROP_ACTION(x)	((x) << 30)

/* MACSEC_SAM_NM_FLOW_CP */
#define MSCC_MS_SAM_NM_FLOW_CP_UNTAGGED_FLOW_TYPE(x)	(x)
#define MSCC_MS_SAM_NM_FLOW_CP_UNTAGGED_DEST_PORT(x)	((x) << 2)
#define MSCC_MS_SAM_NM_FLOW_CP_UNTAGGED_DROP_ACTION(x)	((x) << 6)
#define MSCC_MS_SAM_NM_FLOW_CP_TAGGED_FLOW_TYPE(x)	((x) << 8)
#define MSCC_MS_SAM_NM_FLOW_CP_TAGGED_DEST_PORT(x)	((x) << 10)
#define MSCC_MS_SAM_NM_FLOW_CP_TAGGED_DROP_ACTION(x)	((x) << 14)
#define MSCC_MS_SAM_NM_FLOW_CP_BADTAG_FLOW_TYPE(x)	((x) << 16)
#define MSCC_MS_SAM_NM_FLOW_CP_BADTAG_DEST_PORT(x)	((x) << 18)
#define MSCC_MS_SAM_NM_FLOW_CP_BADTAG_DROP_ACTION(x)	((x) << 22)
#define MSCC_MS_SAM_NM_FLOW_CP_KAY_FLOW_TYPE(x)		((x) << 24)
#define MSCC_MS_SAM_NM_FLOW_CP_KAY_DEST_PORT(x)		((x) << 26)
#define MSCC_MS_SAM_NM_FLOW_CP_KAY_DROP_ACTION(x)	((x) << 30)

/* MACSEC_MISC_CONTROL */
#define MSCC_MS_MISC_CONTROL_MC_LATENCY_FIX(x)		(x)
#define MSCC_MS_MISC_CONTROL_MC_LATENCY_FIX_M		GENMASK(5, 0)
#define MSCC_MS_MISC_CONTROL_STATIC_BYPASS		BIT(8)
#define MSCC_MS_MISC_CONTROL_NM_MACSEC_EN		BIT(9)
#define MSCC_MS_MISC_CONTROL_VALIDATE_FRAMES(x)		((x) << 10)
#define MSCC_MS_MISC_CONTROL_VALIDATE_FRAMES_M		GENMASK(11, 10)
#define MSCC_MS_MISC_CONTROL_XFORM_REC_SIZE(x)		((x) << 24)
#define MSCC_MS_MISC_CONTROL_XFORM_REC_SIZE_M		GENMASK(25, 24)

/* MACSEC_COUNT_CONTROL */
#define MSCC_MS_COUNT_CONTROL_RESET_ALL			BIT(0)
#define MSCC_MS_COUNT_CONTROL_DEBUG_ACCESS		BIT(1)
#define MSCC_MS_COUNT_CONTROL_SATURATE_CNTRS		BIT(2)
#define MSCC_MS_COUNT_CONTROL_AUTO_CNTR_RESET		BIT(3)

/* MACSEC_PARAMS2_IG_CC_CONTROL */
#define MSCC_MS_PARAMS2_IG_CC_CONTROL_NON_MATCH_CTRL_ACT	BIT(14)
#define MSCC_MS_PARAMS2_IG_CC_CONTROL_NON_MATCH_ACT	BIT(15)

/* MACSEC_PARAMS2_IG_CP_TAG */
#define MSCC_MS_PARAMS2_IG_CP_TAG_MAP_TBL(x)		(x)
#define MSCC_MS_PARAMS2_IG_CP_TAG_MAP_TBL_M		GENMASK(23, 0)
#define MSCC_MS_PARAMS2_IG_CP_TAG_DEF_UP(x)		((x) << 24)
#define MSCC_MS_PARAMS2_IG_CP_TAG_DEF_UP_M		GENMASK(26, 24)
#define MSCC_MS_PARAMS2_IG_CP_TAG_STAG_UP_EN		BIT(27)
#define MSCC_MS_PARAMS2_IG_CP_TAG_QTAG_UP_EN		BIT(28)
#define MSCC_MS_PARAMS2_IG_CP_TAG_PARSE_QINQ		BIT(29)
#define MSCC_MS_PARAMS2_IG_CP_TAG_PARSE_STAG		BIT(30)
#define MSCC_MS_PARAMS2_IG_CP_TAG_PARSE_QTAG		BIT(31)

/* MACSEC_VLAN_MTU_CHECK */
#define MSCC_MS_VLAN_MTU_CHECK_MTU_COMPARE(x)		(x)
#define MSCC_MS_VLAN_MTU_CHECK_MTU_COMPARE_M		GENMASK(14, 0)
#define MSCC_MS_VLAN_MTU_CHECK_MTU_COMP_DROP		BIT(15)

/* MACSEC_NON_VLAN_MTU_CHECK */
#define MSCC_MS_NON_VLAN_MTU_CHECK_NV_MTU_COMPARE(x)	(x)
#define MSCC_MS_NON_VLAN_MTU_CHECK_NV_MTU_COMPARE_M	GENMASK(14, 0)
#define MSCC_MS_NON_VLAN_MTU_CHECK_NV_MTU_COMP_DROP	BIT(15)

/* MACSEC_PP_CTRL */
#define MSCC_MS_PP_CTRL_MACSEC_OCTET_INCR_MODE		BIT(0)

/* MACSEC_INTR_CTRL_STATUS */
#define MSCC_MS_INTR_CTRL_STATUS_INTR_CLR_STATUS(x)	(x)
#define MSCC_MS_INTR_CTRL_STATUS_INTR_CLR_STATUS_M	GENMASK(15, 0)
#define MSCC_MS_INTR_CTRL_STATUS_INTR_ENABLE(x)		((x) << 16)
#define MSCC_MS_INTR_CTRL_STATUS_INTR_ENABLE_M		GENMASK(31, 16)
#define MACSEC_INTR_CTRL_STATUS_ROLLOVER		BIT(5)

#endif /* _MSCC_PHY_MACSEC_H_ */