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 54e948693eSPhilip Paeps #define EFSYS_USE_UINT64 0 55e948693eSPhilip Paeps #if _BYTE_ORDER == _BIG_ENDIAN 56e948693eSPhilip Paeps #define EFSYS_IS_BIG_ENDIAN 1 57e948693eSPhilip Paeps #define EFSYS_IS_LITTLE_ENDIAN 0 58e948693eSPhilip Paeps #elif _BYTE_ORDER == _LITTLE_ENDIAN 59e948693eSPhilip Paeps #define EFSYS_IS_BIG_ENDIAN 0 60e948693eSPhilip Paeps #define EFSYS_IS_LITTLE_ENDIAN 1 61e948693eSPhilip Paeps #endif 62e948693eSPhilip Paeps #include "efx_types.h" 63e948693eSPhilip Paeps 64e948693eSPhilip Paeps /* Common code requires this */ 65e948693eSPhilip Paeps #if __FreeBSD_version < 800068 66e948693eSPhilip Paeps #define memmove(d, s, l) bcopy(s, d, l) 67e948693eSPhilip Paeps #endif 68e948693eSPhilip Paeps 69e948693eSPhilip Paeps /* FreeBSD equivalents of Solaris things */ 70e948693eSPhilip Paeps #ifndef _NOTE 71e948693eSPhilip Paeps #define _NOTE(s) 72e948693eSPhilip Paeps #endif 73e948693eSPhilip Paeps 74e948693eSPhilip Paeps #ifndef B_FALSE 75e948693eSPhilip Paeps #define B_FALSE FALSE 76e948693eSPhilip Paeps #endif 77e948693eSPhilip Paeps #ifndef B_TRUE 78e948693eSPhilip Paeps #define B_TRUE TRUE 79e948693eSPhilip Paeps #endif 80e948693eSPhilip Paeps 81e948693eSPhilip Paeps #ifndef IS_P2ALIGNED 82e948693eSPhilip Paeps #define IS_P2ALIGNED(v, a) ((((uintptr_t)(v)) & ((uintptr_t)(a) - 1)) == 0) 83e948693eSPhilip Paeps #endif 84e948693eSPhilip Paeps 85e948693eSPhilip Paeps #ifndef P2ROUNDUP 86e948693eSPhilip Paeps #define P2ROUNDUP(x, align) (-(-(x) & -(align))) 87e948693eSPhilip Paeps #endif 88e948693eSPhilip Paeps 89e948693eSPhilip Paeps #ifndef IS2P 90e948693eSPhilip Paeps #define ISP2(x) (((x) & ((x) - 1)) == 0) 91e948693eSPhilip Paeps #endif 92e948693eSPhilip Paeps 93e948693eSPhilip Paeps #define ENOTACTIVE EINVAL 94e948693eSPhilip Paeps 95e948693eSPhilip Paeps /* Memory type to use on FreeBSD */ 96e948693eSPhilip Paeps MALLOC_DECLARE(M_SFXGE); 97e948693eSPhilip Paeps 98e948693eSPhilip Paeps /* Machine dependend prefetch wrappers */ 99dc1788e8SMarius Strobl #if defined(__i386__) || defined(__amd64__) 100e948693eSPhilip Paeps static __inline void 101e948693eSPhilip Paeps prefetch_read_many(void *addr) 102e948693eSPhilip Paeps { 103dc1788e8SMarius Strobl 104e948693eSPhilip Paeps __asm__( 105e948693eSPhilip Paeps "prefetcht0 (%0)" 106e948693eSPhilip Paeps : 107e948693eSPhilip Paeps : "r" (addr)); 108e948693eSPhilip Paeps } 109e948693eSPhilip Paeps 110e948693eSPhilip Paeps static __inline void 111e948693eSPhilip Paeps prefetch_read_once(void *addr) 112e948693eSPhilip Paeps { 113dc1788e8SMarius Strobl 114e948693eSPhilip Paeps __asm__( 115e948693eSPhilip Paeps "prefetchnta (%0)" 116e948693eSPhilip Paeps : 117e948693eSPhilip Paeps : "r" (addr)); 118e948693eSPhilip Paeps } 119dc1788e8SMarius Strobl #elif defined(__sparc64__) 120dc1788e8SMarius Strobl static __inline void 121dc1788e8SMarius Strobl prefetch_read_many(void *addr) 122dc1788e8SMarius Strobl { 123dc1788e8SMarius Strobl 124dc1788e8SMarius Strobl __asm__( 125dc1788e8SMarius Strobl "prefetch [%0], 0" 126dc1788e8SMarius Strobl : 127dc1788e8SMarius Strobl : "r" (addr)); 128dc1788e8SMarius Strobl } 129dc1788e8SMarius Strobl 130dc1788e8SMarius Strobl static __inline void 131dc1788e8SMarius Strobl prefetch_read_once(void *addr) 132dc1788e8SMarius Strobl { 133dc1788e8SMarius Strobl 134dc1788e8SMarius Strobl __asm__( 135dc1788e8SMarius Strobl "prefetch [%0], 1" 136dc1788e8SMarius Strobl : 137dc1788e8SMarius Strobl : "r" (addr)); 138dc1788e8SMarius Strobl } 139dc1788e8SMarius Strobl #else 140dc1788e8SMarius Strobl static __inline void 141dc1788e8SMarius Strobl prefetch_read_many(void *addr) 142dc1788e8SMarius Strobl { 143dc1788e8SMarius Strobl 144dc1788e8SMarius Strobl } 145dc1788e8SMarius Strobl 146dc1788e8SMarius Strobl static __inline void 147dc1788e8SMarius Strobl prefetch_read_once(void *addr) 148dc1788e8SMarius Strobl { 149dc1788e8SMarius Strobl 150dc1788e8SMarius Strobl } 151e948693eSPhilip Paeps #endif 152e948693eSPhilip Paeps 153e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__) 154e948693eSPhilip Paeps #include <vm/vm.h> 155e948693eSPhilip Paeps #include <vm/pmap.h> 156e948693eSPhilip Paeps #endif 157e948693eSPhilip Paeps static __inline void 158e948693eSPhilip Paeps sfxge_map_mbuf_fast(bus_dma_tag_t tag, bus_dmamap_t map, 159e948693eSPhilip Paeps struct mbuf *m, bus_dma_segment_t *seg) 160e948693eSPhilip Paeps { 161e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__) 162e948693eSPhilip Paeps seg->ds_addr = pmap_kextract(mtod(m, vm_offset_t)); 163e948693eSPhilip Paeps seg->ds_len = m->m_len; 164e948693eSPhilip Paeps #else 165e948693eSPhilip Paeps int nsegstmp; 166e948693eSPhilip Paeps 167e948693eSPhilip Paeps bus_dmamap_load_mbuf_sg(tag, map, m, seg, &nsegstmp, 0); 168e948693eSPhilip Paeps #endif 169e948693eSPhilip Paeps } 170e948693eSPhilip Paeps 171e948693eSPhilip Paeps /* Modifiers used for DOS builds */ 172e948693eSPhilip Paeps #define __cs 173e948693eSPhilip Paeps #define __far 174e948693eSPhilip Paeps 175e948693eSPhilip Paeps /* Modifiers used for Windows builds */ 176e948693eSPhilip Paeps #define __in 177e948693eSPhilip Paeps #define __in_opt 178e948693eSPhilip Paeps #define __in_ecount(_n) 179e948693eSPhilip Paeps #define __in_ecount_opt(_n) 180e948693eSPhilip Paeps #define __in_bcount(_n) 181e948693eSPhilip Paeps #define __in_bcount_opt(_n) 182e948693eSPhilip Paeps 183e948693eSPhilip Paeps #define __out 184e948693eSPhilip Paeps #define __out_opt 185e948693eSPhilip Paeps #define __out_ecount(_n) 186e948693eSPhilip Paeps #define __out_ecount_opt(_n) 187e948693eSPhilip Paeps #define __out_bcount(_n) 188e948693eSPhilip Paeps #define __out_bcount_opt(_n) 189e948693eSPhilip Paeps 190e948693eSPhilip Paeps #define __deref_out 191e948693eSPhilip Paeps 192e948693eSPhilip Paeps #define __inout 193e948693eSPhilip Paeps #define __inout_opt 194e948693eSPhilip Paeps #define __inout_ecount(_n) 195e948693eSPhilip Paeps #define __inout_ecount_opt(_n) 196e948693eSPhilip Paeps #define __inout_bcount(_n) 197e948693eSPhilip Paeps #define __inout_bcount_opt(_n) 198e948693eSPhilip Paeps #define __inout_bcount_full_opt(_n) 199e948693eSPhilip Paeps 200e948693eSPhilip Paeps #define __deref_out_bcount_opt(n) 201e948693eSPhilip Paeps 202e948693eSPhilip Paeps #define __checkReturn 203e948693eSPhilip Paeps 204e948693eSPhilip Paeps #define __drv_when(_p, _c) 205e948693eSPhilip Paeps 206e948693eSPhilip Paeps /* Code inclusion options */ 207e948693eSPhilip Paeps 208e948693eSPhilip Paeps 209e948693eSPhilip Paeps #define EFSYS_OPT_NAMES 1 210e948693eSPhilip Paeps 211e948693eSPhilip Paeps #define EFSYS_OPT_FALCON 0 212e948693eSPhilip Paeps #define EFSYS_OPT_FALCON_NIC_CFG_OVERRIDE 0 213e948693eSPhilip Paeps #define EFSYS_OPT_SIENA 1 214e948693eSPhilip Paeps #ifdef DEBUG 215e948693eSPhilip Paeps #define EFSYS_OPT_CHECK_REG 1 216e948693eSPhilip Paeps #else 217e948693eSPhilip Paeps #define EFSYS_OPT_CHECK_REG 0 218e948693eSPhilip Paeps #endif 219e948693eSPhilip Paeps 220e948693eSPhilip Paeps #define EFSYS_OPT_MCDI 1 221e948693eSPhilip Paeps 222e948693eSPhilip Paeps #define EFSYS_OPT_MAC_FALCON_GMAC 0 223e948693eSPhilip Paeps #define EFSYS_OPT_MAC_FALCON_XMAC 0 224e948693eSPhilip Paeps #define EFSYS_OPT_MAC_STATS 1 225e948693eSPhilip Paeps 226e948693eSPhilip Paeps #define EFSYS_OPT_LOOPBACK 0 227e948693eSPhilip Paeps 228e948693eSPhilip Paeps #define EFSYS_OPT_MON_NULL 0 229e948693eSPhilip Paeps #define EFSYS_OPT_MON_LM87 0 230e948693eSPhilip Paeps #define EFSYS_OPT_MON_MAX6647 0 231e948693eSPhilip Paeps #define EFSYS_OPT_MON_SIENA 0 232e948693eSPhilip Paeps #define EFSYS_OPT_MON_STATS 0 233e948693eSPhilip Paeps 234e948693eSPhilip Paeps #define EFSYS_OPT_PHY_NULL 0 235e948693eSPhilip Paeps #define EFSYS_OPT_PHY_QT2022C2 0 236e948693eSPhilip Paeps #define EFSYS_OPT_PHY_SFX7101 0 237e948693eSPhilip Paeps #define EFSYS_OPT_PHY_TXC43128 0 238e948693eSPhilip Paeps #define EFSYS_OPT_PHY_PM8358 0 239e948693eSPhilip Paeps #define EFSYS_OPT_PHY_SFT9001 0 240e948693eSPhilip Paeps #define EFSYS_OPT_PHY_QT2025C 0 241e948693eSPhilip Paeps #define EFSYS_OPT_PHY_STATS 1 242e948693eSPhilip Paeps #define EFSYS_OPT_PHY_PROPS 0 243e948693eSPhilip Paeps #define EFSYS_OPT_PHY_BIST 1 244e948693eSPhilip Paeps #define EFSYS_OPT_PHY_LED_CONTROL 1 245e948693eSPhilip Paeps #define EFSYS_OPT_PHY_FLAGS 0 246e948693eSPhilip Paeps 247e948693eSPhilip Paeps #define EFSYS_OPT_VPD 1 248e948693eSPhilip Paeps #define EFSYS_OPT_NVRAM 1 249e948693eSPhilip Paeps #define EFSYS_OPT_NVRAM_FALCON_BOOTROM 0 250e948693eSPhilip Paeps #define EFSYS_OPT_NVRAM_SFT9001 0 251e948693eSPhilip Paeps #define EFSYS_OPT_NVRAM_SFX7101 0 252e948693eSPhilip Paeps #define EFSYS_OPT_BOOTCFG 0 253e948693eSPhilip Paeps 254e948693eSPhilip Paeps #define EFSYS_OPT_PCIE_TUNE 0 255e948693eSPhilip Paeps #define EFSYS_OPT_DIAG 0 256e948693eSPhilip Paeps #define EFSYS_OPT_WOL 1 257e948693eSPhilip Paeps #define EFSYS_OPT_RX_SCALE 1 258e948693eSPhilip Paeps #define EFSYS_OPT_QSTATS 1 259e948693eSPhilip Paeps #define EFSYS_OPT_FILTER 0 260e948693eSPhilip Paeps #define EFSYS_OPT_RX_SCATTER 0 261e948693eSPhilip Paeps #define EFSYS_OPT_RX_HDR_SPLIT 0 262e948693eSPhilip Paeps 263e948693eSPhilip Paeps #define EFSYS_OPT_EV_PREFETCH 0 264e948693eSPhilip Paeps 265e948693eSPhilip Paeps #define EFSYS_OPT_DECODE_INTR_FATAL 1 266e948693eSPhilip Paeps 267e948693eSPhilip Paeps /* ID */ 268e948693eSPhilip Paeps 269e948693eSPhilip Paeps typedef struct __efsys_identifier_s efsys_identifier_t; 270e948693eSPhilip Paeps 271e948693eSPhilip Paeps /* PROBE */ 272e948693eSPhilip Paeps 27354366c0bSAttilio Rao #ifndef DTRACE_PROBE 274e948693eSPhilip Paeps 275e948693eSPhilip Paeps #define EFSYS_PROBE(_name) 276e948693eSPhilip Paeps 277e948693eSPhilip Paeps #define EFSYS_PROBE1(_name, _type1, _arg1) 278e948693eSPhilip Paeps 279e948693eSPhilip Paeps #define EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2) 280e948693eSPhilip Paeps 281e948693eSPhilip Paeps #define EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2, \ 282e948693eSPhilip Paeps _type3, _arg3) 283e948693eSPhilip Paeps 284e948693eSPhilip Paeps #define EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 285e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) 286e948693eSPhilip Paeps 287e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 288e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) 289e948693eSPhilip Paeps 290e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 291e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 292e948693eSPhilip Paeps _type6, _arg6) 293e948693eSPhilip Paeps 294e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 295e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 296e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) 297e948693eSPhilip Paeps 29854366c0bSAttilio Rao #else /* DTRACE_PROBE */ 299e948693eSPhilip Paeps 300e948693eSPhilip Paeps #define EFSYS_PROBE(_name) \ 301e948693eSPhilip Paeps DTRACE_PROBE(_name) 302e948693eSPhilip Paeps 303e948693eSPhilip Paeps #define EFSYS_PROBE1(_name, _type1, _arg1) \ 304e948693eSPhilip Paeps DTRACE_PROBE1(_name, _type1, _arg1) 305e948693eSPhilip Paeps 306e948693eSPhilip Paeps #define EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2) \ 307e948693eSPhilip Paeps DTRACE_PROBE2(_name, _type1, _arg1, _type2, _arg2) 308e948693eSPhilip Paeps 309e948693eSPhilip Paeps #define EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2, \ 310e948693eSPhilip Paeps _type3, _arg3) \ 311e948693eSPhilip Paeps DTRACE_PROBE3(_name, _type1, _arg1, _type2, _arg2, \ 312e948693eSPhilip Paeps _type3, _arg3) 313e948693eSPhilip Paeps 314e948693eSPhilip Paeps #define EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 315e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) \ 316e948693eSPhilip Paeps DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 317e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) 318e948693eSPhilip Paeps 319e948693eSPhilip Paeps #ifdef DTRACE_PROBE5 320e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 321e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) \ 322e948693eSPhilip Paeps DTRACE_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 323e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) 324e948693eSPhilip Paeps #else 325e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 326e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) \ 327e948693eSPhilip Paeps DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 328e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) 329e948693eSPhilip Paeps #endif 330e948693eSPhilip Paeps 331e948693eSPhilip Paeps #ifdef DTRACE_PROBE6 332e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 333e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 334e948693eSPhilip Paeps _type6, _arg6) \ 335e948693eSPhilip Paeps DTRACE_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 336e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 337e948693eSPhilip Paeps _type6, _arg6) 338e948693eSPhilip Paeps #else 339e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 340e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 341e948693eSPhilip Paeps _type6, _arg6) \ 342e948693eSPhilip Paeps EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 343e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) 344e948693eSPhilip Paeps #endif 345e948693eSPhilip Paeps 346e948693eSPhilip Paeps #ifdef DTRACE_PROBE7 347e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 348e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 349e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) \ 350e948693eSPhilip Paeps DTRACE_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 351e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 352e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) 353e948693eSPhilip Paeps #else 354e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 355e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 356e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) \ 357e948693eSPhilip Paeps EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 358e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 359e948693eSPhilip Paeps _type6, _arg6) 360e948693eSPhilip Paeps #endif 361e948693eSPhilip Paeps 36254366c0bSAttilio Rao #endif /* DTRACE_PROBE */ 363e948693eSPhilip Paeps 364e948693eSPhilip Paeps /* DMA */ 365e948693eSPhilip Paeps 366e948693eSPhilip Paeps typedef uint64_t efsys_dma_addr_t; 367e948693eSPhilip Paeps 368e948693eSPhilip Paeps typedef struct efsys_mem_s { 369e948693eSPhilip Paeps bus_dma_tag_t esm_tag; 370e948693eSPhilip Paeps bus_dmamap_t esm_map; 371e948693eSPhilip Paeps caddr_t esm_base; 372e948693eSPhilip Paeps efsys_dma_addr_t esm_addr; 373e948693eSPhilip Paeps } efsys_mem_t; 374e948693eSPhilip Paeps 375e948693eSPhilip Paeps 376e948693eSPhilip Paeps #define EFSYS_MEM_ZERO(_esmp, _size) \ 377e948693eSPhilip Paeps do { \ 378e948693eSPhilip Paeps (void) memset((_esmp)->esm_base, 0, (_size)); \ 379e948693eSPhilip Paeps \ 380e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 381e948693eSPhilip Paeps } while (B_FALSE) 382e948693eSPhilip Paeps 383e948693eSPhilip Paeps #define EFSYS_MEM_READD(_esmp, _offset, _edp) \ 384e948693eSPhilip Paeps do { \ 385e948693eSPhilip Paeps uint32_t *addr; \ 386e948693eSPhilip Paeps \ 387e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 388e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 389e948693eSPhilip Paeps ("not power of 2 aligned")); \ 390e948693eSPhilip Paeps \ 391e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 392e948693eSPhilip Paeps \ 393e948693eSPhilip Paeps (_edp)->ed_u32[0] = *addr; \ 394e948693eSPhilip Paeps \ 395e948693eSPhilip Paeps EFSYS_PROBE2(mem_readd, unsigned int, (_offset), \ 396e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 397e948693eSPhilip Paeps \ 398e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 399e948693eSPhilip Paeps } while (B_FALSE) 400e948693eSPhilip Paeps 401e948693eSPhilip Paeps #define EFSYS_MEM_READQ(_esmp, _offset, _eqp) \ 402e948693eSPhilip Paeps do { \ 403e948693eSPhilip Paeps uint32_t *addr; \ 404e948693eSPhilip Paeps \ 405e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 406e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 407e948693eSPhilip Paeps ("not power of 2 aligned")); \ 408e948693eSPhilip Paeps \ 409e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 410e948693eSPhilip Paeps \ 411e948693eSPhilip Paeps (_eqp)->eq_u32[0] = *addr++; \ 412e948693eSPhilip Paeps (_eqp)->eq_u32[1] = *addr; \ 413e948693eSPhilip Paeps \ 414e948693eSPhilip Paeps EFSYS_PROBE3(mem_readq, unsigned int, (_offset), \ 415e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 416e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 417e948693eSPhilip Paeps \ 418e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 419e948693eSPhilip Paeps } while (B_FALSE) 420e948693eSPhilip Paeps 421e948693eSPhilip Paeps #define EFSYS_MEM_READO(_esmp, _offset, _eop) \ 422e948693eSPhilip Paeps do { \ 423e948693eSPhilip Paeps uint32_t *addr; \ 424e948693eSPhilip Paeps \ 425e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 426e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 427e948693eSPhilip Paeps ("not power of 2 aligned")); \ 428e948693eSPhilip Paeps \ 429e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 430e948693eSPhilip Paeps \ 431e948693eSPhilip Paeps (_eop)->eo_u32[0] = *addr++; \ 432e948693eSPhilip Paeps (_eop)->eo_u32[1] = *addr++; \ 433e948693eSPhilip Paeps (_eop)->eo_u32[2] = *addr++; \ 434e948693eSPhilip Paeps (_eop)->eo_u32[3] = *addr; \ 435e948693eSPhilip Paeps \ 436e948693eSPhilip Paeps EFSYS_PROBE5(mem_reado, unsigned int, (_offset), \ 437e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 438e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 439e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 440e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 441e948693eSPhilip Paeps \ 442e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 443e948693eSPhilip Paeps } while (B_FALSE) 444e948693eSPhilip Paeps 445e948693eSPhilip Paeps #define EFSYS_MEM_WRITED(_esmp, _offset, _edp) \ 446e948693eSPhilip Paeps do { \ 447e948693eSPhilip Paeps uint32_t *addr; \ 448e948693eSPhilip Paeps \ 449e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 450e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 451e948693eSPhilip Paeps ("not power of 2 aligned")); \ 452e948693eSPhilip Paeps \ 453e948693eSPhilip Paeps EFSYS_PROBE2(mem_writed, unsigned int, (_offset), \ 454e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 455e948693eSPhilip Paeps \ 456e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 457e948693eSPhilip Paeps \ 458e948693eSPhilip Paeps *addr = (_edp)->ed_u32[0]; \ 459e948693eSPhilip Paeps \ 460e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 461e948693eSPhilip Paeps } while (B_FALSE) 462e948693eSPhilip Paeps 463e948693eSPhilip Paeps #define EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp) \ 464e948693eSPhilip Paeps do { \ 465e948693eSPhilip Paeps uint32_t *addr; \ 466e948693eSPhilip Paeps \ 467e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 468e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 469e948693eSPhilip Paeps ("not power of 2 aligned")); \ 470e948693eSPhilip Paeps \ 471e948693eSPhilip Paeps EFSYS_PROBE3(mem_writeq, unsigned int, (_offset), \ 472e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 473e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 474e948693eSPhilip Paeps \ 475e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 476e948693eSPhilip Paeps \ 477e948693eSPhilip Paeps *addr++ = (_eqp)->eq_u32[0]; \ 478e948693eSPhilip Paeps *addr = (_eqp)->eq_u32[1]; \ 479e948693eSPhilip Paeps \ 480e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 481e948693eSPhilip Paeps } while (B_FALSE) 482e948693eSPhilip Paeps 483e948693eSPhilip Paeps #define EFSYS_MEM_WRITEO(_esmp, _offset, _eop) \ 484e948693eSPhilip Paeps do { \ 485e948693eSPhilip Paeps uint32_t *addr; \ 486e948693eSPhilip Paeps \ 487e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 488e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 489e948693eSPhilip Paeps ("not power of 2 aligned")); \ 490e948693eSPhilip Paeps \ 491e948693eSPhilip Paeps EFSYS_PROBE5(mem_writeo, unsigned int, (_offset), \ 492e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 493e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 494e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 495e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 496e948693eSPhilip Paeps \ 497e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 498e948693eSPhilip Paeps \ 499e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[0]; \ 500e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[1]; \ 501e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[2]; \ 502e948693eSPhilip Paeps *addr = (_eop)->eo_u32[3]; \ 503e948693eSPhilip Paeps \ 504e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 505e948693eSPhilip Paeps } while (B_FALSE) 506e948693eSPhilip Paeps 507e948693eSPhilip Paeps #define EFSYS_MEM_ADDR(_esmp) \ 508e948693eSPhilip Paeps ((_esmp)->esm_addr) 509e948693eSPhilip Paeps 510e948693eSPhilip Paeps /* BAR */ 511e948693eSPhilip Paeps 512*33d45dc5SAndrew Rybchenko #define SFXGE_LOCK_NAME_MAX 16 513*33d45dc5SAndrew Rybchenko 514e948693eSPhilip Paeps typedef struct efsys_bar_s { 515e948693eSPhilip Paeps struct mtx esb_lock; 516*33d45dc5SAndrew Rybchenko char esb_lock_name[SFXGE_LOCK_NAME_MAX]; 517e948693eSPhilip Paeps bus_space_tag_t esb_tag; 518e948693eSPhilip Paeps bus_space_handle_t esb_handle; 519e948693eSPhilip Paeps int esb_rid; 520e948693eSPhilip Paeps struct resource *esb_res; 521e948693eSPhilip Paeps } efsys_bar_t; 522e948693eSPhilip Paeps 523*33d45dc5SAndrew Rybchenko #define SFXGE_BAR_LOCK_INIT(_esbp, _ifname) \ 524*33d45dc5SAndrew Rybchenko do { \ 525*33d45dc5SAndrew Rybchenko snprintf((_esbp)->esb_lock_name, \ 526*33d45dc5SAndrew Rybchenko sizeof((_esbp)->esb_lock_name), \ 527*33d45dc5SAndrew Rybchenko "%s:bar", (_ifname)); \ 528*33d45dc5SAndrew Rybchenko mtx_init(&(_esbp)->esb_lock, (_esbp)->esb_lock_name, \ 529*33d45dc5SAndrew Rybchenko NULL, MTX_DEF); \ 530*33d45dc5SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 531*33d45dc5SAndrew Rybchenko } while (B_FALSE) 532763cab71SAndrew Rybchenko #define SFXGE_BAR_LOCK_DESTROY(_esbp) \ 533763cab71SAndrew Rybchenko mtx_destroy(&(_esbp)->esb_lock) 534763cab71SAndrew Rybchenko #define SFXGE_BAR_LOCK(_esbp) \ 535763cab71SAndrew Rybchenko mtx_lock(&(_esbp)->esb_lock) 536763cab71SAndrew Rybchenko #define SFXGE_BAR_UNLOCK(_esbp) \ 537763cab71SAndrew Rybchenko mtx_unlock(&(_esbp)->esb_lock) 538763cab71SAndrew Rybchenko 539e948693eSPhilip Paeps #define EFSYS_BAR_READD(_esbp, _offset, _edp, _lock) \ 540e948693eSPhilip Paeps do { \ 541e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 542e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 543e948693eSPhilip Paeps ("not power of 2 aligned")); \ 544e948693eSPhilip Paeps \ 545e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 546e948693eSPhilip Paeps if (_lock) \ 547763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 548e948693eSPhilip Paeps \ 549e948693eSPhilip Paeps (_edp)->ed_u32[0] = bus_space_read_4((_esbp)->esb_tag, \ 550e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset)); \ 551e948693eSPhilip Paeps \ 552e948693eSPhilip Paeps EFSYS_PROBE2(bar_readd, unsigned int, (_offset), \ 553e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 554e948693eSPhilip Paeps \ 555e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 556e948693eSPhilip Paeps if (_lock) \ 557763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 558e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 559e948693eSPhilip Paeps } while (B_FALSE) 560e948693eSPhilip Paeps 561e948693eSPhilip Paeps #define EFSYS_BAR_READQ(_esbp, _offset, _eqp) \ 562e948693eSPhilip Paeps do { \ 563e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 564e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 565e948693eSPhilip Paeps ("not power of 2 aligned")); \ 566e948693eSPhilip Paeps \ 567763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 568e948693eSPhilip Paeps \ 569e948693eSPhilip Paeps (_eqp)->eq_u32[0] = bus_space_read_4((_esbp)->esb_tag, \ 570e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset)); \ 571e948693eSPhilip Paeps (_eqp)->eq_u32[1] = bus_space_read_4((_esbp)->esb_tag, \ 572e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset+4)); \ 573e948693eSPhilip Paeps \ 574e948693eSPhilip Paeps EFSYS_PROBE3(bar_readq, unsigned int, (_offset), \ 575e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 576e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 577e948693eSPhilip Paeps \ 578763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 579e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 580e948693eSPhilip Paeps } while (B_FALSE) 581e948693eSPhilip Paeps 582e948693eSPhilip Paeps #define EFSYS_BAR_READO(_esbp, _offset, _eop, _lock) \ 583e948693eSPhilip Paeps do { \ 584e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 585e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 586e948693eSPhilip Paeps ("not power of 2 aligned")); \ 587e948693eSPhilip Paeps \ 588e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 589e948693eSPhilip Paeps if (_lock) \ 590763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 591e948693eSPhilip Paeps \ 592e948693eSPhilip Paeps (_eop)->eo_u32[0] = bus_space_read_4((_esbp)->esb_tag, \ 593e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset)); \ 594e948693eSPhilip Paeps (_eop)->eo_u32[1] = bus_space_read_4((_esbp)->esb_tag, \ 595e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset+4)); \ 596e948693eSPhilip Paeps (_eop)->eo_u32[2] = bus_space_read_4((_esbp)->esb_tag, \ 597e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset+8)); \ 598e948693eSPhilip Paeps (_eop)->eo_u32[3] = bus_space_read_4((_esbp)->esb_tag, \ 599e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset+12)); \ 600e948693eSPhilip Paeps \ 601e948693eSPhilip Paeps EFSYS_PROBE5(bar_reado, unsigned int, (_offset), \ 602e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 603e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 604e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 605e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 606e948693eSPhilip Paeps \ 607e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 608e948693eSPhilip Paeps if (_lock) \ 609763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 610e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 611e948693eSPhilip Paeps } while (B_FALSE) 612e948693eSPhilip Paeps 613e948693eSPhilip Paeps #define EFSYS_BAR_WRITED(_esbp, _offset, _edp, _lock) \ 614e948693eSPhilip Paeps do { \ 615e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 616e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 617e948693eSPhilip Paeps ("not power of 2 aligned")); \ 618e948693eSPhilip Paeps \ 619e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 620e948693eSPhilip Paeps if (_lock) \ 621763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 622e948693eSPhilip Paeps \ 623e948693eSPhilip Paeps EFSYS_PROBE2(bar_writed, unsigned int, (_offset), \ 624e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 625e948693eSPhilip Paeps \ 626e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 627e948693eSPhilip Paeps (_offset), (_edp)->ed_u32[0]); \ 628e948693eSPhilip Paeps \ 629e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 630e948693eSPhilip Paeps if (_lock) \ 631763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 632e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 633e948693eSPhilip Paeps } while (B_FALSE) 634e948693eSPhilip Paeps 635e948693eSPhilip Paeps #define EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp) \ 636e948693eSPhilip Paeps do { \ 637e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 638e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 639e948693eSPhilip Paeps ("not power of 2 aligned")); \ 640e948693eSPhilip Paeps \ 641763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 642e948693eSPhilip Paeps \ 643e948693eSPhilip Paeps EFSYS_PROBE3(bar_writeq, unsigned int, (_offset), \ 644e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 645e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 646e948693eSPhilip Paeps \ 647e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 648e948693eSPhilip Paeps (_offset), (_eqp)->eq_u32[0]); \ 649e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 650e948693eSPhilip Paeps (_offset+4), (_eqp)->eq_u32[1]); \ 651e948693eSPhilip Paeps \ 652763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 653e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 654e948693eSPhilip Paeps } while (B_FALSE) 655e948693eSPhilip Paeps 656e948693eSPhilip Paeps #define EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock) \ 657e948693eSPhilip Paeps do { \ 658e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 659e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 660e948693eSPhilip Paeps ("not power of 2 aligned")); \ 661e948693eSPhilip Paeps \ 662e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 663e948693eSPhilip Paeps if (_lock) \ 664763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 665e948693eSPhilip Paeps \ 666e948693eSPhilip Paeps EFSYS_PROBE5(bar_writeo, unsigned int, (_offset), \ 667e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 668e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 669e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 670e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 671e948693eSPhilip Paeps \ 672e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 673e948693eSPhilip Paeps (_offset), (_eop)->eo_u32[0]); \ 674e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 675e948693eSPhilip Paeps (_offset+4), (_eop)->eo_u32[1]); \ 676e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 677e948693eSPhilip Paeps (_offset+8), (_eop)->eo_u32[2]); \ 678e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 679e948693eSPhilip Paeps (_offset+12), (_eop)->eo_u32[3]); \ 680e948693eSPhilip Paeps \ 681e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 682e948693eSPhilip Paeps if (_lock) \ 683763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 684e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 685e948693eSPhilip Paeps } while (B_FALSE) 686e948693eSPhilip Paeps 687e948693eSPhilip Paeps /* SPIN */ 688e948693eSPhilip Paeps 689e948693eSPhilip Paeps #define EFSYS_SPIN(_us) \ 690e948693eSPhilip Paeps do { \ 691e948693eSPhilip Paeps DELAY(_us); \ 692e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 693e948693eSPhilip Paeps } while (B_FALSE) 694e948693eSPhilip Paeps 695e948693eSPhilip Paeps #define EFSYS_SLEEP EFSYS_SPIN 696e948693eSPhilip Paeps 697e948693eSPhilip Paeps /* BARRIERS */ 698e948693eSPhilip Paeps 6997c00963aSAndrew Rybchenko #define EFSYS_MEM_READ_BARRIER() rmb() 700e948693eSPhilip Paeps #define EFSYS_PIO_WRITE_BARRIER() 701e948693eSPhilip Paeps 702e948693eSPhilip Paeps /* TIMESTAMP */ 703e948693eSPhilip Paeps 704e948693eSPhilip Paeps typedef clock_t efsys_timestamp_t; 705e948693eSPhilip Paeps 706e948693eSPhilip Paeps #define EFSYS_TIMESTAMP(_usp) \ 707e948693eSPhilip Paeps do { \ 708e948693eSPhilip Paeps clock_t now; \ 709e948693eSPhilip Paeps \ 710e948693eSPhilip Paeps now = ticks; \ 711e948693eSPhilip Paeps *(_usp) = now * hz / 1000000; \ 712e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 713e948693eSPhilip Paeps } while (B_FALSE) 714e948693eSPhilip Paeps 715e948693eSPhilip Paeps /* KMEM */ 716e948693eSPhilip Paeps 717e948693eSPhilip Paeps #define EFSYS_KMEM_ALLOC(_esip, _size, _p) \ 718e948693eSPhilip Paeps do { \ 719e948693eSPhilip Paeps (_esip) = (_esip); \ 720e948693eSPhilip Paeps (_p) = malloc((_size), M_SFXGE, M_WAITOK|M_ZERO); \ 721e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 722e948693eSPhilip Paeps } while (B_FALSE) 723e948693eSPhilip Paeps 724e948693eSPhilip Paeps #define EFSYS_KMEM_FREE(_esip, _size, _p) \ 725e948693eSPhilip Paeps do { \ 726e948693eSPhilip Paeps (void) (_esip); \ 727e948693eSPhilip Paeps (void) (_size); \ 728e948693eSPhilip Paeps free((_p), M_SFXGE); \ 729e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 730e948693eSPhilip Paeps } while (B_FALSE) 731e948693eSPhilip Paeps 732e948693eSPhilip Paeps /* LOCK */ 733e948693eSPhilip Paeps 734*33d45dc5SAndrew Rybchenko typedef struct efsys_lock_s { 735*33d45dc5SAndrew Rybchenko struct mtx lock; 736*33d45dc5SAndrew Rybchenko char lock_name[SFXGE_LOCK_NAME_MAX]; 737*33d45dc5SAndrew Rybchenko } efsys_lock_t; 738*33d45dc5SAndrew Rybchenko 739*33d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK_INIT(_eslp, _ifname, _label) \ 740*33d45dc5SAndrew Rybchenko do { \ 741*33d45dc5SAndrew Rybchenko efsys_lock_t *__eslp = (_eslp); \ 742*33d45dc5SAndrew Rybchenko \ 743*33d45dc5SAndrew Rybchenko snprintf((__eslp)->lock_name, \ 744*33d45dc5SAndrew Rybchenko sizeof((__eslp)->lock_name), \ 745*33d45dc5SAndrew Rybchenko "%s:%s", (_ifname), (_label)); \ 746*33d45dc5SAndrew Rybchenko mtx_init(&(__eslp)->lock, (__eslp)->lock_name, \ 747*33d45dc5SAndrew Rybchenko NULL, MTX_DEF); \ 748*33d45dc5SAndrew Rybchenko } while (B_FALSE) 749*33d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK_DESTROY(_eslp) \ 750*33d45dc5SAndrew Rybchenko mtx_destroy(&(_eslp)->lock) 751*33d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK(_eslp) \ 752*33d45dc5SAndrew Rybchenko mtx_lock(&(_eslp)->lock) 753*33d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_UNLOCK(_eslp) \ 754*33d45dc5SAndrew Rybchenko mtx_unlock(&(_eslp)->lock) 755*33d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK_ASSERT_OWNED(_eslp) \ 756*33d45dc5SAndrew Rybchenko mtx_assert(&(_eslp)->lock, MA_OWNED) 757e948693eSPhilip Paeps 758e948693eSPhilip Paeps #define EFSYS_LOCK_MAGIC 0x000010c4 759e948693eSPhilip Paeps 760e948693eSPhilip Paeps #define EFSYS_LOCK(_lockp, _state) \ 761e948693eSPhilip Paeps do { \ 762*33d45dc5SAndrew Rybchenko SFXGE_EFSYS_LOCK(_lockp); \ 763e948693eSPhilip Paeps (_state) = EFSYS_LOCK_MAGIC; \ 764e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 765e948693eSPhilip Paeps } while (B_FALSE) 766e948693eSPhilip Paeps 767e948693eSPhilip Paeps #define EFSYS_UNLOCK(_lockp, _state) \ 768e948693eSPhilip Paeps do { \ 769e948693eSPhilip Paeps if ((_state) != EFSYS_LOCK_MAGIC) \ 770e948693eSPhilip Paeps KASSERT(B_FALSE, ("not locked")); \ 771*33d45dc5SAndrew Rybchenko SFXGE_EFSYS_UNLOCK(_lockp); \ 772e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 773e948693eSPhilip Paeps } while (B_FALSE) 774e948693eSPhilip Paeps 775e948693eSPhilip Paeps /* PREEMPT */ 776e948693eSPhilip Paeps 777e948693eSPhilip Paeps #define EFSYS_PREEMPT_DISABLE(_state) \ 778e948693eSPhilip Paeps do { \ 779e948693eSPhilip Paeps (_state) = (_state); \ 780e948693eSPhilip Paeps critical_enter(); \ 781e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 782e948693eSPhilip Paeps } while (B_FALSE) 783e948693eSPhilip Paeps 784e948693eSPhilip Paeps #define EFSYS_PREEMPT_ENABLE(_state) \ 785e948693eSPhilip Paeps do { \ 786e948693eSPhilip Paeps (_state) = (_state); \ 787e948693eSPhilip Paeps critical_exit(_state); \ 788e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 789e948693eSPhilip Paeps } while (B_FALSE) 790e948693eSPhilip Paeps 791e948693eSPhilip Paeps /* STAT */ 792e948693eSPhilip Paeps 793e948693eSPhilip Paeps typedef uint64_t efsys_stat_t; 794e948693eSPhilip Paeps 795e948693eSPhilip Paeps #define EFSYS_STAT_INCR(_knp, _delta) \ 796e948693eSPhilip Paeps do { \ 797e948693eSPhilip Paeps *(_knp) += (_delta); \ 798e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 799e948693eSPhilip Paeps } while (B_FALSE) 800e948693eSPhilip Paeps 801e948693eSPhilip Paeps #define EFSYS_STAT_DECR(_knp, _delta) \ 802e948693eSPhilip Paeps do { \ 803e948693eSPhilip Paeps *(_knp) -= (_delta); \ 804e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 805e948693eSPhilip Paeps } while (B_FALSE) 806e948693eSPhilip Paeps 807e948693eSPhilip Paeps #define EFSYS_STAT_SET(_knp, _val) \ 808e948693eSPhilip Paeps do { \ 809e948693eSPhilip Paeps *(_knp) = (_val); \ 810e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 811e948693eSPhilip Paeps } while (B_FALSE) 812e948693eSPhilip Paeps 813e948693eSPhilip Paeps #define EFSYS_STAT_SET_QWORD(_knp, _valp) \ 814e948693eSPhilip Paeps do { \ 815e948693eSPhilip Paeps *(_knp) = le64toh((_valp)->eq_u64[0]); \ 816e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 817e948693eSPhilip Paeps } while (B_FALSE) 818e948693eSPhilip Paeps 819e948693eSPhilip Paeps #define EFSYS_STAT_SET_DWORD(_knp, _valp) \ 820e948693eSPhilip Paeps do { \ 821e948693eSPhilip Paeps *(_knp) = le32toh((_valp)->ed_u32[0]); \ 822e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 823e948693eSPhilip Paeps } while (B_FALSE) 824e948693eSPhilip Paeps 825e948693eSPhilip Paeps #define EFSYS_STAT_INCR_QWORD(_knp, _valp) \ 826e948693eSPhilip Paeps do { \ 827e948693eSPhilip Paeps *(_knp) += le64toh((_valp)->eq_u64[0]); \ 828e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 829e948693eSPhilip Paeps } while (B_FALSE) 830e948693eSPhilip Paeps 831e948693eSPhilip Paeps #define EFSYS_STAT_SUBR_QWORD(_knp, _valp) \ 832e948693eSPhilip Paeps do { \ 833e948693eSPhilip Paeps *(_knp) -= le64toh((_valp)->eq_u64[0]); \ 834e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 835e948693eSPhilip Paeps } while (B_FALSE) 836e948693eSPhilip Paeps 837e948693eSPhilip Paeps /* ERR */ 838e948693eSPhilip Paeps 839e948693eSPhilip Paeps extern void sfxge_err(efsys_identifier_t *, unsigned int, 840e948693eSPhilip Paeps uint32_t, uint32_t); 841e948693eSPhilip Paeps 842e948693eSPhilip Paeps #if EFSYS_OPT_DECODE_INTR_FATAL 843e948693eSPhilip Paeps #define EFSYS_ERR(_esip, _code, _dword0, _dword1) \ 844e948693eSPhilip Paeps do { \ 845e948693eSPhilip Paeps sfxge_err((_esip), (_code), (_dword0), (_dword1)); \ 846e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 847e948693eSPhilip Paeps } while (B_FALSE) 848e948693eSPhilip Paeps #endif 849e948693eSPhilip Paeps 850e948693eSPhilip Paeps /* ASSERT */ 851e948693eSPhilip Paeps 852e948693eSPhilip Paeps #define EFSYS_ASSERT(_exp) do { \ 853e948693eSPhilip Paeps if (!(_exp)) \ 854e948693eSPhilip Paeps panic(#_exp); \ 855e948693eSPhilip Paeps } while (0) 856e948693eSPhilip Paeps 857e948693eSPhilip Paeps #define EFSYS_ASSERT3(_x, _op, _y, _t) do { \ 858e948693eSPhilip Paeps const _t __x = (_t)(_x); \ 859e948693eSPhilip Paeps const _t __y = (_t)(_y); \ 860e948693eSPhilip Paeps if (!(__x _op __y)) \ 861e948693eSPhilip Paeps panic("assertion failed at %s:%u", __FILE__, __LINE__); \ 862e948693eSPhilip Paeps } while(0) 863e948693eSPhilip Paeps 864e948693eSPhilip Paeps #define EFSYS_ASSERT3U(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, uint64_t) 865e948693eSPhilip Paeps #define EFSYS_ASSERT3S(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, int64_t) 866e948693eSPhilip Paeps #define EFSYS_ASSERT3P(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, uintptr_t) 867e948693eSPhilip Paeps 868e948693eSPhilip Paeps #ifdef __cplusplus 869e948693eSPhilip Paeps } 870e948693eSPhilip Paeps #endif 871e948693eSPhilip Paeps 872e948693eSPhilip Paeps #endif /* _SYS_EFSYS_H */ 873