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