1 /* SPDX-License-Identifier:    GPL-2.0
2  *
3  * Copyright (C) 2018 Marvell International Ltd.
4  */
5 
6 #ifndef __CGX_INTF_H__
7 #define __CGX_INTF_H__
8 
9 #define CGX_FIRMWARE_MAJOR_VER		1
10 #define CGX_FIRMWARE_MINOR_VER		0
11 
12 /* Register offsets */
13 #define CGX_CMR_INT		0x87e0e0000040
14 #define CGX_CMR_SCRATCH0	0x87e0e0001050
15 #define CGX_CMR_SCRATCH1	0x87e0e0001058
16 
17 #define CGX_SHIFT(x)		(0x1000000 * ((x) & 0x3))
18 #define CMR_SHIFT(x)		(0x40000 * ((x) & 0x3))
19 
20 /* CGX error types. set for cmd response status as CGX_STAT_FAIL */
21 enum cgx_error_type {
22 	CGX_ERR_NONE,
23 	CGX_ERR_LMAC_NOT_ENABLED,
24 	CGX_ERR_LMAC_MODE_INVALID,
25 	CGX_ERR_REQUEST_ID_INVALID,
26 	CGX_ERR_PREV_ACK_NOT_CLEAR,
27 	CGX_ERR_PHY_LINK_DOWN,
28 	CGX_ERR_PCS_RESET_FAIL,
29 	CGX_ERR_AN_CPT_FAIL,
30 	CGX_ERR_TX_NOT_IDLE,
31 	CGX_ERR_RX_NOT_IDLE,
32 	CGX_ERR_SPUX_BR_BLKLOCK_FAIL,
33 	CGX_ERR_SPUX_RX_ALIGN_FAIL,
34 	CGX_ERR_SPUX_TX_FAULT,
35 	CGX_ERR_SPUX_RX_FAULT,
36 	CGX_ERR_SPUX_RESET_FAIL,
37 	CGX_ERR_SPUX_AN_RESET_FAIL,
38 	CGX_ERR_SPUX_USX_AN_RESET_FAIL,
39 	CGX_ERR_SMUX_RX_LINK_NOT_OK,
40 	CGX_ERR_PCS_LINK_FAIL,
41 	CGX_ERR_TRAINING_FAIL,
42 	CGX_ERR_RX_EQU_FAIL,
43 	CGX_ERR_SPUX_BER_FAIL,
44 	CGX_ERR_SPUX_RSFEC_ALGN_FAIL,
45 	CGX_ERR_SPUX_MARKER_LOCK_FAIL,
46 	CGX_ERR_SET_FEC_INVALID,
47 	CGX_ERR_SET_FEC_FAIL,
48 	CGX_ERR_MODULE_INVALID,
49 	CGX_ERR_MODULE_NOT_PRESENT,
50 	CGX_ERR_SPEED_CHANGE_INVALID,	/* = 28 */
51 	/* FIXME : add more error types when adding support for new modes */
52 };
53 
54 /* LINK speed types */
55 enum cgx_link_speed {
56 	CGX_LINK_NONE,
57 	CGX_LINK_10M,
58 	CGX_LINK_100M,
59 	CGX_LINK_1G,
60 	CGX_LINK_2HG,	/* 2.5 Gbps */
61 	CGX_LINK_5G,
62 	CGX_LINK_10G,
63 	CGX_LINK_20G,
64 	CGX_LINK_25G,
65 	CGX_LINK_40G,
66 	CGX_LINK_50G,
67 	CGX_LINK_80G,
68 	CGX_LINK_100G,
69 	CGX_LINK_MAX,
70 };
71 
72 /* REQUEST ID types. Input to firmware */
73 enum cgx_cmd_id {
74 	CGX_CMD_NONE = 0,
75 	CGX_CMD_GET_FW_VER,
76 	CGX_CMD_GET_MAC_ADDR,
77 	CGX_CMD_SET_MTU,
78 	CGX_CMD_GET_LINK_STS,		/* optional to user */
79 	CGX_CMD_LINK_BRING_UP,		/* = 5 */
80 	CGX_CMD_LINK_BRING_DOWN,
81 	CGX_CMD_INTERNAL_LBK,
82 	CGX_CMD_EXTERNAL_LBK,
83 	CGX_CMD_HIGIG,
84 	CGX_CMD_LINK_STAT_CHANGE,	/* = 10 */
85 	CGX_CMD_MODE_CHANGE,		/* hot plug support */
86 	CGX_CMD_INTF_SHUTDOWN,
87 	CGX_CMD_GET_MKEX_SIZE,
88 	CGX_CMD_GET_MKEX_PROFILE,
89 	CGX_CMD_GET_FWD_BASE,		/* get base address of shared FW data */
90 	CGX_CMD_GET_LINK_MODES,		/* Supported Link Modes */
91 	CGX_CMD_SET_LINK_MODE,
92 	CGX_CMD_GET_SUPPORTED_FEC,
93 	CGX_CMD_SET_FEC,
94 	CGX_CMD_GET_AN,			/* = 20 */
95 	CGX_CMD_SET_AN,
96 	CGX_CMD_GET_ADV_LINK_MODES,
97 	CGX_CMD_GET_ADV_FEC,
98 	CGX_CMD_GET_PHY_MOD_TYPE, /* line-side modulation type: NRZ or PAM4 */
99 	CGX_CMD_SET_PHY_MOD_TYPE,	/* = 25 */
100 	CGX_CMD_PRBS,
101 	CGX_CMD_DISPLAY_EYE,
102 	CGX_CMD_GET_PHY_FEC_STATS,
103 	CGX_CMD_DISPLAY_SERDES,
104 	CGX_CMD_AN_LOOPBACK,	/* = 30 */
105 	CGX_CMD_GET_PERSIST_IGNORE,
106 	CGX_CMD_SET_PERSIST_IGNORE,
107 	CGX_CMD_SET_MAC_ADDR,
108 };
109 
110 /* async event ids */
111 enum cgx_evt_id {
112 	CGX_EVT_NONE,
113 	CGX_EVT_LINK_CHANGE,
114 };
115 
116 /* event types - cause of interrupt */
117 enum cgx_evt_type {
118 	CGX_EVT_ASYNC,
119 	CGX_EVT_CMD_RESP
120 };
121 
122 enum cgx_stat {
123 	CGX_STAT_SUCCESS,
124 	CGX_STAT_FAIL
125 };
126 
127 enum cgx_cmd_own {
128 	/* default ownership with kernel/uefi/u-boot */
129 	CGX_OWN_NON_SECURE_SW,
130 	/* set by kernel/uefi/u-boot after posting a new request to ATF */
131 	CGX_OWN_FIRMWARE,
132 };
133 
134 /* Supported LINK MODE enums
135  * Each link mode is a bit mask of these
136  * enums which are represented as bits
137  */
138 enum cgx_mode_t {
139 	CGX_MODE_SGMII_BIT = 0,
140 	CGX_MODE_1000_BASEX_BIT,
141 	CGX_MODE_QSGMII_BIT,
142 	CGX_MODE_10G_C2C_BIT,
143 	CGX_MODE_10G_C2M_BIT,
144 	CGX_MODE_10G_KR_BIT,
145 	CGX_MODE_20G_C2C_BIT,
146 	CGX_MODE_25G_C2C_BIT,
147 	CGX_MODE_25G_C2M_BIT,
148 	CGX_MODE_25G_2_C2C_BIT,
149 	CGX_MODE_25G_CR_BIT,
150 	CGX_MODE_25G_KR_BIT,
151 	CGX_MODE_40G_C2C_BIT,
152 	CGX_MODE_40G_C2M_BIT,
153 	CGX_MODE_40G_CR4_BIT,
154 	CGX_MODE_40G_KR4_BIT,
155 	CGX_MODE_40GAUI_C2C_BIT,
156 	CGX_MODE_50G_C2C_BIT,
157 	CGX_MODE_50G_C2M_BIT,
158 	CGX_MODE_50G_4_C2C_BIT,
159 	CGX_MODE_50G_CR_BIT,
160 	CGX_MODE_50G_KR_BIT,
161 	CGX_MODE_80GAUI_C2C_BIT,
162 	CGX_MODE_100G_C2C_BIT,
163 	CGX_MODE_100G_C2M_BIT,
164 	CGX_MODE_100G_CR4_BIT,
165 	CGX_MODE_100G_KR4_BIT,
166 	CGX_MODE_MAX_BIT /* = 29 */
167 };
168 
169 /* scratchx(0) CSR used for ATF->non-secure SW communication.
170  * This acts as the status register
171  * Provides details on command ack/status, link status, error details
172  */
173 
174 /* CAUTION : below structures are placed in order based on the bit positions
175  * For any updates/new bitfields, corresponding structures needs to be updated
176  */
177 struct cgx_evt_sts_s {			/* start from bit 0 */
178 	u64 ack:1;
179 	u64 evt_type:1;		/* cgx_evt_type */
180 	u64 stat:1;		/* cgx_stat */
181 	u64 id:6;			/* cgx_evt_id/cgx_cmd_id */
182 	u64 reserved:55;
183 };
184 
185 /* all the below structures are in the same memory location of SCRATCHX(0)
186  * value can be read/written based on command ID
187  */
188 
189 /* Resp to command IDs with command status as CGX_STAT_FAIL
190  * Not applicable for commands :
191  *	CGX_CMD_LINK_BRING_UP/DOWN/CGX_EVT_LINK_CHANGE
192  *	check struct cgx_lnk_sts_s comments
193  */
194 struct cgx_err_sts_s {			/* start from bit 9 */
195 	u64 reserved1:9;
196 	u64 type:10;		/* cgx_error_type */
197 	u64 reserved2:35;
198 };
199 
200 /* Resp to cmd ID as CGX_CMD_GET_FW_VER with cmd status as CGX_STAT_SUCCESS */
201 struct cgx_ver_s {			/* start from bit 9 */
202 	u64 reserved1:9;
203 	u64 major_ver:4;
204 	u64 minor_ver:4;
205 	u64 reserved2:47;
206 };
207 
208 /* Resp to cmd ID as CGX_CMD_GET_MAC_ADDR with cmd status as CGX_STAT_SUCCESS
209  * Returns each byte of MAC address in a separate bit field
210  */
211 struct cgx_mac_addr_s {			/* start from bit 9 */
212 	u64 reserved1:9;
213 	u64 addr_0:8;
214 	u64 addr_1:8;
215 	u64 addr_2:8;
216 	u64 addr_3:8;
217 	u64 addr_4:8;
218 	u64 addr_5:8;
219 	u64 reserved2:7;
220 };
221 
222 /* Resp to cmd ID - CGX_CMD_LINK_BRING_UP/DOWN, event ID CGX_EVT_LINK_CHANGE
223  * status can be either CGX_STAT_FAIL or CGX_STAT_SUCCESS
224  * In case of CGX_STAT_FAIL, it indicates CGX configuration failed when
225  * processing link up/down/change command. Both err_type and current link status
226  * will be updated
227  * In case of CGX_STAT_SUCCESS, err_type will be CGX_ERR_NONE and current
228  * link status will be updated
229  */
230 struct cgx_lnk_sts_s {
231 	u64 reserved1:9;
232 	u64 link_up:1;
233 	u64 full_duplex:1;
234 	u64 speed:4;	/* cgx_link_speed */
235 	u64 err_type:10;
236 	u64 an:1;		/* Current AN state : enabled/disabled */
237 	u64 fec:2;		/* Current FEC type if enabled, if not 0 */
238 	u64 port:8;	/* Share the current port info if required */
239 	u64 mode:8;	/* cgx_mode_t enum integer value */
240 	u64 reserved2:20;
241 };
242 
243 struct sh_fwd_base_s {
244 	u64 reserved1:9;
245 	u64 addr:55;
246 };
247 
248 struct cgx_link_modes_s {
249 	u64 reserved1:9;
250 	u64 modes:55;
251 };
252 
253 /* Resp to cmd ID - CGX_CMD_GET_ADV_FEC/CGX_CMD_GET_SUPPORTED_FEC
254  * fec : 2 bits
255  * typedef enum cgx_fec_type {
256  *     CGX_FEC_NONE,
257  *     CGX_FEC_BASE_R,
258  *     CGX_FEC_RS
259  * } fec_type_t;
260  */
261 struct cgx_fec_types_s {
262 	u64 reserved1:9;
263 	u64 fec:2;
264 	u64 reserved2:53;
265 };
266 
267 /* Resp to cmd ID - CGX_CMD_GET_AN */
268 struct cgx_get_an_s {
269 	u64 reserved1:9;
270 	u64 an:1;
271 	u64 reserved2:54;
272 };
273 
274 /* Resp to cmd ID - CGX_CMD_GET_PHY_MOD_TYPE */
275 struct cgx_get_phy_mod_type_s {
276 	u64 reserved1:9;
277 	u64 mod:1;		/* 0=NRZ, 1=PAM4 */
278 	u64 reserved2:54;
279 };
280 
281 /* Resp to cmd ID - CGX_CMD_GET_PERSIST_IGNORE */
282 struct cgx_get_flash_ignore_s {
283 	uint64_t reserved1:9;
284 	uint64_t ignore:1;
285 	uint64_t reserved2:54;
286 };
287 
288 union cgx_rsp_sts {
289 	/* Fixed, applicable for all commands/events */
290 	struct cgx_evt_sts_s evt_sts;
291 	/* response to CGX_CMD_LINK_BRINGUP/DOWN/LINK_CHANGE */
292 	struct cgx_lnk_sts_s link_sts;
293 	/* response to CGX_CMD_GET_FW_VER */
294 	struct cgx_ver_s ver;
295 	/* response to CGX_CMD_GET_MAC_ADDR */
296 	struct cgx_mac_addr_s mac_s;
297 	/* response to CGX_CMD_GET_FWD_BASE */
298 	struct sh_fwd_base_s fwd_base_s;
299 	/* response if evt_status = CMD_FAIL */
300 	struct cgx_err_sts_s err;
301 	/* response to CGX_CMD_GET_SUPPORTED_FEC */
302 	struct cgx_fec_types_s supported_fec;
303 	/* response to CGX_CMD_GET_LINK_MODES */
304 	struct cgx_link_modes_s supported_modes;
305 	/* response to CGX_CMD_GET_ADV_LINK_MODES */
306 	struct cgx_link_modes_s adv_modes;
307 	/* response to CGX_CMD_GET_ADV_FEC */
308 	struct cgx_fec_types_s adv_fec;
309 	/* response to CGX_CMD_GET_AN */
310 	struct cgx_get_an_s an;
311 	/* response to CGX_CMD_GET_PHY_MOD_TYPE */
312 	struct cgx_get_phy_mod_type_s phy_mod_type;
313 	/* response to CGX_CMD_GET_PERSIST_IGNORE */
314 	struct cgx_get_flash_ignore_s persist;
315 #ifdef NT_FW_CONFIG
316 	/* response to CGX_CMD_GET_MKEX_SIZE */
317 	struct cgx_mcam_profile_sz_s prfl_sz;
318 	/* response to CGX_CMD_GET_MKEX_PROFILE */
319 	struct cgx_mcam_profile_addr_s prfl_addr;
320 #endif
321 };
322 
323 union cgx_scratchx0 {
324 	u64 u;
325 	union cgx_rsp_sts s;
326 };
327 
328 /* scratchx(1) CSR used for non-secure SW->ATF communication
329  * This CSR acts as a command register
330  */
331 struct cgx_cmd {			/* start from bit 2 */
332 	u64 reserved1:2;
333 	u64 id:6;			/* cgx_request_id */
334 	u64 reserved2:56;
335 };
336 
337 /* all the below structures are in the same memory location of SCRATCHX(1)
338  * corresponding arguments for command Id needs to be updated
339  */
340 
341 /* Any command using enable/disable as an argument need
342  * to pass the option via this structure.
343  * Ex: Loopback, HiGig...
344  */
345 struct cgx_ctl_args {			/* start from bit 8 */
346 	u64 reserved1:8;
347 	u64 enable:1;
348 	u64 reserved2:55;
349 };
350 
351 /* command argument to be passed for cmd ID - CGX_CMD_SET_MTU */
352 struct cgx_mtu_args {
353 	u64 reserved1:8;
354 	u64 size:16;
355 	u64 reserved2:40;
356 };
357 
358 /* command argument to be passed for cmd ID - CGX_CMD_MODE_CHANGE */
359 struct cgx_mode_change_args {
360 	uint64_t reserved1:8;
361 	uint64_t speed:4; /* cgx_link_speed enum */
362 	uint64_t duplex:1; /* 0 - full duplex, 1 - half duplex */
363 	uint64_t an:1;	/* 0 - disable AN, 1 - enable AN */
364 	uint64_t port:8; /* device port */
365 	uint64_t mode:42;
366 };
367 
368 /* command argument to be passed for cmd ID - CGX_CMD_LINK_CHANGE */
369 struct cgx_link_change_args {		/* start from bit 8 */
370 	u64 reserved1:8;
371 	u64 link_up:1;
372 	u64 full_duplex:1;
373 	u64 speed:4;		/* cgx_link_speed */
374 	u64 reserved2:50;
375 };
376 
377 /* command argument to be passed for cmd ID - CGX_CMD_SET_LINK_MODE */
378 struct cgx_set_mode_args {
379 	u64 reserved1:8;
380 	u64 mode:56;
381 };
382 
383 /* command argument to be passed for cmd ID - CGX_CMD_SET_FEC */
384 struct cgx_set_fec_args {
385 	u64 reserved1:8;
386 	u64 fec:2;
387 	u64 reserved2:54;
388 };
389 
390 /* command argument to be passed for cmd ID - CGX_CMD_SET_PHY_MOD_TYPE */
391 struct cgx_set_phy_mod_args {
392 	u64 reserved1:8;
393 	u64 mod:1;		/* 0=NRZ, 1=PAM4 */
394 	u64 reserved2:55;
395 };
396 
397 /* command argument to be passed for cmd ID - CGX_CMD_SET_PERSIST_IGNORE */
398 struct cgx_set_flash_ignore_args {
399 	uint64_t reserved1:8;
400 	uint64_t ignore:1;
401 	uint64_t reserved2:55;
402 };
403 
404 /* command argument to be passed for cmd ID - CGX_CMD_SET_MAC_ADDR */
405 struct cgx_mac_addr_args {
406 	uint64_t reserved1:8;
407 	uint64_t addr:48;
408 	uint64_t pf_id:8;
409 };
410 
411 struct cgx_prbs_args {
412 	u64 reserved1:8; /* start from bit 8 */
413 	u64 lane:8;
414 	u64 qlm:8;
415 	u64 stop_on_error:1;
416 	u64 mode:8;
417 	u64 time:31;
418 };
419 
420 struct cgx_display_eye_args {
421 	u64 reserved1:8; /* start from bit 8 */
422 	u64 qlm:8;
423 	u64 lane:47;
424 };
425 
426 union cgx_cmd_s {
427 	u64 own_status:2;			/* cgx_cmd_own */
428 	struct cgx_cmd cmd;
429 	struct cgx_ctl_args cmd_args;
430 	struct cgx_mtu_args mtu_size;
431 	struct cgx_link_change_args lnk_args; /* Input to CGX_CMD_LINK_CHANGE */
432 	struct cgx_set_mode_args mode_args;
433 	struct cgx_mode_change_args mode_change_args;
434 	struct cgx_set_fec_args fec_args;
435 	struct cgx_set_phy_mod_args phy_mod_args;
436 	struct cgx_set_flash_ignore_args persist_args;
437 	struct cgx_mac_addr_args mac_args;
438 	/* any other arg for command id * like : mtu, dmac filtering control */
439 	struct cgx_prbs_args prbs_args;
440 	struct cgx_display_eye_args dsp_eye_args;
441 };
442 
443 union cgx_scratchx1 {
444 	u64 u;
445 	union cgx_cmd_s s;
446 };
447 
448 #endif /* __CGX_INTF_H__ */
449