xref: /dpdk/drivers/common/sfc_efx/base/efx_mcdi.h (revision 2d68e24f7e2626d8688517197c9ea8483c0878f3)
15e111ed8SAndrew Rybchenko /* SPDX-License-Identifier: BSD-3-Clause
25e111ed8SAndrew Rybchenko  *
3672386c1SAndrew Rybchenko  * Copyright(c) 2019-2021 Xilinx, Inc.
45e111ed8SAndrew Rybchenko  * Copyright(c) 2009-2019 Solarflare Communications Inc.
55e111ed8SAndrew Rybchenko  */
65e111ed8SAndrew Rybchenko 
75e111ed8SAndrew Rybchenko #ifndef _SYS_EFX_MCDI_H
85e111ed8SAndrew Rybchenko #define	_SYS_EFX_MCDI_H
95e111ed8SAndrew Rybchenko 
105e111ed8SAndrew Rybchenko #include "efx.h"
115e111ed8SAndrew Rybchenko #include "efx_regs_mcdi.h"
125e111ed8SAndrew Rybchenko 
135e111ed8SAndrew Rybchenko #if EFSYS_OPT_NAMES
145e111ed8SAndrew Rybchenko #include "efx_regs_mcdi_strs.h"
155e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_NAMES */
165e111ed8SAndrew Rybchenko 
175e111ed8SAndrew Rybchenko #ifdef	__cplusplus
185e111ed8SAndrew Rybchenko extern "C" {
195e111ed8SAndrew Rybchenko #endif
205e111ed8SAndrew Rybchenko 
215e111ed8SAndrew Rybchenko /*
225e111ed8SAndrew Rybchenko  * A reboot/assertion causes the MCDI status word to be set after the
235e111ed8SAndrew Rybchenko  * command word is set or a REBOOT event is sent. If we notice a reboot
245e111ed8SAndrew Rybchenko  * via these mechanisms then wait 10ms for the status word to be set.
255e111ed8SAndrew Rybchenko  */
265e111ed8SAndrew Rybchenko #define	EFX_MCDI_STATUS_SLEEP_US	10000
275e111ed8SAndrew Rybchenko 
285e111ed8SAndrew Rybchenko struct efx_mcdi_req_s {
295e111ed8SAndrew Rybchenko 	boolean_t	emr_quiet;
305e111ed8SAndrew Rybchenko 	/* Inputs: Command #, input buffer and length */
315e111ed8SAndrew Rybchenko 	unsigned int	emr_cmd;
325e111ed8SAndrew Rybchenko 	uint8_t		*emr_in_buf;
335e111ed8SAndrew Rybchenko 	size_t		emr_in_length;
345e111ed8SAndrew Rybchenko 	/* Outputs: retcode, buffer, length and length used */
355e111ed8SAndrew Rybchenko 	efx_rc_t	emr_rc;
365e111ed8SAndrew Rybchenko 	uint8_t		*emr_out_buf;
375e111ed8SAndrew Rybchenko 	size_t		emr_out_length;
385e111ed8SAndrew Rybchenko 	size_t		emr_out_length_used;
395e111ed8SAndrew Rybchenko 	/* Internals: low level transport details */
405e111ed8SAndrew Rybchenko 	unsigned int	emr_err_code;
415e111ed8SAndrew Rybchenko 	unsigned int	emr_err_arg;
425e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI_PROXY_AUTH
435e111ed8SAndrew Rybchenko 	uint32_t	emr_proxy_handle;
445e111ed8SAndrew Rybchenko #endif
455e111ed8SAndrew Rybchenko };
465e111ed8SAndrew Rybchenko 
475e111ed8SAndrew Rybchenko typedef struct efx_mcdi_iface_s {
485e111ed8SAndrew Rybchenko 	unsigned int		emi_port;
495e111ed8SAndrew Rybchenko 	unsigned int		emi_max_version;
505e111ed8SAndrew Rybchenko 	unsigned int		emi_seq;
515e111ed8SAndrew Rybchenko 	efx_mcdi_req_t		*emi_pending_req;
525e111ed8SAndrew Rybchenko 	boolean_t		emi_ev_cpl;
535e111ed8SAndrew Rybchenko 	boolean_t		emi_new_epoch;
545e111ed8SAndrew Rybchenko 	int			emi_aborted;
555e111ed8SAndrew Rybchenko 	uint32_t		emi_poll_cnt;
565e111ed8SAndrew Rybchenko 	uint32_t		emi_mc_reboot_status;
575e111ed8SAndrew Rybchenko } efx_mcdi_iface_t;
585e111ed8SAndrew Rybchenko 
595e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
605e111ed8SAndrew Rybchenko extern			void
615e111ed8SAndrew Rybchenko efx_mcdi_execute(
625e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
635e111ed8SAndrew Rybchenko 	__inout		efx_mcdi_req_t *emrp);
645e111ed8SAndrew Rybchenko 
655e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
665e111ed8SAndrew Rybchenko extern			void
675e111ed8SAndrew Rybchenko efx_mcdi_execute_quiet(
685e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
695e111ed8SAndrew Rybchenko 	__inout		efx_mcdi_req_t *emrp);
705e111ed8SAndrew Rybchenko 
715e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
725e111ed8SAndrew Rybchenko extern			void
735e111ed8SAndrew Rybchenko efx_mcdi_ev_cpl(
745e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
755e111ed8SAndrew Rybchenko 	__in		unsigned int seq,
765e111ed8SAndrew Rybchenko 	__in		unsigned int outlen,
775e111ed8SAndrew Rybchenko 	__in		int errcode);
785e111ed8SAndrew Rybchenko 
795e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI_PROXY_AUTH
805e111ed8SAndrew Rybchenko LIBEFX_API
815e111ed8SAndrew Rybchenko extern	__checkReturn	efx_rc_t
825e111ed8SAndrew Rybchenko efx_mcdi_get_proxy_handle(
835e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
845e111ed8SAndrew Rybchenko 	__in		efx_mcdi_req_t *emrp,
855e111ed8SAndrew Rybchenko 	__out		uint32_t *handlep);
865e111ed8SAndrew Rybchenko 
875e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
885e111ed8SAndrew Rybchenko extern			void
895e111ed8SAndrew Rybchenko efx_mcdi_ev_proxy_response(
905e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
915e111ed8SAndrew Rybchenko 	__in		unsigned int handle,
925e111ed8SAndrew Rybchenko 	__in		unsigned int status);
935e111ed8SAndrew Rybchenko #endif
945e111ed8SAndrew Rybchenko 
955e111ed8SAndrew Rybchenko #if EFSYS_OPT_MCDI_PROXY_AUTH_SERVER
965e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
975e111ed8SAndrew Rybchenko extern			void
985e111ed8SAndrew Rybchenko efx_mcdi_ev_proxy_request(
995e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
1005e111ed8SAndrew Rybchenko 	__in		unsigned int index);
1015e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_MCDI_PROXY_AUTH_SERVER */
1025e111ed8SAndrew Rybchenko 
1035e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
1045e111ed8SAndrew Rybchenko extern			void
1055e111ed8SAndrew Rybchenko efx_mcdi_ev_death(
1065e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
1075e111ed8SAndrew Rybchenko 	__in		int rc);
1085e111ed8SAndrew Rybchenko 
1095e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
1105e111ed8SAndrew Rybchenko extern	__checkReturn	efx_rc_t
1115e111ed8SAndrew Rybchenko efx_mcdi_request_errcode(
1125e111ed8SAndrew Rybchenko 	__in		unsigned int err);
1135e111ed8SAndrew Rybchenko 
1145e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
1155e111ed8SAndrew Rybchenko extern			void
1165e111ed8SAndrew Rybchenko efx_mcdi_raise_exception(
1175e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
1185e111ed8SAndrew Rybchenko 	__in_opt	efx_mcdi_req_t *emrp,
1195e111ed8SAndrew Rybchenko 	__in		int rc);
1205e111ed8SAndrew Rybchenko 
121833cfcd5SIvan Malov /*
122833cfcd5SIvan Malov  * Flags that name portions of extended version information
123833cfcd5SIvan Malov  *
124833cfcd5SIvan Malov  * The values match their MCDI counterparts.
125833cfcd5SIvan Malov  */
126833cfcd5SIvan Malov #define	EFX_MCDI_VERSION_BOARD_INFO	(1U << 4)
127833cfcd5SIvan Malov 
128312191e8SIvan Malov typedef struct efx_mcdi_version_s {
129312191e8SIvan Malov 	/* Basic version information */
130312191e8SIvan Malov 	uint16_t		emv_version[4];
131312191e8SIvan Malov 	uint32_t		emv_firmware;
132833cfcd5SIvan Malov 
133833cfcd5SIvan Malov 	/*
134833cfcd5SIvan Malov 	 * Extended version information
135833cfcd5SIvan Malov 	 *
136833cfcd5SIvan Malov 	 * Valid portions of obtained information are indicated by flags.
137833cfcd5SIvan Malov 	 */
138833cfcd5SIvan Malov 	uint32_t		emv_flags;
139833cfcd5SIvan Malov 
140833cfcd5SIvan Malov 	/* Information valid if emv_flags has EFX_MCDI_VERSION_BOARD_INFO set */
141833cfcd5SIvan Malov 	efx_nic_board_info_t	emv_board_info;
142312191e8SIvan Malov } efx_mcdi_version_t;
143312191e8SIvan Malov 
144312191e8SIvan Malov LIBEFX_INTERNAL
145312191e8SIvan Malov extern	__checkReturn	efx_rc_t
146312191e8SIvan Malov efx_mcdi_get_version(
147312191e8SIvan Malov 	__in		efx_nic_t *enp,
148833cfcd5SIvan Malov 	__in		uint32_t flags_req,
149312191e8SIvan Malov 	__out		efx_mcdi_version_t *verp);
150312191e8SIvan Malov 
1515e111ed8SAndrew Rybchenko typedef enum efx_mcdi_boot_e {
1525e111ed8SAndrew Rybchenko 	EFX_MCDI_BOOT_PRIMARY,
1535e111ed8SAndrew Rybchenko 	EFX_MCDI_BOOT_SECONDARY,
1545e111ed8SAndrew Rybchenko 	EFX_MCDI_BOOT_ROM,
1555e111ed8SAndrew Rybchenko } efx_mcdi_boot_t;
1565e111ed8SAndrew Rybchenko 
1575e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
1585e111ed8SAndrew Rybchenko extern	__checkReturn		efx_rc_t
1595e111ed8SAndrew Rybchenko efx_mcdi_version(
1605e111ed8SAndrew Rybchenko 	__in			efx_nic_t *enp,
1615e111ed8SAndrew Rybchenko 	__out_ecount_opt(4)	uint16_t versionp[4],
1625e111ed8SAndrew Rybchenko 	__out_opt		uint32_t *buildp,
1635e111ed8SAndrew Rybchenko 	__out_opt		efx_mcdi_boot_t *statusp);
1645e111ed8SAndrew Rybchenko 
1655e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
1665e111ed8SAndrew Rybchenko extern	__checkReturn	efx_rc_t
1675e111ed8SAndrew Rybchenko efx_mcdi_get_capabilities(
1685e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
1695e111ed8SAndrew Rybchenko 	__out_opt	uint32_t *flagsp,
1705e111ed8SAndrew Rybchenko 	__out_opt	uint16_t *rx_dpcpu_fw_idp,
1715e111ed8SAndrew Rybchenko 	__out_opt	uint16_t *tx_dpcpu_fw_idp,
1725e111ed8SAndrew Rybchenko 	__out_opt	uint32_t *flags2p,
1735e111ed8SAndrew Rybchenko 	__out_opt	uint32_t *tso2ncp);
1745e111ed8SAndrew Rybchenko 
1755e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
1765e111ed8SAndrew Rybchenko extern	__checkReturn		efx_rc_t
1775e111ed8SAndrew Rybchenko efx_mcdi_read_assertion(
1785e111ed8SAndrew Rybchenko 	__in			efx_nic_t *enp);
1795e111ed8SAndrew Rybchenko 
1805e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
1815e111ed8SAndrew Rybchenko extern	__checkReturn		efx_rc_t
1825e111ed8SAndrew Rybchenko efx_mcdi_exit_assertion_handler(
1835e111ed8SAndrew Rybchenko 	__in			efx_nic_t *enp);
1845e111ed8SAndrew Rybchenko 
1855e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
1865e111ed8SAndrew Rybchenko extern	__checkReturn		efx_rc_t
1875e111ed8SAndrew Rybchenko efx_mcdi_drv_attach(
1885e111ed8SAndrew Rybchenko 	__in			efx_nic_t *enp,
1895e111ed8SAndrew Rybchenko 	__in			boolean_t attach);
1905e111ed8SAndrew Rybchenko 
1915e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
1925e111ed8SAndrew Rybchenko extern	__checkReturn		efx_rc_t
1935e111ed8SAndrew Rybchenko efx_mcdi_get_board_cfg(
1945e111ed8SAndrew Rybchenko 	__in			efx_nic_t *enp,
1955e111ed8SAndrew Rybchenko 	__out_opt		uint32_t *board_typep,
1965e111ed8SAndrew Rybchenko 	__out_opt		efx_dword_t *capabilitiesp,
1975e111ed8SAndrew Rybchenko 	__out_ecount_opt(6)	uint8_t mac_addrp[6]);
1985e111ed8SAndrew Rybchenko 
1995e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
2005e111ed8SAndrew Rybchenko extern	__checkReturn		efx_rc_t
2015e111ed8SAndrew Rybchenko efx_mcdi_get_phy_cfg(
2025e111ed8SAndrew Rybchenko 	__in			efx_nic_t *enp);
2035e111ed8SAndrew Rybchenko 
2045e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
2055e111ed8SAndrew Rybchenko extern	__checkReturn		efx_rc_t
2065e111ed8SAndrew Rybchenko efx_mcdi_firmware_update_supported(
2075e111ed8SAndrew Rybchenko 	__in			efx_nic_t *enp,
2085e111ed8SAndrew Rybchenko 	__out			boolean_t *supportedp);
2095e111ed8SAndrew Rybchenko 
2105e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
2115e111ed8SAndrew Rybchenko extern	__checkReturn		efx_rc_t
2125e111ed8SAndrew Rybchenko efx_mcdi_macaddr_change_supported(
2135e111ed8SAndrew Rybchenko 	__in			efx_nic_t *enp,
2145e111ed8SAndrew Rybchenko 	__out			boolean_t *supportedp);
2155e111ed8SAndrew Rybchenko 
2165e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
2175e111ed8SAndrew Rybchenko extern	__checkReturn		efx_rc_t
2185e111ed8SAndrew Rybchenko efx_mcdi_link_control_supported(
2195e111ed8SAndrew Rybchenko 	__in			efx_nic_t *enp,
2205e111ed8SAndrew Rybchenko 	__out			boolean_t *supportedp);
2215e111ed8SAndrew Rybchenko 
2225e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
2235e111ed8SAndrew Rybchenko extern	__checkReturn		efx_rc_t
2245e111ed8SAndrew Rybchenko efx_mcdi_mac_spoofing_supported(
2255e111ed8SAndrew Rybchenko 	__in			efx_nic_t *enp,
2265e111ed8SAndrew Rybchenko 	__out			boolean_t *supportedp);
2275e111ed8SAndrew Rybchenko 
2285e111ed8SAndrew Rybchenko 
2295e111ed8SAndrew Rybchenko #if EFSYS_OPT_BIST
2305e111ed8SAndrew Rybchenko #if EFX_OPTS_EF10()
2315e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
2325e111ed8SAndrew Rybchenko extern	__checkReturn		efx_rc_t
2335e111ed8SAndrew Rybchenko efx_mcdi_bist_enable_offline(
2345e111ed8SAndrew Rybchenko 	__in			efx_nic_t *enp);
2355e111ed8SAndrew Rybchenko #endif /* EFX_OPTS_EF10() */
2365e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
2375e111ed8SAndrew Rybchenko extern	__checkReturn		efx_rc_t
2385e111ed8SAndrew Rybchenko efx_mcdi_bist_start(
2395e111ed8SAndrew Rybchenko 	__in			efx_nic_t *enp,
2405e111ed8SAndrew Rybchenko 	__in			efx_bist_type_t type);
2415e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_BIST */
2425e111ed8SAndrew Rybchenko 
2435e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
2445e111ed8SAndrew Rybchenko extern	__checkReturn		efx_rc_t
2455e111ed8SAndrew Rybchenko efx_mcdi_get_resource_limits(
2465e111ed8SAndrew Rybchenko 	__in			efx_nic_t *enp,
2475e111ed8SAndrew Rybchenko 	__out_opt		uint32_t *nevqp,
2485e111ed8SAndrew Rybchenko 	__out_opt		uint32_t *nrxqp,
2495e111ed8SAndrew Rybchenko 	__out_opt		uint32_t *ntxqp);
2505e111ed8SAndrew Rybchenko 
2515e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
2525e111ed8SAndrew Rybchenko extern	__checkReturn	efx_rc_t
2535e111ed8SAndrew Rybchenko efx_mcdi_log_ctrl(
2545e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp);
2555e111ed8SAndrew Rybchenko 
2565e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
2575e111ed8SAndrew Rybchenko extern	__checkReturn	efx_rc_t
2585e111ed8SAndrew Rybchenko efx_mcdi_mac_stats_clear(
2595e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp);
2605e111ed8SAndrew Rybchenko 
2615e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
2625e111ed8SAndrew Rybchenko extern	__checkReturn	efx_rc_t
2635e111ed8SAndrew Rybchenko efx_mcdi_mac_stats_upload(
2645e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
2655e111ed8SAndrew Rybchenko 	__in		efsys_mem_t *esmp);
2665e111ed8SAndrew Rybchenko 
2675e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
2685e111ed8SAndrew Rybchenko extern	__checkReturn	efx_rc_t
2695e111ed8SAndrew Rybchenko efx_mcdi_mac_stats_periodic(
2705e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp,
2715e111ed8SAndrew Rybchenko 	__in		efsys_mem_t *esmp,
2725e111ed8SAndrew Rybchenko 	__in		uint16_t period_ms,
2735e111ed8SAndrew Rybchenko 	__in		boolean_t events);
2745e111ed8SAndrew Rybchenko 
2755e111ed8SAndrew Rybchenko 
2765e111ed8SAndrew Rybchenko #if EFSYS_OPT_LOOPBACK
2775e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
2785e111ed8SAndrew Rybchenko extern	__checkReturn	efx_rc_t
2795e111ed8SAndrew Rybchenko efx_mcdi_get_loopback_modes(
2805e111ed8SAndrew Rybchenko 	__in		efx_nic_t *enp);
2815e111ed8SAndrew Rybchenko #endif /* EFSYS_OPT_LOOPBACK */
2825e111ed8SAndrew Rybchenko 
2835e111ed8SAndrew Rybchenko LIBEFX_INTERNAL
2845e111ed8SAndrew Rybchenko extern	__checkReturn	efx_rc_t
2855e111ed8SAndrew Rybchenko efx_mcdi_phy_module_get_info(
2865e111ed8SAndrew Rybchenko 	__in			efx_nic_t *enp,
2875e111ed8SAndrew Rybchenko 	__in			uint8_t dev_addr,
2885e111ed8SAndrew Rybchenko 	__in			size_t offset,
2895e111ed8SAndrew Rybchenko 	__in			size_t len,
2905e111ed8SAndrew Rybchenko 	__out_bcount(len)	uint8_t *data);
2915e111ed8SAndrew Rybchenko 
29260fb370cSAndrew Rybchenko LIBEFX_INTERNAL
29360fb370cSAndrew Rybchenko extern	__checkReturn	efx_rc_t
29460fb370cSAndrew Rybchenko efx_mcdi_get_nic_addr_info(
29560fb370cSAndrew Rybchenko 	__in		efx_nic_t *enp,
29660fb370cSAndrew Rybchenko 	__out		uint32_t *mapping_typep);
29760fb370cSAndrew Rybchenko 
29860fb370cSAndrew Rybchenko struct efx_nic_dma_region_info_s;
29960fb370cSAndrew Rybchenko 
30060fb370cSAndrew Rybchenko LIBEFX_INTERNAL
30160fb370cSAndrew Rybchenko extern	__checkReturn	efx_rc_t
30260fb370cSAndrew Rybchenko efx_mcdi_get_nic_addr_regions(
30360fb370cSAndrew Rybchenko 	__in		efx_nic_t *enp,
30460fb370cSAndrew Rybchenko 	__out		struct efx_nic_dma_region_info_s *endrip);
30560fb370cSAndrew Rybchenko 
30660fb370cSAndrew Rybchenko LIBEFX_INTERNAL
30760fb370cSAndrew Rybchenko extern	__checkReturn	efx_rc_t
30860fb370cSAndrew Rybchenko efx_mcdi_set_nic_addr_regions(
30960fb370cSAndrew Rybchenko 	__in		efx_nic_t *enp,
31060fb370cSAndrew Rybchenko 	__in		const struct efx_nic_dma_region_info_s *endrip);
31160fb370cSAndrew Rybchenko 
3125e111ed8SAndrew Rybchenko #define	MCDI_IN(_emr, _type, _ofst)					\
3135e111ed8SAndrew Rybchenko 	((_type *)((_emr).emr_in_buf + (_ofst)))
3145e111ed8SAndrew Rybchenko 
3155e111ed8SAndrew Rybchenko #define	MCDI_IN2(_emr, _type, _ofst)					\
3165e111ed8SAndrew Rybchenko 	MCDI_IN(_emr, _type, MC_CMD_ ## _ofst ## _OFST)
3175e111ed8SAndrew Rybchenko 
318e7ea5f30SIvan Malov #define	MCDI_INDEXED_IN2(_emr, _type, _ofst, _idx)			\
319e7ea5f30SIvan Malov 	MCDI_IN(_emr, _type, MC_CMD_ ## _ofst ## _OFST +		\
320e7ea5f30SIvan Malov 		_idx * MC_CMD_ ## _ofst ## _LEN)
321e7ea5f30SIvan Malov 
3225e111ed8SAndrew Rybchenko #define	MCDI_IN_SET_BYTE(_emr, _ofst, _value)				\
3235e111ed8SAndrew Rybchenko 	EFX_POPULATE_BYTE_1(*MCDI_IN2(_emr, efx_byte_t, _ofst),		\
3245e111ed8SAndrew Rybchenko 		EFX_BYTE_0, _value)
3255e111ed8SAndrew Rybchenko 
3265e111ed8SAndrew Rybchenko #define	MCDI_IN_SET_WORD(_emr, _ofst, _value)				\
3275e111ed8SAndrew Rybchenko 	EFX_POPULATE_WORD_1(*MCDI_IN2(_emr, efx_word_t, _ofst),		\
3285e111ed8SAndrew Rybchenko 		EFX_WORD_0, _value)
3295e111ed8SAndrew Rybchenko 
3305e111ed8SAndrew Rybchenko #define	MCDI_IN_SET_DWORD(_emr, _ofst, _value)				\
3315e111ed8SAndrew Rybchenko 	EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
3325e111ed8SAndrew Rybchenko 		EFX_DWORD_0, _value)
3335e111ed8SAndrew Rybchenko 
3345e111ed8SAndrew Rybchenko #define	MCDI_IN_SET_DWORD_FIELD(_emr, _ofst, _field, _value)		\
3355e111ed8SAndrew Rybchenko 	EFX_SET_DWORD_FIELD(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
3365e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field, _value)
3375e111ed8SAndrew Rybchenko 
338bbc42f34SIgor Romanov #define	MCDI_IN_SET_INDEXED_DWORD(_emr, _ofst, _idx, _value)		\
339bbc42f34SIgor Romanov 	EFX_POPULATE_DWORD_1(*(MCDI_IN2(_emr, efx_dword_t, _ofst) +	\
340bbc42f34SIgor Romanov 			     (_idx)), EFX_DWORD_0, _value)		\
341bbc42f34SIgor Romanov 
34260fb370cSAndrew Rybchenko #define	MCDI_IN_SET_QWORD(_emr, _ofst, _value)				\
34360fb370cSAndrew Rybchenko 	EFX_POPULATE_QWORD_2(*MCDI_IN2(_emr, efx_qword_t, _ofst),	\
34460fb370cSAndrew Rybchenko 		EFX_DWORD_0, ((_value) & 0xffffffff),			\
34560fb370cSAndrew Rybchenko 		EFX_DWORD_1, ((_value) >> 32))
34660fb370cSAndrew Rybchenko 
34760fb370cSAndrew Rybchenko #define	MCDI_IN_SET_INDEXED_QWORD(_emr, _ofst, _idx, _value)		\
34860fb370cSAndrew Rybchenko 	EFX_POPULATE_QWORD_2(*(MCDI_IN2(_emr, efx_qword_t, _ofst) +	\
34960fb370cSAndrew Rybchenko 			(_idx)),					\
35060fb370cSAndrew Rybchenko 		EFX_DWORD_0, ((_value) & 0xffffffff),	\
35160fb370cSAndrew Rybchenko 		EFX_DWORD_1, ((_value) >> 32))
35260fb370cSAndrew Rybchenko 
3535e111ed8SAndrew Rybchenko #define	MCDI_IN_POPULATE_DWORD_1(_emr, _ofst, _field1, _value1)		\
3545e111ed8SAndrew Rybchenko 	EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
3555e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field1, _value1)
3565e111ed8SAndrew Rybchenko 
3575e111ed8SAndrew Rybchenko #define	MCDI_IN_POPULATE_DWORD_2(_emr, _ofst, _field1, _value1,		\
3585e111ed8SAndrew Rybchenko 		_field2, _value2)					\
3595e111ed8SAndrew Rybchenko 	EFX_POPULATE_DWORD_2(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
3605e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field1, _value1,				\
3615e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field2, _value2)
3625e111ed8SAndrew Rybchenko 
363e7ea5f30SIvan Malov #define	MCDI_IN_POPULATE_INDEXED_DWORD_2(_emr, _ofst, _idx,		\
364e7ea5f30SIvan Malov 		_field1, _value1, _field2, _value2)			\
365e7ea5f30SIvan Malov 	EFX_POPULATE_DWORD_2(						\
366e7ea5f30SIvan Malov 		*MCDI_INDEXED_IN2(_emr, efx_dword_t, _ofst, _idx),	\
367e7ea5f30SIvan Malov 		MC_CMD_ ## _field1, _value1,				\
368e7ea5f30SIvan Malov 		MC_CMD_ ## _field2, _value2)
369e7ea5f30SIvan Malov 
3705e111ed8SAndrew Rybchenko #define	MCDI_IN_POPULATE_DWORD_3(_emr, _ofst, _field1, _value1,		\
3715e111ed8SAndrew Rybchenko 		_field2, _value2, _field3, _value3)			\
3725e111ed8SAndrew Rybchenko 	EFX_POPULATE_DWORD_3(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
3735e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field1, _value1,				\
3745e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field2, _value2,				\
3755e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field3, _value3)
3765e111ed8SAndrew Rybchenko 
3775e111ed8SAndrew Rybchenko #define	MCDI_IN_POPULATE_DWORD_4(_emr, _ofst, _field1, _value1,		\
3785e111ed8SAndrew Rybchenko 		_field2, _value2, _field3, _value3, _field4, _value4)	\
3795e111ed8SAndrew Rybchenko 	EFX_POPULATE_DWORD_4(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
3805e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field1, _value1,				\
3815e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field2, _value2,				\
3825e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field3, _value3,				\
3835e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field4, _value4)
3845e111ed8SAndrew Rybchenko 
3855e111ed8SAndrew Rybchenko #define	MCDI_IN_POPULATE_DWORD_5(_emr, _ofst, _field1, _value1,		\
3865e111ed8SAndrew Rybchenko 		_field2, _value2, _field3, _value3, _field4, _value4,	\
3875e111ed8SAndrew Rybchenko 		_field5, _value5)					\
3885e111ed8SAndrew Rybchenko 	EFX_POPULATE_DWORD_5(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
3895e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field1, _value1,				\
3905e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field2, _value2,				\
3915e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field3, _value3,				\
3925e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field4, _value4,				\
3935e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field5, _value5)
3945e111ed8SAndrew Rybchenko 
3955e111ed8SAndrew Rybchenko #define	MCDI_IN_POPULATE_DWORD_6(_emr, _ofst, _field1, _value1,		\
3965e111ed8SAndrew Rybchenko 		_field2, _value2, _field3, _value3, _field4, _value4,	\
3975e111ed8SAndrew Rybchenko 		_field5, _value5, _field6, _value6)			\
3985e111ed8SAndrew Rybchenko 	EFX_POPULATE_DWORD_6(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
3995e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field1, _value1,				\
4005e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field2, _value2,				\
4015e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field3, _value3,				\
4025e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field4, _value4,				\
4035e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field5, _value5,				\
4045e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field6, _value6)
4055e111ed8SAndrew Rybchenko 
4065e111ed8SAndrew Rybchenko #define	MCDI_IN_POPULATE_DWORD_7(_emr, _ofst, _field1, _value1,		\
4075e111ed8SAndrew Rybchenko 		_field2, _value2, _field3, _value3, _field4, _value4,	\
4085e111ed8SAndrew Rybchenko 		_field5, _value5, _field6, _value6, _field7, _value7)	\
4095e111ed8SAndrew Rybchenko 	EFX_POPULATE_DWORD_7(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
4105e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field1, _value1,				\
4115e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field2, _value2,				\
4125e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field3, _value3,				\
4135e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field4, _value4,				\
4145e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field5, _value5,				\
4155e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field6, _value6,				\
4165e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field7, _value7)
4175e111ed8SAndrew Rybchenko 
4185e111ed8SAndrew Rybchenko #define	MCDI_IN_POPULATE_DWORD_8(_emr, _ofst, _field1, _value1,		\
4195e111ed8SAndrew Rybchenko 		_field2, _value2, _field3, _value3, _field4, _value4,	\
4205e111ed8SAndrew Rybchenko 		_field5, _value5, _field6, _value6, _field7, _value7,	\
4215e111ed8SAndrew Rybchenko 		_field8, _value8)					\
4225e111ed8SAndrew Rybchenko 	EFX_POPULATE_DWORD_8(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
4235e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field1, _value1,				\
4245e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field2, _value2,				\
4255e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field3, _value3,				\
4265e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field4, _value4,				\
4275e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field5, _value5,				\
4285e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field6, _value6,				\
4295e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field7, _value7,				\
4305e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field8, _value8)
4315e111ed8SAndrew Rybchenko 
4325e111ed8SAndrew Rybchenko #define	MCDI_IN_POPULATE_DWORD_9(_emr, _ofst, _field1, _value1,		\
4335e111ed8SAndrew Rybchenko 		_field2, _value2, _field3, _value3, _field4, _value4,	\
4345e111ed8SAndrew Rybchenko 		_field5, _value5, _field6, _value6, _field7, _value7,	\
4355e111ed8SAndrew Rybchenko 		_field8, _value8, _field9, _value9)			\
4365e111ed8SAndrew Rybchenko 	EFX_POPULATE_DWORD_9(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
4375e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field1, _value1,				\
4385e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field2, _value2,				\
4395e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field3, _value3,				\
4405e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field4, _value4,				\
4415e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field5, _value5,				\
4425e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field6, _value6,				\
4435e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field7, _value7,				\
4445e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field8, _value8,				\
4455e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field9, _value9)
4465e111ed8SAndrew Rybchenko 
4475e111ed8SAndrew Rybchenko #define	MCDI_IN_POPULATE_DWORD_10(_emr, _ofst, _field1, _value1,	\
4485e111ed8SAndrew Rybchenko 		_field2, _value2, _field3, _value3, _field4, _value4,	\
4495e111ed8SAndrew Rybchenko 		_field5, _value5, _field6, _value6, _field7, _value7,	\
4505e111ed8SAndrew Rybchenko 		_field8, _value8, _field9, _value9, _field10, _value10)	\
4515e111ed8SAndrew Rybchenko 	EFX_POPULATE_DWORD_10(*MCDI_IN2(_emr, efx_dword_t, _ofst),	\
4525e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field1, _value1,				\
4535e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field2, _value2,				\
4545e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field3, _value3,				\
4555e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field4, _value4,				\
4565e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field5, _value5,				\
4575e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field6, _value6,				\
4585e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field7, _value7,				\
4595e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field8, _value8,				\
4605e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field9, _value9,				\
4615e111ed8SAndrew Rybchenko 		MC_CMD_ ## _field10, _value10)
4625e111ed8SAndrew Rybchenko 
463d874d2a1SIgor Romanov /*
464d874d2a1SIgor Romanov  * Native setters (MCDI_IN_SET_*_NATIVE) are used when MCDI field is in
465d874d2a1SIgor Romanov  * network order to avoid conversion to little-endian that is done in
466d874d2a1SIgor Romanov  * other setters.
467d874d2a1SIgor Romanov  */
468d874d2a1SIgor Romanov #define	MCDI_IN_SET_WORD_NATIVE(_emr, _ofst, _value)			\
469d874d2a1SIgor Romanov 	MCDI_IN2((_emr), efx_word_t, _ofst)->ew_u16[0] = (_value)
470d874d2a1SIgor Romanov 
471d874d2a1SIgor Romanov #define	MCDI_IN_SET_DWORD_NATIVE(_emr, _ofst, _value)			\
472d874d2a1SIgor Romanov 	MCDI_IN2((_emr), efx_dword_t, _ofst)->ed_u32[0] = (_value)
473d874d2a1SIgor Romanov 
4745e111ed8SAndrew Rybchenko #define	MCDI_OUT(_emr, _type, _ofst)					\
4755e111ed8SAndrew Rybchenko 	((_type *)((_emr).emr_out_buf + (_ofst)))
4765e111ed8SAndrew Rybchenko 
4775e111ed8SAndrew Rybchenko #define	MCDI_OUT2(_emr, _type, _ofst)					\
4785e111ed8SAndrew Rybchenko 	MCDI_OUT(_emr, _type, MC_CMD_ ## _ofst ## _OFST)
4795e111ed8SAndrew Rybchenko 
4805e111ed8SAndrew Rybchenko #define	MCDI_OUT_BYTE(_emr, _ofst)					\
4815e111ed8SAndrew Rybchenko 	EFX_BYTE_FIELD(*MCDI_OUT2(_emr, efx_byte_t, _ofst),		\
4825e111ed8SAndrew Rybchenko 		    EFX_BYTE_0)
4835e111ed8SAndrew Rybchenko 
4845e111ed8SAndrew Rybchenko #define	MCDI_OUT_WORD(_emr, _ofst)					\
4855e111ed8SAndrew Rybchenko 	EFX_WORD_FIELD(*MCDI_OUT2(_emr, efx_word_t, _ofst),		\
4865e111ed8SAndrew Rybchenko 		    EFX_WORD_0)
4875e111ed8SAndrew Rybchenko 
4885e111ed8SAndrew Rybchenko #define	MCDI_OUT_WORD_FIELD(_emr, _ofst, _field)			\
4895e111ed8SAndrew Rybchenko 	EFX_WORD_FIELD(*MCDI_OUT2(_emr, efx_word_t, _ofst),		\
4905e111ed8SAndrew Rybchenko 		       MC_CMD_ ## _field)
4915e111ed8SAndrew Rybchenko 
4925e111ed8SAndrew Rybchenko #define	MCDI_OUT_DWORD(_emr, _ofst)					\
4935e111ed8SAndrew Rybchenko 	EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst),		\
4945e111ed8SAndrew Rybchenko 			EFX_DWORD_0)
4955e111ed8SAndrew Rybchenko 
4965e111ed8SAndrew Rybchenko #define	MCDI_OUT_DWORD_FIELD(_emr, _ofst, _field)			\
4975e111ed8SAndrew Rybchenko 	EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst),		\
4985e111ed8SAndrew Rybchenko 			MC_CMD_ ## _field)
4995e111ed8SAndrew Rybchenko 
500bbc42f34SIgor Romanov #define	MCDI_OUT_INDEXED_DWORD(_emr, _ofst, _idx)			\
501bbc42f34SIgor Romanov 	MCDI_OUT_INDEXED_DWORD_FIELD(_emr, _ofst, _idx, EFX_DWORD_0)
502bbc42f34SIgor Romanov 
50334285fd0SIvan Malov #define	MCDI_OUT_INDEXED_DWORD_FIELD(_emr, _ofst, _idx, _field)		\
50434285fd0SIvan Malov 	EFX_DWORD_FIELD(*(MCDI_OUT2(_emr, efx_dword_t, _ofst) +		\
50534285fd0SIvan Malov 			(_idx)), _field)
50634285fd0SIvan Malov 
507*2d68e24fSDenis Pryazhennikov #define	MCDI_OUT_INDEXED_QWORD_FIELD(_emr, _ofst, _idx, _field)		\
508*2d68e24fSDenis Pryazhennikov 	EFX_QWORD_FIELD(*(MCDI_OUT2(_emr, efx_qword_t, _ofst) +		\
509*2d68e24fSDenis Pryazhennikov 			(_idx)), _field)
510*2d68e24fSDenis Pryazhennikov 
51123748069SViacheslav Galaktionov #define	MCDI_OUT_INDEXED_STRUCT_MEMBER(_emr, _type, _arr_ofst, _idx,	\
51223748069SViacheslav Galaktionov 		_member_ofst)						\
51323748069SViacheslav Galaktionov 	((_type *)(MCDI_OUT2(_emr, uint8_t, _arr_ofst) +		\
51423748069SViacheslav Galaktionov 		   _idx * MC_CMD_ ## _arr_ofst ## _LEN +		\
51523748069SViacheslav Galaktionov 		   _member_ofst ## _OFST))
51623748069SViacheslav Galaktionov 
51723748069SViacheslav Galaktionov #define	MCDI_OUT_INDEXED_MEMBER_DWORD(_emr, _arr_ofst, _idx,		\
51823748069SViacheslav Galaktionov 		_member_ofst)						\
51923748069SViacheslav Galaktionov 	EFX_DWORD_FIELD(						\
52023748069SViacheslav Galaktionov 		*(MCDI_OUT_INDEXED_STRUCT_MEMBER(_emr, efx_dword_t,	\
52123748069SViacheslav Galaktionov 						 _arr_ofst, _idx,	\
52223748069SViacheslav Galaktionov 						 _member_ofst)),	\
52323748069SViacheslav Galaktionov 		EFX_DWORD_0)
52423748069SViacheslav Galaktionov 
52523748069SViacheslav Galaktionov #define	MCDI_OUT_INDEXED_MEMBER_QWORD(_emr, _arr_ofst, _idx,		\
52623748069SViacheslav Galaktionov 		_member_ofst)						\
52723748069SViacheslav Galaktionov 	((uint64_t)EFX_QWORD_FIELD(					\
52823748069SViacheslav Galaktionov 		*(MCDI_OUT_INDEXED_STRUCT_MEMBER(_emr, efx_qword_t,	\
52923748069SViacheslav Galaktionov 						 _arr_ofst, _idx,	\
53023748069SViacheslav Galaktionov 						 _member_ofst)),	\
53123748069SViacheslav Galaktionov 		EFX_DWORD_0) |						\
53223748069SViacheslav Galaktionov 	(uint64_t)EFX_QWORD_FIELD(					\
53323748069SViacheslav Galaktionov 		*(MCDI_OUT_INDEXED_STRUCT_MEMBER(_emr, efx_qword_t,	\
53423748069SViacheslav Galaktionov 						 _arr_ofst, _idx,	\
53523748069SViacheslav Galaktionov 						 _member_ofst)),	\
53623748069SViacheslav Galaktionov 		EFX_DWORD_1) << 32)
53723748069SViacheslav Galaktionov 
53823748069SViacheslav Galaktionov #define MCDI_STRUCT_MEMBER(_buf, _type, _ofst)				\
53923748069SViacheslav Galaktionov 	((_type *)((char *)_buf + _ofst ## _OFST))	\
54023748069SViacheslav Galaktionov 
54123748069SViacheslav Galaktionov #define MCDI_STRUCT_BYTE(_buf, _ofst)					\
54223748069SViacheslav Galaktionov 	EFX_BYTE_FIELD(*MCDI_STRUCT_MEMBER(_buf, efx_byte_t, _ofst),	\
54323748069SViacheslav Galaktionov 		       EFX_BYTE_0)
54423748069SViacheslav Galaktionov 
54523748069SViacheslav Galaktionov #define MCDI_STRUCT_BYTE_FIELD(_buf, _ofst, _field)			\
54623748069SViacheslav Galaktionov 	EFX_BYTE_FIELD(*MCDI_STRUCT_MEMBER(_buf, efx_byte_t, _ofst),	\
54723748069SViacheslav Galaktionov 		       _field)
54823748069SViacheslav Galaktionov 
54923748069SViacheslav Galaktionov #define MCDI_STRUCT_WORD(_buf, _ofst)					\
55023748069SViacheslav Galaktionov 	EFX_WORD_FIELD(*MCDI_STRUCT_MEMBER(_buf, efx_word_t, _ofst),	\
55123748069SViacheslav Galaktionov 		       EFX_WORD_0)
55223748069SViacheslav Galaktionov 
55323748069SViacheslav Galaktionov #define MCDI_STRUCT_WORD_FIELD(_buf, _ofst, _field)			\
55423748069SViacheslav Galaktionov 	EFX_WORD_FIELD(*MCDI_STRUCT_MEMBER(_buf, efx_word_t, _ofst),	\
55523748069SViacheslav Galaktionov 		       _field)
55623748069SViacheslav Galaktionov 
55723748069SViacheslav Galaktionov #define MCDI_STRUCT_DWORD(_buf, _ofst)					\
55823748069SViacheslav Galaktionov 	EFX_DWORD_FIELD(*MCDI_STRUCT_MEMBER(_buf, efx_dword_t, _ofst),	\
55923748069SViacheslav Galaktionov 			EFX_DWORD_0)
56023748069SViacheslav Galaktionov 
56123748069SViacheslav Galaktionov #define MCDI_STRUCT_DWORD_FIELD(_buf, _ofst, _field)			\
56223748069SViacheslav Galaktionov 	EFX_DWORD_FIELD(*MCDI_STRUCT_MEMBER(_buf, efx_dword_t, _ofst),	\
56323748069SViacheslav Galaktionov 			_field)
56423748069SViacheslav Galaktionov 
5655e111ed8SAndrew Rybchenko #define	MCDI_EV_FIELD(_eqp, _field)					\
5665e111ed8SAndrew Rybchenko 	EFX_QWORD_FIELD(*_eqp, MCDI_EVENT_ ## _field)
5675e111ed8SAndrew Rybchenko 
5685e111ed8SAndrew Rybchenko #define	MCDI_CMD_DWORD_FIELD(_edp, _field)				\
5695e111ed8SAndrew Rybchenko 	EFX_DWORD_FIELD(*_edp, MC_CMD_ ## _field)
5705e111ed8SAndrew Rybchenko 
5715e111ed8SAndrew Rybchenko #define	EFX_MCDI_HAVE_PRIVILEGE(mask, priv)				\
5725e111ed8SAndrew Rybchenko 	(((mask) & (MC_CMD_PRIVILEGE_MASK_IN_GRP_ ## priv)) ==		\
5735e111ed8SAndrew Rybchenko 	(MC_CMD_PRIVILEGE_MASK_IN_GRP_ ## priv))
5745e111ed8SAndrew Rybchenko 
5755e111ed8SAndrew Rybchenko #define	EFX_MCDI_BUF_SIZE(_in_len, _out_len)				\
5765e111ed8SAndrew Rybchenko 	EFX_P2ROUNDUP(size_t,						\
5775e111ed8SAndrew Rybchenko 		MAX(MAX(_in_len, _out_len), (2 * sizeof (efx_dword_t))),\
5785e111ed8SAndrew Rybchenko 		sizeof (efx_dword_t))
5795e111ed8SAndrew Rybchenko 
5805e111ed8SAndrew Rybchenko /*
5815e111ed8SAndrew Rybchenko  * The buffer size must be a multiple of dword to ensure that MCDI works
5825e111ed8SAndrew Rybchenko  * properly with Siena based boards (which use on-chip buffer). Also, it
5835e111ed8SAndrew Rybchenko  * should be at minimum the size of two dwords to allow space for extended
5845e111ed8SAndrew Rybchenko  * error responses if the request/response buffer sizes are smaller.
5855e111ed8SAndrew Rybchenko  */
5865e111ed8SAndrew Rybchenko #define EFX_MCDI_DECLARE_BUF(_name, _in_len, _out_len)			\
5875e111ed8SAndrew Rybchenko 	uint8_t _name[EFX_MCDI_BUF_SIZE(_in_len, _out_len)] = {0}
5885e111ed8SAndrew Rybchenko 
5895e111ed8SAndrew Rybchenko typedef enum efx_mcdi_feature_id_e {
5905e111ed8SAndrew Rybchenko 	EFX_MCDI_FEATURE_FW_UPDATE = 0,
5915e111ed8SAndrew Rybchenko 	EFX_MCDI_FEATURE_LINK_CONTROL,
5925e111ed8SAndrew Rybchenko 	EFX_MCDI_FEATURE_MACADDR_CHANGE,
5935e111ed8SAndrew Rybchenko 	EFX_MCDI_FEATURE_MAC_SPOOFING,
5945e111ed8SAndrew Rybchenko 	EFX_MCDI_FEATURE_NIDS
5955e111ed8SAndrew Rybchenko } efx_mcdi_feature_id_t;
5965e111ed8SAndrew Rybchenko 
5975e111ed8SAndrew Rybchenko #ifdef	__cplusplus
5985e111ed8SAndrew Rybchenko }
5995e111ed8SAndrew Rybchenko #endif
6005e111ed8SAndrew Rybchenko 
6015e111ed8SAndrew Rybchenko #endif	/* _SYS_EFX_MCDI_H */
602