xref: /freebsd/sys/dev/sfxge/common/efsys.h (revision 33d45dc5e401ce782dae077f00b53d9af1f84910)
1e948693eSPhilip Paeps /*-
2e948693eSPhilip Paeps  * Copyright (c) 2010-2011 Solarflare Communications, Inc.
3e948693eSPhilip Paeps  * All rights reserved.
4e948693eSPhilip Paeps  *
5e948693eSPhilip Paeps  * This software was developed in part by Philip Paeps under contract for
6e948693eSPhilip Paeps  * Solarflare Communications, Inc.
7e948693eSPhilip Paeps  *
8e948693eSPhilip Paeps  * Redistribution and use in source and binary forms, with or without
9e948693eSPhilip Paeps  * modification, are permitted provided that the following conditions
10e948693eSPhilip Paeps  * are met:
11e948693eSPhilip Paeps  * 1. Redistributions of source code must retain the above copyright
12e948693eSPhilip Paeps  *    notice, this list of conditions and the following disclaimer.
13e948693eSPhilip Paeps  * 2. Redistributions in binary form must reproduce the above copyright
14e948693eSPhilip Paeps  *    notice, this list of conditions and the following disclaimer in the
15e948693eSPhilip Paeps  *    documentation and/or other materials provided with the distribution.
16e948693eSPhilip Paeps  *
17e948693eSPhilip Paeps  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18e948693eSPhilip Paeps  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19e948693eSPhilip Paeps  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20e948693eSPhilip Paeps  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21e948693eSPhilip Paeps  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22e948693eSPhilip Paeps  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23e948693eSPhilip Paeps  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24e948693eSPhilip Paeps  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25e948693eSPhilip Paeps  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26e948693eSPhilip Paeps  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27e948693eSPhilip Paeps  * SUCH DAMAGE.
285dee87d7SPhilip Paeps  *
295dee87d7SPhilip Paeps  * $FreeBSD$
30e948693eSPhilip Paeps  */
31e948693eSPhilip Paeps 
32e948693eSPhilip Paeps #ifndef	_SYS_EFSYS_H
33e948693eSPhilip Paeps #define	_SYS_EFSYS_H
34e948693eSPhilip Paeps 
35e948693eSPhilip Paeps #ifdef	__cplusplus
36e948693eSPhilip Paeps extern "C" {
37e948693eSPhilip Paeps #endif
38e948693eSPhilip Paeps 
39e948693eSPhilip Paeps #include <sys/param.h>
40e948693eSPhilip Paeps #include <sys/bus.h>
41e948693eSPhilip Paeps #include <sys/endian.h>
42e948693eSPhilip Paeps #include <sys/lock.h>
43e948693eSPhilip Paeps #include <sys/malloc.h>
44e948693eSPhilip Paeps #include <sys/mbuf.h>
45e948693eSPhilip Paeps #include <sys/mutex.h>
46e948693eSPhilip Paeps #include <sys/rwlock.h>
47e948693eSPhilip Paeps #include <sys/sdt.h>
48e948693eSPhilip Paeps #include <sys/systm.h>
49e948693eSPhilip Paeps 
50e948693eSPhilip Paeps #include <machine/bus.h>
51e948693eSPhilip Paeps #include <machine/endian.h>
52e948693eSPhilip Paeps 
53e948693eSPhilip Paeps #define	EFSYS_HAS_UINT64 1
54e948693eSPhilip Paeps #define	EFSYS_USE_UINT64 0
55e948693eSPhilip Paeps #if _BYTE_ORDER == _BIG_ENDIAN
56e948693eSPhilip Paeps #define	EFSYS_IS_BIG_ENDIAN 1
57e948693eSPhilip Paeps #define	EFSYS_IS_LITTLE_ENDIAN 0
58e948693eSPhilip Paeps #elif _BYTE_ORDER == _LITTLE_ENDIAN
59e948693eSPhilip Paeps #define	EFSYS_IS_BIG_ENDIAN 0
60e948693eSPhilip Paeps #define	EFSYS_IS_LITTLE_ENDIAN 1
61e948693eSPhilip Paeps #endif
62e948693eSPhilip Paeps #include "efx_types.h"
63e948693eSPhilip Paeps 
64e948693eSPhilip Paeps /* Common code requires this */
65e948693eSPhilip Paeps #if __FreeBSD_version < 800068
66e948693eSPhilip Paeps #define	memmove(d, s, l) bcopy(s, d, l)
67e948693eSPhilip Paeps #endif
68e948693eSPhilip Paeps 
69e948693eSPhilip Paeps /* FreeBSD equivalents of Solaris things */
70e948693eSPhilip Paeps #ifndef _NOTE
71e948693eSPhilip Paeps #define	_NOTE(s)
72e948693eSPhilip Paeps #endif
73e948693eSPhilip Paeps 
74e948693eSPhilip Paeps #ifndef B_FALSE
75e948693eSPhilip Paeps #define	B_FALSE	FALSE
76e948693eSPhilip Paeps #endif
77e948693eSPhilip Paeps #ifndef B_TRUE
78e948693eSPhilip Paeps #define	B_TRUE	TRUE
79e948693eSPhilip Paeps #endif
80e948693eSPhilip Paeps 
81e948693eSPhilip Paeps #ifndef IS_P2ALIGNED
82e948693eSPhilip Paeps #define	IS_P2ALIGNED(v, a)	((((uintptr_t)(v)) & ((uintptr_t)(a) - 1)) == 0)
83e948693eSPhilip Paeps #endif
84e948693eSPhilip Paeps 
85e948693eSPhilip Paeps #ifndef P2ROUNDUP
86e948693eSPhilip Paeps #define	P2ROUNDUP(x, align)	(-(-(x) & -(align)))
87e948693eSPhilip Paeps #endif
88e948693eSPhilip Paeps 
89e948693eSPhilip Paeps #ifndef IS2P
90e948693eSPhilip Paeps #define	ISP2(x)			(((x) & ((x) - 1)) == 0)
91e948693eSPhilip Paeps #endif
92e948693eSPhilip Paeps 
93e948693eSPhilip Paeps #define	ENOTACTIVE EINVAL
94e948693eSPhilip Paeps 
95e948693eSPhilip Paeps /* Memory type to use on FreeBSD */
96e948693eSPhilip Paeps MALLOC_DECLARE(M_SFXGE);
97e948693eSPhilip Paeps 
98e948693eSPhilip Paeps /* Machine dependend prefetch wrappers */
99dc1788e8SMarius Strobl #if defined(__i386__) || defined(__amd64__)
100e948693eSPhilip Paeps static __inline void
101e948693eSPhilip Paeps prefetch_read_many(void *addr)
102e948693eSPhilip Paeps {
103dc1788e8SMarius Strobl 
104e948693eSPhilip Paeps 	__asm__(
105e948693eSPhilip Paeps 	    "prefetcht0 (%0)"
106e948693eSPhilip Paeps 	    :
107e948693eSPhilip Paeps 	    : "r" (addr));
108e948693eSPhilip Paeps }
109e948693eSPhilip Paeps 
110e948693eSPhilip Paeps static __inline void
111e948693eSPhilip Paeps prefetch_read_once(void *addr)
112e948693eSPhilip Paeps {
113dc1788e8SMarius Strobl 
114e948693eSPhilip Paeps 	__asm__(
115e948693eSPhilip Paeps 	    "prefetchnta (%0)"
116e948693eSPhilip Paeps 	    :
117e948693eSPhilip Paeps 	    : "r" (addr));
118e948693eSPhilip Paeps }
119dc1788e8SMarius Strobl #elif defined(__sparc64__)
120dc1788e8SMarius Strobl static __inline void
121dc1788e8SMarius Strobl prefetch_read_many(void *addr)
122dc1788e8SMarius Strobl {
123dc1788e8SMarius Strobl 
124dc1788e8SMarius Strobl 	__asm__(
125dc1788e8SMarius Strobl 	    "prefetch [%0], 0"
126dc1788e8SMarius Strobl 	    :
127dc1788e8SMarius Strobl 	    : "r" (addr));
128dc1788e8SMarius Strobl }
129dc1788e8SMarius Strobl 
130dc1788e8SMarius Strobl static __inline void
131dc1788e8SMarius Strobl prefetch_read_once(void *addr)
132dc1788e8SMarius Strobl {
133dc1788e8SMarius Strobl 
134dc1788e8SMarius Strobl 	__asm__(
135dc1788e8SMarius Strobl 	    "prefetch [%0], 1"
136dc1788e8SMarius Strobl 	    :
137dc1788e8SMarius Strobl 	    : "r" (addr));
138dc1788e8SMarius Strobl }
139dc1788e8SMarius Strobl #else
140dc1788e8SMarius Strobl static __inline void
141dc1788e8SMarius Strobl prefetch_read_many(void *addr)
142dc1788e8SMarius Strobl {
143dc1788e8SMarius Strobl 
144dc1788e8SMarius Strobl }
145dc1788e8SMarius Strobl 
146dc1788e8SMarius Strobl static __inline void
147dc1788e8SMarius Strobl prefetch_read_once(void *addr)
148dc1788e8SMarius Strobl {
149dc1788e8SMarius Strobl 
150dc1788e8SMarius Strobl }
151e948693eSPhilip Paeps #endif
152e948693eSPhilip Paeps 
153e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__)
154e948693eSPhilip Paeps #include <vm/vm.h>
155e948693eSPhilip Paeps #include <vm/pmap.h>
156e948693eSPhilip Paeps #endif
157e948693eSPhilip Paeps static __inline void
158e948693eSPhilip Paeps sfxge_map_mbuf_fast(bus_dma_tag_t tag, bus_dmamap_t map,
159e948693eSPhilip Paeps     struct mbuf *m, bus_dma_segment_t *seg)
160e948693eSPhilip Paeps {
161e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__)
162e948693eSPhilip Paeps 	seg->ds_addr = pmap_kextract(mtod(m, vm_offset_t));
163e948693eSPhilip Paeps 	seg->ds_len = m->m_len;
164e948693eSPhilip Paeps #else
165e948693eSPhilip Paeps 	int nsegstmp;
166e948693eSPhilip Paeps 
167e948693eSPhilip Paeps 	bus_dmamap_load_mbuf_sg(tag, map, m, seg, &nsegstmp, 0);
168e948693eSPhilip Paeps #endif
169e948693eSPhilip Paeps }
170e948693eSPhilip Paeps 
171e948693eSPhilip Paeps /* Modifiers used for DOS builds */
172e948693eSPhilip Paeps #define	__cs
173e948693eSPhilip Paeps #define	__far
174e948693eSPhilip Paeps 
175e948693eSPhilip Paeps /* Modifiers used for Windows builds */
176e948693eSPhilip Paeps #define	__in
177e948693eSPhilip Paeps #define	__in_opt
178e948693eSPhilip Paeps #define	__in_ecount(_n)
179e948693eSPhilip Paeps #define	__in_ecount_opt(_n)
180e948693eSPhilip Paeps #define	__in_bcount(_n)
181e948693eSPhilip Paeps #define	__in_bcount_opt(_n)
182e948693eSPhilip Paeps 
183e948693eSPhilip Paeps #define	__out
184e948693eSPhilip Paeps #define	__out_opt
185e948693eSPhilip Paeps #define	__out_ecount(_n)
186e948693eSPhilip Paeps #define	__out_ecount_opt(_n)
187e948693eSPhilip Paeps #define	__out_bcount(_n)
188e948693eSPhilip Paeps #define	__out_bcount_opt(_n)
189e948693eSPhilip Paeps 
190e948693eSPhilip Paeps #define	__deref_out
191e948693eSPhilip Paeps 
192e948693eSPhilip Paeps #define	__inout
193e948693eSPhilip Paeps #define	__inout_opt
194e948693eSPhilip Paeps #define	__inout_ecount(_n)
195e948693eSPhilip Paeps #define	__inout_ecount_opt(_n)
196e948693eSPhilip Paeps #define	__inout_bcount(_n)
197e948693eSPhilip Paeps #define	__inout_bcount_opt(_n)
198e948693eSPhilip Paeps #define	__inout_bcount_full_opt(_n)
199e948693eSPhilip Paeps 
200e948693eSPhilip Paeps #define	__deref_out_bcount_opt(n)
201e948693eSPhilip Paeps 
202e948693eSPhilip Paeps #define	__checkReturn
203e948693eSPhilip Paeps 
204e948693eSPhilip Paeps #define	__drv_when(_p, _c)
205e948693eSPhilip Paeps 
206e948693eSPhilip Paeps /* Code inclusion options */
207e948693eSPhilip Paeps 
208e948693eSPhilip Paeps 
209e948693eSPhilip Paeps #define	EFSYS_OPT_NAMES 1
210e948693eSPhilip Paeps 
211e948693eSPhilip Paeps #define	EFSYS_OPT_FALCON 0
212e948693eSPhilip Paeps #define	EFSYS_OPT_FALCON_NIC_CFG_OVERRIDE 0
213e948693eSPhilip Paeps #define	EFSYS_OPT_SIENA 1
214e948693eSPhilip Paeps #ifdef DEBUG
215e948693eSPhilip Paeps #define	EFSYS_OPT_CHECK_REG 1
216e948693eSPhilip Paeps #else
217e948693eSPhilip Paeps #define	EFSYS_OPT_CHECK_REG 0
218e948693eSPhilip Paeps #endif
219e948693eSPhilip Paeps 
220e948693eSPhilip Paeps #define	EFSYS_OPT_MCDI 1
221e948693eSPhilip Paeps 
222e948693eSPhilip Paeps #define	EFSYS_OPT_MAC_FALCON_GMAC 0
223e948693eSPhilip Paeps #define	EFSYS_OPT_MAC_FALCON_XMAC 0
224e948693eSPhilip Paeps #define	EFSYS_OPT_MAC_STATS 1
225e948693eSPhilip Paeps 
226e948693eSPhilip Paeps #define	EFSYS_OPT_LOOPBACK 0
227e948693eSPhilip Paeps 
228e948693eSPhilip Paeps #define	EFSYS_OPT_MON_NULL 0
229e948693eSPhilip Paeps #define	EFSYS_OPT_MON_LM87 0
230e948693eSPhilip Paeps #define	EFSYS_OPT_MON_MAX6647 0
231e948693eSPhilip Paeps #define	EFSYS_OPT_MON_SIENA 0
232e948693eSPhilip Paeps #define	EFSYS_OPT_MON_STATS 0
233e948693eSPhilip Paeps 
234e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_NULL 0
235e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_QT2022C2 0
236e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_SFX7101 0
237e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_TXC43128 0
238e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_PM8358 0
239e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_SFT9001 0
240e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_QT2025C 0
241e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_STATS 1
242e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_PROPS 0
243e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_BIST 1
244e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_LED_CONTROL 1
245e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_FLAGS 0
246e948693eSPhilip Paeps 
247e948693eSPhilip Paeps #define	EFSYS_OPT_VPD 1
248e948693eSPhilip Paeps #define	EFSYS_OPT_NVRAM 1
249e948693eSPhilip Paeps #define	EFSYS_OPT_NVRAM_FALCON_BOOTROM 0
250e948693eSPhilip Paeps #define	EFSYS_OPT_NVRAM_SFT9001	0
251e948693eSPhilip Paeps #define	EFSYS_OPT_NVRAM_SFX7101	0
252e948693eSPhilip Paeps #define	EFSYS_OPT_BOOTCFG 0
253e948693eSPhilip Paeps 
254e948693eSPhilip Paeps #define	EFSYS_OPT_PCIE_TUNE 0
255e948693eSPhilip Paeps #define	EFSYS_OPT_DIAG 0
256e948693eSPhilip Paeps #define	EFSYS_OPT_WOL 1
257e948693eSPhilip Paeps #define	EFSYS_OPT_RX_SCALE 1
258e948693eSPhilip Paeps #define	EFSYS_OPT_QSTATS 1
259e948693eSPhilip Paeps #define	EFSYS_OPT_FILTER 0
260e948693eSPhilip Paeps #define	EFSYS_OPT_RX_SCATTER 0
261e948693eSPhilip Paeps #define	EFSYS_OPT_RX_HDR_SPLIT 0
262e948693eSPhilip Paeps 
263e948693eSPhilip Paeps #define	EFSYS_OPT_EV_PREFETCH 0
264e948693eSPhilip Paeps 
265e948693eSPhilip Paeps #define	EFSYS_OPT_DECODE_INTR_FATAL 1
266e948693eSPhilip Paeps 
267e948693eSPhilip Paeps /* ID */
268e948693eSPhilip Paeps 
269e948693eSPhilip Paeps typedef struct __efsys_identifier_s	efsys_identifier_t;
270e948693eSPhilip Paeps 
271e948693eSPhilip Paeps /* PROBE */
272e948693eSPhilip Paeps 
27354366c0bSAttilio Rao #ifndef DTRACE_PROBE
274e948693eSPhilip Paeps 
275e948693eSPhilip Paeps #define	EFSYS_PROBE(_name)
276e948693eSPhilip Paeps 
277e948693eSPhilip Paeps #define	EFSYS_PROBE1(_name, _type1, _arg1)
278e948693eSPhilip Paeps 
279e948693eSPhilip Paeps #define	EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2)
280e948693eSPhilip Paeps 
281e948693eSPhilip Paeps #define	EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2,		\
282e948693eSPhilip Paeps 	    _type3, _arg3)
283e948693eSPhilip Paeps 
284e948693eSPhilip Paeps #define	EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2,		\
285e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4)
286e948693eSPhilip Paeps 
287e948693eSPhilip Paeps #define	EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
288e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)
289e948693eSPhilip Paeps 
290e948693eSPhilip Paeps #define	EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
291e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
292e948693eSPhilip Paeps 	    _type6, _arg6)
293e948693eSPhilip Paeps 
294e948693eSPhilip Paeps #define	EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2,		\
295e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
296e948693eSPhilip Paeps 	    _type6, _arg6, _type7, _arg7)
297e948693eSPhilip Paeps 
29854366c0bSAttilio Rao #else /* DTRACE_PROBE */
299e948693eSPhilip Paeps 
300e948693eSPhilip Paeps #define	EFSYS_PROBE(_name)						\
301e948693eSPhilip Paeps 	DTRACE_PROBE(_name)
302e948693eSPhilip Paeps 
303e948693eSPhilip Paeps #define	EFSYS_PROBE1(_name, _type1, _arg1)				\
304e948693eSPhilip Paeps 	DTRACE_PROBE1(_name, _type1, _arg1)
305e948693eSPhilip Paeps 
306e948693eSPhilip Paeps #define	EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2)		\
307e948693eSPhilip Paeps 	DTRACE_PROBE2(_name, _type1, _arg1, _type2, _arg2)
308e948693eSPhilip Paeps 
309e948693eSPhilip Paeps #define	EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2,		\
310e948693eSPhilip Paeps 	    _type3, _arg3)						\
311e948693eSPhilip Paeps 	DTRACE_PROBE3(_name, _type1, _arg1, _type2, _arg2,		\
312e948693eSPhilip Paeps 	    _type3, _arg3)
313e948693eSPhilip Paeps 
314e948693eSPhilip Paeps #define	EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2,		\
315e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4)				\
316e948693eSPhilip Paeps 	DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2,		\
317e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4)
318e948693eSPhilip Paeps 
319e948693eSPhilip Paeps #ifdef DTRACE_PROBE5
320e948693eSPhilip Paeps #define	EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
321e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)		\
322e948693eSPhilip Paeps 	DTRACE_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
323e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)
324e948693eSPhilip Paeps #else
325e948693eSPhilip Paeps #define	EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
326e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)		\
327e948693eSPhilip Paeps 	DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2,		\
328e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4)
329e948693eSPhilip Paeps #endif
330e948693eSPhilip Paeps 
331e948693eSPhilip Paeps #ifdef DTRACE_PROBE6
332e948693eSPhilip Paeps #define	EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
333e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
334e948693eSPhilip Paeps 	    _type6, _arg6)						\
335e948693eSPhilip Paeps 	DTRACE_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
336e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
337e948693eSPhilip Paeps 	    _type6, _arg6)
338e948693eSPhilip Paeps #else
339e948693eSPhilip Paeps #define	EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
340e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
341e948693eSPhilip Paeps 	    _type6, _arg6)						\
342e948693eSPhilip Paeps 	EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
343e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)
344e948693eSPhilip Paeps #endif
345e948693eSPhilip Paeps 
346e948693eSPhilip Paeps #ifdef DTRACE_PROBE7
347e948693eSPhilip Paeps #define	EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2,		\
348e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
349e948693eSPhilip Paeps 	    _type6, _arg6, _type7, _arg7)				\
350e948693eSPhilip Paeps 	DTRACE_PROBE7(_name, _type1, _arg1, _type2, _arg2,		\
351e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
352e948693eSPhilip Paeps 	    _type6, _arg6, _type7, _arg7)
353e948693eSPhilip Paeps #else
354e948693eSPhilip Paeps #define	EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2,		\
355e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
356e948693eSPhilip Paeps 	    _type6, _arg6, _type7, _arg7)				\
357e948693eSPhilip Paeps 	EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
358e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
359e948693eSPhilip Paeps 	    _type6, _arg6)
360e948693eSPhilip Paeps #endif
361e948693eSPhilip Paeps 
36254366c0bSAttilio Rao #endif /* DTRACE_PROBE */
363e948693eSPhilip Paeps 
364e948693eSPhilip Paeps /* DMA */
365e948693eSPhilip Paeps 
366e948693eSPhilip Paeps typedef uint64_t		efsys_dma_addr_t;
367e948693eSPhilip Paeps 
368e948693eSPhilip Paeps typedef struct efsys_mem_s {
369e948693eSPhilip Paeps 	bus_dma_tag_t		esm_tag;
370e948693eSPhilip Paeps 	bus_dmamap_t		esm_map;
371e948693eSPhilip Paeps 	caddr_t			esm_base;
372e948693eSPhilip Paeps 	efsys_dma_addr_t	esm_addr;
373e948693eSPhilip Paeps } efsys_mem_t;
374e948693eSPhilip Paeps 
375e948693eSPhilip Paeps 
376e948693eSPhilip Paeps #define	EFSYS_MEM_ZERO(_esmp, _size)					\
377e948693eSPhilip Paeps 	do {								\
378e948693eSPhilip Paeps 		(void) memset((_esmp)->esm_base, 0, (_size));		\
379e948693eSPhilip Paeps 									\
380e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
381e948693eSPhilip Paeps 	} while (B_FALSE)
382e948693eSPhilip Paeps 
383e948693eSPhilip Paeps #define	EFSYS_MEM_READD(_esmp, _offset, _edp)				\
384e948693eSPhilip Paeps 	do {								\
385e948693eSPhilip Paeps 		uint32_t *addr;						\
386e948693eSPhilip Paeps 									\
387e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
388e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)),	\
389e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
390e948693eSPhilip Paeps 									\
391e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
392e948693eSPhilip Paeps 									\
393e948693eSPhilip Paeps 		(_edp)->ed_u32[0] = *addr;				\
394e948693eSPhilip Paeps 									\
395e948693eSPhilip Paeps 		EFSYS_PROBE2(mem_readd, unsigned int, (_offset),	\
396e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
397e948693eSPhilip Paeps 									\
398e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
399e948693eSPhilip Paeps 	} while (B_FALSE)
400e948693eSPhilip Paeps 
401e948693eSPhilip Paeps #define	EFSYS_MEM_READQ(_esmp, _offset, _eqp)				\
402e948693eSPhilip Paeps 	do {								\
403e948693eSPhilip Paeps 		uint32_t *addr;						\
404e948693eSPhilip Paeps 									\
405e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
406e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
407e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
408e948693eSPhilip Paeps 									\
409e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
410e948693eSPhilip Paeps 									\
411e948693eSPhilip Paeps 		(_eqp)->eq_u32[0] = *addr++;				\
412e948693eSPhilip Paeps 		(_eqp)->eq_u32[1] = *addr;				\
413e948693eSPhilip Paeps 									\
414e948693eSPhilip Paeps 		EFSYS_PROBE3(mem_readq, unsigned int, (_offset),	\
415e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
416e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
417e948693eSPhilip Paeps 									\
418e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
419e948693eSPhilip Paeps 	} while (B_FALSE)
420e948693eSPhilip Paeps 
421e948693eSPhilip Paeps #define	EFSYS_MEM_READO(_esmp, _offset, _eop)				\
422e948693eSPhilip Paeps 	do {								\
423e948693eSPhilip Paeps 		uint32_t *addr;						\
424e948693eSPhilip Paeps 									\
425e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
426e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
427e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
428e948693eSPhilip Paeps 									\
429e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
430e948693eSPhilip Paeps 									\
431e948693eSPhilip Paeps 		(_eop)->eo_u32[0] = *addr++;				\
432e948693eSPhilip Paeps 		(_eop)->eo_u32[1] = *addr++;				\
433e948693eSPhilip Paeps 		(_eop)->eo_u32[2] = *addr++;				\
434e948693eSPhilip Paeps 		(_eop)->eo_u32[3] = *addr;				\
435e948693eSPhilip Paeps 									\
436e948693eSPhilip Paeps 		EFSYS_PROBE5(mem_reado, unsigned int, (_offset),	\
437e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
438e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
439e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
440e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
441e948693eSPhilip Paeps 									\
442e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
443e948693eSPhilip Paeps 	} while (B_FALSE)
444e948693eSPhilip Paeps 
445e948693eSPhilip Paeps #define	EFSYS_MEM_WRITED(_esmp, _offset, _edp)				\
446e948693eSPhilip Paeps 	do {								\
447e948693eSPhilip Paeps 		uint32_t *addr;						\
448e948693eSPhilip Paeps 									\
449e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
450e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)),	\
451e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
452e948693eSPhilip Paeps 									\
453e948693eSPhilip Paeps 		EFSYS_PROBE2(mem_writed, unsigned int, (_offset),	\
454e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
455e948693eSPhilip Paeps 									\
456e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
457e948693eSPhilip Paeps 									\
458e948693eSPhilip Paeps 		*addr = (_edp)->ed_u32[0];				\
459e948693eSPhilip Paeps 									\
460e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
461e948693eSPhilip Paeps 	} while (B_FALSE)
462e948693eSPhilip Paeps 
463e948693eSPhilip Paeps #define	EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp)				\
464e948693eSPhilip Paeps 	do {								\
465e948693eSPhilip Paeps 		uint32_t *addr;						\
466e948693eSPhilip Paeps 									\
467e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
468e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
469e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
470e948693eSPhilip Paeps 									\
471e948693eSPhilip Paeps 		EFSYS_PROBE3(mem_writeq, unsigned int, (_offset),	\
472e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
473e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
474e948693eSPhilip Paeps 									\
475e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
476e948693eSPhilip Paeps 									\
477e948693eSPhilip Paeps 		*addr++ = (_eqp)->eq_u32[0];				\
478e948693eSPhilip Paeps 		*addr   = (_eqp)->eq_u32[1];				\
479e948693eSPhilip Paeps 									\
480e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
481e948693eSPhilip Paeps 	} while (B_FALSE)
482e948693eSPhilip Paeps 
483e948693eSPhilip Paeps #define	EFSYS_MEM_WRITEO(_esmp, _offset, _eop)				\
484e948693eSPhilip Paeps 	do {								\
485e948693eSPhilip Paeps 		uint32_t *addr;						\
486e948693eSPhilip Paeps 									\
487e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
488e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
489e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
490e948693eSPhilip Paeps 									\
491e948693eSPhilip Paeps 		EFSYS_PROBE5(mem_writeo, unsigned int, (_offset),	\
492e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
493e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
494e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
495e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
496e948693eSPhilip Paeps 									\
497e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
498e948693eSPhilip Paeps 									\
499e948693eSPhilip Paeps 		*addr++ = (_eop)->eo_u32[0];				\
500e948693eSPhilip Paeps 		*addr++ = (_eop)->eo_u32[1];				\
501e948693eSPhilip Paeps 		*addr++ = (_eop)->eo_u32[2];				\
502e948693eSPhilip Paeps 		*addr   = (_eop)->eo_u32[3];				\
503e948693eSPhilip Paeps 									\
504e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
505e948693eSPhilip Paeps 	} while (B_FALSE)
506e948693eSPhilip Paeps 
507e948693eSPhilip Paeps #define	EFSYS_MEM_ADDR(_esmp)						\
508e948693eSPhilip Paeps 	((_esmp)->esm_addr)
509e948693eSPhilip Paeps 
510e948693eSPhilip Paeps /* BAR */
511e948693eSPhilip Paeps 
512*33d45dc5SAndrew Rybchenko #define	SFXGE_LOCK_NAME_MAX	16
513*33d45dc5SAndrew Rybchenko 
514e948693eSPhilip Paeps typedef struct efsys_bar_s {
515e948693eSPhilip Paeps 	struct mtx		esb_lock;
516*33d45dc5SAndrew Rybchenko 	char			esb_lock_name[SFXGE_LOCK_NAME_MAX];
517e948693eSPhilip Paeps 	bus_space_tag_t		esb_tag;
518e948693eSPhilip Paeps 	bus_space_handle_t	esb_handle;
519e948693eSPhilip Paeps 	int			esb_rid;
520e948693eSPhilip Paeps 	struct resource		*esb_res;
521e948693eSPhilip Paeps } efsys_bar_t;
522e948693eSPhilip Paeps 
523*33d45dc5SAndrew Rybchenko #define	SFXGE_BAR_LOCK_INIT(_esbp, _ifname)				\
524*33d45dc5SAndrew Rybchenko 	do {								\
525*33d45dc5SAndrew Rybchenko 		snprintf((_esbp)->esb_lock_name,			\
526*33d45dc5SAndrew Rybchenko 			 sizeof((_esbp)->esb_lock_name),		\
527*33d45dc5SAndrew Rybchenko 			 "%s:bar", (_ifname));				\
528*33d45dc5SAndrew Rybchenko 		mtx_init(&(_esbp)->esb_lock, (_esbp)->esb_lock_name,	\
529*33d45dc5SAndrew Rybchenko 			 NULL, MTX_DEF);				\
530*33d45dc5SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
531*33d45dc5SAndrew Rybchenko 	} while (B_FALSE)
532763cab71SAndrew Rybchenko #define	SFXGE_BAR_LOCK_DESTROY(_esbp)					\
533763cab71SAndrew Rybchenko 	mtx_destroy(&(_esbp)->esb_lock)
534763cab71SAndrew Rybchenko #define	SFXGE_BAR_LOCK(_esbp)						\
535763cab71SAndrew Rybchenko 	mtx_lock(&(_esbp)->esb_lock)
536763cab71SAndrew Rybchenko #define	SFXGE_BAR_UNLOCK(_esbp)						\
537763cab71SAndrew Rybchenko 	mtx_unlock(&(_esbp)->esb_lock)
538763cab71SAndrew Rybchenko 
539e948693eSPhilip Paeps #define	EFSYS_BAR_READD(_esbp, _offset, _edp, _lock)			\
540e948693eSPhilip Paeps 	do {								\
541e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
542e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)),	\
543e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
544e948693eSPhilip Paeps 									\
545e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
546e948693eSPhilip Paeps 		if (_lock)						\
547763cab71SAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
548e948693eSPhilip Paeps 									\
549e948693eSPhilip Paeps 		(_edp)->ed_u32[0] = bus_space_read_4((_esbp)->esb_tag,	\
550e948693eSPhilip Paeps 		    (_esbp)->esb_handle, (_offset));			\
551e948693eSPhilip Paeps 									\
552e948693eSPhilip Paeps 		EFSYS_PROBE2(bar_readd, unsigned int, (_offset),	\
553e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
554e948693eSPhilip Paeps 									\
555e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
556e948693eSPhilip Paeps 		if (_lock)						\
557763cab71SAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
558e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
559e948693eSPhilip Paeps 	} while (B_FALSE)
560e948693eSPhilip Paeps 
561e948693eSPhilip Paeps #define	EFSYS_BAR_READQ(_esbp, _offset, _eqp)				\
562e948693eSPhilip Paeps 	do {								\
563e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
564e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
565e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
566e948693eSPhilip Paeps 									\
567763cab71SAndrew Rybchenko 		SFXGE_BAR_LOCK(_esbp);					\
568e948693eSPhilip Paeps 									\
569e948693eSPhilip Paeps 		(_eqp)->eq_u32[0] = bus_space_read_4((_esbp)->esb_tag,	\
570e948693eSPhilip Paeps 		    (_esbp)->esb_handle, (_offset));			\
571e948693eSPhilip Paeps 		(_eqp)->eq_u32[1] = bus_space_read_4((_esbp)->esb_tag,	\
572e948693eSPhilip Paeps 		    (_esbp)->esb_handle, (_offset+4));			\
573e948693eSPhilip Paeps 									\
574e948693eSPhilip Paeps 		EFSYS_PROBE3(bar_readq, unsigned int, (_offset),	\
575e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
576e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
577e948693eSPhilip Paeps 									\
578763cab71SAndrew Rybchenko 		SFXGE_BAR_UNLOCK(_esbp);				\
579e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
580e948693eSPhilip Paeps 	} while (B_FALSE)
581e948693eSPhilip Paeps 
582e948693eSPhilip Paeps #define	EFSYS_BAR_READO(_esbp, _offset, _eop, _lock)			\
583e948693eSPhilip Paeps 	do {								\
584e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
585e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
586e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
587e948693eSPhilip Paeps 									\
588e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
589e948693eSPhilip Paeps 		if (_lock)						\
590763cab71SAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
591e948693eSPhilip Paeps 									\
592e948693eSPhilip Paeps 		(_eop)->eo_u32[0] = bus_space_read_4((_esbp)->esb_tag,	\
593e948693eSPhilip Paeps 		    (_esbp)->esb_handle, (_offset));			\
594e948693eSPhilip Paeps 		(_eop)->eo_u32[1] = bus_space_read_4((_esbp)->esb_tag,	\
595e948693eSPhilip Paeps 		    (_esbp)->esb_handle, (_offset+4));			\
596e948693eSPhilip Paeps 		(_eop)->eo_u32[2] = bus_space_read_4((_esbp)->esb_tag,	\
597e948693eSPhilip Paeps 		    (_esbp)->esb_handle, (_offset+8));			\
598e948693eSPhilip Paeps 		(_eop)->eo_u32[3] = bus_space_read_4((_esbp)->esb_tag,	\
599e948693eSPhilip Paeps 		    (_esbp)->esb_handle, (_offset+12));			\
600e948693eSPhilip Paeps 									\
601e948693eSPhilip Paeps 		EFSYS_PROBE5(bar_reado, unsigned int, (_offset),	\
602e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
603e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
604e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
605e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
606e948693eSPhilip Paeps 									\
607e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
608e948693eSPhilip Paeps 		if (_lock)						\
609763cab71SAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
610e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
611e948693eSPhilip Paeps 	} while (B_FALSE)
612e948693eSPhilip Paeps 
613e948693eSPhilip Paeps #define	EFSYS_BAR_WRITED(_esbp, _offset, _edp, _lock)			\
614e948693eSPhilip Paeps 	do {								\
615e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
616e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)),	\
617e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
618e948693eSPhilip Paeps 									\
619e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
620e948693eSPhilip Paeps 		if (_lock)						\
621763cab71SAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);			\
622e948693eSPhilip Paeps 									\
623e948693eSPhilip Paeps 		EFSYS_PROBE2(bar_writed, unsigned int, (_offset),	\
624e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
625e948693eSPhilip Paeps 									\
626e948693eSPhilip Paeps 		bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\
627e948693eSPhilip Paeps 		    (_offset), (_edp)->ed_u32[0]);			\
628e948693eSPhilip Paeps 									\
629e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
630e948693eSPhilip Paeps 		if (_lock)						\
631763cab71SAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);		\
632e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
633e948693eSPhilip Paeps 	} while (B_FALSE)
634e948693eSPhilip Paeps 
635e948693eSPhilip Paeps #define	EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp)				\
636e948693eSPhilip Paeps 	do {								\
637e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
638e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
639e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
640e948693eSPhilip Paeps 									\
641763cab71SAndrew Rybchenko 		SFXGE_BAR_LOCK(_esbp);					\
642e948693eSPhilip Paeps 									\
643e948693eSPhilip Paeps 		EFSYS_PROBE3(bar_writeq, unsigned int, (_offset),	\
644e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
645e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
646e948693eSPhilip Paeps 									\
647e948693eSPhilip Paeps 		bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\
648e948693eSPhilip Paeps 		    (_offset), (_eqp)->eq_u32[0]);			\
649e948693eSPhilip Paeps 		bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\
650e948693eSPhilip Paeps 		    (_offset+4), (_eqp)->eq_u32[1]);			\
651e948693eSPhilip Paeps 									\
652763cab71SAndrew Rybchenko 		SFXGE_BAR_UNLOCK(_esbp);				\
653e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
654e948693eSPhilip Paeps 	} while (B_FALSE)
655e948693eSPhilip Paeps 
656e948693eSPhilip Paeps #define	EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock)			\
657e948693eSPhilip Paeps 	do {								\
658e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
659e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
660e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
661e948693eSPhilip Paeps 									\
662e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
663e948693eSPhilip Paeps 		if (_lock)						\
664763cab71SAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
665e948693eSPhilip Paeps 									\
666e948693eSPhilip Paeps 		EFSYS_PROBE5(bar_writeo, unsigned int, (_offset),	\
667e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
668e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
669e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
670e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
671e948693eSPhilip Paeps 									\
672e948693eSPhilip Paeps 		bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\
673e948693eSPhilip Paeps 		    (_offset), (_eop)->eo_u32[0]);			\
674e948693eSPhilip Paeps 		bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\
675e948693eSPhilip Paeps 		    (_offset+4), (_eop)->eo_u32[1]);			\
676e948693eSPhilip Paeps 		bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\
677e948693eSPhilip Paeps 		    (_offset+8), (_eop)->eo_u32[2]);			\
678e948693eSPhilip Paeps 		bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\
679e948693eSPhilip Paeps 		    (_offset+12), (_eop)->eo_u32[3]);			\
680e948693eSPhilip Paeps 									\
681e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
682e948693eSPhilip Paeps 		if (_lock)						\
683763cab71SAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
684e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
685e948693eSPhilip Paeps 	} while (B_FALSE)
686e948693eSPhilip Paeps 
687e948693eSPhilip Paeps /* SPIN */
688e948693eSPhilip Paeps 
689e948693eSPhilip Paeps #define	EFSYS_SPIN(_us)							\
690e948693eSPhilip Paeps 	do {								\
691e948693eSPhilip Paeps 		DELAY(_us);						\
692e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
693e948693eSPhilip Paeps 	} while (B_FALSE)
694e948693eSPhilip Paeps 
695e948693eSPhilip Paeps #define	EFSYS_SLEEP	EFSYS_SPIN
696e948693eSPhilip Paeps 
697e948693eSPhilip Paeps /* BARRIERS */
698e948693eSPhilip Paeps 
6997c00963aSAndrew Rybchenko #define	EFSYS_MEM_READ_BARRIER()	rmb()
700e948693eSPhilip Paeps #define	EFSYS_PIO_WRITE_BARRIER()
701e948693eSPhilip Paeps 
702e948693eSPhilip Paeps /* TIMESTAMP */
703e948693eSPhilip Paeps 
704e948693eSPhilip Paeps typedef	clock_t	efsys_timestamp_t;
705e948693eSPhilip Paeps 
706e948693eSPhilip Paeps #define	EFSYS_TIMESTAMP(_usp)						\
707e948693eSPhilip Paeps 	do {								\
708e948693eSPhilip Paeps 		clock_t now;						\
709e948693eSPhilip Paeps 									\
710e948693eSPhilip Paeps 		now = ticks;						\
711e948693eSPhilip Paeps 		*(_usp) = now * hz / 1000000;				\
712e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
713e948693eSPhilip Paeps 	} while (B_FALSE)
714e948693eSPhilip Paeps 
715e948693eSPhilip Paeps /* KMEM */
716e948693eSPhilip Paeps 
717e948693eSPhilip Paeps #define	EFSYS_KMEM_ALLOC(_esip, _size, _p)				\
718e948693eSPhilip Paeps 	do {								\
719e948693eSPhilip Paeps 		(_esip) = (_esip);					\
720e948693eSPhilip Paeps 		(_p) = malloc((_size), M_SFXGE, M_WAITOK|M_ZERO);	\
721e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
722e948693eSPhilip Paeps 	} while (B_FALSE)
723e948693eSPhilip Paeps 
724e948693eSPhilip Paeps #define	EFSYS_KMEM_FREE(_esip, _size, _p)				\
725e948693eSPhilip Paeps 	do {								\
726e948693eSPhilip Paeps 		(void) (_esip);						\
727e948693eSPhilip Paeps 		(void) (_size);						\
728e948693eSPhilip Paeps 		free((_p), M_SFXGE);					\
729e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
730e948693eSPhilip Paeps 	} while (B_FALSE)
731e948693eSPhilip Paeps 
732e948693eSPhilip Paeps /* LOCK */
733e948693eSPhilip Paeps 
734*33d45dc5SAndrew Rybchenko typedef struct efsys_lock_s {
735*33d45dc5SAndrew Rybchenko 	struct mtx	lock;
736*33d45dc5SAndrew Rybchenko 	char		lock_name[SFXGE_LOCK_NAME_MAX];
737*33d45dc5SAndrew Rybchenko } efsys_lock_t;
738*33d45dc5SAndrew Rybchenko 
739*33d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_LOCK_INIT(_eslp, _ifname, _label)			\
740*33d45dc5SAndrew Rybchenko 	do {								\
741*33d45dc5SAndrew Rybchenko 		efsys_lock_t *__eslp = (_eslp);				\
742*33d45dc5SAndrew Rybchenko 									\
743*33d45dc5SAndrew Rybchenko 		snprintf((__eslp)->lock_name,				\
744*33d45dc5SAndrew Rybchenko 			 sizeof((__eslp)->lock_name),			\
745*33d45dc5SAndrew Rybchenko 			 "%s:%s", (_ifname), (_label));			\
746*33d45dc5SAndrew Rybchenko 		mtx_init(&(__eslp)->lock, (__eslp)->lock_name,		\
747*33d45dc5SAndrew Rybchenko 			 NULL, MTX_DEF);				\
748*33d45dc5SAndrew Rybchenko 	} while (B_FALSE)
749*33d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_LOCK_DESTROY(_eslp)					\
750*33d45dc5SAndrew Rybchenko 	mtx_destroy(&(_eslp)->lock)
751*33d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_LOCK(_eslp)						\
752*33d45dc5SAndrew Rybchenko 	mtx_lock(&(_eslp)->lock)
753*33d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_UNLOCK(_eslp)					\
754*33d45dc5SAndrew Rybchenko 	mtx_unlock(&(_eslp)->lock)
755*33d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_LOCK_ASSERT_OWNED(_eslp)				\
756*33d45dc5SAndrew Rybchenko 	mtx_assert(&(_eslp)->lock, MA_OWNED)
757e948693eSPhilip Paeps 
758e948693eSPhilip Paeps #define	EFSYS_LOCK_MAGIC	0x000010c4
759e948693eSPhilip Paeps 
760e948693eSPhilip Paeps #define	EFSYS_LOCK(_lockp, _state)					\
761e948693eSPhilip Paeps 	do {								\
762*33d45dc5SAndrew Rybchenko 		SFXGE_EFSYS_LOCK(_lockp);				\
763e948693eSPhilip Paeps 		(_state) = EFSYS_LOCK_MAGIC;				\
764e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
765e948693eSPhilip Paeps 	} while (B_FALSE)
766e948693eSPhilip Paeps 
767e948693eSPhilip Paeps #define	EFSYS_UNLOCK(_lockp, _state)					\
768e948693eSPhilip Paeps 	do {								\
769e948693eSPhilip Paeps 		if ((_state) != EFSYS_LOCK_MAGIC)			\
770e948693eSPhilip Paeps 			KASSERT(B_FALSE, ("not locked"));		\
771*33d45dc5SAndrew Rybchenko 		SFXGE_EFSYS_UNLOCK(_lockp);				\
772e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
773e948693eSPhilip Paeps 	} while (B_FALSE)
774e948693eSPhilip Paeps 
775e948693eSPhilip Paeps /* PREEMPT */
776e948693eSPhilip Paeps 
777e948693eSPhilip Paeps #define	EFSYS_PREEMPT_DISABLE(_state)					\
778e948693eSPhilip Paeps 	do {								\
779e948693eSPhilip Paeps 		(_state) = (_state);					\
780e948693eSPhilip Paeps 		critical_enter();					\
781e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
782e948693eSPhilip Paeps 	} while (B_FALSE)
783e948693eSPhilip Paeps 
784e948693eSPhilip Paeps #define	EFSYS_PREEMPT_ENABLE(_state)					\
785e948693eSPhilip Paeps 	do {								\
786e948693eSPhilip Paeps 		(_state) = (_state);					\
787e948693eSPhilip Paeps 		critical_exit(_state);					\
788e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
789e948693eSPhilip Paeps 	} while (B_FALSE)
790e948693eSPhilip Paeps 
791e948693eSPhilip Paeps /* STAT */
792e948693eSPhilip Paeps 
793e948693eSPhilip Paeps typedef uint64_t		efsys_stat_t;
794e948693eSPhilip Paeps 
795e948693eSPhilip Paeps #define	EFSYS_STAT_INCR(_knp, _delta) 					\
796e948693eSPhilip Paeps 	do {								\
797e948693eSPhilip Paeps 		*(_knp) += (_delta);					\
798e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
799e948693eSPhilip Paeps 	} while (B_FALSE)
800e948693eSPhilip Paeps 
801e948693eSPhilip Paeps #define	EFSYS_STAT_DECR(_knp, _delta) 					\
802e948693eSPhilip Paeps 	do {								\
803e948693eSPhilip Paeps 		*(_knp) -= (_delta);					\
804e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
805e948693eSPhilip Paeps 	} while (B_FALSE)
806e948693eSPhilip Paeps 
807e948693eSPhilip Paeps #define	EFSYS_STAT_SET(_knp, _val)					\
808e948693eSPhilip Paeps 	do {								\
809e948693eSPhilip Paeps 		*(_knp) = (_val);					\
810e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
811e948693eSPhilip Paeps 	} while (B_FALSE)
812e948693eSPhilip Paeps 
813e948693eSPhilip Paeps #define	EFSYS_STAT_SET_QWORD(_knp, _valp)				\
814e948693eSPhilip Paeps 	do {								\
815e948693eSPhilip Paeps 		*(_knp) = le64toh((_valp)->eq_u64[0]);			\
816e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
817e948693eSPhilip Paeps 	} while (B_FALSE)
818e948693eSPhilip Paeps 
819e948693eSPhilip Paeps #define	EFSYS_STAT_SET_DWORD(_knp, _valp)				\
820e948693eSPhilip Paeps 	do {								\
821e948693eSPhilip Paeps 		*(_knp) = le32toh((_valp)->ed_u32[0]);			\
822e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
823e948693eSPhilip Paeps 	} while (B_FALSE)
824e948693eSPhilip Paeps 
825e948693eSPhilip Paeps #define	EFSYS_STAT_INCR_QWORD(_knp, _valp)				\
826e948693eSPhilip Paeps 	do {								\
827e948693eSPhilip Paeps 		*(_knp) += le64toh((_valp)->eq_u64[0]);			\
828e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
829e948693eSPhilip Paeps 	} while (B_FALSE)
830e948693eSPhilip Paeps 
831e948693eSPhilip Paeps #define	EFSYS_STAT_SUBR_QWORD(_knp, _valp)				\
832e948693eSPhilip Paeps 	do {								\
833e948693eSPhilip Paeps 		*(_knp) -= le64toh((_valp)->eq_u64[0]);			\
834e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
835e948693eSPhilip Paeps 	} while (B_FALSE)
836e948693eSPhilip Paeps 
837e948693eSPhilip Paeps /* ERR */
838e948693eSPhilip Paeps 
839e948693eSPhilip Paeps extern void	sfxge_err(efsys_identifier_t *, unsigned int,
840e948693eSPhilip Paeps 		    uint32_t, uint32_t);
841e948693eSPhilip Paeps 
842e948693eSPhilip Paeps #if EFSYS_OPT_DECODE_INTR_FATAL
843e948693eSPhilip Paeps #define	EFSYS_ERR(_esip, _code, _dword0, _dword1)			\
844e948693eSPhilip Paeps 	do {								\
845e948693eSPhilip Paeps 		sfxge_err((_esip), (_code), (_dword0), (_dword1));	\
846e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
847e948693eSPhilip Paeps 	} while (B_FALSE)
848e948693eSPhilip Paeps #endif
849e948693eSPhilip Paeps 
850e948693eSPhilip Paeps /* ASSERT */
851e948693eSPhilip Paeps 
852e948693eSPhilip Paeps #define	EFSYS_ASSERT(_exp) do {						\
853e948693eSPhilip Paeps 	if (!(_exp))							\
854e948693eSPhilip Paeps 		panic(#_exp);						\
855e948693eSPhilip Paeps 	} while (0)
856e948693eSPhilip Paeps 
857e948693eSPhilip Paeps #define	EFSYS_ASSERT3(_x, _op, _y, _t) do {				\
858e948693eSPhilip Paeps 	const _t __x = (_t)(_x);					\
859e948693eSPhilip Paeps 	const _t __y = (_t)(_y);					\
860e948693eSPhilip Paeps 	if (!(__x _op __y))						\
861e948693eSPhilip Paeps 		panic("assertion failed at %s:%u", __FILE__, __LINE__);	\
862e948693eSPhilip Paeps 	} while(0)
863e948693eSPhilip Paeps 
864e948693eSPhilip Paeps #define	EFSYS_ASSERT3U(_x, _op, _y)	EFSYS_ASSERT3(_x, _op, _y, uint64_t)
865e948693eSPhilip Paeps #define	EFSYS_ASSERT3S(_x, _op, _y)	EFSYS_ASSERT3(_x, _op, _y, int64_t)
866e948693eSPhilip Paeps #define	EFSYS_ASSERT3P(_x, _op, _y)	EFSYS_ASSERT3(_x, _op, _y, uintptr_t)
867e948693eSPhilip Paeps 
868e948693eSPhilip Paeps #ifdef	__cplusplus
869e948693eSPhilip Paeps }
870e948693eSPhilip Paeps #endif
871e948693eSPhilip Paeps 
872e948693eSPhilip Paeps #endif	/* _SYS_EFSYS_H */
873