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 97e948693eSPhilip Paeps #define ENOTACTIVE EINVAL 98e948693eSPhilip Paeps 99e948693eSPhilip Paeps /* Memory type to use on FreeBSD */ 100e948693eSPhilip Paeps MALLOC_DECLARE(M_SFXGE); 101e948693eSPhilip Paeps 102e948693eSPhilip Paeps /* Machine dependend prefetch wrappers */ 103dc1788e8SMarius Strobl #if defined(__i386__) || defined(__amd64__) 104e948693eSPhilip Paeps static __inline void 105e948693eSPhilip Paeps prefetch_read_many(void *addr) 106e948693eSPhilip Paeps { 107dc1788e8SMarius Strobl 108e948693eSPhilip Paeps __asm__( 109e948693eSPhilip Paeps "prefetcht0 (%0)" 110e948693eSPhilip Paeps : 111e948693eSPhilip Paeps : "r" (addr)); 112e948693eSPhilip Paeps } 113e948693eSPhilip Paeps 114e948693eSPhilip Paeps static __inline void 115e948693eSPhilip Paeps prefetch_read_once(void *addr) 116e948693eSPhilip Paeps { 117dc1788e8SMarius Strobl 118e948693eSPhilip Paeps __asm__( 119e948693eSPhilip Paeps "prefetchnta (%0)" 120e948693eSPhilip Paeps : 121e948693eSPhilip Paeps : "r" (addr)); 122e948693eSPhilip Paeps } 123dc1788e8SMarius Strobl #elif defined(__sparc64__) 124dc1788e8SMarius Strobl static __inline void 125dc1788e8SMarius Strobl prefetch_read_many(void *addr) 126dc1788e8SMarius Strobl { 127dc1788e8SMarius Strobl 128dc1788e8SMarius Strobl __asm__( 129dc1788e8SMarius Strobl "prefetch [%0], 0" 130dc1788e8SMarius Strobl : 131dc1788e8SMarius Strobl : "r" (addr)); 132dc1788e8SMarius Strobl } 133dc1788e8SMarius Strobl 134dc1788e8SMarius Strobl static __inline void 135dc1788e8SMarius Strobl prefetch_read_once(void *addr) 136dc1788e8SMarius Strobl { 137dc1788e8SMarius Strobl 138dc1788e8SMarius Strobl __asm__( 139dc1788e8SMarius Strobl "prefetch [%0], 1" 140dc1788e8SMarius Strobl : 141dc1788e8SMarius Strobl : "r" (addr)); 142dc1788e8SMarius Strobl } 143dc1788e8SMarius Strobl #else 144dc1788e8SMarius Strobl static __inline void 145dc1788e8SMarius Strobl prefetch_read_many(void *addr) 146dc1788e8SMarius Strobl { 147dc1788e8SMarius Strobl 148dc1788e8SMarius Strobl } 149dc1788e8SMarius Strobl 150dc1788e8SMarius Strobl static __inline void 151dc1788e8SMarius Strobl prefetch_read_once(void *addr) 152dc1788e8SMarius Strobl { 153dc1788e8SMarius Strobl 154dc1788e8SMarius Strobl } 155e948693eSPhilip Paeps #endif 156e948693eSPhilip Paeps 157e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__) 158e948693eSPhilip Paeps #include <vm/vm.h> 159e948693eSPhilip Paeps #include <vm/pmap.h> 160e948693eSPhilip Paeps #endif 161e948693eSPhilip Paeps static __inline void 162e948693eSPhilip Paeps sfxge_map_mbuf_fast(bus_dma_tag_t tag, bus_dmamap_t map, 163e948693eSPhilip Paeps struct mbuf *m, bus_dma_segment_t *seg) 164e948693eSPhilip Paeps { 165e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__) 166e948693eSPhilip Paeps seg->ds_addr = pmap_kextract(mtod(m, vm_offset_t)); 167e948693eSPhilip Paeps seg->ds_len = m->m_len; 168e948693eSPhilip Paeps #else 169e948693eSPhilip Paeps int nsegstmp; 170e948693eSPhilip Paeps 171e948693eSPhilip Paeps bus_dmamap_load_mbuf_sg(tag, map, m, seg, &nsegstmp, 0); 172e948693eSPhilip Paeps #endif 173e948693eSPhilip Paeps } 174e948693eSPhilip Paeps 175e948693eSPhilip Paeps /* Modifiers used for DOS builds */ 176e948693eSPhilip Paeps #define __cs 177e948693eSPhilip Paeps #define __far 178e948693eSPhilip Paeps 179e948693eSPhilip Paeps /* Modifiers used for Windows builds */ 180e948693eSPhilip Paeps #define __in 181e948693eSPhilip Paeps #define __in_opt 182e948693eSPhilip Paeps #define __in_ecount(_n) 183e948693eSPhilip Paeps #define __in_ecount_opt(_n) 184e948693eSPhilip Paeps #define __in_bcount(_n) 185e948693eSPhilip Paeps #define __in_bcount_opt(_n) 186e948693eSPhilip Paeps 187e948693eSPhilip Paeps #define __out 188e948693eSPhilip Paeps #define __out_opt 189e948693eSPhilip Paeps #define __out_ecount(_n) 190e948693eSPhilip Paeps #define __out_ecount_opt(_n) 191e948693eSPhilip Paeps #define __out_bcount(_n) 192e948693eSPhilip Paeps #define __out_bcount_opt(_n) 193e948693eSPhilip Paeps 194e948693eSPhilip Paeps #define __deref_out 195e948693eSPhilip Paeps 196e948693eSPhilip Paeps #define __inout 197e948693eSPhilip Paeps #define __inout_opt 198e948693eSPhilip Paeps #define __inout_ecount(_n) 199e948693eSPhilip Paeps #define __inout_ecount_opt(_n) 200e948693eSPhilip Paeps #define __inout_bcount(_n) 201e948693eSPhilip Paeps #define __inout_bcount_opt(_n) 202e948693eSPhilip Paeps #define __inout_bcount_full_opt(_n) 203e948693eSPhilip Paeps 204e948693eSPhilip Paeps #define __deref_out_bcount_opt(n) 205e948693eSPhilip Paeps 206e948693eSPhilip Paeps #define __checkReturn 207e948693eSPhilip Paeps 208e948693eSPhilip Paeps #define __drv_when(_p, _c) 209e948693eSPhilip Paeps 210e948693eSPhilip Paeps /* Code inclusion options */ 211e948693eSPhilip Paeps 212e948693eSPhilip Paeps 213e948693eSPhilip Paeps #define EFSYS_OPT_NAMES 1 214e948693eSPhilip Paeps 215e948693eSPhilip Paeps #define EFSYS_OPT_FALCON 0 216e948693eSPhilip Paeps #define EFSYS_OPT_FALCON_NIC_CFG_OVERRIDE 0 217e948693eSPhilip Paeps #define EFSYS_OPT_SIENA 1 218e948693eSPhilip Paeps #ifdef DEBUG 219e948693eSPhilip Paeps #define EFSYS_OPT_CHECK_REG 1 220e948693eSPhilip Paeps #else 221e948693eSPhilip Paeps #define EFSYS_OPT_CHECK_REG 0 222e948693eSPhilip Paeps #endif 223e948693eSPhilip Paeps 224e948693eSPhilip Paeps #define EFSYS_OPT_MCDI 1 225e948693eSPhilip Paeps 226e948693eSPhilip Paeps #define EFSYS_OPT_MAC_FALCON_GMAC 0 227e948693eSPhilip Paeps #define EFSYS_OPT_MAC_FALCON_XMAC 0 228e948693eSPhilip Paeps #define EFSYS_OPT_MAC_STATS 1 229e948693eSPhilip Paeps 230e948693eSPhilip Paeps #define EFSYS_OPT_LOOPBACK 0 231e948693eSPhilip Paeps 232e948693eSPhilip Paeps #define EFSYS_OPT_MON_NULL 0 233e948693eSPhilip Paeps #define EFSYS_OPT_MON_LM87 0 234e948693eSPhilip Paeps #define EFSYS_OPT_MON_MAX6647 0 235e948693eSPhilip Paeps #define EFSYS_OPT_MON_SIENA 0 236e948693eSPhilip Paeps #define EFSYS_OPT_MON_STATS 0 237e948693eSPhilip Paeps 238e948693eSPhilip Paeps #define EFSYS_OPT_PHY_NULL 0 239e948693eSPhilip Paeps #define EFSYS_OPT_PHY_QT2022C2 0 240e948693eSPhilip Paeps #define EFSYS_OPT_PHY_SFX7101 0 241e948693eSPhilip Paeps #define EFSYS_OPT_PHY_TXC43128 0 242e948693eSPhilip Paeps #define EFSYS_OPT_PHY_PM8358 0 243e948693eSPhilip Paeps #define EFSYS_OPT_PHY_SFT9001 0 244e948693eSPhilip Paeps #define EFSYS_OPT_PHY_QT2025C 0 245e948693eSPhilip Paeps #define EFSYS_OPT_PHY_STATS 1 246e948693eSPhilip Paeps #define EFSYS_OPT_PHY_PROPS 0 247e948693eSPhilip Paeps #define EFSYS_OPT_PHY_BIST 1 248e948693eSPhilip Paeps #define EFSYS_OPT_PHY_LED_CONTROL 1 249e948693eSPhilip Paeps #define EFSYS_OPT_PHY_FLAGS 0 250e948693eSPhilip Paeps 251e948693eSPhilip Paeps #define EFSYS_OPT_VPD 1 252e948693eSPhilip Paeps #define EFSYS_OPT_NVRAM 1 253e948693eSPhilip Paeps #define EFSYS_OPT_NVRAM_FALCON_BOOTROM 0 254e948693eSPhilip Paeps #define EFSYS_OPT_NVRAM_SFT9001 0 255e948693eSPhilip Paeps #define EFSYS_OPT_NVRAM_SFX7101 0 256e948693eSPhilip Paeps #define EFSYS_OPT_BOOTCFG 0 257e948693eSPhilip Paeps 258e948693eSPhilip Paeps #define EFSYS_OPT_PCIE_TUNE 0 259e948693eSPhilip Paeps #define EFSYS_OPT_DIAG 0 260e948693eSPhilip Paeps #define EFSYS_OPT_WOL 1 261e948693eSPhilip Paeps #define EFSYS_OPT_RX_SCALE 1 262e948693eSPhilip Paeps #define EFSYS_OPT_QSTATS 1 263e948693eSPhilip Paeps #define EFSYS_OPT_FILTER 0 264e948693eSPhilip Paeps #define EFSYS_OPT_RX_SCATTER 0 265e948693eSPhilip Paeps #define EFSYS_OPT_RX_HDR_SPLIT 0 266e948693eSPhilip Paeps 267e948693eSPhilip Paeps #define EFSYS_OPT_EV_PREFETCH 0 268e948693eSPhilip Paeps 269e948693eSPhilip Paeps #define EFSYS_OPT_DECODE_INTR_FATAL 1 270e948693eSPhilip Paeps 271e948693eSPhilip Paeps /* ID */ 272e948693eSPhilip Paeps 273e948693eSPhilip Paeps typedef struct __efsys_identifier_s efsys_identifier_t; 274e948693eSPhilip Paeps 275e948693eSPhilip Paeps /* PROBE */ 276e948693eSPhilip Paeps 27754366c0bSAttilio Rao #ifndef DTRACE_PROBE 278e948693eSPhilip Paeps 279e948693eSPhilip Paeps #define EFSYS_PROBE(_name) 280e948693eSPhilip Paeps 281e948693eSPhilip Paeps #define EFSYS_PROBE1(_name, _type1, _arg1) 282e948693eSPhilip Paeps 283e948693eSPhilip Paeps #define EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2) 284e948693eSPhilip Paeps 285e948693eSPhilip Paeps #define EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2, \ 286e948693eSPhilip Paeps _type3, _arg3) 287e948693eSPhilip Paeps 288e948693eSPhilip Paeps #define EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 289e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) 290e948693eSPhilip Paeps 291e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 292e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) 293e948693eSPhilip Paeps 294e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 295e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 296e948693eSPhilip Paeps _type6, _arg6) 297e948693eSPhilip Paeps 298e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 299e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 300e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) 301e948693eSPhilip Paeps 30254366c0bSAttilio Rao #else /* DTRACE_PROBE */ 303e948693eSPhilip Paeps 304e948693eSPhilip Paeps #define EFSYS_PROBE(_name) \ 305e948693eSPhilip Paeps DTRACE_PROBE(_name) 306e948693eSPhilip Paeps 307e948693eSPhilip Paeps #define EFSYS_PROBE1(_name, _type1, _arg1) \ 308e948693eSPhilip Paeps DTRACE_PROBE1(_name, _type1, _arg1) 309e948693eSPhilip Paeps 310e948693eSPhilip Paeps #define EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2) \ 311e948693eSPhilip Paeps DTRACE_PROBE2(_name, _type1, _arg1, _type2, _arg2) 312e948693eSPhilip Paeps 313e948693eSPhilip Paeps #define EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2, \ 314e948693eSPhilip Paeps _type3, _arg3) \ 315e948693eSPhilip Paeps DTRACE_PROBE3(_name, _type1, _arg1, _type2, _arg2, \ 316e948693eSPhilip Paeps _type3, _arg3) 317e948693eSPhilip Paeps 318e948693eSPhilip Paeps #define EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 319e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) \ 320e948693eSPhilip Paeps DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 321e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) 322e948693eSPhilip Paeps 323e948693eSPhilip Paeps #ifdef DTRACE_PROBE5 324e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 325e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) \ 326e948693eSPhilip Paeps DTRACE_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 327e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) 328e948693eSPhilip Paeps #else 329e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 330e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) \ 331e948693eSPhilip Paeps DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 332e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) 333e948693eSPhilip Paeps #endif 334e948693eSPhilip Paeps 335e948693eSPhilip Paeps #ifdef DTRACE_PROBE6 336e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 337e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 338e948693eSPhilip Paeps _type6, _arg6) \ 339e948693eSPhilip Paeps DTRACE_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 340e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 341e948693eSPhilip Paeps _type6, _arg6) 342e948693eSPhilip Paeps #else 343e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 344e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 345e948693eSPhilip Paeps _type6, _arg6) \ 346e948693eSPhilip Paeps EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 347e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) 348e948693eSPhilip Paeps #endif 349e948693eSPhilip Paeps 350e948693eSPhilip Paeps #ifdef DTRACE_PROBE7 351e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 352e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 353e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) \ 354e948693eSPhilip Paeps DTRACE_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 355e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 356e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) 357e948693eSPhilip Paeps #else 358e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 359e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 360e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) \ 361e948693eSPhilip Paeps EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 362e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 363e948693eSPhilip Paeps _type6, _arg6) 364e948693eSPhilip Paeps #endif 365e948693eSPhilip Paeps 36654366c0bSAttilio Rao #endif /* DTRACE_PROBE */ 367e948693eSPhilip Paeps 368e948693eSPhilip Paeps /* DMA */ 369e948693eSPhilip Paeps 370e948693eSPhilip Paeps typedef uint64_t efsys_dma_addr_t; 371e948693eSPhilip Paeps 372e948693eSPhilip Paeps typedef struct efsys_mem_s { 373e948693eSPhilip Paeps bus_dma_tag_t esm_tag; 374e948693eSPhilip Paeps bus_dmamap_t esm_map; 375e948693eSPhilip Paeps caddr_t esm_base; 376e948693eSPhilip Paeps efsys_dma_addr_t esm_addr; 377e948693eSPhilip Paeps } efsys_mem_t; 378e948693eSPhilip Paeps 379e948693eSPhilip Paeps 380e948693eSPhilip Paeps #define EFSYS_MEM_ZERO(_esmp, _size) \ 381e948693eSPhilip Paeps do { \ 382e948693eSPhilip Paeps (void) memset((_esmp)->esm_base, 0, (_size)); \ 383e948693eSPhilip Paeps \ 384e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 385e948693eSPhilip Paeps } while (B_FALSE) 386e948693eSPhilip Paeps 387e948693eSPhilip Paeps #define EFSYS_MEM_READD(_esmp, _offset, _edp) \ 388e948693eSPhilip Paeps do { \ 389e948693eSPhilip Paeps uint32_t *addr; \ 390e948693eSPhilip Paeps \ 391e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 392e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 393e948693eSPhilip Paeps ("not power of 2 aligned")); \ 394e948693eSPhilip Paeps \ 395e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 396e948693eSPhilip Paeps \ 397e948693eSPhilip Paeps (_edp)->ed_u32[0] = *addr; \ 398e948693eSPhilip Paeps \ 399e948693eSPhilip Paeps EFSYS_PROBE2(mem_readd, unsigned int, (_offset), \ 400e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 401e948693eSPhilip Paeps \ 402e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 403e948693eSPhilip Paeps } while (B_FALSE) 404e948693eSPhilip Paeps 4050f999687SAndrew Rybchenko #if defined(__x86_64__) 4060f999687SAndrew Rybchenko #define EFSYS_MEM_READQ(_esmp, _offset, _eqp) \ 4070f999687SAndrew Rybchenko do { \ 4080f999687SAndrew Rybchenko uint64_t *addr; \ 4090f999687SAndrew Rybchenko \ 4100f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 4110f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 4120f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 4130f999687SAndrew Rybchenko \ 4140f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \ 4150f999687SAndrew Rybchenko \ 4160f999687SAndrew Rybchenko (_eqp)->eq_u64[0] = *addr; \ 4170f999687SAndrew Rybchenko \ 4180f999687SAndrew Rybchenko EFSYS_PROBE3(mem_readq, unsigned int, (_offset), \ 4190f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 4200f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 4210f999687SAndrew Rybchenko \ 4220f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 4230f999687SAndrew Rybchenko } while (B_FALSE) 4240f999687SAndrew Rybchenko #else 425e948693eSPhilip Paeps #define EFSYS_MEM_READQ(_esmp, _offset, _eqp) \ 426e948693eSPhilip Paeps do { \ 427e948693eSPhilip Paeps uint32_t *addr; \ 428e948693eSPhilip Paeps \ 429e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 430e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 431e948693eSPhilip Paeps ("not power of 2 aligned")); \ 432e948693eSPhilip Paeps \ 433e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 434e948693eSPhilip Paeps \ 435e948693eSPhilip Paeps (_eqp)->eq_u32[0] = *addr++; \ 436e948693eSPhilip Paeps (_eqp)->eq_u32[1] = *addr; \ 437e948693eSPhilip Paeps \ 438e948693eSPhilip Paeps EFSYS_PROBE3(mem_readq, unsigned int, (_offset), \ 439e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 440e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 441e948693eSPhilip Paeps \ 442e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 443e948693eSPhilip Paeps } while (B_FALSE) 4440f999687SAndrew Rybchenko #endif 445e948693eSPhilip Paeps 4460f999687SAndrew Rybchenko #if defined(__x86_64__) 4470f999687SAndrew Rybchenko #define EFSYS_MEM_READO(_esmp, _offset, _eop) \ 4480f999687SAndrew Rybchenko do { \ 4490f999687SAndrew Rybchenko uint64_t *addr; \ 4500f999687SAndrew Rybchenko \ 4510f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 4520f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 4530f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 4540f999687SAndrew Rybchenko \ 4550f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \ 4560f999687SAndrew Rybchenko \ 4570f999687SAndrew Rybchenko (_eop)->eo_u64[0] = *addr++; \ 4580f999687SAndrew Rybchenko (_eop)->eo_u64[1] = *addr; \ 4590f999687SAndrew Rybchenko \ 4600f999687SAndrew Rybchenko EFSYS_PROBE5(mem_reado, unsigned int, (_offset), \ 4610f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 4620f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 4630f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 4640f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 4650f999687SAndrew Rybchenko \ 4660f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 4670f999687SAndrew Rybchenko } while (B_FALSE) 4680f999687SAndrew Rybchenko #else 469e948693eSPhilip Paeps #define EFSYS_MEM_READO(_esmp, _offset, _eop) \ 470e948693eSPhilip Paeps do { \ 471e948693eSPhilip Paeps uint32_t *addr; \ 472e948693eSPhilip Paeps \ 473e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 474e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 475e948693eSPhilip Paeps ("not power of 2 aligned")); \ 476e948693eSPhilip Paeps \ 477e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 478e948693eSPhilip Paeps \ 479e948693eSPhilip Paeps (_eop)->eo_u32[0] = *addr++; \ 480e948693eSPhilip Paeps (_eop)->eo_u32[1] = *addr++; \ 481e948693eSPhilip Paeps (_eop)->eo_u32[2] = *addr++; \ 482e948693eSPhilip Paeps (_eop)->eo_u32[3] = *addr; \ 483e948693eSPhilip Paeps \ 484e948693eSPhilip Paeps EFSYS_PROBE5(mem_reado, unsigned int, (_offset), \ 485e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 486e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 487e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 488e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 489e948693eSPhilip Paeps \ 490e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 491e948693eSPhilip Paeps } while (B_FALSE) 4920f999687SAndrew Rybchenko #endif 493e948693eSPhilip Paeps 494e948693eSPhilip Paeps #define EFSYS_MEM_WRITED(_esmp, _offset, _edp) \ 495e948693eSPhilip Paeps do { \ 496e948693eSPhilip Paeps uint32_t *addr; \ 497e948693eSPhilip Paeps \ 498e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 499e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 500e948693eSPhilip Paeps ("not power of 2 aligned")); \ 501e948693eSPhilip Paeps \ 502e948693eSPhilip Paeps EFSYS_PROBE2(mem_writed, unsigned int, (_offset), \ 503e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 504e948693eSPhilip Paeps \ 505e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 506e948693eSPhilip Paeps \ 507e948693eSPhilip Paeps *addr = (_edp)->ed_u32[0]; \ 508e948693eSPhilip Paeps \ 509e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 510e948693eSPhilip Paeps } while (B_FALSE) 511e948693eSPhilip Paeps 5120f999687SAndrew Rybchenko #if defined(__x86_64__) 5130f999687SAndrew Rybchenko #define EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp) \ 5140f999687SAndrew Rybchenko do { \ 5150f999687SAndrew Rybchenko uint64_t *addr; \ 5160f999687SAndrew Rybchenko \ 5170f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 5180f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 5190f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 5200f999687SAndrew Rybchenko \ 5210f999687SAndrew Rybchenko EFSYS_PROBE3(mem_writeq, unsigned int, (_offset), \ 5220f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 5230f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 5240f999687SAndrew Rybchenko \ 5250f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \ 5260f999687SAndrew Rybchenko \ 5270f999687SAndrew Rybchenko *addr = (_eqp)->eq_u64[0]; \ 5280f999687SAndrew Rybchenko \ 5290f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 5300f999687SAndrew Rybchenko } while (B_FALSE) 5310f999687SAndrew Rybchenko 5320f999687SAndrew Rybchenko #else 533e948693eSPhilip Paeps #define EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp) \ 534e948693eSPhilip Paeps do { \ 535e948693eSPhilip Paeps uint32_t *addr; \ 536e948693eSPhilip Paeps \ 537e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 538e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 539e948693eSPhilip Paeps ("not power of 2 aligned")); \ 540e948693eSPhilip Paeps \ 541e948693eSPhilip Paeps EFSYS_PROBE3(mem_writeq, unsigned int, (_offset), \ 542e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 543e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 544e948693eSPhilip Paeps \ 545e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 546e948693eSPhilip Paeps \ 547e948693eSPhilip Paeps *addr++ = (_eqp)->eq_u32[0]; \ 548e948693eSPhilip Paeps *addr = (_eqp)->eq_u32[1]; \ 549e948693eSPhilip Paeps \ 550e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 551e948693eSPhilip Paeps } while (B_FALSE) 5520f999687SAndrew Rybchenko #endif 553e948693eSPhilip Paeps 5540f999687SAndrew Rybchenko #if defined(__x86_64__) 5550f999687SAndrew Rybchenko #define EFSYS_MEM_WRITEO(_esmp, _offset, _eop) \ 5560f999687SAndrew Rybchenko do { \ 5570f999687SAndrew Rybchenko uint64_t *addr; \ 5580f999687SAndrew Rybchenko \ 5590f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 5600f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 5610f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 5620f999687SAndrew Rybchenko \ 5630f999687SAndrew Rybchenko EFSYS_PROBE5(mem_writeo, unsigned int, (_offset), \ 5640f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 5650f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 5660f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 5670f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 5680f999687SAndrew Rybchenko \ 5690f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \ 5700f999687SAndrew Rybchenko \ 5710f999687SAndrew Rybchenko *addr++ = (_eop)->eo_u64[0]; \ 5720f999687SAndrew Rybchenko *addr = (_eop)->eo_u64[1]; \ 5730f999687SAndrew Rybchenko \ 5740f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 5750f999687SAndrew Rybchenko } while (B_FALSE) 5760f999687SAndrew Rybchenko #else 577e948693eSPhilip Paeps #define EFSYS_MEM_WRITEO(_esmp, _offset, _eop) \ 578e948693eSPhilip Paeps do { \ 579e948693eSPhilip Paeps uint32_t *addr; \ 580e948693eSPhilip Paeps \ 581e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 582e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 583e948693eSPhilip Paeps ("not power of 2 aligned")); \ 584e948693eSPhilip Paeps \ 585e948693eSPhilip Paeps EFSYS_PROBE5(mem_writeo, unsigned int, (_offset), \ 586e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 587e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 588e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 589e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 590e948693eSPhilip Paeps \ 591e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 592e948693eSPhilip Paeps \ 593e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[0]; \ 594e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[1]; \ 595e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[2]; \ 596e948693eSPhilip Paeps *addr = (_eop)->eo_u32[3]; \ 597e948693eSPhilip Paeps \ 598e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 599e948693eSPhilip Paeps } while (B_FALSE) 6000f999687SAndrew Rybchenko #endif 601e948693eSPhilip Paeps 602e948693eSPhilip Paeps #define EFSYS_MEM_ADDR(_esmp) \ 603e948693eSPhilip Paeps ((_esmp)->esm_addr) 604e948693eSPhilip Paeps 605e948693eSPhilip Paeps /* BAR */ 606e948693eSPhilip Paeps 60733d45dc5SAndrew Rybchenko #define SFXGE_LOCK_NAME_MAX 16 60833d45dc5SAndrew Rybchenko 609e948693eSPhilip Paeps typedef struct efsys_bar_s { 610e948693eSPhilip Paeps struct mtx esb_lock; 61133d45dc5SAndrew Rybchenko char esb_lock_name[SFXGE_LOCK_NAME_MAX]; 612e948693eSPhilip Paeps bus_space_tag_t esb_tag; 613e948693eSPhilip Paeps bus_space_handle_t esb_handle; 614e948693eSPhilip Paeps int esb_rid; 615e948693eSPhilip Paeps struct resource *esb_res; 616e948693eSPhilip Paeps } efsys_bar_t; 617e948693eSPhilip Paeps 61833d45dc5SAndrew Rybchenko #define SFXGE_BAR_LOCK_INIT(_esbp, _ifname) \ 61933d45dc5SAndrew Rybchenko do { \ 62033d45dc5SAndrew Rybchenko snprintf((_esbp)->esb_lock_name, \ 62133d45dc5SAndrew Rybchenko sizeof((_esbp)->esb_lock_name), \ 62233d45dc5SAndrew Rybchenko "%s:bar", (_ifname)); \ 62333d45dc5SAndrew Rybchenko mtx_init(&(_esbp)->esb_lock, (_esbp)->esb_lock_name, \ 62433d45dc5SAndrew Rybchenko NULL, MTX_DEF); \ 62533d45dc5SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 62633d45dc5SAndrew Rybchenko } while (B_FALSE) 627763cab71SAndrew Rybchenko #define SFXGE_BAR_LOCK_DESTROY(_esbp) \ 628763cab71SAndrew Rybchenko mtx_destroy(&(_esbp)->esb_lock) 629763cab71SAndrew Rybchenko #define SFXGE_BAR_LOCK(_esbp) \ 630763cab71SAndrew Rybchenko mtx_lock(&(_esbp)->esb_lock) 631763cab71SAndrew Rybchenko #define SFXGE_BAR_UNLOCK(_esbp) \ 632763cab71SAndrew Rybchenko mtx_unlock(&(_esbp)->esb_lock) 633763cab71SAndrew Rybchenko 634e948693eSPhilip Paeps #define EFSYS_BAR_READD(_esbp, _offset, _edp, _lock) \ 635e948693eSPhilip Paeps do { \ 636e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 637e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 638e948693eSPhilip Paeps ("not power of 2 aligned")); \ 639e948693eSPhilip Paeps \ 640e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 641e948693eSPhilip Paeps if (_lock) \ 642763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 643e948693eSPhilip Paeps \ 644e948693eSPhilip Paeps (_edp)->ed_u32[0] = bus_space_read_4((_esbp)->esb_tag, \ 645e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset)); \ 646e948693eSPhilip Paeps \ 647e948693eSPhilip Paeps EFSYS_PROBE2(bar_readd, unsigned int, (_offset), \ 648e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 649e948693eSPhilip Paeps \ 650e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 651e948693eSPhilip Paeps if (_lock) \ 652763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 653e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 654e948693eSPhilip Paeps } while (B_FALSE) 655e948693eSPhilip Paeps 6560f999687SAndrew Rybchenko #if defined(__x86_64__) 657e948693eSPhilip Paeps #define EFSYS_BAR_READQ(_esbp, _offset, _eqp) \ 658e948693eSPhilip Paeps do { \ 659e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 660e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 661e948693eSPhilip Paeps ("not power of 2 aligned")); \ 662e948693eSPhilip Paeps \ 663763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 664e948693eSPhilip Paeps \ 6650f999687SAndrew Rybchenko (_eqp)->eq_u64[0] = bus_space_read_8((_esbp)->esb_tag, \ 6660f999687SAndrew Rybchenko (_esbp)->esb_handle, (_offset)); \ 6670f999687SAndrew Rybchenko \ 6680f999687SAndrew Rybchenko EFSYS_PROBE3(bar_readq, unsigned int, (_offset), \ 6690f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 6700f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 6710f999687SAndrew Rybchenko \ 672*687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 6730f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 6740f999687SAndrew Rybchenko } while (B_FALSE) 6750f999687SAndrew Rybchenko 6760f999687SAndrew Rybchenko #define EFSYS_BAR_READO(_esbp, _offset, _eop, _lock) \ 6770f999687SAndrew Rybchenko do { \ 6780f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 6790f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 6800f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 6810f999687SAndrew Rybchenko \ 6820f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 6830f999687SAndrew Rybchenko if (_lock) \ 684*687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 6850f999687SAndrew Rybchenko \ 6860f999687SAndrew Rybchenko (_eop)->eo_u64[0] = bus_space_read_8((_esbp)->esb_tag, \ 6870f999687SAndrew Rybchenko (_esbp)->esb_handle, (_offset)); \ 6880f999687SAndrew Rybchenko (_eop)->eo_u64[1] = bus_space_read_8((_esbp)->esb_tag, \ 6890f999687SAndrew Rybchenko (_esbp)->esb_handle, (_offset+8)); \ 6900f999687SAndrew Rybchenko \ 6910f999687SAndrew Rybchenko EFSYS_PROBE5(bar_reado, unsigned int, (_offset), \ 6920f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 6930f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 6940f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 6950f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 6960f999687SAndrew Rybchenko \ 6970f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 6980f999687SAndrew Rybchenko if (_lock) \ 699*687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 7000f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 7010f999687SAndrew Rybchenko } while (B_FALSE) 7020f999687SAndrew Rybchenko 7030f999687SAndrew Rybchenko #else 7040f999687SAndrew Rybchenko #define EFSYS_BAR_READQ(_esbp, _offset, _eqp) \ 7050f999687SAndrew Rybchenko do { \ 7060f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 7070f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 7080f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 7090f999687SAndrew Rybchenko \ 710*687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 7110f999687SAndrew Rybchenko \ 712e948693eSPhilip Paeps (_eqp)->eq_u32[0] = bus_space_read_4((_esbp)->esb_tag, \ 713e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset)); \ 714e948693eSPhilip Paeps (_eqp)->eq_u32[1] = bus_space_read_4((_esbp)->esb_tag, \ 715e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset+4)); \ 716e948693eSPhilip Paeps \ 717e948693eSPhilip Paeps EFSYS_PROBE3(bar_readq, unsigned int, (_offset), \ 718e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 719e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 720e948693eSPhilip Paeps \ 721763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 722e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 723e948693eSPhilip Paeps } while (B_FALSE) 724e948693eSPhilip Paeps 725e948693eSPhilip Paeps #define EFSYS_BAR_READO(_esbp, _offset, _eop, _lock) \ 726e948693eSPhilip Paeps do { \ 727e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 728e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 729e948693eSPhilip Paeps ("not power of 2 aligned")); \ 730e948693eSPhilip Paeps \ 731e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 732e948693eSPhilip Paeps if (_lock) \ 733763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 734e948693eSPhilip Paeps \ 735e948693eSPhilip Paeps (_eop)->eo_u32[0] = bus_space_read_4((_esbp)->esb_tag, \ 736e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset)); \ 737e948693eSPhilip Paeps (_eop)->eo_u32[1] = bus_space_read_4((_esbp)->esb_tag, \ 738e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset+4)); \ 739e948693eSPhilip Paeps (_eop)->eo_u32[2] = bus_space_read_4((_esbp)->esb_tag, \ 740e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset+8)); \ 741e948693eSPhilip Paeps (_eop)->eo_u32[3] = bus_space_read_4((_esbp)->esb_tag, \ 742e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset+12)); \ 743e948693eSPhilip Paeps \ 744e948693eSPhilip Paeps EFSYS_PROBE5(bar_reado, unsigned int, (_offset), \ 745e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 746e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 747e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 748e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 749e948693eSPhilip Paeps \ 750e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 751e948693eSPhilip Paeps if (_lock) \ 752763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 753e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 754e948693eSPhilip Paeps } while (B_FALSE) 7550f999687SAndrew Rybchenko #endif 756e948693eSPhilip Paeps 757e948693eSPhilip Paeps #define EFSYS_BAR_WRITED(_esbp, _offset, _edp, _lock) \ 758e948693eSPhilip Paeps do { \ 759e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 760e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 761e948693eSPhilip Paeps ("not power of 2 aligned")); \ 762e948693eSPhilip Paeps \ 763e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 764e948693eSPhilip Paeps if (_lock) \ 765763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 766e948693eSPhilip Paeps \ 767e948693eSPhilip Paeps EFSYS_PROBE2(bar_writed, unsigned int, (_offset), \ 768e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 769e948693eSPhilip Paeps \ 770e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 771e948693eSPhilip Paeps (_offset), (_edp)->ed_u32[0]); \ 772e948693eSPhilip Paeps \ 773e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 774e948693eSPhilip Paeps if (_lock) \ 775763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 776e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 777e948693eSPhilip Paeps } while (B_FALSE) 778e948693eSPhilip Paeps 7790f999687SAndrew Rybchenko #if defined(__x86_64__) 780e948693eSPhilip Paeps #define EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp) \ 781e948693eSPhilip Paeps do { \ 782e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 783e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 784e948693eSPhilip Paeps ("not power of 2 aligned")); \ 785e948693eSPhilip Paeps \ 786763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 787e948693eSPhilip Paeps \ 788e948693eSPhilip Paeps EFSYS_PROBE3(bar_writeq, unsigned int, (_offset), \ 789e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 790e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 791e948693eSPhilip Paeps \ 7920f999687SAndrew Rybchenko bus_space_write_8((_esbp)->esb_tag, (_esbp)->esb_handle,\ 7930f999687SAndrew Rybchenko (_offset), (_eqp)->eq_u64[0]); \ 7940f999687SAndrew Rybchenko \ 795*687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 7960f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 7970f999687SAndrew Rybchenko } while (B_FALSE) 7980f999687SAndrew Rybchenko #else 7990f999687SAndrew Rybchenko #define EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp) \ 8000f999687SAndrew Rybchenko do { \ 8010f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 8020f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 8030f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 8040f999687SAndrew Rybchenko \ 805*687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 8060f999687SAndrew Rybchenko \ 8070f999687SAndrew Rybchenko EFSYS_PROBE3(bar_writeq, unsigned int, (_offset), \ 8080f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 8090f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 8100f999687SAndrew Rybchenko \ 811e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 812e948693eSPhilip Paeps (_offset), (_eqp)->eq_u32[0]); \ 813e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 814e948693eSPhilip Paeps (_offset+4), (_eqp)->eq_u32[1]); \ 815e948693eSPhilip Paeps \ 816763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 817e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 818e948693eSPhilip Paeps } while (B_FALSE) 8190f999687SAndrew Rybchenko #endif 820e948693eSPhilip Paeps 8210f999687SAndrew Rybchenko #if defined(__x86_64__) 822e948693eSPhilip Paeps #define EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock) \ 823e948693eSPhilip Paeps do { \ 824e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 825e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 826e948693eSPhilip Paeps ("not power of 2 aligned")); \ 827e948693eSPhilip Paeps \ 828e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 829e948693eSPhilip Paeps if (_lock) \ 830763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 831e948693eSPhilip Paeps \ 832e948693eSPhilip Paeps EFSYS_PROBE5(bar_writeo, unsigned int, (_offset), \ 833e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 834e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 835e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 836e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 837e948693eSPhilip Paeps \ 8380f999687SAndrew Rybchenko bus_space_write_8((_esbp)->esb_tag, (_esbp)->esb_handle,\ 8390f999687SAndrew Rybchenko (_offset), (_eop)->eo_u64[0]); \ 8400f999687SAndrew Rybchenko bus_space_write_8((_esbp)->esb_tag, (_esbp)->esb_handle,\ 8410f999687SAndrew Rybchenko (_offset+8), (_eop)->eo_u64[1]); \ 8420f999687SAndrew Rybchenko \ 8430f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 8440f999687SAndrew Rybchenko if (_lock) \ 845*687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 8460f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 8470f999687SAndrew Rybchenko } while (B_FALSE) 8480f999687SAndrew Rybchenko 8490f999687SAndrew Rybchenko #else 8500f999687SAndrew Rybchenko #define EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock) \ 8510f999687SAndrew Rybchenko do { \ 8520f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 8530f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 8540f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 8550f999687SAndrew Rybchenko \ 8560f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 8570f999687SAndrew Rybchenko if (_lock) \ 858*687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 8590f999687SAndrew Rybchenko \ 8600f999687SAndrew Rybchenko EFSYS_PROBE5(bar_writeo, unsigned int, (_offset), \ 8610f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 8620f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 8630f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 8640f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 8650f999687SAndrew Rybchenko \ 866e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 867e948693eSPhilip Paeps (_offset), (_eop)->eo_u32[0]); \ 868e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 869e948693eSPhilip Paeps (_offset+4), (_eop)->eo_u32[1]); \ 870e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 871e948693eSPhilip Paeps (_offset+8), (_eop)->eo_u32[2]); \ 872e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 873e948693eSPhilip Paeps (_offset+12), (_eop)->eo_u32[3]); \ 874e948693eSPhilip Paeps \ 875e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 876e948693eSPhilip Paeps if (_lock) \ 877763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 878e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 879e948693eSPhilip Paeps } while (B_FALSE) 8800f999687SAndrew Rybchenko #endif 881e948693eSPhilip Paeps 882e948693eSPhilip Paeps /* SPIN */ 883e948693eSPhilip Paeps 884e948693eSPhilip Paeps #define EFSYS_SPIN(_us) \ 885e948693eSPhilip Paeps do { \ 886e948693eSPhilip Paeps DELAY(_us); \ 887e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 888e948693eSPhilip Paeps } while (B_FALSE) 889e948693eSPhilip Paeps 890e948693eSPhilip Paeps #define EFSYS_SLEEP EFSYS_SPIN 891e948693eSPhilip Paeps 892e948693eSPhilip Paeps /* BARRIERS */ 893e948693eSPhilip Paeps 8947c00963aSAndrew Rybchenko #define EFSYS_MEM_READ_BARRIER() rmb() 895e948693eSPhilip Paeps #define EFSYS_PIO_WRITE_BARRIER() 896e948693eSPhilip Paeps 897e948693eSPhilip Paeps /* TIMESTAMP */ 898e948693eSPhilip Paeps 899e948693eSPhilip Paeps typedef clock_t efsys_timestamp_t; 900e948693eSPhilip Paeps 901e948693eSPhilip Paeps #define EFSYS_TIMESTAMP(_usp) \ 902e948693eSPhilip Paeps do { \ 903e948693eSPhilip Paeps clock_t now; \ 904e948693eSPhilip Paeps \ 905e948693eSPhilip Paeps now = ticks; \ 906e948693eSPhilip Paeps *(_usp) = now * hz / 1000000; \ 907e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 908e948693eSPhilip Paeps } while (B_FALSE) 909e948693eSPhilip Paeps 910e948693eSPhilip Paeps /* KMEM */ 911e948693eSPhilip Paeps 912e948693eSPhilip Paeps #define EFSYS_KMEM_ALLOC(_esip, _size, _p) \ 913e948693eSPhilip Paeps do { \ 914e948693eSPhilip Paeps (_esip) = (_esip); \ 915e948693eSPhilip Paeps (_p) = malloc((_size), M_SFXGE, M_WAITOK|M_ZERO); \ 916e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 917e948693eSPhilip Paeps } while (B_FALSE) 918e948693eSPhilip Paeps 919e948693eSPhilip Paeps #define EFSYS_KMEM_FREE(_esip, _size, _p) \ 920e948693eSPhilip Paeps do { \ 921e948693eSPhilip Paeps (void) (_esip); \ 922e948693eSPhilip Paeps (void) (_size); \ 923e948693eSPhilip Paeps free((_p), M_SFXGE); \ 924e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 925e948693eSPhilip Paeps } while (B_FALSE) 926e948693eSPhilip Paeps 927e948693eSPhilip Paeps /* LOCK */ 928e948693eSPhilip Paeps 92933d45dc5SAndrew Rybchenko typedef struct efsys_lock_s { 93033d45dc5SAndrew Rybchenko struct mtx lock; 93133d45dc5SAndrew Rybchenko char lock_name[SFXGE_LOCK_NAME_MAX]; 93233d45dc5SAndrew Rybchenko } efsys_lock_t; 93333d45dc5SAndrew Rybchenko 93433d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK_INIT(_eslp, _ifname, _label) \ 93533d45dc5SAndrew Rybchenko do { \ 93633d45dc5SAndrew Rybchenko efsys_lock_t *__eslp = (_eslp); \ 93733d45dc5SAndrew Rybchenko \ 93833d45dc5SAndrew Rybchenko snprintf((__eslp)->lock_name, \ 93933d45dc5SAndrew Rybchenko sizeof((__eslp)->lock_name), \ 94033d45dc5SAndrew Rybchenko "%s:%s", (_ifname), (_label)); \ 94133d45dc5SAndrew Rybchenko mtx_init(&(__eslp)->lock, (__eslp)->lock_name, \ 94233d45dc5SAndrew Rybchenko NULL, MTX_DEF); \ 94333d45dc5SAndrew Rybchenko } while (B_FALSE) 94433d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK_DESTROY(_eslp) \ 94533d45dc5SAndrew Rybchenko mtx_destroy(&(_eslp)->lock) 94633d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK(_eslp) \ 94733d45dc5SAndrew Rybchenko mtx_lock(&(_eslp)->lock) 94833d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_UNLOCK(_eslp) \ 94933d45dc5SAndrew Rybchenko mtx_unlock(&(_eslp)->lock) 95033d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK_ASSERT_OWNED(_eslp) \ 95133d45dc5SAndrew Rybchenko mtx_assert(&(_eslp)->lock, MA_OWNED) 952e948693eSPhilip Paeps 953e948693eSPhilip Paeps #define EFSYS_LOCK_MAGIC 0x000010c4 954e948693eSPhilip Paeps 955e948693eSPhilip Paeps #define EFSYS_LOCK(_lockp, _state) \ 956e948693eSPhilip Paeps do { \ 95733d45dc5SAndrew Rybchenko SFXGE_EFSYS_LOCK(_lockp); \ 958e948693eSPhilip Paeps (_state) = EFSYS_LOCK_MAGIC; \ 959e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 960e948693eSPhilip Paeps } while (B_FALSE) 961e948693eSPhilip Paeps 962e948693eSPhilip Paeps #define EFSYS_UNLOCK(_lockp, _state) \ 963e948693eSPhilip Paeps do { \ 964e948693eSPhilip Paeps if ((_state) != EFSYS_LOCK_MAGIC) \ 965e948693eSPhilip Paeps KASSERT(B_FALSE, ("not locked")); \ 96633d45dc5SAndrew Rybchenko SFXGE_EFSYS_UNLOCK(_lockp); \ 967e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 968e948693eSPhilip Paeps } while (B_FALSE) 969e948693eSPhilip Paeps 970e948693eSPhilip Paeps /* PREEMPT */ 971e948693eSPhilip Paeps 972e948693eSPhilip Paeps #define EFSYS_PREEMPT_DISABLE(_state) \ 973e948693eSPhilip Paeps do { \ 974e948693eSPhilip Paeps (_state) = (_state); \ 975e948693eSPhilip Paeps critical_enter(); \ 976e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 977e948693eSPhilip Paeps } while (B_FALSE) 978e948693eSPhilip Paeps 979e948693eSPhilip Paeps #define EFSYS_PREEMPT_ENABLE(_state) \ 980e948693eSPhilip Paeps do { \ 981e948693eSPhilip Paeps (_state) = (_state); \ 982e948693eSPhilip Paeps critical_exit(_state); \ 983e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 984e948693eSPhilip Paeps } while (B_FALSE) 985e948693eSPhilip Paeps 986e948693eSPhilip Paeps /* STAT */ 987e948693eSPhilip Paeps 988e948693eSPhilip Paeps typedef uint64_t efsys_stat_t; 989e948693eSPhilip Paeps 990e948693eSPhilip Paeps #define EFSYS_STAT_INCR(_knp, _delta) \ 991e948693eSPhilip Paeps do { \ 992e948693eSPhilip Paeps *(_knp) += (_delta); \ 993e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 994e948693eSPhilip Paeps } while (B_FALSE) 995e948693eSPhilip Paeps 996e948693eSPhilip Paeps #define EFSYS_STAT_DECR(_knp, _delta) \ 997e948693eSPhilip Paeps do { \ 998e948693eSPhilip Paeps *(_knp) -= (_delta); \ 999e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1000e948693eSPhilip Paeps } while (B_FALSE) 1001e948693eSPhilip Paeps 1002e948693eSPhilip Paeps #define EFSYS_STAT_SET(_knp, _val) \ 1003e948693eSPhilip Paeps do { \ 1004e948693eSPhilip Paeps *(_knp) = (_val); \ 1005e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1006e948693eSPhilip Paeps } while (B_FALSE) 1007e948693eSPhilip Paeps 1008e948693eSPhilip Paeps #define EFSYS_STAT_SET_QWORD(_knp, _valp) \ 1009e948693eSPhilip Paeps do { \ 1010e948693eSPhilip Paeps *(_knp) = le64toh((_valp)->eq_u64[0]); \ 1011e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1012e948693eSPhilip Paeps } while (B_FALSE) 1013e948693eSPhilip Paeps 1014e948693eSPhilip Paeps #define EFSYS_STAT_SET_DWORD(_knp, _valp) \ 1015e948693eSPhilip Paeps do { \ 1016e948693eSPhilip Paeps *(_knp) = le32toh((_valp)->ed_u32[0]); \ 1017e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1018e948693eSPhilip Paeps } while (B_FALSE) 1019e948693eSPhilip Paeps 1020e948693eSPhilip Paeps #define EFSYS_STAT_INCR_QWORD(_knp, _valp) \ 1021e948693eSPhilip Paeps do { \ 1022e948693eSPhilip Paeps *(_knp) += le64toh((_valp)->eq_u64[0]); \ 1023e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1024e948693eSPhilip Paeps } while (B_FALSE) 1025e948693eSPhilip Paeps 1026e948693eSPhilip Paeps #define EFSYS_STAT_SUBR_QWORD(_knp, _valp) \ 1027e948693eSPhilip Paeps do { \ 1028e948693eSPhilip Paeps *(_knp) -= le64toh((_valp)->eq_u64[0]); \ 1029e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1030e948693eSPhilip Paeps } while (B_FALSE) 1031e948693eSPhilip Paeps 1032e948693eSPhilip Paeps /* ERR */ 1033e948693eSPhilip Paeps 1034e948693eSPhilip Paeps extern void sfxge_err(efsys_identifier_t *, unsigned int, 1035e948693eSPhilip Paeps uint32_t, uint32_t); 1036e948693eSPhilip Paeps 1037e948693eSPhilip Paeps #if EFSYS_OPT_DECODE_INTR_FATAL 1038e948693eSPhilip Paeps #define EFSYS_ERR(_esip, _code, _dword0, _dword1) \ 1039e948693eSPhilip Paeps do { \ 1040e948693eSPhilip Paeps sfxge_err((_esip), (_code), (_dword0), (_dword1)); \ 1041e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1042e948693eSPhilip Paeps } while (B_FALSE) 1043e948693eSPhilip Paeps #endif 1044e948693eSPhilip Paeps 1045e948693eSPhilip Paeps /* ASSERT */ 1046e948693eSPhilip Paeps 1047e948693eSPhilip Paeps #define EFSYS_ASSERT(_exp) do { \ 1048e948693eSPhilip Paeps if (!(_exp)) \ 1049e948693eSPhilip Paeps panic(#_exp); \ 1050e948693eSPhilip Paeps } while (0) 1051e948693eSPhilip Paeps 1052e948693eSPhilip Paeps #define EFSYS_ASSERT3(_x, _op, _y, _t) do { \ 1053e948693eSPhilip Paeps const _t __x = (_t)(_x); \ 1054e948693eSPhilip Paeps const _t __y = (_t)(_y); \ 1055e948693eSPhilip Paeps if (!(__x _op __y)) \ 1056e948693eSPhilip Paeps panic("assertion failed at %s:%u", __FILE__, __LINE__); \ 1057e948693eSPhilip Paeps } while(0) 1058e948693eSPhilip Paeps 1059e948693eSPhilip Paeps #define EFSYS_ASSERT3U(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, uint64_t) 1060e948693eSPhilip Paeps #define EFSYS_ASSERT3S(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, int64_t) 1061e948693eSPhilip Paeps #define EFSYS_ASSERT3P(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, uintptr_t) 1062e948693eSPhilip Paeps 1063e948693eSPhilip Paeps #ifdef __cplusplus 1064e948693eSPhilip Paeps } 1065e948693eSPhilip Paeps #endif 1066e948693eSPhilip Paeps 1067e948693eSPhilip Paeps #endif /* _SYS_EFSYS_H */ 1068