efx_mcdi.h revision 350409
1227569Sphilip/*- 2300607Sarybchik * Copyright (c) 2009-2016 Solarflare Communications Inc. 3283514Sarybchik * All rights reserved. 4227569Sphilip * 5227569Sphilip * Redistribution and use in source and binary forms, with or without 6283514Sarybchik * modification, are permitted provided that the following conditions are met: 7227569Sphilip * 8283514Sarybchik * 1. Redistributions of source code must retain the above copyright notice, 9283514Sarybchik * this list of conditions and the following disclaimer. 10283514Sarybchik * 2. Redistributions in binary form must reproduce the above copyright notice, 11283514Sarybchik * this list of conditions and the following disclaimer in the documentation 12283514Sarybchik * and/or other materials provided with the distribution. 13228078Sphilip * 14283514Sarybchik * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 15283514Sarybchik * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 16283514Sarybchik * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17283514Sarybchik * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 18283514Sarybchik * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19283514Sarybchik * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20283514Sarybchik * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 21283514Sarybchik * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 22283514Sarybchik * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 23283514Sarybchik * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 24283514Sarybchik * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25283514Sarybchik * 26283514Sarybchik * The views and conclusions contained in the software and documentation are 27283514Sarybchik * those of the authors and should not be interpreted as representing official 28283514Sarybchik * policies, either expressed or implied, of the FreeBSD Project. 29283514Sarybchik * 30228078Sphilip * $FreeBSD: stable/11/sys/dev/sfxge/common/efx_mcdi.h 350409 2019-07-29 10:41:21Z arybchik $ 31227569Sphilip */ 32227569Sphilip 33227569Sphilip#ifndef _SYS_EFX_MCDI_H 34227569Sphilip#define _SYS_EFX_MCDI_H 35227569Sphilip 36227569Sphilip#include "efx.h" 37227569Sphilip#include "efx_regs_mcdi.h" 38227569Sphilip 39227569Sphilip#ifdef __cplusplus 40227569Sphilipextern "C" { 41227569Sphilip#endif 42227569Sphilip 43283514Sarybchik/* 44283514Sarybchik * A reboot/assertion causes the MCDI status word to be set after the 45283514Sarybchik * command word is set or a REBOOT event is sent. If we notice a reboot 46283514Sarybchik * via these mechanisms then wait 10ms for the status word to be set. 47283514Sarybchik */ 48283514Sarybchik#define EFX_MCDI_STATUS_SLEEP_US 10000 49227569Sphilip 50227569Sphilipstruct efx_mcdi_req_s { 51283514Sarybchik boolean_t emr_quiet; 52227569Sphilip /* Inputs: Command #, input buffer and length */ 53227569Sphilip unsigned int emr_cmd; 54227569Sphilip uint8_t *emr_in_buf; 55227569Sphilip size_t emr_in_length; 56227569Sphilip /* Outputs: retcode, buffer, length, and length used*/ 57293819Sarybchik efx_rc_t emr_rc; 58227569Sphilip uint8_t *emr_out_buf; 59227569Sphilip size_t emr_out_length; 60227569Sphilip size_t emr_out_length_used; 61292007Sarybchik /* Internals: low level transport details */ 62292007Sarybchik unsigned int emr_err_code; 63292007Sarybchik unsigned int emr_err_arg; 64292051Sarybchik#if EFSYS_OPT_MCDI_PROXY_AUTH 65292051Sarybchik uint32_t emr_proxy_handle; 66292051Sarybchik#endif 67227569Sphilip}; 68227569Sphilip 69227569Sphiliptypedef struct efx_mcdi_iface_s { 70227569Sphilip unsigned int emi_port; 71293765Sarybchik unsigned int emi_max_version; 72227569Sphilip unsigned int emi_seq; 73227569Sphilip efx_mcdi_req_t *emi_pending_req; 74227569Sphilip boolean_t emi_ev_cpl; 75283514Sarybchik boolean_t emi_new_epoch; 76227569Sphilip int emi_aborted; 77227569Sphilip uint32_t emi_poll_cnt; 78283514Sarybchik uint32_t emi_mc_reboot_status; 79227569Sphilip} efx_mcdi_iface_t; 80227569Sphilip 81227569Sphilipextern void 82227569Sphilipefx_mcdi_execute( 83227569Sphilip __in efx_nic_t *enp, 84283514Sarybchik __inout efx_mcdi_req_t *emrp); 85227569Sphilip 86227569Sphilipextern void 87283514Sarybchikefx_mcdi_execute_quiet( 88283514Sarybchik __in efx_nic_t *enp, 89283514Sarybchik __inout efx_mcdi_req_t *emrp); 90283514Sarybchik 91283514Sarybchikextern void 92227569Sphilipefx_mcdi_ev_cpl( 93227569Sphilip __in efx_nic_t *enp, 94227569Sphilip __in unsigned int seq, 95227569Sphilip __in unsigned int outlen, 96227569Sphilip __in int errcode); 97227569Sphilip 98292051Sarybchik#if EFSYS_OPT_MCDI_PROXY_AUTH 99292053Sarybchikextern __checkReturn efx_rc_t 100292051Sarybchikefx_mcdi_get_proxy_handle( 101292051Sarybchik __in efx_nic_t *enp, 102292051Sarybchik __in efx_mcdi_req_t *emrp, 103292051Sarybchik __out uint32_t *handlep); 104292051Sarybchik 105227569Sphilipextern void 106292051Sarybchikefx_mcdi_ev_proxy_response( 107292051Sarybchik __in efx_nic_t *enp, 108292051Sarybchik __in unsigned int handle, 109292051Sarybchik __in unsigned int status); 110292051Sarybchik#endif 111292051Sarybchik 112292051Sarybchikextern void 113227569Sphilipefx_mcdi_ev_death( 114227569Sphilip __in efx_nic_t *enp, 115227569Sphilip __in int rc); 116227569Sphilip 117291436Sarybchikextern __checkReturn efx_rc_t 118283514Sarybchikefx_mcdi_request_errcode( 119283514Sarybchik __in unsigned int err); 120283514Sarybchik 121283514Sarybchikextern void 122283514Sarybchikefx_mcdi_raise_exception( 123283514Sarybchik __in efx_nic_t *enp, 124283514Sarybchik __in_opt efx_mcdi_req_t *emrp, 125283514Sarybchik __in int rc); 126283514Sarybchik 127227569Sphiliptypedef enum efx_mcdi_boot_e { 128227569Sphilip EFX_MCDI_BOOT_PRIMARY, 129227569Sphilip EFX_MCDI_BOOT_SECONDARY, 130227569Sphilip EFX_MCDI_BOOT_ROM, 131227569Sphilip} efx_mcdi_boot_t; 132227569Sphilip 133291436Sarybchikextern __checkReturn efx_rc_t 134227569Sphilipefx_mcdi_version( 135227569Sphilip __in efx_nic_t *enp, 136227569Sphilip __out_ecount_opt(4) uint16_t versionp[4], 137227569Sphilip __out_opt uint32_t *buildp, 138227569Sphilip __out_opt efx_mcdi_boot_t *statusp); 139227569Sphilip 140291436Sarybchikextern __checkReturn efx_rc_t 141283514Sarybchikefx_mcdi_read_assertion( 142283514Sarybchik __in efx_nic_t *enp); 143283514Sarybchik 144291436Sarybchikextern __checkReturn efx_rc_t 145283514Sarybchikefx_mcdi_exit_assertion_handler( 146283514Sarybchik __in efx_nic_t *enp); 147283514Sarybchik 148291436Sarybchikextern __checkReturn efx_rc_t 149283514Sarybchikefx_mcdi_drv_attach( 150283514Sarybchik __in efx_nic_t *enp, 151283514Sarybchik __in boolean_t attach); 152283514Sarybchik 153291436Sarybchikextern __checkReturn efx_rc_t 154283514Sarybchikefx_mcdi_get_board_cfg( 155283514Sarybchik __in efx_nic_t *enp, 156283514Sarybchik __out_opt uint32_t *board_typep, 157283514Sarybchik __out_opt efx_dword_t *capabilitiesp, 158283514Sarybchik __out_ecount_opt(6) uint8_t mac_addrp[6]); 159283514Sarybchik 160291436Sarybchikextern __checkReturn efx_rc_t 161283514Sarybchikefx_mcdi_get_phy_cfg( 162283514Sarybchik __in efx_nic_t *enp); 163283514Sarybchik 164291436Sarybchikextern __checkReturn efx_rc_t 165283514Sarybchikefx_mcdi_firmware_update_supported( 166283514Sarybchik __in efx_nic_t *enp, 167283514Sarybchik __out boolean_t *supportedp); 168283514Sarybchik 169291436Sarybchikextern __checkReturn efx_rc_t 170283514Sarybchikefx_mcdi_macaddr_change_supported( 171283514Sarybchik __in efx_nic_t *enp, 172283514Sarybchik __out boolean_t *supportedp); 173283514Sarybchik 174291588Sarybchikextern __checkReturn efx_rc_t 175291588Sarybchikefx_mcdi_link_control_supported( 176291588Sarybchik __in efx_nic_t *enp, 177291588Sarybchik __out boolean_t *supportedp); 178291588Sarybchik 179292008Sarybchikextern __checkReturn efx_rc_t 180292008Sarybchikefx_mcdi_mac_spoofing_supported( 181292008Sarybchik __in efx_nic_t *enp, 182292008Sarybchik __out boolean_t *supportedp); 183292008Sarybchik 184292008Sarybchik 185283514Sarybchik#if EFSYS_OPT_BIST 186293757Sarybchik#if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD 187291436Sarybchikextern __checkReturn efx_rc_t 188283514Sarybchikefx_mcdi_bist_enable_offline( 189283514Sarybchik __in efx_nic_t *enp); 190293757Sarybchik#endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD */ 191291436Sarybchikextern __checkReturn efx_rc_t 192283514Sarybchikefx_mcdi_bist_start( 193283514Sarybchik __in efx_nic_t *enp, 194283514Sarybchik __in efx_bist_type_t type); 195283514Sarybchik#endif /* EFSYS_OPT_BIST */ 196283514Sarybchik 197291436Sarybchikextern __checkReturn efx_rc_t 198283514Sarybchikefx_mcdi_get_resource_limits( 199283514Sarybchik __in efx_nic_t *enp, 200283514Sarybchik __out_opt uint32_t *nevqp, 201283514Sarybchik __out_opt uint32_t *nrxqp, 202283514Sarybchik __out_opt uint32_t *ntxqp); 203283514Sarybchik 204291436Sarybchikextern __checkReturn efx_rc_t 205283514Sarybchikefx_mcdi_log_ctrl( 206283514Sarybchik __in efx_nic_t *enp); 207283514Sarybchik 208291436Sarybchikextern __checkReturn efx_rc_t 209283514Sarybchikefx_mcdi_mac_stats_clear( 210283514Sarybchik __in efx_nic_t *enp); 211283514Sarybchik 212291436Sarybchikextern __checkReturn efx_rc_t 213283514Sarybchikefx_mcdi_mac_stats_upload( 214283514Sarybchik __in efx_nic_t *enp, 215283514Sarybchik __in efsys_mem_t *esmp); 216283514Sarybchik 217291436Sarybchikextern __checkReturn efx_rc_t 218283514Sarybchikefx_mcdi_mac_stats_periodic( 219283514Sarybchik __in efx_nic_t *enp, 220283514Sarybchik __in efsys_mem_t *esmp, 221312158Sarybchik __in uint16_t period_ms, 222283514Sarybchik __in boolean_t events); 223283514Sarybchik 224283514Sarybchik 225283514Sarybchik#if EFSYS_OPT_LOOPBACK 226291436Sarybchikextern __checkReturn efx_rc_t 227283514Sarybchikefx_mcdi_get_loopback_modes( 228283514Sarybchik __in efx_nic_t *enp); 229283514Sarybchik#endif /* EFSYS_OPT_LOOPBACK */ 230283514Sarybchik 231295467Sarybchikextern __checkReturn efx_rc_t 232295467Sarybchikefx_mcdi_phy_module_get_info( 233295467Sarybchik __in efx_nic_t *enp, 234295467Sarybchik __in uint8_t dev_addr, 235295467Sarybchik __in uint8_t offset, 236295467Sarybchik __in uint8_t len, 237295467Sarybchik __out_bcount(len) uint8_t *data); 238295467Sarybchik 239227569Sphilip#define MCDI_IN(_emr, _type, _ofst) \ 240227569Sphilip ((_type *)((_emr).emr_in_buf + (_ofst))) 241227569Sphilip 242227569Sphilip#define MCDI_IN2(_emr, _type, _ofst) \ 243227569Sphilip MCDI_IN(_emr, _type, MC_CMD_ ## _ofst ## _OFST) 244227569Sphilip 245227569Sphilip#define MCDI_IN_SET_BYTE(_emr, _ofst, _value) \ 246227569Sphilip EFX_POPULATE_BYTE_1(*MCDI_IN2(_emr, efx_byte_t, _ofst), \ 247227569Sphilip EFX_BYTE_0, _value) 248227569Sphilip 249283514Sarybchik#define MCDI_IN_SET_WORD(_emr, _ofst, _value) \ 250283514Sarybchik EFX_POPULATE_WORD_1(*MCDI_IN2(_emr, efx_word_t, _ofst), \ 251283514Sarybchik EFX_WORD_0, _value) 252283514Sarybchik 253227569Sphilip#define MCDI_IN_SET_DWORD(_emr, _ofst, _value) \ 254227569Sphilip EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 255227569Sphilip EFX_DWORD_0, _value) 256227569Sphilip 257283514Sarybchik#define MCDI_IN_SET_DWORD_FIELD(_emr, _ofst, _field, _value) \ 258283514Sarybchik EFX_SET_DWORD_FIELD(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 259283514Sarybchik MC_CMD_ ## _field, _value) 260283514Sarybchik 261227569Sphilip#define MCDI_IN_POPULATE_DWORD_1(_emr, _ofst, _field1, _value1) \ 262227569Sphilip EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 263227569Sphilip MC_CMD_ ## _field1, _value1) 264227569Sphilip 265227569Sphilip#define MCDI_IN_POPULATE_DWORD_2(_emr, _ofst, _field1, _value1, \ 266227569Sphilip _field2, _value2) \ 267227569Sphilip EFX_POPULATE_DWORD_2(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 268227569Sphilip MC_CMD_ ## _field1, _value1, \ 269227569Sphilip MC_CMD_ ## _field2, _value2) 270227569Sphilip 271227569Sphilip#define MCDI_IN_POPULATE_DWORD_3(_emr, _ofst, _field1, _value1, \ 272227569Sphilip _field2, _value2, _field3, _value3) \ 273227569Sphilip EFX_POPULATE_DWORD_3(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 274227569Sphilip MC_CMD_ ## _field1, _value1, \ 275227569Sphilip MC_CMD_ ## _field2, _value2, \ 276227569Sphilip MC_CMD_ ## _field3, _value3) 277227569Sphilip 278227569Sphilip#define MCDI_IN_POPULATE_DWORD_4(_emr, _ofst, _field1, _value1, \ 279227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4) \ 280227569Sphilip EFX_POPULATE_DWORD_4(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 281227569Sphilip MC_CMD_ ## _field1, _value1, \ 282227569Sphilip MC_CMD_ ## _field2, _value2, \ 283227569Sphilip MC_CMD_ ## _field3, _value3, \ 284227569Sphilip MC_CMD_ ## _field4, _value4) 285227569Sphilip 286227569Sphilip#define MCDI_IN_POPULATE_DWORD_5(_emr, _ofst, _field1, _value1, \ 287227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 288227569Sphilip _field5, _value5) \ 289227569Sphilip EFX_POPULATE_DWORD_5(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 290227569Sphilip MC_CMD_ ## _field1, _value1, \ 291227569Sphilip MC_CMD_ ## _field2, _value2, \ 292227569Sphilip MC_CMD_ ## _field3, _value3, \ 293227569Sphilip MC_CMD_ ## _field4, _value4, \ 294227569Sphilip MC_CMD_ ## _field5, _value5) 295227569Sphilip 296227569Sphilip#define MCDI_IN_POPULATE_DWORD_6(_emr, _ofst, _field1, _value1, \ 297227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 298227569Sphilip _field5, _value5, _field6, _value6) \ 299227569Sphilip EFX_POPULATE_DWORD_6(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 300227569Sphilip MC_CMD_ ## _field1, _value1, \ 301227569Sphilip MC_CMD_ ## _field2, _value2, \ 302227569Sphilip MC_CMD_ ## _field3, _value3, \ 303227569Sphilip MC_CMD_ ## _field4, _value4, \ 304227569Sphilip MC_CMD_ ## _field5, _value5, \ 305227569Sphilip MC_CMD_ ## _field6, _value6) 306227569Sphilip 307227569Sphilip#define MCDI_IN_POPULATE_DWORD_7(_emr, _ofst, _field1, _value1, \ 308227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 309227569Sphilip _field5, _value5, _field6, _value6, _field7, _value7) \ 310283514Sarybchik EFX_POPULATE_DWORD_7(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 311227569Sphilip MC_CMD_ ## _field1, _value1, \ 312227569Sphilip MC_CMD_ ## _field2, _value2, \ 313227569Sphilip MC_CMD_ ## _field3, _value3, \ 314227569Sphilip MC_CMD_ ## _field4, _value4, \ 315227569Sphilip MC_CMD_ ## _field5, _value5, \ 316227569Sphilip MC_CMD_ ## _field6, _value6, \ 317227569Sphilip MC_CMD_ ## _field7, _value7) 318227569Sphilip 319227569Sphilip#define MCDI_IN_POPULATE_DWORD_8(_emr, _ofst, _field1, _value1, \ 320227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 321227569Sphilip _field5, _value5, _field6, _value6, _field7, _value7, \ 322227569Sphilip _field8, _value8) \ 323227569Sphilip EFX_POPULATE_DWORD_8(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 324227569Sphilip MC_CMD_ ## _field1, _value1, \ 325227569Sphilip MC_CMD_ ## _field2, _value2, \ 326227569Sphilip MC_CMD_ ## _field3, _value3, \ 327227569Sphilip MC_CMD_ ## _field4, _value4, \ 328227569Sphilip MC_CMD_ ## _field5, _value5, \ 329227569Sphilip MC_CMD_ ## _field6, _value6, \ 330227569Sphilip MC_CMD_ ## _field7, _value7, \ 331227569Sphilip MC_CMD_ ## _field8, _value8) 332227569Sphilip 333227569Sphilip#define MCDI_IN_POPULATE_DWORD_9(_emr, _ofst, _field1, _value1, \ 334227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 335227569Sphilip _field5, _value5, _field6, _value6, _field7, _value7, \ 336227569Sphilip _field8, _value8, _field9, _value9) \ 337227569Sphilip EFX_POPULATE_DWORD_9(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 338227569Sphilip MC_CMD_ ## _field1, _value1, \ 339227569Sphilip MC_CMD_ ## _field2, _value2, \ 340227569Sphilip MC_CMD_ ## _field3, _value3, \ 341227569Sphilip MC_CMD_ ## _field4, _value4, \ 342227569Sphilip MC_CMD_ ## _field5, _value5, \ 343227569Sphilip MC_CMD_ ## _field6, _value6, \ 344227569Sphilip MC_CMD_ ## _field7, _value7, \ 345227569Sphilip MC_CMD_ ## _field8, _value8, \ 346227569Sphilip MC_CMD_ ## _field9, _value9) 347227569Sphilip 348227569Sphilip#define MCDI_IN_POPULATE_DWORD_10(_emr, _ofst, _field1, _value1, \ 349227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 350227569Sphilip _field5, _value5, _field6, _value6, _field7, _value7, \ 351227569Sphilip _field8, _value8, _field9, _value9, _field10, _value10) \ 352227569Sphilip EFX_POPULATE_DWORD_10(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 353227569Sphilip MC_CMD_ ## _field1, _value1, \ 354227569Sphilip MC_CMD_ ## _field2, _value2, \ 355227569Sphilip MC_CMD_ ## _field3, _value3, \ 356227569Sphilip MC_CMD_ ## _field4, _value4, \ 357227569Sphilip MC_CMD_ ## _field5, _value5, \ 358227569Sphilip MC_CMD_ ## _field6, _value6, \ 359227569Sphilip MC_CMD_ ## _field7, _value7, \ 360227569Sphilip MC_CMD_ ## _field8, _value8, \ 361227569Sphilip MC_CMD_ ## _field9, _value9, \ 362227569Sphilip MC_CMD_ ## _field10, _value10) 363227569Sphilip 364227569Sphilip#define MCDI_OUT(_emr, _type, _ofst) \ 365227569Sphilip ((_type *)((_emr).emr_out_buf + (_ofst))) 366227569Sphilip 367227569Sphilip#define MCDI_OUT2(_emr, _type, _ofst) \ 368227569Sphilip MCDI_OUT(_emr, _type, MC_CMD_ ## _ofst ## _OFST) 369227569Sphilip 370227569Sphilip#define MCDI_OUT_BYTE(_emr, _ofst) \ 371227569Sphilip EFX_BYTE_FIELD(*MCDI_OUT2(_emr, efx_byte_t, _ofst), \ 372227569Sphilip EFX_BYTE_0) 373227569Sphilip 374227569Sphilip#define MCDI_OUT_WORD(_emr, _ofst) \ 375227569Sphilip EFX_WORD_FIELD(*MCDI_OUT2(_emr, efx_word_t, _ofst), \ 376227569Sphilip EFX_WORD_0) 377227569Sphilip 378227569Sphilip#define MCDI_OUT_DWORD(_emr, _ofst) \ 379227569Sphilip EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst), \ 380227569Sphilip EFX_DWORD_0) 381227569Sphilip 382227569Sphilip#define MCDI_OUT_DWORD_FIELD(_emr, _ofst, _field) \ 383227569Sphilip EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst), \ 384227569Sphilip MC_CMD_ ## _field) 385227569Sphilip 386227569Sphilip#define MCDI_EV_FIELD(_eqp, _field) \ 387278942Sarybchik EFX_QWORD_FIELD(*_eqp, MCDI_EVENT_ ## _field) 388227569Sphilip 389283514Sarybchik#define MCDI_CMD_DWORD_FIELD(_edp, _field) \ 390279048Sarybchik EFX_DWORD_FIELD(*_edp, MC_CMD_ ## _field) 391279048Sarybchik 392292055Sarybchik#define EFX_MCDI_HAVE_PRIVILEGE(mask, priv) \ 393292055Sarybchik (((mask) & (MC_CMD_PRIVILEGE_MASK_IN_GRP_ ## priv)) == \ 394292052Sarybchik (MC_CMD_PRIVILEGE_MASK_IN_GRP_ ## priv)) 395292052Sarybchik 396350409Sarybchik#define EFX_MCDI_BUF_SIZE(_in_len, _out_len) \ 397350409Sarybchik EFX_P2ROUNDUP(size_t, \ 398350409Sarybchik MAX(MAX(_in_len, _out_len), (2 * sizeof (efx_dword_t))),\ 399350409Sarybchik sizeof (efx_dword_t)) 400350409Sarybchik 401342445Sarybchik/* 402342445Sarybchik * The buffer size must be a multiple of dword to ensure that MCDI works 403342445Sarybchik * properly with Siena based boards (which use on-chip buffer). Also, it 404342445Sarybchik * should be at minimum the size of two dwords to allow space for extended 405342445Sarybchik * error responses if the request/response buffer sizes are smaller. 406342445Sarybchik */ 407342445Sarybchik#define EFX_MCDI_DECLARE_BUF(_name, _in_len, _out_len) \ 408350409Sarybchik uint8_t _name[EFX_MCDI_BUF_SIZE(_in_len, _out_len)] = {0} 409342445Sarybchik 410292055Sarybchiktypedef enum efx_mcdi_feature_id_e { 411292055Sarybchik EFX_MCDI_FEATURE_FW_UPDATE = 0, 412292055Sarybchik EFX_MCDI_FEATURE_LINK_CONTROL, 413292055Sarybchik EFX_MCDI_FEATURE_MACADDR_CHANGE, 414292055Sarybchik EFX_MCDI_FEATURE_MAC_SPOOFING, 415292055Sarybchik EFX_MCDI_FEATURE_NIDS 416292055Sarybchik} efx_mcdi_feature_id_t; 417292055Sarybchik 418227569Sphilip#ifdef __cplusplus 419227569Sphilip} 420227569Sphilip#endif 421227569Sphilip 422227569Sphilip#endif /* _SYS_EFX_MCDI_H */ 423