/* SPDX-License-Identifier: BSD-3-Clause
*
- * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2019-2021 Xilinx, Inc.
* Copyright(c) 2009-2019 Solarflare Communications Inc.
*/
__in_opt efx_mcdi_req_t *emrp,
__in int rc);
+/*
+ * Flags that name portions of extended version information
+ *
+ * The values match their MCDI counterparts.
+ */
+#define EFX_MCDI_VERSION_BOARD_INFO (1U << 4)
+
+typedef struct efx_mcdi_version_s {
+ /* Basic version information */
+ uint16_t emv_version[4];
+ uint32_t emv_firmware;
+
+ /*
+ * Extended version information
+ *
+ * Valid portions of obtained information are indicated by flags.
+ */
+ uint32_t emv_flags;
+
+ /* Information valid if emv_flags has EFX_MCDI_VERSION_BOARD_INFO set */
+ efx_nic_board_info_t emv_board_info;
+} efx_mcdi_version_t;
+
+LIBEFX_INTERNAL
+extern __checkReturn efx_rc_t
+efx_mcdi_get_version(
+ __in efx_nic_t *enp,
+ __in uint32_t flags_req,
+ __out efx_mcdi_version_t *verp);
+
typedef enum efx_mcdi_boot_e {
EFX_MCDI_BOOT_PRIMARY,
EFX_MCDI_BOOT_SECONDARY,
EFX_SET_DWORD_FIELD(*MCDI_IN2(_emr, efx_dword_t, _ofst), \
MC_CMD_ ## _field, _value)
+#define MCDI_IN_SET_INDEXED_DWORD(_emr, _ofst, _idx, _value) \
+ EFX_POPULATE_DWORD_1(*(MCDI_IN2(_emr, efx_dword_t, _ofst) + \
+ (_idx)), EFX_DWORD_0, _value) \
+
#define MCDI_IN_POPULATE_DWORD_1(_emr, _ofst, _field1, _value1) \
EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst), \
MC_CMD_ ## _field1, _value1)
MC_CMD_ ## _field9, _value9, \
MC_CMD_ ## _field10, _value10)
+/*
+ * Native setters (MCDI_IN_SET_*_NATIVE) are used when MCDI field is in
+ * network order to avoid conversion to little-endian that is done in
+ * other setters.
+ */
+#define MCDI_IN_SET_WORD_NATIVE(_emr, _ofst, _value) \
+ MCDI_IN2((_emr), efx_word_t, _ofst)->ew_u16[0] = (_value)
+
+#define MCDI_IN_SET_DWORD_NATIVE(_emr, _ofst, _value) \
+ MCDI_IN2((_emr), efx_dword_t, _ofst)->ed_u32[0] = (_value)
+
#define MCDI_OUT(_emr, _type, _ofst) \
((_type *)((_emr).emr_out_buf + (_ofst)))
EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst), \
MC_CMD_ ## _field)
+#define MCDI_OUT_INDEXED_DWORD(_emr, _ofst, _idx) \
+ MCDI_OUT_INDEXED_DWORD_FIELD(_emr, _ofst, _idx, EFX_DWORD_0)
+
+#define MCDI_OUT_INDEXED_DWORD_FIELD(_emr, _ofst, _idx, _field) \
+ EFX_DWORD_FIELD(*(MCDI_OUT2(_emr, efx_dword_t, _ofst) + \
+ (_idx)), _field)
+
#define MCDI_EV_FIELD(_eqp, _field) \
EFX_QWORD_FIELD(*_eqp, MCDI_EVENT_ ## _field)