1e948693eSPhilip Paeps /*- 2e948693eSPhilip Paeps * Copyright (c) 2010-2011 Solarflare Communications, Inc. 3e948693eSPhilip Paeps * All rights reserved. 4e948693eSPhilip Paeps * 5e948693eSPhilip Paeps * This software was developed in part by Philip Paeps under contract for 6e948693eSPhilip Paeps * Solarflare Communications, Inc. 7e948693eSPhilip Paeps * 8e948693eSPhilip Paeps * Redistribution and use in source and binary forms, with or without 9e948693eSPhilip Paeps * modification, are permitted provided that the following conditions 10e948693eSPhilip Paeps * are met: 11e948693eSPhilip Paeps * 1. Redistributions of source code must retain the above copyright 12e948693eSPhilip Paeps * notice, this list of conditions and the following disclaimer. 13e948693eSPhilip Paeps * 2. Redistributions in binary form must reproduce the above copyright 14e948693eSPhilip Paeps * notice, this list of conditions and the following disclaimer in the 15e948693eSPhilip Paeps * documentation and/or other materials provided with the distribution. 16e948693eSPhilip Paeps * 17e948693eSPhilip Paeps * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18e948693eSPhilip Paeps * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19e948693eSPhilip Paeps * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20e948693eSPhilip Paeps * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21e948693eSPhilip Paeps * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22e948693eSPhilip Paeps * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23e948693eSPhilip Paeps * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24e948693eSPhilip Paeps * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25e948693eSPhilip Paeps * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26e948693eSPhilip Paeps * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27e948693eSPhilip Paeps * SUCH DAMAGE. 285dee87d7SPhilip Paeps * 295dee87d7SPhilip Paeps * $FreeBSD$ 30e948693eSPhilip Paeps */ 31e948693eSPhilip Paeps 32e948693eSPhilip Paeps #ifndef _SYS_EFSYS_H 33e948693eSPhilip Paeps #define _SYS_EFSYS_H 34e948693eSPhilip Paeps 35e948693eSPhilip Paeps #ifdef __cplusplus 36e948693eSPhilip Paeps extern "C" { 37e948693eSPhilip Paeps #endif 38e948693eSPhilip Paeps 39e948693eSPhilip Paeps #include <sys/param.h> 40e948693eSPhilip Paeps #include <sys/bus.h> 41e948693eSPhilip Paeps #include <sys/endian.h> 42e948693eSPhilip Paeps #include <sys/lock.h> 43e948693eSPhilip Paeps #include <sys/malloc.h> 44e948693eSPhilip Paeps #include <sys/mbuf.h> 45e948693eSPhilip Paeps #include <sys/mutex.h> 46e948693eSPhilip Paeps #include <sys/rwlock.h> 47e948693eSPhilip Paeps #include <sys/sdt.h> 48e948693eSPhilip Paeps #include <sys/systm.h> 49e948693eSPhilip Paeps 50e948693eSPhilip Paeps #include <machine/bus.h> 51e948693eSPhilip Paeps #include <machine/endian.h> 52e948693eSPhilip Paeps 53e948693eSPhilip Paeps #define EFSYS_HAS_UINT64 1 540f999687SAndrew Rybchenko #if defined(__x86_64__) 550f999687SAndrew Rybchenko #define EFSYS_USE_UINT64 1 560f999687SAndrew Rybchenko #else 57e948693eSPhilip Paeps #define EFSYS_USE_UINT64 0 580f999687SAndrew Rybchenko #endif 59e948693eSPhilip Paeps #if _BYTE_ORDER == _BIG_ENDIAN 60e948693eSPhilip Paeps #define EFSYS_IS_BIG_ENDIAN 1 61e948693eSPhilip Paeps #define EFSYS_IS_LITTLE_ENDIAN 0 62e948693eSPhilip Paeps #elif _BYTE_ORDER == _LITTLE_ENDIAN 63e948693eSPhilip Paeps #define EFSYS_IS_BIG_ENDIAN 0 64e948693eSPhilip Paeps #define EFSYS_IS_LITTLE_ENDIAN 1 65e948693eSPhilip Paeps #endif 66e948693eSPhilip Paeps #include "efx_types.h" 67e948693eSPhilip Paeps 68e948693eSPhilip Paeps /* Common code requires this */ 69e948693eSPhilip Paeps #if __FreeBSD_version < 800068 70e948693eSPhilip Paeps #define memmove(d, s, l) bcopy(s, d, l) 71e948693eSPhilip Paeps #endif 72e948693eSPhilip Paeps 73e948693eSPhilip Paeps /* FreeBSD equivalents of Solaris things */ 74e948693eSPhilip Paeps #ifndef _NOTE 75e948693eSPhilip Paeps #define _NOTE(s) 76e948693eSPhilip Paeps #endif 77e948693eSPhilip Paeps 78e948693eSPhilip Paeps #ifndef B_FALSE 79e948693eSPhilip Paeps #define B_FALSE FALSE 80e948693eSPhilip Paeps #endif 81e948693eSPhilip Paeps #ifndef B_TRUE 82e948693eSPhilip Paeps #define B_TRUE TRUE 83e948693eSPhilip Paeps #endif 84e948693eSPhilip Paeps 85e948693eSPhilip Paeps #ifndef IS_P2ALIGNED 86e948693eSPhilip Paeps #define IS_P2ALIGNED(v, a) ((((uintptr_t)(v)) & ((uintptr_t)(a) - 1)) == 0) 87e948693eSPhilip Paeps #endif 88e948693eSPhilip Paeps 89e948693eSPhilip Paeps #ifndef P2ROUNDUP 90e948693eSPhilip Paeps #define P2ROUNDUP(x, align) (-(-(x) & -(align))) 91e948693eSPhilip Paeps #endif 92e948693eSPhilip Paeps 93e948693eSPhilip Paeps #ifndef IS2P 94e948693eSPhilip Paeps #define ISP2(x) (((x) & ((x) - 1)) == 0) 95e948693eSPhilip Paeps #endif 96e948693eSPhilip Paeps 97*5dadbb64SAndrew Rybchenko #if defined(__x86_64__) && __FreeBSD_version >= 1000000 98*5dadbb64SAndrew Rybchenko 99*5dadbb64SAndrew Rybchenko #define SFXGE_USE_BUS_SPACE_8 1 100*5dadbb64SAndrew Rybchenko 101d9ff48abSAndrew Rybchenko #if !defined(bus_space_read_stream_8) 102*5dadbb64SAndrew Rybchenko 103d9ff48abSAndrew Rybchenko #define bus_space_read_stream_8(t, h, o) \ 104d9ff48abSAndrew Rybchenko bus_space_read_8((t), (h), (o)) 105*5dadbb64SAndrew Rybchenko 106d9ff48abSAndrew Rybchenko #define bus_space_write_stream_8(t, h, o, v) \ 107d9ff48abSAndrew Rybchenko bus_space_write_8((t), (h), (o), (v)) 108*5dadbb64SAndrew Rybchenko 109d9ff48abSAndrew Rybchenko #endif 110*5dadbb64SAndrew Rybchenko 111d9ff48abSAndrew Rybchenko #endif 112d9ff48abSAndrew Rybchenko 113e948693eSPhilip Paeps #define ENOTACTIVE EINVAL 114e948693eSPhilip Paeps 115e948693eSPhilip Paeps /* Memory type to use on FreeBSD */ 116e948693eSPhilip Paeps MALLOC_DECLARE(M_SFXGE); 117e948693eSPhilip Paeps 118e948693eSPhilip Paeps /* Machine dependend prefetch wrappers */ 119dc1788e8SMarius Strobl #if defined(__i386__) || defined(__amd64__) 120e948693eSPhilip Paeps static __inline void 121e948693eSPhilip Paeps prefetch_read_many(void *addr) 122e948693eSPhilip Paeps { 123dc1788e8SMarius Strobl 124e948693eSPhilip Paeps __asm__( 125e948693eSPhilip Paeps "prefetcht0 (%0)" 126e948693eSPhilip Paeps : 127e948693eSPhilip Paeps : "r" (addr)); 128e948693eSPhilip Paeps } 129e948693eSPhilip Paeps 130e948693eSPhilip Paeps static __inline void 131e948693eSPhilip Paeps prefetch_read_once(void *addr) 132e948693eSPhilip Paeps { 133dc1788e8SMarius Strobl 134e948693eSPhilip Paeps __asm__( 135e948693eSPhilip Paeps "prefetchnta (%0)" 136e948693eSPhilip Paeps : 137e948693eSPhilip Paeps : "r" (addr)); 138e948693eSPhilip Paeps } 139dc1788e8SMarius Strobl #elif defined(__sparc64__) 140dc1788e8SMarius Strobl static __inline void 141dc1788e8SMarius Strobl prefetch_read_many(void *addr) 142dc1788e8SMarius Strobl { 143dc1788e8SMarius Strobl 144dc1788e8SMarius Strobl __asm__( 145dc1788e8SMarius Strobl "prefetch [%0], 0" 146dc1788e8SMarius Strobl : 147dc1788e8SMarius Strobl : "r" (addr)); 148dc1788e8SMarius Strobl } 149dc1788e8SMarius Strobl 150dc1788e8SMarius Strobl static __inline void 151dc1788e8SMarius Strobl prefetch_read_once(void *addr) 152dc1788e8SMarius Strobl { 153dc1788e8SMarius Strobl 154dc1788e8SMarius Strobl __asm__( 155dc1788e8SMarius Strobl "prefetch [%0], 1" 156dc1788e8SMarius Strobl : 157dc1788e8SMarius Strobl : "r" (addr)); 158dc1788e8SMarius Strobl } 159dc1788e8SMarius Strobl #else 160dc1788e8SMarius Strobl static __inline void 161dc1788e8SMarius Strobl prefetch_read_many(void *addr) 162dc1788e8SMarius Strobl { 163dc1788e8SMarius Strobl 164dc1788e8SMarius Strobl } 165dc1788e8SMarius Strobl 166dc1788e8SMarius Strobl static __inline void 167dc1788e8SMarius Strobl prefetch_read_once(void *addr) 168dc1788e8SMarius Strobl { 169dc1788e8SMarius Strobl 170dc1788e8SMarius Strobl } 171e948693eSPhilip Paeps #endif 172e948693eSPhilip Paeps 173e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__) 174e948693eSPhilip Paeps #include <vm/vm.h> 175e948693eSPhilip Paeps #include <vm/pmap.h> 176e948693eSPhilip Paeps #endif 177e948693eSPhilip Paeps static __inline void 178e948693eSPhilip Paeps sfxge_map_mbuf_fast(bus_dma_tag_t tag, bus_dmamap_t map, 179e948693eSPhilip Paeps struct mbuf *m, bus_dma_segment_t *seg) 180e948693eSPhilip Paeps { 181e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__) 182e948693eSPhilip Paeps seg->ds_addr = pmap_kextract(mtod(m, vm_offset_t)); 183e948693eSPhilip Paeps seg->ds_len = m->m_len; 184e948693eSPhilip Paeps #else 185e948693eSPhilip Paeps int nsegstmp; 186e948693eSPhilip Paeps 187e948693eSPhilip Paeps bus_dmamap_load_mbuf_sg(tag, map, m, seg, &nsegstmp, 0); 188e948693eSPhilip Paeps #endif 189e948693eSPhilip Paeps } 190e948693eSPhilip Paeps 191e948693eSPhilip Paeps /* Modifiers used for DOS builds */ 192e948693eSPhilip Paeps #define __cs 193e948693eSPhilip Paeps #define __far 194e948693eSPhilip Paeps 195e948693eSPhilip Paeps /* Modifiers used for Windows builds */ 196e948693eSPhilip Paeps #define __in 197e948693eSPhilip Paeps #define __in_opt 198e948693eSPhilip Paeps #define __in_ecount(_n) 199e948693eSPhilip Paeps #define __in_ecount_opt(_n) 200e948693eSPhilip Paeps #define __in_bcount(_n) 201e948693eSPhilip Paeps #define __in_bcount_opt(_n) 202e948693eSPhilip Paeps 203e948693eSPhilip Paeps #define __out 204e948693eSPhilip Paeps #define __out_opt 205e948693eSPhilip Paeps #define __out_ecount(_n) 206e948693eSPhilip Paeps #define __out_ecount_opt(_n) 207e948693eSPhilip Paeps #define __out_bcount(_n) 208e948693eSPhilip Paeps #define __out_bcount_opt(_n) 209e948693eSPhilip Paeps 210e948693eSPhilip Paeps #define __deref_out 211e948693eSPhilip Paeps 212e948693eSPhilip Paeps #define __inout 213e948693eSPhilip Paeps #define __inout_opt 214e948693eSPhilip Paeps #define __inout_ecount(_n) 215e948693eSPhilip Paeps #define __inout_ecount_opt(_n) 216e948693eSPhilip Paeps #define __inout_bcount(_n) 217e948693eSPhilip Paeps #define __inout_bcount_opt(_n) 218e948693eSPhilip Paeps #define __inout_bcount_full_opt(_n) 219e948693eSPhilip Paeps 220e948693eSPhilip Paeps #define __deref_out_bcount_opt(n) 221e948693eSPhilip Paeps 222e948693eSPhilip Paeps #define __checkReturn 223e948693eSPhilip Paeps 224e948693eSPhilip Paeps #define __drv_when(_p, _c) 225e948693eSPhilip Paeps 226e948693eSPhilip Paeps /* Code inclusion options */ 227e948693eSPhilip Paeps 228e948693eSPhilip Paeps 229e948693eSPhilip Paeps #define EFSYS_OPT_NAMES 1 230e948693eSPhilip Paeps 231e948693eSPhilip Paeps #define EFSYS_OPT_FALCON 0 232e948693eSPhilip Paeps #define EFSYS_OPT_FALCON_NIC_CFG_OVERRIDE 0 233e948693eSPhilip Paeps #define EFSYS_OPT_SIENA 1 234e948693eSPhilip Paeps #ifdef DEBUG 235e948693eSPhilip Paeps #define EFSYS_OPT_CHECK_REG 1 236e948693eSPhilip Paeps #else 237e948693eSPhilip Paeps #define EFSYS_OPT_CHECK_REG 0 238e948693eSPhilip Paeps #endif 239e948693eSPhilip Paeps 240e948693eSPhilip Paeps #define EFSYS_OPT_MCDI 1 241e948693eSPhilip Paeps 242e948693eSPhilip Paeps #define EFSYS_OPT_MAC_FALCON_GMAC 0 243e948693eSPhilip Paeps #define EFSYS_OPT_MAC_FALCON_XMAC 0 244e948693eSPhilip Paeps #define EFSYS_OPT_MAC_STATS 1 245e948693eSPhilip Paeps 246e948693eSPhilip Paeps #define EFSYS_OPT_LOOPBACK 0 247e948693eSPhilip Paeps 248e948693eSPhilip Paeps #define EFSYS_OPT_MON_NULL 0 249e948693eSPhilip Paeps #define EFSYS_OPT_MON_LM87 0 250e948693eSPhilip Paeps #define EFSYS_OPT_MON_MAX6647 0 251e948693eSPhilip Paeps #define EFSYS_OPT_MON_SIENA 0 252e948693eSPhilip Paeps #define EFSYS_OPT_MON_STATS 0 253e948693eSPhilip Paeps 254e948693eSPhilip Paeps #define EFSYS_OPT_PHY_NULL 0 255e948693eSPhilip Paeps #define EFSYS_OPT_PHY_QT2022C2 0 256e948693eSPhilip Paeps #define EFSYS_OPT_PHY_SFX7101 0 257e948693eSPhilip Paeps #define EFSYS_OPT_PHY_TXC43128 0 258e948693eSPhilip Paeps #define EFSYS_OPT_PHY_PM8358 0 259e948693eSPhilip Paeps #define EFSYS_OPT_PHY_SFT9001 0 260e948693eSPhilip Paeps #define EFSYS_OPT_PHY_QT2025C 0 261e948693eSPhilip Paeps #define EFSYS_OPT_PHY_STATS 1 262e948693eSPhilip Paeps #define EFSYS_OPT_PHY_PROPS 0 263e948693eSPhilip Paeps #define EFSYS_OPT_PHY_BIST 1 264e948693eSPhilip Paeps #define EFSYS_OPT_PHY_LED_CONTROL 1 265e948693eSPhilip Paeps #define EFSYS_OPT_PHY_FLAGS 0 266e948693eSPhilip Paeps 267e948693eSPhilip Paeps #define EFSYS_OPT_VPD 1 268e948693eSPhilip Paeps #define EFSYS_OPT_NVRAM 1 269e948693eSPhilip Paeps #define EFSYS_OPT_NVRAM_FALCON_BOOTROM 0 270e948693eSPhilip Paeps #define EFSYS_OPT_NVRAM_SFT9001 0 271e948693eSPhilip Paeps #define EFSYS_OPT_NVRAM_SFX7101 0 272e948693eSPhilip Paeps #define EFSYS_OPT_BOOTCFG 0 273e948693eSPhilip Paeps 274e948693eSPhilip Paeps #define EFSYS_OPT_PCIE_TUNE 0 275e948693eSPhilip Paeps #define EFSYS_OPT_DIAG 0 276e948693eSPhilip Paeps #define EFSYS_OPT_WOL 1 277e948693eSPhilip Paeps #define EFSYS_OPT_RX_SCALE 1 278e948693eSPhilip Paeps #define EFSYS_OPT_QSTATS 1 279e948693eSPhilip Paeps #define EFSYS_OPT_FILTER 0 280e948693eSPhilip Paeps #define EFSYS_OPT_RX_SCATTER 0 281e948693eSPhilip Paeps #define EFSYS_OPT_RX_HDR_SPLIT 0 282e948693eSPhilip Paeps 283e948693eSPhilip Paeps #define EFSYS_OPT_EV_PREFETCH 0 284e948693eSPhilip Paeps 285e948693eSPhilip Paeps #define EFSYS_OPT_DECODE_INTR_FATAL 1 286e948693eSPhilip Paeps 287e948693eSPhilip Paeps /* ID */ 288e948693eSPhilip Paeps 289e948693eSPhilip Paeps typedef struct __efsys_identifier_s efsys_identifier_t; 290e948693eSPhilip Paeps 291e948693eSPhilip Paeps /* PROBE */ 292e948693eSPhilip Paeps 29354366c0bSAttilio Rao #ifndef DTRACE_PROBE 294e948693eSPhilip Paeps 295e948693eSPhilip Paeps #define EFSYS_PROBE(_name) 296e948693eSPhilip Paeps 297e948693eSPhilip Paeps #define EFSYS_PROBE1(_name, _type1, _arg1) 298e948693eSPhilip Paeps 299e948693eSPhilip Paeps #define EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2) 300e948693eSPhilip Paeps 301e948693eSPhilip Paeps #define EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2, \ 302e948693eSPhilip Paeps _type3, _arg3) 303e948693eSPhilip Paeps 304e948693eSPhilip Paeps #define EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 305e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) 306e948693eSPhilip Paeps 307e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 308e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) 309e948693eSPhilip Paeps 310e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 311e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 312e948693eSPhilip Paeps _type6, _arg6) 313e948693eSPhilip Paeps 314e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 315e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 316e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) 317e948693eSPhilip Paeps 31854366c0bSAttilio Rao #else /* DTRACE_PROBE */ 319e948693eSPhilip Paeps 320e948693eSPhilip Paeps #define EFSYS_PROBE(_name) \ 321e948693eSPhilip Paeps DTRACE_PROBE(_name) 322e948693eSPhilip Paeps 323e948693eSPhilip Paeps #define EFSYS_PROBE1(_name, _type1, _arg1) \ 324e948693eSPhilip Paeps DTRACE_PROBE1(_name, _type1, _arg1) 325e948693eSPhilip Paeps 326e948693eSPhilip Paeps #define EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2) \ 327e948693eSPhilip Paeps DTRACE_PROBE2(_name, _type1, _arg1, _type2, _arg2) 328e948693eSPhilip Paeps 329e948693eSPhilip Paeps #define EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2, \ 330e948693eSPhilip Paeps _type3, _arg3) \ 331e948693eSPhilip Paeps DTRACE_PROBE3(_name, _type1, _arg1, _type2, _arg2, \ 332e948693eSPhilip Paeps _type3, _arg3) 333e948693eSPhilip Paeps 334e948693eSPhilip Paeps #define EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 335e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) \ 336e948693eSPhilip Paeps DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 337e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) 338e948693eSPhilip Paeps 339e948693eSPhilip Paeps #ifdef DTRACE_PROBE5 340e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 341e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) \ 342e948693eSPhilip Paeps DTRACE_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 343e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) 344e948693eSPhilip Paeps #else 345e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 346e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) \ 347e948693eSPhilip Paeps DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 348e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) 349e948693eSPhilip Paeps #endif 350e948693eSPhilip Paeps 351e948693eSPhilip Paeps #ifdef DTRACE_PROBE6 352e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 353e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 354e948693eSPhilip Paeps _type6, _arg6) \ 355e948693eSPhilip Paeps DTRACE_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 356e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 357e948693eSPhilip Paeps _type6, _arg6) 358e948693eSPhilip Paeps #else 359e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 360e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 361e948693eSPhilip Paeps _type6, _arg6) \ 362e948693eSPhilip Paeps EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 363e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) 364e948693eSPhilip Paeps #endif 365e948693eSPhilip Paeps 366e948693eSPhilip Paeps #ifdef DTRACE_PROBE7 367e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 368e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 369e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) \ 370e948693eSPhilip Paeps DTRACE_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 371e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 372e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) 373e948693eSPhilip Paeps #else 374e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 375e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 376e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) \ 377e948693eSPhilip Paeps EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 378e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 379e948693eSPhilip Paeps _type6, _arg6) 380e948693eSPhilip Paeps #endif 381e948693eSPhilip Paeps 38254366c0bSAttilio Rao #endif /* DTRACE_PROBE */ 383e948693eSPhilip Paeps 384e948693eSPhilip Paeps /* DMA */ 385e948693eSPhilip Paeps 386e948693eSPhilip Paeps typedef uint64_t efsys_dma_addr_t; 387e948693eSPhilip Paeps 388e948693eSPhilip Paeps typedef struct efsys_mem_s { 389e948693eSPhilip Paeps bus_dma_tag_t esm_tag; 390e948693eSPhilip Paeps bus_dmamap_t esm_map; 391e948693eSPhilip Paeps caddr_t esm_base; 392e948693eSPhilip Paeps efsys_dma_addr_t esm_addr; 393e948693eSPhilip Paeps } efsys_mem_t; 394e948693eSPhilip Paeps 395e948693eSPhilip Paeps 396e948693eSPhilip Paeps #define EFSYS_MEM_ZERO(_esmp, _size) \ 397e948693eSPhilip Paeps do { \ 398e948693eSPhilip Paeps (void) memset((_esmp)->esm_base, 0, (_size)); \ 399e948693eSPhilip Paeps \ 400e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 401e948693eSPhilip Paeps } while (B_FALSE) 402e948693eSPhilip Paeps 403e948693eSPhilip Paeps #define EFSYS_MEM_READD(_esmp, _offset, _edp) \ 404e948693eSPhilip Paeps do { \ 405e948693eSPhilip Paeps uint32_t *addr; \ 406e948693eSPhilip Paeps \ 407e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 408e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 409e948693eSPhilip Paeps ("not power of 2 aligned")); \ 410e948693eSPhilip Paeps \ 411e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 412e948693eSPhilip Paeps \ 413e948693eSPhilip Paeps (_edp)->ed_u32[0] = *addr; \ 414e948693eSPhilip Paeps \ 415e948693eSPhilip Paeps EFSYS_PROBE2(mem_readd, unsigned int, (_offset), \ 416e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 417e948693eSPhilip Paeps \ 418e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 419e948693eSPhilip Paeps } while (B_FALSE) 420e948693eSPhilip Paeps 4210f999687SAndrew Rybchenko #if defined(__x86_64__) 4220f999687SAndrew Rybchenko #define EFSYS_MEM_READQ(_esmp, _offset, _eqp) \ 4230f999687SAndrew Rybchenko do { \ 4240f999687SAndrew Rybchenko uint64_t *addr; \ 4250f999687SAndrew Rybchenko \ 4260f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 4270f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 4280f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 4290f999687SAndrew Rybchenko \ 4300f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \ 4310f999687SAndrew Rybchenko \ 4320f999687SAndrew Rybchenko (_eqp)->eq_u64[0] = *addr; \ 4330f999687SAndrew Rybchenko \ 4340f999687SAndrew Rybchenko EFSYS_PROBE3(mem_readq, unsigned int, (_offset), \ 4350f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 4360f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 4370f999687SAndrew Rybchenko \ 4380f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 4390f999687SAndrew Rybchenko } while (B_FALSE) 4400f999687SAndrew Rybchenko #else 441e948693eSPhilip Paeps #define EFSYS_MEM_READQ(_esmp, _offset, _eqp) \ 442e948693eSPhilip Paeps do { \ 443e948693eSPhilip Paeps uint32_t *addr; \ 444e948693eSPhilip Paeps \ 445e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 446e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 447e948693eSPhilip Paeps ("not power of 2 aligned")); \ 448e948693eSPhilip Paeps \ 449e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 450e948693eSPhilip Paeps \ 451e948693eSPhilip Paeps (_eqp)->eq_u32[0] = *addr++; \ 452e948693eSPhilip Paeps (_eqp)->eq_u32[1] = *addr; \ 453e948693eSPhilip Paeps \ 454e948693eSPhilip Paeps EFSYS_PROBE3(mem_readq, unsigned int, (_offset), \ 455e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 456e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 457e948693eSPhilip Paeps \ 458e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 459e948693eSPhilip Paeps } while (B_FALSE) 4600f999687SAndrew Rybchenko #endif 461e948693eSPhilip Paeps 4620f999687SAndrew Rybchenko #if defined(__x86_64__) 4630f999687SAndrew Rybchenko #define EFSYS_MEM_READO(_esmp, _offset, _eop) \ 4640f999687SAndrew Rybchenko do { \ 4650f999687SAndrew Rybchenko uint64_t *addr; \ 4660f999687SAndrew Rybchenko \ 4670f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 4680f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 4690f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 4700f999687SAndrew Rybchenko \ 4710f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \ 4720f999687SAndrew Rybchenko \ 4730f999687SAndrew Rybchenko (_eop)->eo_u64[0] = *addr++; \ 4740f999687SAndrew Rybchenko (_eop)->eo_u64[1] = *addr; \ 4750f999687SAndrew Rybchenko \ 4760f999687SAndrew Rybchenko EFSYS_PROBE5(mem_reado, unsigned int, (_offset), \ 4770f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 4780f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 4790f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 4800f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 4810f999687SAndrew Rybchenko \ 4820f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 4830f999687SAndrew Rybchenko } while (B_FALSE) 4840f999687SAndrew Rybchenko #else 485e948693eSPhilip Paeps #define EFSYS_MEM_READO(_esmp, _offset, _eop) \ 486e948693eSPhilip Paeps do { \ 487e948693eSPhilip Paeps uint32_t *addr; \ 488e948693eSPhilip Paeps \ 489e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 490e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 491e948693eSPhilip Paeps ("not power of 2 aligned")); \ 492e948693eSPhilip Paeps \ 493e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 494e948693eSPhilip Paeps \ 495e948693eSPhilip Paeps (_eop)->eo_u32[0] = *addr++; \ 496e948693eSPhilip Paeps (_eop)->eo_u32[1] = *addr++; \ 497e948693eSPhilip Paeps (_eop)->eo_u32[2] = *addr++; \ 498e948693eSPhilip Paeps (_eop)->eo_u32[3] = *addr; \ 499e948693eSPhilip Paeps \ 500e948693eSPhilip Paeps EFSYS_PROBE5(mem_reado, unsigned int, (_offset), \ 501e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 502e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 503e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 504e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 505e948693eSPhilip Paeps \ 506e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 507e948693eSPhilip Paeps } while (B_FALSE) 5080f999687SAndrew Rybchenko #endif 509e948693eSPhilip Paeps 510e948693eSPhilip Paeps #define EFSYS_MEM_WRITED(_esmp, _offset, _edp) \ 511e948693eSPhilip Paeps do { \ 512e948693eSPhilip Paeps uint32_t *addr; \ 513e948693eSPhilip Paeps \ 514e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 515e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 516e948693eSPhilip Paeps ("not power of 2 aligned")); \ 517e948693eSPhilip Paeps \ 518e948693eSPhilip Paeps EFSYS_PROBE2(mem_writed, unsigned int, (_offset), \ 519e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 520e948693eSPhilip Paeps \ 521e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 522e948693eSPhilip Paeps \ 523e948693eSPhilip Paeps *addr = (_edp)->ed_u32[0]; \ 524e948693eSPhilip Paeps \ 525e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 526e948693eSPhilip Paeps } while (B_FALSE) 527e948693eSPhilip Paeps 5280f999687SAndrew Rybchenko #if defined(__x86_64__) 5290f999687SAndrew Rybchenko #define EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp) \ 5300f999687SAndrew Rybchenko do { \ 5310f999687SAndrew Rybchenko uint64_t *addr; \ 5320f999687SAndrew Rybchenko \ 5330f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 5340f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 5350f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 5360f999687SAndrew Rybchenko \ 5370f999687SAndrew Rybchenko EFSYS_PROBE3(mem_writeq, unsigned int, (_offset), \ 5380f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 5390f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 5400f999687SAndrew Rybchenko \ 5410f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \ 5420f999687SAndrew Rybchenko \ 5430f999687SAndrew Rybchenko *addr = (_eqp)->eq_u64[0]; \ 5440f999687SAndrew Rybchenko \ 5450f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 5460f999687SAndrew Rybchenko } while (B_FALSE) 5470f999687SAndrew Rybchenko 5480f999687SAndrew Rybchenko #else 549e948693eSPhilip Paeps #define EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp) \ 550e948693eSPhilip Paeps do { \ 551e948693eSPhilip Paeps uint32_t *addr; \ 552e948693eSPhilip Paeps \ 553e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 554e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 555e948693eSPhilip Paeps ("not power of 2 aligned")); \ 556e948693eSPhilip Paeps \ 557e948693eSPhilip Paeps EFSYS_PROBE3(mem_writeq, unsigned int, (_offset), \ 558e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 559e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 560e948693eSPhilip Paeps \ 561e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 562e948693eSPhilip Paeps \ 563e948693eSPhilip Paeps *addr++ = (_eqp)->eq_u32[0]; \ 564e948693eSPhilip Paeps *addr = (_eqp)->eq_u32[1]; \ 565e948693eSPhilip Paeps \ 566e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 567e948693eSPhilip Paeps } while (B_FALSE) 5680f999687SAndrew Rybchenko #endif 569e948693eSPhilip Paeps 5700f999687SAndrew Rybchenko #if defined(__x86_64__) 5710f999687SAndrew Rybchenko #define EFSYS_MEM_WRITEO(_esmp, _offset, _eop) \ 5720f999687SAndrew Rybchenko do { \ 5730f999687SAndrew Rybchenko uint64_t *addr; \ 5740f999687SAndrew Rybchenko \ 5750f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 5760f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 5770f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 5780f999687SAndrew Rybchenko \ 5790f999687SAndrew Rybchenko EFSYS_PROBE5(mem_writeo, unsigned int, (_offset), \ 5800f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 5810f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 5820f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 5830f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 5840f999687SAndrew Rybchenko \ 5850f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \ 5860f999687SAndrew Rybchenko \ 5870f999687SAndrew Rybchenko *addr++ = (_eop)->eo_u64[0]; \ 5880f999687SAndrew Rybchenko *addr = (_eop)->eo_u64[1]; \ 5890f999687SAndrew Rybchenko \ 5900f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 5910f999687SAndrew Rybchenko } while (B_FALSE) 5920f999687SAndrew Rybchenko #else 593e948693eSPhilip Paeps #define EFSYS_MEM_WRITEO(_esmp, _offset, _eop) \ 594e948693eSPhilip Paeps do { \ 595e948693eSPhilip Paeps uint32_t *addr; \ 596e948693eSPhilip Paeps \ 597e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 598e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 599e948693eSPhilip Paeps ("not power of 2 aligned")); \ 600e948693eSPhilip Paeps \ 601e948693eSPhilip Paeps EFSYS_PROBE5(mem_writeo, 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 addr = (void *)((_esmp)->esm_base + (_offset)); \ 608e948693eSPhilip Paeps \ 609e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[0]; \ 610e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[1]; \ 611e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[2]; \ 612e948693eSPhilip Paeps *addr = (_eop)->eo_u32[3]; \ 613e948693eSPhilip Paeps \ 614e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 615e948693eSPhilip Paeps } while (B_FALSE) 6160f999687SAndrew Rybchenko #endif 617e948693eSPhilip Paeps 618e948693eSPhilip Paeps #define EFSYS_MEM_ADDR(_esmp) \ 619e948693eSPhilip Paeps ((_esmp)->esm_addr) 620e948693eSPhilip Paeps 621e948693eSPhilip Paeps /* BAR */ 622e948693eSPhilip Paeps 62333d45dc5SAndrew Rybchenko #define SFXGE_LOCK_NAME_MAX 16 62433d45dc5SAndrew Rybchenko 625e948693eSPhilip Paeps typedef struct efsys_bar_s { 626e948693eSPhilip Paeps struct mtx esb_lock; 62733d45dc5SAndrew Rybchenko char esb_lock_name[SFXGE_LOCK_NAME_MAX]; 628e948693eSPhilip Paeps bus_space_tag_t esb_tag; 629e948693eSPhilip Paeps bus_space_handle_t esb_handle; 630e948693eSPhilip Paeps int esb_rid; 631e948693eSPhilip Paeps struct resource *esb_res; 632e948693eSPhilip Paeps } efsys_bar_t; 633e948693eSPhilip Paeps 63433d45dc5SAndrew Rybchenko #define SFXGE_BAR_LOCK_INIT(_esbp, _ifname) \ 63533d45dc5SAndrew Rybchenko do { \ 63633d45dc5SAndrew Rybchenko snprintf((_esbp)->esb_lock_name, \ 63733d45dc5SAndrew Rybchenko sizeof((_esbp)->esb_lock_name), \ 63833d45dc5SAndrew Rybchenko "%s:bar", (_ifname)); \ 63933d45dc5SAndrew Rybchenko mtx_init(&(_esbp)->esb_lock, (_esbp)->esb_lock_name, \ 64033d45dc5SAndrew Rybchenko NULL, MTX_DEF); \ 64133d45dc5SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 64233d45dc5SAndrew Rybchenko } while (B_FALSE) 643763cab71SAndrew Rybchenko #define SFXGE_BAR_LOCK_DESTROY(_esbp) \ 644763cab71SAndrew Rybchenko mtx_destroy(&(_esbp)->esb_lock) 645763cab71SAndrew Rybchenko #define SFXGE_BAR_LOCK(_esbp) \ 646763cab71SAndrew Rybchenko mtx_lock(&(_esbp)->esb_lock) 647763cab71SAndrew Rybchenko #define SFXGE_BAR_UNLOCK(_esbp) \ 648763cab71SAndrew Rybchenko mtx_unlock(&(_esbp)->esb_lock) 649763cab71SAndrew Rybchenko 650e948693eSPhilip Paeps #define EFSYS_BAR_READD(_esbp, _offset, _edp, _lock) \ 651e948693eSPhilip Paeps do { \ 652e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 653e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 654e948693eSPhilip Paeps ("not power of 2 aligned")); \ 655e948693eSPhilip Paeps \ 656e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 657e948693eSPhilip Paeps if (_lock) \ 658763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 659e948693eSPhilip Paeps \ 660d9ff48abSAndrew Rybchenko (_edp)->ed_u32[0] = bus_space_read_stream_4( \ 661d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 662d9ff48abSAndrew Rybchenko (_offset)); \ 663e948693eSPhilip Paeps \ 664e948693eSPhilip Paeps EFSYS_PROBE2(bar_readd, unsigned int, (_offset), \ 665e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 666e948693eSPhilip Paeps \ 667e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 668e948693eSPhilip Paeps if (_lock) \ 669763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 670e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 671e948693eSPhilip Paeps } while (B_FALSE) 672e948693eSPhilip Paeps 673*5dadbb64SAndrew Rybchenko #if defined(SFXGE_USE_BUS_SPACE_8) 674e948693eSPhilip Paeps #define EFSYS_BAR_READQ(_esbp, _offset, _eqp) \ 675e948693eSPhilip Paeps do { \ 676e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 677e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 678e948693eSPhilip Paeps ("not power of 2 aligned")); \ 679e948693eSPhilip Paeps \ 680763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 681e948693eSPhilip Paeps \ 682d9ff48abSAndrew Rybchenko (_eqp)->eq_u64[0] = bus_space_read_stream_8( \ 683d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 684d9ff48abSAndrew Rybchenko (_offset)); \ 6850f999687SAndrew Rybchenko \ 6860f999687SAndrew Rybchenko EFSYS_PROBE3(bar_readq, unsigned int, (_offset), \ 6870f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 6880f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 6890f999687SAndrew Rybchenko \ 690687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 6910f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 6920f999687SAndrew Rybchenko } while (B_FALSE) 6930f999687SAndrew Rybchenko 6940f999687SAndrew Rybchenko #define EFSYS_BAR_READO(_esbp, _offset, _eop, _lock) \ 6950f999687SAndrew Rybchenko do { \ 6960f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 6970f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 6980f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 6990f999687SAndrew Rybchenko \ 7000f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 7010f999687SAndrew Rybchenko if (_lock) \ 702687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 7030f999687SAndrew Rybchenko \ 704d9ff48abSAndrew Rybchenko (_eop)->eo_u64[0] = bus_space_read_stream_8( \ 705d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 706d9ff48abSAndrew Rybchenko (_offset)); \ 707d9ff48abSAndrew Rybchenko (_eop)->eo_u64[1] = bus_space_read_stream_8( \ 708d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 709d9ff48abSAndrew Rybchenko (_offset) + 8); \ 7100f999687SAndrew Rybchenko \ 7110f999687SAndrew Rybchenko EFSYS_PROBE5(bar_reado, unsigned int, (_offset), \ 7120f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 7130f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 7140f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 7150f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 7160f999687SAndrew Rybchenko \ 7170f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 7180f999687SAndrew Rybchenko if (_lock) \ 719687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 7200f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 7210f999687SAndrew Rybchenko } while (B_FALSE) 7220f999687SAndrew Rybchenko 7230f999687SAndrew Rybchenko #else 7240f999687SAndrew Rybchenko #define EFSYS_BAR_READQ(_esbp, _offset, _eqp) \ 7250f999687SAndrew Rybchenko do { \ 7260f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 7270f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 7280f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 7290f999687SAndrew Rybchenko \ 730687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 7310f999687SAndrew Rybchenko \ 732d9ff48abSAndrew Rybchenko (_eqp)->eq_u32[0] = bus_space_read_stream_4( \ 733d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 734d9ff48abSAndrew Rybchenko (_offset)); \ 735d9ff48abSAndrew Rybchenko (_eqp)->eq_u32[1] = bus_space_read_stream_4( \ 736d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 737d9ff48abSAndrew Rybchenko (_offset) + 4); \ 738e948693eSPhilip Paeps \ 739e948693eSPhilip Paeps EFSYS_PROBE3(bar_readq, unsigned int, (_offset), \ 740e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 741e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 742e948693eSPhilip Paeps \ 743763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 744e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 745e948693eSPhilip Paeps } while (B_FALSE) 746e948693eSPhilip Paeps 747e948693eSPhilip Paeps #define EFSYS_BAR_READO(_esbp, _offset, _eop, _lock) \ 748e948693eSPhilip Paeps do { \ 749e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 750e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 751e948693eSPhilip Paeps ("not power of 2 aligned")); \ 752e948693eSPhilip Paeps \ 753e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 754e948693eSPhilip Paeps if (_lock) \ 755763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 756e948693eSPhilip Paeps \ 757d9ff48abSAndrew Rybchenko (_eop)->eo_u32[0] = bus_space_read_stream_4( \ 758d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 759d9ff48abSAndrew Rybchenko (_offset)); \ 760d9ff48abSAndrew Rybchenko (_eop)->eo_u32[1] = bus_space_read_stream_4( \ 761d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 762d9ff48abSAndrew Rybchenko (_offset) + 4); \ 763d9ff48abSAndrew Rybchenko (_eop)->eo_u32[2] = bus_space_read_stream_4( \ 764d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 765d9ff48abSAndrew Rybchenko (_offset) + 8); \ 766d9ff48abSAndrew Rybchenko (_eop)->eo_u32[3] = bus_space_read_stream_4( \ 767d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 768d9ff48abSAndrew Rybchenko (_offset) + 12); \ 769e948693eSPhilip Paeps \ 770e948693eSPhilip Paeps EFSYS_PROBE5(bar_reado, unsigned int, (_offset), \ 771e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 772e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 773e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 774e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 775e948693eSPhilip Paeps \ 776e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 777e948693eSPhilip Paeps if (_lock) \ 778763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 779e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 780e948693eSPhilip Paeps } while (B_FALSE) 7810f999687SAndrew Rybchenko #endif 782e948693eSPhilip Paeps 783e948693eSPhilip Paeps #define EFSYS_BAR_WRITED(_esbp, _offset, _edp, _lock) \ 784e948693eSPhilip Paeps do { \ 785e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 786e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 787e948693eSPhilip Paeps ("not power of 2 aligned")); \ 788e948693eSPhilip Paeps \ 789e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 790e948693eSPhilip Paeps if (_lock) \ 791763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 792e948693eSPhilip Paeps \ 793e948693eSPhilip Paeps EFSYS_PROBE2(bar_writed, unsigned int, (_offset), \ 794e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 795e948693eSPhilip Paeps \ 7961cc8febfSAndrew Rybchenko /* \ 7971cc8febfSAndrew Rybchenko * Make sure that previous writes to the dword have \ 7981cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \ 7991cc8febfSAndrew Rybchenko * after the write below. \ 8001cc8febfSAndrew Rybchenko */ \ 8011cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 8021cc8febfSAndrew Rybchenko (_offset), sizeof (efx_dword_t), \ 8031cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 804d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 805d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 806e948693eSPhilip Paeps (_offset), (_edp)->ed_u32[0]); \ 807e948693eSPhilip Paeps \ 808e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 809e948693eSPhilip Paeps if (_lock) \ 810763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 811e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 812e948693eSPhilip Paeps } while (B_FALSE) 813e948693eSPhilip Paeps 814*5dadbb64SAndrew Rybchenko #if defined(SFXGE_USE_BUS_SPACE_8) 815e948693eSPhilip Paeps #define EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp) \ 816e948693eSPhilip Paeps do { \ 817e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 818e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 819e948693eSPhilip Paeps ("not power of 2 aligned")); \ 820e948693eSPhilip Paeps \ 821763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 822e948693eSPhilip Paeps \ 823e948693eSPhilip Paeps EFSYS_PROBE3(bar_writeq, unsigned int, (_offset), \ 824e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 825e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 826e948693eSPhilip Paeps \ 8271cc8febfSAndrew Rybchenko /* \ 8281cc8febfSAndrew Rybchenko * Make sure that previous writes to the qword have \ 8291cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \ 8301cc8febfSAndrew Rybchenko * after the write below. \ 8311cc8febfSAndrew Rybchenko */ \ 8321cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 8331cc8febfSAndrew Rybchenko (_offset), sizeof (efx_qword_t), \ 8341cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 835d9ff48abSAndrew Rybchenko bus_space_write_stream_8((_esbp)->esb_tag, \ 836d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 8370f999687SAndrew Rybchenko (_offset), (_eqp)->eq_u64[0]); \ 8380f999687SAndrew Rybchenko \ 839687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 8400f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 8410f999687SAndrew Rybchenko } while (B_FALSE) 8420f999687SAndrew Rybchenko #else 8430f999687SAndrew Rybchenko #define EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp) \ 8440f999687SAndrew Rybchenko do { \ 8450f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 8460f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 8470f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 8480f999687SAndrew Rybchenko \ 849687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 8500f999687SAndrew Rybchenko \ 8510f999687SAndrew Rybchenko EFSYS_PROBE3(bar_writeq, unsigned int, (_offset), \ 8520f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 8530f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 8540f999687SAndrew Rybchenko \ 8551cc8febfSAndrew Rybchenko /* \ 8561cc8febfSAndrew Rybchenko * Make sure that previous writes to the qword have \ 8571cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \ 8581cc8febfSAndrew Rybchenko * after the last write below. \ 8591cc8febfSAndrew Rybchenko */ \ 8601cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 8611cc8febfSAndrew Rybchenko (_offset), sizeof (efx_qword_t), \ 8621cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 863d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 864d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 865e948693eSPhilip Paeps (_offset), (_eqp)->eq_u32[0]); \ 8661cc8febfSAndrew Rybchenko /* \ 8671cc8febfSAndrew Rybchenko * It should be guaranteed that the last dword comes \ 8681cc8febfSAndrew Rybchenko * the last, so barrier entire qword to be sure that \ 8691cc8febfSAndrew Rybchenko * neither above nor below writes are reordered. \ 8701cc8febfSAndrew Rybchenko */ \ 8711cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 8721cc8febfSAndrew Rybchenko (_offset), sizeof (efx_qword_t), \ 8731cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 874d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 875d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 876d9ff48abSAndrew Rybchenko (_offset) + 4, (_eqp)->eq_u32[1]); \ 877e948693eSPhilip Paeps \ 878763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 879e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 880e948693eSPhilip Paeps } while (B_FALSE) 8810f999687SAndrew Rybchenko #endif 882e948693eSPhilip Paeps 883*5dadbb64SAndrew Rybchenko #if defined(SFXGE_USE_BUS_SPACE_8) 884e948693eSPhilip Paeps #define EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock) \ 885e948693eSPhilip Paeps do { \ 886e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 887e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 888e948693eSPhilip Paeps ("not power of 2 aligned")); \ 889e948693eSPhilip Paeps \ 890e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 891e948693eSPhilip Paeps if (_lock) \ 892763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 893e948693eSPhilip Paeps \ 894e948693eSPhilip Paeps EFSYS_PROBE5(bar_writeo, unsigned int, (_offset), \ 895e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 896e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 897e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 898e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 899e948693eSPhilip Paeps \ 9001cc8febfSAndrew Rybchenko /* \ 9011cc8febfSAndrew Rybchenko * Make sure that previous writes to the oword have \ 9021cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \ 9031cc8febfSAndrew Rybchenko * after the last write below. \ 9041cc8febfSAndrew Rybchenko */ \ 9051cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 9061cc8febfSAndrew Rybchenko (_offset), sizeof (efx_oword_t), \ 9071cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 908d9ff48abSAndrew Rybchenko bus_space_write_stream_8((_esbp)->esb_tag, \ 909d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 9100f999687SAndrew Rybchenko (_offset), (_eop)->eo_u64[0]); \ 9111cc8febfSAndrew Rybchenko /* \ 9121cc8febfSAndrew Rybchenko * It should be guaranteed that the last qword comes \ 9131cc8febfSAndrew Rybchenko * the last, so barrier entire oword to be sure that \ 9141cc8febfSAndrew Rybchenko * neither above nor below writes are reordered. \ 9151cc8febfSAndrew Rybchenko */ \ 9161cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 9171cc8febfSAndrew Rybchenko (_offset), sizeof (efx_oword_t), \ 9181cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 919d9ff48abSAndrew Rybchenko bus_space_write_stream_8((_esbp)->esb_tag, \ 920d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 921d9ff48abSAndrew Rybchenko (_offset) + 8, (_eop)->eo_u64[1]); \ 9220f999687SAndrew Rybchenko \ 9230f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9240f999687SAndrew Rybchenko if (_lock) \ 925687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 9260f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9270f999687SAndrew Rybchenko } while (B_FALSE) 9280f999687SAndrew Rybchenko 9290f999687SAndrew Rybchenko #else 9300f999687SAndrew Rybchenko #define EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock) \ 9310f999687SAndrew Rybchenko do { \ 9320f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9330f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 9340f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 9350f999687SAndrew Rybchenko \ 9360f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9370f999687SAndrew Rybchenko if (_lock) \ 938687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 9390f999687SAndrew Rybchenko \ 9400f999687SAndrew Rybchenko EFSYS_PROBE5(bar_writeo, unsigned int, (_offset), \ 9410f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 9420f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 9430f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 9440f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 9450f999687SAndrew Rybchenko \ 9461cc8febfSAndrew Rybchenko /* \ 9471cc8febfSAndrew Rybchenko * Make sure that previous writes to the oword have \ 9481cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \ 9491cc8febfSAndrew Rybchenko * after the last write below. \ 9501cc8febfSAndrew Rybchenko */ \ 9511cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 9521cc8febfSAndrew Rybchenko (_offset), sizeof (efx_oword_t), \ 9531cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 954d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 955d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 956e948693eSPhilip Paeps (_offset), (_eop)->eo_u32[0]); \ 957d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 958d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 959d9ff48abSAndrew Rybchenko (_offset) + 4, (_eop)->eo_u32[1]); \ 960d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 961d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 962d9ff48abSAndrew Rybchenko (_offset) + 8, (_eop)->eo_u32[2]); \ 9631cc8febfSAndrew Rybchenko /* \ 9641cc8febfSAndrew Rybchenko * It should be guaranteed that the last dword comes \ 9651cc8febfSAndrew Rybchenko * the last, so barrier entire oword to be sure that \ 9661cc8febfSAndrew Rybchenko * neither above nor below writes are reordered. \ 9671cc8febfSAndrew Rybchenko */ \ 9681cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 9691cc8febfSAndrew Rybchenko (_offset), sizeof (efx_oword_t), \ 9701cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 971d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 972d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 973d9ff48abSAndrew Rybchenko (_offset) + 12, (_eop)->eo_u32[3]); \ 974e948693eSPhilip Paeps \ 975e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 976e948693eSPhilip Paeps if (_lock) \ 977763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 978e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 979e948693eSPhilip Paeps } while (B_FALSE) 9800f999687SAndrew Rybchenko #endif 981e948693eSPhilip Paeps 982e948693eSPhilip Paeps /* SPIN */ 983e948693eSPhilip Paeps 984e948693eSPhilip Paeps #define EFSYS_SPIN(_us) \ 985e948693eSPhilip Paeps do { \ 986e948693eSPhilip Paeps DELAY(_us); \ 987e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 988e948693eSPhilip Paeps } while (B_FALSE) 989e948693eSPhilip Paeps 990e948693eSPhilip Paeps #define EFSYS_SLEEP EFSYS_SPIN 991e948693eSPhilip Paeps 992e948693eSPhilip Paeps /* BARRIERS */ 993e948693eSPhilip Paeps 9947c00963aSAndrew Rybchenko #define EFSYS_MEM_READ_BARRIER() rmb() 995e948693eSPhilip Paeps #define EFSYS_PIO_WRITE_BARRIER() 996e948693eSPhilip Paeps 997e948693eSPhilip Paeps /* TIMESTAMP */ 998e948693eSPhilip Paeps 999e948693eSPhilip Paeps typedef clock_t efsys_timestamp_t; 1000e948693eSPhilip Paeps 1001e948693eSPhilip Paeps #define EFSYS_TIMESTAMP(_usp) \ 1002e948693eSPhilip Paeps do { \ 1003e948693eSPhilip Paeps clock_t now; \ 1004e948693eSPhilip Paeps \ 1005e948693eSPhilip Paeps now = ticks; \ 1006e948693eSPhilip Paeps *(_usp) = now * hz / 1000000; \ 1007e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1008e948693eSPhilip Paeps } while (B_FALSE) 1009e948693eSPhilip Paeps 1010e948693eSPhilip Paeps /* KMEM */ 1011e948693eSPhilip Paeps 1012e948693eSPhilip Paeps #define EFSYS_KMEM_ALLOC(_esip, _size, _p) \ 1013e948693eSPhilip Paeps do { \ 1014e948693eSPhilip Paeps (_esip) = (_esip); \ 101583488e18SAndrew Rybchenko /* \ 101683488e18SAndrew Rybchenko * The macro is used in non-sleepable contexts, for \ 101783488e18SAndrew Rybchenko * example, holding a mutex. \ 101883488e18SAndrew Rybchenko */ \ 101983488e18SAndrew Rybchenko (_p) = malloc((_size), M_SFXGE, M_NOWAIT|M_ZERO); \ 1020e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1021e948693eSPhilip Paeps } while (B_FALSE) 1022e948693eSPhilip Paeps 1023e948693eSPhilip Paeps #define EFSYS_KMEM_FREE(_esip, _size, _p) \ 1024e948693eSPhilip Paeps do { \ 1025e948693eSPhilip Paeps (void) (_esip); \ 1026e948693eSPhilip Paeps (void) (_size); \ 1027e948693eSPhilip Paeps free((_p), M_SFXGE); \ 1028e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1029e948693eSPhilip Paeps } while (B_FALSE) 1030e948693eSPhilip Paeps 1031e948693eSPhilip Paeps /* LOCK */ 1032e948693eSPhilip Paeps 103333d45dc5SAndrew Rybchenko typedef struct efsys_lock_s { 103433d45dc5SAndrew Rybchenko struct mtx lock; 103533d45dc5SAndrew Rybchenko char lock_name[SFXGE_LOCK_NAME_MAX]; 103633d45dc5SAndrew Rybchenko } efsys_lock_t; 103733d45dc5SAndrew Rybchenko 103833d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK_INIT(_eslp, _ifname, _label) \ 103933d45dc5SAndrew Rybchenko do { \ 104033d45dc5SAndrew Rybchenko efsys_lock_t *__eslp = (_eslp); \ 104133d45dc5SAndrew Rybchenko \ 104233d45dc5SAndrew Rybchenko snprintf((__eslp)->lock_name, \ 104333d45dc5SAndrew Rybchenko sizeof((__eslp)->lock_name), \ 104433d45dc5SAndrew Rybchenko "%s:%s", (_ifname), (_label)); \ 104533d45dc5SAndrew Rybchenko mtx_init(&(__eslp)->lock, (__eslp)->lock_name, \ 104633d45dc5SAndrew Rybchenko NULL, MTX_DEF); \ 104733d45dc5SAndrew Rybchenko } while (B_FALSE) 104833d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK_DESTROY(_eslp) \ 104933d45dc5SAndrew Rybchenko mtx_destroy(&(_eslp)->lock) 105033d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK(_eslp) \ 105133d45dc5SAndrew Rybchenko mtx_lock(&(_eslp)->lock) 105233d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_UNLOCK(_eslp) \ 105333d45dc5SAndrew Rybchenko mtx_unlock(&(_eslp)->lock) 105433d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK_ASSERT_OWNED(_eslp) \ 105533d45dc5SAndrew Rybchenko mtx_assert(&(_eslp)->lock, MA_OWNED) 1056e948693eSPhilip Paeps 1057e948693eSPhilip Paeps #define EFSYS_LOCK_MAGIC 0x000010c4 1058e948693eSPhilip Paeps 1059e948693eSPhilip Paeps #define EFSYS_LOCK(_lockp, _state) \ 1060e948693eSPhilip Paeps do { \ 106133d45dc5SAndrew Rybchenko SFXGE_EFSYS_LOCK(_lockp); \ 1062e948693eSPhilip Paeps (_state) = EFSYS_LOCK_MAGIC; \ 1063e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1064e948693eSPhilip Paeps } while (B_FALSE) 1065e948693eSPhilip Paeps 1066e948693eSPhilip Paeps #define EFSYS_UNLOCK(_lockp, _state) \ 1067e948693eSPhilip Paeps do { \ 1068e948693eSPhilip Paeps if ((_state) != EFSYS_LOCK_MAGIC) \ 1069e948693eSPhilip Paeps KASSERT(B_FALSE, ("not locked")); \ 107033d45dc5SAndrew Rybchenko SFXGE_EFSYS_UNLOCK(_lockp); \ 1071e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1072e948693eSPhilip Paeps } while (B_FALSE) 1073e948693eSPhilip Paeps 1074e948693eSPhilip Paeps /* PREEMPT */ 1075e948693eSPhilip Paeps 1076e948693eSPhilip Paeps #define EFSYS_PREEMPT_DISABLE(_state) \ 1077e948693eSPhilip Paeps do { \ 1078e948693eSPhilip Paeps (_state) = (_state); \ 1079e948693eSPhilip Paeps critical_enter(); \ 1080e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1081e948693eSPhilip Paeps } while (B_FALSE) 1082e948693eSPhilip Paeps 1083e948693eSPhilip Paeps #define EFSYS_PREEMPT_ENABLE(_state) \ 1084e948693eSPhilip Paeps do { \ 1085e948693eSPhilip Paeps (_state) = (_state); \ 1086e948693eSPhilip Paeps critical_exit(_state); \ 1087e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1088e948693eSPhilip Paeps } while (B_FALSE) 1089e948693eSPhilip Paeps 1090e948693eSPhilip Paeps /* STAT */ 1091e948693eSPhilip Paeps 1092e948693eSPhilip Paeps typedef uint64_t efsys_stat_t; 1093e948693eSPhilip Paeps 1094e948693eSPhilip Paeps #define EFSYS_STAT_INCR(_knp, _delta) \ 1095e948693eSPhilip Paeps do { \ 1096e948693eSPhilip Paeps *(_knp) += (_delta); \ 1097e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1098e948693eSPhilip Paeps } while (B_FALSE) 1099e948693eSPhilip Paeps 1100e948693eSPhilip Paeps #define EFSYS_STAT_DECR(_knp, _delta) \ 1101e948693eSPhilip Paeps do { \ 1102e948693eSPhilip Paeps *(_knp) -= (_delta); \ 1103e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1104e948693eSPhilip Paeps } while (B_FALSE) 1105e948693eSPhilip Paeps 1106e948693eSPhilip Paeps #define EFSYS_STAT_SET(_knp, _val) \ 1107e948693eSPhilip Paeps do { \ 1108e948693eSPhilip Paeps *(_knp) = (_val); \ 1109e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1110e948693eSPhilip Paeps } while (B_FALSE) 1111e948693eSPhilip Paeps 1112e948693eSPhilip Paeps #define EFSYS_STAT_SET_QWORD(_knp, _valp) \ 1113e948693eSPhilip Paeps do { \ 1114e948693eSPhilip Paeps *(_knp) = le64toh((_valp)->eq_u64[0]); \ 1115e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1116e948693eSPhilip Paeps } while (B_FALSE) 1117e948693eSPhilip Paeps 1118e948693eSPhilip Paeps #define EFSYS_STAT_SET_DWORD(_knp, _valp) \ 1119e948693eSPhilip Paeps do { \ 1120e948693eSPhilip Paeps *(_knp) = le32toh((_valp)->ed_u32[0]); \ 1121e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1122e948693eSPhilip Paeps } while (B_FALSE) 1123e948693eSPhilip Paeps 1124e948693eSPhilip Paeps #define EFSYS_STAT_INCR_QWORD(_knp, _valp) \ 1125e948693eSPhilip Paeps do { \ 1126e948693eSPhilip Paeps *(_knp) += le64toh((_valp)->eq_u64[0]); \ 1127e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1128e948693eSPhilip Paeps } while (B_FALSE) 1129e948693eSPhilip Paeps 1130e948693eSPhilip Paeps #define EFSYS_STAT_SUBR_QWORD(_knp, _valp) \ 1131e948693eSPhilip Paeps do { \ 1132e948693eSPhilip Paeps *(_knp) -= le64toh((_valp)->eq_u64[0]); \ 1133e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1134e948693eSPhilip Paeps } while (B_FALSE) 1135e948693eSPhilip Paeps 1136e948693eSPhilip Paeps /* ERR */ 1137e948693eSPhilip Paeps 1138e948693eSPhilip Paeps extern void sfxge_err(efsys_identifier_t *, unsigned int, 1139e948693eSPhilip Paeps uint32_t, uint32_t); 1140e948693eSPhilip Paeps 1141e948693eSPhilip Paeps #if EFSYS_OPT_DECODE_INTR_FATAL 1142e948693eSPhilip Paeps #define EFSYS_ERR(_esip, _code, _dword0, _dword1) \ 1143e948693eSPhilip Paeps do { \ 1144e948693eSPhilip Paeps sfxge_err((_esip), (_code), (_dword0), (_dword1)); \ 1145e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1146e948693eSPhilip Paeps } while (B_FALSE) 1147e948693eSPhilip Paeps #endif 1148e948693eSPhilip Paeps 1149e948693eSPhilip Paeps /* ASSERT */ 1150e948693eSPhilip Paeps 1151e948693eSPhilip Paeps #define EFSYS_ASSERT(_exp) do { \ 1152e948693eSPhilip Paeps if (!(_exp)) \ 1153e948693eSPhilip Paeps panic(#_exp); \ 1154e948693eSPhilip Paeps } while (0) 1155e948693eSPhilip Paeps 1156e948693eSPhilip Paeps #define EFSYS_ASSERT3(_x, _op, _y, _t) do { \ 1157e948693eSPhilip Paeps const _t __x = (_t)(_x); \ 1158e948693eSPhilip Paeps const _t __y = (_t)(_y); \ 1159e948693eSPhilip Paeps if (!(__x _op __y)) \ 1160e948693eSPhilip Paeps panic("assertion failed at %s:%u", __FILE__, __LINE__); \ 1161e948693eSPhilip Paeps } while(0) 1162e948693eSPhilip Paeps 1163e948693eSPhilip Paeps #define EFSYS_ASSERT3U(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, uint64_t) 1164e948693eSPhilip Paeps #define EFSYS_ASSERT3S(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, int64_t) 1165e948693eSPhilip Paeps #define EFSYS_ASSERT3P(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, uintptr_t) 1166e948693eSPhilip Paeps 1167e948693eSPhilip Paeps #ifdef __cplusplus 1168e948693eSPhilip Paeps } 1169e948693eSPhilip Paeps #endif 1170e948693eSPhilip Paeps 1171e948693eSPhilip Paeps #endif /* _SYS_EFSYS_H */ 1172