xref: /freebsd/sys/dev/sfxge/common/efsys.h (revision a98003dde4898f2f7f800a888b7b6919d4e30d4b)
1e948693eSPhilip Paeps /*-
2929c7febSAndrew Rybchenko  * Copyright (c) 2010-2016 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
93c838a9fSAndrew Rybchenko  * modification, are permitted provided that the following conditions are met:
10e948693eSPhilip Paeps  *
113c838a9fSAndrew Rybchenko  * 1. Redistributions of source code must retain the above copyright notice,
123c838a9fSAndrew Rybchenko  *    this list of conditions and the following disclaimer.
133c838a9fSAndrew Rybchenko  * 2. Redistributions in binary form must reproduce the above copyright notice,
143c838a9fSAndrew Rybchenko  *    this list of conditions and the following disclaimer in the documentation
153c838a9fSAndrew Rybchenko  *    and/or other materials provided with the distribution.
163c838a9fSAndrew Rybchenko  *
173c838a9fSAndrew Rybchenko  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
183c838a9fSAndrew Rybchenko  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
193c838a9fSAndrew Rybchenko  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
203c838a9fSAndrew Rybchenko  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
213c838a9fSAndrew Rybchenko  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
223c838a9fSAndrew Rybchenko  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
233c838a9fSAndrew Rybchenko  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
243c838a9fSAndrew Rybchenko  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
253c838a9fSAndrew Rybchenko  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
263c838a9fSAndrew Rybchenko  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
273c838a9fSAndrew Rybchenko  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
283c838a9fSAndrew Rybchenko  *
293c838a9fSAndrew Rybchenko  * The views and conclusions contained in the software and documentation are
303c838a9fSAndrew Rybchenko  * those of the authors and should not be interpreted as representing official
313c838a9fSAndrew Rybchenko  * policies, either expressed or implied, of the FreeBSD Project.
325dee87d7SPhilip Paeps  *
335dee87d7SPhilip Paeps  * $FreeBSD$
34e948693eSPhilip Paeps  */
35e948693eSPhilip Paeps 
36e948693eSPhilip Paeps #ifndef	_SYS_EFSYS_H
37e948693eSPhilip Paeps #define	_SYS_EFSYS_H
38e948693eSPhilip Paeps 
39e948693eSPhilip Paeps #ifdef	__cplusplus
40e948693eSPhilip Paeps extern "C" {
41e948693eSPhilip Paeps #endif
42e948693eSPhilip Paeps 
43e948693eSPhilip Paeps #include <sys/param.h>
44e948693eSPhilip Paeps #include <sys/bus.h>
45e948693eSPhilip Paeps #include <sys/endian.h>
46e948693eSPhilip Paeps #include <sys/lock.h>
47e948693eSPhilip Paeps #include <sys/malloc.h>
48e948693eSPhilip Paeps #include <sys/mbuf.h>
49e948693eSPhilip Paeps #include <sys/mutex.h>
50e948693eSPhilip Paeps #include <sys/rwlock.h>
51e948693eSPhilip Paeps #include <sys/sdt.h>
52e948693eSPhilip Paeps #include <sys/systm.h>
53e948693eSPhilip Paeps 
54e948693eSPhilip Paeps #include <machine/bus.h>
55e948693eSPhilip Paeps #include <machine/endian.h>
56e948693eSPhilip Paeps 
57e948693eSPhilip Paeps #define	EFSYS_HAS_UINT64 1
580f999687SAndrew Rybchenko #if defined(__x86_64__)
590f999687SAndrew Rybchenko #define	EFSYS_USE_UINT64 1
600f999687SAndrew Rybchenko #else
61e948693eSPhilip Paeps #define	EFSYS_USE_UINT64 0
620f999687SAndrew Rybchenko #endif
633c838a9fSAndrew Rybchenko #define	EFSYS_HAS_SSE2_M128 0
64e948693eSPhilip Paeps #if _BYTE_ORDER == _BIG_ENDIAN
65e948693eSPhilip Paeps #define	EFSYS_IS_BIG_ENDIAN 1
66e948693eSPhilip Paeps #define	EFSYS_IS_LITTLE_ENDIAN 0
67e948693eSPhilip Paeps #elif _BYTE_ORDER == _LITTLE_ENDIAN
68e948693eSPhilip Paeps #define	EFSYS_IS_BIG_ENDIAN 0
69e948693eSPhilip Paeps #define	EFSYS_IS_LITTLE_ENDIAN 1
70e948693eSPhilip Paeps #endif
71e948693eSPhilip Paeps #include "efx_types.h"
72e948693eSPhilip Paeps 
73e948693eSPhilip Paeps /* Common code requires this */
74e948693eSPhilip Paeps #if __FreeBSD_version < 800068
75e948693eSPhilip Paeps #define	memmove(d, s, l) bcopy(s, d, l)
76e948693eSPhilip Paeps #endif
77e948693eSPhilip Paeps 
78e948693eSPhilip Paeps /* FreeBSD equivalents of Solaris things */
79e948693eSPhilip Paeps #ifndef _NOTE
80e948693eSPhilip Paeps #define	_NOTE(s)
81e948693eSPhilip Paeps #endif
82e948693eSPhilip Paeps 
83e948693eSPhilip Paeps #ifndef B_FALSE
84e948693eSPhilip Paeps #define	B_FALSE	FALSE
85e948693eSPhilip Paeps #endif
86e948693eSPhilip Paeps #ifndef B_TRUE
87e948693eSPhilip Paeps #define	B_TRUE	TRUE
88e948693eSPhilip Paeps #endif
89e948693eSPhilip Paeps 
90e948693eSPhilip Paeps #ifndef IS_P2ALIGNED
91e948693eSPhilip Paeps #define	IS_P2ALIGNED(v, a)	((((uintptr_t)(v)) & ((uintptr_t)(a) - 1)) == 0)
92e948693eSPhilip Paeps #endif
93e948693eSPhilip Paeps 
94e948693eSPhilip Paeps #ifndef P2ROUNDUP
95e948693eSPhilip Paeps #define	P2ROUNDUP(x, align)	(-(-(x) & -(align)))
96e948693eSPhilip Paeps #endif
97e948693eSPhilip Paeps 
983c838a9fSAndrew Rybchenko #ifndef P2ALIGN
993c838a9fSAndrew Rybchenko #define	P2ALIGN(_x, _a)		((_x) & -(_a))
1003c838a9fSAndrew Rybchenko #endif
1013c838a9fSAndrew Rybchenko 
102e948693eSPhilip Paeps #ifndef IS2P
103e948693eSPhilip Paeps #define	ISP2(x)			(((x) & ((x) - 1)) == 0)
104e948693eSPhilip Paeps #endif
105e948693eSPhilip Paeps 
1065dadbb64SAndrew Rybchenko #if defined(__x86_64__) && __FreeBSD_version >= 1000000
1075dadbb64SAndrew Rybchenko 
1085dadbb64SAndrew Rybchenko #define	SFXGE_USE_BUS_SPACE_8		1
1095dadbb64SAndrew Rybchenko 
110d9ff48abSAndrew Rybchenko #if !defined(bus_space_read_stream_8)
1115dadbb64SAndrew Rybchenko 
112d9ff48abSAndrew Rybchenko #define	bus_space_read_stream_8(t, h, o)				\
113d9ff48abSAndrew Rybchenko 	bus_space_read_8((t), (h), (o))
1145dadbb64SAndrew Rybchenko 
115d9ff48abSAndrew Rybchenko #define	bus_space_write_stream_8(t, h, o, v)				\
116d9ff48abSAndrew Rybchenko 	bus_space_write_8((t), (h), (o), (v))
1175dadbb64SAndrew Rybchenko 
118d9ff48abSAndrew Rybchenko #endif
1195dadbb64SAndrew Rybchenko 
120d9ff48abSAndrew Rybchenko #endif
121d9ff48abSAndrew Rybchenko 
122e948693eSPhilip Paeps #define	ENOTACTIVE EINVAL
123e948693eSPhilip Paeps 
124e948693eSPhilip Paeps /* Memory type to use on FreeBSD */
125e948693eSPhilip Paeps MALLOC_DECLARE(M_SFXGE);
126e948693eSPhilip Paeps 
127e948693eSPhilip Paeps /* Machine dependend prefetch wrappers */
128dc1788e8SMarius Strobl #if defined(__i386__) || defined(__amd64__)
129e948693eSPhilip Paeps static __inline void
130e948693eSPhilip Paeps prefetch_read_many(void *addr)
131e948693eSPhilip Paeps {
132dc1788e8SMarius Strobl 
133e948693eSPhilip Paeps 	__asm__(
134e948693eSPhilip Paeps 	    "prefetcht0 (%0)"
135e948693eSPhilip Paeps 	    :
136e948693eSPhilip Paeps 	    : "r" (addr));
137e948693eSPhilip Paeps }
138e948693eSPhilip Paeps 
139e948693eSPhilip Paeps static __inline void
140e948693eSPhilip Paeps prefetch_read_once(void *addr)
141e948693eSPhilip Paeps {
142dc1788e8SMarius Strobl 
143e948693eSPhilip Paeps 	__asm__(
144e948693eSPhilip Paeps 	    "prefetchnta (%0)"
145e948693eSPhilip Paeps 	    :
146e948693eSPhilip Paeps 	    : "r" (addr));
147e948693eSPhilip Paeps }
148dc1788e8SMarius Strobl #elif defined(__sparc64__)
149dc1788e8SMarius Strobl static __inline void
150dc1788e8SMarius Strobl prefetch_read_many(void *addr)
151dc1788e8SMarius Strobl {
152dc1788e8SMarius Strobl 
153dc1788e8SMarius Strobl 	__asm__(
154dc1788e8SMarius Strobl 	    "prefetch [%0], 0"
155dc1788e8SMarius Strobl 	    :
156dc1788e8SMarius Strobl 	    : "r" (addr));
157dc1788e8SMarius Strobl }
158dc1788e8SMarius Strobl 
159dc1788e8SMarius Strobl static __inline void
160dc1788e8SMarius Strobl prefetch_read_once(void *addr)
161dc1788e8SMarius Strobl {
162dc1788e8SMarius Strobl 
163dc1788e8SMarius Strobl 	__asm__(
164dc1788e8SMarius Strobl 	    "prefetch [%0], 1"
165dc1788e8SMarius Strobl 	    :
166dc1788e8SMarius Strobl 	    : "r" (addr));
167dc1788e8SMarius Strobl }
168dc1788e8SMarius Strobl #else
169dc1788e8SMarius Strobl static __inline void
170dc1788e8SMarius Strobl prefetch_read_many(void *addr)
171dc1788e8SMarius Strobl {
172dc1788e8SMarius Strobl 
173dc1788e8SMarius Strobl }
174dc1788e8SMarius Strobl 
175dc1788e8SMarius Strobl static __inline void
176dc1788e8SMarius Strobl prefetch_read_once(void *addr)
177dc1788e8SMarius Strobl {
178dc1788e8SMarius Strobl 
179dc1788e8SMarius Strobl }
180e948693eSPhilip Paeps #endif
181e948693eSPhilip Paeps 
182e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__)
183e948693eSPhilip Paeps #include <vm/vm.h>
184e948693eSPhilip Paeps #include <vm/pmap.h>
185e948693eSPhilip Paeps #endif
186e948693eSPhilip Paeps static __inline void
187e948693eSPhilip Paeps sfxge_map_mbuf_fast(bus_dma_tag_t tag, bus_dmamap_t map,
188e948693eSPhilip Paeps 		    struct mbuf *m, bus_dma_segment_t *seg)
189e948693eSPhilip Paeps {
190e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__)
191e948693eSPhilip Paeps 	seg->ds_addr = pmap_kextract(mtod(m, vm_offset_t));
192e948693eSPhilip Paeps 	seg->ds_len = m->m_len;
193e948693eSPhilip Paeps #else
194e948693eSPhilip Paeps 	int nsegstmp;
195e948693eSPhilip Paeps 
196e948693eSPhilip Paeps 	bus_dmamap_load_mbuf_sg(tag, map, m, seg, &nsegstmp, 0);
197e948693eSPhilip Paeps #endif
198e948693eSPhilip Paeps }
199e948693eSPhilip Paeps 
200e948693eSPhilip Paeps /* Modifiers used for Windows builds */
201e948693eSPhilip Paeps #define	__in
202e948693eSPhilip Paeps #define	__in_opt
203e948693eSPhilip Paeps #define	__in_ecount(_n)
204e948693eSPhilip Paeps #define	__in_ecount_opt(_n)
205e948693eSPhilip Paeps #define	__in_bcount(_n)
206e948693eSPhilip Paeps #define	__in_bcount_opt(_n)
207e948693eSPhilip Paeps 
208e948693eSPhilip Paeps #define	__out
209e948693eSPhilip Paeps #define	__out_opt
210e948693eSPhilip Paeps #define	__out_ecount(_n)
211e948693eSPhilip Paeps #define	__out_ecount_opt(_n)
212e948693eSPhilip Paeps #define	__out_bcount(_n)
213e948693eSPhilip Paeps #define	__out_bcount_opt(_n)
214d2a37b9cSAndrew Rybchenko #define	__out_bcount_part(_n, _l)
215d2a37b9cSAndrew Rybchenko #define	__out_bcount_part_opt(_n, _l)
216e948693eSPhilip Paeps 
217e948693eSPhilip Paeps #define	__deref_out
218e948693eSPhilip Paeps 
219e948693eSPhilip Paeps #define	__inout
220e948693eSPhilip Paeps #define	__inout_opt
221e948693eSPhilip Paeps #define	__inout_ecount(_n)
222e948693eSPhilip Paeps #define	__inout_ecount_opt(_n)
223e948693eSPhilip Paeps #define	__inout_bcount(_n)
224e948693eSPhilip Paeps #define	__inout_bcount_opt(_n)
225e948693eSPhilip Paeps #define	__inout_bcount_full_opt(_n)
226e948693eSPhilip Paeps 
227e948693eSPhilip Paeps #define	__deref_out_bcount_opt(n)
228e948693eSPhilip Paeps 
229e948693eSPhilip Paeps #define	__checkReturn
230460cb568SAndrew Rybchenko #define	__success(_x)
231e948693eSPhilip Paeps 
232e948693eSPhilip Paeps #define	__drv_when(_p, _c)
233e948693eSPhilip Paeps 
234e948693eSPhilip Paeps /* Code inclusion options */
235e948693eSPhilip Paeps 
236e948693eSPhilip Paeps 
237e948693eSPhilip Paeps #define	EFSYS_OPT_NAMES 1
238e948693eSPhilip Paeps 
239e948693eSPhilip Paeps #define	EFSYS_OPT_SIENA 1
2403c838a9fSAndrew Rybchenko #define	EFSYS_OPT_HUNTINGTON 1
241131bc376SAndrew Rybchenko #define	EFSYS_OPT_MEDFORD 1
242e948693eSPhilip Paeps #ifdef DEBUG
243e948693eSPhilip Paeps #define	EFSYS_OPT_CHECK_REG 1
244e948693eSPhilip Paeps #else
245e948693eSPhilip Paeps #define	EFSYS_OPT_CHECK_REG 0
246e948693eSPhilip Paeps #endif
247e948693eSPhilip Paeps 
248e948693eSPhilip Paeps #define	EFSYS_OPT_MCDI 1
249870b1186SAndrew Rybchenko #define	EFSYS_OPT_MCDI_LOGGING 0
2503edad197SAndrew Rybchenko #define	EFSYS_OPT_MCDI_PROXY_AUTH 0
251e948693eSPhilip Paeps 
252e948693eSPhilip Paeps #define	EFSYS_OPT_MAC_STATS 1
253e948693eSPhilip Paeps 
254e948693eSPhilip Paeps #define	EFSYS_OPT_LOOPBACK 0
255e948693eSPhilip Paeps 
2563c838a9fSAndrew Rybchenko #define	EFSYS_OPT_MON_MCDI 0
257e948693eSPhilip Paeps #define	EFSYS_OPT_MON_STATS 0
258e948693eSPhilip Paeps 
259e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_STATS 1
2603c838a9fSAndrew Rybchenko #define	EFSYS_OPT_BIST 1
261e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_LED_CONTROL 1
262e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_FLAGS 0
263e948693eSPhilip Paeps 
264e948693eSPhilip Paeps #define	EFSYS_OPT_VPD 1
265e948693eSPhilip Paeps #define	EFSYS_OPT_NVRAM 1
266e948693eSPhilip Paeps #define	EFSYS_OPT_BOOTCFG 0
267e948693eSPhilip Paeps 
268e948693eSPhilip Paeps #define	EFSYS_OPT_DIAG 0
269e948693eSPhilip Paeps #define	EFSYS_OPT_RX_SCALE 1
270e948693eSPhilip Paeps #define	EFSYS_OPT_QSTATS 1
2713c838a9fSAndrew Rybchenko #define	EFSYS_OPT_FILTER 1
272e948693eSPhilip Paeps #define	EFSYS_OPT_RX_SCATTER 0
273e948693eSPhilip Paeps 
274e948693eSPhilip Paeps #define	EFSYS_OPT_EV_PREFETCH 0
275e948693eSPhilip Paeps 
276e948693eSPhilip Paeps #define	EFSYS_OPT_DECODE_INTR_FATAL 1
277e948693eSPhilip Paeps 
2780c848230SAndrew Rybchenko #define	EFSYS_OPT_LICENSING 0
2790c848230SAndrew Rybchenko 
280ecaa500cSAndrew Rybchenko #define	EFSYS_OPT_ALLOW_UNCONFIGURED_NIC 0
281ecaa500cSAndrew Rybchenko 
282e948693eSPhilip Paeps /* ID */
283e948693eSPhilip Paeps 
284e948693eSPhilip Paeps typedef struct __efsys_identifier_s	efsys_identifier_t;
285e948693eSPhilip Paeps 
286e948693eSPhilip Paeps /* PROBE */
287e948693eSPhilip Paeps 
28854366c0bSAttilio Rao #ifndef DTRACE_PROBE
289e948693eSPhilip Paeps 
290e948693eSPhilip Paeps #define	EFSYS_PROBE(_name)
291e948693eSPhilip Paeps 
292e948693eSPhilip Paeps #define	EFSYS_PROBE1(_name, _type1, _arg1)
293e948693eSPhilip Paeps 
294e948693eSPhilip Paeps #define	EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2)
295e948693eSPhilip Paeps 
296e948693eSPhilip Paeps #define	EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2,		\
297e948693eSPhilip Paeps 	    _type3, _arg3)
298e948693eSPhilip Paeps 
299e948693eSPhilip Paeps #define	EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2,		\
300e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4)
301e948693eSPhilip Paeps 
302e948693eSPhilip Paeps #define	EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
303e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)
304e948693eSPhilip Paeps 
305e948693eSPhilip Paeps #define	EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
306e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
307e948693eSPhilip Paeps 	    _type6, _arg6)
308e948693eSPhilip Paeps 
309e948693eSPhilip Paeps #define	EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2,		\
310e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
311e948693eSPhilip Paeps 	    _type6, _arg6, _type7, _arg7)
312e948693eSPhilip Paeps 
31354366c0bSAttilio Rao #else /* DTRACE_PROBE */
314e948693eSPhilip Paeps 
315e948693eSPhilip Paeps #define	EFSYS_PROBE(_name)						\
316e948693eSPhilip Paeps 	DTRACE_PROBE(_name)
317e948693eSPhilip Paeps 
318e948693eSPhilip Paeps #define	EFSYS_PROBE1(_name, _type1, _arg1)				\
319e948693eSPhilip Paeps 	DTRACE_PROBE1(_name, _type1, _arg1)
320e948693eSPhilip Paeps 
321e948693eSPhilip Paeps #define	EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2)		\
322e948693eSPhilip Paeps 	DTRACE_PROBE2(_name, _type1, _arg1, _type2, _arg2)
323e948693eSPhilip Paeps 
324e948693eSPhilip Paeps #define	EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2,		\
325e948693eSPhilip Paeps 	    _type3, _arg3)						\
326e948693eSPhilip Paeps 	DTRACE_PROBE3(_name, _type1, _arg1, _type2, _arg2,		\
327e948693eSPhilip Paeps 	    _type3, _arg3)
328e948693eSPhilip Paeps 
329e948693eSPhilip Paeps #define	EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2,		\
330e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4)				\
331e948693eSPhilip Paeps 	DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2,		\
332e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4)
333e948693eSPhilip Paeps 
334e948693eSPhilip Paeps #ifdef DTRACE_PROBE5
335e948693eSPhilip Paeps #define	EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
336e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)		\
337e948693eSPhilip Paeps 	DTRACE_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
338e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)
339e948693eSPhilip Paeps #else
340e948693eSPhilip Paeps #define	EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
341e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)		\
342e948693eSPhilip Paeps 	DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2,		\
343e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4)
344e948693eSPhilip Paeps #endif
345e948693eSPhilip Paeps 
346e948693eSPhilip Paeps #ifdef DTRACE_PROBE6
347e948693eSPhilip Paeps #define	EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
348e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
349e948693eSPhilip Paeps 	    _type6, _arg6)						\
350e948693eSPhilip Paeps 	DTRACE_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
351e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
352e948693eSPhilip Paeps 	    _type6, _arg6)
353e948693eSPhilip Paeps #else
354e948693eSPhilip Paeps #define	EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
355e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
356e948693eSPhilip Paeps 	    _type6, _arg6)						\
357e948693eSPhilip Paeps 	EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
358e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)
359e948693eSPhilip Paeps #endif
360e948693eSPhilip Paeps 
361e948693eSPhilip Paeps #ifdef DTRACE_PROBE7
362e948693eSPhilip Paeps #define	EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2,		\
363e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
364e948693eSPhilip Paeps 	    _type6, _arg6, _type7, _arg7)				\
365e948693eSPhilip Paeps 	DTRACE_PROBE7(_name, _type1, _arg1, _type2, _arg2,		\
366e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
367e948693eSPhilip Paeps 	    _type6, _arg6, _type7, _arg7)
368e948693eSPhilip Paeps #else
369e948693eSPhilip Paeps #define	EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2,		\
370e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
371e948693eSPhilip Paeps 	    _type6, _arg6, _type7, _arg7)				\
372e948693eSPhilip Paeps 	EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
373e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
374e948693eSPhilip Paeps 	    _type6, _arg6)
375e948693eSPhilip Paeps #endif
376e948693eSPhilip Paeps 
37754366c0bSAttilio Rao #endif /* DTRACE_PROBE */
378e948693eSPhilip Paeps 
379e948693eSPhilip Paeps /* DMA */
380e948693eSPhilip Paeps 
381e948693eSPhilip Paeps typedef uint64_t		efsys_dma_addr_t;
382e948693eSPhilip Paeps 
383e948693eSPhilip Paeps typedef struct efsys_mem_s {
384e948693eSPhilip Paeps 	bus_dma_tag_t		esm_tag;
385e948693eSPhilip Paeps 	bus_dmamap_t		esm_map;
386e948693eSPhilip Paeps 	caddr_t			esm_base;
387e948693eSPhilip Paeps 	efsys_dma_addr_t	esm_addr;
388e948693eSPhilip Paeps } efsys_mem_t;
389e948693eSPhilip Paeps 
390e948693eSPhilip Paeps 
391e948693eSPhilip Paeps #define	EFSYS_MEM_ZERO(_esmp, _size)					\
392e948693eSPhilip Paeps 	do {								\
393e948693eSPhilip Paeps 		(void) memset((_esmp)->esm_base, 0, (_size));		\
394e948693eSPhilip Paeps 									\
395e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
396e948693eSPhilip Paeps 	} while (B_FALSE)
397e948693eSPhilip Paeps 
398e948693eSPhilip Paeps #define	EFSYS_MEM_READD(_esmp, _offset, _edp)				\
399e948693eSPhilip Paeps 	do {								\
400e948693eSPhilip Paeps 		uint32_t *addr;						\
401e948693eSPhilip Paeps 									\
402e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
403e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)),	\
404e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
405e948693eSPhilip Paeps 									\
406e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
407e948693eSPhilip Paeps 									\
408e948693eSPhilip Paeps 		(_edp)->ed_u32[0] = *addr;				\
409e948693eSPhilip Paeps 									\
410e948693eSPhilip Paeps 		EFSYS_PROBE2(mem_readd, unsigned int, (_offset),	\
411e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
412e948693eSPhilip Paeps 									\
413e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
414e948693eSPhilip Paeps 	} while (B_FALSE)
415e948693eSPhilip Paeps 
4160f999687SAndrew Rybchenko #if defined(__x86_64__)
4170f999687SAndrew Rybchenko #define	EFSYS_MEM_READQ(_esmp, _offset, _eqp)				\
4180f999687SAndrew Rybchenko 	do {								\
4190f999687SAndrew Rybchenko 		uint64_t *addr;						\
4200f999687SAndrew Rybchenko 									\
4210f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
4220f999687SAndrew Rybchenko 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
4230f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
4240f999687SAndrew Rybchenko 									\
4250f999687SAndrew Rybchenko 		addr = (void *)((_esmp)->esm_base + (_offset));		\
4260f999687SAndrew Rybchenko 									\
4270f999687SAndrew Rybchenko 		(_eqp)->eq_u64[0] = *addr;				\
4280f999687SAndrew Rybchenko 									\
4290f999687SAndrew Rybchenko 		EFSYS_PROBE3(mem_readq, unsigned int, (_offset),	\
4300f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[1],			\
4310f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[0]);			\
4320f999687SAndrew Rybchenko 									\
4330f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
4340f999687SAndrew Rybchenko 	} while (B_FALSE)
4350f999687SAndrew Rybchenko #else
436e948693eSPhilip Paeps #define	EFSYS_MEM_READQ(_esmp, _offset, _eqp)				\
437e948693eSPhilip Paeps 	do {								\
438e948693eSPhilip Paeps 		uint32_t *addr;						\
439e948693eSPhilip Paeps 									\
440e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
441e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
442e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
443e948693eSPhilip Paeps 									\
444e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
445e948693eSPhilip Paeps 									\
446e948693eSPhilip Paeps 		(_eqp)->eq_u32[0] = *addr++;				\
447e948693eSPhilip Paeps 		(_eqp)->eq_u32[1] = *addr;				\
448e948693eSPhilip Paeps 									\
449e948693eSPhilip Paeps 		EFSYS_PROBE3(mem_readq, unsigned int, (_offset),	\
450e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
451e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
452e948693eSPhilip Paeps 									\
453e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
454e948693eSPhilip Paeps 	} while (B_FALSE)
4550f999687SAndrew Rybchenko #endif
456e948693eSPhilip Paeps 
4570f999687SAndrew Rybchenko #if defined(__x86_64__)
4580f999687SAndrew Rybchenko #define	EFSYS_MEM_READO(_esmp, _offset, _eop)				\
4590f999687SAndrew Rybchenko 	do {								\
4600f999687SAndrew Rybchenko 		uint64_t *addr;						\
4610f999687SAndrew Rybchenko 									\
4620f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
4630f999687SAndrew Rybchenko 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
4640f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
4650f999687SAndrew Rybchenko 									\
4660f999687SAndrew Rybchenko 		addr = (void *)((_esmp)->esm_base + (_offset));		\
4670f999687SAndrew Rybchenko 									\
4680f999687SAndrew Rybchenko 		(_eop)->eo_u64[0] = *addr++;				\
4690f999687SAndrew Rybchenko 		(_eop)->eo_u64[1] = *addr;				\
4700f999687SAndrew Rybchenko 									\
4710f999687SAndrew Rybchenko 		EFSYS_PROBE5(mem_reado, unsigned int, (_offset),	\
4720f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[3],			\
4730f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[2],			\
4740f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[1],			\
4750f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[0]);			\
4760f999687SAndrew Rybchenko 									\
4770f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
4780f999687SAndrew Rybchenko 	} while (B_FALSE)
4790f999687SAndrew Rybchenko #else
480e948693eSPhilip Paeps #define	EFSYS_MEM_READO(_esmp, _offset, _eop)				\
481e948693eSPhilip Paeps 	do {								\
482e948693eSPhilip Paeps 		uint32_t *addr;						\
483e948693eSPhilip Paeps 									\
484e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
485e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
486e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
487e948693eSPhilip Paeps 									\
488e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
489e948693eSPhilip Paeps 									\
490e948693eSPhilip Paeps 		(_eop)->eo_u32[0] = *addr++;				\
491e948693eSPhilip Paeps 		(_eop)->eo_u32[1] = *addr++;				\
492e948693eSPhilip Paeps 		(_eop)->eo_u32[2] = *addr++;				\
493e948693eSPhilip Paeps 		(_eop)->eo_u32[3] = *addr;				\
494e948693eSPhilip Paeps 									\
495e948693eSPhilip Paeps 		EFSYS_PROBE5(mem_reado, unsigned int, (_offset),	\
496e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
497e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
498e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
499e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
500e948693eSPhilip Paeps 									\
501e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
502e948693eSPhilip Paeps 	} while (B_FALSE)
5030f999687SAndrew Rybchenko #endif
504e948693eSPhilip Paeps 
505e948693eSPhilip Paeps #define	EFSYS_MEM_WRITED(_esmp, _offset, _edp)				\
506e948693eSPhilip Paeps 	do {								\
507e948693eSPhilip Paeps 		uint32_t *addr;						\
508e948693eSPhilip Paeps 									\
509e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
510e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)),	\
511e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
512e948693eSPhilip Paeps 									\
513e948693eSPhilip Paeps 		EFSYS_PROBE2(mem_writed, unsigned int, (_offset),	\
514e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
515e948693eSPhilip Paeps 									\
516e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
517e948693eSPhilip Paeps 									\
518e948693eSPhilip Paeps 		*addr = (_edp)->ed_u32[0];				\
519e948693eSPhilip Paeps 									\
520e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
521e948693eSPhilip Paeps 	} while (B_FALSE)
522e948693eSPhilip Paeps 
5230f999687SAndrew Rybchenko #if defined(__x86_64__)
5240f999687SAndrew Rybchenko #define	EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp)				\
5250f999687SAndrew Rybchenko 	do {								\
5260f999687SAndrew Rybchenko 		uint64_t *addr;						\
5270f999687SAndrew Rybchenko 									\
5280f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
5290f999687SAndrew Rybchenko 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
5300f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
5310f999687SAndrew Rybchenko 									\
5320f999687SAndrew Rybchenko 		EFSYS_PROBE3(mem_writeq, unsigned int, (_offset),	\
5330f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[1],			\
5340f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[0]);			\
5350f999687SAndrew Rybchenko 									\
5360f999687SAndrew Rybchenko 		addr = (void *)((_esmp)->esm_base + (_offset));		\
5370f999687SAndrew Rybchenko 									\
5380f999687SAndrew Rybchenko 		*addr   = (_eqp)->eq_u64[0];				\
5390f999687SAndrew Rybchenko 									\
5400f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
5410f999687SAndrew Rybchenko 	} while (B_FALSE)
5420f999687SAndrew Rybchenko 
5430f999687SAndrew Rybchenko #else
544e948693eSPhilip Paeps #define	EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp)				\
545e948693eSPhilip Paeps 	do {								\
546e948693eSPhilip Paeps 		uint32_t *addr;						\
547e948693eSPhilip Paeps 									\
548e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
549e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
550e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
551e948693eSPhilip Paeps 									\
552e948693eSPhilip Paeps 		EFSYS_PROBE3(mem_writeq, unsigned int, (_offset),	\
553e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
554e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
555e948693eSPhilip Paeps 									\
556e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
557e948693eSPhilip Paeps 									\
558e948693eSPhilip Paeps 		*addr++ = (_eqp)->eq_u32[0];				\
559e948693eSPhilip Paeps 		*addr   = (_eqp)->eq_u32[1];				\
560e948693eSPhilip Paeps 									\
561e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
562e948693eSPhilip Paeps 	} while (B_FALSE)
5630f999687SAndrew Rybchenko #endif
564e948693eSPhilip Paeps 
5650f999687SAndrew Rybchenko #if defined(__x86_64__)
5660f999687SAndrew Rybchenko #define	EFSYS_MEM_WRITEO(_esmp, _offset, _eop)				\
5670f999687SAndrew Rybchenko 	do {								\
5680f999687SAndrew Rybchenko 		uint64_t *addr;						\
5690f999687SAndrew Rybchenko 									\
5700f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
5710f999687SAndrew Rybchenko 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
5720f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
5730f999687SAndrew Rybchenko 									\
5740f999687SAndrew Rybchenko 		EFSYS_PROBE5(mem_writeo, unsigned int, (_offset),	\
5750f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[3],			\
5760f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[2],			\
5770f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[1],			\
5780f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[0]);			\
5790f999687SAndrew Rybchenko 									\
5800f999687SAndrew Rybchenko 		addr = (void *)((_esmp)->esm_base + (_offset));		\
5810f999687SAndrew Rybchenko 									\
5820f999687SAndrew Rybchenko 		*addr++ = (_eop)->eo_u64[0];				\
5830f999687SAndrew Rybchenko 		*addr   = (_eop)->eo_u64[1];				\
5840f999687SAndrew Rybchenko 									\
5850f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
5860f999687SAndrew Rybchenko 	} while (B_FALSE)
5870f999687SAndrew Rybchenko #else
588e948693eSPhilip Paeps #define	EFSYS_MEM_WRITEO(_esmp, _offset, _eop)				\
589e948693eSPhilip Paeps 	do {								\
590e948693eSPhilip Paeps 		uint32_t *addr;						\
591e948693eSPhilip Paeps 									\
592e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
593e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
594e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
595e948693eSPhilip Paeps 									\
596e948693eSPhilip Paeps 		EFSYS_PROBE5(mem_writeo, unsigned int, (_offset),	\
597e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
598e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
599e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
600e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
601e948693eSPhilip Paeps 									\
602e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
603e948693eSPhilip Paeps 									\
604e948693eSPhilip Paeps 		*addr++ = (_eop)->eo_u32[0];				\
605e948693eSPhilip Paeps 		*addr++ = (_eop)->eo_u32[1];				\
606e948693eSPhilip Paeps 		*addr++ = (_eop)->eo_u32[2];				\
607e948693eSPhilip Paeps 		*addr   = (_eop)->eo_u32[3];				\
608e948693eSPhilip Paeps 									\
609e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
610e948693eSPhilip Paeps 	} while (B_FALSE)
6110f999687SAndrew Rybchenko #endif
612e948693eSPhilip Paeps 
613e948693eSPhilip Paeps #define	EFSYS_MEM_ADDR(_esmp)						\
614e948693eSPhilip Paeps 	((_esmp)->esm_addr)
615e948693eSPhilip Paeps 
6163c838a9fSAndrew Rybchenko #define	EFSYS_MEM_IS_NULL(_esmp)					\
6173c838a9fSAndrew Rybchenko 	((_esmp)->esm_base == NULL)
6183c838a9fSAndrew Rybchenko 
619e948693eSPhilip Paeps /* BAR */
620e948693eSPhilip Paeps 
62133d45dc5SAndrew Rybchenko #define	SFXGE_LOCK_NAME_MAX	16
62233d45dc5SAndrew Rybchenko 
623e948693eSPhilip Paeps typedef struct efsys_bar_s {
624e948693eSPhilip Paeps 	struct mtx		esb_lock;
62533d45dc5SAndrew Rybchenko 	char			esb_lock_name[SFXGE_LOCK_NAME_MAX];
626e948693eSPhilip Paeps 	bus_space_tag_t		esb_tag;
627e948693eSPhilip Paeps 	bus_space_handle_t	esb_handle;
628e948693eSPhilip Paeps 	int			esb_rid;
629e948693eSPhilip Paeps 	struct resource		*esb_res;
630e948693eSPhilip Paeps } efsys_bar_t;
631e948693eSPhilip Paeps 
63233d45dc5SAndrew Rybchenko #define	SFXGE_BAR_LOCK_INIT(_esbp, _ifname)				\
63333d45dc5SAndrew Rybchenko 	do {								\
63433d45dc5SAndrew Rybchenko 		snprintf((_esbp)->esb_lock_name,			\
63533d45dc5SAndrew Rybchenko 			 sizeof((_esbp)->esb_lock_name),		\
63633d45dc5SAndrew Rybchenko 			 "%s:bar", (_ifname));				\
63733d45dc5SAndrew Rybchenko 		mtx_init(&(_esbp)->esb_lock, (_esbp)->esb_lock_name,	\
63833d45dc5SAndrew Rybchenko 			 NULL, MTX_DEF);				\
63933d45dc5SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
64033d45dc5SAndrew Rybchenko 	} while (B_FALSE)
641763cab71SAndrew Rybchenko #define	SFXGE_BAR_LOCK_DESTROY(_esbp)					\
642763cab71SAndrew Rybchenko 	mtx_destroy(&(_esbp)->esb_lock)
643763cab71SAndrew Rybchenko #define	SFXGE_BAR_LOCK(_esbp)						\
644763cab71SAndrew Rybchenko 	mtx_lock(&(_esbp)->esb_lock)
645763cab71SAndrew Rybchenko #define	SFXGE_BAR_UNLOCK(_esbp)						\
646763cab71SAndrew Rybchenko 	mtx_unlock(&(_esbp)->esb_lock)
647763cab71SAndrew Rybchenko 
648e948693eSPhilip Paeps #define	EFSYS_BAR_READD(_esbp, _offset, _edp, _lock)			\
649e948693eSPhilip Paeps 	do {								\
650e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
651e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)),	\
652e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
653e948693eSPhilip Paeps 									\
654e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
655e948693eSPhilip Paeps 		if (_lock)						\
656763cab71SAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
657e948693eSPhilip Paeps 									\
658d9ff48abSAndrew Rybchenko 		(_edp)->ed_u32[0] = bus_space_read_stream_4(		\
659d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
660d9ff48abSAndrew Rybchenko 		    (_offset));						\
661e948693eSPhilip Paeps 									\
662e948693eSPhilip Paeps 		EFSYS_PROBE2(bar_readd, unsigned int, (_offset),	\
663e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
664e948693eSPhilip Paeps 									\
665e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
666e948693eSPhilip Paeps 		if (_lock)						\
667763cab71SAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
668e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
669e948693eSPhilip Paeps 	} while (B_FALSE)
670e948693eSPhilip Paeps 
6715dadbb64SAndrew Rybchenko #if defined(SFXGE_USE_BUS_SPACE_8)
672e948693eSPhilip Paeps #define	EFSYS_BAR_READQ(_esbp, _offset, _eqp)				\
673e948693eSPhilip Paeps 	do {								\
674e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
675e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
676e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
677e948693eSPhilip Paeps 									\
678763cab71SAndrew Rybchenko 		SFXGE_BAR_LOCK(_esbp);					\
679e948693eSPhilip Paeps 									\
680d9ff48abSAndrew Rybchenko 		(_eqp)->eq_u64[0] = bus_space_read_stream_8(		\
681d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
682d9ff48abSAndrew Rybchenko 		    (_offset));						\
6830f999687SAndrew Rybchenko 									\
6840f999687SAndrew Rybchenko 		EFSYS_PROBE3(bar_readq, unsigned int, (_offset),	\
6850f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[1],			\
6860f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[0]);			\
6870f999687SAndrew Rybchenko 									\
688687adefaSAndrew Rybchenko 		SFXGE_BAR_UNLOCK(_esbp);				\
6890f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
6900f999687SAndrew Rybchenko 	} while (B_FALSE)
6910f999687SAndrew Rybchenko 
6920f999687SAndrew Rybchenko #define	EFSYS_BAR_READO(_esbp, _offset, _eop, _lock)			\
6930f999687SAndrew Rybchenko 	do {								\
6940f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
6950f999687SAndrew Rybchenko 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
6960f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
6970f999687SAndrew Rybchenko 									\
6980f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
6990f999687SAndrew Rybchenko 		if (_lock)						\
700687adefaSAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
7010f999687SAndrew Rybchenko 									\
702d9ff48abSAndrew Rybchenko 		(_eop)->eo_u64[0] = bus_space_read_stream_8(		\
703d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
704d9ff48abSAndrew Rybchenko 		    (_offset));						\
705d9ff48abSAndrew Rybchenko 		(_eop)->eo_u64[1] = bus_space_read_stream_8(		\
706d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
707d9ff48abSAndrew Rybchenko 		    (_offset) + 8);					\
7080f999687SAndrew Rybchenko 									\
7090f999687SAndrew Rybchenko 		EFSYS_PROBE5(bar_reado, unsigned int, (_offset),	\
7100f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[3],			\
7110f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[2],			\
7120f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[1],			\
7130f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[0]);			\
7140f999687SAndrew Rybchenko 									\
7150f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
7160f999687SAndrew Rybchenko 		if (_lock)						\
717687adefaSAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
7180f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
7190f999687SAndrew Rybchenko 	} while (B_FALSE)
7200f999687SAndrew Rybchenko 
7210f999687SAndrew Rybchenko #else
7220f999687SAndrew Rybchenko #define	EFSYS_BAR_READQ(_esbp, _offset, _eqp)				\
7230f999687SAndrew Rybchenko 	do {								\
7240f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
7250f999687SAndrew Rybchenko 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
7260f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
7270f999687SAndrew Rybchenko 									\
728687adefaSAndrew Rybchenko 		SFXGE_BAR_LOCK(_esbp);					\
7290f999687SAndrew Rybchenko 									\
730d9ff48abSAndrew Rybchenko 		(_eqp)->eq_u32[0] = bus_space_read_stream_4(		\
731d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
732d9ff48abSAndrew Rybchenko 		    (_offset));						\
733d9ff48abSAndrew Rybchenko 		(_eqp)->eq_u32[1] = bus_space_read_stream_4(		\
734d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
735d9ff48abSAndrew Rybchenko 		    (_offset) + 4);					\
736e948693eSPhilip Paeps 									\
737e948693eSPhilip Paeps 		EFSYS_PROBE3(bar_readq, unsigned int, (_offset),	\
738e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
739e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
740e948693eSPhilip Paeps 									\
741763cab71SAndrew Rybchenko 		SFXGE_BAR_UNLOCK(_esbp);				\
742e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
743e948693eSPhilip Paeps 	} while (B_FALSE)
744e948693eSPhilip Paeps 
745e948693eSPhilip Paeps #define	EFSYS_BAR_READO(_esbp, _offset, _eop, _lock)			\
746e948693eSPhilip Paeps 	do {								\
747e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
748e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
749e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
750e948693eSPhilip Paeps 									\
751e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
752e948693eSPhilip Paeps 		if (_lock)						\
753763cab71SAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
754e948693eSPhilip Paeps 									\
755d9ff48abSAndrew Rybchenko 		(_eop)->eo_u32[0] = bus_space_read_stream_4(		\
756d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
757d9ff48abSAndrew Rybchenko 		    (_offset));						\
758d9ff48abSAndrew Rybchenko 		(_eop)->eo_u32[1] = bus_space_read_stream_4(		\
759d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
760d9ff48abSAndrew Rybchenko 		    (_offset) + 4);					\
761d9ff48abSAndrew Rybchenko 		(_eop)->eo_u32[2] = bus_space_read_stream_4(		\
762d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
763d9ff48abSAndrew Rybchenko 		    (_offset) + 8);					\
764d9ff48abSAndrew Rybchenko 		(_eop)->eo_u32[3] = bus_space_read_stream_4(		\
765d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
766d9ff48abSAndrew Rybchenko 		    (_offset) + 12);					\
767e948693eSPhilip Paeps 									\
768e948693eSPhilip Paeps 		EFSYS_PROBE5(bar_reado, unsigned int, (_offset),	\
769e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
770e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
771e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
772e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
773e948693eSPhilip Paeps 									\
774e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
775e948693eSPhilip Paeps 		if (_lock)						\
776763cab71SAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
777e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
778e948693eSPhilip Paeps 	} while (B_FALSE)
7790f999687SAndrew Rybchenko #endif
780e948693eSPhilip Paeps 
781e948693eSPhilip Paeps #define	EFSYS_BAR_WRITED(_esbp, _offset, _edp, _lock)			\
782e948693eSPhilip Paeps 	do {								\
783e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
784e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)),	\
785e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
786e948693eSPhilip Paeps 									\
787e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
788e948693eSPhilip Paeps 		if (_lock)						\
789763cab71SAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
790e948693eSPhilip Paeps 									\
791e948693eSPhilip Paeps 		EFSYS_PROBE2(bar_writed, unsigned int, (_offset),	\
792e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
793e948693eSPhilip Paeps 									\
7941cc8febfSAndrew Rybchenko 		/*							\
7951cc8febfSAndrew Rybchenko 		 * Make sure that previous writes to the dword have	\
7961cc8febfSAndrew Rybchenko 		 * been done. It should be cheaper than barrier just	\
7971cc8febfSAndrew Rybchenko 		 * after the write below.				\
7981cc8febfSAndrew Rybchenko 		 */							\
7991cc8febfSAndrew Rybchenko 		bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
8001cc8febfSAndrew Rybchenko 		    (_offset), sizeof (efx_dword_t),			\
8011cc8febfSAndrew Rybchenko 		    BUS_SPACE_BARRIER_WRITE);				\
802d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
803d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
804e948693eSPhilip Paeps 		    (_offset), (_edp)->ed_u32[0]);			\
805e948693eSPhilip Paeps 									\
806e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
807e948693eSPhilip Paeps 		if (_lock)						\
808763cab71SAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
809e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
810e948693eSPhilip Paeps 	} while (B_FALSE)
811e948693eSPhilip Paeps 
8125dadbb64SAndrew Rybchenko #if defined(SFXGE_USE_BUS_SPACE_8)
813e948693eSPhilip Paeps #define	EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp)				\
814e948693eSPhilip Paeps 	do {								\
815e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
816e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
817e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
818e948693eSPhilip Paeps 									\
819763cab71SAndrew Rybchenko 		SFXGE_BAR_LOCK(_esbp);					\
820e948693eSPhilip Paeps 									\
821e948693eSPhilip Paeps 		EFSYS_PROBE3(bar_writeq, unsigned int, (_offset),	\
822e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
823e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
824e948693eSPhilip Paeps 									\
8251cc8febfSAndrew Rybchenko 		/*							\
8261cc8febfSAndrew Rybchenko 		 * Make sure that previous writes to the qword have	\
8271cc8febfSAndrew Rybchenko 		 * been done. It should be cheaper than barrier just	\
8281cc8febfSAndrew Rybchenko 		 * after the write below.				\
8291cc8febfSAndrew Rybchenko 		 */							\
8301cc8febfSAndrew Rybchenko 		bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
8311cc8febfSAndrew Rybchenko 		    (_offset), sizeof (efx_qword_t),			\
8321cc8febfSAndrew Rybchenko 		    BUS_SPACE_BARRIER_WRITE);				\
833d9ff48abSAndrew Rybchenko 		bus_space_write_stream_8((_esbp)->esb_tag,		\
834d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
8350f999687SAndrew Rybchenko 		    (_offset), (_eqp)->eq_u64[0]);			\
8360f999687SAndrew Rybchenko 									\
837687adefaSAndrew Rybchenko 		SFXGE_BAR_UNLOCK(_esbp);				\
8380f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
8390f999687SAndrew Rybchenko 	} while (B_FALSE)
8400f999687SAndrew Rybchenko #else
8410f999687SAndrew Rybchenko #define	EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp)				\
8420f999687SAndrew Rybchenko 	do {								\
8430f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
8440f999687SAndrew Rybchenko 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
8450f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
8460f999687SAndrew Rybchenko 									\
847687adefaSAndrew Rybchenko 		SFXGE_BAR_LOCK(_esbp);					\
8480f999687SAndrew Rybchenko 									\
8490f999687SAndrew Rybchenko 		EFSYS_PROBE3(bar_writeq, unsigned int, (_offset),	\
8500f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[1],			\
8510f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[0]);			\
8520f999687SAndrew Rybchenko 									\
8531cc8febfSAndrew Rybchenko 		/*							\
8541cc8febfSAndrew Rybchenko 		 * Make sure that previous writes to the qword have	\
8551cc8febfSAndrew Rybchenko 		 * been done. It should be cheaper than barrier just	\
8561cc8febfSAndrew Rybchenko 		 * after the last write below.				\
8571cc8febfSAndrew Rybchenko 		 */							\
8581cc8febfSAndrew Rybchenko 		bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
8591cc8febfSAndrew Rybchenko 		    (_offset), sizeof (efx_qword_t),			\
8601cc8febfSAndrew Rybchenko 		    BUS_SPACE_BARRIER_WRITE);				\
861d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
862d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
863e948693eSPhilip Paeps 		    (_offset), (_eqp)->eq_u32[0]);			\
8641cc8febfSAndrew Rybchenko 		/*							\
8651cc8febfSAndrew Rybchenko 		 * It should be guaranteed that the last dword comes	\
8661cc8febfSAndrew Rybchenko 		 * the last, so barrier entire qword to be sure that	\
8671cc8febfSAndrew Rybchenko 		 * neither above nor below writes are reordered.	\
8681cc8febfSAndrew Rybchenko 		 */							\
8691cc8febfSAndrew Rybchenko 		bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
8701cc8febfSAndrew Rybchenko 		    (_offset), sizeof (efx_qword_t),			\
8711cc8febfSAndrew Rybchenko 		    BUS_SPACE_BARRIER_WRITE);				\
872d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
873d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
874d9ff48abSAndrew Rybchenko 		    (_offset) + 4, (_eqp)->eq_u32[1]);			\
875e948693eSPhilip Paeps 									\
876763cab71SAndrew Rybchenko 		SFXGE_BAR_UNLOCK(_esbp);				\
877e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
878e948693eSPhilip Paeps 	} while (B_FALSE)
8790f999687SAndrew Rybchenko #endif
880e948693eSPhilip Paeps 
8813c838a9fSAndrew Rybchenko /*
8823c838a9fSAndrew Rybchenko  * Guarantees 64bit aligned 64bit writes to write combined BAR mapping
8833c838a9fSAndrew Rybchenko  * (required by PIO hardware)
8843c838a9fSAndrew Rybchenko  */
8853c838a9fSAndrew Rybchenko #define	EFSYS_BAR_WC_WRITEQ(_esbp, _offset, _eqp)			\
8863c838a9fSAndrew Rybchenko 	do {								\
8873c838a9fSAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
8883c838a9fSAndrew Rybchenko 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)),	\
8893c838a9fSAndrew Rybchenko 		    ("not power of 2 aligned"));			\
8903c838a9fSAndrew Rybchenko 									\
8913c838a9fSAndrew Rybchenko 		(void) (_esbp);						\
8923c838a9fSAndrew Rybchenko 									\
8933c838a9fSAndrew Rybchenko 		/* FIXME: Perform a 64-bit write */			\
8943c838a9fSAndrew Rybchenko 		KASSERT(0, ("not implemented"));			\
8953c838a9fSAndrew Rybchenko 									\
8963c838a9fSAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
8973c838a9fSAndrew Rybchenko 	} while (B_FALSE)
8983c838a9fSAndrew Rybchenko 
8995dadbb64SAndrew Rybchenko #if defined(SFXGE_USE_BUS_SPACE_8)
900e948693eSPhilip Paeps #define	EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock)			\
901e948693eSPhilip Paeps 	do {								\
902e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
903e948693eSPhilip Paeps 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
904e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
905e948693eSPhilip Paeps 									\
906e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
907e948693eSPhilip Paeps 		if (_lock)						\
908763cab71SAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
909e948693eSPhilip Paeps 									\
910e948693eSPhilip Paeps 		EFSYS_PROBE5(bar_writeo, unsigned int, (_offset),	\
911e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
912e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
913e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
914e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
915e948693eSPhilip Paeps 									\
9161cc8febfSAndrew Rybchenko 		/*							\
9171cc8febfSAndrew Rybchenko 		 * Make sure that previous writes to the oword have	\
9181cc8febfSAndrew Rybchenko 		 * been done. It should be cheaper than barrier just	\
9191cc8febfSAndrew Rybchenko 		 * after the last write below.				\
9201cc8febfSAndrew Rybchenko 		 */							\
9211cc8febfSAndrew Rybchenko 		bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
9221cc8febfSAndrew Rybchenko 		    (_offset), sizeof (efx_oword_t),			\
9231cc8febfSAndrew Rybchenko 		    BUS_SPACE_BARRIER_WRITE);				\
924d9ff48abSAndrew Rybchenko 		bus_space_write_stream_8((_esbp)->esb_tag,		\
925d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
9260f999687SAndrew Rybchenko 		    (_offset), (_eop)->eo_u64[0]);			\
9271cc8febfSAndrew Rybchenko 		/*							\
9281cc8febfSAndrew Rybchenko 		 * It should be guaranteed that the last qword comes	\
9291cc8febfSAndrew Rybchenko 		 * the last, so barrier entire oword to be sure that	\
9301cc8febfSAndrew Rybchenko 		 * neither above nor below writes are reordered.	\
9311cc8febfSAndrew Rybchenko 		 */							\
9321cc8febfSAndrew Rybchenko 		bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
9331cc8febfSAndrew Rybchenko 		    (_offset), sizeof (efx_oword_t),			\
9341cc8febfSAndrew Rybchenko 		    BUS_SPACE_BARRIER_WRITE);				\
935d9ff48abSAndrew Rybchenko 		bus_space_write_stream_8((_esbp)->esb_tag,		\
936d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
937d9ff48abSAndrew Rybchenko 		    (_offset) + 8, (_eop)->eo_u64[1]);			\
9380f999687SAndrew Rybchenko 									\
9390f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
9400f999687SAndrew Rybchenko 		if (_lock)						\
941687adefaSAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
9420f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
9430f999687SAndrew Rybchenko 	} while (B_FALSE)
9440f999687SAndrew Rybchenko 
9450f999687SAndrew Rybchenko #else
9460f999687SAndrew Rybchenko #define	EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock)			\
9470f999687SAndrew Rybchenko 	do {								\
9480f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
9490f999687SAndrew Rybchenko 		KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)),	\
9500f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
9510f999687SAndrew Rybchenko 									\
9520f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
9530f999687SAndrew Rybchenko 		if (_lock)						\
954687adefaSAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
9550f999687SAndrew Rybchenko 									\
9560f999687SAndrew Rybchenko 		EFSYS_PROBE5(bar_writeo, unsigned int, (_offset),	\
9570f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[3],			\
9580f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[2],			\
9590f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[1],			\
9600f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[0]);			\
9610f999687SAndrew Rybchenko 									\
9621cc8febfSAndrew Rybchenko 		/*							\
9631cc8febfSAndrew Rybchenko 		 * Make sure that previous writes to the oword have	\
9641cc8febfSAndrew Rybchenko 		 * been done. It should be cheaper than barrier just	\
9651cc8febfSAndrew Rybchenko 		 * after the last write below.				\
9661cc8febfSAndrew Rybchenko 		 */							\
9671cc8febfSAndrew Rybchenko 		bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
9681cc8febfSAndrew Rybchenko 		    (_offset), sizeof (efx_oword_t),			\
9691cc8febfSAndrew Rybchenko 		    BUS_SPACE_BARRIER_WRITE);				\
970d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
971d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
972e948693eSPhilip Paeps 		    (_offset), (_eop)->eo_u32[0]);			\
973d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
974d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
975d9ff48abSAndrew Rybchenko 		    (_offset) + 4, (_eop)->eo_u32[1]);			\
976d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
977d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
978d9ff48abSAndrew Rybchenko 		    (_offset) + 8, (_eop)->eo_u32[2]);			\
9791cc8febfSAndrew Rybchenko 		/*							\
9801cc8febfSAndrew Rybchenko 		 * It should be guaranteed that the last dword comes	\
9811cc8febfSAndrew Rybchenko 		 * the last, so barrier entire oword to be sure that	\
9821cc8febfSAndrew Rybchenko 		 * neither above nor below writes are reordered.	\
9831cc8febfSAndrew Rybchenko 		 */							\
9841cc8febfSAndrew Rybchenko 		bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
9851cc8febfSAndrew Rybchenko 		    (_offset), sizeof (efx_oword_t),			\
9861cc8febfSAndrew Rybchenko 		    BUS_SPACE_BARRIER_WRITE);				\
987d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
988d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
989d9ff48abSAndrew Rybchenko 		    (_offset) + 12, (_eop)->eo_u32[3]);			\
990e948693eSPhilip Paeps 									\
991e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
992e948693eSPhilip Paeps 		if (_lock)						\
993763cab71SAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
994e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
995e948693eSPhilip Paeps 	} while (B_FALSE)
9960f999687SAndrew Rybchenko #endif
997e948693eSPhilip Paeps 
9983c838a9fSAndrew Rybchenko /* Use the standard octo-word write for doorbell writes */
9993c838a9fSAndrew Rybchenko #define	EFSYS_BAR_DOORBELL_WRITEO(_esbp, _offset, _eop)			\
10003c838a9fSAndrew Rybchenko 	do {								\
10013c838a9fSAndrew Rybchenko 		EFSYS_BAR_WRITEO((_esbp), (_offset), (_eop), B_FALSE);	\
10023c838a9fSAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
10033c838a9fSAndrew Rybchenko 	} while (B_FALSE)
10043c838a9fSAndrew Rybchenko 
1005e948693eSPhilip Paeps /* SPIN */
1006e948693eSPhilip Paeps 
1007e948693eSPhilip Paeps #define	EFSYS_SPIN(_us)							\
1008e948693eSPhilip Paeps 	do {								\
1009e948693eSPhilip Paeps 		DELAY(_us);						\
1010e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1011e948693eSPhilip Paeps 	} while (B_FALSE)
1012e948693eSPhilip Paeps 
1013e948693eSPhilip Paeps #define	EFSYS_SLEEP	EFSYS_SPIN
1014e948693eSPhilip Paeps 
1015e948693eSPhilip Paeps /* BARRIERS */
1016e948693eSPhilip Paeps 
10177c00963aSAndrew Rybchenko #define	EFSYS_MEM_READ_BARRIER()	rmb()
1018e948693eSPhilip Paeps #define	EFSYS_PIO_WRITE_BARRIER()
1019e948693eSPhilip Paeps 
10203c838a9fSAndrew Rybchenko /* DMA SYNC */
10213c838a9fSAndrew Rybchenko #define	EFSYS_DMA_SYNC_FOR_KERNEL(_esmp, _offset, _size)		\
10223c838a9fSAndrew Rybchenko 	do {								\
10233c838a9fSAndrew Rybchenko 		bus_dmamap_sync((_esmp)->esm_tag,			\
10243c838a9fSAndrew Rybchenko 		    (_esmp)->esm_map,					\
10253c838a9fSAndrew Rybchenko 		    BUS_DMASYNC_POSTREAD);				\
10263c838a9fSAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
10273c838a9fSAndrew Rybchenko 	} while (B_FALSE)
10283c838a9fSAndrew Rybchenko 
10293c838a9fSAndrew Rybchenko #define	EFSYS_DMA_SYNC_FOR_DEVICE(_esmp, _offset, _size)		\
10303c838a9fSAndrew Rybchenko 	do {								\
10313c838a9fSAndrew Rybchenko 		bus_dmamap_sync((_esmp)->esm_tag,			\
10323c838a9fSAndrew Rybchenko 		    (_esmp)->esm_map,					\
10333c838a9fSAndrew Rybchenko 		    BUS_DMASYNC_PREWRITE);				\
10343c838a9fSAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
10353c838a9fSAndrew Rybchenko 	} while (B_FALSE)
10363c838a9fSAndrew Rybchenko 
1037e948693eSPhilip Paeps /* TIMESTAMP */
1038e948693eSPhilip Paeps 
1039e948693eSPhilip Paeps typedef	clock_t	efsys_timestamp_t;
1040e948693eSPhilip Paeps 
1041e948693eSPhilip Paeps #define	EFSYS_TIMESTAMP(_usp)						\
1042e948693eSPhilip Paeps 	do {								\
1043e948693eSPhilip Paeps 		clock_t now;						\
1044e948693eSPhilip Paeps 									\
1045e948693eSPhilip Paeps 		now = ticks;						\
1046e948693eSPhilip Paeps 		*(_usp) = now * hz / 1000000;				\
1047e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1048e948693eSPhilip Paeps 	} while (B_FALSE)
1049e948693eSPhilip Paeps 
1050e948693eSPhilip Paeps /* KMEM */
1051e948693eSPhilip Paeps 
1052e948693eSPhilip Paeps #define	EFSYS_KMEM_ALLOC(_esip, _size, _p)				\
1053e948693eSPhilip Paeps 	do {								\
1054e948693eSPhilip Paeps 		(_esip) = (_esip);					\
105583488e18SAndrew Rybchenko 		/*							\
105683488e18SAndrew Rybchenko 		 * The macro is used in non-sleepable contexts, for	\
105783488e18SAndrew Rybchenko 		 * example, holding a mutex.				\
105883488e18SAndrew Rybchenko 		 */							\
105983488e18SAndrew Rybchenko 		(_p) = malloc((_size), M_SFXGE, M_NOWAIT|M_ZERO);	\
1060e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1061e948693eSPhilip Paeps 	} while (B_FALSE)
1062e948693eSPhilip Paeps 
1063e948693eSPhilip Paeps #define	EFSYS_KMEM_FREE(_esip, _size, _p)				\
1064e948693eSPhilip Paeps 	do {								\
1065e948693eSPhilip Paeps 		(void) (_esip);						\
1066e948693eSPhilip Paeps 		(void) (_size);						\
1067e948693eSPhilip Paeps 		free((_p), M_SFXGE);					\
1068e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1069e948693eSPhilip Paeps 	} while (B_FALSE)
1070e948693eSPhilip Paeps 
1071e948693eSPhilip Paeps /* LOCK */
1072e948693eSPhilip Paeps 
107333d45dc5SAndrew Rybchenko typedef struct efsys_lock_s {
107433d45dc5SAndrew Rybchenko 	struct mtx	lock;
107533d45dc5SAndrew Rybchenko 	char		lock_name[SFXGE_LOCK_NAME_MAX];
107633d45dc5SAndrew Rybchenko } efsys_lock_t;
107733d45dc5SAndrew Rybchenko 
107833d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_LOCK_INIT(_eslp, _ifname, _label)			\
107933d45dc5SAndrew Rybchenko 	do {								\
108033d45dc5SAndrew Rybchenko 		efsys_lock_t *__eslp = (_eslp);				\
108133d45dc5SAndrew Rybchenko 									\
108233d45dc5SAndrew Rybchenko 		snprintf((__eslp)->lock_name,				\
108333d45dc5SAndrew Rybchenko 			 sizeof((__eslp)->lock_name),			\
108433d45dc5SAndrew Rybchenko 			 "%s:%s", (_ifname), (_label));			\
108533d45dc5SAndrew Rybchenko 		mtx_init(&(__eslp)->lock, (__eslp)->lock_name,		\
108633d45dc5SAndrew Rybchenko 			 NULL, MTX_DEF);				\
108733d45dc5SAndrew Rybchenko 	} while (B_FALSE)
108833d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_LOCK_DESTROY(_eslp)					\
108933d45dc5SAndrew Rybchenko 	mtx_destroy(&(_eslp)->lock)
109033d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_LOCK(_eslp)						\
109133d45dc5SAndrew Rybchenko 	mtx_lock(&(_eslp)->lock)
109233d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_UNLOCK(_eslp)					\
109333d45dc5SAndrew Rybchenko 	mtx_unlock(&(_eslp)->lock)
109433d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_LOCK_ASSERT_OWNED(_eslp)				\
109533d45dc5SAndrew Rybchenko 	mtx_assert(&(_eslp)->lock, MA_OWNED)
1096e948693eSPhilip Paeps 
1097*a98003ddSAndrew Rybchenko typedef int efsys_lock_state_t;
1098*a98003ddSAndrew Rybchenko 
1099e948693eSPhilip Paeps #define	EFSYS_LOCK_MAGIC	0x000010c4
1100e948693eSPhilip Paeps 
1101e948693eSPhilip Paeps #define	EFSYS_LOCK(_lockp, _state)					\
1102e948693eSPhilip Paeps 	do {								\
110333d45dc5SAndrew Rybchenko 		SFXGE_EFSYS_LOCK(_lockp);				\
1104e948693eSPhilip Paeps 		(_state) = EFSYS_LOCK_MAGIC;				\
1105e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1106e948693eSPhilip Paeps 	} while (B_FALSE)
1107e948693eSPhilip Paeps 
1108e948693eSPhilip Paeps #define	EFSYS_UNLOCK(_lockp, _state)					\
1109e948693eSPhilip Paeps 	do {								\
1110e948693eSPhilip Paeps 		if ((_state) != EFSYS_LOCK_MAGIC)			\
1111e948693eSPhilip Paeps 			KASSERT(B_FALSE, ("not locked"));		\
111233d45dc5SAndrew Rybchenko 		SFXGE_EFSYS_UNLOCK(_lockp);				\
1113e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1114e948693eSPhilip Paeps 	} while (B_FALSE)
1115e948693eSPhilip Paeps 
1116e948693eSPhilip Paeps /* STAT */
1117e948693eSPhilip Paeps 
1118e948693eSPhilip Paeps typedef uint64_t		efsys_stat_t;
1119e948693eSPhilip Paeps 
1120e948693eSPhilip Paeps #define	EFSYS_STAT_INCR(_knp, _delta) 					\
1121e948693eSPhilip Paeps 	do {								\
1122e948693eSPhilip Paeps 		*(_knp) += (_delta);					\
1123e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1124e948693eSPhilip Paeps 	} while (B_FALSE)
1125e948693eSPhilip Paeps 
1126e948693eSPhilip Paeps #define	EFSYS_STAT_DECR(_knp, _delta) 					\
1127e948693eSPhilip Paeps 	do {								\
1128e948693eSPhilip Paeps 		*(_knp) -= (_delta);					\
1129e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1130e948693eSPhilip Paeps 	} while (B_FALSE)
1131e948693eSPhilip Paeps 
1132e948693eSPhilip Paeps #define	EFSYS_STAT_SET(_knp, _val)					\
1133e948693eSPhilip Paeps 	do {								\
1134e948693eSPhilip Paeps 		*(_knp) = (_val);					\
1135e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1136e948693eSPhilip Paeps 	} while (B_FALSE)
1137e948693eSPhilip Paeps 
1138e948693eSPhilip Paeps #define	EFSYS_STAT_SET_QWORD(_knp, _valp)				\
1139e948693eSPhilip Paeps 	do {								\
1140e948693eSPhilip Paeps 		*(_knp) = le64toh((_valp)->eq_u64[0]);			\
1141e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1142e948693eSPhilip Paeps 	} while (B_FALSE)
1143e948693eSPhilip Paeps 
1144e948693eSPhilip Paeps #define	EFSYS_STAT_SET_DWORD(_knp, _valp)				\
1145e948693eSPhilip Paeps 	do {								\
1146e948693eSPhilip Paeps 		*(_knp) = le32toh((_valp)->ed_u32[0]);			\
1147e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1148e948693eSPhilip Paeps 	} while (B_FALSE)
1149e948693eSPhilip Paeps 
1150e948693eSPhilip Paeps #define	EFSYS_STAT_INCR_QWORD(_knp, _valp)				\
1151e948693eSPhilip Paeps 	do {								\
1152e948693eSPhilip Paeps 		*(_knp) += le64toh((_valp)->eq_u64[0]);			\
1153e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1154e948693eSPhilip Paeps 	} while (B_FALSE)
1155e948693eSPhilip Paeps 
1156e948693eSPhilip Paeps #define	EFSYS_STAT_SUBR_QWORD(_knp, _valp)				\
1157e948693eSPhilip Paeps 	do {								\
1158e948693eSPhilip Paeps 		*(_knp) -= le64toh((_valp)->eq_u64[0]);			\
1159e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1160e948693eSPhilip Paeps 	} while (B_FALSE)
1161e948693eSPhilip Paeps 
1162e948693eSPhilip Paeps /* ERR */
1163e948693eSPhilip Paeps 
1164e948693eSPhilip Paeps extern void	sfxge_err(efsys_identifier_t *, unsigned int,
1165e948693eSPhilip Paeps 		    uint32_t, uint32_t);
1166e948693eSPhilip Paeps 
1167e948693eSPhilip Paeps #if EFSYS_OPT_DECODE_INTR_FATAL
1168e948693eSPhilip Paeps #define	EFSYS_ERR(_esip, _code, _dword0, _dword1)			\
1169e948693eSPhilip Paeps 	do {								\
1170e948693eSPhilip Paeps 		sfxge_err((_esip), (_code), (_dword0), (_dword1));	\
1171e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1172e948693eSPhilip Paeps 	} while (B_FALSE)
1173e948693eSPhilip Paeps #endif
1174e948693eSPhilip Paeps 
1175e948693eSPhilip Paeps /* ASSERT */
1176e948693eSPhilip Paeps 
1177e948693eSPhilip Paeps #define	EFSYS_ASSERT(_exp) do {						\
1178e948693eSPhilip Paeps 	if (!(_exp))							\
11793c838a9fSAndrew Rybchenko 		panic("%s", #_exp);					\
1180e948693eSPhilip Paeps 	} while (0)
1181e948693eSPhilip Paeps 
1182e948693eSPhilip Paeps #define	EFSYS_ASSERT3(_x, _op, _y, _t) do {				\
1183e948693eSPhilip Paeps 	const _t __x = (_t)(_x);					\
1184e948693eSPhilip Paeps 	const _t __y = (_t)(_y);					\
1185e948693eSPhilip Paeps 	if (!(__x _op __y))						\
1186e948693eSPhilip Paeps 		panic("assertion failed at %s:%u", __FILE__, __LINE__);	\
1187e948693eSPhilip Paeps 	} while(0)
1188e948693eSPhilip Paeps 
1189e948693eSPhilip Paeps #define	EFSYS_ASSERT3U(_x, _op, _y)	EFSYS_ASSERT3(_x, _op, _y, uint64_t)
1190e948693eSPhilip Paeps #define	EFSYS_ASSERT3S(_x, _op, _y)	EFSYS_ASSERT3(_x, _op, _y, int64_t)
1191e948693eSPhilip Paeps #define	EFSYS_ASSERT3P(_x, _op, _y)	EFSYS_ASSERT3(_x, _op, _y, uintptr_t)
1192e948693eSPhilip Paeps 
11933c838a9fSAndrew Rybchenko /* ROTATE */
11943c838a9fSAndrew Rybchenko 
11953c838a9fSAndrew Rybchenko #define	EFSYS_HAS_ROTL_DWORD 0
11963c838a9fSAndrew Rybchenko 
1197e948693eSPhilip Paeps #ifdef	__cplusplus
1198e948693eSPhilip Paeps }
1199e948693eSPhilip Paeps #endif
1200e948693eSPhilip Paeps 
1201e948693eSPhilip Paeps #endif	/* _SYS_EFSYS_H */
1202