1 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ 2 /* Copyright (C) 2015-2018 Netronome Systems, Inc. */ 3 4 #ifndef NSP_NSP_H 5 #define NSP_NSP_H 1 6 7 #include <linux/types.h> 8 #include <linux/if_ether.h> 9 10 struct firmware; 11 struct nfp_cpp; 12 struct nfp_nsp; 13 14 struct nfp_nsp *nfp_nsp_open(struct nfp_cpp *cpp); 15 void nfp_nsp_close(struct nfp_nsp *state); 16 u16 nfp_nsp_get_abi_ver_major(struct nfp_nsp *state); 17 u16 nfp_nsp_get_abi_ver_minor(struct nfp_nsp *state); 18 int nfp_nsp_wait(struct nfp_nsp *state); 19 int nfp_nsp_device_soft_reset(struct nfp_nsp *state); 20 int nfp_nsp_load_fw(struct nfp_nsp *state, const struct firmware *fw); 21 int nfp_nsp_write_flash(struct nfp_nsp *state, const struct firmware *fw); 22 int nfp_nsp_mac_reinit(struct nfp_nsp *state); 23 int nfp_nsp_load_stored_fw(struct nfp_nsp *state); 24 int nfp_nsp_hwinfo_lookup(struct nfp_nsp *state, void *buf, unsigned int size); 25 int nfp_nsp_hwinfo_lookup_optional(struct nfp_nsp *state, void *buf, 26 unsigned int size, const char *default_val); 27 int nfp_nsp_hwinfo_set(struct nfp_nsp *state, void *buf, unsigned int size); 28 int nfp_nsp_fw_loaded(struct nfp_nsp *state); 29 int nfp_nsp_read_module_eeprom(struct nfp_nsp *state, int eth_index, 30 unsigned int offset, void *data, 31 unsigned int len, unsigned int *read_len); 32 nfp_nsp_has_mac_reinit(struct nfp_nsp * state)33 static inline bool nfp_nsp_has_mac_reinit(struct nfp_nsp *state) 34 { 35 return nfp_nsp_get_abi_ver_minor(state) > 20; 36 } 37 nfp_nsp_has_stored_fw_load(struct nfp_nsp * state)38 static inline bool nfp_nsp_has_stored_fw_load(struct nfp_nsp *state) 39 { 40 return nfp_nsp_get_abi_ver_minor(state) > 23; 41 } 42 nfp_nsp_has_hwinfo_lookup(struct nfp_nsp * state)43 static inline bool nfp_nsp_has_hwinfo_lookup(struct nfp_nsp *state) 44 { 45 return nfp_nsp_get_abi_ver_minor(state) > 24; 46 } 47 nfp_nsp_has_hwinfo_set(struct nfp_nsp * state)48 static inline bool nfp_nsp_has_hwinfo_set(struct nfp_nsp *state) 49 { 50 return nfp_nsp_get_abi_ver_minor(state) > 25; 51 } 52 nfp_nsp_has_fw_loaded(struct nfp_nsp * state)53 static inline bool nfp_nsp_has_fw_loaded(struct nfp_nsp *state) 54 { 55 return nfp_nsp_get_abi_ver_minor(state) > 25; 56 } 57 nfp_nsp_has_versions(struct nfp_nsp * state)58 static inline bool nfp_nsp_has_versions(struct nfp_nsp *state) 59 { 60 return nfp_nsp_get_abi_ver_minor(state) > 27; 61 } 62 nfp_nsp_has_read_module_eeprom(struct nfp_nsp * state)63 static inline bool nfp_nsp_has_read_module_eeprom(struct nfp_nsp *state) 64 { 65 return nfp_nsp_get_abi_ver_minor(state) > 28; 66 } 67 nfp_nsp_has_read_media(struct nfp_nsp * state)68 static inline bool nfp_nsp_has_read_media(struct nfp_nsp *state) 69 { 70 return nfp_nsp_get_abi_ver_minor(state) > 33; 71 } 72 73 enum nfp_eth_interface { 74 NFP_INTERFACE_NONE = 0, 75 NFP_INTERFACE_SFP = 1, 76 NFP_INTERFACE_SFPP = 10, 77 NFP_INTERFACE_SFP28 = 28, 78 NFP_INTERFACE_QSFP = 40, 79 NFP_INTERFACE_RJ45 = 45, 80 NFP_INTERFACE_CXP = 100, 81 NFP_INTERFACE_QSFP28 = 112, 82 }; 83 84 enum nfp_eth_media { 85 NFP_MEDIA_DAC_PASSIVE = 0, 86 NFP_MEDIA_DAC_ACTIVE, 87 NFP_MEDIA_FIBRE, 88 }; 89 90 enum nfp_eth_aneg { 91 NFP_ANEG_AUTO = 0, 92 NFP_ANEG_SEARCH, 93 NFP_ANEG_25G_CONSORTIUM, 94 NFP_ANEG_25G_IEEE, 95 NFP_ANEG_DISABLED, 96 }; 97 98 enum nfp_eth_fec { 99 NFP_FEC_AUTO_BIT = 0, 100 NFP_FEC_BASER_BIT, 101 NFP_FEC_REED_SOLOMON_BIT, 102 NFP_FEC_DISABLED_BIT, 103 }; 104 105 /* link modes about RJ45 haven't been used, so there's no mapping to them */ 106 enum nfp_ethtool_link_mode_list { 107 NFP_MEDIA_W0_RJ45_10M, 108 NFP_MEDIA_W0_RJ45_10M_HD, 109 NFP_MEDIA_W0_RJ45_100M, 110 NFP_MEDIA_W0_RJ45_100M_HD, 111 NFP_MEDIA_W0_RJ45_1G, 112 NFP_MEDIA_W0_RJ45_2P5G, 113 NFP_MEDIA_W0_RJ45_5G, 114 NFP_MEDIA_W0_RJ45_10G, 115 NFP_MEDIA_1000BASE_CX, 116 NFP_MEDIA_1000BASE_KX, 117 NFP_MEDIA_10GBASE_KX4, 118 NFP_MEDIA_10GBASE_KR, 119 NFP_MEDIA_10GBASE_CX4, 120 NFP_MEDIA_10GBASE_CR, 121 NFP_MEDIA_10GBASE_SR, 122 NFP_MEDIA_10GBASE_ER, 123 NFP_MEDIA_25GBASE_KR, 124 NFP_MEDIA_25GBASE_KR_S, 125 NFP_MEDIA_25GBASE_CR, 126 NFP_MEDIA_25GBASE_CR_S, 127 NFP_MEDIA_25GBASE_SR, 128 NFP_MEDIA_40GBASE_CR4, 129 NFP_MEDIA_40GBASE_KR4, 130 NFP_MEDIA_40GBASE_SR4, 131 NFP_MEDIA_40GBASE_LR4, 132 NFP_MEDIA_50GBASE_KR, 133 NFP_MEDIA_50GBASE_SR, 134 NFP_MEDIA_50GBASE_CR, 135 NFP_MEDIA_50GBASE_LR, 136 NFP_MEDIA_50GBASE_ER, 137 NFP_MEDIA_50GBASE_FR, 138 NFP_MEDIA_100GBASE_KR4, 139 NFP_MEDIA_100GBASE_SR4, 140 NFP_MEDIA_100GBASE_CR4, 141 NFP_MEDIA_100GBASE_KP4, 142 NFP_MEDIA_100GBASE_CR10, 143 NFP_MEDIA_10GBASE_LR, 144 NFP_MEDIA_25GBASE_LR, 145 NFP_MEDIA_25GBASE_ER, 146 NFP_MEDIA_LINK_MODES_NUMBER 147 }; 148 149 #define NFP_FEC_AUTO BIT(NFP_FEC_AUTO_BIT) 150 #define NFP_FEC_BASER BIT(NFP_FEC_BASER_BIT) 151 #define NFP_FEC_REED_SOLOMON BIT(NFP_FEC_REED_SOLOMON_BIT) 152 #define NFP_FEC_DISABLED BIT(NFP_FEC_DISABLED_BIT) 153 154 /* Defines the valid values of the 'abi_drv_reset' hwinfo key */ 155 #define NFP_NSP_DRV_RESET_DISK 0 156 #define NFP_NSP_DRV_RESET_ALWAYS 1 157 #define NFP_NSP_DRV_RESET_NEVER 2 158 #define NFP_NSP_DRV_RESET_DEFAULT "0" 159 160 /* Defines the valid values of the 'app_fw_from_flash' hwinfo key */ 161 #define NFP_NSP_APP_FW_LOAD_DISK 0 162 #define NFP_NSP_APP_FW_LOAD_FLASH 1 163 #define NFP_NSP_APP_FW_LOAD_PREF 2 164 #define NFP_NSP_APP_FW_LOAD_DEFAULT "2" 165 166 /* Define the default value for the 'abi_drv_load_ifc' key */ 167 #define NFP_NSP_DRV_LOAD_IFC_DEFAULT "0x10ff" 168 169 /** 170 * struct nfp_eth_table - ETH table information 171 * @count: number of table entries 172 * @max_index: max of @index fields of all @ports 173 * @ports: table of ports 174 * 175 * @ports.eth_index: port index according to legacy ethX numbering 176 * @ports.index: chip-wide first channel index 177 * @ports.nbi: NBI index 178 * @ports.base: first channel index (within NBI) 179 * @ports.lanes: number of channels 180 * @ports.speed: interface speed (in Mbps) 181 * @ports.interface: interface (module) plugged in 182 * @ports.media: media type of the @interface 183 * @ports.fec: forward error correction mode 184 * @ports.act_fec: active forward error correction mode 185 * @ports.aneg: auto negotiation mode 186 * @ports.mac_addr: interface MAC address 187 * @ports.label_port: port id 188 * @ports.label_subport: id of interface within port (for split ports) 189 * @ports.enabled: is enabled? 190 * @ports.tx_enabled: is TX enabled? 191 * @ports.rx_enabled: is RX enabled? 192 * @ports.rx_pause: Switch of RX pause frame 193 * @ports.tx_pause: Switch of Tx pause frame 194 * @ports.override_changed: is media reconfig pending? 195 * 196 * @ports.port_type: one of %PORT_* defines for ethtool 197 * @ports.port_lanes: total number of lanes on the port (sum of lanes of all 198 * subports) 199 * @ports.is_split: is interface part of a split port 200 * @ports.fec_modes_supported: bitmap of FEC modes supported 201 * 202 * @ports.link_modes_supp: bitmap of link modes supported 203 * @ports.link_modes_ad: bitmap of link modes advertised 204 */ 205 struct nfp_eth_table { 206 unsigned int count; 207 unsigned int max_index; 208 struct nfp_eth_table_port { 209 unsigned int eth_index; 210 unsigned int index; 211 unsigned int nbi; 212 unsigned int base; 213 unsigned int lanes; 214 unsigned int speed; 215 216 unsigned int interface; 217 enum nfp_eth_media media; 218 219 enum nfp_eth_fec fec; 220 enum nfp_eth_fec act_fec; 221 enum nfp_eth_aneg aneg; 222 223 u8 mac_addr[ETH_ALEN]; 224 225 u8 label_port; 226 u8 label_subport; 227 228 bool enabled; 229 bool tx_enabled; 230 bool rx_enabled; 231 bool supp_aneg; 232 bool rx_pause; 233 bool tx_pause; 234 235 bool override_changed; 236 237 /* Computed fields */ 238 u8 port_type; 239 240 unsigned int port_lanes; 241 242 bool is_split; 243 244 unsigned int fec_modes_supported; 245 246 u64 link_modes_supp[2]; 247 u64 link_modes_ad[2]; 248 } ports[] __counted_by(count); 249 }; 250 251 struct nfp_eth_table *nfp_eth_read_ports(struct nfp_cpp *cpp); 252 struct nfp_eth_table * 253 __nfp_eth_read_ports(struct nfp_cpp *cpp, struct nfp_nsp *nsp); 254 255 int nfp_eth_set_mod_enable(struct nfp_cpp *cpp, unsigned int idx, bool enable); 256 int nfp_eth_set_configured(struct nfp_cpp *cpp, unsigned int idx, 257 bool configed); 258 int 259 nfp_eth_set_fec(struct nfp_cpp *cpp, unsigned int idx, enum nfp_eth_fec mode); 260 261 int nfp_eth_set_idmode(struct nfp_cpp *cpp, unsigned int idx, bool state); 262 int nfp_eth_set_pauseparam(struct nfp_cpp *cpp, unsigned int idx, 263 unsigned int tx_pause, unsigned int rx_pause); 264 nfp_eth_can_support_fec(struct nfp_eth_table_port * eth_port)265 static inline bool nfp_eth_can_support_fec(struct nfp_eth_table_port *eth_port) 266 { 267 return !!eth_port->fec_modes_supported; 268 } 269 270 static inline unsigned int nfp_eth_supported_fec_modes(struct nfp_eth_table_port * eth_port)271 nfp_eth_supported_fec_modes(struct nfp_eth_table_port *eth_port) 272 { 273 return eth_port->fec_modes_supported; 274 } 275 276 struct nfp_nsp *nfp_eth_config_start(struct nfp_cpp *cpp, unsigned int idx); 277 int nfp_eth_config_commit_end(struct nfp_nsp *nsp); 278 void nfp_eth_config_cleanup_end(struct nfp_nsp *nsp); 279 280 int __nfp_eth_set_aneg(struct nfp_nsp *nsp, enum nfp_eth_aneg mode); 281 int __nfp_eth_set_speed(struct nfp_nsp *nsp, unsigned int speed); 282 int __nfp_eth_set_split(struct nfp_nsp *nsp, unsigned int lanes); 283 284 /** 285 * struct nfp_nsp_identify - NSP static information 286 * @version: opaque version string 287 * @flags: version flags 288 * @br_primary: branch id of primary bootloader 289 * @br_secondary: branch id of secondary bootloader 290 * @br_nsp: branch id of NSP 291 * @primary: version of primarary bootloader 292 * @secondary: version id of secondary bootloader 293 * @nsp: version id of NSP 294 * @sensor_mask: mask of present sensors available on NIC 295 */ 296 struct nfp_nsp_identify { 297 char version[40]; 298 u8 flags; 299 u8 br_primary; 300 u8 br_secondary; 301 u8 br_nsp; 302 u16 primary; 303 u16 secondary; 304 u16 nsp; 305 u64 sensor_mask; 306 }; 307 308 struct nfp_nsp_identify *__nfp_nsp_identify(struct nfp_nsp *nsp); 309 310 enum nfp_nsp_sensor_id { 311 NFP_SENSOR_CHIP_TEMPERATURE, 312 NFP_SENSOR_ASSEMBLY_POWER, 313 NFP_SENSOR_ASSEMBLY_12V_POWER, 314 NFP_SENSOR_ASSEMBLY_3V3_POWER, 315 }; 316 317 int nfp_hwmon_read_sensor(struct nfp_cpp *cpp, enum nfp_nsp_sensor_id id, 318 long *val); 319 320 struct nfp_eth_media_buf { 321 u8 eth_index; 322 u8 reserved[7]; 323 __le64 supported_modes[2]; 324 __le64 advertised_modes[2]; 325 }; 326 327 int nfp_nsp_read_media(struct nfp_nsp *state, void *buf, unsigned int size); 328 329 #define NFP_NSP_VERSION_BUFSZ 1024 /* reasonable size, not in the ABI */ 330 331 enum nfp_nsp_versions { 332 NFP_VERSIONS_BSP, 333 NFP_VERSIONS_CPLD, 334 NFP_VERSIONS_APP, 335 NFP_VERSIONS_BUNDLE, 336 NFP_VERSIONS_UNDI, 337 NFP_VERSIONS_NCSI, 338 NFP_VERSIONS_CFGR, 339 }; 340 341 int nfp_nsp_versions(struct nfp_nsp *state, void *buf, unsigned int size); 342 const char *nfp_nsp_versions_get(enum nfp_nsp_versions id, bool flash, 343 const u8 *buf, unsigned int size); 344 #endif 345