efx_mcdi.h revision 292007
1227569Sphilip/*- 2283514Sarybchik * Copyright (c) 2009-2015 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: head/sys/dev/sfxge/common/efx_mcdi.h 292007 2015-12-09 06:14:47Z arybchik $ 31227569Sphilip */ 32227569Sphilip 33227569Sphilip#ifndef _SYS_EFX_MCDI_H 34227569Sphilip#define _SYS_EFX_MCDI_H 35227569Sphilip 36227569Sphilip#include "efx.h" 37227569Sphilip#include "efx_regs.h" 38227569Sphilip#include "efx_regs_mcdi.h" 39227569Sphilip 40227569Sphilip#ifdef __cplusplus 41227569Sphilipextern "C" { 42227569Sphilip#endif 43227569Sphilip 44283514Sarybchik/* 45283514Sarybchik * A reboot/assertion causes the MCDI status word to be set after the 46283514Sarybchik * command word is set or a REBOOT event is sent. If we notice a reboot 47283514Sarybchik * via these mechanisms then wait 10ms for the status word to be set. 48283514Sarybchik */ 49283514Sarybchik#define EFX_MCDI_STATUS_SLEEP_US 10000 50227569Sphilip 51227569Sphilipstruct efx_mcdi_req_s { 52283514Sarybchik boolean_t emr_quiet; 53227569Sphilip /* Inputs: Command #, input buffer and length */ 54227569Sphilip unsigned int emr_cmd; 55227569Sphilip uint8_t *emr_in_buf; 56227569Sphilip size_t emr_in_length; 57227569Sphilip /* Outputs: retcode, buffer, length, and length used*/ 58227569Sphilip int emr_rc; 59227569Sphilip uint8_t *emr_out_buf; 60227569Sphilip size_t emr_out_length; 61227569Sphilip size_t emr_out_length_used; 62292007Sarybchik /* Internals: low level transport details */ 63292007Sarybchik unsigned int emr_err_code; 64292007Sarybchik unsigned int emr_err_arg; 65227569Sphilip}; 66227569Sphilip 67227569Sphiliptypedef struct efx_mcdi_iface_s { 68227569Sphilip unsigned int emi_port; 69227569Sphilip unsigned int emi_seq; 70227569Sphilip efx_mcdi_req_t *emi_pending_req; 71227569Sphilip boolean_t emi_ev_cpl; 72283514Sarybchik boolean_t emi_new_epoch; 73227569Sphilip int emi_aborted; 74227569Sphilip uint32_t emi_poll_cnt; 75283514Sarybchik uint32_t emi_mc_reboot_status; 76227569Sphilip} efx_mcdi_iface_t; 77227569Sphilip 78227569Sphilipextern void 79227569Sphilipefx_mcdi_execute( 80227569Sphilip __in efx_nic_t *enp, 81283514Sarybchik __inout efx_mcdi_req_t *emrp); 82227569Sphilip 83227569Sphilipextern void 84283514Sarybchikefx_mcdi_execute_quiet( 85283514Sarybchik __in efx_nic_t *enp, 86283514Sarybchik __inout efx_mcdi_req_t *emrp); 87283514Sarybchik 88292007Sarybchik extern void 89292007Sarybchikefx_mcdi_read_response_header( 90292007Sarybchik __in efx_nic_t *enp, 91292007Sarybchik __inout efx_mcdi_req_t *emrp); 92292007Sarybchik 93283514Sarybchikextern void 94227569Sphilipefx_mcdi_ev_cpl( 95227569Sphilip __in efx_nic_t *enp, 96227569Sphilip __in unsigned int seq, 97227569Sphilip __in unsigned int outlen, 98227569Sphilip __in int errcode); 99227569Sphilip 100227569Sphilipextern void 101227569Sphilipefx_mcdi_ev_death( 102227569Sphilip __in efx_nic_t *enp, 103227569Sphilip __in int rc); 104227569Sphilip 105291436Sarybchikextern __checkReturn efx_rc_t 106283514Sarybchikefx_mcdi_request_errcode( 107283514Sarybchik __in unsigned int err); 108283514Sarybchik 109283514Sarybchikextern void 110283514Sarybchikefx_mcdi_raise_exception( 111283514Sarybchik __in efx_nic_t *enp, 112283514Sarybchik __in_opt efx_mcdi_req_t *emrp, 113283514Sarybchik __in int rc); 114283514Sarybchik 115227569Sphiliptypedef enum efx_mcdi_boot_e { 116227569Sphilip EFX_MCDI_BOOT_PRIMARY, 117227569Sphilip EFX_MCDI_BOOT_SECONDARY, 118227569Sphilip EFX_MCDI_BOOT_ROM, 119227569Sphilip} efx_mcdi_boot_t; 120227569Sphilip 121291436Sarybchikextern __checkReturn efx_rc_t 122227569Sphilipefx_mcdi_version( 123227569Sphilip __in efx_nic_t *enp, 124227569Sphilip __out_ecount_opt(4) uint16_t versionp[4], 125227569Sphilip __out_opt uint32_t *buildp, 126227569Sphilip __out_opt efx_mcdi_boot_t *statusp); 127227569Sphilip 128291436Sarybchikextern __checkReturn efx_rc_t 129283514Sarybchikefx_mcdi_read_assertion( 130283514Sarybchik __in efx_nic_t *enp); 131283514Sarybchik 132291436Sarybchikextern __checkReturn efx_rc_t 133283514Sarybchikefx_mcdi_exit_assertion_handler( 134283514Sarybchik __in efx_nic_t *enp); 135283514Sarybchik 136291436Sarybchikextern __checkReturn efx_rc_t 137283514Sarybchikefx_mcdi_drv_attach( 138283514Sarybchik __in efx_nic_t *enp, 139283514Sarybchik __in boolean_t attach); 140283514Sarybchik 141291436Sarybchikextern __checkReturn efx_rc_t 142283514Sarybchikefx_mcdi_get_board_cfg( 143283514Sarybchik __in efx_nic_t *enp, 144283514Sarybchik __out_opt uint32_t *board_typep, 145283514Sarybchik __out_opt efx_dword_t *capabilitiesp, 146283514Sarybchik __out_ecount_opt(6) uint8_t mac_addrp[6]); 147283514Sarybchik 148291436Sarybchikextern __checkReturn efx_rc_t 149283514Sarybchikefx_mcdi_get_phy_cfg( 150283514Sarybchik __in efx_nic_t *enp); 151283514Sarybchik 152291436Sarybchikextern __checkReturn efx_rc_t 153283514Sarybchikefx_mcdi_firmware_update_supported( 154283514Sarybchik __in efx_nic_t *enp, 155283514Sarybchik __out boolean_t *supportedp); 156283514Sarybchik 157291436Sarybchikextern __checkReturn efx_rc_t 158283514Sarybchikefx_mcdi_macaddr_change_supported( 159283514Sarybchik __in efx_nic_t *enp, 160283514Sarybchik __out boolean_t *supportedp); 161283514Sarybchik 162291588Sarybchikextern __checkReturn efx_rc_t 163291588Sarybchikefx_mcdi_link_control_supported( 164291588Sarybchik __in efx_nic_t *enp, 165291588Sarybchik __out boolean_t *supportedp); 166291588Sarybchik 167283514Sarybchik#if EFSYS_OPT_BIST 168283514Sarybchik#if EFSYS_OPT_HUNTINGTON 169291436Sarybchikextern __checkReturn efx_rc_t 170283514Sarybchikefx_mcdi_bist_enable_offline( 171283514Sarybchik __in efx_nic_t *enp); 172283514Sarybchik#endif /* EFSYS_OPT_HUNTINGTON */ 173291436Sarybchikextern __checkReturn efx_rc_t 174283514Sarybchikefx_mcdi_bist_start( 175283514Sarybchik __in efx_nic_t *enp, 176283514Sarybchik __in efx_bist_type_t type); 177283514Sarybchik#endif /* EFSYS_OPT_BIST */ 178283514Sarybchik 179291436Sarybchikextern __checkReturn efx_rc_t 180283514Sarybchikefx_mcdi_get_resource_limits( 181283514Sarybchik __in efx_nic_t *enp, 182283514Sarybchik __out_opt uint32_t *nevqp, 183283514Sarybchik __out_opt uint32_t *nrxqp, 184283514Sarybchik __out_opt uint32_t *ntxqp); 185283514Sarybchik 186291436Sarybchikextern __checkReturn efx_rc_t 187283514Sarybchikefx_mcdi_log_ctrl( 188283514Sarybchik __in efx_nic_t *enp); 189283514Sarybchik 190291436Sarybchikextern __checkReturn efx_rc_t 191283514Sarybchikefx_mcdi_mac_stats_clear( 192283514Sarybchik __in efx_nic_t *enp); 193283514Sarybchik 194291436Sarybchikextern __checkReturn efx_rc_t 195283514Sarybchikefx_mcdi_mac_stats_upload( 196283514Sarybchik __in efx_nic_t *enp, 197283514Sarybchik __in efsys_mem_t *esmp); 198283514Sarybchik 199291436Sarybchikextern __checkReturn efx_rc_t 200283514Sarybchikefx_mcdi_mac_stats_periodic( 201283514Sarybchik __in efx_nic_t *enp, 202283514Sarybchik __in efsys_mem_t *esmp, 203283514Sarybchik __in uint16_t period, 204283514Sarybchik __in boolean_t events); 205283514Sarybchik 206283514Sarybchik 207283514Sarybchik#if EFSYS_OPT_LOOPBACK 208291436Sarybchikextern __checkReturn efx_rc_t 209283514Sarybchikefx_mcdi_get_loopback_modes( 210283514Sarybchik __in efx_nic_t *enp); 211283514Sarybchik#endif /* EFSYS_OPT_LOOPBACK */ 212283514Sarybchik 213227569Sphilip#define MCDI_IN(_emr, _type, _ofst) \ 214227569Sphilip ((_type *)((_emr).emr_in_buf + (_ofst))) 215227569Sphilip 216227569Sphilip#define MCDI_IN2(_emr, _type, _ofst) \ 217227569Sphilip MCDI_IN(_emr, _type, MC_CMD_ ## _ofst ## _OFST) 218227569Sphilip 219227569Sphilip#define MCDI_IN_SET_BYTE(_emr, _ofst, _value) \ 220227569Sphilip EFX_POPULATE_BYTE_1(*MCDI_IN2(_emr, efx_byte_t, _ofst), \ 221227569Sphilip EFX_BYTE_0, _value) 222227569Sphilip 223283514Sarybchik#define MCDI_IN_SET_WORD(_emr, _ofst, _value) \ 224283514Sarybchik EFX_POPULATE_WORD_1(*MCDI_IN2(_emr, efx_word_t, _ofst), \ 225283514Sarybchik EFX_WORD_0, _value) 226283514Sarybchik 227227569Sphilip#define MCDI_IN_SET_DWORD(_emr, _ofst, _value) \ 228227569Sphilip EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 229227569Sphilip EFX_DWORD_0, _value) 230227569Sphilip 231283514Sarybchik#define MCDI_IN_SET_DWORD_FIELD(_emr, _ofst, _field, _value) \ 232283514Sarybchik EFX_SET_DWORD_FIELD(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 233283514Sarybchik MC_CMD_ ## _field, _value) 234283514Sarybchik 235227569Sphilip#define MCDI_IN_POPULATE_DWORD_1(_emr, _ofst, _field1, _value1) \ 236227569Sphilip EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 237227569Sphilip MC_CMD_ ## _field1, _value1) 238227569Sphilip 239227569Sphilip#define MCDI_IN_POPULATE_DWORD_2(_emr, _ofst, _field1, _value1, \ 240227569Sphilip _field2, _value2) \ 241227569Sphilip EFX_POPULATE_DWORD_2(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 242227569Sphilip MC_CMD_ ## _field1, _value1, \ 243227569Sphilip MC_CMD_ ## _field2, _value2) 244227569Sphilip 245227569Sphilip#define MCDI_IN_POPULATE_DWORD_3(_emr, _ofst, _field1, _value1, \ 246227569Sphilip _field2, _value2, _field3, _value3) \ 247227569Sphilip EFX_POPULATE_DWORD_3(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 248227569Sphilip MC_CMD_ ## _field1, _value1, \ 249227569Sphilip MC_CMD_ ## _field2, _value2, \ 250227569Sphilip MC_CMD_ ## _field3, _value3) 251227569Sphilip 252227569Sphilip#define MCDI_IN_POPULATE_DWORD_4(_emr, _ofst, _field1, _value1, \ 253227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4) \ 254227569Sphilip EFX_POPULATE_DWORD_4(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 255227569Sphilip MC_CMD_ ## _field1, _value1, \ 256227569Sphilip MC_CMD_ ## _field2, _value2, \ 257227569Sphilip MC_CMD_ ## _field3, _value3, \ 258227569Sphilip MC_CMD_ ## _field4, _value4) 259227569Sphilip 260227569Sphilip#define MCDI_IN_POPULATE_DWORD_5(_emr, _ofst, _field1, _value1, \ 261227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 262227569Sphilip _field5, _value5) \ 263227569Sphilip EFX_POPULATE_DWORD_5(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 264227569Sphilip MC_CMD_ ## _field1, _value1, \ 265227569Sphilip MC_CMD_ ## _field2, _value2, \ 266227569Sphilip MC_CMD_ ## _field3, _value3, \ 267227569Sphilip MC_CMD_ ## _field4, _value4, \ 268227569Sphilip MC_CMD_ ## _field5, _value5) 269227569Sphilip 270227569Sphilip#define MCDI_IN_POPULATE_DWORD_6(_emr, _ofst, _field1, _value1, \ 271227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 272227569Sphilip _field5, _value5, _field6, _value6) \ 273227569Sphilip EFX_POPULATE_DWORD_6(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 274227569Sphilip MC_CMD_ ## _field1, _value1, \ 275227569Sphilip MC_CMD_ ## _field2, _value2, \ 276227569Sphilip MC_CMD_ ## _field3, _value3, \ 277227569Sphilip MC_CMD_ ## _field4, _value4, \ 278227569Sphilip MC_CMD_ ## _field5, _value5, \ 279227569Sphilip MC_CMD_ ## _field6, _value6) 280227569Sphilip 281227569Sphilip#define MCDI_IN_POPULATE_DWORD_7(_emr, _ofst, _field1, _value1, \ 282227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 283227569Sphilip _field5, _value5, _field6, _value6, _field7, _value7) \ 284283514Sarybchik EFX_POPULATE_DWORD_7(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 285227569Sphilip MC_CMD_ ## _field1, _value1, \ 286227569Sphilip MC_CMD_ ## _field2, _value2, \ 287227569Sphilip MC_CMD_ ## _field3, _value3, \ 288227569Sphilip MC_CMD_ ## _field4, _value4, \ 289227569Sphilip MC_CMD_ ## _field5, _value5, \ 290227569Sphilip MC_CMD_ ## _field6, _value6, \ 291227569Sphilip MC_CMD_ ## _field7, _value7) 292227569Sphilip 293227569Sphilip#define MCDI_IN_POPULATE_DWORD_8(_emr, _ofst, _field1, _value1, \ 294227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 295227569Sphilip _field5, _value5, _field6, _value6, _field7, _value7, \ 296227569Sphilip _field8, _value8) \ 297227569Sphilip EFX_POPULATE_DWORD_8(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 298227569Sphilip MC_CMD_ ## _field1, _value1, \ 299227569Sphilip MC_CMD_ ## _field2, _value2, \ 300227569Sphilip MC_CMD_ ## _field3, _value3, \ 301227569Sphilip MC_CMD_ ## _field4, _value4, \ 302227569Sphilip MC_CMD_ ## _field5, _value5, \ 303227569Sphilip MC_CMD_ ## _field6, _value6, \ 304227569Sphilip MC_CMD_ ## _field7, _value7, \ 305227569Sphilip MC_CMD_ ## _field8, _value8) 306227569Sphilip 307227569Sphilip#define MCDI_IN_POPULATE_DWORD_9(_emr, _ofst, _field1, _value1, \ 308227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 309227569Sphilip _field5, _value5, _field6, _value6, _field7, _value7, \ 310227569Sphilip _field8, _value8, _field9, _value9) \ 311227569Sphilip EFX_POPULATE_DWORD_9(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 312227569Sphilip MC_CMD_ ## _field1, _value1, \ 313227569Sphilip MC_CMD_ ## _field2, _value2, \ 314227569Sphilip MC_CMD_ ## _field3, _value3, \ 315227569Sphilip MC_CMD_ ## _field4, _value4, \ 316227569Sphilip MC_CMD_ ## _field5, _value5, \ 317227569Sphilip MC_CMD_ ## _field6, _value6, \ 318227569Sphilip MC_CMD_ ## _field7, _value7, \ 319227569Sphilip MC_CMD_ ## _field8, _value8, \ 320227569Sphilip MC_CMD_ ## _field9, _value9) 321227569Sphilip 322227569Sphilip#define MCDI_IN_POPULATE_DWORD_10(_emr, _ofst, _field1, _value1, \ 323227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 324227569Sphilip _field5, _value5, _field6, _value6, _field7, _value7, \ 325227569Sphilip _field8, _value8, _field9, _value9, _field10, _value10) \ 326227569Sphilip EFX_POPULATE_DWORD_10(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 327227569Sphilip MC_CMD_ ## _field1, _value1, \ 328227569Sphilip MC_CMD_ ## _field2, _value2, \ 329227569Sphilip MC_CMD_ ## _field3, _value3, \ 330227569Sphilip MC_CMD_ ## _field4, _value4, \ 331227569Sphilip MC_CMD_ ## _field5, _value5, \ 332227569Sphilip MC_CMD_ ## _field6, _value6, \ 333227569Sphilip MC_CMD_ ## _field7, _value7, \ 334227569Sphilip MC_CMD_ ## _field8, _value8, \ 335227569Sphilip MC_CMD_ ## _field9, _value9, \ 336227569Sphilip MC_CMD_ ## _field10, _value10) 337227569Sphilip 338227569Sphilip#define MCDI_OUT(_emr, _type, _ofst) \ 339227569Sphilip ((_type *)((_emr).emr_out_buf + (_ofst))) 340227569Sphilip 341227569Sphilip#define MCDI_OUT2(_emr, _type, _ofst) \ 342227569Sphilip MCDI_OUT(_emr, _type, MC_CMD_ ## _ofst ## _OFST) 343227569Sphilip 344227569Sphilip#define MCDI_OUT_BYTE(_emr, _ofst) \ 345227569Sphilip EFX_BYTE_FIELD(*MCDI_OUT2(_emr, efx_byte_t, _ofst), \ 346227569Sphilip EFX_BYTE_0) 347227569Sphilip 348227569Sphilip#define MCDI_OUT_WORD(_emr, _ofst) \ 349227569Sphilip EFX_WORD_FIELD(*MCDI_OUT2(_emr, efx_word_t, _ofst), \ 350227569Sphilip EFX_WORD_0) 351227569Sphilip 352227569Sphilip#define MCDI_OUT_DWORD(_emr, _ofst) \ 353227569Sphilip EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst), \ 354227569Sphilip EFX_DWORD_0) 355227569Sphilip 356227569Sphilip#define MCDI_OUT_DWORD_FIELD(_emr, _ofst, _field) \ 357227569Sphilip EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst), \ 358227569Sphilip MC_CMD_ ## _field) 359227569Sphilip 360227569Sphilip#define MCDI_EV_FIELD(_eqp, _field) \ 361278942Sarybchik EFX_QWORD_FIELD(*_eqp, MCDI_EVENT_ ## _field) 362227569Sphilip 363283514Sarybchik#define MCDI_CMD_DWORD_FIELD(_edp, _field) \ 364279048Sarybchik EFX_DWORD_FIELD(*_edp, MC_CMD_ ## _field) 365279048Sarybchik 366227569Sphilip#ifdef __cplusplus 367227569Sphilip} 368227569Sphilip#endif 369227569Sphilip 370227569Sphilip#endif /* _SYS_EFX_MCDI_H */ 371