xref: /freebsd/sys/dev/sfxge/common/efsys.h (revision a79731b9453320af6fcf5ec16fa5de900dadbce8)
1e948693eSPhilip Paeps /*-
2718cf2ccSPedro F. Giffuni  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3718cf2ccSPedro F. Giffuni  *
4929c7febSAndrew Rybchenko  * Copyright (c) 2010-2016 Solarflare Communications Inc.
5e948693eSPhilip Paeps  * All rights reserved.
6e948693eSPhilip Paeps  *
7e948693eSPhilip Paeps  * This software was developed in part by Philip Paeps under contract for
8e948693eSPhilip Paeps  * Solarflare Communications, Inc.
9e948693eSPhilip Paeps  *
10e948693eSPhilip Paeps  * Redistribution and use in source and binary forms, with or without
113c838a9fSAndrew Rybchenko  * modification, are permitted provided that the following conditions are met:
12e948693eSPhilip Paeps  *
133c838a9fSAndrew Rybchenko  * 1. Redistributions of source code must retain the above copyright notice,
143c838a9fSAndrew Rybchenko  *    this list of conditions and the following disclaimer.
153c838a9fSAndrew Rybchenko  * 2. Redistributions in binary form must reproduce the above copyright notice,
163c838a9fSAndrew Rybchenko  *    this list of conditions and the following disclaimer in the documentation
173c838a9fSAndrew Rybchenko  *    and/or other materials provided with the distribution.
183c838a9fSAndrew Rybchenko  *
193c838a9fSAndrew Rybchenko  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
203c838a9fSAndrew Rybchenko  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
213c838a9fSAndrew Rybchenko  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
223c838a9fSAndrew Rybchenko  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
233c838a9fSAndrew Rybchenko  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
243c838a9fSAndrew Rybchenko  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
253c838a9fSAndrew Rybchenko  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
263c838a9fSAndrew Rybchenko  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
273c838a9fSAndrew Rybchenko  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
283c838a9fSAndrew Rybchenko  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
293c838a9fSAndrew Rybchenko  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
303c838a9fSAndrew Rybchenko  *
313c838a9fSAndrew Rybchenko  * The views and conclusions contained in the software and documentation are
323c838a9fSAndrew Rybchenko  * those of the authors and should not be interpreted as representing official
333c838a9fSAndrew Rybchenko  * policies, either expressed or implied, of the FreeBSD Project.
345dee87d7SPhilip Paeps  *
355dee87d7SPhilip Paeps  * $FreeBSD$
36e948693eSPhilip Paeps  */
37e948693eSPhilip Paeps 
38e948693eSPhilip Paeps #ifndef	_SYS_EFSYS_H
39e948693eSPhilip Paeps #define	_SYS_EFSYS_H
40e948693eSPhilip Paeps 
41e948693eSPhilip Paeps #ifdef	__cplusplus
42e948693eSPhilip Paeps extern "C" {
43e948693eSPhilip Paeps #endif
44e948693eSPhilip Paeps 
45e948693eSPhilip Paeps #include <sys/param.h>
46e948693eSPhilip Paeps #include <sys/bus.h>
47e948693eSPhilip Paeps #include <sys/endian.h>
48e948693eSPhilip Paeps #include <sys/lock.h>
49e948693eSPhilip Paeps #include <sys/malloc.h>
50e948693eSPhilip Paeps #include <sys/mbuf.h>
51e948693eSPhilip Paeps #include <sys/mutex.h>
52e948693eSPhilip Paeps #include <sys/rwlock.h>
53e948693eSPhilip Paeps #include <sys/sdt.h>
54e948693eSPhilip Paeps #include <sys/systm.h>
55e948693eSPhilip Paeps 
56e948693eSPhilip Paeps #include <machine/bus.h>
57e948693eSPhilip Paeps #include <machine/endian.h>
58e948693eSPhilip Paeps 
59e948693eSPhilip Paeps #define	EFSYS_HAS_UINT64 1
600f999687SAndrew Rybchenko #if defined(__x86_64__)
610f999687SAndrew Rybchenko #define	EFSYS_USE_UINT64 1
620f999687SAndrew Rybchenko #else
63e948693eSPhilip Paeps #define	EFSYS_USE_UINT64 0
640f999687SAndrew Rybchenko #endif
653c838a9fSAndrew Rybchenko #define	EFSYS_HAS_SSE2_M128 0
66e948693eSPhilip Paeps #if _BYTE_ORDER == _BIG_ENDIAN
67e948693eSPhilip Paeps #define	EFSYS_IS_BIG_ENDIAN 1
68e948693eSPhilip Paeps #define	EFSYS_IS_LITTLE_ENDIAN 0
69e948693eSPhilip Paeps #elif _BYTE_ORDER == _LITTLE_ENDIAN
70e948693eSPhilip Paeps #define	EFSYS_IS_BIG_ENDIAN 0
71e948693eSPhilip Paeps #define	EFSYS_IS_LITTLE_ENDIAN 1
72e948693eSPhilip Paeps #endif
73e948693eSPhilip Paeps #include "efx_types.h"
74e948693eSPhilip Paeps 
75e948693eSPhilip Paeps #ifndef B_FALSE
76e948693eSPhilip Paeps #define	B_FALSE	FALSE
77e948693eSPhilip Paeps #endif
78e948693eSPhilip Paeps #ifndef B_TRUE
79e948693eSPhilip Paeps #define	B_TRUE	TRUE
80e948693eSPhilip Paeps #endif
81e948693eSPhilip Paeps 
82e948693eSPhilip Paeps #ifndef IS2P
83e948693eSPhilip Paeps #define	ISP2(x)			(((x) & ((x) - 1)) == 0)
84e948693eSPhilip Paeps #endif
85e948693eSPhilip Paeps 
86adc1d71cSWarner Losh #if defined(__x86_64__)
875dadbb64SAndrew Rybchenko 
885dadbb64SAndrew Rybchenko #define	SFXGE_USE_BUS_SPACE_8		1
895dadbb64SAndrew Rybchenko 
90d9ff48abSAndrew Rybchenko #if !defined(bus_space_read_stream_8)
915dadbb64SAndrew Rybchenko 
92d9ff48abSAndrew Rybchenko #define	bus_space_read_stream_8(t, h, o)				\
93d9ff48abSAndrew Rybchenko 	bus_space_read_8((t), (h), (o))
945dadbb64SAndrew Rybchenko 
95d9ff48abSAndrew Rybchenko #define	bus_space_write_stream_8(t, h, o, v)				\
96d9ff48abSAndrew Rybchenko 	bus_space_write_8((t), (h), (o), (v))
975dadbb64SAndrew Rybchenko 
98d9ff48abSAndrew Rybchenko #endif
995dadbb64SAndrew Rybchenko 
100d9ff48abSAndrew Rybchenko #endif
101d9ff48abSAndrew Rybchenko 
102e948693eSPhilip Paeps #define	ENOTACTIVE EINVAL
103e948693eSPhilip Paeps 
104e948693eSPhilip Paeps /* Memory type to use on FreeBSD */
105e948693eSPhilip Paeps MALLOC_DECLARE(M_SFXGE);
106e948693eSPhilip Paeps 
107e948693eSPhilip Paeps /* Machine dependend prefetch wrappers */
108dc1788e8SMarius Strobl #if defined(__i386__) || defined(__amd64__)
109e948693eSPhilip Paeps static __inline void
110e948693eSPhilip Paeps prefetch_read_many(void *addr)
111e948693eSPhilip Paeps {
112dc1788e8SMarius Strobl 
113e948693eSPhilip Paeps 	__asm__(
114e948693eSPhilip Paeps 	    "prefetcht0 (%0)"
115e948693eSPhilip Paeps 	    :
116e948693eSPhilip Paeps 	    : "r" (addr));
117e948693eSPhilip Paeps }
118e948693eSPhilip Paeps 
119e948693eSPhilip Paeps static __inline void
120e948693eSPhilip Paeps prefetch_read_once(void *addr)
121e948693eSPhilip Paeps {
122dc1788e8SMarius Strobl 
123e948693eSPhilip Paeps 	__asm__(
124e948693eSPhilip Paeps 	    "prefetchnta (%0)"
125e948693eSPhilip Paeps 	    :
126e948693eSPhilip Paeps 	    : "r" (addr));
127e948693eSPhilip Paeps }
128dc1788e8SMarius Strobl #else
129dc1788e8SMarius Strobl static __inline void
130dc1788e8SMarius Strobl prefetch_read_many(void *addr)
131dc1788e8SMarius Strobl {
132dc1788e8SMarius Strobl 
133dc1788e8SMarius Strobl }
134dc1788e8SMarius Strobl 
135dc1788e8SMarius Strobl static __inline void
136dc1788e8SMarius Strobl prefetch_read_once(void *addr)
137dc1788e8SMarius Strobl {
138dc1788e8SMarius Strobl 
139dc1788e8SMarius Strobl }
140e948693eSPhilip Paeps #endif
141e948693eSPhilip Paeps 
142e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__)
143e948693eSPhilip Paeps #include <vm/vm.h>
144e948693eSPhilip Paeps #include <vm/pmap.h>
145e948693eSPhilip Paeps #endif
146e948693eSPhilip Paeps static __inline void
147e948693eSPhilip Paeps sfxge_map_mbuf_fast(bus_dma_tag_t tag, bus_dmamap_t map,
148e948693eSPhilip Paeps 		    struct mbuf *m, bus_dma_segment_t *seg)
149e948693eSPhilip Paeps {
150e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__)
151e948693eSPhilip Paeps 	seg->ds_addr = pmap_kextract(mtod(m, vm_offset_t));
152e948693eSPhilip Paeps 	seg->ds_len = m->m_len;
153e948693eSPhilip Paeps #else
154e948693eSPhilip Paeps 	int nsegstmp;
155e948693eSPhilip Paeps 
156e948693eSPhilip Paeps 	bus_dmamap_load_mbuf_sg(tag, map, m, seg, &nsegstmp, 0);
157e948693eSPhilip Paeps #endif
158e948693eSPhilip Paeps }
159e948693eSPhilip Paeps 
160e948693eSPhilip Paeps /* Code inclusion options */
161e948693eSPhilip Paeps 
162e948693eSPhilip Paeps #define	EFSYS_OPT_NAMES 1
163e948693eSPhilip Paeps 
164e948693eSPhilip Paeps #define	EFSYS_OPT_SIENA 1
1653c838a9fSAndrew Rybchenko #define	EFSYS_OPT_HUNTINGTON 1
166131bc376SAndrew Rybchenko #define	EFSYS_OPT_MEDFORD 1
167c6831b0bSAndrew Rybchenko #define	EFSYS_OPT_MEDFORD2 1
168e948693eSPhilip Paeps #ifdef DEBUG
169e948693eSPhilip Paeps #define	EFSYS_OPT_CHECK_REG 1
170e948693eSPhilip Paeps #else
171e948693eSPhilip Paeps #define	EFSYS_OPT_CHECK_REG 0
172e948693eSPhilip Paeps #endif
173e948693eSPhilip Paeps 
174e948693eSPhilip Paeps #define	EFSYS_OPT_MCDI 1
175870b1186SAndrew Rybchenko #define	EFSYS_OPT_MCDI_LOGGING 0
1763edad197SAndrew Rybchenko #define	EFSYS_OPT_MCDI_PROXY_AUTH 0
177e948693eSPhilip Paeps 
178e948693eSPhilip Paeps #define	EFSYS_OPT_MAC_STATS 1
179e948693eSPhilip Paeps 
180e948693eSPhilip Paeps #define	EFSYS_OPT_LOOPBACK 0
181e948693eSPhilip Paeps 
1823c838a9fSAndrew Rybchenko #define	EFSYS_OPT_MON_MCDI 0
183e948693eSPhilip Paeps #define	EFSYS_OPT_MON_STATS 0
184e948693eSPhilip Paeps 
185e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_STATS 1
1863c838a9fSAndrew Rybchenko #define	EFSYS_OPT_BIST 1
187e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_LED_CONTROL 1
188e948693eSPhilip Paeps #define	EFSYS_OPT_PHY_FLAGS 0
189e948693eSPhilip Paeps 
190e948693eSPhilip Paeps #define	EFSYS_OPT_VPD 1
191e948693eSPhilip Paeps #define	EFSYS_OPT_NVRAM 1
192e948693eSPhilip Paeps #define	EFSYS_OPT_BOOTCFG 0
193391763d7SAndrew Rybchenko #define	EFSYS_OPT_IMAGE_LAYOUT 0
194e948693eSPhilip Paeps 
195e948693eSPhilip Paeps #define	EFSYS_OPT_DIAG 0
196e948693eSPhilip Paeps #define	EFSYS_OPT_RX_SCALE 1
197e948693eSPhilip Paeps #define	EFSYS_OPT_QSTATS 1
1983c838a9fSAndrew Rybchenko #define	EFSYS_OPT_FILTER 1
199e948693eSPhilip Paeps #define	EFSYS_OPT_RX_SCATTER 0
200e948693eSPhilip Paeps 
201e948693eSPhilip Paeps #define	EFSYS_OPT_EV_PREFETCH 0
202e948693eSPhilip Paeps 
203e948693eSPhilip Paeps #define	EFSYS_OPT_DECODE_INTR_FATAL 1
204e948693eSPhilip Paeps 
2050c848230SAndrew Rybchenko #define	EFSYS_OPT_LICENSING 0
2060c848230SAndrew Rybchenko 
207ecaa500cSAndrew Rybchenko #define	EFSYS_OPT_ALLOW_UNCONFIGURED_NIC 0
208ecaa500cSAndrew Rybchenko 
2098e0c4827SAndrew Rybchenko #define	EFSYS_OPT_RX_PACKED_STREAM 0
2108e0c4827SAndrew Rybchenko 
21104381b5eSAndrew Rybchenko #define	EFSYS_OPT_RX_ES_SUPER_BUFFER 0
21204381b5eSAndrew Rybchenko 
213fdbe38cfSAndrew Rybchenko #define	EFSYS_OPT_TUNNEL 0
214fdbe38cfSAndrew Rybchenko 
215e0b3c2ccSAndrew Rybchenko #define	EFSYS_OPT_FW_SUBVARIANT_AWARE 0
216e0b3c2ccSAndrew Rybchenko 
217e948693eSPhilip Paeps /* ID */
218e948693eSPhilip Paeps 
219e948693eSPhilip Paeps typedef struct __efsys_identifier_s	efsys_identifier_t;
220e948693eSPhilip Paeps 
221e948693eSPhilip Paeps /* PROBE */
222e948693eSPhilip Paeps 
22354366c0bSAttilio Rao #ifndef DTRACE_PROBE
224e948693eSPhilip Paeps 
225e948693eSPhilip Paeps #define	EFSYS_PROBE(_name)
226e948693eSPhilip Paeps 
227e948693eSPhilip Paeps #define	EFSYS_PROBE1(_name, _type1, _arg1)
228e948693eSPhilip Paeps 
229e948693eSPhilip Paeps #define	EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2)
230e948693eSPhilip Paeps 
231e948693eSPhilip Paeps #define	EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2,		\
232e948693eSPhilip Paeps 	    _type3, _arg3)
233e948693eSPhilip Paeps 
234e948693eSPhilip Paeps #define	EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2,		\
235e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4)
236e948693eSPhilip Paeps 
237e948693eSPhilip Paeps #define	EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
238e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)
239e948693eSPhilip Paeps 
240e948693eSPhilip Paeps #define	EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
241e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
242e948693eSPhilip Paeps 	    _type6, _arg6)
243e948693eSPhilip Paeps 
244e948693eSPhilip Paeps #define	EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2,		\
245e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
246e948693eSPhilip Paeps 	    _type6, _arg6, _type7, _arg7)
247e948693eSPhilip Paeps 
24854366c0bSAttilio Rao #else /* DTRACE_PROBE */
249e948693eSPhilip Paeps 
250e948693eSPhilip Paeps #define	EFSYS_PROBE(_name)						\
251e948693eSPhilip Paeps 	DTRACE_PROBE(_name)
252e948693eSPhilip Paeps 
253e948693eSPhilip Paeps #define	EFSYS_PROBE1(_name, _type1, _arg1)				\
254e948693eSPhilip Paeps 	DTRACE_PROBE1(_name, _type1, _arg1)
255e948693eSPhilip Paeps 
256e948693eSPhilip Paeps #define	EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2)		\
257e948693eSPhilip Paeps 	DTRACE_PROBE2(_name, _type1, _arg1, _type2, _arg2)
258e948693eSPhilip Paeps 
259e948693eSPhilip Paeps #define	EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2,		\
260e948693eSPhilip Paeps 	    _type3, _arg3)						\
261e948693eSPhilip Paeps 	DTRACE_PROBE3(_name, _type1, _arg1, _type2, _arg2,		\
262e948693eSPhilip Paeps 	    _type3, _arg3)
263e948693eSPhilip Paeps 
264e948693eSPhilip Paeps #define	EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2,		\
265e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4)				\
266e948693eSPhilip Paeps 	DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2,		\
267e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4)
268e948693eSPhilip Paeps 
269e948693eSPhilip Paeps #ifdef DTRACE_PROBE5
270e948693eSPhilip Paeps #define	EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
271e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)		\
272e948693eSPhilip Paeps 	DTRACE_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
273e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)
274e948693eSPhilip Paeps #else
275e948693eSPhilip Paeps #define	EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
276e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)		\
277e948693eSPhilip Paeps 	DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2,		\
278e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4)
279e948693eSPhilip Paeps #endif
280e948693eSPhilip Paeps 
281e948693eSPhilip Paeps #ifdef DTRACE_PROBE6
282e948693eSPhilip Paeps #define	EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
283e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
284e948693eSPhilip Paeps 	    _type6, _arg6)						\
285e948693eSPhilip Paeps 	DTRACE_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
286e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
287e948693eSPhilip Paeps 	    _type6, _arg6)
288e948693eSPhilip Paeps #else
289e948693eSPhilip Paeps #define	EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
290e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
291e948693eSPhilip Paeps 	    _type6, _arg6)						\
292e948693eSPhilip Paeps 	EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2,		\
293e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5)
294e948693eSPhilip Paeps #endif
295e948693eSPhilip Paeps 
296e948693eSPhilip Paeps #ifdef DTRACE_PROBE7
297e948693eSPhilip Paeps #define	EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2,		\
298e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
299e948693eSPhilip Paeps 	    _type6, _arg6, _type7, _arg7)				\
300e948693eSPhilip Paeps 	DTRACE_PROBE7(_name, _type1, _arg1, _type2, _arg2,		\
301e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
302e948693eSPhilip Paeps 	    _type6, _arg6, _type7, _arg7)
303e948693eSPhilip Paeps #else
304e948693eSPhilip Paeps #define	EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2,		\
305e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
306e948693eSPhilip Paeps 	    _type6, _arg6, _type7, _arg7)				\
307e948693eSPhilip Paeps 	EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2,		\
308e948693eSPhilip Paeps 	    _type3, _arg3, _type4, _arg4, _type5, _arg5,		\
309e948693eSPhilip Paeps 	    _type6, _arg6)
310e948693eSPhilip Paeps #endif
311e948693eSPhilip Paeps 
31254366c0bSAttilio Rao #endif /* DTRACE_PROBE */
313e948693eSPhilip Paeps 
314e948693eSPhilip Paeps /* DMA */
315e948693eSPhilip Paeps 
316e948693eSPhilip Paeps typedef uint64_t		efsys_dma_addr_t;
317e948693eSPhilip Paeps 
318e948693eSPhilip Paeps typedef struct efsys_mem_s {
319e948693eSPhilip Paeps 	bus_dma_tag_t		esm_tag;
320e948693eSPhilip Paeps 	bus_dmamap_t		esm_map;
321e948693eSPhilip Paeps 	caddr_t			esm_base;
322e948693eSPhilip Paeps 	efsys_dma_addr_t	esm_addr;
3234aaefb95SAndrew Rybchenko 	size_t			esm_size;
324e948693eSPhilip Paeps } efsys_mem_t;
325e948693eSPhilip Paeps 
3264aaefb95SAndrew Rybchenko #define	EFSYS_MEM_SIZE(_esmp)						\
3274aaefb95SAndrew Rybchenko 	((_esmp)->esm_size)
3284aaefb95SAndrew Rybchenko 
3294aaefb95SAndrew Rybchenko #define	EFSYS_MEM_ADDR(_esmp)						\
3304aaefb95SAndrew Rybchenko 	((_esmp)->esm_addr)
3314aaefb95SAndrew Rybchenko 
3324aaefb95SAndrew Rybchenko #define	EFSYS_MEM_IS_NULL(_esmp)					\
3334aaefb95SAndrew Rybchenko 	((_esmp)->esm_base == NULL)
3344aaefb95SAndrew Rybchenko 
335e948693eSPhilip Paeps #define	EFSYS_MEM_ZERO(_esmp, _size)					\
336e948693eSPhilip Paeps 	do {								\
337e948693eSPhilip Paeps 		(void) memset((_esmp)->esm_base, 0, (_size));		\
338e948693eSPhilip Paeps 									\
339e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
340e948693eSPhilip Paeps 	} while (B_FALSE)
341e948693eSPhilip Paeps 
342e948693eSPhilip Paeps #define	EFSYS_MEM_READD(_esmp, _offset, _edp)				\
343e948693eSPhilip Paeps 	do {								\
344e948693eSPhilip Paeps 		uint32_t *addr;						\
345e948693eSPhilip Paeps 									\
346e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
3477daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
3487daf1fedSAndrew Rybchenko 		    sizeof (efx_dword_t)),				\
349e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
350e948693eSPhilip Paeps 									\
351e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
352e948693eSPhilip Paeps 									\
353e948693eSPhilip Paeps 		(_edp)->ed_u32[0] = *addr;				\
354e948693eSPhilip Paeps 									\
355e948693eSPhilip Paeps 		EFSYS_PROBE2(mem_readd, unsigned int, (_offset),	\
356e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
357e948693eSPhilip Paeps 									\
358e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
359e948693eSPhilip Paeps 	} while (B_FALSE)
360e948693eSPhilip Paeps 
3610f999687SAndrew Rybchenko #if defined(__x86_64__)
3620f999687SAndrew Rybchenko #define	EFSYS_MEM_READQ(_esmp, _offset, _eqp)				\
3630f999687SAndrew Rybchenko 	do {								\
3640f999687SAndrew Rybchenko 		uint64_t *addr;						\
3650f999687SAndrew Rybchenko 									\
3660f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
3677daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
3687daf1fedSAndrew Rybchenko 		    sizeof (efx_qword_t)),				\
3690f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
3700f999687SAndrew Rybchenko 									\
3710f999687SAndrew Rybchenko 		addr = (void *)((_esmp)->esm_base + (_offset));		\
3720f999687SAndrew Rybchenko 									\
3730f999687SAndrew Rybchenko 		(_eqp)->eq_u64[0] = *addr;				\
3740f999687SAndrew Rybchenko 									\
3750f999687SAndrew Rybchenko 		EFSYS_PROBE3(mem_readq, unsigned int, (_offset),	\
3760f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[1],			\
3770f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[0]);			\
3780f999687SAndrew Rybchenko 									\
3790f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
3800f999687SAndrew Rybchenko 	} while (B_FALSE)
3810f999687SAndrew Rybchenko #else
382e948693eSPhilip Paeps #define	EFSYS_MEM_READQ(_esmp, _offset, _eqp)				\
383e948693eSPhilip Paeps 	do {								\
384e948693eSPhilip Paeps 		uint32_t *addr;						\
385e948693eSPhilip Paeps 									\
386e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
3877daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
3887daf1fedSAndrew Rybchenko 		    sizeof (efx_qword_t)),				\
389e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
390e948693eSPhilip Paeps 									\
391e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
392e948693eSPhilip Paeps 									\
393e948693eSPhilip Paeps 		(_eqp)->eq_u32[0] = *addr++;				\
394e948693eSPhilip Paeps 		(_eqp)->eq_u32[1] = *addr;				\
395e948693eSPhilip Paeps 									\
396e948693eSPhilip Paeps 		EFSYS_PROBE3(mem_readq, unsigned int, (_offset),	\
397e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
398e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
399e948693eSPhilip Paeps 									\
400e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
401e948693eSPhilip Paeps 	} while (B_FALSE)
4020f999687SAndrew Rybchenko #endif
403e948693eSPhilip Paeps 
4040f999687SAndrew Rybchenko #if defined(__x86_64__)
4050f999687SAndrew Rybchenko #define	EFSYS_MEM_READO(_esmp, _offset, _eop)				\
4060f999687SAndrew Rybchenko 	do {								\
4070f999687SAndrew Rybchenko 		uint64_t *addr;						\
4080f999687SAndrew Rybchenko 									\
4090f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
4107daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
4117daf1fedSAndrew Rybchenko 		    sizeof (efx_oword_t)),				\
4120f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
4130f999687SAndrew Rybchenko 									\
4140f999687SAndrew Rybchenko 		addr = (void *)((_esmp)->esm_base + (_offset));		\
4150f999687SAndrew Rybchenko 									\
4160f999687SAndrew Rybchenko 		(_eop)->eo_u64[0] = *addr++;				\
4170f999687SAndrew Rybchenko 		(_eop)->eo_u64[1] = *addr;				\
4180f999687SAndrew Rybchenko 									\
4190f999687SAndrew Rybchenko 		EFSYS_PROBE5(mem_reado, unsigned int, (_offset),	\
4200f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[3],			\
4210f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[2],			\
4220f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[1],			\
4230f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[0]);			\
4240f999687SAndrew Rybchenko 									\
4250f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
4260f999687SAndrew Rybchenko 	} while (B_FALSE)
4270f999687SAndrew Rybchenko #else
428e948693eSPhilip Paeps #define	EFSYS_MEM_READO(_esmp, _offset, _eop)				\
429e948693eSPhilip Paeps 	do {								\
430e948693eSPhilip Paeps 		uint32_t *addr;						\
431e948693eSPhilip Paeps 									\
432e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
4337daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
4347daf1fedSAndrew Rybchenko 		    sizeof (efx_oword_t)),				\
435e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
436e948693eSPhilip Paeps 									\
437e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
438e948693eSPhilip Paeps 									\
439e948693eSPhilip Paeps 		(_eop)->eo_u32[0] = *addr++;				\
440e948693eSPhilip Paeps 		(_eop)->eo_u32[1] = *addr++;				\
441e948693eSPhilip Paeps 		(_eop)->eo_u32[2] = *addr++;				\
442e948693eSPhilip Paeps 		(_eop)->eo_u32[3] = *addr;				\
443e948693eSPhilip Paeps 									\
444e948693eSPhilip Paeps 		EFSYS_PROBE5(mem_reado, unsigned int, (_offset),	\
445e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
446e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
447e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
448e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
449e948693eSPhilip Paeps 									\
450e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
451e948693eSPhilip Paeps 	} while (B_FALSE)
4520f999687SAndrew Rybchenko #endif
453e948693eSPhilip Paeps 
454e948693eSPhilip Paeps #define	EFSYS_MEM_WRITED(_esmp, _offset, _edp)				\
455e948693eSPhilip Paeps 	do {								\
456e948693eSPhilip Paeps 		uint32_t *addr;						\
457e948693eSPhilip Paeps 									\
458e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
4597daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
4607daf1fedSAndrew Rybchenko 		    sizeof (efx_dword_t)),				\
461e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
462e948693eSPhilip Paeps 									\
463e948693eSPhilip Paeps 		EFSYS_PROBE2(mem_writed, unsigned int, (_offset),	\
464e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
465e948693eSPhilip Paeps 									\
466e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
467e948693eSPhilip Paeps 									\
468e948693eSPhilip Paeps 		*addr = (_edp)->ed_u32[0];				\
469e948693eSPhilip Paeps 									\
470e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
471e948693eSPhilip Paeps 	} while (B_FALSE)
472e948693eSPhilip Paeps 
4730f999687SAndrew Rybchenko #if defined(__x86_64__)
4740f999687SAndrew Rybchenko #define	EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp)				\
4750f999687SAndrew Rybchenko 	do {								\
4760f999687SAndrew Rybchenko 		uint64_t *addr;						\
4770f999687SAndrew Rybchenko 									\
4780f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
4797daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
4807daf1fedSAndrew Rybchenko 		    sizeof (efx_qword_t)),				\
4810f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
4820f999687SAndrew Rybchenko 									\
4830f999687SAndrew Rybchenko 		EFSYS_PROBE3(mem_writeq, unsigned int, (_offset),	\
4840f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[1],			\
4850f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[0]);			\
4860f999687SAndrew Rybchenko 									\
4870f999687SAndrew Rybchenko 		addr = (void *)((_esmp)->esm_base + (_offset));		\
4880f999687SAndrew Rybchenko 									\
4890f999687SAndrew Rybchenko 		*addr   = (_eqp)->eq_u64[0];				\
4900f999687SAndrew Rybchenko 									\
4910f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
4920f999687SAndrew Rybchenko 	} while (B_FALSE)
4930f999687SAndrew Rybchenko 
4940f999687SAndrew Rybchenko #else
495e948693eSPhilip Paeps #define	EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp)				\
496e948693eSPhilip Paeps 	do {								\
497e948693eSPhilip Paeps 		uint32_t *addr;						\
498e948693eSPhilip Paeps 									\
499e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
5007daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
5017daf1fedSAndrew Rybchenko 		    sizeof (efx_qword_t)),				\
502e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
503e948693eSPhilip Paeps 									\
504e948693eSPhilip Paeps 		EFSYS_PROBE3(mem_writeq, unsigned int, (_offset),	\
505e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
506e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
507e948693eSPhilip Paeps 									\
508e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
509e948693eSPhilip Paeps 									\
510e948693eSPhilip Paeps 		*addr++ = (_eqp)->eq_u32[0];				\
511e948693eSPhilip Paeps 		*addr   = (_eqp)->eq_u32[1];				\
512e948693eSPhilip Paeps 									\
513e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
514e948693eSPhilip Paeps 	} while (B_FALSE)
5150f999687SAndrew Rybchenko #endif
516e948693eSPhilip Paeps 
5170f999687SAndrew Rybchenko #if defined(__x86_64__)
5180f999687SAndrew Rybchenko #define	EFSYS_MEM_WRITEO(_esmp, _offset, _eop)				\
5190f999687SAndrew Rybchenko 	do {								\
5200f999687SAndrew Rybchenko 		uint64_t *addr;						\
5210f999687SAndrew Rybchenko 									\
5220f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
5237daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
5247daf1fedSAndrew Rybchenko 		    sizeof (efx_oword_t)),				\
5250f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
5260f999687SAndrew Rybchenko 									\
5270f999687SAndrew Rybchenko 		EFSYS_PROBE5(mem_writeo, unsigned int, (_offset),	\
5280f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[3],			\
5290f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[2],			\
5300f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[1],			\
5310f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[0]);			\
5320f999687SAndrew Rybchenko 									\
5330f999687SAndrew Rybchenko 		addr = (void *)((_esmp)->esm_base + (_offset));		\
5340f999687SAndrew Rybchenko 									\
5350f999687SAndrew Rybchenko 		*addr++ = (_eop)->eo_u64[0];				\
5360f999687SAndrew Rybchenko 		*addr   = (_eop)->eo_u64[1];				\
5370f999687SAndrew Rybchenko 									\
5380f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
5390f999687SAndrew Rybchenko 	} while (B_FALSE)
5400f999687SAndrew Rybchenko #else
541e948693eSPhilip Paeps #define	EFSYS_MEM_WRITEO(_esmp, _offset, _eop)				\
542e948693eSPhilip Paeps 	do {								\
543e948693eSPhilip Paeps 		uint32_t *addr;						\
544e948693eSPhilip Paeps 									\
545e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
5467daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
5477daf1fedSAndrew Rybchenko 		    sizeof (efx_oword_t)),				\
548e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
549e948693eSPhilip Paeps 									\
550e948693eSPhilip Paeps 		EFSYS_PROBE5(mem_writeo, unsigned int, (_offset),	\
551e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
552e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
553e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
554e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
555e948693eSPhilip Paeps 									\
556e948693eSPhilip Paeps 		addr = (void *)((_esmp)->esm_base + (_offset));		\
557e948693eSPhilip Paeps 									\
558e948693eSPhilip Paeps 		*addr++ = (_eop)->eo_u32[0];				\
559e948693eSPhilip Paeps 		*addr++ = (_eop)->eo_u32[1];				\
560e948693eSPhilip Paeps 		*addr++ = (_eop)->eo_u32[2];				\
561e948693eSPhilip Paeps 		*addr   = (_eop)->eo_u32[3];				\
562e948693eSPhilip Paeps 									\
563e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
564e948693eSPhilip Paeps 	} while (B_FALSE)
5650f999687SAndrew Rybchenko #endif
566e948693eSPhilip Paeps 
567e948693eSPhilip Paeps /* BAR */
568e948693eSPhilip Paeps 
56933d45dc5SAndrew Rybchenko #define	SFXGE_LOCK_NAME_MAX	16
57033d45dc5SAndrew Rybchenko 
571e948693eSPhilip Paeps typedef struct efsys_bar_s {
572e948693eSPhilip Paeps 	struct mtx		esb_lock;
57333d45dc5SAndrew Rybchenko 	char			esb_lock_name[SFXGE_LOCK_NAME_MAX];
574e948693eSPhilip Paeps 	bus_space_tag_t		esb_tag;
575e948693eSPhilip Paeps 	bus_space_handle_t	esb_handle;
576e948693eSPhilip Paeps 	int			esb_rid;
577e948693eSPhilip Paeps 	struct resource		*esb_res;
578e948693eSPhilip Paeps } efsys_bar_t;
579e948693eSPhilip Paeps 
58033d45dc5SAndrew Rybchenko #define	SFXGE_BAR_LOCK_INIT(_esbp, _ifname)				\
58133d45dc5SAndrew Rybchenko 	do {								\
58233d45dc5SAndrew Rybchenko 		snprintf((_esbp)->esb_lock_name,			\
58333d45dc5SAndrew Rybchenko 			 sizeof((_esbp)->esb_lock_name),		\
58433d45dc5SAndrew Rybchenko 			 "%s:bar", (_ifname));				\
58533d45dc5SAndrew Rybchenko 		mtx_init(&(_esbp)->esb_lock, (_esbp)->esb_lock_name,	\
58633d45dc5SAndrew Rybchenko 			 NULL, MTX_DEF);				\
58733d45dc5SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
58833d45dc5SAndrew Rybchenko 	} while (B_FALSE)
589763cab71SAndrew Rybchenko #define	SFXGE_BAR_LOCK_DESTROY(_esbp)					\
590763cab71SAndrew Rybchenko 	mtx_destroy(&(_esbp)->esb_lock)
591763cab71SAndrew Rybchenko #define	SFXGE_BAR_LOCK(_esbp)						\
592763cab71SAndrew Rybchenko 	mtx_lock(&(_esbp)->esb_lock)
593763cab71SAndrew Rybchenko #define	SFXGE_BAR_UNLOCK(_esbp)						\
594763cab71SAndrew Rybchenko 	mtx_unlock(&(_esbp)->esb_lock)
595763cab71SAndrew Rybchenko 
596e948693eSPhilip Paeps #define	EFSYS_BAR_READD(_esbp, _offset, _edp, _lock)			\
597e948693eSPhilip Paeps 	do {								\
598e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
5997daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
6007daf1fedSAndrew Rybchenko 		    sizeof (efx_dword_t)),				\
601e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
602e948693eSPhilip Paeps 									\
603e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
604e948693eSPhilip Paeps 		if (_lock)						\
605763cab71SAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
606e948693eSPhilip Paeps 									\
607d9ff48abSAndrew Rybchenko 		(_edp)->ed_u32[0] = bus_space_read_stream_4(		\
608d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
609d9ff48abSAndrew Rybchenko 		    (_offset));						\
610e948693eSPhilip Paeps 									\
611e948693eSPhilip Paeps 		EFSYS_PROBE2(bar_readd, unsigned int, (_offset),	\
612e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
613e948693eSPhilip Paeps 									\
614e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
615e948693eSPhilip Paeps 		if (_lock)						\
616763cab71SAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
617e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
618e948693eSPhilip Paeps 	} while (B_FALSE)
619e948693eSPhilip Paeps 
6205dadbb64SAndrew Rybchenko #if defined(SFXGE_USE_BUS_SPACE_8)
621e948693eSPhilip Paeps #define	EFSYS_BAR_READQ(_esbp, _offset, _eqp)				\
622e948693eSPhilip Paeps 	do {								\
623e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
6247daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
6257daf1fedSAndrew Rybchenko 		    sizeof (efx_qword_t)),				\
626e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
627e948693eSPhilip Paeps 									\
628763cab71SAndrew Rybchenko 		SFXGE_BAR_LOCK(_esbp);					\
629e948693eSPhilip Paeps 									\
630d9ff48abSAndrew Rybchenko 		(_eqp)->eq_u64[0] = bus_space_read_stream_8(		\
631d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
632d9ff48abSAndrew Rybchenko 		    (_offset));						\
6330f999687SAndrew Rybchenko 									\
6340f999687SAndrew Rybchenko 		EFSYS_PROBE3(bar_readq, unsigned int, (_offset),	\
6350f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[1],			\
6360f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[0]);			\
6370f999687SAndrew Rybchenko 									\
638687adefaSAndrew Rybchenko 		SFXGE_BAR_UNLOCK(_esbp);				\
6390f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
6400f999687SAndrew Rybchenko 	} while (B_FALSE)
6410f999687SAndrew Rybchenko 
6420f999687SAndrew Rybchenko #define	EFSYS_BAR_READO(_esbp, _offset, _eop, _lock)			\
6430f999687SAndrew Rybchenko 	do {								\
6440f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
6457daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
6467daf1fedSAndrew Rybchenko 		    sizeof (efx_oword_t)),				\
6470f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
6480f999687SAndrew Rybchenko 									\
6490f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
6500f999687SAndrew Rybchenko 		if (_lock)						\
651687adefaSAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
6520f999687SAndrew Rybchenko 									\
653d9ff48abSAndrew Rybchenko 		(_eop)->eo_u64[0] = bus_space_read_stream_8(		\
654d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
655d9ff48abSAndrew Rybchenko 		    (_offset));						\
656d9ff48abSAndrew Rybchenko 		(_eop)->eo_u64[1] = bus_space_read_stream_8(		\
657d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
658d9ff48abSAndrew Rybchenko 		    (_offset) + 8);					\
6590f999687SAndrew Rybchenko 									\
6600f999687SAndrew Rybchenko 		EFSYS_PROBE5(bar_reado, unsigned int, (_offset),	\
6610f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[3],			\
6620f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[2],			\
6630f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[1],			\
6640f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[0]);			\
6650f999687SAndrew Rybchenko 									\
6660f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
6670f999687SAndrew Rybchenko 		if (_lock)						\
668687adefaSAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
6690f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
6700f999687SAndrew Rybchenko 	} while (B_FALSE)
6710f999687SAndrew Rybchenko 
6720f999687SAndrew Rybchenko #else
6730f999687SAndrew Rybchenko #define	EFSYS_BAR_READQ(_esbp, _offset, _eqp)				\
6740f999687SAndrew Rybchenko 	do {								\
6750f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
6767daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
6777daf1fedSAndrew Rybchenko 		    sizeof (efx_qword_t)),				\
6780f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
6790f999687SAndrew Rybchenko 									\
680687adefaSAndrew Rybchenko 		SFXGE_BAR_LOCK(_esbp);					\
6810f999687SAndrew Rybchenko 									\
682d9ff48abSAndrew Rybchenko 		(_eqp)->eq_u32[0] = bus_space_read_stream_4(		\
683d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
684d9ff48abSAndrew Rybchenko 		    (_offset));						\
685d9ff48abSAndrew Rybchenko 		(_eqp)->eq_u32[1] = bus_space_read_stream_4(		\
686d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
687d9ff48abSAndrew Rybchenko 		    (_offset) + 4);					\
688e948693eSPhilip Paeps 									\
689e948693eSPhilip Paeps 		EFSYS_PROBE3(bar_readq, unsigned int, (_offset),	\
690e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
691e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
692e948693eSPhilip Paeps 									\
693763cab71SAndrew Rybchenko 		SFXGE_BAR_UNLOCK(_esbp);				\
694e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
695e948693eSPhilip Paeps 	} while (B_FALSE)
696e948693eSPhilip Paeps 
697e948693eSPhilip Paeps #define	EFSYS_BAR_READO(_esbp, _offset, _eop, _lock)			\
698e948693eSPhilip Paeps 	do {								\
699e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
7007daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
7017daf1fedSAndrew Rybchenko 		    sizeof (efx_oword_t)),				\
702e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
703e948693eSPhilip Paeps 									\
704e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
705e948693eSPhilip Paeps 		if (_lock)						\
706763cab71SAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
707e948693eSPhilip Paeps 									\
708d9ff48abSAndrew Rybchenko 		(_eop)->eo_u32[0] = bus_space_read_stream_4(		\
709d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
710d9ff48abSAndrew Rybchenko 		    (_offset));						\
711d9ff48abSAndrew Rybchenko 		(_eop)->eo_u32[1] = bus_space_read_stream_4(		\
712d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
713d9ff48abSAndrew Rybchenko 		    (_offset) + 4);					\
714d9ff48abSAndrew Rybchenko 		(_eop)->eo_u32[2] = bus_space_read_stream_4(		\
715d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
716d9ff48abSAndrew Rybchenko 		    (_offset) + 8);					\
717d9ff48abSAndrew Rybchenko 		(_eop)->eo_u32[3] = bus_space_read_stream_4(		\
718d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_tag, (_esbp)->esb_handle,		\
719d9ff48abSAndrew Rybchenko 		    (_offset) + 12);					\
720e948693eSPhilip Paeps 									\
721e948693eSPhilip Paeps 		EFSYS_PROBE5(bar_reado, unsigned int, (_offset),	\
722e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
723e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
724e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
725e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
726e948693eSPhilip Paeps 									\
727e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
728e948693eSPhilip Paeps 		if (_lock)						\
729763cab71SAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
730e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
731e948693eSPhilip Paeps 	} while (B_FALSE)
7320f999687SAndrew Rybchenko #endif
733e948693eSPhilip Paeps 
734e948693eSPhilip Paeps #define	EFSYS_BAR_WRITED(_esbp, _offset, _edp, _lock)			\
735e948693eSPhilip Paeps 	do {								\
736e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
7377daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
7387daf1fedSAndrew Rybchenko 		    sizeof (efx_dword_t)),				\
739e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
740e948693eSPhilip Paeps 									\
741e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
742e948693eSPhilip Paeps 		if (_lock)						\
743763cab71SAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
744e948693eSPhilip Paeps 									\
745e948693eSPhilip Paeps 		EFSYS_PROBE2(bar_writed, unsigned int, (_offset),	\
746e948693eSPhilip Paeps 		    uint32_t, (_edp)->ed_u32[0]);			\
747e948693eSPhilip Paeps 									\
7481cc8febfSAndrew Rybchenko 		/*							\
7491cc8febfSAndrew Rybchenko 		 * Make sure that previous writes to the dword have	\
7501cc8febfSAndrew Rybchenko 		 * been done. It should be cheaper than barrier just	\
7511cc8febfSAndrew Rybchenko 		 * after the write below.				\
7521cc8febfSAndrew Rybchenko 		 */							\
7531cc8febfSAndrew Rybchenko 		bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
7541cc8febfSAndrew Rybchenko 		    (_offset), sizeof (efx_dword_t),			\
7551cc8febfSAndrew Rybchenko 		    BUS_SPACE_BARRIER_WRITE);				\
756d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
757d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
758e948693eSPhilip Paeps 		    (_offset), (_edp)->ed_u32[0]);			\
759e948693eSPhilip Paeps 									\
760e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
761e948693eSPhilip Paeps 		if (_lock)						\
762763cab71SAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
763e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
764e948693eSPhilip Paeps 	} while (B_FALSE)
765e948693eSPhilip Paeps 
7665dadbb64SAndrew Rybchenko #if defined(SFXGE_USE_BUS_SPACE_8)
767e948693eSPhilip Paeps #define	EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp)				\
768e948693eSPhilip Paeps 	do {								\
769e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
7707daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
7717daf1fedSAndrew Rybchenko 		    sizeof (efx_qword_t)),				\
772e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
773e948693eSPhilip Paeps 									\
774763cab71SAndrew Rybchenko 		SFXGE_BAR_LOCK(_esbp);					\
775e948693eSPhilip Paeps 									\
776e948693eSPhilip Paeps 		EFSYS_PROBE3(bar_writeq, unsigned int, (_offset),	\
777e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[1],			\
778e948693eSPhilip Paeps 		    uint32_t, (_eqp)->eq_u32[0]);			\
779e948693eSPhilip Paeps 									\
7801cc8febfSAndrew Rybchenko 		/*							\
7811cc8febfSAndrew Rybchenko 		 * Make sure that previous writes to the qword have	\
7821cc8febfSAndrew Rybchenko 		 * been done. It should be cheaper than barrier just	\
7831cc8febfSAndrew Rybchenko 		 * after the write below.				\
7841cc8febfSAndrew Rybchenko 		 */							\
7851cc8febfSAndrew Rybchenko 		bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
7861cc8febfSAndrew Rybchenko 		    (_offset), sizeof (efx_qword_t),			\
7871cc8febfSAndrew Rybchenko 		    BUS_SPACE_BARRIER_WRITE);				\
788d9ff48abSAndrew Rybchenko 		bus_space_write_stream_8((_esbp)->esb_tag,		\
789d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
7900f999687SAndrew Rybchenko 		    (_offset), (_eqp)->eq_u64[0]);			\
7910f999687SAndrew Rybchenko 									\
792687adefaSAndrew Rybchenko 		SFXGE_BAR_UNLOCK(_esbp);				\
7930f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
7940f999687SAndrew Rybchenko 	} while (B_FALSE)
7950f999687SAndrew Rybchenko #else
7960f999687SAndrew Rybchenko #define	EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp)				\
7970f999687SAndrew Rybchenko 	do {								\
7980f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
7997daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
8007daf1fedSAndrew Rybchenko 		    sizeof (efx_qword_t)),				\
8010f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
8020f999687SAndrew Rybchenko 									\
803687adefaSAndrew Rybchenko 		SFXGE_BAR_LOCK(_esbp);					\
8040f999687SAndrew Rybchenko 									\
8050f999687SAndrew Rybchenko 		EFSYS_PROBE3(bar_writeq, unsigned int, (_offset),	\
8060f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[1],			\
8070f999687SAndrew Rybchenko 		    uint32_t, (_eqp)->eq_u32[0]);			\
8080f999687SAndrew Rybchenko 									\
8091cc8febfSAndrew Rybchenko 		/*							\
8101cc8febfSAndrew Rybchenko 		 * Make sure that previous writes to the qword have	\
8111cc8febfSAndrew Rybchenko 		 * been done. It should be cheaper than barrier just	\
8121cc8febfSAndrew Rybchenko 		 * after the last write below.				\
8131cc8febfSAndrew Rybchenko 		 */							\
8141cc8febfSAndrew Rybchenko 		bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
8151cc8febfSAndrew Rybchenko 		    (_offset), sizeof (efx_qword_t),			\
8161cc8febfSAndrew Rybchenko 		    BUS_SPACE_BARRIER_WRITE);				\
817d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
818d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
819e948693eSPhilip Paeps 		    (_offset), (_eqp)->eq_u32[0]);			\
8201cc8febfSAndrew Rybchenko 		/*							\
8211cc8febfSAndrew Rybchenko 		 * It should be guaranteed that the last dword comes	\
8221cc8febfSAndrew Rybchenko 		 * the last, so barrier entire qword to be sure that	\
8231cc8febfSAndrew Rybchenko 		 * neither above nor below writes are reordered.	\
8241cc8febfSAndrew Rybchenko 		 */							\
8251cc8febfSAndrew Rybchenko 		bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
8261cc8febfSAndrew Rybchenko 		    (_offset), sizeof (efx_qword_t),			\
8271cc8febfSAndrew Rybchenko 		    BUS_SPACE_BARRIER_WRITE);				\
828d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
829d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
830d9ff48abSAndrew Rybchenko 		    (_offset) + 4, (_eqp)->eq_u32[1]);			\
831e948693eSPhilip Paeps 									\
832763cab71SAndrew Rybchenko 		SFXGE_BAR_UNLOCK(_esbp);				\
833e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
834e948693eSPhilip Paeps 	} while (B_FALSE)
8350f999687SAndrew Rybchenko #endif
836e948693eSPhilip Paeps 
8373c838a9fSAndrew Rybchenko /*
8383c838a9fSAndrew Rybchenko  * Guarantees 64bit aligned 64bit writes to write combined BAR mapping
8393c838a9fSAndrew Rybchenko  * (required by PIO hardware)
8403c838a9fSAndrew Rybchenko  */
8413c838a9fSAndrew Rybchenko #define	EFSYS_BAR_WC_WRITEQ(_esbp, _offset, _eqp)			\
8423c838a9fSAndrew Rybchenko 	do {								\
8433c838a9fSAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
8447daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
8457daf1fedSAndrew Rybchenko 		    sizeof (efx_qword_t)),				\
8463c838a9fSAndrew Rybchenko 		    ("not power of 2 aligned"));			\
8473c838a9fSAndrew Rybchenko 									\
8483c838a9fSAndrew Rybchenko 		(void) (_esbp);						\
849*a79731b9SDimitry Andric 		(void) (_eqp);						\
8503c838a9fSAndrew Rybchenko 									\
8513c838a9fSAndrew Rybchenko 		/* FIXME: Perform a 64-bit write */			\
8523c838a9fSAndrew Rybchenko 		KASSERT(0, ("not implemented"));			\
8533c838a9fSAndrew Rybchenko 									\
8543c838a9fSAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
8553c838a9fSAndrew Rybchenko 	} while (B_FALSE)
8563c838a9fSAndrew Rybchenko 
8575dadbb64SAndrew Rybchenko #if defined(SFXGE_USE_BUS_SPACE_8)
858e948693eSPhilip Paeps #define	EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock)			\
859e948693eSPhilip Paeps 	do {								\
860e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
8617daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
8627daf1fedSAndrew Rybchenko 		    sizeof (efx_oword_t)),				\
863e948693eSPhilip Paeps 		    ("not power of 2 aligned"));			\
864e948693eSPhilip Paeps 									\
865e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
866e948693eSPhilip Paeps 		if (_lock)						\
867763cab71SAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
868e948693eSPhilip Paeps 									\
869e948693eSPhilip Paeps 		EFSYS_PROBE5(bar_writeo, unsigned int, (_offset),	\
870e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[3],			\
871e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[2],			\
872e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[1],			\
873e948693eSPhilip Paeps 		    uint32_t, (_eop)->eo_u32[0]);			\
874e948693eSPhilip Paeps 									\
8751cc8febfSAndrew Rybchenko 		/*							\
8761cc8febfSAndrew Rybchenko 		 * Make sure that previous writes to the oword have	\
8771cc8febfSAndrew Rybchenko 		 * been done. It should be cheaper than barrier just	\
8781cc8febfSAndrew Rybchenko 		 * after the last write below.				\
8791cc8febfSAndrew Rybchenko 		 */							\
8801cc8febfSAndrew Rybchenko 		bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
8811cc8febfSAndrew Rybchenko 		    (_offset), sizeof (efx_oword_t),			\
8821cc8febfSAndrew Rybchenko 		    BUS_SPACE_BARRIER_WRITE);				\
883d9ff48abSAndrew Rybchenko 		bus_space_write_stream_8((_esbp)->esb_tag,		\
884d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
8850f999687SAndrew Rybchenko 		    (_offset), (_eop)->eo_u64[0]);			\
8861cc8febfSAndrew Rybchenko 		/*							\
8871cc8febfSAndrew Rybchenko 		 * It should be guaranteed that the last qword comes	\
8881cc8febfSAndrew Rybchenko 		 * the last, so barrier entire oword to be sure that	\
8891cc8febfSAndrew Rybchenko 		 * neither above nor below writes are reordered.	\
8901cc8febfSAndrew Rybchenko 		 */							\
8911cc8febfSAndrew Rybchenko 		bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
8921cc8febfSAndrew Rybchenko 		    (_offset), sizeof (efx_oword_t),			\
8931cc8febfSAndrew Rybchenko 		    BUS_SPACE_BARRIER_WRITE);				\
894d9ff48abSAndrew Rybchenko 		bus_space_write_stream_8((_esbp)->esb_tag,		\
895d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
896d9ff48abSAndrew Rybchenko 		    (_offset) + 8, (_eop)->eo_u64[1]);			\
8970f999687SAndrew Rybchenko 									\
8980f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
8990f999687SAndrew Rybchenko 		if (_lock)						\
900687adefaSAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
9010f999687SAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
9020f999687SAndrew Rybchenko 	} while (B_FALSE)
9030f999687SAndrew Rybchenko 
9040f999687SAndrew Rybchenko #else
9050f999687SAndrew Rybchenko #define	EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock)			\
9060f999687SAndrew Rybchenko 	do {								\
9070f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
9087daf1fedSAndrew Rybchenko 		KASSERT(EFX_IS_P2ALIGNED(size_t, _offset,		\
9097daf1fedSAndrew Rybchenko 		    sizeof (efx_oword_t)),				\
9100f999687SAndrew Rybchenko 		    ("not power of 2 aligned"));			\
9110f999687SAndrew Rybchenko 									\
9120f999687SAndrew Rybchenko 		_NOTE(CONSTANTCONDITION)				\
9130f999687SAndrew Rybchenko 		if (_lock)						\
914687adefaSAndrew Rybchenko 			SFXGE_BAR_LOCK(_esbp);				\
9150f999687SAndrew Rybchenko 									\
9160f999687SAndrew Rybchenko 		EFSYS_PROBE5(bar_writeo, unsigned int, (_offset),	\
9170f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[3],			\
9180f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[2],			\
9190f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[1],			\
9200f999687SAndrew Rybchenko 		    uint32_t, (_eop)->eo_u32[0]);			\
9210f999687SAndrew Rybchenko 									\
9221cc8febfSAndrew Rybchenko 		/*							\
9231cc8febfSAndrew Rybchenko 		 * Make sure that previous writes to the oword have	\
9241cc8febfSAndrew Rybchenko 		 * been done. It should be cheaper than barrier just	\
9251cc8febfSAndrew Rybchenko 		 * after the last write below.				\
9261cc8febfSAndrew Rybchenko 		 */							\
9271cc8febfSAndrew Rybchenko 		bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
9281cc8febfSAndrew Rybchenko 		    (_offset), sizeof (efx_oword_t),			\
9291cc8febfSAndrew Rybchenko 		    BUS_SPACE_BARRIER_WRITE);				\
930d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
931d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
932e948693eSPhilip Paeps 		    (_offset), (_eop)->eo_u32[0]);			\
933d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
934d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
935d9ff48abSAndrew Rybchenko 		    (_offset) + 4, (_eop)->eo_u32[1]);			\
936d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
937d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
938d9ff48abSAndrew Rybchenko 		    (_offset) + 8, (_eop)->eo_u32[2]);			\
9391cc8febfSAndrew Rybchenko 		/*							\
9401cc8febfSAndrew Rybchenko 		 * It should be guaranteed that the last dword comes	\
9411cc8febfSAndrew Rybchenko 		 * the last, so barrier entire oword to be sure that	\
9421cc8febfSAndrew Rybchenko 		 * neither above nor below writes are reordered.	\
9431cc8febfSAndrew Rybchenko 		 */							\
9441cc8febfSAndrew Rybchenko 		bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
9451cc8febfSAndrew Rybchenko 		    (_offset), sizeof (efx_oword_t),			\
9461cc8febfSAndrew Rybchenko 		    BUS_SPACE_BARRIER_WRITE);				\
947d9ff48abSAndrew Rybchenko 		bus_space_write_stream_4((_esbp)->esb_tag,		\
948d9ff48abSAndrew Rybchenko 		    (_esbp)->esb_handle,				\
949d9ff48abSAndrew Rybchenko 		    (_offset) + 12, (_eop)->eo_u32[3]);			\
950e948693eSPhilip Paeps 									\
951e948693eSPhilip Paeps 		_NOTE(CONSTANTCONDITION)				\
952e948693eSPhilip Paeps 		if (_lock)						\
953763cab71SAndrew Rybchenko 			SFXGE_BAR_UNLOCK(_esbp);			\
954e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
955e948693eSPhilip Paeps 	} while (B_FALSE)
9560f999687SAndrew Rybchenko #endif
957e948693eSPhilip Paeps 
9583c838a9fSAndrew Rybchenko /* Use the standard octo-word write for doorbell writes */
9593c838a9fSAndrew Rybchenko #define	EFSYS_BAR_DOORBELL_WRITEO(_esbp, _offset, _eop)			\
9603c838a9fSAndrew Rybchenko 	do {								\
9613c838a9fSAndrew Rybchenko 		EFSYS_BAR_WRITEO((_esbp), (_offset), (_eop), B_FALSE);	\
9623c838a9fSAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
9633c838a9fSAndrew Rybchenko 	} while (B_FALSE)
9643c838a9fSAndrew Rybchenko 
965e948693eSPhilip Paeps /* SPIN */
966e948693eSPhilip Paeps 
967e948693eSPhilip Paeps #define	EFSYS_SPIN(_us)							\
968e948693eSPhilip Paeps 	do {								\
969e948693eSPhilip Paeps 		DELAY(_us);						\
970e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
971e948693eSPhilip Paeps 	} while (B_FALSE)
972e948693eSPhilip Paeps 
973e948693eSPhilip Paeps #define	EFSYS_SLEEP	EFSYS_SPIN
974e948693eSPhilip Paeps 
975e948693eSPhilip Paeps /* BARRIERS */
976e948693eSPhilip Paeps 
9777c00963aSAndrew Rybchenko #define	EFSYS_MEM_READ_BARRIER()	rmb()
978e948693eSPhilip Paeps #define	EFSYS_PIO_WRITE_BARRIER()
979e948693eSPhilip Paeps 
9803c838a9fSAndrew Rybchenko /* DMA SYNC */
9813c838a9fSAndrew Rybchenko #define	EFSYS_DMA_SYNC_FOR_KERNEL(_esmp, _offset, _size)		\
9823c838a9fSAndrew Rybchenko 	do {								\
9833c838a9fSAndrew Rybchenko 		bus_dmamap_sync((_esmp)->esm_tag,			\
9843c838a9fSAndrew Rybchenko 		    (_esmp)->esm_map,					\
9853c838a9fSAndrew Rybchenko 		    BUS_DMASYNC_POSTREAD);				\
9863c838a9fSAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
9873c838a9fSAndrew Rybchenko 	} while (B_FALSE)
9883c838a9fSAndrew Rybchenko 
9893c838a9fSAndrew Rybchenko #define	EFSYS_DMA_SYNC_FOR_DEVICE(_esmp, _offset, _size)		\
9903c838a9fSAndrew Rybchenko 	do {								\
9913c838a9fSAndrew Rybchenko 		bus_dmamap_sync((_esmp)->esm_tag,			\
9923c838a9fSAndrew Rybchenko 		    (_esmp)->esm_map,					\
9933c838a9fSAndrew Rybchenko 		    BUS_DMASYNC_PREWRITE);				\
9943c838a9fSAndrew Rybchenko 	_NOTE(CONSTANTCONDITION)					\
9953c838a9fSAndrew Rybchenko 	} while (B_FALSE)
9963c838a9fSAndrew Rybchenko 
997e948693eSPhilip Paeps /* TIMESTAMP */
998e948693eSPhilip Paeps 
999e948693eSPhilip Paeps typedef	clock_t	efsys_timestamp_t;
1000e948693eSPhilip Paeps 
1001e948693eSPhilip Paeps #define	EFSYS_TIMESTAMP(_usp)						\
1002e948693eSPhilip Paeps 	do {								\
1003e948693eSPhilip Paeps 		clock_t now;						\
1004e948693eSPhilip Paeps 									\
1005e948693eSPhilip Paeps 		now = ticks;						\
1006e948693eSPhilip Paeps 		*(_usp) = now * hz / 1000000;				\
1007e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1008e948693eSPhilip Paeps 	} while (B_FALSE)
1009e948693eSPhilip Paeps 
1010e948693eSPhilip Paeps /* KMEM */
1011e948693eSPhilip Paeps 
1012e948693eSPhilip Paeps #define	EFSYS_KMEM_ALLOC(_esip, _size, _p)				\
1013e948693eSPhilip Paeps 	do {								\
1014e948693eSPhilip Paeps 		(_esip) = (_esip);					\
101583488e18SAndrew Rybchenko 		/*							\
101683488e18SAndrew Rybchenko 		 * The macro is used in non-sleepable contexts, for	\
101783488e18SAndrew Rybchenko 		 * example, holding a mutex.				\
101883488e18SAndrew Rybchenko 		 */							\
101983488e18SAndrew Rybchenko 		(_p) = malloc((_size), M_SFXGE, M_NOWAIT|M_ZERO);	\
1020e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1021e948693eSPhilip Paeps 	} while (B_FALSE)
1022e948693eSPhilip Paeps 
1023e948693eSPhilip Paeps #define	EFSYS_KMEM_FREE(_esip, _size, _p)				\
1024e948693eSPhilip Paeps 	do {								\
1025e948693eSPhilip Paeps 		(void) (_esip);						\
1026e948693eSPhilip Paeps 		(void) (_size);						\
1027e948693eSPhilip Paeps 		free((_p), M_SFXGE);					\
1028e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1029e948693eSPhilip Paeps 	} while (B_FALSE)
1030e948693eSPhilip Paeps 
1031e948693eSPhilip Paeps /* LOCK */
1032e948693eSPhilip Paeps 
103333d45dc5SAndrew Rybchenko typedef struct efsys_lock_s {
103433d45dc5SAndrew Rybchenko 	struct mtx	lock;
103533d45dc5SAndrew Rybchenko 	char		lock_name[SFXGE_LOCK_NAME_MAX];
103633d45dc5SAndrew Rybchenko } efsys_lock_t;
103733d45dc5SAndrew Rybchenko 
103833d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_LOCK_INIT(_eslp, _ifname, _label)			\
103933d45dc5SAndrew Rybchenko 	do {								\
104033d45dc5SAndrew Rybchenko 		efsys_lock_t *__eslp = (_eslp);				\
104133d45dc5SAndrew Rybchenko 									\
104233d45dc5SAndrew Rybchenko 		snprintf((__eslp)->lock_name,				\
104333d45dc5SAndrew Rybchenko 			 sizeof((__eslp)->lock_name),			\
104433d45dc5SAndrew Rybchenko 			 "%s:%s", (_ifname), (_label));			\
104533d45dc5SAndrew Rybchenko 		mtx_init(&(__eslp)->lock, (__eslp)->lock_name,		\
104633d45dc5SAndrew Rybchenko 			 NULL, MTX_DEF);				\
104733d45dc5SAndrew Rybchenko 	} while (B_FALSE)
104833d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_LOCK_DESTROY(_eslp)					\
104933d45dc5SAndrew Rybchenko 	mtx_destroy(&(_eslp)->lock)
105033d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_LOCK(_eslp)						\
105133d45dc5SAndrew Rybchenko 	mtx_lock(&(_eslp)->lock)
105233d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_UNLOCK(_eslp)					\
105333d45dc5SAndrew Rybchenko 	mtx_unlock(&(_eslp)->lock)
105433d45dc5SAndrew Rybchenko #define	SFXGE_EFSYS_LOCK_ASSERT_OWNED(_eslp)				\
105533d45dc5SAndrew Rybchenko 	mtx_assert(&(_eslp)->lock, MA_OWNED)
1056e948693eSPhilip Paeps 
1057a98003ddSAndrew Rybchenko typedef int efsys_lock_state_t;
1058a98003ddSAndrew Rybchenko 
1059e948693eSPhilip Paeps #define	EFSYS_LOCK_MAGIC	0x000010c4
1060e948693eSPhilip Paeps 
1061e948693eSPhilip Paeps #define	EFSYS_LOCK(_lockp, _state)					\
1062e948693eSPhilip Paeps 	do {								\
106333d45dc5SAndrew Rybchenko 		SFXGE_EFSYS_LOCK(_lockp);				\
1064e948693eSPhilip Paeps 		(_state) = EFSYS_LOCK_MAGIC;				\
1065e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1066e948693eSPhilip Paeps 	} while (B_FALSE)
1067e948693eSPhilip Paeps 
1068e948693eSPhilip Paeps #define	EFSYS_UNLOCK(_lockp, _state)					\
1069e948693eSPhilip Paeps 	do {								\
1070e948693eSPhilip Paeps 		if ((_state) != EFSYS_LOCK_MAGIC)			\
1071e948693eSPhilip Paeps 			KASSERT(B_FALSE, ("not locked"));		\
107233d45dc5SAndrew Rybchenko 		SFXGE_EFSYS_UNLOCK(_lockp);				\
1073e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1074e948693eSPhilip Paeps 	} while (B_FALSE)
1075e948693eSPhilip Paeps 
1076e948693eSPhilip Paeps /* STAT */
1077e948693eSPhilip Paeps 
1078e948693eSPhilip Paeps typedef uint64_t		efsys_stat_t;
1079e948693eSPhilip Paeps 
1080e948693eSPhilip Paeps #define	EFSYS_STAT_INCR(_knp, _delta) 					\
1081e948693eSPhilip Paeps 	do {								\
1082e948693eSPhilip Paeps 		*(_knp) += (_delta);					\
1083e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1084e948693eSPhilip Paeps 	} while (B_FALSE)
1085e948693eSPhilip Paeps 
1086e948693eSPhilip Paeps #define	EFSYS_STAT_DECR(_knp, _delta) 					\
1087e948693eSPhilip Paeps 	do {								\
1088e948693eSPhilip Paeps 		*(_knp) -= (_delta);					\
1089e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1090e948693eSPhilip Paeps 	} while (B_FALSE)
1091e948693eSPhilip Paeps 
1092e948693eSPhilip Paeps #define	EFSYS_STAT_SET(_knp, _val)					\
1093e948693eSPhilip Paeps 	do {								\
1094e948693eSPhilip Paeps 		*(_knp) = (_val);					\
1095e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1096e948693eSPhilip Paeps 	} while (B_FALSE)
1097e948693eSPhilip Paeps 
1098e948693eSPhilip Paeps #define	EFSYS_STAT_SET_QWORD(_knp, _valp)				\
1099e948693eSPhilip Paeps 	do {								\
1100e948693eSPhilip Paeps 		*(_knp) = le64toh((_valp)->eq_u64[0]);			\
1101e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1102e948693eSPhilip Paeps 	} while (B_FALSE)
1103e948693eSPhilip Paeps 
1104e948693eSPhilip Paeps #define	EFSYS_STAT_SET_DWORD(_knp, _valp)				\
1105e948693eSPhilip Paeps 	do {								\
1106e948693eSPhilip Paeps 		*(_knp) = le32toh((_valp)->ed_u32[0]);			\
1107e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1108e948693eSPhilip Paeps 	} while (B_FALSE)
1109e948693eSPhilip Paeps 
1110e948693eSPhilip Paeps #define	EFSYS_STAT_INCR_QWORD(_knp, _valp)				\
1111e948693eSPhilip Paeps 	do {								\
1112e948693eSPhilip Paeps 		*(_knp) += le64toh((_valp)->eq_u64[0]);			\
1113e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1114e948693eSPhilip Paeps 	} while (B_FALSE)
1115e948693eSPhilip Paeps 
1116e948693eSPhilip Paeps #define	EFSYS_STAT_SUBR_QWORD(_knp, _valp)				\
1117e948693eSPhilip Paeps 	do {								\
1118e948693eSPhilip Paeps 		*(_knp) -= le64toh((_valp)->eq_u64[0]);			\
1119e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1120e948693eSPhilip Paeps 	} while (B_FALSE)
1121e948693eSPhilip Paeps 
1122e948693eSPhilip Paeps /* ERR */
1123e948693eSPhilip Paeps 
1124e948693eSPhilip Paeps extern void	sfxge_err(efsys_identifier_t *, unsigned int,
1125e948693eSPhilip Paeps 		    uint32_t, uint32_t);
1126e948693eSPhilip Paeps 
1127e948693eSPhilip Paeps #if EFSYS_OPT_DECODE_INTR_FATAL
1128e948693eSPhilip Paeps #define	EFSYS_ERR(_esip, _code, _dword0, _dword1)			\
1129e948693eSPhilip Paeps 	do {								\
1130e948693eSPhilip Paeps 		sfxge_err((_esip), (_code), (_dword0), (_dword1));	\
1131e948693eSPhilip Paeps 	_NOTE(CONSTANTCONDITION)					\
1132e948693eSPhilip Paeps 	} while (B_FALSE)
1133e948693eSPhilip Paeps #endif
1134e948693eSPhilip Paeps 
1135e948693eSPhilip Paeps /* ASSERT */
1136e948693eSPhilip Paeps 
1137e948693eSPhilip Paeps #define	EFSYS_ASSERT(_exp) do {						\
1138e948693eSPhilip Paeps 	if (!(_exp))							\
11393c838a9fSAndrew Rybchenko 		panic("%s", #_exp);					\
1140e948693eSPhilip Paeps 	} while (0)
1141e948693eSPhilip Paeps 
1142e948693eSPhilip Paeps #define	EFSYS_ASSERT3(_x, _op, _y, _t) do {				\
1143e948693eSPhilip Paeps 	const _t __x = (_t)(_x);					\
1144e948693eSPhilip Paeps 	const _t __y = (_t)(_y);					\
1145e948693eSPhilip Paeps 	if (!(__x _op __y))						\
1146e948693eSPhilip Paeps 		panic("assertion failed at %s:%u", __FILE__, __LINE__);	\
1147e948693eSPhilip Paeps 	} while(0)
1148e948693eSPhilip Paeps 
1149e948693eSPhilip Paeps #define	EFSYS_ASSERT3U(_x, _op, _y)	EFSYS_ASSERT3(_x, _op, _y, uint64_t)
1150e948693eSPhilip Paeps #define	EFSYS_ASSERT3S(_x, _op, _y)	EFSYS_ASSERT3(_x, _op, _y, int64_t)
1151e948693eSPhilip Paeps #define	EFSYS_ASSERT3P(_x, _op, _y)	EFSYS_ASSERT3(_x, _op, _y, uintptr_t)
1152e948693eSPhilip Paeps 
11533c838a9fSAndrew Rybchenko /* ROTATE */
11543c838a9fSAndrew Rybchenko 
11553c838a9fSAndrew Rybchenko #define	EFSYS_HAS_ROTL_DWORD 0
11563c838a9fSAndrew Rybchenko 
1157e948693eSPhilip Paeps #ifdef	__cplusplus
1158e948693eSPhilip Paeps }
1159e948693eSPhilip Paeps #endif
1160e948693eSPhilip Paeps 
1161e948693eSPhilip Paeps #endif	/* _SYS_EFSYS_H */
1162