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