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