2 * Copyright 2009 Solarflare Communications Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 #ifndef _SYS_EFX_MCDI_H
29 #define _SYS_EFX_MCDI_H
33 #include "efx_regs_mcdi.h"
39 /* Number of retries attempted for init code */
40 #define EFX_MCDI_REQ_RETRY_INIT 2
42 struct efx_mcdi_req_s {
43 /* Inputs: Command #, input buffer and length */
47 /* Outputs: retcode, buffer, length, and length used*/
50 size_t emr_out_length;
51 size_t emr_out_length_used;
54 typedef struct efx_mcdi_iface_s {
55 const efx_mcdi_transport_t *emi_mtp;
56 unsigned int emi_port;
58 efx_mcdi_req_t *emi_pending_req;
61 uint32_t emi_poll_cnt;
67 __in efx_mcdi_req_t *emrp);
72 __in unsigned int seq,
73 __in unsigned int outlen,
81 typedef enum efx_mcdi_boot_e {
82 EFX_MCDI_BOOT_PRIMARY,
83 EFX_MCDI_BOOT_SECONDARY,
87 extern __checkReturn int
90 __out_ecount_opt(4) uint16_t versionp[4],
91 __out_opt uint32_t *buildp,
92 __out_opt efx_mcdi_boot_t *statusp);
94 #define MCDI_IN(_emr, _type, _ofst) \
95 ((_type *)((_emr).emr_in_buf + (_ofst)))
97 #define MCDI_IN2(_emr, _type, _ofst) \
98 MCDI_IN(_emr, _type, MC_CMD_ ## _ofst ## _OFST)
100 #define MCDI_IN_SET_BYTE(_emr, _ofst, _value) \
101 EFX_POPULATE_BYTE_1(*MCDI_IN2(_emr, efx_byte_t, _ofst), \
104 #define MCDI_IN_SET_DWORD(_emr, _ofst, _value) \
105 EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst), \
108 #define MCDI_IN_POPULATE_DWORD_1(_emr, _ofst, _field1, _value1) \
109 EFX_POPULATE_DWORD_1(*MCDI_IN2(_emr, efx_dword_t, _ofst), \
110 MC_CMD_ ## _field1, _value1)
112 #define MCDI_IN_POPULATE_DWORD_2(_emr, _ofst, _field1, _value1, \
114 EFX_POPULATE_DWORD_2(*MCDI_IN2(_emr, efx_dword_t, _ofst), \
115 MC_CMD_ ## _field1, _value1, \
116 MC_CMD_ ## _field2, _value2)
118 #define MCDI_IN_POPULATE_DWORD_3(_emr, _ofst, _field1, _value1, \
119 _field2, _value2, _field3, _value3) \
120 EFX_POPULATE_DWORD_3(*MCDI_IN2(_emr, efx_dword_t, _ofst), \
121 MC_CMD_ ## _field1, _value1, \
122 MC_CMD_ ## _field2, _value2, \
123 MC_CMD_ ## _field3, _value3)
125 #define MCDI_IN_POPULATE_DWORD_4(_emr, _ofst, _field1, _value1, \
126 _field2, _value2, _field3, _value3, _field4, _value4) \
127 EFX_POPULATE_DWORD_4(*MCDI_IN2(_emr, efx_dword_t, _ofst), \
128 MC_CMD_ ## _field1, _value1, \
129 MC_CMD_ ## _field2, _value2, \
130 MC_CMD_ ## _field3, _value3, \
131 MC_CMD_ ## _field4, _value4)
133 #define MCDI_IN_POPULATE_DWORD_5(_emr, _ofst, _field1, _value1, \
134 _field2, _value2, _field3, _value3, _field4, _value4, \
136 EFX_POPULATE_DWORD_5(*MCDI_IN2(_emr, efx_dword_t, _ofst), \
137 MC_CMD_ ## _field1, _value1, \
138 MC_CMD_ ## _field2, _value2, \
139 MC_CMD_ ## _field3, _value3, \
140 MC_CMD_ ## _field4, _value4, \
141 MC_CMD_ ## _field5, _value5)
143 #define MCDI_IN_POPULATE_DWORD_6(_emr, _ofst, _field1, _value1, \
144 _field2, _value2, _field3, _value3, _field4, _value4, \
145 _field5, _value5, _field6, _value6) \
146 EFX_POPULATE_DWORD_6(*MCDI_IN2(_emr, efx_dword_t, _ofst), \
147 MC_CMD_ ## _field1, _value1, \
148 MC_CMD_ ## _field2, _value2, \
149 MC_CMD_ ## _field3, _value3, \
150 MC_CMD_ ## _field4, _value4, \
151 MC_CMD_ ## _field5, _value5, \
152 MC_CMD_ ## _field6, _value6)
154 #define MCDI_IN_POPULATE_DWORD_7(_emr, _ofst, _field1, _value1, \
155 _field2, _value2, _field3, _value3, _field4, _value4, \
156 _field5, _value5, _field6, _value6, _field7, _value7) \
157 EFX_POPULATE_DWORD_7(MCDI_IN2(_emr, efx_dword_t, _ofst), \
158 MC_CMD_ ## _field1, _value1, \
159 MC_CMD_ ## _field2, _value2, \
160 MC_CMD_ ## _field3, _value3, \
161 MC_CMD_ ## _field4, _value4, \
162 MC_CMD_ ## _field5, _value5, \
163 MC_CMD_ ## _field6, _value6, \
164 MC_CMD_ ## _field7, _value7)
166 #define MCDI_IN_POPULATE_DWORD_8(_emr, _ofst, _field1, _value1, \
167 _field2, _value2, _field3, _value3, _field4, _value4, \
168 _field5, _value5, _field6, _value6, _field7, _value7, \
170 EFX_POPULATE_DWORD_8(*MCDI_IN2(_emr, efx_dword_t, _ofst), \
171 MC_CMD_ ## _field1, _value1, \
172 MC_CMD_ ## _field2, _value2, \
173 MC_CMD_ ## _field3, _value3, \
174 MC_CMD_ ## _field4, _value4, \
175 MC_CMD_ ## _field5, _value5, \
176 MC_CMD_ ## _field6, _value6, \
177 MC_CMD_ ## _field7, _value7, \
178 MC_CMD_ ## _field8, _value8)
180 #define MCDI_IN_POPULATE_DWORD_9(_emr, _ofst, _field1, _value1, \
181 _field2, _value2, _field3, _value3, _field4, _value4, \
182 _field5, _value5, _field6, _value6, _field7, _value7, \
183 _field8, _value8, _field9, _value9) \
184 EFX_POPULATE_DWORD_9(*MCDI_IN2(_emr, efx_dword_t, _ofst), \
185 MC_CMD_ ## _field1, _value1, \
186 MC_CMD_ ## _field2, _value2, \
187 MC_CMD_ ## _field3, _value3, \
188 MC_CMD_ ## _field4, _value4, \
189 MC_CMD_ ## _field5, _value5, \
190 MC_CMD_ ## _field6, _value6, \
191 MC_CMD_ ## _field7, _value7, \
192 MC_CMD_ ## _field8, _value8, \
193 MC_CMD_ ## _field9, _value9)
195 #define MCDI_IN_POPULATE_DWORD_10(_emr, _ofst, _field1, _value1, \
196 _field2, _value2, _field3, _value3, _field4, _value4, \
197 _field5, _value5, _field6, _value6, _field7, _value7, \
198 _field8, _value8, _field9, _value9, _field10, _value10) \
199 EFX_POPULATE_DWORD_10(*MCDI_IN2(_emr, efx_dword_t, _ofst), \
200 MC_CMD_ ## _field1, _value1, \
201 MC_CMD_ ## _field2, _value2, \
202 MC_CMD_ ## _field3, _value3, \
203 MC_CMD_ ## _field4, _value4, \
204 MC_CMD_ ## _field5, _value5, \
205 MC_CMD_ ## _field6, _value6, \
206 MC_CMD_ ## _field7, _value7, \
207 MC_CMD_ ## _field8, _value8, \
208 MC_CMD_ ## _field9, _value9, \
209 MC_CMD_ ## _field10, _value10)
211 #define MCDI_OUT(_emr, _type, _ofst) \
212 ((_type *)((_emr).emr_out_buf + (_ofst)))
214 #define MCDI_OUT2(_emr, _type, _ofst) \
215 MCDI_OUT(_emr, _type, MC_CMD_ ## _ofst ## _OFST)
217 #define MCDI_OUT_BYTE(_emr, _ofst) \
218 EFX_BYTE_FIELD(*MCDI_OUT2(_emr, efx_byte_t, _ofst), \
221 #define MCDI_OUT_WORD(_emr, _ofst) \
222 EFX_WORD_FIELD(*MCDI_OUT2(_emr, efx_word_t, _ofst), \
225 #define MCDI_OUT_DWORD(_emr, _ofst) \
226 EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst), \
229 #define MCDI_OUT_DWORD_FIELD(_emr, _ofst, _field) \
230 EFX_DWORD_FIELD(*MCDI_OUT2(_emr, efx_dword_t, _ofst), \
233 #define MCDI_EV_FIELD(_eqp, _field) \
234 EFX_QWORD_FIELD(*eqp, MCDI_EVENT_ ## _field)
240 #endif /* _SYS_EFX_MCDI_H */