1/* SPDX-License-Identifier: GPL-2.0 */
2/* Marvell OcteonTx2 CGX driver
3 *
4 * Copyright (C) 2018 Marvell.
5 *
6 */
7
8#ifndef __CGX_FW_INTF_H__
9#define __CGX_FW_INTF_H__
10
11#include <linux/bitops.h>
12#include <linux/bitfield.h>
13
14#define CGX_FIRMWARE_MAJOR_VER 1
15#define CGX_FIRMWARE_MINOR_VER 0
16
17#define CGX_EVENT_ACK 1UL
18
19/* CGX error types. set for cmd response status as CGX_STAT_FAIL */
20enum cgx_error_type {
21 CGX_ERR_NONE,
22 CGX_ERR_LMAC_NOT_ENABLED,
23 CGX_ERR_LMAC_MODE_INVALID,
24 CGX_ERR_REQUEST_ID_INVALID,
25 CGX_ERR_PREV_ACK_NOT_CLEAR,
26 CGX_ERR_PHY_LINK_DOWN,
27 CGX_ERR_PCS_RESET_FAIL,
28 CGX_ERR_AN_CPT_FAIL,
29 CGX_ERR_TX_NOT_IDLE,
30 CGX_ERR_RX_NOT_IDLE,
31 CGX_ERR_SPUX_BR_BLKLOCK_FAIL,
32 CGX_ERR_SPUX_RX_ALIGN_FAIL,
33 CGX_ERR_SPUX_TX_FAULT,
34 CGX_ERR_SPUX_RX_FAULT,
35 CGX_ERR_SPUX_RESET_FAIL,
36 CGX_ERR_SPUX_AN_RESET_FAIL,
37 CGX_ERR_SPUX_USX_AN_RESET_FAIL,
38 CGX_ERR_SMUX_RX_LINK_NOT_OK,
39 CGX_ERR_PCS_RECV_LINK_FAIL,
40 CGX_ERR_TRAINING_FAIL,
41 CGX_ERR_RX_EQU_FAIL,
42 CGX_ERR_SPUX_BER_FAIL,
43 CGX_ERR_SPUX_RSFEC_ALGN_FAIL,
44 CGX_ERR_SPUX_MARKER_LOCK_FAIL,
45 CGX_ERR_SET_FEC_INVALID,
46 CGX_ERR_SET_FEC_FAIL,
47 CGX_ERR_MODULE_INVALID,
48 CGX_ERR_MODULE_NOT_PRESENT,
49 CGX_ERR_SPEED_CHANGE_INVALID,
50};
51
52/* LINK speed types */
53enum cgx_link_speed {
54 CGX_LINK_NONE,
55 CGX_LINK_10M,
56 CGX_LINK_100M,
57 CGX_LINK_1G,
58 CGX_LINK_2HG,
59 CGX_LINK_5G,
60 CGX_LINK_10G,
61 CGX_LINK_20G,
62 CGX_LINK_25G,
63 CGX_LINK_40G,
64 CGX_LINK_50G,
65 CGX_LINK_80G,
66 CGX_LINK_100G,
67 CGX_LINK_SPEED_MAX,
68};
69
70enum CGX_MODE_ {
71 CGX_MODE_SGMII,
72 CGX_MODE_1000_BASEX,
73 CGX_MODE_QSGMII,
74 CGX_MODE_10G_C2C,
75 CGX_MODE_10G_C2M,
76 CGX_MODE_10G_KR,
77 CGX_MODE_20G_C2C,
78 CGX_MODE_25G_C2C,
79 CGX_MODE_25G_C2M,
80 CGX_MODE_25G_2_C2C,
81 CGX_MODE_25G_CR,
82 CGX_MODE_25G_KR,
83 CGX_MODE_40G_C2C,
84 CGX_MODE_40G_C2M,
85 CGX_MODE_40G_CR4,
86 CGX_MODE_40G_KR4,
87 CGX_MODE_40GAUI_C2C,
88 CGX_MODE_50G_C2C,
89 CGX_MODE_50G_C2M,
90 CGX_MODE_50G_4_C2C,
91 CGX_MODE_50G_CR,
92 CGX_MODE_50G_KR,
93 CGX_MODE_80GAUI_C2C,
94 CGX_MODE_100G_C2C,
95 CGX_MODE_100G_C2M,
96 CGX_MODE_100G_CR4,
97 CGX_MODE_100G_KR4,
98 CGX_MODE_MAX /* = 29 */
99};
100/* REQUEST ID types. Input to firmware */
101enum cgx_cmd_id {
102 CGX_CMD_NONE,
103 CGX_CMD_GET_FW_VER,
104 CGX_CMD_GET_MAC_ADDR,
105 CGX_CMD_SET_MTU,
106 CGX_CMD_GET_LINK_STS, /* optional to user */
107 CGX_CMD_LINK_BRING_UP,
108 CGX_CMD_LINK_BRING_DOWN,
109 CGX_CMD_INTERNAL_LBK,
110 CGX_CMD_EXTERNAL_LBK,
111 CGX_CMD_HIGIG,
112 CGX_CMD_LINK_STAT_CHANGE,
113 CGX_CMD_MODE_CHANGE, /* hot plug support */
114 CGX_CMD_INTF_SHUTDOWN,
115 CGX_CMD_GET_MKEX_PRFL_SIZE,
116 CGX_CMD_GET_MKEX_PRFL_ADDR,
117 CGX_CMD_GET_FWD_BASE, /* get base address of shared FW data */
118 CGX_CMD_GET_LINK_MODES, /* Supported Link Modes */
119 CGX_CMD_SET_LINK_MODE,
120 CGX_CMD_GET_SUPPORTED_FEC,
121 CGX_CMD_SET_FEC,
122 CGX_CMD_GET_AN,
123 CGX_CMD_SET_AN,
124 CGX_CMD_GET_ADV_LINK_MODES,
125 CGX_CMD_GET_ADV_FEC,
126 CGX_CMD_GET_PHY_MOD_TYPE, /* line-side modulation type: NRZ or PAM4 */
127 CGX_CMD_SET_PHY_MOD_TYPE,
128 CGX_CMD_PRBS,
129 CGX_CMD_DISPLAY_EYE,
130 CGX_CMD_GET_PHY_FEC_STATS,
131};
132
133/* async event ids */
134enum cgx_evt_id {
135 CGX_EVT_NONE,
136 CGX_EVT_LINK_CHANGE,
137};
138
139/* event types - cause of interrupt */
140enum cgx_evt_type {
141 CGX_EVT_ASYNC,
142 CGX_EVT_CMD_RESP
143};
144
145enum cgx_stat {
146 CGX_STAT_SUCCESS,
147 CGX_STAT_FAIL
148};
149
150enum cgx_cmd_own {
151 CGX_CMD_OWN_NS,
152 CGX_CMD_OWN_FIRMWARE,
153};
154
155/* m - bit mask
156 * y - value to be written in the bitrange
157 * x - input value whose bitrange to be modified
158 */
159#define FIELD_SET(m, y, x) \
160 (((x) & ~(m)) | \
161 FIELD_PREP((m), (y)))
162
163/* scratchx(0) CSR used for ATF->non-secure SW communication.
164 * This acts as the status register
165 * Provides details on command ack/status, command response, error details
166 */
167#define EVTREG_ACK BIT_ULL(0)
168#define EVTREG_EVT_TYPE BIT_ULL(1)
169#define EVTREG_STAT BIT_ULL(2)
170#define EVTREG_ID GENMASK_ULL(8, 3)
171
172/* Response to command IDs with command status as CGX_STAT_FAIL
173 *
174 * Not applicable for commands :
175 * CGX_CMD_LINK_BRING_UP/DOWN/CGX_EVT_LINK_CHANGE
176 */
177#define EVTREG_ERRTYPE GENMASK_ULL(18, 9)
178
179/* Response to cmd ID as CGX_CMD_GET_FW_VER with cmd status as
180 * CGX_STAT_SUCCESS
181 */
182#define RESP_MAJOR_VER GENMASK_ULL(12, 9)
183#define RESP_MINOR_VER GENMASK_ULL(16, 13)
184
185/* Response to cmd ID as CGX_CMD_GET_MAC_ADDR with cmd status as
186 * CGX_STAT_SUCCESS
187 */
188#define RESP_MAC_ADDR GENMASK_ULL(56, 9)
189
190/* Response to cmd ID as CGX_CMD_GET_MKEX_PRFL_SIZE with cmd status as
191 * CGX_STAT_SUCCESS
192 */
193#define RESP_MKEX_PRFL_SIZE GENMASK_ULL(63, 9)
194
195/* Response to cmd ID as CGX_CMD_GET_MKEX_PRFL_ADDR with cmd status as
196 * CGX_STAT_SUCCESS
197 */
198#define RESP_MKEX_PRFL_ADDR GENMASK_ULL(63, 9)
199
200/* Response to cmd ID as CGX_CMD_GET_FWD_BASE with cmd status as
201 * CGX_STAT_SUCCESS
202 */
203#define RESP_FWD_BASE GENMASK_ULL(56, 9)
204#define RESP_LINKSTAT_LMAC_TYPE GENMASK_ULL(35, 28)
205
206/* Response to cmd ID - CGX_CMD_LINK_BRING_UP/DOWN, event ID CGX_EVT_LINK_CHANGE
207 * status can be either CGX_STAT_FAIL or CGX_STAT_SUCCESS
208 *
209 * In case of CGX_STAT_FAIL, it indicates CGX configuration failed
210 * when processing link up/down/change command.
211 * Both err_type and current link status will be updated
212 *
213 * In case of CGX_STAT_SUCCESS, err_type will be CGX_ERR_NONE and current
214 * link status will be updated
215 */
216struct cgx_lnk_sts {
217 uint64_t reserved1:9;
218 uint64_t link_up:1;
219 uint64_t full_duplex:1;
220 uint64_t speed:4; /* cgx_link_speed */
221 uint64_t err_type:10;
222 uint64_t an:1; /* AN supported or not */
223 uint64_t fec:2; /* FEC type if enabled, if not 0 */
224 uint64_t port:8;
225 uint64_t reserved2:28;
226};
227
228#define RESP_LINKSTAT_UP GENMASK_ULL(9, 9)
229#define RESP_LINKSTAT_FDUPLEX GENMASK_ULL(10, 10)
230#define RESP_LINKSTAT_SPEED GENMASK_ULL(14, 11)
231#define RESP_LINKSTAT_ERRTYPE GENMASK_ULL(24, 15)
232#define RESP_LINKSTAT_AN GENMASK_ULL(25, 25)
233#define RESP_LINKSTAT_FEC GENMASK_ULL(27, 26)
234#define RESP_LINKSTAT_PORT GENMASK_ULL(35, 28)
235
236/* scratchx(1) CSR used for non-secure SW->ATF communication
237 * This CSR acts as a command register
238 */
239#define CMDREG_OWN BIT_ULL(0)
240#define CMDREG_ID GENMASK_ULL(7, 2)
241
242/* Any command using enable/disable as an argument need
243 * to set this bitfield.
244 * Ex: Loopback, HiGig...
245 */
246#define CMDREG_ENABLE BIT_ULL(8)
247
248/* command argument to be passed for cmd ID - CGX_CMD_SET_MTU */
249#define CMDMTU_SIZE GENMASK_ULL(23, 8)
250
251/* command argument to be passed for cmd ID - CGX_CMD_LINK_CHANGE */
252#define CMDLINKCHANGE_LINKUP BIT_ULL(8)
253#define CMDLINKCHANGE_FULLDPLX BIT_ULL(9)
254#define CMDLINKCHANGE_SPEED GENMASK_ULL(13, 10)
255
256#define CMDSETFEC GENMASK_ULL(9, 8)
257/* command argument to be passed for cmd ID - CGX_CMD_MODE_CHANGE */
258#define CMDMODECHANGE_SPEED GENMASK_ULL(11, 8)
259#define CMDMODECHANGE_DUPLEX GENMASK_ULL(12, 12)
260#define CMDMODECHANGE_AN GENMASK_ULL(13, 13)
261#define CMDMODECHANGE_PORT GENMASK_ULL(21, 14)
262#define CMDMODECHANGE_FLAGS GENMASK_ULL(63, 22)
263
264/* LINK_BRING_UP command timeout */
265#define LINKCFG_TIMEOUT GENMASK_ULL(21, 8)
266#endif /* __CGX_FW_INTF_H__ */
267

source code of linux/drivers/net/ethernet/marvell/octeontx2/af/cgx_fw_if.h