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