New upstream version 18.02
[deb_dpdk.git] / drivers / net / sfc / base / efx_mcdi.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  * Copyright (c) 2009-2018 Solarflare Communications Inc.
4  * All rights reserved.
5  */
6
7 #ifndef _SYS_EFX_MCDI_H
8 #define _SYS_EFX_MCDI_H
9
10 #include "efx.h"
11 #include "efx_regs_mcdi.h"
12
13 #ifdef  __cplusplus
14 extern "C" {
15 #endif
16
17 /*
18  * A reboot/assertion causes the MCDI status word to be set after the
19  * command word is set or a REBOOT event is sent. If we notice a reboot
20  * via these mechanisms then wait 10ms for the status word to be set.
21  */
22 #define EFX_MCDI_STATUS_SLEEP_US        10000
23
24 struct efx_mcdi_req_s {
25         boolean_t       emr_quiet;
26         /* Inputs: Command #, input buffer and length */
27         unsigned int    emr_cmd;
28         uint8_t         *emr_in_buf;
29         size_t          emr_in_length;
30         /* Outputs: retcode, buffer, length, and length used */
31         efx_rc_t        emr_rc;
32         uint8_t         *emr_out_buf;
33         size_t          emr_out_length;
34         size_t          emr_out_length_used;
35         /* Internals: low level transport details */
36         unsigned int    emr_err_code;
37         unsigned int    emr_err_arg;
38 #if EFSYS_OPT_MCDI_PROXY_AUTH
39         uint32_t        emr_proxy_handle;
40 #endif
41 };
42
43 typedef struct efx_mcdi_iface_s {
44         unsigned int            emi_port;
45         unsigned int            emi_max_version;
46         unsigned int            emi_seq;
47         efx_mcdi_req_t          *emi_pending_req;
48         boolean_t               emi_ev_cpl;
49         boolean_t               emi_new_epoch;
50         int                     emi_aborted;
51         uint32_t                emi_poll_cnt;
52         uint32_t                emi_mc_reboot_status;
53 } efx_mcdi_iface_t;
54
55 extern                  void
56 efx_mcdi_execute(
57         __in            efx_nic_t *enp,
58         __inout         efx_mcdi_req_t *emrp);
59
60 extern                  void
61 efx_mcdi_execute_quiet(
62         __in            efx_nic_t *enp,
63         __inout         efx_mcdi_req_t *emrp);
64
65 extern                  void
66 efx_mcdi_ev_cpl(
67         __in            efx_nic_t *enp,
68         __in            unsigned int seq,
69         __in            unsigned int outlen,
70         __in            int errcode);
71
72 #if EFSYS_OPT_MCDI_PROXY_AUTH
73 extern  __checkReturn   efx_rc_t
74 efx_mcdi_get_proxy_handle(
75         __in            efx_nic_t *enp,
76         __in            efx_mcdi_req_t *emrp,
77         __out           uint32_t *handlep);
78
79 extern                  void
80 efx_mcdi_ev_proxy_response(
81         __in            efx_nic_t *enp,
82         __in            unsigned int handle,
83         __in            unsigned int status);
84 #endif
85
86 extern                  void
87 efx_mcdi_ev_death(
88         __in            efx_nic_t *enp,
89         __in            int rc);
90
91 extern  __checkReturn   efx_rc_t
92 efx_mcdi_request_errcode(
93         __in            unsigned int err);
94
95 extern                  void
96 efx_mcdi_raise_exception(
97         __in            efx_nic_t *enp,
98         __in_opt        efx_mcdi_req_t *emrp,
99         __in            int rc);
100
101 typedef enum efx_mcdi_boot_e {
102         EFX_MCDI_BOOT_PRIMARY,
103         EFX_MCDI_BOOT_SECONDARY,
104         EFX_MCDI_BOOT_ROM,
105 } efx_mcdi_boot_t;
106
107 extern  __checkReturn           efx_rc_t
108 efx_mcdi_version(
109         __in                    efx_nic_t *enp,
110         __out_ecount_opt(4)     uint16_t versionp[4],
111         __out_opt               uint32_t *buildp,
112         __out_opt               efx_mcdi_boot_t *statusp);
113
114 extern  __checkReturn   efx_rc_t
115 efx_mcdi_get_capabilities(
116         __in            efx_nic_t *enp,
117         __out_opt       uint32_t *flagsp,
118         __out_opt       uint16_t *rx_dpcpu_fw_idp,
119         __out_opt       uint16_t *tx_dpcpu_fw_idp,
120         __out_opt       uint32_t *flags2p,
121         __out_opt       uint32_t *tso2ncp);
122
123 extern  __checkReturn           efx_rc_t
124 efx_mcdi_read_assertion(
125         __in                    efx_nic_t *enp);
126
127 extern  __checkReturn           efx_rc_t
128 efx_mcdi_exit_assertion_handler(
129         __in                    efx_nic_t *enp);
130
131 extern  __checkReturn           efx_rc_t
132 efx_mcdi_drv_attach(
133         __in                    efx_nic_t *enp,
134         __in                    boolean_t attach);
135
136 extern  __checkReturn           efx_rc_t
137 efx_mcdi_get_board_cfg(
138         __in                    efx_nic_t *enp,
139         __out_opt               uint32_t *board_typep,
140         __out_opt               efx_dword_t *capabilitiesp,
141         __out_ecount_opt(6)     uint8_t mac_addrp[6]);
142
143 extern  __checkReturn           efx_rc_t
144 efx_mcdi_get_phy_cfg(
145         __in                    efx_nic_t *enp);
146
147 extern  __checkReturn           efx_rc_t
148 efx_mcdi_firmware_update_supported(
149         __in                    efx_nic_t *enp,
150         __out                   boolean_t *supportedp);
151
152 extern  __checkReturn           efx_rc_t
153 efx_mcdi_macaddr_change_supported(
154         __in                    efx_nic_t *enp,
155         __out                   boolean_t *supportedp);
156
157 extern  __checkReturn           efx_rc_t
158 efx_mcdi_link_control_supported(
159         __in                    efx_nic_t *enp,
160         __out                   boolean_t *supportedp);
161
162 extern  __checkReturn           efx_rc_t
163 efx_mcdi_mac_spoofing_supported(
164         __in                    efx_nic_t *enp,
165         __out                   boolean_t *supportedp);
166
167
168 #if EFSYS_OPT_BIST
169 #if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD
170 extern  __checkReturn           efx_rc_t
171 efx_mcdi_bist_enable_offline(
172         __in                    efx_nic_t *enp);
173 #endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD */
174 extern  __checkReturn           efx_rc_t
175 efx_mcdi_bist_start(
176         __in                    efx_nic_t *enp,
177         __in                    efx_bist_type_t type);
178 #endif /* EFSYS_OPT_BIST */
179
180 extern  __checkReturn           efx_rc_t
181 efx_mcdi_get_resource_limits(
182         __in                    efx_nic_t *enp,
183         __out_opt               uint32_t *nevqp,
184         __out_opt               uint32_t *nrxqp,
185         __out_opt               uint32_t *ntxqp);
186
187 extern  __checkReturn   efx_rc_t
188 efx_mcdi_log_ctrl(
189         __in            efx_nic_t *enp);
190
191 extern  __checkReturn   efx_rc_t
192 efx_mcdi_mac_stats_clear(
193         __in            efx_nic_t *enp);
194
195 extern  __checkReturn   efx_rc_t
196 efx_mcdi_mac_stats_upload(
197         __in            efx_nic_t *enp,
198         __in            efsys_mem_t *esmp);
199
200 extern  __checkReturn   efx_rc_t
201 efx_mcdi_mac_stats_periodic(
202         __in            efx_nic_t *enp,
203         __in            efsys_mem_t *esmp,
204         __in            uint16_t period_ms,
205         __in            boolean_t events);
206
207
208 #if EFSYS_OPT_LOOPBACK
209 extern  __checkReturn   efx_rc_t
210 efx_mcdi_get_loopback_modes(
211         __in            efx_nic_t *enp);
212 #endif /* EFSYS_OPT_LOOPBACK */
213
214 extern  __checkReturn   efx_rc_t
215 efx_mcdi_phy_module_get_info(
216         __in                    efx_nic_t *enp,
217         __in                    uint8_t dev_addr,
218         __in                    uint8_t offset,
219         __in                    uint8_t len,
220         __out_bcount(len)       uint8_t *data);
221
222 #define MCDI_IN(_emr, _type, _ofst)                                     \
223         ((_type *)((_emr).emr_in_buf + (_ofst)))
224
225 #define MCDI_IN2(_emr, _type, _ofst)                                    \
226         MCDI_IN(_emr, _type, MC_CMD_ ## _ofst ## _OFST)
227
228 #define MCDI_IN_SET_BYTE(_emr, _ofst, _value)                           \
229         EFX_POPULATE_BYTE_1(*MCDI_IN2(_emr, efx_byte_t, _ofst),         \
230                 EFX_BYTE_0, _value)
231
232 #define MCDI_IN_SET_WORD(_emr, _ofst, _value)                           \
233         EFX_POPULATE_WORD_1(*MCDI_IN2(_emr, efx_word_t, _ofst),         \
234                 EFX_WORD_0, _value)
235
236 #define MCDI_IN_SET_DWORD(_emr, _ofst, _value)                          \
237         EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst),       \
238                 EFX_DWORD_0, _value)
239
240 #define MCDI_IN_SET_DWORD_FIELD(_emr, _ofst, _field, _value)            \
241         EFX_SET_DWORD_FIELD(*MCDI_IN2(_emr, efx_dword_t, _ofst),        \
242                 MC_CMD_ ## _field, _value)
243
244 #define MCDI_IN_POPULATE_DWORD_1(_emr, _ofst, _field1, _value1)         \
245         EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst),       \
246                 MC_CMD_ ## _field1, _value1)
247
248 #define MCDI_IN_POPULATE_DWORD_2(_emr, _ofst, _field1, _value1,         \
249                 _field2, _value2)                                       \
250         EFX_POPULATE_DWORD_2(*MCDI_IN2(_emr, efx_dword_t, _ofst),       \
251                 MC_CMD_ ## _field1, _value1,                            \
252                 MC_CMD_ ## _field2, _value2)
253
254 #define MCDI_IN_POPULATE_DWORD_3(_emr, _ofst, _field1, _value1,         \
255                 _field2, _value2, _field3, _value3)                     \
256         EFX_POPULATE_DWORD_3(*MCDI_IN2(_emr, efx_dword_t, _ofst),       \
257                 MC_CMD_ ## _field1, _value1,                            \
258                 MC_CMD_ ## _field2, _value2,                            \
259                 MC_CMD_ ## _field3, _value3)
260
261 #define MCDI_IN_POPULATE_DWORD_4(_emr, _ofst, _field1, _value1,         \
262                 _field2, _value2, _field3, _value3, _field4, _value4)   \
263         EFX_POPULATE_DWORD_4(*MCDI_IN2(_emr, efx_dword_t, _ofst),       \
264                 MC_CMD_ ## _field1, _value1,                            \
265                 MC_CMD_ ## _field2, _value2,                            \
266                 MC_CMD_ ## _field3, _value3,                            \
267                 MC_CMD_ ## _field4, _value4)
268
269 #define MCDI_IN_POPULATE_DWORD_5(_emr, _ofst, _field1, _value1,         \
270                 _field2, _value2, _field3, _value3, _field4, _value4,   \
271                 _field5, _value5)                                       \
272         EFX_POPULATE_DWORD_5(*MCDI_IN2(_emr, efx_dword_t, _ofst),       \
273                 MC_CMD_ ## _field1, _value1,                            \
274                 MC_CMD_ ## _field2, _value2,                            \
275                 MC_CMD_ ## _field3, _value3,                            \
276                 MC_CMD_ ## _field4, _value4,                            \
277                 MC_CMD_ ## _field5, _value5)
278
279 #define MCDI_IN_POPULATE_DWORD_6(_emr, _ofst, _field1, _value1,         \
280                 _field2, _value2, _field3, _value3, _field4, _value4,   \
281                 _field5, _value5, _field6, _value6)                     \
282         EFX_POPULATE_DWORD_6(*MCDI_IN2(_emr, efx_dword_t, _ofst),       \
283                 MC_CMD_ ## _field1, _value1,                            \
284                 MC_CMD_ ## _field2, _value2,                            \
285                 MC_CMD_ ## _field3, _value3,                            \
286                 MC_CMD_ ## _field4, _value4,                            \
287                 MC_CMD_ ## _field5, _value5,                            \
288                 MC_CMD_ ## _field6, _value6)
289
290 #define MCDI_IN_POPULATE_DWORD_7(_emr, _ofst, _field1, _value1,         \
291                 _field2, _value2, _field3, _value3, _field4, _value4,   \
292                 _field5, _value5, _field6, _value6, _field7, _value7)   \
293         EFX_POPULATE_DWORD_7(*MCDI_IN2(_emr, efx_dword_t, _ofst),       \
294                 MC_CMD_ ## _field1, _value1,                            \
295                 MC_CMD_ ## _field2, _value2,                            \
296                 MC_CMD_ ## _field3, _value3,                            \
297                 MC_CMD_ ## _field4, _value4,                            \
298                 MC_CMD_ ## _field5, _value5,                            \
299                 MC_CMD_ ## _field6, _value6,                            \
300                 MC_CMD_ ## _field7, _value7)
301
302 #define MCDI_IN_POPULATE_DWORD_8(_emr, _ofst, _field1, _value1,         \
303                 _field2, _value2, _field3, _value3, _field4, _value4,   \
304                 _field5, _value5, _field6, _value6, _field7, _value7,   \
305                 _field8, _value8)                                       \
306         EFX_POPULATE_DWORD_8(*MCDI_IN2(_emr, efx_dword_t, _ofst),       \
307                 MC_CMD_ ## _field1, _value1,                            \
308                 MC_CMD_ ## _field2, _value2,                            \
309                 MC_CMD_ ## _field3, _value3,                            \
310                 MC_CMD_ ## _field4, _value4,                            \
311                 MC_CMD_ ## _field5, _value5,                            \
312                 MC_CMD_ ## _field6, _value6,                            \
313                 MC_CMD_ ## _field7, _value7,                            \
314                 MC_CMD_ ## _field8, _value8)
315
316 #define MCDI_IN_POPULATE_DWORD_9(_emr, _ofst, _field1, _value1,         \
317                 _field2, _value2, _field3, _value3, _field4, _value4,   \
318                 _field5, _value5, _field6, _value6, _field7, _value7,   \
319                 _field8, _value8, _field9, _value9)                     \
320         EFX_POPULATE_DWORD_9(*MCDI_IN2(_emr, efx_dword_t, _ofst),       \
321                 MC_CMD_ ## _field1, _value1,                            \
322                 MC_CMD_ ## _field2, _value2,                            \
323                 MC_CMD_ ## _field3, _value3,                            \
324                 MC_CMD_ ## _field4, _value4,                            \
325                 MC_CMD_ ## _field5, _value5,                            \
326                 MC_CMD_ ## _field6, _value6,                            \
327                 MC_CMD_ ## _field7, _value7,                            \
328                 MC_CMD_ ## _field8, _value8,                            \
329                 MC_CMD_ ## _field9, _value9)
330
331 #define MCDI_IN_POPULATE_DWORD_10(_emr, _ofst, _field1, _value1,        \
332                 _field2, _value2, _field3, _value3, _field4, _value4,   \
333                 _field5, _value5, _field6, _value6, _field7, _value7,   \
334                 _field8, _value8, _field9, _value9, _field10, _value10) \
335         EFX_POPULATE_DWORD_10(*MCDI_IN2(_emr, efx_dword_t, _ofst),      \
336                 MC_CMD_ ## _field1, _value1,                            \
337                 MC_CMD_ ## _field2, _value2,                            \
338                 MC_CMD_ ## _field3, _value3,                            \
339                 MC_CMD_ ## _field4, _value4,                            \
340                 MC_CMD_ ## _field5, _value5,                            \
341                 MC_CMD_ ## _field6, _value6,                            \
342                 MC_CMD_ ## _field7, _value7,                            \
343                 MC_CMD_ ## _field8, _value8,                            \
344                 MC_CMD_ ## _field9, _value9,                            \
345                 MC_CMD_ ## _field10, _value10)
346
347 #define MCDI_OUT(_emr, _type, _ofst)                                    \
348         ((_type *)((_emr).emr_out_buf + (_ofst)))
349
350 #define MCDI_OUT2(_emr, _type, _ofst)                                   \
351         MCDI_OUT(_emr, _type, MC_CMD_ ## _ofst ## _OFST)
352
353 #define MCDI_OUT_BYTE(_emr, _ofst)                                      \
354         EFX_BYTE_FIELD(*MCDI_OUT2(_emr, efx_byte_t, _ofst),             \
355                     EFX_BYTE_0)
356
357 #define MCDI_OUT_WORD(_emr, _ofst)                                      \
358         EFX_WORD_FIELD(*MCDI_OUT2(_emr, efx_word_t, _ofst),             \
359                     EFX_WORD_0)
360
361 #define MCDI_OUT_WORD_FIELD(_emr, _ofst, _field)                        \
362         EFX_WORD_FIELD(*MCDI_OUT2(_emr, efx_word_t, _ofst),             \
363                        MC_CMD_ ## _field)
364
365 #define MCDI_OUT_DWORD(_emr, _ofst)                                     \
366         EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst),           \
367                         EFX_DWORD_0)
368
369 #define MCDI_OUT_DWORD_FIELD(_emr, _ofst, _field)                       \
370         EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst),           \
371                         MC_CMD_ ## _field)
372
373 #define MCDI_EV_FIELD(_eqp, _field)                                     \
374         EFX_QWORD_FIELD(*_eqp, MCDI_EVENT_ ## _field)
375
376 #define MCDI_CMD_DWORD_FIELD(_edp, _field)                              \
377         EFX_DWORD_FIELD(*_edp, MC_CMD_ ## _field)
378
379 #define EFX_MCDI_HAVE_PRIVILEGE(mask, priv)                             \
380         (((mask) & (MC_CMD_PRIVILEGE_MASK_IN_GRP_ ## priv)) ==          \
381         (MC_CMD_PRIVILEGE_MASK_IN_GRP_ ## priv))
382
383 typedef enum efx_mcdi_feature_id_e {
384         EFX_MCDI_FEATURE_FW_UPDATE = 0,
385         EFX_MCDI_FEATURE_LINK_CONTROL,
386         EFX_MCDI_FEATURE_MACADDR_CHANGE,
387         EFX_MCDI_FEATURE_MAC_SPOOFING,
388         EFX_MCDI_FEATURE_NIDS
389 } efx_mcdi_feature_id_t;
390
391 #ifdef  __cplusplus
392 }
393 #endif
394
395 #endif  /* _SYS_EFX_MCDI_H */