1e948693eSPhilip Paeps /*- 2718cf2ccSPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3718cf2ccSPedro F. Giffuni * 4929c7febSAndrew Rybchenko * Copyright (c) 2010-2016 Solarflare Communications Inc. 5e948693eSPhilip Paeps * All rights reserved. 6e948693eSPhilip Paeps * 7e948693eSPhilip Paeps * This software was developed in part by Philip Paeps under contract for 8e948693eSPhilip Paeps * Solarflare Communications, Inc. 9e948693eSPhilip Paeps * 10e948693eSPhilip Paeps * Redistribution and use in source and binary forms, with or without 113c838a9fSAndrew Rybchenko * modification, are permitted provided that the following conditions are met: 12e948693eSPhilip Paeps * 133c838a9fSAndrew Rybchenko * 1. Redistributions of source code must retain the above copyright notice, 143c838a9fSAndrew Rybchenko * this list of conditions and the following disclaimer. 153c838a9fSAndrew Rybchenko * 2. Redistributions in binary form must reproduce the above copyright notice, 163c838a9fSAndrew Rybchenko * this list of conditions and the following disclaimer in the documentation 173c838a9fSAndrew Rybchenko * and/or other materials provided with the distribution. 183c838a9fSAndrew Rybchenko * 193c838a9fSAndrew Rybchenko * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 203c838a9fSAndrew Rybchenko * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 213c838a9fSAndrew Rybchenko * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 223c838a9fSAndrew Rybchenko * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 233c838a9fSAndrew Rybchenko * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 243c838a9fSAndrew Rybchenko * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 253c838a9fSAndrew Rybchenko * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 263c838a9fSAndrew Rybchenko * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 273c838a9fSAndrew Rybchenko * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 283c838a9fSAndrew Rybchenko * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 293c838a9fSAndrew Rybchenko * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 303c838a9fSAndrew Rybchenko * 313c838a9fSAndrew Rybchenko * The views and conclusions contained in the software and documentation are 323c838a9fSAndrew Rybchenko * those of the authors and should not be interpreted as representing official 333c838a9fSAndrew Rybchenko * policies, either expressed or implied, of the FreeBSD Project. 345dee87d7SPhilip Paeps * 355dee87d7SPhilip Paeps * $FreeBSD$ 36e948693eSPhilip Paeps */ 37e948693eSPhilip Paeps 38e948693eSPhilip Paeps #ifndef _SYS_EFSYS_H 39e948693eSPhilip Paeps #define _SYS_EFSYS_H 40e948693eSPhilip Paeps 41e948693eSPhilip Paeps #ifdef __cplusplus 42e948693eSPhilip Paeps extern "C" { 43e948693eSPhilip Paeps #endif 44e948693eSPhilip Paeps 45e948693eSPhilip Paeps #include <sys/param.h> 46e948693eSPhilip Paeps #include <sys/bus.h> 47e948693eSPhilip Paeps #include <sys/endian.h> 48e948693eSPhilip Paeps #include <sys/lock.h> 49e948693eSPhilip Paeps #include <sys/malloc.h> 50e948693eSPhilip Paeps #include <sys/mbuf.h> 51e948693eSPhilip Paeps #include <sys/mutex.h> 52e948693eSPhilip Paeps #include <sys/rwlock.h> 53e948693eSPhilip Paeps #include <sys/sdt.h> 54e948693eSPhilip Paeps #include <sys/systm.h> 55e948693eSPhilip Paeps 56e948693eSPhilip Paeps #include <machine/bus.h> 57e948693eSPhilip Paeps #include <machine/endian.h> 58e948693eSPhilip Paeps 59e948693eSPhilip Paeps #define EFSYS_HAS_UINT64 1 600f999687SAndrew Rybchenko #if defined(__x86_64__) 610f999687SAndrew Rybchenko #define EFSYS_USE_UINT64 1 620f999687SAndrew Rybchenko #else 63e948693eSPhilip Paeps #define EFSYS_USE_UINT64 0 640f999687SAndrew Rybchenko #endif 653c838a9fSAndrew Rybchenko #define EFSYS_HAS_SSE2_M128 0 66e948693eSPhilip Paeps #if _BYTE_ORDER == _BIG_ENDIAN 67e948693eSPhilip Paeps #define EFSYS_IS_BIG_ENDIAN 1 68e948693eSPhilip Paeps #define EFSYS_IS_LITTLE_ENDIAN 0 69e948693eSPhilip Paeps #elif _BYTE_ORDER == _LITTLE_ENDIAN 70e948693eSPhilip Paeps #define EFSYS_IS_BIG_ENDIAN 0 71e948693eSPhilip Paeps #define EFSYS_IS_LITTLE_ENDIAN 1 72e948693eSPhilip Paeps #endif 73e948693eSPhilip Paeps #include "efx_types.h" 74e948693eSPhilip Paeps 75e948693eSPhilip Paeps #ifndef B_FALSE 76e948693eSPhilip Paeps #define B_FALSE FALSE 77e948693eSPhilip Paeps #endif 78e948693eSPhilip Paeps #ifndef B_TRUE 79e948693eSPhilip Paeps #define B_TRUE TRUE 80e948693eSPhilip Paeps #endif 81e948693eSPhilip Paeps 82e948693eSPhilip Paeps #ifndef IS2P 83e948693eSPhilip Paeps #define ISP2(x) (((x) & ((x) - 1)) == 0) 84e948693eSPhilip Paeps #endif 85e948693eSPhilip Paeps 86adc1d71cSWarner Losh #if defined(__x86_64__) 875dadbb64SAndrew Rybchenko 885dadbb64SAndrew Rybchenko #define SFXGE_USE_BUS_SPACE_8 1 895dadbb64SAndrew Rybchenko 90d9ff48abSAndrew Rybchenko #if !defined(bus_space_read_stream_8) 915dadbb64SAndrew Rybchenko 92d9ff48abSAndrew Rybchenko #define bus_space_read_stream_8(t, h, o) \ 93d9ff48abSAndrew Rybchenko bus_space_read_8((t), (h), (o)) 945dadbb64SAndrew Rybchenko 95d9ff48abSAndrew Rybchenko #define bus_space_write_stream_8(t, h, o, v) \ 96d9ff48abSAndrew Rybchenko bus_space_write_8((t), (h), (o), (v)) 975dadbb64SAndrew Rybchenko 98d9ff48abSAndrew Rybchenko #endif 995dadbb64SAndrew Rybchenko 100d9ff48abSAndrew Rybchenko #endif 101d9ff48abSAndrew Rybchenko 102e948693eSPhilip Paeps #define ENOTACTIVE EINVAL 103e948693eSPhilip Paeps 104e948693eSPhilip Paeps /* Memory type to use on FreeBSD */ 105e948693eSPhilip Paeps MALLOC_DECLARE(M_SFXGE); 106e948693eSPhilip Paeps 107e948693eSPhilip Paeps /* Machine dependend prefetch wrappers */ 108dc1788e8SMarius Strobl #if defined(__i386__) || defined(__amd64__) 109e948693eSPhilip Paeps static __inline void 110e948693eSPhilip Paeps prefetch_read_many(void *addr) 111e948693eSPhilip Paeps { 112dc1788e8SMarius Strobl 113e948693eSPhilip Paeps __asm__( 114e948693eSPhilip Paeps "prefetcht0 (%0)" 115e948693eSPhilip Paeps : 116e948693eSPhilip Paeps : "r" (addr)); 117e948693eSPhilip Paeps } 118e948693eSPhilip Paeps 119e948693eSPhilip Paeps static __inline void 120e948693eSPhilip Paeps prefetch_read_once(void *addr) 121e948693eSPhilip Paeps { 122dc1788e8SMarius Strobl 123e948693eSPhilip Paeps __asm__( 124e948693eSPhilip Paeps "prefetchnta (%0)" 125e948693eSPhilip Paeps : 126e948693eSPhilip Paeps : "r" (addr)); 127e948693eSPhilip Paeps } 128dc1788e8SMarius Strobl #else 129dc1788e8SMarius Strobl static __inline void 130dc1788e8SMarius Strobl prefetch_read_many(void *addr) 131dc1788e8SMarius Strobl { 132dc1788e8SMarius Strobl 133dc1788e8SMarius Strobl } 134dc1788e8SMarius Strobl 135dc1788e8SMarius Strobl static __inline void 136dc1788e8SMarius Strobl prefetch_read_once(void *addr) 137dc1788e8SMarius Strobl { 138dc1788e8SMarius Strobl 139dc1788e8SMarius Strobl } 140e948693eSPhilip Paeps #endif 141e948693eSPhilip Paeps 142e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__) 143e948693eSPhilip Paeps #include <vm/vm.h> 144e948693eSPhilip Paeps #include <vm/pmap.h> 145e948693eSPhilip Paeps #endif 146e948693eSPhilip Paeps static __inline void 147e948693eSPhilip Paeps sfxge_map_mbuf_fast(bus_dma_tag_t tag, bus_dmamap_t map, 148e948693eSPhilip Paeps struct mbuf *m, bus_dma_segment_t *seg) 149e948693eSPhilip Paeps { 150e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__) 151e948693eSPhilip Paeps seg->ds_addr = pmap_kextract(mtod(m, vm_offset_t)); 152e948693eSPhilip Paeps seg->ds_len = m->m_len; 153e948693eSPhilip Paeps #else 154e948693eSPhilip Paeps int nsegstmp; 155e948693eSPhilip Paeps 156e948693eSPhilip Paeps bus_dmamap_load_mbuf_sg(tag, map, m, seg, &nsegstmp, 0); 157e948693eSPhilip Paeps #endif 158e948693eSPhilip Paeps } 159e948693eSPhilip Paeps 160e948693eSPhilip Paeps /* Code inclusion options */ 161e948693eSPhilip Paeps 162e948693eSPhilip Paeps #define EFSYS_OPT_NAMES 1 163e948693eSPhilip Paeps 164e948693eSPhilip Paeps #define EFSYS_OPT_SIENA 1 1653c838a9fSAndrew Rybchenko #define EFSYS_OPT_HUNTINGTON 1 166131bc376SAndrew Rybchenko #define EFSYS_OPT_MEDFORD 1 167c6831b0bSAndrew Rybchenko #define EFSYS_OPT_MEDFORD2 1 168e948693eSPhilip Paeps #ifdef DEBUG 169e948693eSPhilip Paeps #define EFSYS_OPT_CHECK_REG 1 170e948693eSPhilip Paeps #else 171e948693eSPhilip Paeps #define EFSYS_OPT_CHECK_REG 0 172e948693eSPhilip Paeps #endif 173e948693eSPhilip Paeps 174e948693eSPhilip Paeps #define EFSYS_OPT_MCDI 1 175870b1186SAndrew Rybchenko #define EFSYS_OPT_MCDI_LOGGING 0 1763edad197SAndrew Rybchenko #define EFSYS_OPT_MCDI_PROXY_AUTH 0 177e948693eSPhilip Paeps 178e948693eSPhilip Paeps #define EFSYS_OPT_MAC_STATS 1 179e948693eSPhilip Paeps 180e948693eSPhilip Paeps #define EFSYS_OPT_LOOPBACK 0 181e948693eSPhilip Paeps 1823c838a9fSAndrew Rybchenko #define EFSYS_OPT_MON_MCDI 0 183e948693eSPhilip Paeps #define EFSYS_OPT_MON_STATS 0 184e948693eSPhilip Paeps 185e948693eSPhilip Paeps #define EFSYS_OPT_PHY_STATS 1 1863c838a9fSAndrew Rybchenko #define EFSYS_OPT_BIST 1 187e948693eSPhilip Paeps #define EFSYS_OPT_PHY_LED_CONTROL 1 188e948693eSPhilip Paeps #define EFSYS_OPT_PHY_FLAGS 0 189e948693eSPhilip Paeps 190e948693eSPhilip Paeps #define EFSYS_OPT_VPD 1 191e948693eSPhilip Paeps #define EFSYS_OPT_NVRAM 1 192e948693eSPhilip Paeps #define EFSYS_OPT_BOOTCFG 0 193391763d7SAndrew Rybchenko #define EFSYS_OPT_IMAGE_LAYOUT 0 194e948693eSPhilip Paeps 195e948693eSPhilip Paeps #define EFSYS_OPT_DIAG 0 196e948693eSPhilip Paeps #define EFSYS_OPT_RX_SCALE 1 197e948693eSPhilip Paeps #define EFSYS_OPT_QSTATS 1 1983c838a9fSAndrew Rybchenko #define EFSYS_OPT_FILTER 1 199e948693eSPhilip Paeps #define EFSYS_OPT_RX_SCATTER 0 200e948693eSPhilip Paeps 201e948693eSPhilip Paeps #define EFSYS_OPT_EV_PREFETCH 0 202e948693eSPhilip Paeps 203e948693eSPhilip Paeps #define EFSYS_OPT_DECODE_INTR_FATAL 1 204e948693eSPhilip Paeps 2050c848230SAndrew Rybchenko #define EFSYS_OPT_LICENSING 0 2060c848230SAndrew Rybchenko 207ecaa500cSAndrew Rybchenko #define EFSYS_OPT_ALLOW_UNCONFIGURED_NIC 0 208ecaa500cSAndrew Rybchenko 2098e0c4827SAndrew Rybchenko #define EFSYS_OPT_RX_PACKED_STREAM 0 2108e0c4827SAndrew Rybchenko 21104381b5eSAndrew Rybchenko #define EFSYS_OPT_RX_ES_SUPER_BUFFER 0 21204381b5eSAndrew Rybchenko 213fdbe38cfSAndrew Rybchenko #define EFSYS_OPT_TUNNEL 0 214fdbe38cfSAndrew Rybchenko 215e0b3c2ccSAndrew Rybchenko #define EFSYS_OPT_FW_SUBVARIANT_AWARE 0 216e0b3c2ccSAndrew Rybchenko 217e948693eSPhilip Paeps /* ID */ 218e948693eSPhilip Paeps 219e948693eSPhilip Paeps typedef struct __efsys_identifier_s efsys_identifier_t; 220e948693eSPhilip Paeps 221e948693eSPhilip Paeps /* PROBE */ 222e948693eSPhilip Paeps 22354366c0bSAttilio Rao #ifndef DTRACE_PROBE 224e948693eSPhilip Paeps 225e948693eSPhilip Paeps #define EFSYS_PROBE(_name) 226e948693eSPhilip Paeps 227e948693eSPhilip Paeps #define EFSYS_PROBE1(_name, _type1, _arg1) 228e948693eSPhilip Paeps 229e948693eSPhilip Paeps #define EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2) 230e948693eSPhilip Paeps 231e948693eSPhilip Paeps #define EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2, \ 232e948693eSPhilip Paeps _type3, _arg3) 233e948693eSPhilip Paeps 234e948693eSPhilip Paeps #define EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 235e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) 236e948693eSPhilip Paeps 237e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 238e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) 239e948693eSPhilip Paeps 240e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 241e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 242e948693eSPhilip Paeps _type6, _arg6) 243e948693eSPhilip Paeps 244e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 245e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 246e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) 247e948693eSPhilip Paeps 24854366c0bSAttilio Rao #else /* DTRACE_PROBE */ 249e948693eSPhilip Paeps 250e948693eSPhilip Paeps #define EFSYS_PROBE(_name) \ 251e948693eSPhilip Paeps DTRACE_PROBE(_name) 252e948693eSPhilip Paeps 253e948693eSPhilip Paeps #define EFSYS_PROBE1(_name, _type1, _arg1) \ 254e948693eSPhilip Paeps DTRACE_PROBE1(_name, _type1, _arg1) 255e948693eSPhilip Paeps 256e948693eSPhilip Paeps #define EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2) \ 257e948693eSPhilip Paeps DTRACE_PROBE2(_name, _type1, _arg1, _type2, _arg2) 258e948693eSPhilip Paeps 259e948693eSPhilip Paeps #define EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2, \ 260e948693eSPhilip Paeps _type3, _arg3) \ 261e948693eSPhilip Paeps DTRACE_PROBE3(_name, _type1, _arg1, _type2, _arg2, \ 262e948693eSPhilip Paeps _type3, _arg3) 263e948693eSPhilip Paeps 264e948693eSPhilip Paeps #define EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 265e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) \ 266e948693eSPhilip Paeps DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 267e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) 268e948693eSPhilip Paeps 269e948693eSPhilip Paeps #ifdef DTRACE_PROBE5 270e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 271e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) \ 272e948693eSPhilip Paeps DTRACE_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 273e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) 274e948693eSPhilip Paeps #else 275e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 276e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) \ 277e948693eSPhilip Paeps DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 278e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) 279e948693eSPhilip Paeps #endif 280e948693eSPhilip Paeps 281e948693eSPhilip Paeps #ifdef DTRACE_PROBE6 282e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 283e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 284e948693eSPhilip Paeps _type6, _arg6) \ 285e948693eSPhilip Paeps DTRACE_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 286e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 287e948693eSPhilip Paeps _type6, _arg6) 288e948693eSPhilip Paeps #else 289e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 290e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 291e948693eSPhilip Paeps _type6, _arg6) \ 292e948693eSPhilip Paeps EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 293e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) 294e948693eSPhilip Paeps #endif 295e948693eSPhilip Paeps 296e948693eSPhilip Paeps #ifdef DTRACE_PROBE7 297e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 298e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 299e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) \ 300e948693eSPhilip Paeps DTRACE_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 301e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 302e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) 303e948693eSPhilip Paeps #else 304e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 305e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 306e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) \ 307e948693eSPhilip Paeps EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 308e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 309e948693eSPhilip Paeps _type6, _arg6) 310e948693eSPhilip Paeps #endif 311e948693eSPhilip Paeps 31254366c0bSAttilio Rao #endif /* DTRACE_PROBE */ 313e948693eSPhilip Paeps 314e948693eSPhilip Paeps /* DMA */ 315e948693eSPhilip Paeps 316e948693eSPhilip Paeps typedef uint64_t efsys_dma_addr_t; 317e948693eSPhilip Paeps 318e948693eSPhilip Paeps typedef struct efsys_mem_s { 319e948693eSPhilip Paeps bus_dma_tag_t esm_tag; 320e948693eSPhilip Paeps bus_dmamap_t esm_map; 321e948693eSPhilip Paeps caddr_t esm_base; 322e948693eSPhilip Paeps efsys_dma_addr_t esm_addr; 3234aaefb95SAndrew Rybchenko size_t esm_size; 324e948693eSPhilip Paeps } efsys_mem_t; 325e948693eSPhilip Paeps 3264aaefb95SAndrew Rybchenko #define EFSYS_MEM_SIZE(_esmp) \ 3274aaefb95SAndrew Rybchenko ((_esmp)->esm_size) 3284aaefb95SAndrew Rybchenko 3294aaefb95SAndrew Rybchenko #define EFSYS_MEM_ADDR(_esmp) \ 3304aaefb95SAndrew Rybchenko ((_esmp)->esm_addr) 3314aaefb95SAndrew Rybchenko 3324aaefb95SAndrew Rybchenko #define EFSYS_MEM_IS_NULL(_esmp) \ 3334aaefb95SAndrew Rybchenko ((_esmp)->esm_base == NULL) 3344aaefb95SAndrew Rybchenko 335e948693eSPhilip Paeps #define EFSYS_MEM_ZERO(_esmp, _size) \ 336e948693eSPhilip Paeps do { \ 337e948693eSPhilip Paeps (void) memset((_esmp)->esm_base, 0, (_size)); \ 338e948693eSPhilip Paeps \ 339e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 340e948693eSPhilip Paeps } while (B_FALSE) 341e948693eSPhilip Paeps 342e948693eSPhilip Paeps #define EFSYS_MEM_READD(_esmp, _offset, _edp) \ 343e948693eSPhilip Paeps do { \ 344e948693eSPhilip Paeps uint32_t *addr; \ 345e948693eSPhilip Paeps \ 346e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 3477daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 3487daf1fedSAndrew Rybchenko sizeof (efx_dword_t)), \ 349e948693eSPhilip Paeps ("not power of 2 aligned")); \ 350e948693eSPhilip Paeps \ 351e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 352e948693eSPhilip Paeps \ 353e948693eSPhilip Paeps (_edp)->ed_u32[0] = *addr; \ 354e948693eSPhilip Paeps \ 355e948693eSPhilip Paeps EFSYS_PROBE2(mem_readd, unsigned int, (_offset), \ 356e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 357e948693eSPhilip Paeps \ 358e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 359e948693eSPhilip Paeps } while (B_FALSE) 360e948693eSPhilip Paeps 3610f999687SAndrew Rybchenko #if defined(__x86_64__) 3620f999687SAndrew Rybchenko #define EFSYS_MEM_READQ(_esmp, _offset, _eqp) \ 3630f999687SAndrew Rybchenko do { \ 3640f999687SAndrew Rybchenko uint64_t *addr; \ 3650f999687SAndrew Rybchenko \ 3660f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 3677daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 3687daf1fedSAndrew Rybchenko sizeof (efx_qword_t)), \ 3690f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 3700f999687SAndrew Rybchenko \ 3710f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \ 3720f999687SAndrew Rybchenko \ 3730f999687SAndrew Rybchenko (_eqp)->eq_u64[0] = *addr; \ 3740f999687SAndrew Rybchenko \ 3750f999687SAndrew Rybchenko EFSYS_PROBE3(mem_readq, unsigned int, (_offset), \ 3760f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 3770f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 3780f999687SAndrew Rybchenko \ 3790f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 3800f999687SAndrew Rybchenko } while (B_FALSE) 3810f999687SAndrew Rybchenko #else 382e948693eSPhilip Paeps #define EFSYS_MEM_READQ(_esmp, _offset, _eqp) \ 383e948693eSPhilip Paeps do { \ 384e948693eSPhilip Paeps uint32_t *addr; \ 385e948693eSPhilip Paeps \ 386e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 3877daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 3887daf1fedSAndrew Rybchenko sizeof (efx_qword_t)), \ 389e948693eSPhilip Paeps ("not power of 2 aligned")); \ 390e948693eSPhilip Paeps \ 391e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 392e948693eSPhilip Paeps \ 393e948693eSPhilip Paeps (_eqp)->eq_u32[0] = *addr++; \ 394e948693eSPhilip Paeps (_eqp)->eq_u32[1] = *addr; \ 395e948693eSPhilip Paeps \ 396e948693eSPhilip Paeps EFSYS_PROBE3(mem_readq, unsigned int, (_offset), \ 397e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 398e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 399e948693eSPhilip Paeps \ 400e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 401e948693eSPhilip Paeps } while (B_FALSE) 4020f999687SAndrew Rybchenko #endif 403e948693eSPhilip Paeps 4040f999687SAndrew Rybchenko #if defined(__x86_64__) 4050f999687SAndrew Rybchenko #define EFSYS_MEM_READO(_esmp, _offset, _eop) \ 4060f999687SAndrew Rybchenko do { \ 4070f999687SAndrew Rybchenko uint64_t *addr; \ 4080f999687SAndrew Rybchenko \ 4090f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 4107daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 4117daf1fedSAndrew Rybchenko sizeof (efx_oword_t)), \ 4120f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 4130f999687SAndrew Rybchenko \ 4140f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \ 4150f999687SAndrew Rybchenko \ 4160f999687SAndrew Rybchenko (_eop)->eo_u64[0] = *addr++; \ 4170f999687SAndrew Rybchenko (_eop)->eo_u64[1] = *addr; \ 4180f999687SAndrew Rybchenko \ 4190f999687SAndrew Rybchenko EFSYS_PROBE5(mem_reado, unsigned int, (_offset), \ 4200f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 4210f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 4220f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 4230f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 4240f999687SAndrew Rybchenko \ 4250f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 4260f999687SAndrew Rybchenko } while (B_FALSE) 4270f999687SAndrew Rybchenko #else 428e948693eSPhilip Paeps #define EFSYS_MEM_READO(_esmp, _offset, _eop) \ 429e948693eSPhilip Paeps do { \ 430e948693eSPhilip Paeps uint32_t *addr; \ 431e948693eSPhilip Paeps \ 432e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 4337daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 4347daf1fedSAndrew Rybchenko sizeof (efx_oword_t)), \ 435e948693eSPhilip Paeps ("not power of 2 aligned")); \ 436e948693eSPhilip Paeps \ 437e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 438e948693eSPhilip Paeps \ 439e948693eSPhilip Paeps (_eop)->eo_u32[0] = *addr++; \ 440e948693eSPhilip Paeps (_eop)->eo_u32[1] = *addr++; \ 441e948693eSPhilip Paeps (_eop)->eo_u32[2] = *addr++; \ 442e948693eSPhilip Paeps (_eop)->eo_u32[3] = *addr; \ 443e948693eSPhilip Paeps \ 444e948693eSPhilip Paeps EFSYS_PROBE5(mem_reado, unsigned int, (_offset), \ 445e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 446e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 447e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 448e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 449e948693eSPhilip Paeps \ 450e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 451e948693eSPhilip Paeps } while (B_FALSE) 4520f999687SAndrew Rybchenko #endif 453e948693eSPhilip Paeps 454e948693eSPhilip Paeps #define EFSYS_MEM_WRITED(_esmp, _offset, _edp) \ 455e948693eSPhilip Paeps do { \ 456e948693eSPhilip Paeps uint32_t *addr; \ 457e948693eSPhilip Paeps \ 458e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 4597daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 4607daf1fedSAndrew Rybchenko sizeof (efx_dword_t)), \ 461e948693eSPhilip Paeps ("not power of 2 aligned")); \ 462e948693eSPhilip Paeps \ 463e948693eSPhilip Paeps EFSYS_PROBE2(mem_writed, unsigned int, (_offset), \ 464e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 465e948693eSPhilip Paeps \ 466e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 467e948693eSPhilip Paeps \ 468e948693eSPhilip Paeps *addr = (_edp)->ed_u32[0]; \ 469e948693eSPhilip Paeps \ 470e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 471e948693eSPhilip Paeps } while (B_FALSE) 472e948693eSPhilip Paeps 4730f999687SAndrew Rybchenko #if defined(__x86_64__) 4740f999687SAndrew Rybchenko #define EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp) \ 4750f999687SAndrew Rybchenko do { \ 4760f999687SAndrew Rybchenko uint64_t *addr; \ 4770f999687SAndrew Rybchenko \ 4780f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 4797daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 4807daf1fedSAndrew Rybchenko sizeof (efx_qword_t)), \ 4810f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 4820f999687SAndrew Rybchenko \ 4830f999687SAndrew Rybchenko EFSYS_PROBE3(mem_writeq, unsigned int, (_offset), \ 4840f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 4850f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 4860f999687SAndrew Rybchenko \ 4870f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \ 4880f999687SAndrew Rybchenko \ 4890f999687SAndrew Rybchenko *addr = (_eqp)->eq_u64[0]; \ 4900f999687SAndrew Rybchenko \ 4910f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 4920f999687SAndrew Rybchenko } while (B_FALSE) 4930f999687SAndrew Rybchenko 4940f999687SAndrew Rybchenko #else 495e948693eSPhilip Paeps #define EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp) \ 496e948693eSPhilip Paeps do { \ 497e948693eSPhilip Paeps uint32_t *addr; \ 498e948693eSPhilip Paeps \ 499e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 5007daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 5017daf1fedSAndrew Rybchenko sizeof (efx_qword_t)), \ 502e948693eSPhilip Paeps ("not power of 2 aligned")); \ 503e948693eSPhilip Paeps \ 504e948693eSPhilip Paeps EFSYS_PROBE3(mem_writeq, unsigned int, (_offset), \ 505e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 506e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 507e948693eSPhilip Paeps \ 508e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 509e948693eSPhilip Paeps \ 510e948693eSPhilip Paeps *addr++ = (_eqp)->eq_u32[0]; \ 511e948693eSPhilip Paeps *addr = (_eqp)->eq_u32[1]; \ 512e948693eSPhilip Paeps \ 513e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 514e948693eSPhilip Paeps } while (B_FALSE) 5150f999687SAndrew Rybchenko #endif 516e948693eSPhilip Paeps 5170f999687SAndrew Rybchenko #if defined(__x86_64__) 5180f999687SAndrew Rybchenko #define EFSYS_MEM_WRITEO(_esmp, _offset, _eop) \ 5190f999687SAndrew Rybchenko do { \ 5200f999687SAndrew Rybchenko uint64_t *addr; \ 5210f999687SAndrew Rybchenko \ 5220f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 5237daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 5247daf1fedSAndrew Rybchenko sizeof (efx_oword_t)), \ 5250f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 5260f999687SAndrew Rybchenko \ 5270f999687SAndrew Rybchenko EFSYS_PROBE5(mem_writeo, unsigned int, (_offset), \ 5280f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 5290f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 5300f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 5310f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 5320f999687SAndrew Rybchenko \ 5330f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \ 5340f999687SAndrew Rybchenko \ 5350f999687SAndrew Rybchenko *addr++ = (_eop)->eo_u64[0]; \ 5360f999687SAndrew Rybchenko *addr = (_eop)->eo_u64[1]; \ 5370f999687SAndrew Rybchenko \ 5380f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 5390f999687SAndrew Rybchenko } while (B_FALSE) 5400f999687SAndrew Rybchenko #else 541e948693eSPhilip Paeps #define EFSYS_MEM_WRITEO(_esmp, _offset, _eop) \ 542e948693eSPhilip Paeps do { \ 543e948693eSPhilip Paeps uint32_t *addr; \ 544e948693eSPhilip Paeps \ 545e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 5467daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 5477daf1fedSAndrew Rybchenko sizeof (efx_oword_t)), \ 548e948693eSPhilip Paeps ("not power of 2 aligned")); \ 549e948693eSPhilip Paeps \ 550e948693eSPhilip Paeps EFSYS_PROBE5(mem_writeo, unsigned int, (_offset), \ 551e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 552e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 553e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 554e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 555e948693eSPhilip Paeps \ 556e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 557e948693eSPhilip Paeps \ 558e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[0]; \ 559e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[1]; \ 560e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[2]; \ 561e948693eSPhilip Paeps *addr = (_eop)->eo_u32[3]; \ 562e948693eSPhilip Paeps \ 563e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 564e948693eSPhilip Paeps } while (B_FALSE) 5650f999687SAndrew Rybchenko #endif 566e948693eSPhilip Paeps 567e948693eSPhilip Paeps /* BAR */ 568e948693eSPhilip Paeps 56933d45dc5SAndrew Rybchenko #define SFXGE_LOCK_NAME_MAX 16 57033d45dc5SAndrew Rybchenko 571e948693eSPhilip Paeps typedef struct efsys_bar_s { 572e948693eSPhilip Paeps struct mtx esb_lock; 57333d45dc5SAndrew Rybchenko char esb_lock_name[SFXGE_LOCK_NAME_MAX]; 574e948693eSPhilip Paeps bus_space_tag_t esb_tag; 575e948693eSPhilip Paeps bus_space_handle_t esb_handle; 576e948693eSPhilip Paeps int esb_rid; 577e948693eSPhilip Paeps struct resource *esb_res; 578e948693eSPhilip Paeps } efsys_bar_t; 579e948693eSPhilip Paeps 58033d45dc5SAndrew Rybchenko #define SFXGE_BAR_LOCK_INIT(_esbp, _ifname) \ 58133d45dc5SAndrew Rybchenko do { \ 58233d45dc5SAndrew Rybchenko snprintf((_esbp)->esb_lock_name, \ 58333d45dc5SAndrew Rybchenko sizeof((_esbp)->esb_lock_name), \ 58433d45dc5SAndrew Rybchenko "%s:bar", (_ifname)); \ 58533d45dc5SAndrew Rybchenko mtx_init(&(_esbp)->esb_lock, (_esbp)->esb_lock_name, \ 58633d45dc5SAndrew Rybchenko NULL, MTX_DEF); \ 58733d45dc5SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 58833d45dc5SAndrew Rybchenko } while (B_FALSE) 589763cab71SAndrew Rybchenko #define SFXGE_BAR_LOCK_DESTROY(_esbp) \ 590763cab71SAndrew Rybchenko mtx_destroy(&(_esbp)->esb_lock) 591763cab71SAndrew Rybchenko #define SFXGE_BAR_LOCK(_esbp) \ 592763cab71SAndrew Rybchenko mtx_lock(&(_esbp)->esb_lock) 593763cab71SAndrew Rybchenko #define SFXGE_BAR_UNLOCK(_esbp) \ 594763cab71SAndrew Rybchenko mtx_unlock(&(_esbp)->esb_lock) 595763cab71SAndrew Rybchenko 596e948693eSPhilip Paeps #define EFSYS_BAR_READD(_esbp, _offset, _edp, _lock) \ 597e948693eSPhilip Paeps do { \ 598e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 5997daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 6007daf1fedSAndrew Rybchenko sizeof (efx_dword_t)), \ 601e948693eSPhilip Paeps ("not power of 2 aligned")); \ 602e948693eSPhilip Paeps \ 603e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 604e948693eSPhilip Paeps if (_lock) \ 605763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 606e948693eSPhilip Paeps \ 607d9ff48abSAndrew Rybchenko (_edp)->ed_u32[0] = bus_space_read_stream_4( \ 608d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 609d9ff48abSAndrew Rybchenko (_offset)); \ 610e948693eSPhilip Paeps \ 611e948693eSPhilip Paeps EFSYS_PROBE2(bar_readd, unsigned int, (_offset), \ 612e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 613e948693eSPhilip Paeps \ 614e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 615e948693eSPhilip Paeps if (_lock) \ 616763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 617e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 618e948693eSPhilip Paeps } while (B_FALSE) 619e948693eSPhilip Paeps 6205dadbb64SAndrew Rybchenko #if defined(SFXGE_USE_BUS_SPACE_8) 621e948693eSPhilip Paeps #define EFSYS_BAR_READQ(_esbp, _offset, _eqp) \ 622e948693eSPhilip Paeps do { \ 623e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 6247daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 6257daf1fedSAndrew Rybchenko sizeof (efx_qword_t)), \ 626e948693eSPhilip Paeps ("not power of 2 aligned")); \ 627e948693eSPhilip Paeps \ 628763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 629e948693eSPhilip Paeps \ 630d9ff48abSAndrew Rybchenko (_eqp)->eq_u64[0] = bus_space_read_stream_8( \ 631d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 632d9ff48abSAndrew Rybchenko (_offset)); \ 6330f999687SAndrew Rybchenko \ 6340f999687SAndrew Rybchenko EFSYS_PROBE3(bar_readq, unsigned int, (_offset), \ 6350f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 6360f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 6370f999687SAndrew Rybchenko \ 638687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 6390f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 6400f999687SAndrew Rybchenko } while (B_FALSE) 6410f999687SAndrew Rybchenko 6420f999687SAndrew Rybchenko #define EFSYS_BAR_READO(_esbp, _offset, _eop, _lock) \ 6430f999687SAndrew Rybchenko do { \ 6440f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 6457daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 6467daf1fedSAndrew Rybchenko sizeof (efx_oword_t)), \ 6470f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 6480f999687SAndrew Rybchenko \ 6490f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 6500f999687SAndrew Rybchenko if (_lock) \ 651687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 6520f999687SAndrew Rybchenko \ 653d9ff48abSAndrew Rybchenko (_eop)->eo_u64[0] = bus_space_read_stream_8( \ 654d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 655d9ff48abSAndrew Rybchenko (_offset)); \ 656d9ff48abSAndrew Rybchenko (_eop)->eo_u64[1] = bus_space_read_stream_8( \ 657d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 658d9ff48abSAndrew Rybchenko (_offset) + 8); \ 6590f999687SAndrew Rybchenko \ 6600f999687SAndrew Rybchenko EFSYS_PROBE5(bar_reado, unsigned int, (_offset), \ 6610f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 6620f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 6630f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 6640f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 6650f999687SAndrew Rybchenko \ 6660f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 6670f999687SAndrew Rybchenko if (_lock) \ 668687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 6690f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 6700f999687SAndrew Rybchenko } while (B_FALSE) 6710f999687SAndrew Rybchenko 6720f999687SAndrew Rybchenko #else 6730f999687SAndrew Rybchenko #define EFSYS_BAR_READQ(_esbp, _offset, _eqp) \ 6740f999687SAndrew Rybchenko do { \ 6750f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 6767daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 6777daf1fedSAndrew Rybchenko sizeof (efx_qword_t)), \ 6780f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 6790f999687SAndrew Rybchenko \ 680687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 6810f999687SAndrew Rybchenko \ 682d9ff48abSAndrew Rybchenko (_eqp)->eq_u32[0] = bus_space_read_stream_4( \ 683d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 684d9ff48abSAndrew Rybchenko (_offset)); \ 685d9ff48abSAndrew Rybchenko (_eqp)->eq_u32[1] = bus_space_read_stream_4( \ 686d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 687d9ff48abSAndrew Rybchenko (_offset) + 4); \ 688e948693eSPhilip Paeps \ 689e948693eSPhilip Paeps EFSYS_PROBE3(bar_readq, unsigned int, (_offset), \ 690e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 691e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 692e948693eSPhilip Paeps \ 693763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 694e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 695e948693eSPhilip Paeps } while (B_FALSE) 696e948693eSPhilip Paeps 697e948693eSPhilip Paeps #define EFSYS_BAR_READO(_esbp, _offset, _eop, _lock) \ 698e948693eSPhilip Paeps do { \ 699e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 7007daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 7017daf1fedSAndrew Rybchenko sizeof (efx_oword_t)), \ 702e948693eSPhilip Paeps ("not power of 2 aligned")); \ 703e948693eSPhilip Paeps \ 704e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 705e948693eSPhilip Paeps if (_lock) \ 706763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 707e948693eSPhilip Paeps \ 708d9ff48abSAndrew Rybchenko (_eop)->eo_u32[0] = bus_space_read_stream_4( \ 709d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 710d9ff48abSAndrew Rybchenko (_offset)); \ 711d9ff48abSAndrew Rybchenko (_eop)->eo_u32[1] = bus_space_read_stream_4( \ 712d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 713d9ff48abSAndrew Rybchenko (_offset) + 4); \ 714d9ff48abSAndrew Rybchenko (_eop)->eo_u32[2] = bus_space_read_stream_4( \ 715d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 716d9ff48abSAndrew Rybchenko (_offset) + 8); \ 717d9ff48abSAndrew Rybchenko (_eop)->eo_u32[3] = bus_space_read_stream_4( \ 718d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 719d9ff48abSAndrew Rybchenko (_offset) + 12); \ 720e948693eSPhilip Paeps \ 721e948693eSPhilip Paeps EFSYS_PROBE5(bar_reado, unsigned int, (_offset), \ 722e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 723e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 724e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 725e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 726e948693eSPhilip Paeps \ 727e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 728e948693eSPhilip Paeps if (_lock) \ 729763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 730e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 731e948693eSPhilip Paeps } while (B_FALSE) 7320f999687SAndrew Rybchenko #endif 733e948693eSPhilip Paeps 734e948693eSPhilip Paeps #define EFSYS_BAR_WRITED(_esbp, _offset, _edp, _lock) \ 735e948693eSPhilip Paeps do { \ 736e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 7377daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 7387daf1fedSAndrew Rybchenko sizeof (efx_dword_t)), \ 739e948693eSPhilip Paeps ("not power of 2 aligned")); \ 740e948693eSPhilip Paeps \ 741e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 742e948693eSPhilip Paeps if (_lock) \ 743763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 744e948693eSPhilip Paeps \ 745e948693eSPhilip Paeps EFSYS_PROBE2(bar_writed, unsigned int, (_offset), \ 746e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 747e948693eSPhilip Paeps \ 7481cc8febfSAndrew Rybchenko /* \ 7491cc8febfSAndrew Rybchenko * Make sure that previous writes to the dword have \ 7501cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \ 7511cc8febfSAndrew Rybchenko * after the write below. \ 7521cc8febfSAndrew Rybchenko */ \ 7531cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 7541cc8febfSAndrew Rybchenko (_offset), sizeof (efx_dword_t), \ 7551cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 756d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 757d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 758e948693eSPhilip Paeps (_offset), (_edp)->ed_u32[0]); \ 759e948693eSPhilip Paeps \ 760e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 761e948693eSPhilip Paeps if (_lock) \ 762763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 763e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 764e948693eSPhilip Paeps } while (B_FALSE) 765e948693eSPhilip Paeps 7665dadbb64SAndrew Rybchenko #if defined(SFXGE_USE_BUS_SPACE_8) 767e948693eSPhilip Paeps #define EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp) \ 768e948693eSPhilip Paeps do { \ 769e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 7707daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 7717daf1fedSAndrew Rybchenko sizeof (efx_qword_t)), \ 772e948693eSPhilip Paeps ("not power of 2 aligned")); \ 773e948693eSPhilip Paeps \ 774763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 775e948693eSPhilip Paeps \ 776e948693eSPhilip Paeps EFSYS_PROBE3(bar_writeq, unsigned int, (_offset), \ 777e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 778e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 779e948693eSPhilip Paeps \ 7801cc8febfSAndrew Rybchenko /* \ 7811cc8febfSAndrew Rybchenko * Make sure that previous writes to the qword have \ 7821cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \ 7831cc8febfSAndrew Rybchenko * after the write below. \ 7841cc8febfSAndrew Rybchenko */ \ 7851cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 7861cc8febfSAndrew Rybchenko (_offset), sizeof (efx_qword_t), \ 7871cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 788d9ff48abSAndrew Rybchenko bus_space_write_stream_8((_esbp)->esb_tag, \ 789d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 7900f999687SAndrew Rybchenko (_offset), (_eqp)->eq_u64[0]); \ 7910f999687SAndrew Rybchenko \ 792687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 7930f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 7940f999687SAndrew Rybchenko } while (B_FALSE) 7950f999687SAndrew Rybchenko #else 7960f999687SAndrew Rybchenko #define EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp) \ 7970f999687SAndrew Rybchenko do { \ 7980f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 7997daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 8007daf1fedSAndrew Rybchenko sizeof (efx_qword_t)), \ 8010f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 8020f999687SAndrew Rybchenko \ 803687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 8040f999687SAndrew Rybchenko \ 8050f999687SAndrew Rybchenko EFSYS_PROBE3(bar_writeq, unsigned int, (_offset), \ 8060f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 8070f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 8080f999687SAndrew Rybchenko \ 8091cc8febfSAndrew Rybchenko /* \ 8101cc8febfSAndrew Rybchenko * Make sure that previous writes to the qword have \ 8111cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \ 8121cc8febfSAndrew Rybchenko * after the last write below. \ 8131cc8febfSAndrew Rybchenko */ \ 8141cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 8151cc8febfSAndrew Rybchenko (_offset), sizeof (efx_qword_t), \ 8161cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 817d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 818d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 819e948693eSPhilip Paeps (_offset), (_eqp)->eq_u32[0]); \ 8201cc8febfSAndrew Rybchenko /* \ 8211cc8febfSAndrew Rybchenko * It should be guaranteed that the last dword comes \ 8221cc8febfSAndrew Rybchenko * the last, so barrier entire qword to be sure that \ 8231cc8febfSAndrew Rybchenko * neither above nor below writes are reordered. \ 8241cc8febfSAndrew Rybchenko */ \ 8251cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 8261cc8febfSAndrew Rybchenko (_offset), sizeof (efx_qword_t), \ 8271cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 828d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 829d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 830d9ff48abSAndrew Rybchenko (_offset) + 4, (_eqp)->eq_u32[1]); \ 831e948693eSPhilip Paeps \ 832763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 833e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 834e948693eSPhilip Paeps } while (B_FALSE) 8350f999687SAndrew Rybchenko #endif 836e948693eSPhilip Paeps 8373c838a9fSAndrew Rybchenko /* 8383c838a9fSAndrew Rybchenko * Guarantees 64bit aligned 64bit writes to write combined BAR mapping 8393c838a9fSAndrew Rybchenko * (required by PIO hardware) 8403c838a9fSAndrew Rybchenko */ 8413c838a9fSAndrew Rybchenko #define EFSYS_BAR_WC_WRITEQ(_esbp, _offset, _eqp) \ 8423c838a9fSAndrew Rybchenko do { \ 8433c838a9fSAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 8447daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 8457daf1fedSAndrew Rybchenko sizeof (efx_qword_t)), \ 8463c838a9fSAndrew Rybchenko ("not power of 2 aligned")); \ 8473c838a9fSAndrew Rybchenko \ 8483c838a9fSAndrew Rybchenko (void) (_esbp); \ 849*a79731b9SDimitry Andric (void) (_eqp); \ 8503c838a9fSAndrew Rybchenko \ 8513c838a9fSAndrew Rybchenko /* FIXME: Perform a 64-bit write */ \ 8523c838a9fSAndrew Rybchenko KASSERT(0, ("not implemented")); \ 8533c838a9fSAndrew Rybchenko \ 8543c838a9fSAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 8553c838a9fSAndrew Rybchenko } while (B_FALSE) 8563c838a9fSAndrew Rybchenko 8575dadbb64SAndrew Rybchenko #if defined(SFXGE_USE_BUS_SPACE_8) 858e948693eSPhilip Paeps #define EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock) \ 859e948693eSPhilip Paeps do { \ 860e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 8617daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 8627daf1fedSAndrew Rybchenko sizeof (efx_oword_t)), \ 863e948693eSPhilip Paeps ("not power of 2 aligned")); \ 864e948693eSPhilip Paeps \ 865e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 866e948693eSPhilip Paeps if (_lock) \ 867763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 868e948693eSPhilip Paeps \ 869e948693eSPhilip Paeps EFSYS_PROBE5(bar_writeo, unsigned int, (_offset), \ 870e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 871e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 872e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 873e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 874e948693eSPhilip Paeps \ 8751cc8febfSAndrew Rybchenko /* \ 8761cc8febfSAndrew Rybchenko * Make sure that previous writes to the oword have \ 8771cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \ 8781cc8febfSAndrew Rybchenko * after the last write below. \ 8791cc8febfSAndrew Rybchenko */ \ 8801cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 8811cc8febfSAndrew Rybchenko (_offset), sizeof (efx_oword_t), \ 8821cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 883d9ff48abSAndrew Rybchenko bus_space_write_stream_8((_esbp)->esb_tag, \ 884d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 8850f999687SAndrew Rybchenko (_offset), (_eop)->eo_u64[0]); \ 8861cc8febfSAndrew Rybchenko /* \ 8871cc8febfSAndrew Rybchenko * It should be guaranteed that the last qword comes \ 8881cc8febfSAndrew Rybchenko * the last, so barrier entire oword to be sure that \ 8891cc8febfSAndrew Rybchenko * neither above nor below writes are reordered. \ 8901cc8febfSAndrew Rybchenko */ \ 8911cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 8921cc8febfSAndrew Rybchenko (_offset), sizeof (efx_oword_t), \ 8931cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 894d9ff48abSAndrew Rybchenko bus_space_write_stream_8((_esbp)->esb_tag, \ 895d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 896d9ff48abSAndrew Rybchenko (_offset) + 8, (_eop)->eo_u64[1]); \ 8970f999687SAndrew Rybchenko \ 8980f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 8990f999687SAndrew Rybchenko if (_lock) \ 900687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 9010f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9020f999687SAndrew Rybchenko } while (B_FALSE) 9030f999687SAndrew Rybchenko 9040f999687SAndrew Rybchenko #else 9050f999687SAndrew Rybchenko #define EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock) \ 9060f999687SAndrew Rybchenko do { \ 9070f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9087daf1fedSAndrew Rybchenko KASSERT(EFX_IS_P2ALIGNED(size_t, _offset, \ 9097daf1fedSAndrew Rybchenko sizeof (efx_oword_t)), \ 9100f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 9110f999687SAndrew Rybchenko \ 9120f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9130f999687SAndrew Rybchenko if (_lock) \ 914687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 9150f999687SAndrew Rybchenko \ 9160f999687SAndrew Rybchenko EFSYS_PROBE5(bar_writeo, unsigned int, (_offset), \ 9170f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 9180f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 9190f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 9200f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 9210f999687SAndrew Rybchenko \ 9221cc8febfSAndrew Rybchenko /* \ 9231cc8febfSAndrew Rybchenko * Make sure that previous writes to the oword have \ 9241cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \ 9251cc8febfSAndrew Rybchenko * after the last write below. \ 9261cc8febfSAndrew Rybchenko */ \ 9271cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 9281cc8febfSAndrew Rybchenko (_offset), sizeof (efx_oword_t), \ 9291cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 930d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 931d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 932e948693eSPhilip Paeps (_offset), (_eop)->eo_u32[0]); \ 933d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 934d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 935d9ff48abSAndrew Rybchenko (_offset) + 4, (_eop)->eo_u32[1]); \ 936d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 937d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 938d9ff48abSAndrew Rybchenko (_offset) + 8, (_eop)->eo_u32[2]); \ 9391cc8febfSAndrew Rybchenko /* \ 9401cc8febfSAndrew Rybchenko * It should be guaranteed that the last dword comes \ 9411cc8febfSAndrew Rybchenko * the last, so barrier entire oword to be sure that \ 9421cc8febfSAndrew Rybchenko * neither above nor below writes are reordered. \ 9431cc8febfSAndrew Rybchenko */ \ 9441cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 9451cc8febfSAndrew Rybchenko (_offset), sizeof (efx_oword_t), \ 9461cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 947d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 948d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 949d9ff48abSAndrew Rybchenko (_offset) + 12, (_eop)->eo_u32[3]); \ 950e948693eSPhilip Paeps \ 951e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 952e948693eSPhilip Paeps if (_lock) \ 953763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 954e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 955e948693eSPhilip Paeps } while (B_FALSE) 9560f999687SAndrew Rybchenko #endif 957e948693eSPhilip Paeps 9583c838a9fSAndrew Rybchenko /* Use the standard octo-word write for doorbell writes */ 9593c838a9fSAndrew Rybchenko #define EFSYS_BAR_DOORBELL_WRITEO(_esbp, _offset, _eop) \ 9603c838a9fSAndrew Rybchenko do { \ 9613c838a9fSAndrew Rybchenko EFSYS_BAR_WRITEO((_esbp), (_offset), (_eop), B_FALSE); \ 9623c838a9fSAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9633c838a9fSAndrew Rybchenko } while (B_FALSE) 9643c838a9fSAndrew Rybchenko 965e948693eSPhilip Paeps /* SPIN */ 966e948693eSPhilip Paeps 967e948693eSPhilip Paeps #define EFSYS_SPIN(_us) \ 968e948693eSPhilip Paeps do { \ 969e948693eSPhilip Paeps DELAY(_us); \ 970e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 971e948693eSPhilip Paeps } while (B_FALSE) 972e948693eSPhilip Paeps 973e948693eSPhilip Paeps #define EFSYS_SLEEP EFSYS_SPIN 974e948693eSPhilip Paeps 975e948693eSPhilip Paeps /* BARRIERS */ 976e948693eSPhilip Paeps 9777c00963aSAndrew Rybchenko #define EFSYS_MEM_READ_BARRIER() rmb() 978e948693eSPhilip Paeps #define EFSYS_PIO_WRITE_BARRIER() 979e948693eSPhilip Paeps 9803c838a9fSAndrew Rybchenko /* DMA SYNC */ 9813c838a9fSAndrew Rybchenko #define EFSYS_DMA_SYNC_FOR_KERNEL(_esmp, _offset, _size) \ 9823c838a9fSAndrew Rybchenko do { \ 9833c838a9fSAndrew Rybchenko bus_dmamap_sync((_esmp)->esm_tag, \ 9843c838a9fSAndrew Rybchenko (_esmp)->esm_map, \ 9853c838a9fSAndrew Rybchenko BUS_DMASYNC_POSTREAD); \ 9863c838a9fSAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9873c838a9fSAndrew Rybchenko } while (B_FALSE) 9883c838a9fSAndrew Rybchenko 9893c838a9fSAndrew Rybchenko #define EFSYS_DMA_SYNC_FOR_DEVICE(_esmp, _offset, _size) \ 9903c838a9fSAndrew Rybchenko do { \ 9913c838a9fSAndrew Rybchenko bus_dmamap_sync((_esmp)->esm_tag, \ 9923c838a9fSAndrew Rybchenko (_esmp)->esm_map, \ 9933c838a9fSAndrew Rybchenko BUS_DMASYNC_PREWRITE); \ 9943c838a9fSAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9953c838a9fSAndrew Rybchenko } while (B_FALSE) 9963c838a9fSAndrew Rybchenko 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 1057a98003ddSAndrew Rybchenko typedef int efsys_lock_state_t; 1058a98003ddSAndrew Rybchenko 1059e948693eSPhilip Paeps #define EFSYS_LOCK_MAGIC 0x000010c4 1060e948693eSPhilip Paeps 1061e948693eSPhilip Paeps #define EFSYS_LOCK(_lockp, _state) \ 1062e948693eSPhilip Paeps do { \ 106333d45dc5SAndrew Rybchenko SFXGE_EFSYS_LOCK(_lockp); \ 1064e948693eSPhilip Paeps (_state) = EFSYS_LOCK_MAGIC; \ 1065e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1066e948693eSPhilip Paeps } while (B_FALSE) 1067e948693eSPhilip Paeps 1068e948693eSPhilip Paeps #define EFSYS_UNLOCK(_lockp, _state) \ 1069e948693eSPhilip Paeps do { \ 1070e948693eSPhilip Paeps if ((_state) != EFSYS_LOCK_MAGIC) \ 1071e948693eSPhilip Paeps KASSERT(B_FALSE, ("not locked")); \ 107233d45dc5SAndrew Rybchenko SFXGE_EFSYS_UNLOCK(_lockp); \ 1073e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1074e948693eSPhilip Paeps } while (B_FALSE) 1075e948693eSPhilip Paeps 1076e948693eSPhilip Paeps /* STAT */ 1077e948693eSPhilip Paeps 1078e948693eSPhilip Paeps typedef uint64_t efsys_stat_t; 1079e948693eSPhilip Paeps 1080e948693eSPhilip Paeps #define EFSYS_STAT_INCR(_knp, _delta) \ 1081e948693eSPhilip Paeps do { \ 1082e948693eSPhilip Paeps *(_knp) += (_delta); \ 1083e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1084e948693eSPhilip Paeps } while (B_FALSE) 1085e948693eSPhilip Paeps 1086e948693eSPhilip Paeps #define EFSYS_STAT_DECR(_knp, _delta) \ 1087e948693eSPhilip Paeps do { \ 1088e948693eSPhilip Paeps *(_knp) -= (_delta); \ 1089e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1090e948693eSPhilip Paeps } while (B_FALSE) 1091e948693eSPhilip Paeps 1092e948693eSPhilip Paeps #define EFSYS_STAT_SET(_knp, _val) \ 1093e948693eSPhilip Paeps do { \ 1094e948693eSPhilip Paeps *(_knp) = (_val); \ 1095e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1096e948693eSPhilip Paeps } while (B_FALSE) 1097e948693eSPhilip Paeps 1098e948693eSPhilip Paeps #define EFSYS_STAT_SET_QWORD(_knp, _valp) \ 1099e948693eSPhilip Paeps do { \ 1100e948693eSPhilip Paeps *(_knp) = le64toh((_valp)->eq_u64[0]); \ 1101e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1102e948693eSPhilip Paeps } while (B_FALSE) 1103e948693eSPhilip Paeps 1104e948693eSPhilip Paeps #define EFSYS_STAT_SET_DWORD(_knp, _valp) \ 1105e948693eSPhilip Paeps do { \ 1106e948693eSPhilip Paeps *(_knp) = le32toh((_valp)->ed_u32[0]); \ 1107e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1108e948693eSPhilip Paeps } while (B_FALSE) 1109e948693eSPhilip Paeps 1110e948693eSPhilip Paeps #define EFSYS_STAT_INCR_QWORD(_knp, _valp) \ 1111e948693eSPhilip Paeps do { \ 1112e948693eSPhilip Paeps *(_knp) += le64toh((_valp)->eq_u64[0]); \ 1113e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1114e948693eSPhilip Paeps } while (B_FALSE) 1115e948693eSPhilip Paeps 1116e948693eSPhilip Paeps #define EFSYS_STAT_SUBR_QWORD(_knp, _valp) \ 1117e948693eSPhilip Paeps do { \ 1118e948693eSPhilip Paeps *(_knp) -= le64toh((_valp)->eq_u64[0]); \ 1119e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1120e948693eSPhilip Paeps } while (B_FALSE) 1121e948693eSPhilip Paeps 1122e948693eSPhilip Paeps /* ERR */ 1123e948693eSPhilip Paeps 1124e948693eSPhilip Paeps extern void sfxge_err(efsys_identifier_t *, unsigned int, 1125e948693eSPhilip Paeps uint32_t, uint32_t); 1126e948693eSPhilip Paeps 1127e948693eSPhilip Paeps #if EFSYS_OPT_DECODE_INTR_FATAL 1128e948693eSPhilip Paeps #define EFSYS_ERR(_esip, _code, _dword0, _dword1) \ 1129e948693eSPhilip Paeps do { \ 1130e948693eSPhilip Paeps sfxge_err((_esip), (_code), (_dword0), (_dword1)); \ 1131e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1132e948693eSPhilip Paeps } while (B_FALSE) 1133e948693eSPhilip Paeps #endif 1134e948693eSPhilip Paeps 1135e948693eSPhilip Paeps /* ASSERT */ 1136e948693eSPhilip Paeps 1137e948693eSPhilip Paeps #define EFSYS_ASSERT(_exp) do { \ 1138e948693eSPhilip Paeps if (!(_exp)) \ 11393c838a9fSAndrew Rybchenko panic("%s", #_exp); \ 1140e948693eSPhilip Paeps } while (0) 1141e948693eSPhilip Paeps 1142e948693eSPhilip Paeps #define EFSYS_ASSERT3(_x, _op, _y, _t) do { \ 1143e948693eSPhilip Paeps const _t __x = (_t)(_x); \ 1144e948693eSPhilip Paeps const _t __y = (_t)(_y); \ 1145e948693eSPhilip Paeps if (!(__x _op __y)) \ 1146e948693eSPhilip Paeps panic("assertion failed at %s:%u", __FILE__, __LINE__); \ 1147e948693eSPhilip Paeps } while(0) 1148e948693eSPhilip Paeps 1149e948693eSPhilip Paeps #define EFSYS_ASSERT3U(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, uint64_t) 1150e948693eSPhilip Paeps #define EFSYS_ASSERT3S(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, int64_t) 1151e948693eSPhilip Paeps #define EFSYS_ASSERT3P(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, uintptr_t) 1152e948693eSPhilip Paeps 11533c838a9fSAndrew Rybchenko /* ROTATE */ 11543c838a9fSAndrew Rybchenko 11553c838a9fSAndrew Rybchenko #define EFSYS_HAS_ROTL_DWORD 0 11563c838a9fSAndrew Rybchenko 1157e948693eSPhilip Paeps #ifdef __cplusplus 1158e948693eSPhilip Paeps } 1159e948693eSPhilip Paeps #endif 1160e948693eSPhilip Paeps 1161e948693eSPhilip Paeps #endif /* _SYS_EFSYS_H */ 1162