xref: /freebsd/sys/dev/sfxge/common/efx_mcdi.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1e948693eSPhilip Paeps /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3718cf2ccSPedro F. Giffuni  *
4929c7febSAndrew Rybchenko  * Copyright (c) 2009-2016 Solarflare Communications Inc.
53c838a9fSAndrew Rybchenko  * All rights reserved.
6e948693eSPhilip Paeps  *
7e948693eSPhilip Paeps  * Redistribution and use in source and binary forms, with or without
83c838a9fSAndrew Rybchenko  * modification, are permitted provided that the following conditions are met:
9e948693eSPhilip Paeps  *
103c838a9fSAndrew Rybchenko  * 1. Redistributions of source code must retain the above copyright notice,
113c838a9fSAndrew Rybchenko  *    this list of conditions and the following disclaimer.
123c838a9fSAndrew Rybchenko  * 2. Redistributions in binary form must reproduce the above copyright notice,
133c838a9fSAndrew Rybchenko  *    this list of conditions and the following disclaimer in the documentation
143c838a9fSAndrew Rybchenko  *    and/or other materials provided with the distribution.
153c838a9fSAndrew Rybchenko  *
163c838a9fSAndrew Rybchenko  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
173c838a9fSAndrew Rybchenko  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
183c838a9fSAndrew Rybchenko  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
193c838a9fSAndrew Rybchenko  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
203c838a9fSAndrew Rybchenko  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
213c838a9fSAndrew Rybchenko  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
223c838a9fSAndrew Rybchenko  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
233c838a9fSAndrew Rybchenko  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
243c838a9fSAndrew Rybchenko  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
253c838a9fSAndrew Rybchenko  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
263c838a9fSAndrew Rybchenko  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273c838a9fSAndrew Rybchenko  *
283c838a9fSAndrew Rybchenko  * The views and conclusions contained in the software and documentation are
293c838a9fSAndrew Rybchenko  * those of the authors and should not be interpreted as representing official
303c838a9fSAndrew Rybchenko  * policies, either expressed or implied, of the FreeBSD Project.
31e948693eSPhilip Paeps  */
32e948693eSPhilip Paeps 
33e948693eSPhilip Paeps #ifndef _SYS_EFX_MCDI_H
34e948693eSPhilip Paeps #define	_SYS_EFX_MCDI_H
35e948693eSPhilip Paeps 
36e948693eSPhilip Paeps #include "efx.h"
37e948693eSPhilip Paeps #include "efx_regs_mcdi.h"
38e948693eSPhilip Paeps 
39d515a203SAndrew Rybchenko #if EFSYS_OPT_NAMES
40d515a203SAndrew Rybchenko #include "efx_regs_mcdi_strs.h"
41d515a203SAndrew Rybchenko #endif /* EFSYS_OPT_NAMES */
42d515a203SAndrew Rybchenko 
43e948693eSPhilip Paeps #ifdef	__cplusplus
44e948693eSPhilip Paeps extern "C" {
45e948693eSPhilip Paeps #endif
46e948693eSPhilip Paeps 
473c838a9fSAndrew Rybchenko /*
483c838a9fSAndrew Rybchenko  * A reboot/assertion causes the MCDI status word to be set after the
493c838a9fSAndrew Rybchenko  * command word is set or a REBOOT event is sent. If we notice a reboot
503c838a9fSAndrew Rybchenko  * via these mechanisms then wait 10ms for the status word to be set.
513c838a9fSAndrew Rybchenko  */
523c838a9fSAndrew Rybchenko #define	EFX_MCDI_STATUS_SLEEP_US	10000
53e948693eSPhilip Paeps 
54e948693eSPhilip Paeps struct efx_mcdi_req_s {
553c838a9fSAndrew Rybchenko 	boolean_t	emr_quiet;
56e948693eSPhilip Paeps 	/* Inputs: Command #, input buffer and length */
57e948693eSPhilip Paeps 	unsigned int	emr_cmd;
58e948693eSPhilip Paeps 	uint8_t		*emr_in_buf;
59e948693eSPhilip Paeps 	size_t		emr_in_length;
60e948693eSPhilip Paeps 	/* Outputs: retcode, buffer, length, and length used */
616e4d4812SAndrew Rybchenko 	efx_rc_t	emr_rc;
62e948693eSPhilip Paeps 	uint8_t		*emr_out_buf;
63e948693eSPhilip Paeps 	size_t		emr_out_length;
64e948693eSPhilip Paeps 	size_t		emr_out_length_used;
65083e18eeSAndrew Rybchenko 	/* Internals: low level transport details */
66083e18eeSAndrew Rybchenko 	unsigned int	emr_err_code;
67083e18eeSAndrew Rybchenko 	unsigned int	emr_err_arg;
681ff6d626SAndrew Rybchenko #if EFSYS_OPT_MCDI_PROXY_AUTH
691ff6d626SAndrew Rybchenko 	uint32_t	emr_proxy_handle;
701ff6d626SAndrew Rybchenko #endif
71e948693eSPhilip Paeps };
72e948693eSPhilip Paeps 
73e948693eSPhilip Paeps typedef struct efx_mcdi_iface_s {
74e948693eSPhilip Paeps 	unsigned int		emi_port;
7514d6f73eSAndrew Rybchenko 	unsigned int		emi_max_version;
76e948693eSPhilip Paeps 	unsigned int		emi_seq;
77e948693eSPhilip Paeps 	efx_mcdi_req_t		*emi_pending_req;
78e948693eSPhilip Paeps 	boolean_t		emi_ev_cpl;
793c838a9fSAndrew Rybchenko 	boolean_t		emi_new_epoch;
80e948693eSPhilip Paeps 	int			emi_aborted;
81e948693eSPhilip Paeps 	uint32_t		emi_poll_cnt;
823c838a9fSAndrew Rybchenko 	uint32_t		emi_mc_reboot_status;
83e948693eSPhilip Paeps } efx_mcdi_iface_t;
84e948693eSPhilip Paeps 
85e948693eSPhilip Paeps extern			void
86e948693eSPhilip Paeps efx_mcdi_execute(
87e948693eSPhilip Paeps 	__in		efx_nic_t *enp,
883c838a9fSAndrew Rybchenko 	__inout		efx_mcdi_req_t *emrp);
893c838a9fSAndrew Rybchenko 
903c838a9fSAndrew Rybchenko extern			void
913c838a9fSAndrew Rybchenko efx_mcdi_execute_quiet(
923c838a9fSAndrew Rybchenko 	__in		efx_nic_t *enp,
933c838a9fSAndrew Rybchenko 	__inout		efx_mcdi_req_t *emrp);
94e948693eSPhilip Paeps 
95083e18eeSAndrew Rybchenko extern			void
96e948693eSPhilip Paeps efx_mcdi_ev_cpl(
97e948693eSPhilip Paeps 	__in		efx_nic_t *enp,
98e948693eSPhilip Paeps 	__in		unsigned int seq,
99e948693eSPhilip Paeps 	__in		unsigned int outlen,
100e948693eSPhilip Paeps 	__in		int errcode);
101e948693eSPhilip Paeps 
1021ff6d626SAndrew Rybchenko #if EFSYS_OPT_MCDI_PROXY_AUTH
1039f09d81eSAndrew Rybchenko extern	__checkReturn	efx_rc_t
1041ff6d626SAndrew Rybchenko efx_mcdi_get_proxy_handle(
1051ff6d626SAndrew Rybchenko 	__in		efx_nic_t *enp,
1061ff6d626SAndrew Rybchenko 	__in		efx_mcdi_req_t *emrp,
1071ff6d626SAndrew Rybchenko 	__out		uint32_t *handlep);
1081ff6d626SAndrew Rybchenko 
1091ff6d626SAndrew Rybchenko extern			void
1101ff6d626SAndrew Rybchenko efx_mcdi_ev_proxy_response(
1111ff6d626SAndrew Rybchenko 	__in		efx_nic_t *enp,
1121ff6d626SAndrew Rybchenko 	__in		unsigned int handle,
1131ff6d626SAndrew Rybchenko 	__in		unsigned int status);
1141ff6d626SAndrew Rybchenko #endif
1151ff6d626SAndrew Rybchenko 
116e948693eSPhilip Paeps extern			void
117e948693eSPhilip Paeps efx_mcdi_ev_death(
118e948693eSPhilip Paeps 	__in		efx_nic_t *enp,
119e948693eSPhilip Paeps 	__in		int rc);
120e948693eSPhilip Paeps 
121460cb568SAndrew Rybchenko extern	__checkReturn	efx_rc_t
1223c838a9fSAndrew Rybchenko efx_mcdi_request_errcode(
1233c838a9fSAndrew Rybchenko 	__in		unsigned int err);
1243c838a9fSAndrew Rybchenko 
1253c838a9fSAndrew Rybchenko extern			void
1263c838a9fSAndrew Rybchenko efx_mcdi_raise_exception(
1273c838a9fSAndrew Rybchenko 	__in		efx_nic_t *enp,
1283c838a9fSAndrew Rybchenko 	__in_opt	efx_mcdi_req_t *emrp,
1293c838a9fSAndrew Rybchenko 	__in		int rc);
1303c838a9fSAndrew Rybchenko 
131e948693eSPhilip Paeps typedef enum efx_mcdi_boot_e {
132e948693eSPhilip Paeps 	EFX_MCDI_BOOT_PRIMARY,
133e948693eSPhilip Paeps 	EFX_MCDI_BOOT_SECONDARY,
134e948693eSPhilip Paeps 	EFX_MCDI_BOOT_ROM,
135e948693eSPhilip Paeps } efx_mcdi_boot_t;
136e948693eSPhilip Paeps 
137460cb568SAndrew Rybchenko extern	__checkReturn		efx_rc_t
138e948693eSPhilip Paeps efx_mcdi_version(
139e948693eSPhilip Paeps 	__in			efx_nic_t *enp,
140e948693eSPhilip Paeps 	__out_ecount_opt(4)	uint16_t versionp[4],
141e948693eSPhilip Paeps 	__out_opt		uint32_t *buildp,
142e948693eSPhilip Paeps 	__out_opt		efx_mcdi_boot_t *statusp);
143e948693eSPhilip Paeps 
144460cb568SAndrew Rybchenko extern	__checkReturn	efx_rc_t
145d55882dfSAndrew Rybchenko efx_mcdi_get_capabilities(
146d55882dfSAndrew Rybchenko 	__in		efx_nic_t *enp,
147d55882dfSAndrew Rybchenko 	__out_opt	uint32_t *flagsp,
148d55882dfSAndrew Rybchenko 	__out_opt	uint16_t *rx_dpcpu_fw_idp,
149d55882dfSAndrew Rybchenko 	__out_opt	uint16_t *tx_dpcpu_fw_idp,
150d55882dfSAndrew Rybchenko 	__out_opt	uint32_t *flags2p,
151d55882dfSAndrew Rybchenko 	__out_opt	uint32_t *tso2ncp);
152d55882dfSAndrew Rybchenko 
153d55882dfSAndrew Rybchenko extern	__checkReturn		efx_rc_t
1543c838a9fSAndrew Rybchenko efx_mcdi_read_assertion(
1553c838a9fSAndrew Rybchenko 	__in			efx_nic_t *enp);
1563c838a9fSAndrew Rybchenko 
157460cb568SAndrew Rybchenko extern	__checkReturn		efx_rc_t
1583c838a9fSAndrew Rybchenko efx_mcdi_exit_assertion_handler(
1593c838a9fSAndrew Rybchenko 	__in			efx_nic_t *enp);
1603c838a9fSAndrew Rybchenko 
161460cb568SAndrew Rybchenko extern	__checkReturn		efx_rc_t
1623c838a9fSAndrew Rybchenko efx_mcdi_drv_attach(
1633c838a9fSAndrew Rybchenko 	__in			efx_nic_t *enp,
1643c838a9fSAndrew Rybchenko 	__in			boolean_t attach);
1653c838a9fSAndrew Rybchenko 
166460cb568SAndrew Rybchenko extern	__checkReturn		efx_rc_t
1673c838a9fSAndrew Rybchenko efx_mcdi_get_board_cfg(
1683c838a9fSAndrew Rybchenko 	__in			efx_nic_t *enp,
1693c838a9fSAndrew Rybchenko 	__out_opt		uint32_t *board_typep,
1703c838a9fSAndrew Rybchenko 	__out_opt		efx_dword_t *capabilitiesp,
1713c838a9fSAndrew Rybchenko 	__out_ecount_opt(6)	uint8_t mac_addrp[6]);
1723c838a9fSAndrew Rybchenko 
173460cb568SAndrew Rybchenko extern	__checkReturn		efx_rc_t
1743c838a9fSAndrew Rybchenko efx_mcdi_get_phy_cfg(
1753c838a9fSAndrew Rybchenko 	__in			efx_nic_t *enp);
1763c838a9fSAndrew Rybchenko 
177460cb568SAndrew Rybchenko extern	__checkReturn		efx_rc_t
1783c838a9fSAndrew Rybchenko efx_mcdi_firmware_update_supported(
1793c838a9fSAndrew Rybchenko 	__in			efx_nic_t *enp,
1803c838a9fSAndrew Rybchenko 	__out			boolean_t *supportedp);
1813c838a9fSAndrew Rybchenko 
182460cb568SAndrew Rybchenko extern	__checkReturn		efx_rc_t
1833c838a9fSAndrew Rybchenko efx_mcdi_macaddr_change_supported(
1843c838a9fSAndrew Rybchenko 	__in			efx_nic_t *enp,
1853c838a9fSAndrew Rybchenko 	__out			boolean_t *supportedp);
1863c838a9fSAndrew Rybchenko 
187d486ce4bSAndrew Rybchenko extern	__checkReturn		efx_rc_t
188d486ce4bSAndrew Rybchenko efx_mcdi_link_control_supported(
189d486ce4bSAndrew Rybchenko 	__in			efx_nic_t *enp,
190d486ce4bSAndrew Rybchenko 	__out			boolean_t *supportedp);
191d486ce4bSAndrew Rybchenko 
192ddfb0c9eSAndrew Rybchenko extern	__checkReturn		efx_rc_t
193ddfb0c9eSAndrew Rybchenko efx_mcdi_mac_spoofing_supported(
194ddfb0c9eSAndrew Rybchenko 	__in			efx_nic_t *enp,
195ddfb0c9eSAndrew Rybchenko 	__out			boolean_t *supportedp);
196ddfb0c9eSAndrew Rybchenko 
1973c838a9fSAndrew Rybchenko #if EFSYS_OPT_BIST
198eecf8d28SAndrew Rybchenko #if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2
199460cb568SAndrew Rybchenko extern	__checkReturn		efx_rc_t
2003c838a9fSAndrew Rybchenko efx_mcdi_bist_enable_offline(
2013c838a9fSAndrew Rybchenko 	__in			efx_nic_t *enp);
202eecf8d28SAndrew Rybchenko #endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD || EFSYS_OPT_MEDFORD2 */
203460cb568SAndrew Rybchenko extern	__checkReturn		efx_rc_t
2043c838a9fSAndrew Rybchenko efx_mcdi_bist_start(
2053c838a9fSAndrew Rybchenko 	__in			efx_nic_t *enp,
2063c838a9fSAndrew Rybchenko 	__in			efx_bist_type_t type);
2073c838a9fSAndrew Rybchenko #endif /* EFSYS_OPT_BIST */
2083c838a9fSAndrew Rybchenko 
209460cb568SAndrew Rybchenko extern	__checkReturn		efx_rc_t
2103c838a9fSAndrew Rybchenko efx_mcdi_get_resource_limits(
2113c838a9fSAndrew Rybchenko 	__in			efx_nic_t *enp,
2123c838a9fSAndrew Rybchenko 	__out_opt		uint32_t *nevqp,
2133c838a9fSAndrew Rybchenko 	__out_opt		uint32_t *nrxqp,
2143c838a9fSAndrew Rybchenko 	__out_opt		uint32_t *ntxqp);
2153c838a9fSAndrew Rybchenko 
216460cb568SAndrew Rybchenko extern	__checkReturn	efx_rc_t
2173c838a9fSAndrew Rybchenko efx_mcdi_log_ctrl(
2183c838a9fSAndrew Rybchenko 	__in		efx_nic_t *enp);
2193c838a9fSAndrew Rybchenko 
220460cb568SAndrew Rybchenko extern	__checkReturn	efx_rc_t
2213c838a9fSAndrew Rybchenko efx_mcdi_mac_stats_clear(
2223c838a9fSAndrew Rybchenko 	__in		efx_nic_t *enp);
2233c838a9fSAndrew Rybchenko 
224460cb568SAndrew Rybchenko extern	__checkReturn	efx_rc_t
2253c838a9fSAndrew Rybchenko efx_mcdi_mac_stats_upload(
2263c838a9fSAndrew Rybchenko 	__in		efx_nic_t *enp,
2273c838a9fSAndrew Rybchenko 	__in		efsys_mem_t *esmp);
2283c838a9fSAndrew Rybchenko 
229460cb568SAndrew Rybchenko extern	__checkReturn	efx_rc_t
2303c838a9fSAndrew Rybchenko efx_mcdi_mac_stats_periodic(
2313c838a9fSAndrew Rybchenko 	__in		efx_nic_t *enp,
2323c838a9fSAndrew Rybchenko 	__in		efsys_mem_t *esmp,
233542c719cSAndrew Rybchenko 	__in		uint16_t period_ms,
2343c838a9fSAndrew Rybchenko 	__in		boolean_t events);
2353c838a9fSAndrew Rybchenko 
2363c838a9fSAndrew Rybchenko #if EFSYS_OPT_LOOPBACK
237460cb568SAndrew Rybchenko extern	__checkReturn	efx_rc_t
2383c838a9fSAndrew Rybchenko efx_mcdi_get_loopback_modes(
2393c838a9fSAndrew Rybchenko 	__in		efx_nic_t *enp);
2403c838a9fSAndrew Rybchenko #endif /* EFSYS_OPT_LOOPBACK */
2413c838a9fSAndrew Rybchenko 
2421e76f8b8SAndrew Rybchenko extern	__checkReturn	efx_rc_t
2431e76f8b8SAndrew Rybchenko efx_mcdi_phy_module_get_info(
2441e76f8b8SAndrew Rybchenko 	__in			efx_nic_t *enp,
2451e76f8b8SAndrew Rybchenko 	__in			uint8_t dev_addr,
2463c3b9542SAndrew Rybchenko 	__in			size_t offset,
2473c3b9542SAndrew Rybchenko 	__in			size_t len,
2481e76f8b8SAndrew Rybchenko 	__out_bcount(len)	uint8_t *data);
2491e76f8b8SAndrew Rybchenko 
250e948693eSPhilip Paeps #define	MCDI_IN(_emr, _type, _ofst)					\
251e948693eSPhilip Paeps 	((_type *)((_emr).emr_in_buf + (_ofst)))
252e948693eSPhilip Paeps 
253e948693eSPhilip Paeps #define	MCDI_IN2(_emr, _type, _ofst)					\
254e948693eSPhilip Paeps 	MCDI_IN(_emr, _type, MC_CMD_ ## _ofst ## _OFST)
255e948693eSPhilip Paeps 
256e948693eSPhilip Paeps #define	MCDI_IN_SET_BYTE(_emr, _ofst, _value)				\
257e948693eSPhilip Paeps 	EFX_POPULATE_BYTE_1(*MCDI_IN2(_emr, efx_byte_t, _ofst),		\
258e948693eSPhilip Paeps 		EFX_BYTE_0, _value)
259e948693eSPhilip Paeps 
2603c838a9fSAndrew Rybchenko #define	MCDI_IN_SET_WORD(_emr, _ofst, _value)				\
2613c838a9fSAndrew Rybchenko 	EFX_POPULATE_WORD_1(*MCDI_IN2(_emr, efx_word_t, _ofst),		\
2623c838a9fSAndrew Rybchenko 		EFX_WORD_0, _value)
2633c838a9fSAndrew Rybchenko 
264e948693eSPhilip Paeps #define	MCDI_IN_SET_DWORD(_emr, _ofst, _value)				\
265e948693eSPhilip Paeps 	EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
266e948693eSPhilip Paeps 		EFX_DWORD_0, _value)
267e948693eSPhilip Paeps 
2683c838a9fSAndrew Rybchenko #define	MCDI_IN_SET_DWORD_FIELD(_emr, _ofst, _field, _value)		\
2693c838a9fSAndrew Rybchenko 	EFX_SET_DWORD_FIELD(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
2703c838a9fSAndrew Rybchenko 		MC_CMD_ ## _field, _value)
2713c838a9fSAndrew Rybchenko 
272e948693eSPhilip Paeps #define	MCDI_IN_POPULATE_DWORD_1(_emr, _ofst, _field1, _value1)		\
273e948693eSPhilip Paeps 	EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
274e948693eSPhilip Paeps 		MC_CMD_ ## _field1, _value1)
275e948693eSPhilip Paeps 
276e948693eSPhilip Paeps #define	MCDI_IN_POPULATE_DWORD_2(_emr, _ofst, _field1, _value1,		\
277e948693eSPhilip Paeps 		_field2, _value2)					\
278e948693eSPhilip Paeps 	EFX_POPULATE_DWORD_2(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
279e948693eSPhilip Paeps 		MC_CMD_ ## _field1, _value1,				\
280e948693eSPhilip Paeps 		MC_CMD_ ## _field2, _value2)
281e948693eSPhilip Paeps 
282e948693eSPhilip Paeps #define	MCDI_IN_POPULATE_DWORD_3(_emr, _ofst, _field1, _value1,		\
283e948693eSPhilip Paeps 		_field2, _value2, _field3, _value3)			\
284e948693eSPhilip Paeps 	EFX_POPULATE_DWORD_3(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
285e948693eSPhilip Paeps 		MC_CMD_ ## _field1, _value1,				\
286e948693eSPhilip Paeps 		MC_CMD_ ## _field2, _value2,				\
287e948693eSPhilip Paeps 		MC_CMD_ ## _field3, _value3)
288e948693eSPhilip Paeps 
289e948693eSPhilip Paeps #define	MCDI_IN_POPULATE_DWORD_4(_emr, _ofst, _field1, _value1,		\
290e948693eSPhilip Paeps 		_field2, _value2, _field3, _value3, _field4, _value4)	\
291e948693eSPhilip Paeps 	EFX_POPULATE_DWORD_4(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
292e948693eSPhilip Paeps 		MC_CMD_ ## _field1, _value1,				\
293e948693eSPhilip Paeps 		MC_CMD_ ## _field2, _value2,				\
294e948693eSPhilip Paeps 		MC_CMD_ ## _field3, _value3,				\
295e948693eSPhilip Paeps 		MC_CMD_ ## _field4, _value4)
296e948693eSPhilip Paeps 
297e948693eSPhilip Paeps #define	MCDI_IN_POPULATE_DWORD_5(_emr, _ofst, _field1, _value1,		\
298e948693eSPhilip Paeps 		_field2, _value2, _field3, _value3, _field4, _value4,	\
299e948693eSPhilip Paeps 		_field5, _value5)					\
300e948693eSPhilip Paeps 	EFX_POPULATE_DWORD_5(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
301e948693eSPhilip Paeps 		MC_CMD_ ## _field1, _value1,				\
302e948693eSPhilip Paeps 		MC_CMD_ ## _field2, _value2,				\
303e948693eSPhilip Paeps 		MC_CMD_ ## _field3, _value3,				\
304e948693eSPhilip Paeps 		MC_CMD_ ## _field4, _value4,				\
305e948693eSPhilip Paeps 		MC_CMD_ ## _field5, _value5)
306e948693eSPhilip Paeps 
307e948693eSPhilip Paeps #define	MCDI_IN_POPULATE_DWORD_6(_emr, _ofst, _field1, _value1,		\
308e948693eSPhilip Paeps 		_field2, _value2, _field3, _value3, _field4, _value4,	\
309e948693eSPhilip Paeps 		_field5, _value5, _field6, _value6)			\
310e948693eSPhilip Paeps 	EFX_POPULATE_DWORD_6(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
311e948693eSPhilip Paeps 		MC_CMD_ ## _field1, _value1,				\
312e948693eSPhilip Paeps 		MC_CMD_ ## _field2, _value2,				\
313e948693eSPhilip Paeps 		MC_CMD_ ## _field3, _value3,				\
314e948693eSPhilip Paeps 		MC_CMD_ ## _field4, _value4,				\
315e948693eSPhilip Paeps 		MC_CMD_ ## _field5, _value5,				\
316e948693eSPhilip Paeps 		MC_CMD_ ## _field6, _value6)
317e948693eSPhilip Paeps 
318e948693eSPhilip Paeps #define	MCDI_IN_POPULATE_DWORD_7(_emr, _ofst, _field1, _value1,		\
319e948693eSPhilip Paeps 		_field2, _value2, _field3, _value3, _field4, _value4,	\
320e948693eSPhilip Paeps 		_field5, _value5, _field6, _value6, _field7, _value7)	\
3213c838a9fSAndrew Rybchenko 	EFX_POPULATE_DWORD_7(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
322e948693eSPhilip Paeps 		MC_CMD_ ## _field1, _value1,				\
323e948693eSPhilip Paeps 		MC_CMD_ ## _field2, _value2,				\
324e948693eSPhilip Paeps 		MC_CMD_ ## _field3, _value3,				\
325e948693eSPhilip Paeps 		MC_CMD_ ## _field4, _value4,				\
326e948693eSPhilip Paeps 		MC_CMD_ ## _field5, _value5,				\
327e948693eSPhilip Paeps 		MC_CMD_ ## _field6, _value6,				\
328e948693eSPhilip Paeps 		MC_CMD_ ## _field7, _value7)
329e948693eSPhilip Paeps 
330e948693eSPhilip Paeps #define	MCDI_IN_POPULATE_DWORD_8(_emr, _ofst, _field1, _value1,		\
331e948693eSPhilip Paeps 		_field2, _value2, _field3, _value3, _field4, _value4,	\
332e948693eSPhilip Paeps 		_field5, _value5, _field6, _value6, _field7, _value7,	\
333e948693eSPhilip Paeps 		_field8, _value8)					\
334e948693eSPhilip Paeps 	EFX_POPULATE_DWORD_8(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
335e948693eSPhilip Paeps 		MC_CMD_ ## _field1, _value1,				\
336e948693eSPhilip Paeps 		MC_CMD_ ## _field2, _value2,				\
337e948693eSPhilip Paeps 		MC_CMD_ ## _field3, _value3,				\
338e948693eSPhilip Paeps 		MC_CMD_ ## _field4, _value4,				\
339e948693eSPhilip Paeps 		MC_CMD_ ## _field5, _value5,				\
340e948693eSPhilip Paeps 		MC_CMD_ ## _field6, _value6,				\
341e948693eSPhilip Paeps 		MC_CMD_ ## _field7, _value7,				\
342e948693eSPhilip Paeps 		MC_CMD_ ## _field8, _value8)
343e948693eSPhilip Paeps 
344e948693eSPhilip Paeps #define	MCDI_IN_POPULATE_DWORD_9(_emr, _ofst, _field1, _value1,		\
345e948693eSPhilip Paeps 		_field2, _value2, _field3, _value3, _field4, _value4,	\
346e948693eSPhilip Paeps 		_field5, _value5, _field6, _value6, _field7, _value7,	\
347e948693eSPhilip Paeps 		_field8, _value8, _field9, _value9)			\
348e948693eSPhilip Paeps 	EFX_POPULATE_DWORD_9(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
349e948693eSPhilip Paeps 		MC_CMD_ ## _field1, _value1,				\
350e948693eSPhilip Paeps 		MC_CMD_ ## _field2, _value2,				\
351e948693eSPhilip Paeps 		MC_CMD_ ## _field3, _value3,				\
352e948693eSPhilip Paeps 		MC_CMD_ ## _field4, _value4,				\
353e948693eSPhilip Paeps 		MC_CMD_ ## _field5, _value5,				\
354e948693eSPhilip Paeps 		MC_CMD_ ## _field6, _value6,				\
355e948693eSPhilip Paeps 		MC_CMD_ ## _field7, _value7,				\
356e948693eSPhilip Paeps 		MC_CMD_ ## _field8, _value8,				\
357e948693eSPhilip Paeps 		MC_CMD_ ## _field9, _value9)
358e948693eSPhilip Paeps 
359e948693eSPhilip Paeps #define	MCDI_IN_POPULATE_DWORD_10(_emr, _ofst, _field1, _value1,	\
360e948693eSPhilip Paeps 		_field2, _value2, _field3, _value3, _field4, _value4,	\
361e948693eSPhilip Paeps 		_field5, _value5, _field6, _value6, _field7, _value7,	\
362e948693eSPhilip Paeps 		_field8, _value8, _field9, _value9, _field10, _value10)	\
363e948693eSPhilip Paeps 	EFX_POPULATE_DWORD_10(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
364e948693eSPhilip Paeps 		MC_CMD_ ## _field1, _value1,				\
365e948693eSPhilip Paeps 		MC_CMD_ ## _field2, _value2,				\
366e948693eSPhilip Paeps 		MC_CMD_ ## _field3, _value3,				\
367e948693eSPhilip Paeps 		MC_CMD_ ## _field4, _value4,				\
368e948693eSPhilip Paeps 		MC_CMD_ ## _field5, _value5,				\
369e948693eSPhilip Paeps 		MC_CMD_ ## _field6, _value6,				\
370e948693eSPhilip Paeps 		MC_CMD_ ## _field7, _value7,				\
371e948693eSPhilip Paeps 		MC_CMD_ ## _field8, _value8,				\
372e948693eSPhilip Paeps 		MC_CMD_ ## _field9, _value9,				\
373e948693eSPhilip Paeps 		MC_CMD_ ## _field10, _value10)
374e948693eSPhilip Paeps 
375e948693eSPhilip Paeps #define	MCDI_OUT(_emr, _type, _ofst)					\
376e948693eSPhilip Paeps 	((_type *)((_emr).emr_out_buf + (_ofst)))
377e948693eSPhilip Paeps 
378e948693eSPhilip Paeps #define	MCDI_OUT2(_emr, _type, _ofst)					\
379e948693eSPhilip Paeps 	MCDI_OUT(_emr, _type, MC_CMD_ ## _ofst ## _OFST)
380e948693eSPhilip Paeps 
381e948693eSPhilip Paeps #define	MCDI_OUT_BYTE(_emr, _ofst)					\
382e948693eSPhilip Paeps 	EFX_BYTE_FIELD(*MCDI_OUT2(_emr, efx_byte_t, _ofst),		\
383e948693eSPhilip Paeps 		    EFX_BYTE_0)
384e948693eSPhilip Paeps 
385e948693eSPhilip Paeps #define	MCDI_OUT_WORD(_emr, _ofst)					\
386e948693eSPhilip Paeps 	EFX_WORD_FIELD(*MCDI_OUT2(_emr, efx_word_t, _ofst),		\
387e948693eSPhilip Paeps 		    EFX_WORD_0)
388e948693eSPhilip Paeps 
389fdbe38cfSAndrew Rybchenko #define	MCDI_OUT_WORD_FIELD(_emr, _ofst, _field)			\
390fdbe38cfSAndrew Rybchenko 	EFX_WORD_FIELD(*MCDI_OUT2(_emr, efx_word_t, _ofst),		\
391fdbe38cfSAndrew Rybchenko 		       MC_CMD_ ## _field)
392fdbe38cfSAndrew Rybchenko 
393e948693eSPhilip Paeps #define	MCDI_OUT_DWORD(_emr, _ofst)					\
394e948693eSPhilip Paeps 	EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst),		\
395e948693eSPhilip Paeps 			EFX_DWORD_0)
396e948693eSPhilip Paeps 
397e948693eSPhilip Paeps #define	MCDI_OUT_DWORD_FIELD(_emr, _ofst, _field)			\
398e948693eSPhilip Paeps 	EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst),		\
399e948693eSPhilip Paeps 			MC_CMD_ ## _field)
400e948693eSPhilip Paeps 
401e948693eSPhilip Paeps #define	MCDI_EV_FIELD(_eqp, _field)					\
402d8574f4fSAndrew Rybchenko 	EFX_QWORD_FIELD(*_eqp, MCDI_EVENT_ ## _field)
403e948693eSPhilip Paeps 
4048bf93a04SAndrew Rybchenko #define	MCDI_CMD_DWORD_FIELD(_edp, _field)				\
4058bf93a04SAndrew Rybchenko 	EFX_DWORD_FIELD(*_edp, MC_CMD_ ## _field)
4068bf93a04SAndrew Rybchenko 
407273302a4SAndrew Rybchenko #define	EFX_MCDI_HAVE_PRIVILEGE(mask, priv)				\
408af986c75SAndrew Rybchenko 	(((mask) & (MC_CMD_PRIVILEGE_MASK_IN_GRP_ ## priv)) ==		\
409273302a4SAndrew Rybchenko 	(MC_CMD_PRIVILEGE_MASK_IN_GRP_ ## priv))
410273302a4SAndrew Rybchenko 
411ec30f0beSAndrew Rybchenko #define	EFX_MCDI_BUF_SIZE(_in_len, _out_len)				\
412ec30f0beSAndrew Rybchenko 	EFX_P2ROUNDUP(size_t,						\
413ec30f0beSAndrew Rybchenko 		MAX(MAX(_in_len, _out_len), (2 * sizeof (efx_dword_t))),\
414ec30f0beSAndrew Rybchenko 		sizeof (efx_dword_t))
415ec30f0beSAndrew Rybchenko 
416315bbbaaSAndrew Rybchenko /*
417315bbbaaSAndrew Rybchenko  * The buffer size must be a multiple of dword to ensure that MCDI works
418315bbbaaSAndrew Rybchenko  * properly with Siena based boards (which use on-chip buffer). Also, it
419315bbbaaSAndrew Rybchenko  * should be at minimum the size of two dwords to allow space for extended
420315bbbaaSAndrew Rybchenko  * error responses if the request/response buffer sizes are smaller.
421315bbbaaSAndrew Rybchenko  */
422315bbbaaSAndrew Rybchenko #define EFX_MCDI_DECLARE_BUF(_name, _in_len, _out_len)			\
423ec30f0beSAndrew Rybchenko 	uint8_t _name[EFX_MCDI_BUF_SIZE(_in_len, _out_len)] = {0}
424315bbbaaSAndrew Rybchenko 
425af986c75SAndrew Rybchenko typedef enum efx_mcdi_feature_id_e {
426af986c75SAndrew Rybchenko 	EFX_MCDI_FEATURE_FW_UPDATE = 0,
427af986c75SAndrew Rybchenko 	EFX_MCDI_FEATURE_LINK_CONTROL,
428af986c75SAndrew Rybchenko 	EFX_MCDI_FEATURE_MACADDR_CHANGE,
429af986c75SAndrew Rybchenko 	EFX_MCDI_FEATURE_MAC_SPOOFING,
430af986c75SAndrew Rybchenko 	EFX_MCDI_FEATURE_NIDS
431af986c75SAndrew Rybchenko } efx_mcdi_feature_id_t;
432af986c75SAndrew Rybchenko 
433e948693eSPhilip Paeps #ifdef	__cplusplus
434e948693eSPhilip Paeps }
435e948693eSPhilip Paeps #endif
436e948693eSPhilip Paeps 
437e948693eSPhilip Paeps #endif	/* _SYS_EFX_MCDI_H */
438