1e948693eSPhilip Paeps /*-
2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause
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.
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 #ifndef B_FALSE
74e948693eSPhilip Paeps #define B_FALSE FALSE
75e948693eSPhilip Paeps #endif
76e948693eSPhilip Paeps #ifndef B_TRUE
77e948693eSPhilip Paeps #define B_TRUE TRUE
78e948693eSPhilip Paeps #endif
79e948693eSPhilip Paeps
80e948693eSPhilip Paeps #ifndef IS2P
81e948693eSPhilip Paeps #define ISP2(x) (((x) & ((x) - 1)) == 0)
82e948693eSPhilip Paeps #endif
83e948693eSPhilip Paeps
84adc1d71cSWarner Losh #if defined(__x86_64__)
855dadbb64SAndrew Rybchenko
865dadbb64SAndrew Rybchenko #define SFXGE_USE_BUS_SPACE_8 1
875dadbb64SAndrew Rybchenko
88d9ff48abSAndrew Rybchenko #if !defined(bus_space_read_stream_8)
895dadbb64SAndrew Rybchenko
90d9ff48abSAndrew Rybchenko #define bus_space_read_stream_8(t, h, o) \
91d9ff48abSAndrew Rybchenko bus_space_read_8((t), (h), (o))
925dadbb64SAndrew Rybchenko
93d9ff48abSAndrew Rybchenko #define bus_space_write_stream_8(t, h, o, v) \
94d9ff48abSAndrew Rybchenko bus_space_write_8((t), (h), (o), (v))
955dadbb64SAndrew Rybchenko
96d9ff48abSAndrew Rybchenko #endif
975dadbb64SAndrew Rybchenko
98d9ff48abSAndrew Rybchenko #endif
99d9ff48abSAndrew Rybchenko
100e948693eSPhilip Paeps #define ENOTACTIVE EINVAL
101e948693eSPhilip Paeps
102e948693eSPhilip Paeps /* Memory type to use on FreeBSD */
103e948693eSPhilip Paeps MALLOC_DECLARE(M_SFXGE);
104e948693eSPhilip Paeps
105e948693eSPhilip Paeps /* Machine dependend prefetch wrappers */
106dc1788e8SMarius Strobl #if defined(__i386__) || defined(__amd64__)
107e948693eSPhilip Paeps static __inline void
prefetch_read_many(void * addr)108e948693eSPhilip Paeps prefetch_read_many(void *addr)
109e948693eSPhilip Paeps {
110dc1788e8SMarius Strobl
111e948693eSPhilip Paeps __asm__(
112e948693eSPhilip Paeps "prefetcht0 (%0)"
113e948693eSPhilip Paeps :
114e948693eSPhilip Paeps : "r" (addr));
115e948693eSPhilip Paeps }
116e948693eSPhilip Paeps
117e948693eSPhilip Paeps static __inline void
prefetch_read_once(void * addr)118e948693eSPhilip Paeps prefetch_read_once(void *addr)
119e948693eSPhilip Paeps {
120dc1788e8SMarius Strobl
121e948693eSPhilip Paeps __asm__(
122e948693eSPhilip Paeps "prefetchnta (%0)"
123e948693eSPhilip Paeps :
124e948693eSPhilip Paeps : "r" (addr));
125e948693eSPhilip Paeps }
126dc1788e8SMarius Strobl #else
127dc1788e8SMarius Strobl static __inline void
prefetch_read_many(void * addr)128dc1788e8SMarius Strobl prefetch_read_many(void *addr)
129dc1788e8SMarius Strobl {
130dc1788e8SMarius Strobl
131dc1788e8SMarius Strobl }
132dc1788e8SMarius Strobl
133dc1788e8SMarius Strobl static __inline void
prefetch_read_once(void * addr)134dc1788e8SMarius Strobl prefetch_read_once(void *addr)
135dc1788e8SMarius Strobl {
136dc1788e8SMarius Strobl
137dc1788e8SMarius Strobl }
138e948693eSPhilip Paeps #endif
139e948693eSPhilip Paeps
140e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__)
141e948693eSPhilip Paeps #include <vm/vm.h>
142e948693eSPhilip Paeps #include <vm/pmap.h>
143e948693eSPhilip Paeps #endif
144e948693eSPhilip Paeps static __inline void
sfxge_map_mbuf_fast(bus_dma_tag_t tag,bus_dmamap_t map,struct mbuf * m,bus_dma_segment_t * seg)145e948693eSPhilip Paeps sfxge_map_mbuf_fast(bus_dma_tag_t tag, bus_dmamap_t map,
146e948693eSPhilip Paeps struct mbuf *m, bus_dma_segment_t *seg)
147e948693eSPhilip Paeps {
148e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__)
149e948693eSPhilip Paeps seg->ds_addr = pmap_kextract(mtod(m, vm_offset_t));
150e948693eSPhilip Paeps seg->ds_len = m->m_len;
151e948693eSPhilip Paeps #else
152e948693eSPhilip Paeps int nsegstmp;
153e948693eSPhilip Paeps
154e948693eSPhilip Paeps bus_dmamap_load_mbuf_sg(tag, map, m, seg, &nsegstmp, 0);
155e948693eSPhilip Paeps #endif
156e948693eSPhilip Paeps }
157e948693eSPhilip Paeps
158e948693eSPhilip Paeps /* Code inclusion options */
159e948693eSPhilip Paeps
160e948693eSPhilip Paeps #define EFSYS_OPT_NAMES 1
161e948693eSPhilip Paeps
162e948693eSPhilip Paeps #define EFSYS_OPT_SIENA 1
1633c838a9fSAndrew Rybchenko #define EFSYS_OPT_HUNTINGTON 1
164131bc376SAndrew Rybchenko #define EFSYS_OPT_MEDFORD 1
165c6831b0bSAndrew Rybchenko #define EFSYS_OPT_MEDFORD2 1
166e948693eSPhilip Paeps #ifdef DEBUG
167e948693eSPhilip Paeps #define EFSYS_OPT_CHECK_REG 1
168e948693eSPhilip Paeps #else
169e948693eSPhilip Paeps #define EFSYS_OPT_CHECK_REG 0
170e948693eSPhilip Paeps #endif
171e948693eSPhilip Paeps
172e948693eSPhilip Paeps #define EFSYS_OPT_MCDI 1
173870b1186SAndrew Rybchenko #define EFSYS_OPT_MCDI_LOGGING 0
1743edad197SAndrew Rybchenko #define EFSYS_OPT_MCDI_PROXY_AUTH 0
175e948693eSPhilip Paeps
176e948693eSPhilip Paeps #define EFSYS_OPT_MAC_STATS 1
177e948693eSPhilip Paeps
178e948693eSPhilip Paeps #define EFSYS_OPT_LOOPBACK 0
179e948693eSPhilip Paeps
1803c838a9fSAndrew Rybchenko #define EFSYS_OPT_MON_MCDI 0
181e948693eSPhilip Paeps #define EFSYS_OPT_MON_STATS 0
182e948693eSPhilip Paeps
183e948693eSPhilip Paeps #define EFSYS_OPT_PHY_STATS 1
1843c838a9fSAndrew Rybchenko #define EFSYS_OPT_BIST 1
185e948693eSPhilip Paeps #define EFSYS_OPT_PHY_LED_CONTROL 1
186e948693eSPhilip Paeps #define EFSYS_OPT_PHY_FLAGS 0
187e948693eSPhilip Paeps
188e948693eSPhilip Paeps #define EFSYS_OPT_VPD 1
189e948693eSPhilip Paeps #define EFSYS_OPT_NVRAM 1
190e948693eSPhilip Paeps #define EFSYS_OPT_BOOTCFG 0
191391763d7SAndrew Rybchenko #define EFSYS_OPT_IMAGE_LAYOUT 0
192e948693eSPhilip Paeps
193e948693eSPhilip Paeps #define EFSYS_OPT_DIAG 0
194e948693eSPhilip Paeps #define EFSYS_OPT_RX_SCALE 1
195e948693eSPhilip Paeps #define EFSYS_OPT_QSTATS 1
1963c838a9fSAndrew Rybchenko #define EFSYS_OPT_FILTER 1
197e948693eSPhilip Paeps #define EFSYS_OPT_RX_SCATTER 0
198e948693eSPhilip Paeps
199e948693eSPhilip Paeps #define EFSYS_OPT_EV_PREFETCH 0
200e948693eSPhilip Paeps
201e948693eSPhilip Paeps #define EFSYS_OPT_DECODE_INTR_FATAL 1
202e948693eSPhilip Paeps
2030c848230SAndrew Rybchenko #define EFSYS_OPT_LICENSING 0
2040c848230SAndrew Rybchenko
205ecaa500cSAndrew Rybchenko #define EFSYS_OPT_ALLOW_UNCONFIGURED_NIC 0
206ecaa500cSAndrew Rybchenko
2078e0c4827SAndrew Rybchenko #define EFSYS_OPT_RX_PACKED_STREAM 0
2088e0c4827SAndrew Rybchenko
20904381b5eSAndrew Rybchenko #define EFSYS_OPT_RX_ES_SUPER_BUFFER 0
21004381b5eSAndrew Rybchenko
211fdbe38cfSAndrew Rybchenko #define EFSYS_OPT_TUNNEL 0
212fdbe38cfSAndrew Rybchenko
213e0b3c2ccSAndrew Rybchenko #define EFSYS_OPT_FW_SUBVARIANT_AWARE 0
214e0b3c2ccSAndrew Rybchenko
215e948693eSPhilip Paeps /* ID */
216e948693eSPhilip Paeps
217e948693eSPhilip Paeps typedef struct __efsys_identifier_s efsys_identifier_t;
218e948693eSPhilip Paeps
219e948693eSPhilip Paeps /* PROBE */
220e948693eSPhilip Paeps
22154366c0bSAttilio Rao #ifndef DTRACE_PROBE
222e948693eSPhilip Paeps
223e948693eSPhilip Paeps #define EFSYS_PROBE(_name)
224e948693eSPhilip Paeps
225e948693eSPhilip Paeps #define EFSYS_PROBE1(_name, _type1, _arg1)
226e948693eSPhilip Paeps
227e948693eSPhilip Paeps #define EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2)
228e948693eSPhilip Paeps
229e948693eSPhilip Paeps #define EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2, \
230e948693eSPhilip Paeps _type3, _arg3)
231e948693eSPhilip Paeps
232e948693eSPhilip Paeps #define EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2, \
233e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4)
234e948693eSPhilip Paeps
235e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \
236e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5)
237e948693eSPhilip Paeps
238e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \
239e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \
240e948693eSPhilip Paeps _type6, _arg6)
241e948693eSPhilip Paeps
242e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \
243e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \
244e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7)
245e948693eSPhilip Paeps
24654366c0bSAttilio Rao #else /* DTRACE_PROBE */
247e948693eSPhilip Paeps
248e948693eSPhilip Paeps #define EFSYS_PROBE(_name) \
249e948693eSPhilip Paeps DTRACE_PROBE(_name)
250e948693eSPhilip Paeps
251e948693eSPhilip Paeps #define EFSYS_PROBE1(_name, _type1, _arg1) \
252e948693eSPhilip Paeps DTRACE_PROBE1(_name, _type1, _arg1)
253e948693eSPhilip Paeps
254e948693eSPhilip Paeps #define EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2) \
255e948693eSPhilip Paeps DTRACE_PROBE2(_name, _type1, _arg1, _type2, _arg2)
256e948693eSPhilip Paeps
257e948693eSPhilip Paeps #define EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2, \
258e948693eSPhilip Paeps _type3, _arg3) \
259e948693eSPhilip Paeps DTRACE_PROBE3(_name, _type1, _arg1, _type2, _arg2, \
260e948693eSPhilip Paeps _type3, _arg3)
261e948693eSPhilip Paeps
262e948693eSPhilip Paeps #define EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2, \
263e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) \
264e948693eSPhilip Paeps DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2, \
265e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4)
266e948693eSPhilip Paeps
267e948693eSPhilip Paeps #ifdef DTRACE_PROBE5
268e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \
269e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) \
270e948693eSPhilip Paeps DTRACE_PROBE5(_name, _type1, _arg1, _type2, _arg2, \
271e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5)
272e948693eSPhilip Paeps #else
273e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \
274e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) \
275e948693eSPhilip Paeps DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2, \
276e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4)
277e948693eSPhilip Paeps #endif
278e948693eSPhilip Paeps
279e948693eSPhilip Paeps #ifdef DTRACE_PROBE6
280e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \
281e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \
282e948693eSPhilip Paeps _type6, _arg6) \
283e948693eSPhilip Paeps DTRACE_PROBE6(_name, _type1, _arg1, _type2, _arg2, \
284e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \
285e948693eSPhilip Paeps _type6, _arg6)
286e948693eSPhilip Paeps #else
287e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \
288e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \
289e948693eSPhilip Paeps _type6, _arg6) \
290e948693eSPhilip Paeps EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \
291e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5)
292e948693eSPhilip Paeps #endif
293e948693eSPhilip Paeps
294e948693eSPhilip Paeps #ifdef DTRACE_PROBE7
295e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \
296e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \
297e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) \
298e948693eSPhilip Paeps DTRACE_PROBE7(_name, _type1, _arg1, _type2, _arg2, \
299e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \
300e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7)
301e948693eSPhilip Paeps #else
302e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \
303e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \
304e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) \
305e948693eSPhilip Paeps EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \
306e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \
307e948693eSPhilip Paeps _type6, _arg6)
308e948693eSPhilip Paeps #endif
309e948693eSPhilip Paeps
31054366c0bSAttilio Rao #endif /* DTRACE_PROBE */
311e948693eSPhilip Paeps
312e948693eSPhilip Paeps /* DMA */
313e948693eSPhilip Paeps
314e948693eSPhilip Paeps typedef uint64_t efsys_dma_addr_t;
315e948693eSPhilip Paeps
316e948693eSPhilip Paeps typedef struct efsys_mem_s {
317e948693eSPhilip Paeps bus_dma_tag_t esm_tag;
318e948693eSPhilip Paeps bus_dmamap_t esm_map;
319e948693eSPhilip Paeps caddr_t esm_base;
320e948693eSPhilip Paeps efsys_dma_addr_t esm_addr;
3214aaefb95SAndrew Rybchenko size_t esm_size;
322e948693eSPhilip Paeps } efsys_mem_t;
323e948693eSPhilip Paeps
3244aaefb95SAndrew Rybchenko #define EFSYS_MEM_SIZE(_esmp) \
3254aaefb95SAndrew Rybchenko ((_esmp)->esm_size)
3264aaefb95SAndrew Rybchenko
3274aaefb95SAndrew Rybchenko #define EFSYS_MEM_ADDR(_esmp) \
3284aaefb95SAndrew Rybchenko ((_esmp)->esm_addr)
3294aaefb95SAndrew Rybchenko
3304aaefb95SAndrew Rybchenko #define EFSYS_MEM_IS_NULL(_esmp) \
3314aaefb95SAndrew Rybchenko ((_esmp)->esm_base == NULL)
3324aaefb95SAndrew Rybchenko
333e948693eSPhilip Paeps #define EFSYS_MEM_ZERO(_esmp, _size) \
334e948693eSPhilip Paeps do { \
335e948693eSPhilip Paeps (void) memset((_esmp)->esm_base, 0, (_size)); \
336e948693eSPhilip Paeps \
337e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
338e948693eSPhilip Paeps } while (B_FALSE)
339e948693eSPhilip Paeps
340e948693eSPhilip Paeps #define EFSYS_MEM_READD(_esmp, _offset, _edp) \
341e948693eSPhilip Paeps do { \
342e948693eSPhilip Paeps uint32_t *addr; \
343e948693eSPhilip Paeps \
344e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
3457daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
3467daf1fedSAndrew Rybchenko sizeof (efx_dword_t)), \
347e948693eSPhilip Paeps ("not power of 2 aligned")); \
348e948693eSPhilip Paeps \
349e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \
350e948693eSPhilip Paeps \
351e948693eSPhilip Paeps (_edp)->ed_u32[0] = *addr; \
352e948693eSPhilip Paeps \
353e948693eSPhilip Paeps EFSYS_PROBE2(mem_readd, unsigned int, (_offset), \
354e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \
355e948693eSPhilip Paeps \
356e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
357e948693eSPhilip Paeps } while (B_FALSE)
358e948693eSPhilip Paeps
3590f999687SAndrew Rybchenko #if defined(__x86_64__)
3600f999687SAndrew Rybchenko #define EFSYS_MEM_READQ(_esmp, _offset, _eqp) \
3610f999687SAndrew Rybchenko do { \
3620f999687SAndrew Rybchenko uint64_t *addr; \
3630f999687SAndrew Rybchenko \
3640f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
3657daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
3667daf1fedSAndrew Rybchenko sizeof (efx_qword_t)), \
3670f999687SAndrew Rybchenko ("not power of 2 aligned")); \
3680f999687SAndrew Rybchenko \
3690f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \
3700f999687SAndrew Rybchenko \
3710f999687SAndrew Rybchenko (_eqp)->eq_u64[0] = *addr; \
3720f999687SAndrew Rybchenko \
3730f999687SAndrew Rybchenko EFSYS_PROBE3(mem_readq, unsigned int, (_offset), \
3740f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \
3750f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \
3760f999687SAndrew Rybchenko \
3770f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
3780f999687SAndrew Rybchenko } while (B_FALSE)
3790f999687SAndrew Rybchenko #else
380e948693eSPhilip Paeps #define EFSYS_MEM_READQ(_esmp, _offset, _eqp) \
381e948693eSPhilip Paeps do { \
382e948693eSPhilip Paeps uint32_t *addr; \
383e948693eSPhilip Paeps \
384e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
3857daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
3867daf1fedSAndrew Rybchenko sizeof (efx_qword_t)), \
387e948693eSPhilip Paeps ("not power of 2 aligned")); \
388e948693eSPhilip Paeps \
389e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \
390e948693eSPhilip Paeps \
391e948693eSPhilip Paeps (_eqp)->eq_u32[0] = *addr++; \
392e948693eSPhilip Paeps (_eqp)->eq_u32[1] = *addr; \
393e948693eSPhilip Paeps \
394e948693eSPhilip Paeps EFSYS_PROBE3(mem_readq, unsigned int, (_offset), \
395e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \
396e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \
397e948693eSPhilip Paeps \
398e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
399e948693eSPhilip Paeps } while (B_FALSE)
4000f999687SAndrew Rybchenko #endif
401e948693eSPhilip Paeps
4020f999687SAndrew Rybchenko #if defined(__x86_64__)
4030f999687SAndrew Rybchenko #define EFSYS_MEM_READO(_esmp, _offset, _eop) \
4040f999687SAndrew Rybchenko do { \
4050f999687SAndrew Rybchenko uint64_t *addr; \
4060f999687SAndrew Rybchenko \
4070f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
4087daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
4097daf1fedSAndrew Rybchenko sizeof (efx_oword_t)), \
4100f999687SAndrew Rybchenko ("not power of 2 aligned")); \
4110f999687SAndrew Rybchenko \
4120f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \
4130f999687SAndrew Rybchenko \
4140f999687SAndrew Rybchenko (_eop)->eo_u64[0] = *addr++; \
4150f999687SAndrew Rybchenko (_eop)->eo_u64[1] = *addr; \
4160f999687SAndrew Rybchenko \
4170f999687SAndrew Rybchenko EFSYS_PROBE5(mem_reado, unsigned int, (_offset), \
4180f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \
4190f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \
4200f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \
4210f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \
4220f999687SAndrew Rybchenko \
4230f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
4240f999687SAndrew Rybchenko } while (B_FALSE)
4250f999687SAndrew Rybchenko #else
426e948693eSPhilip Paeps #define EFSYS_MEM_READO(_esmp, _offset, _eop) \
427e948693eSPhilip Paeps do { \
428e948693eSPhilip Paeps uint32_t *addr; \
429e948693eSPhilip Paeps \
430e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
4317daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
4327daf1fedSAndrew Rybchenko sizeof (efx_oword_t)), \
433e948693eSPhilip Paeps ("not power of 2 aligned")); \
434e948693eSPhilip Paeps \
435e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \
436e948693eSPhilip Paeps \
437e948693eSPhilip Paeps (_eop)->eo_u32[0] = *addr++; \
438e948693eSPhilip Paeps (_eop)->eo_u32[1] = *addr++; \
439e948693eSPhilip Paeps (_eop)->eo_u32[2] = *addr++; \
440e948693eSPhilip Paeps (_eop)->eo_u32[3] = *addr; \
441e948693eSPhilip Paeps \
442e948693eSPhilip Paeps EFSYS_PROBE5(mem_reado, unsigned int, (_offset), \
443e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \
444e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \
445e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \
446e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \
447e948693eSPhilip Paeps \
448e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
449e948693eSPhilip Paeps } while (B_FALSE)
4500f999687SAndrew Rybchenko #endif
451e948693eSPhilip Paeps
452e948693eSPhilip Paeps #define EFSYS_MEM_WRITED(_esmp, _offset, _edp) \
453e948693eSPhilip Paeps do { \
454e948693eSPhilip Paeps uint32_t *addr; \
455e948693eSPhilip Paeps \
456e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
4577daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
4587daf1fedSAndrew Rybchenko sizeof (efx_dword_t)), \
459e948693eSPhilip Paeps ("not power of 2 aligned")); \
460e948693eSPhilip Paeps \
461e948693eSPhilip Paeps EFSYS_PROBE2(mem_writed, unsigned int, (_offset), \
462e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \
463e948693eSPhilip Paeps \
464e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \
465e948693eSPhilip Paeps \
466e948693eSPhilip Paeps *addr = (_edp)->ed_u32[0]; \
467e948693eSPhilip Paeps \
468e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
469e948693eSPhilip Paeps } while (B_FALSE)
470e948693eSPhilip Paeps
4710f999687SAndrew Rybchenko #if defined(__x86_64__)
4720f999687SAndrew Rybchenko #define EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp) \
4730f999687SAndrew Rybchenko do { \
4740f999687SAndrew Rybchenko uint64_t *addr; \
4750f999687SAndrew Rybchenko \
4760f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
4777daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
4787daf1fedSAndrew Rybchenko sizeof (efx_qword_t)), \
4790f999687SAndrew Rybchenko ("not power of 2 aligned")); \
4800f999687SAndrew Rybchenko \
4810f999687SAndrew Rybchenko EFSYS_PROBE3(mem_writeq, unsigned int, (_offset), \
4820f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \
4830f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \
4840f999687SAndrew Rybchenko \
4850f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \
4860f999687SAndrew Rybchenko \
4870f999687SAndrew Rybchenko *addr = (_eqp)->eq_u64[0]; \
4880f999687SAndrew Rybchenko \
4890f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
4900f999687SAndrew Rybchenko } while (B_FALSE)
4910f999687SAndrew Rybchenko
4920f999687SAndrew Rybchenko #else
493e948693eSPhilip Paeps #define EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp) \
494e948693eSPhilip Paeps do { \
495e948693eSPhilip Paeps uint32_t *addr; \
496e948693eSPhilip Paeps \
497e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
4987daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
4997daf1fedSAndrew Rybchenko sizeof (efx_qword_t)), \
500e948693eSPhilip Paeps ("not power of 2 aligned")); \
501e948693eSPhilip Paeps \
502e948693eSPhilip Paeps EFSYS_PROBE3(mem_writeq, unsigned int, (_offset), \
503e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \
504e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \
505e948693eSPhilip Paeps \
506e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \
507e948693eSPhilip Paeps \
508e948693eSPhilip Paeps *addr++ = (_eqp)->eq_u32[0]; \
509e948693eSPhilip Paeps *addr = (_eqp)->eq_u32[1]; \
510e948693eSPhilip Paeps \
511e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
512e948693eSPhilip Paeps } while (B_FALSE)
5130f999687SAndrew Rybchenko #endif
514e948693eSPhilip Paeps
5150f999687SAndrew Rybchenko #if defined(__x86_64__)
5160f999687SAndrew Rybchenko #define EFSYS_MEM_WRITEO(_esmp, _offset, _eop) \
5170f999687SAndrew Rybchenko do { \
5180f999687SAndrew Rybchenko uint64_t *addr; \
5190f999687SAndrew Rybchenko \
5200f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
5217daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
5227daf1fedSAndrew Rybchenko sizeof (efx_oword_t)), \
5230f999687SAndrew Rybchenko ("not power of 2 aligned")); \
5240f999687SAndrew Rybchenko \
5250f999687SAndrew Rybchenko EFSYS_PROBE5(mem_writeo, unsigned int, (_offset), \
5260f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \
5270f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \
5280f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \
5290f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \
5300f999687SAndrew Rybchenko \
5310f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \
5320f999687SAndrew Rybchenko \
5330f999687SAndrew Rybchenko *addr++ = (_eop)->eo_u64[0]; \
5340f999687SAndrew Rybchenko *addr = (_eop)->eo_u64[1]; \
5350f999687SAndrew Rybchenko \
5360f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
5370f999687SAndrew Rybchenko } while (B_FALSE)
5380f999687SAndrew Rybchenko #else
539e948693eSPhilip Paeps #define EFSYS_MEM_WRITEO(_esmp, _offset, _eop) \
540e948693eSPhilip Paeps do { \
541e948693eSPhilip Paeps uint32_t *addr; \
542e948693eSPhilip Paeps \
543e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
5447daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
5457daf1fedSAndrew Rybchenko sizeof (efx_oword_t)), \
546e948693eSPhilip Paeps ("not power of 2 aligned")); \
547e948693eSPhilip Paeps \
548e948693eSPhilip Paeps EFSYS_PROBE5(mem_writeo, unsigned int, (_offset), \
549e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \
550e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \
551e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \
552e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \
553e948693eSPhilip Paeps \
554e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \
555e948693eSPhilip Paeps \
556e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[0]; \
557e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[1]; \
558e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[2]; \
559e948693eSPhilip Paeps *addr = (_eop)->eo_u32[3]; \
560e948693eSPhilip Paeps \
561e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
562e948693eSPhilip Paeps } while (B_FALSE)
5630f999687SAndrew Rybchenko #endif
564e948693eSPhilip Paeps
565e948693eSPhilip Paeps /* BAR */
566e948693eSPhilip Paeps
56733d45dc5SAndrew Rybchenko #define SFXGE_LOCK_NAME_MAX 16
56833d45dc5SAndrew Rybchenko
569e948693eSPhilip Paeps typedef struct efsys_bar_s {
570e948693eSPhilip Paeps struct mtx esb_lock;
57133d45dc5SAndrew Rybchenko char esb_lock_name[SFXGE_LOCK_NAME_MAX];
572e948693eSPhilip Paeps bus_space_tag_t esb_tag;
573e948693eSPhilip Paeps bus_space_handle_t esb_handle;
574e948693eSPhilip Paeps int esb_rid;
575e948693eSPhilip Paeps struct resource *esb_res;
576e948693eSPhilip Paeps } efsys_bar_t;
577e948693eSPhilip Paeps
57833d45dc5SAndrew Rybchenko #define SFXGE_BAR_LOCK_INIT(_esbp, _ifname) \
57933d45dc5SAndrew Rybchenko do { \
58033d45dc5SAndrew Rybchenko snprintf((_esbp)->esb_lock_name, \
58133d45dc5SAndrew Rybchenko sizeof((_esbp)->esb_lock_name), \
58233d45dc5SAndrew Rybchenko "%s:bar", (_ifname)); \
58333d45dc5SAndrew Rybchenko mtx_init(&(_esbp)->esb_lock, (_esbp)->esb_lock_name, \
58433d45dc5SAndrew Rybchenko NULL, MTX_DEF); \
58533d45dc5SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
58633d45dc5SAndrew Rybchenko } while (B_FALSE)
587763cab71SAndrew Rybchenko #define SFXGE_BAR_LOCK_DESTROY(_esbp) \
588763cab71SAndrew Rybchenko mtx_destroy(&(_esbp)->esb_lock)
589763cab71SAndrew Rybchenko #define SFXGE_BAR_LOCK(_esbp) \
590763cab71SAndrew Rybchenko mtx_lock(&(_esbp)->esb_lock)
591763cab71SAndrew Rybchenko #define SFXGE_BAR_UNLOCK(_esbp) \
592763cab71SAndrew Rybchenko mtx_unlock(&(_esbp)->esb_lock)
593763cab71SAndrew Rybchenko
594e948693eSPhilip Paeps #define EFSYS_BAR_READD(_esbp, _offset, _edp, _lock) \
595e948693eSPhilip Paeps do { \
596e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
5977daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
5987daf1fedSAndrew Rybchenko sizeof (efx_dword_t)), \
599e948693eSPhilip Paeps ("not power of 2 aligned")); \
600e948693eSPhilip Paeps \
601e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
602e948693eSPhilip Paeps if (_lock) \
603763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \
604e948693eSPhilip Paeps \
605d9ff48abSAndrew Rybchenko (_edp)->ed_u32[0] = bus_space_read_stream_4( \
606d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \
607d9ff48abSAndrew Rybchenko (_offset)); \
608e948693eSPhilip Paeps \
609e948693eSPhilip Paeps EFSYS_PROBE2(bar_readd, unsigned int, (_offset), \
610e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \
611e948693eSPhilip Paeps \
612e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
613e948693eSPhilip Paeps if (_lock) \
614763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \
615e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
616e948693eSPhilip Paeps } while (B_FALSE)
617e948693eSPhilip Paeps
6185dadbb64SAndrew Rybchenko #if defined(SFXGE_USE_BUS_SPACE_8)
619e948693eSPhilip Paeps #define EFSYS_BAR_READQ(_esbp, _offset, _eqp) \
620e948693eSPhilip Paeps do { \
621e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
6227daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
6237daf1fedSAndrew Rybchenko sizeof (efx_qword_t)), \
624e948693eSPhilip Paeps ("not power of 2 aligned")); \
625e948693eSPhilip Paeps \
626763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \
627e948693eSPhilip Paeps \
628d9ff48abSAndrew Rybchenko (_eqp)->eq_u64[0] = bus_space_read_stream_8( \
629d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \
630d9ff48abSAndrew Rybchenko (_offset)); \
6310f999687SAndrew Rybchenko \
6320f999687SAndrew Rybchenko EFSYS_PROBE3(bar_readq, unsigned int, (_offset), \
6330f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \
6340f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \
6350f999687SAndrew Rybchenko \
636687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \
6370f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
6380f999687SAndrew Rybchenko } while (B_FALSE)
6390f999687SAndrew Rybchenko
6400f999687SAndrew Rybchenko #define EFSYS_BAR_READO(_esbp, _offset, _eop, _lock) \
6410f999687SAndrew Rybchenko do { \
6420f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
6437daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
6447daf1fedSAndrew Rybchenko sizeof (efx_oword_t)), \
6450f999687SAndrew Rybchenko ("not power of 2 aligned")); \
6460f999687SAndrew Rybchenko \
6470f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
6480f999687SAndrew Rybchenko if (_lock) \
649687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \
6500f999687SAndrew Rybchenko \
651d9ff48abSAndrew Rybchenko (_eop)->eo_u64[0] = bus_space_read_stream_8( \
652d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \
653d9ff48abSAndrew Rybchenko (_offset)); \
654d9ff48abSAndrew Rybchenko (_eop)->eo_u64[1] = bus_space_read_stream_8( \
655d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \
656d9ff48abSAndrew Rybchenko (_offset) + 8); \
6570f999687SAndrew Rybchenko \
6580f999687SAndrew Rybchenko EFSYS_PROBE5(bar_reado, unsigned int, (_offset), \
6590f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \
6600f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \
6610f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \
6620f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \
6630f999687SAndrew Rybchenko \
6640f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
6650f999687SAndrew Rybchenko if (_lock) \
666687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \
6670f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
6680f999687SAndrew Rybchenko } while (B_FALSE)
6690f999687SAndrew Rybchenko
6700f999687SAndrew Rybchenko #else
6710f999687SAndrew Rybchenko #define EFSYS_BAR_READQ(_esbp, _offset, _eqp) \
6720f999687SAndrew Rybchenko do { \
6730f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
6747daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
6757daf1fedSAndrew Rybchenko sizeof (efx_qword_t)), \
6760f999687SAndrew Rybchenko ("not power of 2 aligned")); \
6770f999687SAndrew Rybchenko \
678687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \
6790f999687SAndrew Rybchenko \
680d9ff48abSAndrew Rybchenko (_eqp)->eq_u32[0] = bus_space_read_stream_4( \
681d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \
682d9ff48abSAndrew Rybchenko (_offset)); \
683d9ff48abSAndrew Rybchenko (_eqp)->eq_u32[1] = bus_space_read_stream_4( \
684d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \
685d9ff48abSAndrew Rybchenko (_offset) + 4); \
686e948693eSPhilip Paeps \
687e948693eSPhilip Paeps EFSYS_PROBE3(bar_readq, unsigned int, (_offset), \
688e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \
689e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \
690e948693eSPhilip Paeps \
691763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \
692e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
693e948693eSPhilip Paeps } while (B_FALSE)
694e948693eSPhilip Paeps
695e948693eSPhilip Paeps #define EFSYS_BAR_READO(_esbp, _offset, _eop, _lock) \
696e948693eSPhilip Paeps do { \
697e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
6987daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
6997daf1fedSAndrew Rybchenko sizeof (efx_oword_t)), \
700e948693eSPhilip Paeps ("not power of 2 aligned")); \
701e948693eSPhilip Paeps \
702e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
703e948693eSPhilip Paeps if (_lock) \
704763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \
705e948693eSPhilip Paeps \
706d9ff48abSAndrew Rybchenko (_eop)->eo_u32[0] = bus_space_read_stream_4( \
707d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \
708d9ff48abSAndrew Rybchenko (_offset)); \
709d9ff48abSAndrew Rybchenko (_eop)->eo_u32[1] = bus_space_read_stream_4( \
710d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \
711d9ff48abSAndrew Rybchenko (_offset) + 4); \
712d9ff48abSAndrew Rybchenko (_eop)->eo_u32[2] = bus_space_read_stream_4( \
713d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \
714d9ff48abSAndrew Rybchenko (_offset) + 8); \
715d9ff48abSAndrew Rybchenko (_eop)->eo_u32[3] = bus_space_read_stream_4( \
716d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \
717d9ff48abSAndrew Rybchenko (_offset) + 12); \
718e948693eSPhilip Paeps \
719e948693eSPhilip Paeps EFSYS_PROBE5(bar_reado, unsigned int, (_offset), \
720e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \
721e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \
722e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \
723e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \
724e948693eSPhilip Paeps \
725e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
726e948693eSPhilip Paeps if (_lock) \
727763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \
728e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
729e948693eSPhilip Paeps } while (B_FALSE)
7300f999687SAndrew Rybchenko #endif
731e948693eSPhilip Paeps
732e948693eSPhilip Paeps #define EFSYS_BAR_WRITED(_esbp, _offset, _edp, _lock) \
733e948693eSPhilip Paeps do { \
734e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
7357daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
7367daf1fedSAndrew Rybchenko sizeof (efx_dword_t)), \
737e948693eSPhilip Paeps ("not power of 2 aligned")); \
738e948693eSPhilip Paeps \
739e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
740e948693eSPhilip Paeps if (_lock) \
741763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \
742e948693eSPhilip Paeps \
743e948693eSPhilip Paeps EFSYS_PROBE2(bar_writed, unsigned int, (_offset), \
744e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \
745e948693eSPhilip Paeps \
7461cc8febfSAndrew Rybchenko /* \
7471cc8febfSAndrew Rybchenko * Make sure that previous writes to the dword have \
7481cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \
7491cc8febfSAndrew Rybchenko * after the write below. \
7501cc8febfSAndrew Rybchenko */ \
7511cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
7521cc8febfSAndrew Rybchenko (_offset), sizeof (efx_dword_t), \
7531cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \
754d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \
755d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \
756e948693eSPhilip Paeps (_offset), (_edp)->ed_u32[0]); \
757e948693eSPhilip Paeps \
758e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
759e948693eSPhilip Paeps if (_lock) \
760763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \
761e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
762e948693eSPhilip Paeps } while (B_FALSE)
763e948693eSPhilip Paeps
7645dadbb64SAndrew Rybchenko #if defined(SFXGE_USE_BUS_SPACE_8)
765e948693eSPhilip Paeps #define EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp) \
766e948693eSPhilip Paeps do { \
767e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
7687daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
7697daf1fedSAndrew Rybchenko sizeof (efx_qword_t)), \
770e948693eSPhilip Paeps ("not power of 2 aligned")); \
771e948693eSPhilip Paeps \
772763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \
773e948693eSPhilip Paeps \
774e948693eSPhilip Paeps EFSYS_PROBE3(bar_writeq, unsigned int, (_offset), \
775e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \
776e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \
777e948693eSPhilip Paeps \
7781cc8febfSAndrew Rybchenko /* \
7791cc8febfSAndrew Rybchenko * Make sure that previous writes to the qword have \
7801cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \
7811cc8febfSAndrew Rybchenko * after the write below. \
7821cc8febfSAndrew Rybchenko */ \
7831cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
7841cc8febfSAndrew Rybchenko (_offset), sizeof (efx_qword_t), \
7851cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \
786d9ff48abSAndrew Rybchenko bus_space_write_stream_8((_esbp)->esb_tag, \
787d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \
7880f999687SAndrew Rybchenko (_offset), (_eqp)->eq_u64[0]); \
7890f999687SAndrew Rybchenko \
790687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \
7910f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
7920f999687SAndrew Rybchenko } while (B_FALSE)
7930f999687SAndrew Rybchenko #else
7940f999687SAndrew Rybchenko #define EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp) \
7950f999687SAndrew Rybchenko do { \
7960f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
7977daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
7987daf1fedSAndrew Rybchenko sizeof (efx_qword_t)), \
7990f999687SAndrew Rybchenko ("not power of 2 aligned")); \
8000f999687SAndrew Rybchenko \
801687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \
8020f999687SAndrew Rybchenko \
8030f999687SAndrew Rybchenko EFSYS_PROBE3(bar_writeq, unsigned int, (_offset), \
8040f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \
8050f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \
8060f999687SAndrew Rybchenko \
8071cc8febfSAndrew Rybchenko /* \
8081cc8febfSAndrew Rybchenko * Make sure that previous writes to the qword have \
8091cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \
8101cc8febfSAndrew Rybchenko * after the last write below. \
8111cc8febfSAndrew Rybchenko */ \
8121cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
8131cc8febfSAndrew Rybchenko (_offset), sizeof (efx_qword_t), \
8141cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \
815d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \
816d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \
817e948693eSPhilip Paeps (_offset), (_eqp)->eq_u32[0]); \
8181cc8febfSAndrew Rybchenko /* \
8191cc8febfSAndrew Rybchenko * It should be guaranteed that the last dword comes \
8201cc8febfSAndrew Rybchenko * the last, so barrier entire qword to be sure that \
8211cc8febfSAndrew Rybchenko * neither above nor below writes are reordered. \
8221cc8febfSAndrew Rybchenko */ \
8231cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
8241cc8febfSAndrew Rybchenko (_offset), sizeof (efx_qword_t), \
8251cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \
826d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \
827d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \
828d9ff48abSAndrew Rybchenko (_offset) + 4, (_eqp)->eq_u32[1]); \
829e948693eSPhilip Paeps \
830763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \
831e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
832e948693eSPhilip Paeps } while (B_FALSE)
8330f999687SAndrew Rybchenko #endif
834e948693eSPhilip Paeps
8353c838a9fSAndrew Rybchenko /*
8363c838a9fSAndrew Rybchenko * Guarantees 64bit aligned 64bit writes to write combined BAR mapping
8373c838a9fSAndrew Rybchenko * (required by PIO hardware)
8383c838a9fSAndrew Rybchenko */
8393c838a9fSAndrew Rybchenko #define EFSYS_BAR_WC_WRITEQ(_esbp, _offset, _eqp) \
8403c838a9fSAndrew Rybchenko do { \
8413c838a9fSAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
8427daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
8437daf1fedSAndrew Rybchenko sizeof (efx_qword_t)), \
8443c838a9fSAndrew Rybchenko ("not power of 2 aligned")); \
8453c838a9fSAndrew Rybchenko \
8463c838a9fSAndrew Rybchenko (void) (_esbp); \
847a79731b9SDimitry Andric (void) (_eqp); \
8483c838a9fSAndrew Rybchenko \
8493c838a9fSAndrew Rybchenko /* FIXME: Perform a 64-bit write */ \
8503c838a9fSAndrew Rybchenko KASSERT(0, ("not implemented")); \
8513c838a9fSAndrew Rybchenko \
8523c838a9fSAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
8533c838a9fSAndrew Rybchenko } while (B_FALSE)
8543c838a9fSAndrew Rybchenko
8555dadbb64SAndrew Rybchenko #if defined(SFXGE_USE_BUS_SPACE_8)
856e948693eSPhilip Paeps #define EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock) \
857e948693eSPhilip Paeps do { \
858e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
8597daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
8607daf1fedSAndrew Rybchenko sizeof (efx_oword_t)), \
861e948693eSPhilip Paeps ("not power of 2 aligned")); \
862e948693eSPhilip Paeps \
863e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
864e948693eSPhilip Paeps if (_lock) \
865763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \
866e948693eSPhilip Paeps \
867e948693eSPhilip Paeps EFSYS_PROBE5(bar_writeo, unsigned int, (_offset), \
868e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \
869e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \
870e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \
871e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \
872e948693eSPhilip Paeps \
8731cc8febfSAndrew Rybchenko /* \
8741cc8febfSAndrew Rybchenko * Make sure that previous writes to the oword have \
8751cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \
8761cc8febfSAndrew Rybchenko * after the last write below. \
8771cc8febfSAndrew Rybchenko */ \
8781cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
8791cc8febfSAndrew Rybchenko (_offset), sizeof (efx_oword_t), \
8801cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \
881d9ff48abSAndrew Rybchenko bus_space_write_stream_8((_esbp)->esb_tag, \
882d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \
8830f999687SAndrew Rybchenko (_offset), (_eop)->eo_u64[0]); \
8841cc8febfSAndrew Rybchenko /* \
8851cc8febfSAndrew Rybchenko * It should be guaranteed that the last qword comes \
8861cc8febfSAndrew Rybchenko * the last, so barrier entire oword to be sure that \
8871cc8febfSAndrew Rybchenko * neither above nor below writes are reordered. \
8881cc8febfSAndrew Rybchenko */ \
8891cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
8901cc8febfSAndrew Rybchenko (_offset), sizeof (efx_oword_t), \
8911cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \
892d9ff48abSAndrew Rybchenko bus_space_write_stream_8((_esbp)->esb_tag, \
893d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \
894d9ff48abSAndrew Rybchenko (_offset) + 8, (_eop)->eo_u64[1]); \
8950f999687SAndrew Rybchenko \
8960f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
8970f999687SAndrew Rybchenko if (_lock) \
898687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \
8990f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
9000f999687SAndrew Rybchenko } while (B_FALSE)
9010f999687SAndrew Rybchenko
9020f999687SAndrew Rybchenko #else
9030f999687SAndrew Rybchenko #define EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock) \
9040f999687SAndrew Rybchenko do { \
9050f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
9067daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \
9077daf1fedSAndrew Rybchenko sizeof (efx_oword_t)), \
9080f999687SAndrew Rybchenko ("not power of 2 aligned")); \
9090f999687SAndrew Rybchenko \
9100f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
9110f999687SAndrew Rybchenko if (_lock) \
912687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \
9130f999687SAndrew Rybchenko \
9140f999687SAndrew Rybchenko EFSYS_PROBE5(bar_writeo, unsigned int, (_offset), \
9150f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \
9160f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \
9170f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \
9180f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \
9190f999687SAndrew Rybchenko \
9201cc8febfSAndrew Rybchenko /* \
9211cc8febfSAndrew Rybchenko * Make sure that previous writes to the oword have \
9221cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \
9231cc8febfSAndrew Rybchenko * after the last write below. \
9241cc8febfSAndrew Rybchenko */ \
9251cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
9261cc8febfSAndrew Rybchenko (_offset), sizeof (efx_oword_t), \
9271cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \
928d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \
929d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \
930e948693eSPhilip Paeps (_offset), (_eop)->eo_u32[0]); \
931d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \
932d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \
933d9ff48abSAndrew Rybchenko (_offset) + 4, (_eop)->eo_u32[1]); \
934d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \
935d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \
936d9ff48abSAndrew Rybchenko (_offset) + 8, (_eop)->eo_u32[2]); \
9371cc8febfSAndrew Rybchenko /* \
9381cc8febfSAndrew Rybchenko * It should be guaranteed that the last dword comes \
9391cc8febfSAndrew Rybchenko * the last, so barrier entire oword to be sure that \
9401cc8febfSAndrew Rybchenko * neither above nor below writes are reordered. \
9411cc8febfSAndrew Rybchenko */ \
9421cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\
9431cc8febfSAndrew Rybchenko (_offset), sizeof (efx_oword_t), \
9441cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \
945d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \
946d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \
947d9ff48abSAndrew Rybchenko (_offset) + 12, (_eop)->eo_u32[3]); \
948e948693eSPhilip Paeps \
949e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
950e948693eSPhilip Paeps if (_lock) \
951763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \
952e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
953e948693eSPhilip Paeps } while (B_FALSE)
9540f999687SAndrew Rybchenko #endif
955e948693eSPhilip Paeps
9563c838a9fSAndrew Rybchenko /* Use the standard octo-word write for doorbell writes */
9573c838a9fSAndrew Rybchenko #define EFSYS_BAR_DOORBELL_WRITEO(_esbp, _offset, _eop) \
9583c838a9fSAndrew Rybchenko do { \
9593c838a9fSAndrew Rybchenko EFSYS_BAR_WRITEO((_esbp), (_offset), (_eop), B_FALSE); \
9603c838a9fSAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
9613c838a9fSAndrew Rybchenko } while (B_FALSE)
9623c838a9fSAndrew Rybchenko
963e948693eSPhilip Paeps /* SPIN */
964e948693eSPhilip Paeps
965e948693eSPhilip Paeps #define EFSYS_SPIN(_us) \
966e948693eSPhilip Paeps do { \
967e948693eSPhilip Paeps DELAY(_us); \
968e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
969e948693eSPhilip Paeps } while (B_FALSE)
970e948693eSPhilip Paeps
971e948693eSPhilip Paeps #define EFSYS_SLEEP EFSYS_SPIN
972e948693eSPhilip Paeps
973e948693eSPhilip Paeps /* BARRIERS */
974e948693eSPhilip Paeps
9757c00963aSAndrew Rybchenko #define EFSYS_MEM_READ_BARRIER() rmb()
976e948693eSPhilip Paeps #define EFSYS_PIO_WRITE_BARRIER()
977e948693eSPhilip Paeps
9783c838a9fSAndrew Rybchenko /* DMA SYNC */
9793c838a9fSAndrew Rybchenko #define EFSYS_DMA_SYNC_FOR_KERNEL(_esmp, _offset, _size) \
9803c838a9fSAndrew Rybchenko do { \
9813c838a9fSAndrew Rybchenko bus_dmamap_sync((_esmp)->esm_tag, \
9823c838a9fSAndrew Rybchenko (_esmp)->esm_map, \
9833c838a9fSAndrew Rybchenko BUS_DMASYNC_POSTREAD); \
9843c838a9fSAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
9853c838a9fSAndrew Rybchenko } while (B_FALSE)
9863c838a9fSAndrew Rybchenko
9873c838a9fSAndrew Rybchenko #define EFSYS_DMA_SYNC_FOR_DEVICE(_esmp, _offset, _size) \
9883c838a9fSAndrew Rybchenko do { \
9893c838a9fSAndrew Rybchenko bus_dmamap_sync((_esmp)->esm_tag, \
9903c838a9fSAndrew Rybchenko (_esmp)->esm_map, \
9913c838a9fSAndrew Rybchenko BUS_DMASYNC_PREWRITE); \
9923c838a9fSAndrew Rybchenko _NOTE(CONSTANTCONDITION) \
9933c838a9fSAndrew Rybchenko } while (B_FALSE)
9943c838a9fSAndrew Rybchenko
995e948693eSPhilip Paeps /* TIMESTAMP */
996e948693eSPhilip Paeps
997e948693eSPhilip Paeps typedef clock_t efsys_timestamp_t;
998e948693eSPhilip Paeps
999e948693eSPhilip Paeps #define EFSYS_TIMESTAMP(_usp) \
1000e948693eSPhilip Paeps do { \
1001e948693eSPhilip Paeps clock_t now; \
1002e948693eSPhilip Paeps \
1003e948693eSPhilip Paeps now = ticks; \
1004e948693eSPhilip Paeps *(_usp) = now * hz / 1000000; \
1005e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
1006e948693eSPhilip Paeps } while (B_FALSE)
1007e948693eSPhilip Paeps
1008e948693eSPhilip Paeps /* KMEM */
1009e948693eSPhilip Paeps
1010e948693eSPhilip Paeps #define EFSYS_KMEM_ALLOC(_esip, _size, _p) \
1011e948693eSPhilip Paeps do { \
1012e948693eSPhilip Paeps (_esip) = (_esip); \
101383488e18SAndrew Rybchenko /* \
101483488e18SAndrew Rybchenko * The macro is used in non-sleepable contexts, for \
101583488e18SAndrew Rybchenko * example, holding a mutex. \
101683488e18SAndrew Rybchenko */ \
101783488e18SAndrew Rybchenko (_p) = malloc((_size), M_SFXGE, M_NOWAIT|M_ZERO); \
1018e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
1019e948693eSPhilip Paeps } while (B_FALSE)
1020e948693eSPhilip Paeps
1021e948693eSPhilip Paeps #define EFSYS_KMEM_FREE(_esip, _size, _p) \
1022e948693eSPhilip Paeps do { \
1023e948693eSPhilip Paeps (void) (_esip); \
1024e948693eSPhilip Paeps (void) (_size); \
1025e948693eSPhilip Paeps free((_p), M_SFXGE); \
1026e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
1027e948693eSPhilip Paeps } while (B_FALSE)
1028e948693eSPhilip Paeps
1029e948693eSPhilip Paeps /* LOCK */
1030e948693eSPhilip Paeps
103133d45dc5SAndrew Rybchenko typedef struct efsys_lock_s {
103233d45dc5SAndrew Rybchenko struct mtx lock;
103333d45dc5SAndrew Rybchenko char lock_name[SFXGE_LOCK_NAME_MAX];
103433d45dc5SAndrew Rybchenko } efsys_lock_t;
103533d45dc5SAndrew Rybchenko
103633d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK_INIT(_eslp, _ifname, _label) \
103733d45dc5SAndrew Rybchenko do { \
103833d45dc5SAndrew Rybchenko efsys_lock_t *__eslp = (_eslp); \
103933d45dc5SAndrew Rybchenko \
104033d45dc5SAndrew Rybchenko snprintf((__eslp)->lock_name, \
104133d45dc5SAndrew Rybchenko sizeof((__eslp)->lock_name), \
104233d45dc5SAndrew Rybchenko "%s:%s", (_ifname), (_label)); \
104333d45dc5SAndrew Rybchenko mtx_init(&(__eslp)->lock, (__eslp)->lock_name, \
104433d45dc5SAndrew Rybchenko NULL, MTX_DEF); \
104533d45dc5SAndrew Rybchenko } while (B_FALSE)
104633d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK_DESTROY(_eslp) \
104733d45dc5SAndrew Rybchenko mtx_destroy(&(_eslp)->lock)
104833d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK(_eslp) \
104933d45dc5SAndrew Rybchenko mtx_lock(&(_eslp)->lock)
105033d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_UNLOCK(_eslp) \
105133d45dc5SAndrew Rybchenko mtx_unlock(&(_eslp)->lock)
105233d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK_ASSERT_OWNED(_eslp) \
105333d45dc5SAndrew Rybchenko mtx_assert(&(_eslp)->lock, MA_OWNED)
1054e948693eSPhilip Paeps
1055a98003ddSAndrew Rybchenko typedef int efsys_lock_state_t;
1056a98003ddSAndrew Rybchenko
1057e948693eSPhilip Paeps #define EFSYS_LOCK_MAGIC 0x000010c4
1058e948693eSPhilip Paeps
1059e948693eSPhilip Paeps #define EFSYS_LOCK(_lockp, _state) \
1060e948693eSPhilip Paeps do { \
106133d45dc5SAndrew Rybchenko SFXGE_EFSYS_LOCK(_lockp); \
1062e948693eSPhilip Paeps (_state) = EFSYS_LOCK_MAGIC; \
1063e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
1064e948693eSPhilip Paeps } while (B_FALSE)
1065e948693eSPhilip Paeps
1066e948693eSPhilip Paeps #define EFSYS_UNLOCK(_lockp, _state) \
1067e948693eSPhilip Paeps do { \
1068e948693eSPhilip Paeps if ((_state) != EFSYS_LOCK_MAGIC) \
1069e948693eSPhilip Paeps KASSERT(B_FALSE, ("not locked")); \
107033d45dc5SAndrew Rybchenko SFXGE_EFSYS_UNLOCK(_lockp); \
1071e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
1072e948693eSPhilip Paeps } while (B_FALSE)
1073e948693eSPhilip Paeps
1074e948693eSPhilip Paeps /* STAT */
1075e948693eSPhilip Paeps
1076e948693eSPhilip Paeps typedef uint64_t efsys_stat_t;
1077e948693eSPhilip Paeps
1078e948693eSPhilip Paeps #define EFSYS_STAT_INCR(_knp, _delta) \
1079e948693eSPhilip Paeps do { \
1080e948693eSPhilip Paeps *(_knp) += (_delta); \
1081e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
1082e948693eSPhilip Paeps } while (B_FALSE)
1083e948693eSPhilip Paeps
1084e948693eSPhilip Paeps #define EFSYS_STAT_DECR(_knp, _delta) \
1085e948693eSPhilip Paeps do { \
1086e948693eSPhilip Paeps *(_knp) -= (_delta); \
1087e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
1088e948693eSPhilip Paeps } while (B_FALSE)
1089e948693eSPhilip Paeps
1090e948693eSPhilip Paeps #define EFSYS_STAT_SET(_knp, _val) \
1091e948693eSPhilip Paeps do { \
1092e948693eSPhilip Paeps *(_knp) = (_val); \
1093e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
1094e948693eSPhilip Paeps } while (B_FALSE)
1095e948693eSPhilip Paeps
1096e948693eSPhilip Paeps #define EFSYS_STAT_SET_QWORD(_knp, _valp) \
1097e948693eSPhilip Paeps do { \
1098e948693eSPhilip Paeps *(_knp) = le64toh((_valp)->eq_u64[0]); \
1099e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
1100e948693eSPhilip Paeps } while (B_FALSE)
1101e948693eSPhilip Paeps
1102e948693eSPhilip Paeps #define EFSYS_STAT_SET_DWORD(_knp, _valp) \
1103e948693eSPhilip Paeps do { \
1104e948693eSPhilip Paeps *(_knp) = le32toh((_valp)->ed_u32[0]); \
1105e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
1106e948693eSPhilip Paeps } while (B_FALSE)
1107e948693eSPhilip Paeps
1108e948693eSPhilip Paeps #define EFSYS_STAT_INCR_QWORD(_knp, _valp) \
1109e948693eSPhilip Paeps do { \
1110e948693eSPhilip Paeps *(_knp) += le64toh((_valp)->eq_u64[0]); \
1111e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
1112e948693eSPhilip Paeps } while (B_FALSE)
1113e948693eSPhilip Paeps
1114e948693eSPhilip Paeps #define EFSYS_STAT_SUBR_QWORD(_knp, _valp) \
1115e948693eSPhilip Paeps do { \
1116e948693eSPhilip Paeps *(_knp) -= le64toh((_valp)->eq_u64[0]); \
1117e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
1118e948693eSPhilip Paeps } while (B_FALSE)
1119e948693eSPhilip Paeps
1120e948693eSPhilip Paeps /* ERR */
1121e948693eSPhilip Paeps
1122e948693eSPhilip Paeps extern void sfxge_err(efsys_identifier_t *, unsigned int,
1123e948693eSPhilip Paeps uint32_t, uint32_t);
1124e948693eSPhilip Paeps
1125e948693eSPhilip Paeps #if EFSYS_OPT_DECODE_INTR_FATAL
1126e948693eSPhilip Paeps #define EFSYS_ERR(_esip, _code, _dword0, _dword1) \
1127e948693eSPhilip Paeps do { \
1128e948693eSPhilip Paeps sfxge_err((_esip), (_code), (_dword0), (_dword1)); \
1129e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \
1130e948693eSPhilip Paeps } while (B_FALSE)
1131e948693eSPhilip Paeps #endif
1132e948693eSPhilip Paeps
1133e948693eSPhilip Paeps /* ASSERT */
1134e948693eSPhilip Paeps
1135e948693eSPhilip Paeps #define EFSYS_ASSERT(_exp) do { \
1136e948693eSPhilip Paeps if (!(_exp)) \
11373c838a9fSAndrew Rybchenko panic("%s", #_exp); \
1138e948693eSPhilip Paeps } while (0)
1139e948693eSPhilip Paeps
1140e948693eSPhilip Paeps #define EFSYS_ASSERT3(_x, _op, _y, _t) do { \
1141e948693eSPhilip Paeps const _t __x = (_t)(_x); \
1142e948693eSPhilip Paeps const _t __y = (_t)(_y); \
1143e948693eSPhilip Paeps if (!(__x _op __y)) \
1144e948693eSPhilip Paeps panic("assertion failed at %s:%u", __FILE__, __LINE__); \
1145e948693eSPhilip Paeps } while(0)
1146e948693eSPhilip Paeps
1147e948693eSPhilip Paeps #define EFSYS_ASSERT3U(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, uint64_t)
1148e948693eSPhilip Paeps #define EFSYS_ASSERT3S(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, int64_t)
1149e948693eSPhilip Paeps #define EFSYS_ASSERT3P(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, uintptr_t)
1150e948693eSPhilip Paeps
11513c838a9fSAndrew Rybchenko /* ROTATE */
11523c838a9fSAndrew Rybchenko
11533c838a9fSAndrew Rybchenko #define EFSYS_HAS_ROTL_DWORD 0
11543c838a9fSAndrew Rybchenko
1155e948693eSPhilip Paeps #ifdef __cplusplus
1156e948693eSPhilip Paeps }
1157e948693eSPhilip Paeps #endif
1158e948693eSPhilip Paeps
1159e948693eSPhilip Paeps #endif /* _SYS_EFSYS_H */
1160