1227569Sphilip/*- 2227569Sphilip * Copyright 2009 Solarflare Communications Inc. All rights reserved. 3227569Sphilip * 4227569Sphilip * Redistribution and use in source and binary forms, with or without 5227569Sphilip * modification, are permitted provided that the following conditions 6227569Sphilip * are met: 7227569Sphilip * 1. Redistributions of source code must retain the above copyright 8227569Sphilip * notice, this list of conditions and the following disclaimer. 9227569Sphilip * 2. Redistributions in binary form must reproduce the above copyright 10227569Sphilip * notice, this list of conditions and the following disclaimer in the 11227569Sphilip * documentation and/or other materials provided with the distribution. 12227569Sphilip * 13227569Sphilip * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS AND 14227569Sphilip * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15227569Sphilip * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16227569Sphilip * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17227569Sphilip * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18227569Sphilip * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19227569Sphilip * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20227569Sphilip * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21227569Sphilip * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22227569Sphilip * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23227569Sphilip * SUCH DAMAGE. 24228078Sphilip * 25228078Sphilip * $FreeBSD$ 26227569Sphilip */ 27227569Sphilip 28227569Sphilip#ifndef _SYS_EFX_MCDI_H 29227569Sphilip#define _SYS_EFX_MCDI_H 30227569Sphilip 31227569Sphilip#include "efx.h" 32227569Sphilip#include "efx_regs.h" 33227569Sphilip#include "efx_regs_mcdi.h" 34227569Sphilip 35227569Sphilip#ifdef __cplusplus 36227569Sphilipextern "C" { 37227569Sphilip#endif 38227569Sphilip 39227569Sphilip/* Number of retries attempted for init code */ 40227569Sphilip#define EFX_MCDI_REQ_RETRY_INIT 2 41227569Sphilip 42227569Sphilipstruct efx_mcdi_req_s { 43227569Sphilip /* Inputs: Command #, input buffer and length */ 44227569Sphilip unsigned int emr_cmd; 45227569Sphilip uint8_t *emr_in_buf; 46227569Sphilip size_t emr_in_length; 47227569Sphilip /* Outputs: retcode, buffer, length, and length used*/ 48227569Sphilip int emr_rc; 49227569Sphilip uint8_t *emr_out_buf; 50227569Sphilip size_t emr_out_length; 51227569Sphilip size_t emr_out_length_used; 52227569Sphilip}; 53227569Sphilip 54227569Sphiliptypedef struct efx_mcdi_iface_s { 55227569Sphilip const efx_mcdi_transport_t *emi_mtp; 56227569Sphilip unsigned int emi_port; 57227569Sphilip unsigned int emi_seq; 58227569Sphilip efx_mcdi_req_t *emi_pending_req; 59227569Sphilip boolean_t emi_ev_cpl; 60227569Sphilip int emi_aborted; 61227569Sphilip uint32_t emi_poll_cnt; 62227569Sphilip} efx_mcdi_iface_t; 63227569Sphilip 64227569Sphilipextern void 65227569Sphilipefx_mcdi_execute( 66227569Sphilip __in efx_nic_t *enp, 67227569Sphilip __in efx_mcdi_req_t *emrp); 68227569Sphilip 69227569Sphilipextern void 70227569Sphilipefx_mcdi_ev_cpl( 71227569Sphilip __in efx_nic_t *enp, 72227569Sphilip __in unsigned int seq, 73227569Sphilip __in unsigned int outlen, 74227569Sphilip __in int errcode); 75227569Sphilip 76227569Sphilipextern void 77227569Sphilipefx_mcdi_ev_death( 78227569Sphilip __in efx_nic_t *enp, 79227569Sphilip __in int rc); 80227569Sphilip 81227569Sphiliptypedef enum efx_mcdi_boot_e { 82227569Sphilip EFX_MCDI_BOOT_PRIMARY, 83227569Sphilip EFX_MCDI_BOOT_SECONDARY, 84227569Sphilip EFX_MCDI_BOOT_ROM, 85227569Sphilip} efx_mcdi_boot_t; 86227569Sphilip 87227569Sphilipextern __checkReturn int 88227569Sphilipefx_mcdi_version( 89227569Sphilip __in efx_nic_t *enp, 90227569Sphilip __out_ecount_opt(4) uint16_t versionp[4], 91227569Sphilip __out_opt uint32_t *buildp, 92227569Sphilip __out_opt efx_mcdi_boot_t *statusp); 93227569Sphilip 94227569Sphilip#define MCDI_IN(_emr, _type, _ofst) \ 95227569Sphilip ((_type *)((_emr).emr_in_buf + (_ofst))) 96227569Sphilip 97227569Sphilip#define MCDI_IN2(_emr, _type, _ofst) \ 98227569Sphilip MCDI_IN(_emr, _type, MC_CMD_ ## _ofst ## _OFST) 99227569Sphilip 100227569Sphilip#define MCDI_IN_SET_BYTE(_emr, _ofst, _value) \ 101227569Sphilip EFX_POPULATE_BYTE_1(*MCDI_IN2(_emr, efx_byte_t, _ofst), \ 102227569Sphilip EFX_BYTE_0, _value) 103227569Sphilip 104227569Sphilip#define MCDI_IN_SET_DWORD(_emr, _ofst, _value) \ 105227569Sphilip EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 106227569Sphilip EFX_DWORD_0, _value) 107227569Sphilip 108227569Sphilip#define MCDI_IN_POPULATE_DWORD_1(_emr, _ofst, _field1, _value1) \ 109227569Sphilip EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 110227569Sphilip MC_CMD_ ## _field1, _value1) 111227569Sphilip 112227569Sphilip#define MCDI_IN_POPULATE_DWORD_2(_emr, _ofst, _field1, _value1, \ 113227569Sphilip _field2, _value2) \ 114227569Sphilip EFX_POPULATE_DWORD_2(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 115227569Sphilip MC_CMD_ ## _field1, _value1, \ 116227569Sphilip MC_CMD_ ## _field2, _value2) 117227569Sphilip 118227569Sphilip#define MCDI_IN_POPULATE_DWORD_3(_emr, _ofst, _field1, _value1, \ 119227569Sphilip _field2, _value2, _field3, _value3) \ 120227569Sphilip EFX_POPULATE_DWORD_3(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 121227569Sphilip MC_CMD_ ## _field1, _value1, \ 122227569Sphilip MC_CMD_ ## _field2, _value2, \ 123227569Sphilip MC_CMD_ ## _field3, _value3) 124227569Sphilip 125227569Sphilip#define MCDI_IN_POPULATE_DWORD_4(_emr, _ofst, _field1, _value1, \ 126227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4) \ 127227569Sphilip EFX_POPULATE_DWORD_4(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 128227569Sphilip MC_CMD_ ## _field1, _value1, \ 129227569Sphilip MC_CMD_ ## _field2, _value2, \ 130227569Sphilip MC_CMD_ ## _field3, _value3, \ 131227569Sphilip MC_CMD_ ## _field4, _value4) 132227569Sphilip 133227569Sphilip#define MCDI_IN_POPULATE_DWORD_5(_emr, _ofst, _field1, _value1, \ 134227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 135227569Sphilip _field5, _value5) \ 136227569Sphilip EFX_POPULATE_DWORD_5(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 137227569Sphilip MC_CMD_ ## _field1, _value1, \ 138227569Sphilip MC_CMD_ ## _field2, _value2, \ 139227569Sphilip MC_CMD_ ## _field3, _value3, \ 140227569Sphilip MC_CMD_ ## _field4, _value4, \ 141227569Sphilip MC_CMD_ ## _field5, _value5) 142227569Sphilip 143227569Sphilip#define MCDI_IN_POPULATE_DWORD_6(_emr, _ofst, _field1, _value1, \ 144227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 145227569Sphilip _field5, _value5, _field6, _value6) \ 146227569Sphilip EFX_POPULATE_DWORD_6(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 147227569Sphilip MC_CMD_ ## _field1, _value1, \ 148227569Sphilip MC_CMD_ ## _field2, _value2, \ 149227569Sphilip MC_CMD_ ## _field3, _value3, \ 150227569Sphilip MC_CMD_ ## _field4, _value4, \ 151227569Sphilip MC_CMD_ ## _field5, _value5, \ 152227569Sphilip MC_CMD_ ## _field6, _value6) 153227569Sphilip 154227569Sphilip#define MCDI_IN_POPULATE_DWORD_7(_emr, _ofst, _field1, _value1, \ 155227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 156227569Sphilip _field5, _value5, _field6, _value6, _field7, _value7) \ 157227569Sphilip EFX_POPULATE_DWORD_7(MCDI_IN2(_emr, efx_dword_t, _ofst), \ 158227569Sphilip MC_CMD_ ## _field1, _value1, \ 159227569Sphilip MC_CMD_ ## _field2, _value2, \ 160227569Sphilip MC_CMD_ ## _field3, _value3, \ 161227569Sphilip MC_CMD_ ## _field4, _value4, \ 162227569Sphilip MC_CMD_ ## _field5, _value5, \ 163227569Sphilip MC_CMD_ ## _field6, _value6, \ 164227569Sphilip MC_CMD_ ## _field7, _value7) 165227569Sphilip 166227569Sphilip#define MCDI_IN_POPULATE_DWORD_8(_emr, _ofst, _field1, _value1, \ 167227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 168227569Sphilip _field5, _value5, _field6, _value6, _field7, _value7, \ 169227569Sphilip _field8, _value8) \ 170227569Sphilip EFX_POPULATE_DWORD_8(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 171227569Sphilip MC_CMD_ ## _field1, _value1, \ 172227569Sphilip MC_CMD_ ## _field2, _value2, \ 173227569Sphilip MC_CMD_ ## _field3, _value3, \ 174227569Sphilip MC_CMD_ ## _field4, _value4, \ 175227569Sphilip MC_CMD_ ## _field5, _value5, \ 176227569Sphilip MC_CMD_ ## _field6, _value6, \ 177227569Sphilip MC_CMD_ ## _field7, _value7, \ 178227569Sphilip MC_CMD_ ## _field8, _value8) 179227569Sphilip 180227569Sphilip#define MCDI_IN_POPULATE_DWORD_9(_emr, _ofst, _field1, _value1, \ 181227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 182227569Sphilip _field5, _value5, _field6, _value6, _field7, _value7, \ 183227569Sphilip _field8, _value8, _field9, _value9) \ 184227569Sphilip EFX_POPULATE_DWORD_9(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 185227569Sphilip MC_CMD_ ## _field1, _value1, \ 186227569Sphilip MC_CMD_ ## _field2, _value2, \ 187227569Sphilip MC_CMD_ ## _field3, _value3, \ 188227569Sphilip MC_CMD_ ## _field4, _value4, \ 189227569Sphilip MC_CMD_ ## _field5, _value5, \ 190227569Sphilip MC_CMD_ ## _field6, _value6, \ 191227569Sphilip MC_CMD_ ## _field7, _value7, \ 192227569Sphilip MC_CMD_ ## _field8, _value8, \ 193227569Sphilip MC_CMD_ ## _field9, _value9) 194227569Sphilip 195227569Sphilip#define MCDI_IN_POPULATE_DWORD_10(_emr, _ofst, _field1, _value1, \ 196227569Sphilip _field2, _value2, _field3, _value3, _field4, _value4, \ 197227569Sphilip _field5, _value5, _field6, _value6, _field7, _value7, \ 198227569Sphilip _field8, _value8, _field9, _value9, _field10, _value10) \ 199227569Sphilip EFX_POPULATE_DWORD_10(*MCDI_IN2(_emr, efx_dword_t, _ofst), \ 200227569Sphilip MC_CMD_ ## _field1, _value1, \ 201227569Sphilip MC_CMD_ ## _field2, _value2, \ 202227569Sphilip MC_CMD_ ## _field3, _value3, \ 203227569Sphilip MC_CMD_ ## _field4, _value4, \ 204227569Sphilip MC_CMD_ ## _field5, _value5, \ 205227569Sphilip MC_CMD_ ## _field6, _value6, \ 206227569Sphilip MC_CMD_ ## _field7, _value7, \ 207227569Sphilip MC_CMD_ ## _field8, _value8, \ 208227569Sphilip MC_CMD_ ## _field9, _value9, \ 209227569Sphilip MC_CMD_ ## _field10, _value10) 210227569Sphilip 211227569Sphilip#define MCDI_OUT(_emr, _type, _ofst) \ 212227569Sphilip ((_type *)((_emr).emr_out_buf + (_ofst))) 213227569Sphilip 214227569Sphilip#define MCDI_OUT2(_emr, _type, _ofst) \ 215227569Sphilip MCDI_OUT(_emr, _type, MC_CMD_ ## _ofst ## _OFST) 216227569Sphilip 217227569Sphilip#define MCDI_OUT_BYTE(_emr, _ofst) \ 218227569Sphilip EFX_BYTE_FIELD(*MCDI_OUT2(_emr, efx_byte_t, _ofst), \ 219227569Sphilip EFX_BYTE_0) 220227569Sphilip 221227569Sphilip#define MCDI_OUT_WORD(_emr, _ofst) \ 222227569Sphilip EFX_WORD_FIELD(*MCDI_OUT2(_emr, efx_word_t, _ofst), \ 223227569Sphilip EFX_WORD_0) 224227569Sphilip 225227569Sphilip#define MCDI_OUT_DWORD(_emr, _ofst) \ 226227569Sphilip EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst), \ 227227569Sphilip EFX_DWORD_0) 228227569Sphilip 229227569Sphilip#define MCDI_OUT_DWORD_FIELD(_emr, _ofst, _field) \ 230227569Sphilip EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst), \ 231227569Sphilip MC_CMD_ ## _field) 232227569Sphilip 233227569Sphilip#define MCDI_EV_FIELD(_eqp, _field) \ 234227569Sphilip EFX_QWORD_FIELD(*eqp, MCDI_EVENT_ ## _field) 235227569Sphilip 236227569Sphilip#ifdef __cplusplus 237227569Sphilip} 238227569Sphilip#endif 239227569Sphilip 240227569Sphilip#endif /* _SYS_EFX_MCDI_H */ 241