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