xref: /freebsd/sys/dev/sfxge/common/efsys.h (revision d9ff48ab2c8aabe6ae36d179de61855736b7cbce)
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
540f999687SAndrew Rybchenko #if defined(__x86_64__)
550f999687SAndrew Rybchenko #define	EFSYS_USE_UINT64 1
560f999687SAndrew Rybchenko #else
57e948693eSPhilip Paeps #define	EFSYS_USE_UINT64 0
580f999687SAndrew Rybchenko #endif
59e948693eSPhilip Paeps #if _BYTE_ORDER == _BIG_ENDIAN
60e948693eSPhilip Paeps #define	EFSYS_IS_BIG_ENDIAN 1
61e948693eSPhilip Paeps #define	EFSYS_IS_LITTLE_ENDIAN 0
62e948693eSPhilip Paeps #elif _BYTE_ORDER == _LITTLE_ENDIAN
63e948693eSPhilip Paeps #define	EFSYS_IS_BIG_ENDIAN 0
64e948693eSPhilip Paeps #define	EFSYS_IS_LITTLE_ENDIAN 1
65e948693eSPhilip Paeps #endif
66e948693eSPhilip Paeps #include "efx_types.h"
67e948693eSPhilip Paeps 
68e948693eSPhilip Paeps /* Common code requires this */
69e948693eSPhilip Paeps #if __FreeBSD_version < 800068
70e948693eSPhilip Paeps #define	memmove(d, s, l) bcopy(s, d, l)
71e948693eSPhilip Paeps #endif
72e948693eSPhilip Paeps 
73e948693eSPhilip Paeps /* FreeBSD equivalents of Solaris things */
74e948693eSPhilip Paeps #ifndef _NOTE
75e948693eSPhilip Paeps #define	_NOTE(s)
76e948693eSPhilip Paeps #endif
77e948693eSPhilip Paeps 
78e948693eSPhilip Paeps #ifndef B_FALSE
79e948693eSPhilip Paeps #define	B_FALSE	FALSE
80e948693eSPhilip Paeps #endif
81e948693eSPhilip Paeps #ifndef B_TRUE
82e948693eSPhilip Paeps #define	B_TRUE	TRUE
83e948693eSPhilip Paeps #endif
84e948693eSPhilip Paeps 
85e948693eSPhilip Paeps #ifndef IS_P2ALIGNED
86e948693eSPhilip Paeps #define	IS_P2ALIGNED(v, a)	((((uintptr_t)(v)) & ((uintptr_t)(a) - 1)) == 0)
87e948693eSPhilip Paeps #endif
88e948693eSPhilip Paeps 
89e948693eSPhilip Paeps #ifndef P2ROUNDUP
90e948693eSPhilip Paeps #define	P2ROUNDUP(x, align)	(-(-(x) & -(align)))
91e948693eSPhilip Paeps #endif
92e948693eSPhilip Paeps 
93e948693eSPhilip Paeps #ifndef IS2P
94e948693eSPhilip Paeps #define	ISP2(x)			(((x) & ((x) - 1)) == 0)
95e948693eSPhilip Paeps #endif
96e948693eSPhilip Paeps 
97*d9ff48abSAndrew Rybchenko #if defined(__x86_64__)
98*d9ff48abSAndrew Rybchenko #if !defined(bus_space_read_stream_8)
99*d9ff48abSAndrew Rybchenko #define	bus_space_read_stream_8(t, h, o)				\
100*d9ff48abSAndrew Rybchenko 	bus_space_read_8((t), (h), (o))
101*d9ff48abSAndrew Rybchenko #define	bus_space_write_stream_8(t, h, o, v)				\
102*d9ff48abSAndrew Rybchenko 	bus_space_write_8((t), (h), (o), (v))
103*d9ff48abSAndrew Rybchenko #endif
104*d9ff48abSAndrew Rybchenko #endif
105*d9ff48abSAndrew Rybchenko 
106e948693eSPhilip Paeps #define	ENOTACTIVE EINVAL
107e948693eSPhilip Paeps 
108e948693eSPhilip Paeps /* Memory type to use on FreeBSD */
109e948693eSPhilip Paeps MALLOC_DECLARE(M_SFXGE);
110e948693eSPhilip Paeps 
111e948693eSPhilip Paeps /* Machine dependend prefetch wrappers */
112dc1788e8SMarius Strobl #if defined(__i386__) || defined(__amd64__)
113e948693eSPhilip Paeps static __inline void
114e948693eSPhilip Paeps prefetch_read_many(void *addr)
115e948693eSPhilip Paeps {
116dc1788e8SMarius Strobl 
117e948693eSPhilip Paeps 	__asm__(
118e948693eSPhilip Paeps 	    "prefetcht0 (%0)"
119e948693eSPhilip Paeps 	    :
120e948693eSPhilip Paeps 	    : "r" (addr));
121e948693eSPhilip Paeps }
122e948693eSPhilip Paeps 
123e948693eSPhilip Paeps static __inline void
124e948693eSPhilip Paeps prefetch_read_once(void *addr)
125e948693eSPhilip Paeps {
126dc1788e8SMarius Strobl 
127e948693eSPhilip Paeps 	__asm__(
128e948693eSPhilip Paeps 	    "prefetchnta (%0)"
129e948693eSPhilip Paeps 	    :
130e948693eSPhilip Paeps 	    : "r" (addr));
131e948693eSPhilip Paeps }
132dc1788e8SMarius Strobl #elif defined(__sparc64__)
133dc1788e8SMarius Strobl static __inline void
134dc1788e8SMarius Strobl prefetch_read_many(void *addr)
135dc1788e8SMarius Strobl {
136dc1788e8SMarius Strobl 
137dc1788e8SMarius Strobl 	__asm__(
138dc1788e8SMarius Strobl 	    "prefetch [%0], 0"
139dc1788e8SMarius Strobl 	    :
140dc1788e8SMarius Strobl 	    : "r" (addr));
141dc1788e8SMarius Strobl }
142dc1788e8SMarius Strobl 
143dc1788e8SMarius Strobl static __inline void
144dc1788e8SMarius Strobl prefetch_read_once(void *addr)
145dc1788e8SMarius Strobl {
146dc1788e8SMarius Strobl 
147dc1788e8SMarius Strobl 	__asm__(
148dc1788e8SMarius Strobl 	    "prefetch [%0], 1"
149dc1788e8SMarius Strobl 	    :
150dc1788e8SMarius Strobl 	    : "r" (addr));
151dc1788e8SMarius Strobl }
152dc1788e8SMarius Strobl #else
153dc1788e8SMarius Strobl static __inline void
154dc1788e8SMarius Strobl prefetch_read_many(void *addr)
155dc1788e8SMarius Strobl {
156dc1788e8SMarius Strobl 
157dc1788e8SMarius Strobl }
158dc1788e8SMarius Strobl 
159dc1788e8SMarius Strobl static __inline void
160dc1788e8SMarius Strobl prefetch_read_once(void *addr)
161dc1788e8SMarius Strobl {
162dc1788e8SMarius Strobl 
163dc1788e8SMarius Strobl }
164e948693eSPhilip Paeps #endif
165e948693eSPhilip Paeps 
166e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__)
167e948693eSPhilip Paeps #include <vm/vm.h>
168e948693eSPhilip Paeps #include <vm/pmap.h>
169e948693eSPhilip Paeps #endif
170e948693eSPhilip Paeps static __inline void
171e948693eSPhilip Paeps sfxge_map_mbuf_fast(bus_dma_tag_t tag, bus_dmamap_t map,
172e948693eSPhilip Paeps     struct mbuf *m, bus_dma_segment_t *seg)
173e948693eSPhilip Paeps {
174e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__)
175e948693eSPhilip Paeps 	seg->ds_addr = pmap_kextract(mtod(m, vm_offset_t));
176e948693eSPhilip Paeps 	seg->ds_len = m->m_len;
177e948693eSPhilip Paeps #else
178e948693eSPhilip Paeps 	int nsegstmp;
179e948693eSPhilip Paeps 
180e948693eSPhilip Paeps 	bus_dmamap_load_mbuf_sg(tag, map, m, seg, &nsegstmp, 0);
181e948693eSPhilip Paeps #endif
182e948693eSPhilip Paeps }
183e948693eSPhilip Paeps 
184e948693eSPhilip Paeps /* Modifiers used for DOS builds */
185e948693eSPhilip Paeps #define	__cs
186e948693eSPhilip Paeps #define	__far
187e948693eSPhilip Paeps 
188e948693eSPhilip Paeps /* Modifiers used for Windows builds */
189e948693eSPhilip Paeps #define	__in
190e948693eSPhilip Paeps #define	__in_opt
191e948693eSPhilip Paeps #define	__in_ecount(_n)
192e948693eSPhilip Paeps #define	__in_ecount_opt(_n)
193e948693eSPhilip Paeps #define	__in_bcount(_n)
194e948693eSPhilip Paeps #define	__in_bcount_opt(_n)
195e948693eSPhilip Paeps 
196e948693eSPhilip Paeps #define	__out
197e948693eSPhilip Paeps #define	__out_opt
198e948693eSPhilip Paeps #define	__out_ecount(_n)
199e948693eSPhilip Paeps #define	__out_ecount_opt(_n)
200e948693eSPhilip Paeps #define	__out_bcount(_n)
201e948693eSPhilip Paeps #define	__out_bcount_opt(_n)
202e948693eSPhilip Paeps 
203e948693eSPhilip Paeps #define	__deref_out
204e948693eSPhilip Paeps 
205e948693eSPhilip Paeps #define	__inout
206e948693eSPhilip Paeps #define	__inout_opt
207e948693eSPhilip Paeps #define	__inout_ecount(_n)
208e948693eSPhilip Paeps #define	__inout_ecount_opt(_n)
209e948693eSPhilip Paeps #define	__inout_bcount(_n)
210e948693eSPhilip Paeps #define	__inout_bcount_opt(_n)
211e948693eSPhilip Paeps #define	__inout_bcount_full_opt(_n)
212e948693eSPhilip Paeps 
213e948693eSPhilip Paeps #define	__deref_out_bcount_opt(n)
214e948693eSPhilip Paeps 
215e948693eSPhilip Paeps #define	__checkReturn
216e948693eSPhilip Paeps 
217e948693eSPhilip Paeps #define	__drv_when(_p, _c)
218e948693eSPhilip Paeps 
219e948693eSPhilip Paeps /* Code inclusion options */
220e948693eSPhilip Paeps 
221e948693eSPhilip Paeps 
222e948693eSPhilip Paeps #define	EFSYS_OPT_NAMES 1
223e948693eSPhilip Paeps 
224e948693eSPhilip Paeps #define	EFSYS_OPT_FALCON 0
225e948693eSPhilip Paeps #define	EFSYS_OPT_FALCON_NIC_CFG_OVERRIDE 0
226e948693eSPhilip Paeps #define	EFSYS_OPT_SIENA 1
227e948693eSPhilip Paeps #ifdef DEBUG
228e948693eSPhilip Paeps #define	EFSYS_OPT_CHECK_REG 1
229e948693eSPhilip Paeps #else
230e948693eSPhilip Paeps #define	EFSYS_OPT_CHECK_REG 0
231e948693eSPhilip Paeps #endif
232e948693eSPhilip Paeps 
233e948693eSPhilip Paeps #define	EFSYS_OPT_MCDI 1
234e948693eSPhilip Paeps 
235e948693eSPhilip Paeps #define	EFSYS_OPT_MAC_FALCON_GMAC 0
236e948693eSPhilip Paeps #define	EFSYS_OPT_MAC_FALCON_XMAC 0
237e948693eSPhilip Paeps #define	EFSYS_OPT_MAC_STATS 1
238e948693eSPhilip Paeps 
239e948693eSPhilip Paeps #define	EFSYS_OPT_LOOPBACK 0
240e948693eSPhilip Paeps 
241e948693eSPhilip Paeps #define	EFSYS_OPT_MON_NULL 0
242e948693eSPhilip Paeps #define	EFSYS_OPT_MON_LM87 0
243e948693eSPhilip Paeps #define	EFSYS_OPT_MON_MAX6647 0
244e948693eSPhilip Paeps #define	EFSYS_OPT_MON_SIENA 0
245e948693eSPhilip Paeps #define	EFSYS_OPT_MON_STATS 0
246e948693eSPhilip Paeps 
247e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_NULL 0
248e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_QT2022C2 0
249e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_SFX7101 0
250e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_TXC43128 0
251e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_PM8358 0
252e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_SFT9001 0
253e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_QT2025C 0
254e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_STATS 1
255e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_PROPS 0
256e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_BIST 1
257e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_LED_CONTROL 1
258e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_FLAGS 0
259e948693eSPhilip Paeps 
260e948693eSPhilip Paeps #define	EFSYS_OPT_VPD 1
261e948693eSPhilip Paeps #define	EFSYS_OPT_NVRAM 1
262e948693eSPhilip Paeps #define	EFSYS_OPT_NVRAM_FALCON_BOOTROM 0
263e948693eSPhilip Paeps #define	EFSYS_OPT_NVRAM_SFT9001	0
264e948693eSPhilip Paeps #define	EFSYS_OPT_NVRAM_SFX7101	0
265e948693eSPhilip Paeps #define	EFSYS_OPT_BOOTCFG 0
266e948693eSPhilip Paeps 
267e948693eSPhilip Paeps #define	EFSYS_OPT_PCIE_TUNE 0
268e948693eSPhilip Paeps #define	EFSYS_OPT_DIAG 0
269e948693eSPhilip Paeps #define	EFSYS_OPT_WOL 1
270e948693eSPhilip Paeps #define	EFSYS_OPT_RX_SCALE 1
271e948693eSPhilip Paeps #define	EFSYS_OPT_QSTATS 1
272e948693eSPhilip Paeps #define	EFSYS_OPT_FILTER 0
273e948693eSPhilip Paeps #define	EFSYS_OPT_RX_SCATTER 0
274e948693eSPhilip Paeps #define	EFSYS_OPT_RX_HDR_SPLIT 0
275e948693eSPhilip Paeps 
276e948693eSPhilip Paeps #define	EFSYS_OPT_EV_PREFETCH 0
277e948693eSPhilip Paeps 
278e948693eSPhilip Paeps #define	EFSYS_OPT_DECODE_INTR_FATAL 1
279e948693eSPhilip Paeps 
280e948693eSPhilip Paeps /* ID */
281e948693eSPhilip Paeps 
282e948693eSPhilip Paeps typedef struct __efsys_identifier_s	efsys_identifier_t;
283e948693eSPhilip Paeps 
284e948693eSPhilip Paeps /* PROBE */
285e948693eSPhilip Paeps 
28654366c0bSAttilio Rao #ifndef DTRACE_PROBE
287e948693eSPhilip Paeps 
288e948693eSPhilip Paeps #define	EFSYS_PROBE(_name)
289e948693eSPhilip Paeps 
290e948693eSPhilip Paeps #define	EFSYS_PROBE1(_name, _type1, _arg1)
291e948693eSPhilip Paeps 
292e948693eSPhilip Paeps #define	EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2)
293e948693eSPhilip Paeps 
294e948693eSPhilip Paeps #define	EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2,		\
295e948693eSPhilip Paeps 	    _type3, _arg3)
296e948693eSPhilip Paeps 
297e948693eSPhilip Paeps #define	EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2,		\
298e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4)
299e948693eSPhilip Paeps 
300e948693eSPhilip Paeps #define	EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
301e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)
302e948693eSPhilip Paeps 
303e948693eSPhilip Paeps #define	EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
304e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
305e948693eSPhilip Paeps 	    _type6, _arg6)
306e948693eSPhilip Paeps 
307e948693eSPhilip Paeps #define	EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2,		\
308e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
309e948693eSPhilip Paeps 	    _type6, _arg6, _type7, _arg7)
310e948693eSPhilip Paeps 
31154366c0bSAttilio Rao #else /* DTRACE_PROBE */
312e948693eSPhilip Paeps 
313e948693eSPhilip Paeps #define	EFSYS_PROBE(_name)						\
314e948693eSPhilip Paeps 	DTRACE_PROBE(_name)
315e948693eSPhilip Paeps 
316e948693eSPhilip Paeps #define	EFSYS_PROBE1(_name, _type1, _arg1)				\
317e948693eSPhilip Paeps 	DTRACE_PROBE1(_name, _type1, _arg1)
318e948693eSPhilip Paeps 
319e948693eSPhilip Paeps #define	EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2)		\
320e948693eSPhilip Paeps 	DTRACE_PROBE2(_name, _type1, _arg1, _type2, _arg2)
321e948693eSPhilip Paeps 
322e948693eSPhilip Paeps #define	EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2,		\
323e948693eSPhilip Paeps 	    _type3, _arg3)						\
324e948693eSPhilip Paeps 	DTRACE_PROBE3(_name, _type1, _arg1, _type2, _arg2,		\
325e948693eSPhilip Paeps 	    _type3, _arg3)
326e948693eSPhilip Paeps 
327e948693eSPhilip Paeps #define	EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2,		\
328e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4)				\
329e948693eSPhilip Paeps 	DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2,		\
330e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4)
331e948693eSPhilip Paeps 
332e948693eSPhilip Paeps #ifdef DTRACE_PROBE5
333e948693eSPhilip Paeps #define	EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
334e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)		\
335e948693eSPhilip Paeps 	DTRACE_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
336e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)
337e948693eSPhilip Paeps #else
338e948693eSPhilip Paeps #define	EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
339e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)		\
340e948693eSPhilip Paeps 	DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2,		\
341e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4)
342e948693eSPhilip Paeps #endif
343e948693eSPhilip Paeps 
344e948693eSPhilip Paeps #ifdef DTRACE_PROBE6
345e948693eSPhilip Paeps #define	EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
346e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
347e948693eSPhilip Paeps 	    _type6, _arg6)						\
348e948693eSPhilip Paeps 	DTRACE_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
349e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
350e948693eSPhilip Paeps 	    _type6, _arg6)
351e948693eSPhilip Paeps #else
352e948693eSPhilip Paeps #define	EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
353e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
354e948693eSPhilip Paeps 	    _type6, _arg6)						\
355e948693eSPhilip Paeps 	EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
356e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)
357e948693eSPhilip Paeps #endif
358e948693eSPhilip Paeps 
359e948693eSPhilip Paeps #ifdef DTRACE_PROBE7
360e948693eSPhilip Paeps #define	EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2,		\
361e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
362e948693eSPhilip Paeps 	    _type6, _arg6, _type7, _arg7)				\
363e948693eSPhilip Paeps 	DTRACE_PROBE7(_name, _type1, _arg1, _type2, _arg2,		\
364e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
365e948693eSPhilip Paeps 	    _type6, _arg6, _type7, _arg7)
366e948693eSPhilip Paeps #else
367e948693eSPhilip Paeps #define	EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2,		\
368e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
369e948693eSPhilip Paeps 	    _type6, _arg6, _type7, _arg7)				\
370e948693eSPhilip Paeps 	EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
371e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
372e948693eSPhilip Paeps 	    _type6, _arg6)
373e948693eSPhilip Paeps #endif
374e948693eSPhilip Paeps 
37554366c0bSAttilio Rao #endif /* DTRACE_PROBE */
376e948693eSPhilip Paeps 
377e948693eSPhilip Paeps /* DMA */
378e948693eSPhilip Paeps 
379e948693eSPhilip Paeps typedef uint64_t		efsys_dma_addr_t;
380e948693eSPhilip Paeps 
381e948693eSPhilip Paeps typedef struct efsys_mem_s {
382e948693eSPhilip Paeps 	bus_dma_tag_t		esm_tag;
383e948693eSPhilip Paeps 	bus_dmamap_t		esm_map;
384e948693eSPhilip Paeps 	caddr_t			esm_base;
385e948693eSPhilip Paeps 	efsys_dma_addr_t	esm_addr;
386e948693eSPhilip Paeps } efsys_mem_t;
387e948693eSPhilip Paeps 
388e948693eSPhilip Paeps 
389e948693eSPhilip Paeps #define	EFSYS_MEM_ZERO(_esmp, _size)					\
390e948693eSPhilip Paeps 	do {								\
391e948693eSPhilip Paeps 		(void) memset((_esmp)->esm_base, 0, (_size));		\
392e948693eSPhilip Paeps 									\
393e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
394e948693eSPhilip Paeps 	} while (B_FALSE)
395e948693eSPhilip Paeps 
396e948693eSPhilip Paeps #define	EFSYS_MEM_READD(_esmp, _offset, _edp)				\
397e948693eSPhilip Paeps 	do {								\
398e948693eSPhilip Paeps 		uint32_t *addr;						\
399e948693eSPhilip Paeps 									\
400e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
401e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)),	\
402e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
403e948693eSPhilip Paeps 									\
404e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
405e948693eSPhilip Paeps 									\
406e948693eSPhilip Paeps 		(_edp)->ed_u32[0] = *addr;				\
407e948693eSPhilip Paeps 									\
408e948693eSPhilip Paeps 		EFSYS_PROBE2(mem_readd, unsigned int, (_offset),	\
409e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
410e948693eSPhilip Paeps 									\
411e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
412e948693eSPhilip Paeps 	} while (B_FALSE)
413e948693eSPhilip Paeps 
4140f999687SAndrew Rybchenko #if defined(__x86_64__)
4150f999687SAndrew Rybchenko #define	EFSYS_MEM_READQ(_esmp, _offset, _eqp)				\
4160f999687SAndrew Rybchenko 	do {								\
4170f999687SAndrew Rybchenko 		uint64_t *addr;						\
4180f999687SAndrew Rybchenko 									\
4190f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
4200f999687SAndrew Rybchenko 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
4210f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
4220f999687SAndrew Rybchenko 									\
4230f999687SAndrew Rybchenko 		addr = (void *)((_esmp)->esm_base + (_offset));		\
4240f999687SAndrew Rybchenko 									\
4250f999687SAndrew Rybchenko 		(_eqp)->eq_u64[0] = *addr;				\
4260f999687SAndrew Rybchenko 									\
4270f999687SAndrew Rybchenko 		EFSYS_PROBE3(mem_readq, unsigned int, (_offset),	\
4280f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[1],			\
4290f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[0]);			\
4300f999687SAndrew Rybchenko 									\
4310f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
4320f999687SAndrew Rybchenko 	} while (B_FALSE)
4330f999687SAndrew Rybchenko #else
434e948693eSPhilip Paeps #define	EFSYS_MEM_READQ(_esmp, _offset, _eqp)				\
435e948693eSPhilip Paeps 	do {								\
436e948693eSPhilip Paeps 		uint32_t *addr;						\
437e948693eSPhilip Paeps 									\
438e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
439e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
440e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
441e948693eSPhilip Paeps 									\
442e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
443e948693eSPhilip Paeps 									\
444e948693eSPhilip Paeps 		(_eqp)->eq_u32[0] = *addr++;				\
445e948693eSPhilip Paeps 		(_eqp)->eq_u32[1] = *addr;				\
446e948693eSPhilip Paeps 									\
447e948693eSPhilip Paeps 		EFSYS_PROBE3(mem_readq, unsigned int, (_offset),	\
448e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
449e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
450e948693eSPhilip Paeps 									\
451e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
452e948693eSPhilip Paeps 	} while (B_FALSE)
4530f999687SAndrew Rybchenko #endif
454e948693eSPhilip Paeps 
4550f999687SAndrew Rybchenko #if defined(__x86_64__)
4560f999687SAndrew Rybchenko #define	EFSYS_MEM_READO(_esmp, _offset, _eop)				\
4570f999687SAndrew Rybchenko 	do {								\
4580f999687SAndrew Rybchenko 		uint64_t *addr;						\
4590f999687SAndrew Rybchenko 									\
4600f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
4610f999687SAndrew Rybchenko 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
4620f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
4630f999687SAndrew Rybchenko 									\
4640f999687SAndrew Rybchenko 		addr = (void *)((_esmp)->esm_base + (_offset));		\
4650f999687SAndrew Rybchenko 									\
4660f999687SAndrew Rybchenko 		(_eop)->eo_u64[0] = *addr++;				\
4670f999687SAndrew Rybchenko 		(_eop)->eo_u64[1] = *addr;				\
4680f999687SAndrew Rybchenko 									\
4690f999687SAndrew Rybchenko 		EFSYS_PROBE5(mem_reado, unsigned int, (_offset),	\
4700f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[3],			\
4710f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[2],			\
4720f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[1],			\
4730f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[0]);			\
4740f999687SAndrew Rybchenko 									\
4750f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
4760f999687SAndrew Rybchenko 	} while (B_FALSE)
4770f999687SAndrew Rybchenko #else
478e948693eSPhilip Paeps #define	EFSYS_MEM_READO(_esmp, _offset, _eop)				\
479e948693eSPhilip Paeps 	do {								\
480e948693eSPhilip Paeps 		uint32_t *addr;						\
481e948693eSPhilip Paeps 									\
482e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
483e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
484e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
485e948693eSPhilip Paeps 									\
486e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
487e948693eSPhilip Paeps 									\
488e948693eSPhilip Paeps 		(_eop)->eo_u32[0] = *addr++;				\
489e948693eSPhilip Paeps 		(_eop)->eo_u32[1] = *addr++;				\
490e948693eSPhilip Paeps 		(_eop)->eo_u32[2] = *addr++;				\
491e948693eSPhilip Paeps 		(_eop)->eo_u32[3] = *addr;				\
492e948693eSPhilip Paeps 									\
493e948693eSPhilip Paeps 		EFSYS_PROBE5(mem_reado, unsigned int, (_offset),	\
494e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
495e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
496e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
497e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
498e948693eSPhilip Paeps 									\
499e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
500e948693eSPhilip Paeps 	} while (B_FALSE)
5010f999687SAndrew Rybchenko #endif
502e948693eSPhilip Paeps 
503e948693eSPhilip Paeps #define	EFSYS_MEM_WRITED(_esmp, _offset, _edp)				\
504e948693eSPhilip Paeps 	do {								\
505e948693eSPhilip Paeps 		uint32_t *addr;						\
506e948693eSPhilip Paeps 									\
507e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
508e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)),	\
509e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
510e948693eSPhilip Paeps 									\
511e948693eSPhilip Paeps 		EFSYS_PROBE2(mem_writed, unsigned int, (_offset),	\
512e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
513e948693eSPhilip Paeps 									\
514e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
515e948693eSPhilip Paeps 									\
516e948693eSPhilip Paeps 		*addr = (_edp)->ed_u32[0];				\
517e948693eSPhilip Paeps 									\
518e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
519e948693eSPhilip Paeps 	} while (B_FALSE)
520e948693eSPhilip Paeps 
5210f999687SAndrew Rybchenko #if defined(__x86_64__)
5220f999687SAndrew Rybchenko #define	EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp)				\
5230f999687SAndrew Rybchenko 	do {								\
5240f999687SAndrew Rybchenko 		uint64_t *addr;						\
5250f999687SAndrew Rybchenko 									\
5260f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
5270f999687SAndrew Rybchenko 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
5280f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
5290f999687SAndrew Rybchenko 									\
5300f999687SAndrew Rybchenko 		EFSYS_PROBE3(mem_writeq, unsigned int, (_offset),	\
5310f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[1],			\
5320f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[0]);			\
5330f999687SAndrew Rybchenko 									\
5340f999687SAndrew Rybchenko 		addr = (void *)((_esmp)->esm_base + (_offset));		\
5350f999687SAndrew Rybchenko 									\
5360f999687SAndrew Rybchenko 		*addr   = (_eqp)->eq_u64[0];				\
5370f999687SAndrew Rybchenko 									\
5380f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
5390f999687SAndrew Rybchenko 	} while (B_FALSE)
5400f999687SAndrew Rybchenko 
5410f999687SAndrew Rybchenko #else
542e948693eSPhilip Paeps #define	EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp)				\
543e948693eSPhilip Paeps 	do {								\
544e948693eSPhilip Paeps 		uint32_t *addr;						\
545e948693eSPhilip Paeps 									\
546e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
547e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
548e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
549e948693eSPhilip Paeps 									\
550e948693eSPhilip Paeps 		EFSYS_PROBE3(mem_writeq, unsigned int, (_offset),	\
551e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
552e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
553e948693eSPhilip Paeps 									\
554e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
555e948693eSPhilip Paeps 									\
556e948693eSPhilip Paeps 		*addr++ = (_eqp)->eq_u32[0];				\
557e948693eSPhilip Paeps 		*addr   = (_eqp)->eq_u32[1];				\
558e948693eSPhilip Paeps 									\
559e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
560e948693eSPhilip Paeps 	} while (B_FALSE)
5610f999687SAndrew Rybchenko #endif
562e948693eSPhilip Paeps 
5630f999687SAndrew Rybchenko #if defined(__x86_64__)
5640f999687SAndrew Rybchenko #define	EFSYS_MEM_WRITEO(_esmp, _offset, _eop)				\
5650f999687SAndrew Rybchenko 	do {								\
5660f999687SAndrew Rybchenko 		uint64_t *addr;						\
5670f999687SAndrew Rybchenko 									\
5680f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
5690f999687SAndrew Rybchenko 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
5700f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
5710f999687SAndrew Rybchenko 									\
5720f999687SAndrew Rybchenko 		EFSYS_PROBE5(mem_writeo, unsigned int, (_offset),	\
5730f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[3],			\
5740f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[2],			\
5750f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[1],			\
5760f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[0]);			\
5770f999687SAndrew Rybchenko 									\
5780f999687SAndrew Rybchenko 		addr = (void *)((_esmp)->esm_base + (_offset));		\
5790f999687SAndrew Rybchenko 									\
5800f999687SAndrew Rybchenko 		*addr++ = (_eop)->eo_u64[0];				\
5810f999687SAndrew Rybchenko 		*addr   = (_eop)->eo_u64[1];				\
5820f999687SAndrew Rybchenko 									\
5830f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
5840f999687SAndrew Rybchenko 	} while (B_FALSE)
5850f999687SAndrew Rybchenko #else
586e948693eSPhilip Paeps #define	EFSYS_MEM_WRITEO(_esmp, _offset, _eop)				\
587e948693eSPhilip Paeps 	do {								\
588e948693eSPhilip Paeps 		uint32_t *addr;						\
589e948693eSPhilip Paeps 									\
590e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
591e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
592e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
593e948693eSPhilip Paeps 									\
594e948693eSPhilip Paeps 		EFSYS_PROBE5(mem_writeo, unsigned int, (_offset),	\
595e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
596e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
597e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
598e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
599e948693eSPhilip Paeps 									\
600e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
601e948693eSPhilip Paeps 									\
602e948693eSPhilip Paeps 		*addr++ = (_eop)->eo_u32[0];				\
603e948693eSPhilip Paeps 		*addr++ = (_eop)->eo_u32[1];				\
604e948693eSPhilip Paeps 		*addr++ = (_eop)->eo_u32[2];				\
605e948693eSPhilip Paeps 		*addr   = (_eop)->eo_u32[3];				\
606e948693eSPhilip Paeps 									\
607e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
608e948693eSPhilip Paeps 	} while (B_FALSE)
6090f999687SAndrew Rybchenko #endif
610e948693eSPhilip Paeps 
611e948693eSPhilip Paeps #define	EFSYS_MEM_ADDR(_esmp)						\
612e948693eSPhilip Paeps 	((_esmp)->esm_addr)
613e948693eSPhilip Paeps 
614e948693eSPhilip Paeps /* BAR */
615e948693eSPhilip Paeps 
61633d45dc5SAndrew Rybchenko #define	SFXGE_LOCK_NAME_MAX	16
61733d45dc5SAndrew Rybchenko 
618e948693eSPhilip Paeps typedef struct efsys_bar_s {
619e948693eSPhilip Paeps 	struct mtx		esb_lock;
62033d45dc5SAndrew Rybchenko 	char			esb_lock_name[SFXGE_LOCK_NAME_MAX];
621e948693eSPhilip Paeps 	bus_space_tag_t		esb_tag;
622e948693eSPhilip Paeps 	bus_space_handle_t	esb_handle;
623e948693eSPhilip Paeps 	int			esb_rid;
624e948693eSPhilip Paeps 	struct resource		*esb_res;
625e948693eSPhilip Paeps } efsys_bar_t;
626e948693eSPhilip Paeps 
62733d45dc5SAndrew Rybchenko #define	SFXGE_BAR_LOCK_INIT(_esbp, _ifname)				\
62833d45dc5SAndrew Rybchenko 	do {								\
62933d45dc5SAndrew Rybchenko 		snprintf((_esbp)->esb_lock_name,			\
63033d45dc5SAndrew Rybchenko 			 sizeof((_esbp)->esb_lock_name),		\
63133d45dc5SAndrew Rybchenko 			 "%s:bar", (_ifname));				\
63233d45dc5SAndrew Rybchenko 		mtx_init(&(_esbp)->esb_lock, (_esbp)->esb_lock_name,	\
63333d45dc5SAndrew Rybchenko 			 NULL, MTX_DEF);				\
63433d45dc5SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
63533d45dc5SAndrew Rybchenko 	} while (B_FALSE)
636763cab71SAndrew Rybchenko #define	SFXGE_BAR_LOCK_DESTROY(_esbp)					\
637763cab71SAndrew Rybchenko 	mtx_destroy(&(_esbp)->esb_lock)
638763cab71SAndrew Rybchenko #define	SFXGE_BAR_LOCK(_esbp)						\
639763cab71SAndrew Rybchenko 	mtx_lock(&(_esbp)->esb_lock)
640763cab71SAndrew Rybchenko #define	SFXGE_BAR_UNLOCK(_esbp)						\
641763cab71SAndrew Rybchenko 	mtx_unlock(&(_esbp)->esb_lock)
642763cab71SAndrew Rybchenko 
643e948693eSPhilip Paeps #define	EFSYS_BAR_READD(_esbp, _offset, _edp, _lock)			\
644e948693eSPhilip Paeps 	do {								\
645e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
646e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)),	\
647e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
648e948693eSPhilip Paeps 									\
649e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
650e948693eSPhilip Paeps 		if (_lock)						\
651763cab71SAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
652e948693eSPhilip Paeps 									\
653*d9ff48abSAndrew Rybchenko 		(_edp)->ed_u32[0] = bus_space_read_stream_4(		\
654*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
655*d9ff48abSAndrew Rybchenko 		    (_offset));						\
656e948693eSPhilip Paeps 									\
657e948693eSPhilip Paeps 		EFSYS_PROBE2(bar_readd, unsigned int, (_offset),	\
658e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
659e948693eSPhilip Paeps 									\
660e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
661e948693eSPhilip Paeps 		if (_lock)						\
662763cab71SAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
663e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
664e948693eSPhilip Paeps 	} while (B_FALSE)
665e948693eSPhilip Paeps 
6660f999687SAndrew Rybchenko #if defined(__x86_64__)
667e948693eSPhilip Paeps #define	EFSYS_BAR_READQ(_esbp, _offset, _eqp)				\
668e948693eSPhilip Paeps 	do {								\
669e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
670e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
671e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
672e948693eSPhilip Paeps 									\
673763cab71SAndrew Rybchenko 		SFXGE_BAR_LOCK(_esbp);					\
674e948693eSPhilip Paeps 									\
675*d9ff48abSAndrew Rybchenko 		(_eqp)->eq_u64[0] = bus_space_read_stream_8(		\
676*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
677*d9ff48abSAndrew Rybchenko 		    (_offset));						\
6780f999687SAndrew Rybchenko 									\
6790f999687SAndrew Rybchenko 		EFSYS_PROBE3(bar_readq, unsigned int, (_offset),	\
6800f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[1],			\
6810f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[0]);			\
6820f999687SAndrew Rybchenko 									\
683687adefaSAndrew Rybchenko 		SFXGE_BAR_UNLOCK(_esbp);				\
6840f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
6850f999687SAndrew Rybchenko 	} while (B_FALSE)
6860f999687SAndrew Rybchenko 
6870f999687SAndrew Rybchenko #define	EFSYS_BAR_READO(_esbp, _offset, _eop, _lock)			\
6880f999687SAndrew Rybchenko 	do {								\
6890f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
6900f999687SAndrew Rybchenko 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
6910f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
6920f999687SAndrew Rybchenko 									\
6930f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
6940f999687SAndrew Rybchenko 		if (_lock)						\
695687adefaSAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
6960f999687SAndrew Rybchenko 									\
697*d9ff48abSAndrew Rybchenko 		(_eop)->eo_u64[0] = bus_space_read_stream_8(		\
698*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
699*d9ff48abSAndrew Rybchenko 		    (_offset));						\
700*d9ff48abSAndrew Rybchenko 		(_eop)->eo_u64[1] = bus_space_read_stream_8(		\
701*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
702*d9ff48abSAndrew Rybchenko 		    (_offset) + 8);					\
7030f999687SAndrew Rybchenko 									\
7040f999687SAndrew Rybchenko 		EFSYS_PROBE5(bar_reado, unsigned int, (_offset),	\
7050f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[3],			\
7060f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[2],			\
7070f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[1],			\
7080f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[0]);			\
7090f999687SAndrew Rybchenko 									\
7100f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
7110f999687SAndrew Rybchenko 		if (_lock)						\
712687adefaSAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
7130f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
7140f999687SAndrew Rybchenko 	} while (B_FALSE)
7150f999687SAndrew Rybchenko 
7160f999687SAndrew Rybchenko #else
7170f999687SAndrew Rybchenko #define	EFSYS_BAR_READQ(_esbp, _offset, _eqp)				\
7180f999687SAndrew Rybchenko 	do {								\
7190f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
7200f999687SAndrew Rybchenko 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
7210f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
7220f999687SAndrew Rybchenko 									\
723687adefaSAndrew Rybchenko 		SFXGE_BAR_LOCK(_esbp);					\
7240f999687SAndrew Rybchenko 									\
725*d9ff48abSAndrew Rybchenko 		(_eqp)->eq_u32[0] = bus_space_read_stream_4(		\
726*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
727*d9ff48abSAndrew Rybchenko 		    (_offset));						\
728*d9ff48abSAndrew Rybchenko 		(_eqp)->eq_u32[1] = bus_space_read_stream_4(		\
729*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
730*d9ff48abSAndrew Rybchenko 		    (_offset) + 4);					\
731e948693eSPhilip Paeps 									\
732e948693eSPhilip Paeps 		EFSYS_PROBE3(bar_readq, unsigned int, (_offset),	\
733e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
734e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
735e948693eSPhilip Paeps 									\
736763cab71SAndrew Rybchenko 		SFXGE_BAR_UNLOCK(_esbp);				\
737e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
738e948693eSPhilip Paeps 	} while (B_FALSE)
739e948693eSPhilip Paeps 
740e948693eSPhilip Paeps #define	EFSYS_BAR_READO(_esbp, _offset, _eop, _lock)			\
741e948693eSPhilip Paeps 	do {								\
742e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
743e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
744e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
745e948693eSPhilip Paeps 									\
746e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
747e948693eSPhilip Paeps 		if (_lock)						\
748763cab71SAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
749e948693eSPhilip Paeps 									\
750*d9ff48abSAndrew Rybchenko 		(_eop)->eo_u32[0] = bus_space_read_stream_4(		\
751*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
752*d9ff48abSAndrew Rybchenko 		    (_offset));						\
753*d9ff48abSAndrew Rybchenko 		(_eop)->eo_u32[1] = bus_space_read_stream_4(		\
754*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
755*d9ff48abSAndrew Rybchenko 		    (_offset) + 4);					\
756*d9ff48abSAndrew Rybchenko 		(_eop)->eo_u32[2] = bus_space_read_stream_4(		\
757*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
758*d9ff48abSAndrew Rybchenko 		    (_offset) + 8);					\
759*d9ff48abSAndrew Rybchenko 		(_eop)->eo_u32[3] = bus_space_read_stream_4(		\
760*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
761*d9ff48abSAndrew Rybchenko 		    (_offset) + 12);					\
762e948693eSPhilip Paeps 									\
763e948693eSPhilip Paeps 		EFSYS_PROBE5(bar_reado, unsigned int, (_offset),	\
764e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
765e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
766e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
767e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
768e948693eSPhilip Paeps 									\
769e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
770e948693eSPhilip Paeps 		if (_lock)						\
771763cab71SAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
772e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
773e948693eSPhilip Paeps 	} while (B_FALSE)
7740f999687SAndrew Rybchenko #endif
775e948693eSPhilip Paeps 
776e948693eSPhilip Paeps #define	EFSYS_BAR_WRITED(_esbp, _offset, _edp, _lock)			\
777e948693eSPhilip Paeps 	do {								\
778e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
779e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)),	\
780e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
781e948693eSPhilip Paeps 									\
782e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
783e948693eSPhilip Paeps 		if (_lock)						\
784763cab71SAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
785e948693eSPhilip Paeps 									\
786e948693eSPhilip Paeps 		EFSYS_PROBE2(bar_writed, unsigned int, (_offset),	\
787e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
788e948693eSPhilip Paeps 									\
789*d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
790*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
791e948693eSPhilip Paeps 		    (_offset), (_edp)->ed_u32[0]);			\
792e948693eSPhilip Paeps 									\
793e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
794e948693eSPhilip Paeps 		if (_lock)						\
795763cab71SAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
796e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
797e948693eSPhilip Paeps 	} while (B_FALSE)
798e948693eSPhilip Paeps 
7990f999687SAndrew Rybchenko #if defined(__x86_64__)
800e948693eSPhilip Paeps #define	EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp)				\
801e948693eSPhilip Paeps 	do {								\
802e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
803e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
804e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
805e948693eSPhilip Paeps 									\
806763cab71SAndrew Rybchenko 		SFXGE_BAR_LOCK(_esbp);					\
807e948693eSPhilip Paeps 									\
808e948693eSPhilip Paeps 		EFSYS_PROBE3(bar_writeq, unsigned int, (_offset),	\
809e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
810e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
811e948693eSPhilip Paeps 									\
812*d9ff48abSAndrew Rybchenko 		bus_space_write_stream_8((_esbp)->esb_tag,		\
813*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
8140f999687SAndrew Rybchenko 		    (_offset), (_eqp)->eq_u64[0]);			\
8150f999687SAndrew Rybchenko 									\
816687adefaSAndrew Rybchenko 		SFXGE_BAR_UNLOCK(_esbp);				\
8170f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
8180f999687SAndrew Rybchenko 	} while (B_FALSE)
8190f999687SAndrew Rybchenko #else
8200f999687SAndrew Rybchenko #define	EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp)				\
8210f999687SAndrew Rybchenko 	do {								\
8220f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
8230f999687SAndrew Rybchenko 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
8240f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
8250f999687SAndrew Rybchenko 									\
826687adefaSAndrew Rybchenko 		SFXGE_BAR_LOCK(_esbp);					\
8270f999687SAndrew Rybchenko 									\
8280f999687SAndrew Rybchenko 		EFSYS_PROBE3(bar_writeq, unsigned int, (_offset),	\
8290f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[1],			\
8300f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[0]);			\
8310f999687SAndrew Rybchenko 									\
832*d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
833*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
834e948693eSPhilip Paeps 		    (_offset), (_eqp)->eq_u32[0]);			\
835*d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
836*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
837*d9ff48abSAndrew Rybchenko 		    (_offset) + 4, (_eqp)->eq_u32[1]);			\
838e948693eSPhilip Paeps 									\
839763cab71SAndrew Rybchenko 		SFXGE_BAR_UNLOCK(_esbp);				\
840e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
841e948693eSPhilip Paeps 	} while (B_FALSE)
8420f999687SAndrew Rybchenko #endif
843e948693eSPhilip Paeps 
8440f999687SAndrew Rybchenko #if defined(__x86_64__)
845e948693eSPhilip Paeps #define	EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock)			\
846e948693eSPhilip Paeps 	do {								\
847e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
848e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
849e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
850e948693eSPhilip Paeps 									\
851e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
852e948693eSPhilip Paeps 		if (_lock)						\
853763cab71SAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
854e948693eSPhilip Paeps 									\
855e948693eSPhilip Paeps 		EFSYS_PROBE5(bar_writeo, unsigned int, (_offset),	\
856e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
857e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
858e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
859e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
860e948693eSPhilip Paeps 									\
861*d9ff48abSAndrew Rybchenko 		bus_space_write_stream_8((_esbp)->esb_tag,		\
862*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
8630f999687SAndrew Rybchenko 		    (_offset), (_eop)->eo_u64[0]);			\
864*d9ff48abSAndrew Rybchenko 		bus_space_write_stream_8((_esbp)->esb_tag,		\
865*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
866*d9ff48abSAndrew Rybchenko 		    (_offset) + 8, (_eop)->eo_u64[1]);			\
8670f999687SAndrew Rybchenko 									\
8680f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
8690f999687SAndrew Rybchenko 		if (_lock)						\
870687adefaSAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
8710f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
8720f999687SAndrew Rybchenko 	} while (B_FALSE)
8730f999687SAndrew Rybchenko 
8740f999687SAndrew Rybchenko #else
8750f999687SAndrew Rybchenko #define	EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock)			\
8760f999687SAndrew Rybchenko 	do {								\
8770f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
8780f999687SAndrew Rybchenko 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
8790f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
8800f999687SAndrew Rybchenko 									\
8810f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
8820f999687SAndrew Rybchenko 		if (_lock)						\
883687adefaSAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
8840f999687SAndrew Rybchenko 									\
8850f999687SAndrew Rybchenko 		EFSYS_PROBE5(bar_writeo, unsigned int, (_offset),	\
8860f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[3],			\
8870f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[2],			\
8880f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[1],			\
8890f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[0]);			\
8900f999687SAndrew Rybchenko 									\
891*d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
892*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
893e948693eSPhilip Paeps 		    (_offset), (_eop)->eo_u32[0]);			\
894*d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
895*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
896*d9ff48abSAndrew Rybchenko 		    (_offset) + 4, (_eop)->eo_u32[1]);			\
897*d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
898*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
899*d9ff48abSAndrew Rybchenko 		    (_offset) + 8, (_eop)->eo_u32[2]);			\
900*d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
901*d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
902*d9ff48abSAndrew Rybchenko 		    (_offset) + 12, (_eop)->eo_u32[3]);			\
903e948693eSPhilip Paeps 									\
904e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
905e948693eSPhilip Paeps 		if (_lock)						\
906763cab71SAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
907e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
908e948693eSPhilip Paeps 	} while (B_FALSE)
9090f999687SAndrew Rybchenko #endif
910e948693eSPhilip Paeps 
911e948693eSPhilip Paeps /* SPIN */
912e948693eSPhilip Paeps 
913e948693eSPhilip Paeps #define	EFSYS_SPIN(_us)							\
914e948693eSPhilip Paeps 	do {								\
915e948693eSPhilip Paeps 		DELAY(_us);						\
916e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
917e948693eSPhilip Paeps 	} while (B_FALSE)
918e948693eSPhilip Paeps 
919e948693eSPhilip Paeps #define	EFSYS_SLEEP	EFSYS_SPIN
920e948693eSPhilip Paeps 
921e948693eSPhilip Paeps /* BARRIERS */
922e948693eSPhilip Paeps 
9237c00963aSAndrew Rybchenko #define	EFSYS_MEM_READ_BARRIER()	rmb()
924e948693eSPhilip Paeps #define	EFSYS_PIO_WRITE_BARRIER()
925e948693eSPhilip Paeps 
926e948693eSPhilip Paeps /* TIMESTAMP */
927e948693eSPhilip Paeps 
928e948693eSPhilip Paeps typedef	clock_t	efsys_timestamp_t;
929e948693eSPhilip Paeps 
930e948693eSPhilip Paeps #define	EFSYS_TIMESTAMP(_usp)						\
931e948693eSPhilip Paeps 	do {								\
932e948693eSPhilip Paeps 		clock_t now;						\
933e948693eSPhilip Paeps 									\
934e948693eSPhilip Paeps 		now = ticks;						\
935e948693eSPhilip Paeps 		*(_usp) = now * hz / 1000000;				\
936e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
937e948693eSPhilip Paeps 	} while (B_FALSE)
938e948693eSPhilip Paeps 
939e948693eSPhilip Paeps /* KMEM */
940e948693eSPhilip Paeps 
941e948693eSPhilip Paeps #define	EFSYS_KMEM_ALLOC(_esip, _size, _p)				\
942e948693eSPhilip Paeps 	do {								\
943e948693eSPhilip Paeps 		(_esip) = (_esip);					\
944e948693eSPhilip Paeps 		(_p) = malloc((_size), M_SFXGE, M_WAITOK|M_ZERO);	\
945e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
946e948693eSPhilip Paeps 	} while (B_FALSE)
947e948693eSPhilip Paeps 
948e948693eSPhilip Paeps #define	EFSYS_KMEM_FREE(_esip, _size, _p)				\
949e948693eSPhilip Paeps 	do {								\
950e948693eSPhilip Paeps 		(void) (_esip);						\
951e948693eSPhilip Paeps 		(void) (_size);						\
952e948693eSPhilip Paeps 		free((_p), M_SFXGE);					\
953e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
954e948693eSPhilip Paeps 	} while (B_FALSE)
955e948693eSPhilip Paeps 
956e948693eSPhilip Paeps /* LOCK */
957e948693eSPhilip Paeps 
95833d45dc5SAndrew Rybchenko typedef struct efsys_lock_s {
95933d45dc5SAndrew Rybchenko 	struct mtx	lock;
96033d45dc5SAndrew Rybchenko 	char		lock_name[SFXGE_LOCK_NAME_MAX];
96133d45dc5SAndrew Rybchenko } efsys_lock_t;
96233d45dc5SAndrew Rybchenko 
96333d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_LOCK_INIT(_eslp, _ifname, _label)			\
96433d45dc5SAndrew Rybchenko 	do {								\
96533d45dc5SAndrew Rybchenko 		efsys_lock_t *__eslp = (_eslp);				\
96633d45dc5SAndrew Rybchenko 									\
96733d45dc5SAndrew Rybchenko 		snprintf((__eslp)->lock_name,				\
96833d45dc5SAndrew Rybchenko 			 sizeof((__eslp)->lock_name),			\
96933d45dc5SAndrew Rybchenko 			 "%s:%s", (_ifname), (_label));			\
97033d45dc5SAndrew Rybchenko 		mtx_init(&(__eslp)->lock, (__eslp)->lock_name,		\
97133d45dc5SAndrew Rybchenko 			 NULL, MTX_DEF);				\
97233d45dc5SAndrew Rybchenko 	} while (B_FALSE)
97333d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_LOCK_DESTROY(_eslp)					\
97433d45dc5SAndrew Rybchenko 	mtx_destroy(&(_eslp)->lock)
97533d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_LOCK(_eslp)						\
97633d45dc5SAndrew Rybchenko 	mtx_lock(&(_eslp)->lock)
97733d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_UNLOCK(_eslp)					\
97833d45dc5SAndrew Rybchenko 	mtx_unlock(&(_eslp)->lock)
97933d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_LOCK_ASSERT_OWNED(_eslp)				\
98033d45dc5SAndrew Rybchenko 	mtx_assert(&(_eslp)->lock, MA_OWNED)
981e948693eSPhilip Paeps 
982e948693eSPhilip Paeps #define	EFSYS_LOCK_MAGIC	0x000010c4
983e948693eSPhilip Paeps 
984e948693eSPhilip Paeps #define	EFSYS_LOCK(_lockp, _state)					\
985e948693eSPhilip Paeps 	do {								\
98633d45dc5SAndrew Rybchenko 		SFXGE_EFSYS_LOCK(_lockp);				\
987e948693eSPhilip Paeps 		(_state) = EFSYS_LOCK_MAGIC;				\
988e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
989e948693eSPhilip Paeps 	} while (B_FALSE)
990e948693eSPhilip Paeps 
991e948693eSPhilip Paeps #define	EFSYS_UNLOCK(_lockp, _state)					\
992e948693eSPhilip Paeps 	do {								\
993e948693eSPhilip Paeps 		if ((_state) != EFSYS_LOCK_MAGIC)			\
994e948693eSPhilip Paeps 			KASSERT(B_FALSE, ("not locked"));		\
99533d45dc5SAndrew Rybchenko 		SFXGE_EFSYS_UNLOCK(_lockp);				\
996e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
997e948693eSPhilip Paeps 	} while (B_FALSE)
998e948693eSPhilip Paeps 
999e948693eSPhilip Paeps /* PREEMPT */
1000e948693eSPhilip Paeps 
1001e948693eSPhilip Paeps #define	EFSYS_PREEMPT_DISABLE(_state)					\
1002e948693eSPhilip Paeps 	do {								\
1003e948693eSPhilip Paeps 		(_state) = (_state);					\
1004e948693eSPhilip Paeps 		critical_enter();					\
1005e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1006e948693eSPhilip Paeps 	} while (B_FALSE)
1007e948693eSPhilip Paeps 
1008e948693eSPhilip Paeps #define	EFSYS_PREEMPT_ENABLE(_state)					\
1009e948693eSPhilip Paeps 	do {								\
1010e948693eSPhilip Paeps 		(_state) = (_state);					\
1011e948693eSPhilip Paeps 		critical_exit(_state);					\
1012e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1013e948693eSPhilip Paeps 	} while (B_FALSE)
1014e948693eSPhilip Paeps 
1015e948693eSPhilip Paeps /* STAT */
1016e948693eSPhilip Paeps 
1017e948693eSPhilip Paeps typedef uint64_t		efsys_stat_t;
1018e948693eSPhilip Paeps 
1019e948693eSPhilip Paeps #define	EFSYS_STAT_INCR(_knp, _delta) 					\
1020e948693eSPhilip Paeps 	do {								\
1021e948693eSPhilip Paeps 		*(_knp) += (_delta);					\
1022e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1023e948693eSPhilip Paeps 	} while (B_FALSE)
1024e948693eSPhilip Paeps 
1025e948693eSPhilip Paeps #define	EFSYS_STAT_DECR(_knp, _delta) 					\
1026e948693eSPhilip Paeps 	do {								\
1027e948693eSPhilip Paeps 		*(_knp) -= (_delta);					\
1028e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1029e948693eSPhilip Paeps 	} while (B_FALSE)
1030e948693eSPhilip Paeps 
1031e948693eSPhilip Paeps #define	EFSYS_STAT_SET(_knp, _val)					\
1032e948693eSPhilip Paeps 	do {								\
1033e948693eSPhilip Paeps 		*(_knp) = (_val);					\
1034e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1035e948693eSPhilip Paeps 	} while (B_FALSE)
1036e948693eSPhilip Paeps 
1037e948693eSPhilip Paeps #define	EFSYS_STAT_SET_QWORD(_knp, _valp)				\
1038e948693eSPhilip Paeps 	do {								\
1039e948693eSPhilip Paeps 		*(_knp) = le64toh((_valp)->eq_u64[0]);			\
1040e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1041e948693eSPhilip Paeps 	} while (B_FALSE)
1042e948693eSPhilip Paeps 
1043e948693eSPhilip Paeps #define	EFSYS_STAT_SET_DWORD(_knp, _valp)				\
1044e948693eSPhilip Paeps 	do {								\
1045e948693eSPhilip Paeps 		*(_knp) = le32toh((_valp)->ed_u32[0]);			\
1046e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1047e948693eSPhilip Paeps 	} while (B_FALSE)
1048e948693eSPhilip Paeps 
1049e948693eSPhilip Paeps #define	EFSYS_STAT_INCR_QWORD(_knp, _valp)				\
1050e948693eSPhilip Paeps 	do {								\
1051e948693eSPhilip Paeps 		*(_knp) += le64toh((_valp)->eq_u64[0]);			\
1052e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1053e948693eSPhilip Paeps 	} while (B_FALSE)
1054e948693eSPhilip Paeps 
1055e948693eSPhilip Paeps #define	EFSYS_STAT_SUBR_QWORD(_knp, _valp)				\
1056e948693eSPhilip Paeps 	do {								\
1057e948693eSPhilip Paeps 		*(_knp) -= le64toh((_valp)->eq_u64[0]);			\
1058e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1059e948693eSPhilip Paeps 	} while (B_FALSE)
1060e948693eSPhilip Paeps 
1061e948693eSPhilip Paeps /* ERR */
1062e948693eSPhilip Paeps 
1063e948693eSPhilip Paeps extern void	sfxge_err(efsys_identifier_t *, unsigned int,
1064e948693eSPhilip Paeps 		    uint32_t, uint32_t);
1065e948693eSPhilip Paeps 
1066e948693eSPhilip Paeps #if EFSYS_OPT_DECODE_INTR_FATAL
1067e948693eSPhilip Paeps #define	EFSYS_ERR(_esip, _code, _dword0, _dword1)			\
1068e948693eSPhilip Paeps 	do {								\
1069e948693eSPhilip Paeps 		sfxge_err((_esip), (_code), (_dword0), (_dword1));	\
1070e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1071e948693eSPhilip Paeps 	} while (B_FALSE)
1072e948693eSPhilip Paeps #endif
1073e948693eSPhilip Paeps 
1074e948693eSPhilip Paeps /* ASSERT */
1075e948693eSPhilip Paeps 
1076e948693eSPhilip Paeps #define	EFSYS_ASSERT(_exp) do {						\
1077e948693eSPhilip Paeps 	if (!(_exp))							\
1078e948693eSPhilip Paeps 		panic(#_exp);						\
1079e948693eSPhilip Paeps 	} while (0)
1080e948693eSPhilip Paeps 
1081e948693eSPhilip Paeps #define	EFSYS_ASSERT3(_x, _op, _y, _t) do {				\
1082e948693eSPhilip Paeps 	const _t __x = (_t)(_x);					\
1083e948693eSPhilip Paeps 	const _t __y = (_t)(_y);					\
1084e948693eSPhilip Paeps 	if (!(__x _op __y))						\
1085e948693eSPhilip Paeps 		panic("assertion failed at %s:%u", __FILE__, __LINE__);	\
1086e948693eSPhilip Paeps 	} while(0)
1087e948693eSPhilip Paeps 
1088e948693eSPhilip Paeps #define	EFSYS_ASSERT3U(_x, _op, _y)	EFSYS_ASSERT3(_x, _op, _y, uint64_t)
1089e948693eSPhilip Paeps #define	EFSYS_ASSERT3S(_x, _op, _y)	EFSYS_ASSERT3(_x, _op, _y, int64_t)
1090e948693eSPhilip Paeps #define	EFSYS_ASSERT3P(_x, _op, _y)	EFSYS_ASSERT3(_x, _op, _y, uintptr_t)
1091e948693eSPhilip Paeps 
1092e948693eSPhilip Paeps #ifdef	__cplusplus
1093e948693eSPhilip Paeps }
1094e948693eSPhilip Paeps #endif
1095e948693eSPhilip Paeps 
1096e948693eSPhilip Paeps #endif	/* _SYS_EFSYS_H */
1097