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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 | |
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 |
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 | |