nfp_nsp.h (7681B)
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 10struct firmware; 11struct nfp_cpp; 12struct nfp_nsp; 13 14struct nfp_nsp *nfp_nsp_open(struct nfp_cpp *cpp); 15void nfp_nsp_close(struct nfp_nsp *state); 16u16 nfp_nsp_get_abi_ver_major(struct nfp_nsp *state); 17u16 nfp_nsp_get_abi_ver_minor(struct nfp_nsp *state); 18int nfp_nsp_wait(struct nfp_nsp *state); 19int nfp_nsp_device_soft_reset(struct nfp_nsp *state); 20int nfp_nsp_load_fw(struct nfp_nsp *state, const struct firmware *fw); 21int nfp_nsp_write_flash(struct nfp_nsp *state, const struct firmware *fw); 22int nfp_nsp_mac_reinit(struct nfp_nsp *state); 23int nfp_nsp_load_stored_fw(struct nfp_nsp *state); 24int nfp_nsp_hwinfo_lookup(struct nfp_nsp *state, void *buf, unsigned int size); 25int nfp_nsp_hwinfo_lookup_optional(struct nfp_nsp *state, void *buf, 26 unsigned int size, const char *default_val); 27int nfp_nsp_hwinfo_set(struct nfp_nsp *state, void *buf, unsigned int size); 28int nfp_nsp_fw_loaded(struct nfp_nsp *state); 29int 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 33static inline bool nfp_nsp_has_mac_reinit(struct nfp_nsp *state) 34{ 35 return nfp_nsp_get_abi_ver_minor(state) > 20; 36} 37 38static 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 43static inline bool nfp_nsp_has_hwinfo_lookup(struct nfp_nsp *state) 44{ 45 return nfp_nsp_get_abi_ver_minor(state) > 24; 46} 47 48static inline bool nfp_nsp_has_hwinfo_set(struct nfp_nsp *state) 49{ 50 return nfp_nsp_get_abi_ver_minor(state) > 25; 51} 52 53static inline bool nfp_nsp_has_fw_loaded(struct nfp_nsp *state) 54{ 55 return nfp_nsp_get_abi_ver_minor(state) > 25; 56} 57 58static inline bool nfp_nsp_has_versions(struct nfp_nsp *state) 59{ 60 return nfp_nsp_get_abi_ver_minor(state) > 27; 61} 62 63static 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 68enum nfp_eth_interface { 69 NFP_INTERFACE_NONE = 0, 70 NFP_INTERFACE_SFP = 1, 71 NFP_INTERFACE_SFPP = 10, 72 NFP_INTERFACE_SFP28 = 28, 73 NFP_INTERFACE_QSFP = 40, 74 NFP_INTERFACE_RJ45 = 45, 75 NFP_INTERFACE_CXP = 100, 76 NFP_INTERFACE_QSFP28 = 112, 77}; 78 79enum nfp_eth_media { 80 NFP_MEDIA_DAC_PASSIVE = 0, 81 NFP_MEDIA_DAC_ACTIVE, 82 NFP_MEDIA_FIBRE, 83}; 84 85enum nfp_eth_aneg { 86 NFP_ANEG_AUTO = 0, 87 NFP_ANEG_SEARCH, 88 NFP_ANEG_25G_CONSORTIUM, 89 NFP_ANEG_25G_IEEE, 90 NFP_ANEG_DISABLED, 91}; 92 93enum nfp_eth_fec { 94 NFP_FEC_AUTO_BIT = 0, 95 NFP_FEC_BASER_BIT, 96 NFP_FEC_REED_SOLOMON_BIT, 97 NFP_FEC_DISABLED_BIT, 98}; 99 100#define NFP_FEC_AUTO BIT(NFP_FEC_AUTO_BIT) 101#define NFP_FEC_BASER BIT(NFP_FEC_BASER_BIT) 102#define NFP_FEC_REED_SOLOMON BIT(NFP_FEC_REED_SOLOMON_BIT) 103#define NFP_FEC_DISABLED BIT(NFP_FEC_DISABLED_BIT) 104 105/* Defines the valid values of the 'abi_drv_reset' hwinfo key */ 106#define NFP_NSP_DRV_RESET_DISK 0 107#define NFP_NSP_DRV_RESET_ALWAYS 1 108#define NFP_NSP_DRV_RESET_NEVER 2 109#define NFP_NSP_DRV_RESET_DEFAULT "0" 110 111/* Defines the valid values of the 'app_fw_from_flash' hwinfo key */ 112#define NFP_NSP_APP_FW_LOAD_DISK 0 113#define NFP_NSP_APP_FW_LOAD_FLASH 1 114#define NFP_NSP_APP_FW_LOAD_PREF 2 115#define NFP_NSP_APP_FW_LOAD_DEFAULT "2" 116 117/* Define the default value for the 'abi_drv_load_ifc' key */ 118#define NFP_NSP_DRV_LOAD_IFC_DEFAULT "0x10ff" 119 120/** 121 * struct nfp_eth_table - ETH table information 122 * @count: number of table entries 123 * @max_index: max of @index fields of all @ports 124 * @ports: table of ports 125 * 126 * @ports.eth_index: port index according to legacy ethX numbering 127 * @ports.index: chip-wide first channel index 128 * @ports.nbi: NBI index 129 * @ports.base: first channel index (within NBI) 130 * @ports.lanes: number of channels 131 * @ports.speed: interface speed (in Mbps) 132 * @ports.interface: interface (module) plugged in 133 * @ports.media: media type of the @interface 134 * @ports.fec: forward error correction mode 135 * @ports.aneg: auto negotiation mode 136 * @ports.mac_addr: interface MAC address 137 * @ports.label_port: port id 138 * @ports.label_subport: id of interface within port (for split ports) 139 * @ports.enabled: is enabled? 140 * @ports.tx_enabled: is TX enabled? 141 * @ports.rx_enabled: is RX enabled? 142 * @ports.override_changed: is media reconfig pending? 143 * 144 * @ports.port_type: one of %PORT_* defines for ethtool 145 * @ports.port_lanes: total number of lanes on the port (sum of lanes of all 146 * subports) 147 * @ports.is_split: is interface part of a split port 148 * @ports.fec_modes_supported: bitmap of FEC modes supported 149 */ 150struct nfp_eth_table { 151 unsigned int count; 152 unsigned int max_index; 153 struct nfp_eth_table_port { 154 unsigned int eth_index; 155 unsigned int index; 156 unsigned int nbi; 157 unsigned int base; 158 unsigned int lanes; 159 unsigned int speed; 160 161 unsigned int interface; 162 enum nfp_eth_media media; 163 164 enum nfp_eth_fec fec; 165 enum nfp_eth_aneg aneg; 166 167 u8 mac_addr[ETH_ALEN]; 168 169 u8 label_port; 170 u8 label_subport; 171 172 bool enabled; 173 bool tx_enabled; 174 bool rx_enabled; 175 176 bool override_changed; 177 178 /* Computed fields */ 179 u8 port_type; 180 181 unsigned int port_lanes; 182 183 bool is_split; 184 185 unsigned int fec_modes_supported; 186 } ports[]; 187}; 188 189struct nfp_eth_table *nfp_eth_read_ports(struct nfp_cpp *cpp); 190struct nfp_eth_table * 191__nfp_eth_read_ports(struct nfp_cpp *cpp, struct nfp_nsp *nsp); 192 193int nfp_eth_set_mod_enable(struct nfp_cpp *cpp, unsigned int idx, bool enable); 194int nfp_eth_set_configured(struct nfp_cpp *cpp, unsigned int idx, 195 bool configed); 196int 197nfp_eth_set_fec(struct nfp_cpp *cpp, unsigned int idx, enum nfp_eth_fec mode); 198 199static inline bool nfp_eth_can_support_fec(struct nfp_eth_table_port *eth_port) 200{ 201 return !!eth_port->fec_modes_supported; 202} 203 204static inline unsigned int 205nfp_eth_supported_fec_modes(struct nfp_eth_table_port *eth_port) 206{ 207 return eth_port->fec_modes_supported; 208} 209 210struct nfp_nsp *nfp_eth_config_start(struct nfp_cpp *cpp, unsigned int idx); 211int nfp_eth_config_commit_end(struct nfp_nsp *nsp); 212void nfp_eth_config_cleanup_end(struct nfp_nsp *nsp); 213 214int __nfp_eth_set_aneg(struct nfp_nsp *nsp, enum nfp_eth_aneg mode); 215int __nfp_eth_set_speed(struct nfp_nsp *nsp, unsigned int speed); 216int __nfp_eth_set_split(struct nfp_nsp *nsp, unsigned int lanes); 217 218/** 219 * struct nfp_nsp_identify - NSP static information 220 * @version: opaque version string 221 * @flags: version flags 222 * @br_primary: branch id of primary bootloader 223 * @br_secondary: branch id of secondary bootloader 224 * @br_nsp: branch id of NSP 225 * @primary: version of primarary bootloader 226 * @secondary: version id of secondary bootloader 227 * @nsp: version id of NSP 228 * @sensor_mask: mask of present sensors available on NIC 229 */ 230struct nfp_nsp_identify { 231 char version[40]; 232 u8 flags; 233 u8 br_primary; 234 u8 br_secondary; 235 u8 br_nsp; 236 u16 primary; 237 u16 secondary; 238 u16 nsp; 239 u64 sensor_mask; 240}; 241 242struct nfp_nsp_identify *__nfp_nsp_identify(struct nfp_nsp *nsp); 243 244enum nfp_nsp_sensor_id { 245 NFP_SENSOR_CHIP_TEMPERATURE, 246 NFP_SENSOR_ASSEMBLY_POWER, 247 NFP_SENSOR_ASSEMBLY_12V_POWER, 248 NFP_SENSOR_ASSEMBLY_3V3_POWER, 249}; 250 251int nfp_hwmon_read_sensor(struct nfp_cpp *cpp, enum nfp_nsp_sensor_id id, 252 long *val); 253 254#define NFP_NSP_VERSION_BUFSZ 1024 /* reasonable size, not in the ABI */ 255 256enum nfp_nsp_versions { 257 NFP_VERSIONS_BSP, 258 NFP_VERSIONS_CPLD, 259 NFP_VERSIONS_APP, 260 NFP_VERSIONS_BUNDLE, 261 NFP_VERSIONS_UNDI, 262 NFP_VERSIONS_NCSI, 263 NFP_VERSIONS_CFGR, 264}; 265 266int nfp_nsp_versions(struct nfp_nsp *state, void *buf, unsigned int size); 267const char *nfp_nsp_versions_get(enum nfp_nsp_versions id, bool flash, 268 const u8 *buf, unsigned int size); 269#endif