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 /* Common code requires this */ 76e948693eSPhilip Paeps #if __FreeBSD_version < 800068 77e948693eSPhilip Paeps #define memmove(d, s, l) bcopy(s, d, l) 78e948693eSPhilip Paeps #endif 79e948693eSPhilip Paeps 80e948693eSPhilip Paeps /* FreeBSD equivalents of Solaris things */ 81e948693eSPhilip Paeps #ifndef _NOTE 82e948693eSPhilip Paeps #define _NOTE(s) 83e948693eSPhilip Paeps #endif 84e948693eSPhilip Paeps 85e948693eSPhilip Paeps #ifndef B_FALSE 86e948693eSPhilip Paeps #define B_FALSE FALSE 87e948693eSPhilip Paeps #endif 88e948693eSPhilip Paeps #ifndef B_TRUE 89e948693eSPhilip Paeps #define B_TRUE TRUE 90e948693eSPhilip Paeps #endif 91e948693eSPhilip Paeps 92e948693eSPhilip Paeps #ifndef IS_P2ALIGNED 93e948693eSPhilip Paeps #define IS_P2ALIGNED(v, a) ((((uintptr_t)(v)) & ((uintptr_t)(a) - 1)) == 0) 94e948693eSPhilip Paeps #endif 95e948693eSPhilip Paeps 96e948693eSPhilip Paeps #ifndef P2ROUNDUP 97e948693eSPhilip Paeps #define P2ROUNDUP(x, align) (-(-(x) & -(align))) 98e948693eSPhilip Paeps #endif 99e948693eSPhilip Paeps 1003c838a9fSAndrew Rybchenko #ifndef P2ALIGN 1013c838a9fSAndrew Rybchenko #define P2ALIGN(_x, _a) ((_x) & -(_a)) 1023c838a9fSAndrew Rybchenko #endif 1033c838a9fSAndrew Rybchenko 104e948693eSPhilip Paeps #ifndef IS2P 105e948693eSPhilip Paeps #define ISP2(x) (((x) & ((x) - 1)) == 0) 106e948693eSPhilip Paeps #endif 107e948693eSPhilip Paeps 1085dadbb64SAndrew Rybchenko #if defined(__x86_64__) && __FreeBSD_version >= 1000000 1095dadbb64SAndrew Rybchenko 1105dadbb64SAndrew Rybchenko #define SFXGE_USE_BUS_SPACE_8 1 1115dadbb64SAndrew Rybchenko 112d9ff48abSAndrew Rybchenko #if !defined(bus_space_read_stream_8) 1135dadbb64SAndrew Rybchenko 114d9ff48abSAndrew Rybchenko #define bus_space_read_stream_8(t, h, o) \ 115d9ff48abSAndrew Rybchenko bus_space_read_8((t), (h), (o)) 1165dadbb64SAndrew Rybchenko 117d9ff48abSAndrew Rybchenko #define bus_space_write_stream_8(t, h, o, v) \ 118d9ff48abSAndrew Rybchenko bus_space_write_8((t), (h), (o), (v)) 1195dadbb64SAndrew Rybchenko 120d9ff48abSAndrew Rybchenko #endif 1215dadbb64SAndrew Rybchenko 122d9ff48abSAndrew Rybchenko #endif 123d9ff48abSAndrew Rybchenko 124e948693eSPhilip Paeps #define ENOTACTIVE EINVAL 125e948693eSPhilip Paeps 126e948693eSPhilip Paeps /* Memory type to use on FreeBSD */ 127e948693eSPhilip Paeps MALLOC_DECLARE(M_SFXGE); 128e948693eSPhilip Paeps 129e948693eSPhilip Paeps /* Machine dependend prefetch wrappers */ 130dc1788e8SMarius Strobl #if defined(__i386__) || defined(__amd64__) 131e948693eSPhilip Paeps static __inline void 132e948693eSPhilip Paeps prefetch_read_many(void *addr) 133e948693eSPhilip Paeps { 134dc1788e8SMarius Strobl 135e948693eSPhilip Paeps __asm__( 136e948693eSPhilip Paeps "prefetcht0 (%0)" 137e948693eSPhilip Paeps : 138e948693eSPhilip Paeps : "r" (addr)); 139e948693eSPhilip Paeps } 140e948693eSPhilip Paeps 141e948693eSPhilip Paeps static __inline void 142e948693eSPhilip Paeps prefetch_read_once(void *addr) 143e948693eSPhilip Paeps { 144dc1788e8SMarius Strobl 145e948693eSPhilip Paeps __asm__( 146e948693eSPhilip Paeps "prefetchnta (%0)" 147e948693eSPhilip Paeps : 148e948693eSPhilip Paeps : "r" (addr)); 149e948693eSPhilip Paeps } 150dc1788e8SMarius Strobl #elif defined(__sparc64__) 151dc1788e8SMarius Strobl static __inline void 152dc1788e8SMarius Strobl prefetch_read_many(void *addr) 153dc1788e8SMarius Strobl { 154dc1788e8SMarius Strobl 155dc1788e8SMarius Strobl __asm__( 156dc1788e8SMarius Strobl "prefetch [%0], 0" 157dc1788e8SMarius Strobl : 158dc1788e8SMarius Strobl : "r" (addr)); 159dc1788e8SMarius Strobl } 160dc1788e8SMarius Strobl 161dc1788e8SMarius Strobl static __inline void 162dc1788e8SMarius Strobl prefetch_read_once(void *addr) 163dc1788e8SMarius Strobl { 164dc1788e8SMarius Strobl 165dc1788e8SMarius Strobl __asm__( 166dc1788e8SMarius Strobl "prefetch [%0], 1" 167dc1788e8SMarius Strobl : 168dc1788e8SMarius Strobl : "r" (addr)); 169dc1788e8SMarius Strobl } 170dc1788e8SMarius Strobl #else 171dc1788e8SMarius Strobl static __inline void 172dc1788e8SMarius Strobl prefetch_read_many(void *addr) 173dc1788e8SMarius Strobl { 174dc1788e8SMarius Strobl 175dc1788e8SMarius Strobl } 176dc1788e8SMarius Strobl 177dc1788e8SMarius Strobl static __inline void 178dc1788e8SMarius Strobl prefetch_read_once(void *addr) 179dc1788e8SMarius Strobl { 180dc1788e8SMarius Strobl 181dc1788e8SMarius Strobl } 182e948693eSPhilip Paeps #endif 183e948693eSPhilip Paeps 184e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__) 185e948693eSPhilip Paeps #include <vm/vm.h> 186e948693eSPhilip Paeps #include <vm/pmap.h> 187e948693eSPhilip Paeps #endif 188e948693eSPhilip Paeps static __inline void 189e948693eSPhilip Paeps sfxge_map_mbuf_fast(bus_dma_tag_t tag, bus_dmamap_t map, 190e948693eSPhilip Paeps struct mbuf *m, bus_dma_segment_t *seg) 191e948693eSPhilip Paeps { 192e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__) 193e948693eSPhilip Paeps seg->ds_addr = pmap_kextract(mtod(m, vm_offset_t)); 194e948693eSPhilip Paeps seg->ds_len = m->m_len; 195e948693eSPhilip Paeps #else 196e948693eSPhilip Paeps int nsegstmp; 197e948693eSPhilip Paeps 198e948693eSPhilip Paeps bus_dmamap_load_mbuf_sg(tag, map, m, seg, &nsegstmp, 0); 199e948693eSPhilip Paeps #endif 200e948693eSPhilip Paeps } 201e948693eSPhilip Paeps 202e948693eSPhilip Paeps /* Modifiers used for Windows builds */ 203e948693eSPhilip Paeps #define __in 204e948693eSPhilip Paeps #define __in_opt 205e948693eSPhilip Paeps #define __in_ecount(_n) 206e948693eSPhilip Paeps #define __in_ecount_opt(_n) 207e948693eSPhilip Paeps #define __in_bcount(_n) 208e948693eSPhilip Paeps #define __in_bcount_opt(_n) 209e948693eSPhilip Paeps 210e948693eSPhilip Paeps #define __out 211e948693eSPhilip Paeps #define __out_opt 212e948693eSPhilip Paeps #define __out_ecount(_n) 213e948693eSPhilip Paeps #define __out_ecount_opt(_n) 214e948693eSPhilip Paeps #define __out_bcount(_n) 215e948693eSPhilip Paeps #define __out_bcount_opt(_n) 216d2a37b9cSAndrew Rybchenko #define __out_bcount_part(_n, _l) 217d2a37b9cSAndrew Rybchenko #define __out_bcount_part_opt(_n, _l) 218e948693eSPhilip Paeps 219e948693eSPhilip Paeps #define __deref_out 220e948693eSPhilip Paeps 221e948693eSPhilip Paeps #define __inout 222e948693eSPhilip Paeps #define __inout_opt 223e948693eSPhilip Paeps #define __inout_ecount(_n) 224e948693eSPhilip Paeps #define __inout_ecount_opt(_n) 225e948693eSPhilip Paeps #define __inout_bcount(_n) 226e948693eSPhilip Paeps #define __inout_bcount_opt(_n) 227e948693eSPhilip Paeps #define __inout_bcount_full_opt(_n) 228e948693eSPhilip Paeps 229e948693eSPhilip Paeps #define __deref_out_bcount_opt(n) 230e948693eSPhilip Paeps 231e948693eSPhilip Paeps #define __checkReturn 232460cb568SAndrew Rybchenko #define __success(_x) 233e948693eSPhilip Paeps 234e948693eSPhilip Paeps #define __drv_when(_p, _c) 235e948693eSPhilip Paeps 236e948693eSPhilip Paeps /* Code inclusion options */ 237e948693eSPhilip Paeps 238e948693eSPhilip Paeps 239e948693eSPhilip Paeps #define EFSYS_OPT_NAMES 1 240e948693eSPhilip Paeps 241e948693eSPhilip Paeps #define EFSYS_OPT_SIENA 1 2423c838a9fSAndrew Rybchenko #define EFSYS_OPT_HUNTINGTON 1 243131bc376SAndrew Rybchenko #define EFSYS_OPT_MEDFORD 1 24497ce60b7SAndrew Rybchenko #define EFSYS_OPT_MEDFORD2 0 245e948693eSPhilip Paeps #ifdef DEBUG 246e948693eSPhilip Paeps #define EFSYS_OPT_CHECK_REG 1 247e948693eSPhilip Paeps #else 248e948693eSPhilip Paeps #define EFSYS_OPT_CHECK_REG 0 249e948693eSPhilip Paeps #endif 250e948693eSPhilip Paeps 251e948693eSPhilip Paeps #define EFSYS_OPT_MCDI 1 252870b1186SAndrew Rybchenko #define EFSYS_OPT_MCDI_LOGGING 0 2533edad197SAndrew Rybchenko #define EFSYS_OPT_MCDI_PROXY_AUTH 0 254e948693eSPhilip Paeps 255e948693eSPhilip Paeps #define EFSYS_OPT_MAC_STATS 1 256e948693eSPhilip Paeps 257e948693eSPhilip Paeps #define EFSYS_OPT_LOOPBACK 0 258e948693eSPhilip Paeps 2593c838a9fSAndrew Rybchenko #define EFSYS_OPT_MON_MCDI 0 260e948693eSPhilip Paeps #define EFSYS_OPT_MON_STATS 0 261e948693eSPhilip Paeps 262e948693eSPhilip Paeps #define EFSYS_OPT_PHY_STATS 1 2633c838a9fSAndrew Rybchenko #define EFSYS_OPT_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_BOOTCFG 0 270391763d7SAndrew Rybchenko #define EFSYS_OPT_IMAGE_LAYOUT 0 271e948693eSPhilip Paeps 272e948693eSPhilip Paeps #define EFSYS_OPT_DIAG 0 273e948693eSPhilip Paeps #define EFSYS_OPT_RX_SCALE 1 274e948693eSPhilip Paeps #define EFSYS_OPT_QSTATS 1 2753c838a9fSAndrew Rybchenko #define EFSYS_OPT_FILTER 1 276e948693eSPhilip Paeps #define EFSYS_OPT_RX_SCATTER 0 277e948693eSPhilip Paeps 278e948693eSPhilip Paeps #define EFSYS_OPT_EV_PREFETCH 0 279e948693eSPhilip Paeps 280e948693eSPhilip Paeps #define EFSYS_OPT_DECODE_INTR_FATAL 1 281e948693eSPhilip Paeps 2820c848230SAndrew Rybchenko #define EFSYS_OPT_LICENSING 0 2830c848230SAndrew Rybchenko 284ecaa500cSAndrew Rybchenko #define EFSYS_OPT_ALLOW_UNCONFIGURED_NIC 0 285ecaa500cSAndrew Rybchenko 2868e0c4827SAndrew Rybchenko #define EFSYS_OPT_RX_PACKED_STREAM 0 2878e0c4827SAndrew Rybchenko 288*04381b5eSAndrew Rybchenko #define EFSYS_OPT_RX_ES_SUPER_BUFFER 0 289*04381b5eSAndrew Rybchenko 290fdbe38cfSAndrew Rybchenko #define EFSYS_OPT_TUNNEL 0 291fdbe38cfSAndrew Rybchenko 292e0b3c2ccSAndrew Rybchenko #define EFSYS_OPT_FW_SUBVARIANT_AWARE 0 293e0b3c2ccSAndrew Rybchenko 294e948693eSPhilip Paeps /* ID */ 295e948693eSPhilip Paeps 296e948693eSPhilip Paeps typedef struct __efsys_identifier_s efsys_identifier_t; 297e948693eSPhilip Paeps 298e948693eSPhilip Paeps /* PROBE */ 299e948693eSPhilip Paeps 30054366c0bSAttilio Rao #ifndef DTRACE_PROBE 301e948693eSPhilip Paeps 302e948693eSPhilip Paeps #define EFSYS_PROBE(_name) 303e948693eSPhilip Paeps 304e948693eSPhilip Paeps #define EFSYS_PROBE1(_name, _type1, _arg1) 305e948693eSPhilip Paeps 306e948693eSPhilip Paeps #define EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2) 307e948693eSPhilip Paeps 308e948693eSPhilip Paeps #define EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2, \ 309e948693eSPhilip Paeps _type3, _arg3) 310e948693eSPhilip Paeps 311e948693eSPhilip Paeps #define EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 312e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) 313e948693eSPhilip Paeps 314e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 315e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) 316e948693eSPhilip Paeps 317e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 318e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 319e948693eSPhilip Paeps _type6, _arg6) 320e948693eSPhilip Paeps 321e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 322e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 323e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) 324e948693eSPhilip Paeps 32554366c0bSAttilio Rao #else /* DTRACE_PROBE */ 326e948693eSPhilip Paeps 327e948693eSPhilip Paeps #define EFSYS_PROBE(_name) \ 328e948693eSPhilip Paeps DTRACE_PROBE(_name) 329e948693eSPhilip Paeps 330e948693eSPhilip Paeps #define EFSYS_PROBE1(_name, _type1, _arg1) \ 331e948693eSPhilip Paeps DTRACE_PROBE1(_name, _type1, _arg1) 332e948693eSPhilip Paeps 333e948693eSPhilip Paeps #define EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2) \ 334e948693eSPhilip Paeps DTRACE_PROBE2(_name, _type1, _arg1, _type2, _arg2) 335e948693eSPhilip Paeps 336e948693eSPhilip Paeps #define EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2, \ 337e948693eSPhilip Paeps _type3, _arg3) \ 338e948693eSPhilip Paeps DTRACE_PROBE3(_name, _type1, _arg1, _type2, _arg2, \ 339e948693eSPhilip Paeps _type3, _arg3) 340e948693eSPhilip Paeps 341e948693eSPhilip Paeps #define EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 342e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) \ 343e948693eSPhilip Paeps DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 344e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) 345e948693eSPhilip Paeps 346e948693eSPhilip Paeps #ifdef DTRACE_PROBE5 347e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 348e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) \ 349e948693eSPhilip Paeps DTRACE_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 350e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) 351e948693eSPhilip Paeps #else 352e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 353e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) \ 354e948693eSPhilip Paeps DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 355e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) 356e948693eSPhilip Paeps #endif 357e948693eSPhilip Paeps 358e948693eSPhilip Paeps #ifdef DTRACE_PROBE6 359e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 360e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 361e948693eSPhilip Paeps _type6, _arg6) \ 362e948693eSPhilip Paeps DTRACE_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 363e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 364e948693eSPhilip Paeps _type6, _arg6) 365e948693eSPhilip Paeps #else 366e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 367e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 368e948693eSPhilip Paeps _type6, _arg6) \ 369e948693eSPhilip Paeps EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 370e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) 371e948693eSPhilip Paeps #endif 372e948693eSPhilip Paeps 373e948693eSPhilip Paeps #ifdef DTRACE_PROBE7 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 DTRACE_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 378e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 379e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) 380e948693eSPhilip Paeps #else 381e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 382e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 383e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) \ 384e948693eSPhilip Paeps EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 385e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 386e948693eSPhilip Paeps _type6, _arg6) 387e948693eSPhilip Paeps #endif 388e948693eSPhilip Paeps 38954366c0bSAttilio Rao #endif /* DTRACE_PROBE */ 390e948693eSPhilip Paeps 391e948693eSPhilip Paeps /* DMA */ 392e948693eSPhilip Paeps 393e948693eSPhilip Paeps typedef uint64_t efsys_dma_addr_t; 394e948693eSPhilip Paeps 395e948693eSPhilip Paeps typedef struct efsys_mem_s { 396e948693eSPhilip Paeps bus_dma_tag_t esm_tag; 397e948693eSPhilip Paeps bus_dmamap_t esm_map; 398e948693eSPhilip Paeps caddr_t esm_base; 399e948693eSPhilip Paeps efsys_dma_addr_t esm_addr; 4004aaefb95SAndrew Rybchenko size_t esm_size; 401e948693eSPhilip Paeps } efsys_mem_t; 402e948693eSPhilip Paeps 4034aaefb95SAndrew Rybchenko #define EFSYS_MEM_SIZE(_esmp) \ 4044aaefb95SAndrew Rybchenko ((_esmp)->esm_size) 4054aaefb95SAndrew Rybchenko 4064aaefb95SAndrew Rybchenko #define EFSYS_MEM_ADDR(_esmp) \ 4074aaefb95SAndrew Rybchenko ((_esmp)->esm_addr) 4084aaefb95SAndrew Rybchenko 4094aaefb95SAndrew Rybchenko #define EFSYS_MEM_IS_NULL(_esmp) \ 4104aaefb95SAndrew Rybchenko ((_esmp)->esm_base == NULL) 4114aaefb95SAndrew Rybchenko 412e948693eSPhilip Paeps 413e948693eSPhilip Paeps #define EFSYS_MEM_ZERO(_esmp, _size) \ 414e948693eSPhilip Paeps do { \ 415e948693eSPhilip Paeps (void) memset((_esmp)->esm_base, 0, (_size)); \ 416e948693eSPhilip Paeps \ 417e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 418e948693eSPhilip Paeps } while (B_FALSE) 419e948693eSPhilip Paeps 420e948693eSPhilip Paeps #define EFSYS_MEM_READD(_esmp, _offset, _edp) \ 421e948693eSPhilip Paeps do { \ 422e948693eSPhilip Paeps uint32_t *addr; \ 423e948693eSPhilip Paeps \ 424e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 425e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 426e948693eSPhilip Paeps ("not power of 2 aligned")); \ 427e948693eSPhilip Paeps \ 428e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 429e948693eSPhilip Paeps \ 430e948693eSPhilip Paeps (_edp)->ed_u32[0] = *addr; \ 431e948693eSPhilip Paeps \ 432e948693eSPhilip Paeps EFSYS_PROBE2(mem_readd, unsigned int, (_offset), \ 433e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 434e948693eSPhilip Paeps \ 435e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 436e948693eSPhilip Paeps } while (B_FALSE) 437e948693eSPhilip Paeps 4380f999687SAndrew Rybchenko #if defined(__x86_64__) 4390f999687SAndrew Rybchenko #define EFSYS_MEM_READQ(_esmp, _offset, _eqp) \ 4400f999687SAndrew Rybchenko do { \ 4410f999687SAndrew Rybchenko uint64_t *addr; \ 4420f999687SAndrew Rybchenko \ 4430f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 4440f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 4450f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 4460f999687SAndrew Rybchenko \ 4470f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \ 4480f999687SAndrew Rybchenko \ 4490f999687SAndrew Rybchenko (_eqp)->eq_u64[0] = *addr; \ 4500f999687SAndrew Rybchenko \ 4510f999687SAndrew Rybchenko EFSYS_PROBE3(mem_readq, unsigned int, (_offset), \ 4520f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 4530f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 4540f999687SAndrew Rybchenko \ 4550f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 4560f999687SAndrew Rybchenko } while (B_FALSE) 4570f999687SAndrew Rybchenko #else 458e948693eSPhilip Paeps #define EFSYS_MEM_READQ(_esmp, _offset, _eqp) \ 459e948693eSPhilip Paeps do { \ 460e948693eSPhilip Paeps uint32_t *addr; \ 461e948693eSPhilip Paeps \ 462e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 463e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 464e948693eSPhilip Paeps ("not power of 2 aligned")); \ 465e948693eSPhilip Paeps \ 466e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 467e948693eSPhilip Paeps \ 468e948693eSPhilip Paeps (_eqp)->eq_u32[0] = *addr++; \ 469e948693eSPhilip Paeps (_eqp)->eq_u32[1] = *addr; \ 470e948693eSPhilip Paeps \ 471e948693eSPhilip Paeps EFSYS_PROBE3(mem_readq, unsigned int, (_offset), \ 472e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 473e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 474e948693eSPhilip Paeps \ 475e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 476e948693eSPhilip Paeps } while (B_FALSE) 4770f999687SAndrew Rybchenko #endif 478e948693eSPhilip Paeps 4790f999687SAndrew Rybchenko #if defined(__x86_64__) 4800f999687SAndrew Rybchenko #define EFSYS_MEM_READO(_esmp, _offset, _eop) \ 4810f999687SAndrew Rybchenko do { \ 4820f999687SAndrew Rybchenko uint64_t *addr; \ 4830f999687SAndrew Rybchenko \ 4840f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 4850f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 4860f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 4870f999687SAndrew Rybchenko \ 4880f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \ 4890f999687SAndrew Rybchenko \ 4900f999687SAndrew Rybchenko (_eop)->eo_u64[0] = *addr++; \ 4910f999687SAndrew Rybchenko (_eop)->eo_u64[1] = *addr; \ 4920f999687SAndrew Rybchenko \ 4930f999687SAndrew Rybchenko EFSYS_PROBE5(mem_reado, unsigned int, (_offset), \ 4940f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 4950f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 4960f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 4970f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 4980f999687SAndrew Rybchenko \ 4990f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 5000f999687SAndrew Rybchenko } while (B_FALSE) 5010f999687SAndrew Rybchenko #else 502e948693eSPhilip Paeps #define EFSYS_MEM_READO(_esmp, _offset, _eop) \ 503e948693eSPhilip Paeps do { \ 504e948693eSPhilip Paeps uint32_t *addr; \ 505e948693eSPhilip Paeps \ 506e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 507e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 508e948693eSPhilip Paeps ("not power of 2 aligned")); \ 509e948693eSPhilip Paeps \ 510e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 511e948693eSPhilip Paeps \ 512e948693eSPhilip Paeps (_eop)->eo_u32[0] = *addr++; \ 513e948693eSPhilip Paeps (_eop)->eo_u32[1] = *addr++; \ 514e948693eSPhilip Paeps (_eop)->eo_u32[2] = *addr++; \ 515e948693eSPhilip Paeps (_eop)->eo_u32[3] = *addr; \ 516e948693eSPhilip Paeps \ 517e948693eSPhilip Paeps EFSYS_PROBE5(mem_reado, unsigned int, (_offset), \ 518e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 519e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 520e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 521e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 522e948693eSPhilip Paeps \ 523e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 524e948693eSPhilip Paeps } while (B_FALSE) 5250f999687SAndrew Rybchenko #endif 526e948693eSPhilip Paeps 527e948693eSPhilip Paeps #define EFSYS_MEM_WRITED(_esmp, _offset, _edp) \ 528e948693eSPhilip Paeps do { \ 529e948693eSPhilip Paeps uint32_t *addr; \ 530e948693eSPhilip Paeps \ 531e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 532e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 533e948693eSPhilip Paeps ("not power of 2 aligned")); \ 534e948693eSPhilip Paeps \ 535e948693eSPhilip Paeps EFSYS_PROBE2(mem_writed, unsigned int, (_offset), \ 536e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 537e948693eSPhilip Paeps \ 538e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 539e948693eSPhilip Paeps \ 540e948693eSPhilip Paeps *addr = (_edp)->ed_u32[0]; \ 541e948693eSPhilip Paeps \ 542e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 543e948693eSPhilip Paeps } while (B_FALSE) 544e948693eSPhilip Paeps 5450f999687SAndrew Rybchenko #if defined(__x86_64__) 5460f999687SAndrew Rybchenko #define EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp) \ 5470f999687SAndrew Rybchenko do { \ 5480f999687SAndrew Rybchenko uint64_t *addr; \ 5490f999687SAndrew Rybchenko \ 5500f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 5510f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 5520f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 5530f999687SAndrew Rybchenko \ 5540f999687SAndrew Rybchenko EFSYS_PROBE3(mem_writeq, unsigned int, (_offset), \ 5550f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 5560f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 5570f999687SAndrew Rybchenko \ 5580f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \ 5590f999687SAndrew Rybchenko \ 5600f999687SAndrew Rybchenko *addr = (_eqp)->eq_u64[0]; \ 5610f999687SAndrew Rybchenko \ 5620f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 5630f999687SAndrew Rybchenko } while (B_FALSE) 5640f999687SAndrew Rybchenko 5650f999687SAndrew Rybchenko #else 566e948693eSPhilip Paeps #define EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp) \ 567e948693eSPhilip Paeps do { \ 568e948693eSPhilip Paeps uint32_t *addr; \ 569e948693eSPhilip Paeps \ 570e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 571e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 572e948693eSPhilip Paeps ("not power of 2 aligned")); \ 573e948693eSPhilip Paeps \ 574e948693eSPhilip Paeps EFSYS_PROBE3(mem_writeq, unsigned int, (_offset), \ 575e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 576e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 577e948693eSPhilip Paeps \ 578e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 579e948693eSPhilip Paeps \ 580e948693eSPhilip Paeps *addr++ = (_eqp)->eq_u32[0]; \ 581e948693eSPhilip Paeps *addr = (_eqp)->eq_u32[1]; \ 582e948693eSPhilip Paeps \ 583e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 584e948693eSPhilip Paeps } while (B_FALSE) 5850f999687SAndrew Rybchenko #endif 586e948693eSPhilip Paeps 5870f999687SAndrew Rybchenko #if defined(__x86_64__) 5880f999687SAndrew Rybchenko #define EFSYS_MEM_WRITEO(_esmp, _offset, _eop) \ 5890f999687SAndrew Rybchenko do { \ 5900f999687SAndrew Rybchenko uint64_t *addr; \ 5910f999687SAndrew Rybchenko \ 5920f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 5930f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 5940f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 5950f999687SAndrew Rybchenko \ 5960f999687SAndrew Rybchenko EFSYS_PROBE5(mem_writeo, unsigned int, (_offset), \ 5970f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 5980f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 5990f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 6000f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 6010f999687SAndrew Rybchenko \ 6020f999687SAndrew Rybchenko addr = (void *)((_esmp)->esm_base + (_offset)); \ 6030f999687SAndrew Rybchenko \ 6040f999687SAndrew Rybchenko *addr++ = (_eop)->eo_u64[0]; \ 6050f999687SAndrew Rybchenko *addr = (_eop)->eo_u64[1]; \ 6060f999687SAndrew Rybchenko \ 6070f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 6080f999687SAndrew Rybchenko } while (B_FALSE) 6090f999687SAndrew Rybchenko #else 610e948693eSPhilip Paeps #define EFSYS_MEM_WRITEO(_esmp, _offset, _eop) \ 611e948693eSPhilip Paeps do { \ 612e948693eSPhilip Paeps uint32_t *addr; \ 613e948693eSPhilip Paeps \ 614e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 615e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 616e948693eSPhilip Paeps ("not power of 2 aligned")); \ 617e948693eSPhilip Paeps \ 618e948693eSPhilip Paeps EFSYS_PROBE5(mem_writeo, unsigned int, (_offset), \ 619e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 620e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 621e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 622e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 623e948693eSPhilip Paeps \ 624e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 625e948693eSPhilip Paeps \ 626e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[0]; \ 627e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[1]; \ 628e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[2]; \ 629e948693eSPhilip Paeps *addr = (_eop)->eo_u32[3]; \ 630e948693eSPhilip Paeps \ 631e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 632e948693eSPhilip Paeps } while (B_FALSE) 6330f999687SAndrew Rybchenko #endif 634e948693eSPhilip Paeps 635e948693eSPhilip Paeps /* BAR */ 636e948693eSPhilip Paeps 63733d45dc5SAndrew Rybchenko #define SFXGE_LOCK_NAME_MAX 16 63833d45dc5SAndrew Rybchenko 639e948693eSPhilip Paeps typedef struct efsys_bar_s { 640e948693eSPhilip Paeps struct mtx esb_lock; 64133d45dc5SAndrew Rybchenko char esb_lock_name[SFXGE_LOCK_NAME_MAX]; 642e948693eSPhilip Paeps bus_space_tag_t esb_tag; 643e948693eSPhilip Paeps bus_space_handle_t esb_handle; 644e948693eSPhilip Paeps int esb_rid; 645e948693eSPhilip Paeps struct resource *esb_res; 646e948693eSPhilip Paeps } efsys_bar_t; 647e948693eSPhilip Paeps 64833d45dc5SAndrew Rybchenko #define SFXGE_BAR_LOCK_INIT(_esbp, _ifname) \ 64933d45dc5SAndrew Rybchenko do { \ 65033d45dc5SAndrew Rybchenko snprintf((_esbp)->esb_lock_name, \ 65133d45dc5SAndrew Rybchenko sizeof((_esbp)->esb_lock_name), \ 65233d45dc5SAndrew Rybchenko "%s:bar", (_ifname)); \ 65333d45dc5SAndrew Rybchenko mtx_init(&(_esbp)->esb_lock, (_esbp)->esb_lock_name, \ 65433d45dc5SAndrew Rybchenko NULL, MTX_DEF); \ 65533d45dc5SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 65633d45dc5SAndrew Rybchenko } while (B_FALSE) 657763cab71SAndrew Rybchenko #define SFXGE_BAR_LOCK_DESTROY(_esbp) \ 658763cab71SAndrew Rybchenko mtx_destroy(&(_esbp)->esb_lock) 659763cab71SAndrew Rybchenko #define SFXGE_BAR_LOCK(_esbp) \ 660763cab71SAndrew Rybchenko mtx_lock(&(_esbp)->esb_lock) 661763cab71SAndrew Rybchenko #define SFXGE_BAR_UNLOCK(_esbp) \ 662763cab71SAndrew Rybchenko mtx_unlock(&(_esbp)->esb_lock) 663763cab71SAndrew Rybchenko 664e948693eSPhilip Paeps #define EFSYS_BAR_READD(_esbp, _offset, _edp, _lock) \ 665e948693eSPhilip Paeps do { \ 666e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 667e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 668e948693eSPhilip Paeps ("not power of 2 aligned")); \ 669e948693eSPhilip Paeps \ 670e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 671e948693eSPhilip Paeps if (_lock) \ 672763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 673e948693eSPhilip Paeps \ 674d9ff48abSAndrew Rybchenko (_edp)->ed_u32[0] = bus_space_read_stream_4( \ 675d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 676d9ff48abSAndrew Rybchenko (_offset)); \ 677e948693eSPhilip Paeps \ 678e948693eSPhilip Paeps EFSYS_PROBE2(bar_readd, unsigned int, (_offset), \ 679e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 680e948693eSPhilip Paeps \ 681e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 682e948693eSPhilip Paeps if (_lock) \ 683763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 684e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 685e948693eSPhilip Paeps } while (B_FALSE) 686e948693eSPhilip Paeps 6875dadbb64SAndrew Rybchenko #if defined(SFXGE_USE_BUS_SPACE_8) 688e948693eSPhilip Paeps #define EFSYS_BAR_READQ(_esbp, _offset, _eqp) \ 689e948693eSPhilip Paeps do { \ 690e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 691e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 692e948693eSPhilip Paeps ("not power of 2 aligned")); \ 693e948693eSPhilip Paeps \ 694763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 695e948693eSPhilip Paeps \ 696d9ff48abSAndrew Rybchenko (_eqp)->eq_u64[0] = bus_space_read_stream_8( \ 697d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 698d9ff48abSAndrew Rybchenko (_offset)); \ 6990f999687SAndrew Rybchenko \ 7000f999687SAndrew Rybchenko EFSYS_PROBE3(bar_readq, unsigned int, (_offset), \ 7010f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 7020f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 7030f999687SAndrew Rybchenko \ 704687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 7050f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 7060f999687SAndrew Rybchenko } while (B_FALSE) 7070f999687SAndrew Rybchenko 7080f999687SAndrew Rybchenko #define EFSYS_BAR_READO(_esbp, _offset, _eop, _lock) \ 7090f999687SAndrew Rybchenko do { \ 7100f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 7110f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 7120f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 7130f999687SAndrew Rybchenko \ 7140f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 7150f999687SAndrew Rybchenko if (_lock) \ 716687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 7170f999687SAndrew Rybchenko \ 718d9ff48abSAndrew Rybchenko (_eop)->eo_u64[0] = bus_space_read_stream_8( \ 719d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 720d9ff48abSAndrew Rybchenko (_offset)); \ 721d9ff48abSAndrew Rybchenko (_eop)->eo_u64[1] = bus_space_read_stream_8( \ 722d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 723d9ff48abSAndrew Rybchenko (_offset) + 8); \ 7240f999687SAndrew Rybchenko \ 7250f999687SAndrew Rybchenko EFSYS_PROBE5(bar_reado, unsigned int, (_offset), \ 7260f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 7270f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 7280f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 7290f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 7300f999687SAndrew Rybchenko \ 7310f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 7320f999687SAndrew Rybchenko if (_lock) \ 733687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 7340f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 7350f999687SAndrew Rybchenko } while (B_FALSE) 7360f999687SAndrew Rybchenko 7370f999687SAndrew Rybchenko #else 7380f999687SAndrew Rybchenko #define EFSYS_BAR_READQ(_esbp, _offset, _eqp) \ 7390f999687SAndrew Rybchenko do { \ 7400f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 7410f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 7420f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 7430f999687SAndrew Rybchenko \ 744687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 7450f999687SAndrew Rybchenko \ 746d9ff48abSAndrew Rybchenko (_eqp)->eq_u32[0] = bus_space_read_stream_4( \ 747d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 748d9ff48abSAndrew Rybchenko (_offset)); \ 749d9ff48abSAndrew Rybchenko (_eqp)->eq_u32[1] = bus_space_read_stream_4( \ 750d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 751d9ff48abSAndrew Rybchenko (_offset) + 4); \ 752e948693eSPhilip Paeps \ 753e948693eSPhilip Paeps EFSYS_PROBE3(bar_readq, unsigned int, (_offset), \ 754e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 755e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 756e948693eSPhilip Paeps \ 757763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 758e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 759e948693eSPhilip Paeps } while (B_FALSE) 760e948693eSPhilip Paeps 761e948693eSPhilip Paeps #define EFSYS_BAR_READO(_esbp, _offset, _eop, _lock) \ 762e948693eSPhilip Paeps do { \ 763e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 764e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 765e948693eSPhilip Paeps ("not power of 2 aligned")); \ 766e948693eSPhilip Paeps \ 767e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 768e948693eSPhilip Paeps if (_lock) \ 769763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 770e948693eSPhilip Paeps \ 771d9ff48abSAndrew Rybchenko (_eop)->eo_u32[0] = bus_space_read_stream_4( \ 772d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 773d9ff48abSAndrew Rybchenko (_offset)); \ 774d9ff48abSAndrew Rybchenko (_eop)->eo_u32[1] = bus_space_read_stream_4( \ 775d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 776d9ff48abSAndrew Rybchenko (_offset) + 4); \ 777d9ff48abSAndrew Rybchenko (_eop)->eo_u32[2] = bus_space_read_stream_4( \ 778d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 779d9ff48abSAndrew Rybchenko (_offset) + 8); \ 780d9ff48abSAndrew Rybchenko (_eop)->eo_u32[3] = bus_space_read_stream_4( \ 781d9ff48abSAndrew Rybchenko (_esbp)->esb_tag, (_esbp)->esb_handle, \ 782d9ff48abSAndrew Rybchenko (_offset) + 12); \ 783e948693eSPhilip Paeps \ 784e948693eSPhilip Paeps EFSYS_PROBE5(bar_reado, unsigned int, (_offset), \ 785e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 786e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 787e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 788e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 789e948693eSPhilip Paeps \ 790e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 791e948693eSPhilip Paeps if (_lock) \ 792763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 793e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 794e948693eSPhilip Paeps } while (B_FALSE) 7950f999687SAndrew Rybchenko #endif 796e948693eSPhilip Paeps 797e948693eSPhilip Paeps #define EFSYS_BAR_WRITED(_esbp, _offset, _edp, _lock) \ 798e948693eSPhilip Paeps do { \ 799e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 800e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 801e948693eSPhilip Paeps ("not power of 2 aligned")); \ 802e948693eSPhilip Paeps \ 803e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 804e948693eSPhilip Paeps if (_lock) \ 805763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 806e948693eSPhilip Paeps \ 807e948693eSPhilip Paeps EFSYS_PROBE2(bar_writed, unsigned int, (_offset), \ 808e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 809e948693eSPhilip Paeps \ 8101cc8febfSAndrew Rybchenko /* \ 8111cc8febfSAndrew Rybchenko * Make sure that previous writes to the dword have \ 8121cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \ 8131cc8febfSAndrew Rybchenko * after the write below. \ 8141cc8febfSAndrew Rybchenko */ \ 8151cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 8161cc8febfSAndrew Rybchenko (_offset), sizeof (efx_dword_t), \ 8171cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 818d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 819d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 820e948693eSPhilip Paeps (_offset), (_edp)->ed_u32[0]); \ 821e948693eSPhilip Paeps \ 822e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 823e948693eSPhilip Paeps if (_lock) \ 824763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 825e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 826e948693eSPhilip Paeps } while (B_FALSE) 827e948693eSPhilip Paeps 8285dadbb64SAndrew Rybchenko #if defined(SFXGE_USE_BUS_SPACE_8) 829e948693eSPhilip Paeps #define EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp) \ 830e948693eSPhilip Paeps do { \ 831e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 832e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 833e948693eSPhilip Paeps ("not power of 2 aligned")); \ 834e948693eSPhilip Paeps \ 835763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 836e948693eSPhilip Paeps \ 837e948693eSPhilip Paeps EFSYS_PROBE3(bar_writeq, unsigned int, (_offset), \ 838e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 839e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 840e948693eSPhilip Paeps \ 8411cc8febfSAndrew Rybchenko /* \ 8421cc8febfSAndrew Rybchenko * Make sure that previous writes to the qword have \ 8431cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \ 8441cc8febfSAndrew Rybchenko * after the write below. \ 8451cc8febfSAndrew Rybchenko */ \ 8461cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 8471cc8febfSAndrew Rybchenko (_offset), sizeof (efx_qword_t), \ 8481cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 849d9ff48abSAndrew Rybchenko bus_space_write_stream_8((_esbp)->esb_tag, \ 850d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 8510f999687SAndrew Rybchenko (_offset), (_eqp)->eq_u64[0]); \ 8520f999687SAndrew Rybchenko \ 853687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 8540f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 8550f999687SAndrew Rybchenko } while (B_FALSE) 8560f999687SAndrew Rybchenko #else 8570f999687SAndrew Rybchenko #define EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp) \ 8580f999687SAndrew Rybchenko do { \ 8590f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 8600f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 8610f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 8620f999687SAndrew Rybchenko \ 863687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 8640f999687SAndrew Rybchenko \ 8650f999687SAndrew Rybchenko EFSYS_PROBE3(bar_writeq, unsigned int, (_offset), \ 8660f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[1], \ 8670f999687SAndrew Rybchenko uint32_t, (_eqp)->eq_u32[0]); \ 8680f999687SAndrew Rybchenko \ 8691cc8febfSAndrew Rybchenko /* \ 8701cc8febfSAndrew Rybchenko * Make sure that previous writes to the qword have \ 8711cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \ 8721cc8febfSAndrew Rybchenko * after the last write below. \ 8731cc8febfSAndrew Rybchenko */ \ 8741cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 8751cc8febfSAndrew Rybchenko (_offset), sizeof (efx_qword_t), \ 8761cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 877d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 878d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 879e948693eSPhilip Paeps (_offset), (_eqp)->eq_u32[0]); \ 8801cc8febfSAndrew Rybchenko /* \ 8811cc8febfSAndrew Rybchenko * It should be guaranteed that the last dword comes \ 8821cc8febfSAndrew Rybchenko * the last, so barrier entire qword to be sure that \ 8831cc8febfSAndrew Rybchenko * neither above nor below writes are reordered. \ 8841cc8febfSAndrew Rybchenko */ \ 8851cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 8861cc8febfSAndrew Rybchenko (_offset), sizeof (efx_qword_t), \ 8871cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 888d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 889d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 890d9ff48abSAndrew Rybchenko (_offset) + 4, (_eqp)->eq_u32[1]); \ 891e948693eSPhilip Paeps \ 892763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 893e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 894e948693eSPhilip Paeps } while (B_FALSE) 8950f999687SAndrew Rybchenko #endif 896e948693eSPhilip Paeps 8973c838a9fSAndrew Rybchenko /* 8983c838a9fSAndrew Rybchenko * Guarantees 64bit aligned 64bit writes to write combined BAR mapping 8993c838a9fSAndrew Rybchenko * (required by PIO hardware) 9003c838a9fSAndrew Rybchenko */ 9013c838a9fSAndrew Rybchenko #define EFSYS_BAR_WC_WRITEQ(_esbp, _offset, _eqp) \ 9023c838a9fSAndrew Rybchenko do { \ 9033c838a9fSAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9043c838a9fSAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 9053c838a9fSAndrew Rybchenko ("not power of 2 aligned")); \ 9063c838a9fSAndrew Rybchenko \ 9073c838a9fSAndrew Rybchenko (void) (_esbp); \ 9083c838a9fSAndrew Rybchenko \ 9093c838a9fSAndrew Rybchenko /* FIXME: Perform a 64-bit write */ \ 9103c838a9fSAndrew Rybchenko KASSERT(0, ("not implemented")); \ 9113c838a9fSAndrew Rybchenko \ 9123c838a9fSAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9133c838a9fSAndrew Rybchenko } while (B_FALSE) 9143c838a9fSAndrew Rybchenko 9155dadbb64SAndrew Rybchenko #if defined(SFXGE_USE_BUS_SPACE_8) 916e948693eSPhilip Paeps #define EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock) \ 917e948693eSPhilip Paeps do { \ 918e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 919e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 920e948693eSPhilip Paeps ("not power of 2 aligned")); \ 921e948693eSPhilip Paeps \ 922e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 923e948693eSPhilip Paeps if (_lock) \ 924763cab71SAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 925e948693eSPhilip Paeps \ 926e948693eSPhilip Paeps EFSYS_PROBE5(bar_writeo, unsigned int, (_offset), \ 927e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 928e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 929e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 930e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 931e948693eSPhilip Paeps \ 9321cc8febfSAndrew Rybchenko /* \ 9331cc8febfSAndrew Rybchenko * Make sure that previous writes to the oword have \ 9341cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \ 9351cc8febfSAndrew Rybchenko * after the last write below. \ 9361cc8febfSAndrew Rybchenko */ \ 9371cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 9381cc8febfSAndrew Rybchenko (_offset), sizeof (efx_oword_t), \ 9391cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 940d9ff48abSAndrew Rybchenko bus_space_write_stream_8((_esbp)->esb_tag, \ 941d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 9420f999687SAndrew Rybchenko (_offset), (_eop)->eo_u64[0]); \ 9431cc8febfSAndrew Rybchenko /* \ 9441cc8febfSAndrew Rybchenko * It should be guaranteed that the last qword comes \ 9451cc8febfSAndrew Rybchenko * the last, so barrier entire oword to be sure that \ 9461cc8febfSAndrew Rybchenko * neither above nor below writes are reordered. \ 9471cc8febfSAndrew Rybchenko */ \ 9481cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 9491cc8febfSAndrew Rybchenko (_offset), sizeof (efx_oword_t), \ 9501cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 951d9ff48abSAndrew Rybchenko bus_space_write_stream_8((_esbp)->esb_tag, \ 952d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 953d9ff48abSAndrew Rybchenko (_offset) + 8, (_eop)->eo_u64[1]); \ 9540f999687SAndrew Rybchenko \ 9550f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9560f999687SAndrew Rybchenko if (_lock) \ 957687adefaSAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 9580f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9590f999687SAndrew Rybchenko } while (B_FALSE) 9600f999687SAndrew Rybchenko 9610f999687SAndrew Rybchenko #else 9620f999687SAndrew Rybchenko #define EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock) \ 9630f999687SAndrew Rybchenko do { \ 9640f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9650f999687SAndrew Rybchenko KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 9660f999687SAndrew Rybchenko ("not power of 2 aligned")); \ 9670f999687SAndrew Rybchenko \ 9680f999687SAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 9690f999687SAndrew Rybchenko if (_lock) \ 970687adefaSAndrew Rybchenko SFXGE_BAR_LOCK(_esbp); \ 9710f999687SAndrew Rybchenko \ 9720f999687SAndrew Rybchenko EFSYS_PROBE5(bar_writeo, unsigned int, (_offset), \ 9730f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[3], \ 9740f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[2], \ 9750f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[1], \ 9760f999687SAndrew Rybchenko uint32_t, (_eop)->eo_u32[0]); \ 9770f999687SAndrew Rybchenko \ 9781cc8febfSAndrew Rybchenko /* \ 9791cc8febfSAndrew Rybchenko * Make sure that previous writes to the oword have \ 9801cc8febfSAndrew Rybchenko * been done. It should be cheaper than barrier just \ 9811cc8febfSAndrew Rybchenko * after the last write below. \ 9821cc8febfSAndrew Rybchenko */ \ 9831cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 9841cc8febfSAndrew Rybchenko (_offset), sizeof (efx_oword_t), \ 9851cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 986d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 987d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 988e948693eSPhilip Paeps (_offset), (_eop)->eo_u32[0]); \ 989d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 990d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 991d9ff48abSAndrew Rybchenko (_offset) + 4, (_eop)->eo_u32[1]); \ 992d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 993d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 994d9ff48abSAndrew Rybchenko (_offset) + 8, (_eop)->eo_u32[2]); \ 9951cc8febfSAndrew Rybchenko /* \ 9961cc8febfSAndrew Rybchenko * It should be guaranteed that the last dword comes \ 9971cc8febfSAndrew Rybchenko * the last, so barrier entire oword to be sure that \ 9981cc8febfSAndrew Rybchenko * neither above nor below writes are reordered. \ 9991cc8febfSAndrew Rybchenko */ \ 10001cc8febfSAndrew Rybchenko bus_space_barrier((_esbp)->esb_tag, (_esbp)->esb_handle,\ 10011cc8febfSAndrew Rybchenko (_offset), sizeof (efx_oword_t), \ 10021cc8febfSAndrew Rybchenko BUS_SPACE_BARRIER_WRITE); \ 1003d9ff48abSAndrew Rybchenko bus_space_write_stream_4((_esbp)->esb_tag, \ 1004d9ff48abSAndrew Rybchenko (_esbp)->esb_handle, \ 1005d9ff48abSAndrew Rybchenko (_offset) + 12, (_eop)->eo_u32[3]); \ 1006e948693eSPhilip Paeps \ 1007e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1008e948693eSPhilip Paeps if (_lock) \ 1009763cab71SAndrew Rybchenko SFXGE_BAR_UNLOCK(_esbp); \ 1010e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1011e948693eSPhilip Paeps } while (B_FALSE) 10120f999687SAndrew Rybchenko #endif 1013e948693eSPhilip Paeps 10143c838a9fSAndrew Rybchenko /* Use the standard octo-word write for doorbell writes */ 10153c838a9fSAndrew Rybchenko #define EFSYS_BAR_DOORBELL_WRITEO(_esbp, _offset, _eop) \ 10163c838a9fSAndrew Rybchenko do { \ 10173c838a9fSAndrew Rybchenko EFSYS_BAR_WRITEO((_esbp), (_offset), (_eop), B_FALSE); \ 10183c838a9fSAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 10193c838a9fSAndrew Rybchenko } while (B_FALSE) 10203c838a9fSAndrew Rybchenko 1021e948693eSPhilip Paeps /* SPIN */ 1022e948693eSPhilip Paeps 1023e948693eSPhilip Paeps #define EFSYS_SPIN(_us) \ 1024e948693eSPhilip Paeps do { \ 1025e948693eSPhilip Paeps DELAY(_us); \ 1026e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1027e948693eSPhilip Paeps } while (B_FALSE) 1028e948693eSPhilip Paeps 1029e948693eSPhilip Paeps #define EFSYS_SLEEP EFSYS_SPIN 1030e948693eSPhilip Paeps 1031e948693eSPhilip Paeps /* BARRIERS */ 1032e948693eSPhilip Paeps 10337c00963aSAndrew Rybchenko #define EFSYS_MEM_READ_BARRIER() rmb() 1034e948693eSPhilip Paeps #define EFSYS_PIO_WRITE_BARRIER() 1035e948693eSPhilip Paeps 10363c838a9fSAndrew Rybchenko /* DMA SYNC */ 10373c838a9fSAndrew Rybchenko #define EFSYS_DMA_SYNC_FOR_KERNEL(_esmp, _offset, _size) \ 10383c838a9fSAndrew Rybchenko do { \ 10393c838a9fSAndrew Rybchenko bus_dmamap_sync((_esmp)->esm_tag, \ 10403c838a9fSAndrew Rybchenko (_esmp)->esm_map, \ 10413c838a9fSAndrew Rybchenko BUS_DMASYNC_POSTREAD); \ 10423c838a9fSAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 10433c838a9fSAndrew Rybchenko } while (B_FALSE) 10443c838a9fSAndrew Rybchenko 10453c838a9fSAndrew Rybchenko #define EFSYS_DMA_SYNC_FOR_DEVICE(_esmp, _offset, _size) \ 10463c838a9fSAndrew Rybchenko do { \ 10473c838a9fSAndrew Rybchenko bus_dmamap_sync((_esmp)->esm_tag, \ 10483c838a9fSAndrew Rybchenko (_esmp)->esm_map, \ 10493c838a9fSAndrew Rybchenko BUS_DMASYNC_PREWRITE); \ 10503c838a9fSAndrew Rybchenko _NOTE(CONSTANTCONDITION) \ 10513c838a9fSAndrew Rybchenko } while (B_FALSE) 10523c838a9fSAndrew Rybchenko 1053e948693eSPhilip Paeps /* TIMESTAMP */ 1054e948693eSPhilip Paeps 1055e948693eSPhilip Paeps typedef clock_t efsys_timestamp_t; 1056e948693eSPhilip Paeps 1057e948693eSPhilip Paeps #define EFSYS_TIMESTAMP(_usp) \ 1058e948693eSPhilip Paeps do { \ 1059e948693eSPhilip Paeps clock_t now; \ 1060e948693eSPhilip Paeps \ 1061e948693eSPhilip Paeps now = ticks; \ 1062e948693eSPhilip Paeps *(_usp) = now * hz / 1000000; \ 1063e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1064e948693eSPhilip Paeps } while (B_FALSE) 1065e948693eSPhilip Paeps 1066e948693eSPhilip Paeps /* KMEM */ 1067e948693eSPhilip Paeps 1068e948693eSPhilip Paeps #define EFSYS_KMEM_ALLOC(_esip, _size, _p) \ 1069e948693eSPhilip Paeps do { \ 1070e948693eSPhilip Paeps (_esip) = (_esip); \ 107183488e18SAndrew Rybchenko /* \ 107283488e18SAndrew Rybchenko * The macro is used in non-sleepable contexts, for \ 107383488e18SAndrew Rybchenko * example, holding a mutex. \ 107483488e18SAndrew Rybchenko */ \ 107583488e18SAndrew Rybchenko (_p) = malloc((_size), M_SFXGE, M_NOWAIT|M_ZERO); \ 1076e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1077e948693eSPhilip Paeps } while (B_FALSE) 1078e948693eSPhilip Paeps 1079e948693eSPhilip Paeps #define EFSYS_KMEM_FREE(_esip, _size, _p) \ 1080e948693eSPhilip Paeps do { \ 1081e948693eSPhilip Paeps (void) (_esip); \ 1082e948693eSPhilip Paeps (void) (_size); \ 1083e948693eSPhilip Paeps free((_p), M_SFXGE); \ 1084e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1085e948693eSPhilip Paeps } while (B_FALSE) 1086e948693eSPhilip Paeps 1087e948693eSPhilip Paeps /* LOCK */ 1088e948693eSPhilip Paeps 108933d45dc5SAndrew Rybchenko typedef struct efsys_lock_s { 109033d45dc5SAndrew Rybchenko struct mtx lock; 109133d45dc5SAndrew Rybchenko char lock_name[SFXGE_LOCK_NAME_MAX]; 109233d45dc5SAndrew Rybchenko } efsys_lock_t; 109333d45dc5SAndrew Rybchenko 109433d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK_INIT(_eslp, _ifname, _label) \ 109533d45dc5SAndrew Rybchenko do { \ 109633d45dc5SAndrew Rybchenko efsys_lock_t *__eslp = (_eslp); \ 109733d45dc5SAndrew Rybchenko \ 109833d45dc5SAndrew Rybchenko snprintf((__eslp)->lock_name, \ 109933d45dc5SAndrew Rybchenko sizeof((__eslp)->lock_name), \ 110033d45dc5SAndrew Rybchenko "%s:%s", (_ifname), (_label)); \ 110133d45dc5SAndrew Rybchenko mtx_init(&(__eslp)->lock, (__eslp)->lock_name, \ 110233d45dc5SAndrew Rybchenko NULL, MTX_DEF); \ 110333d45dc5SAndrew Rybchenko } while (B_FALSE) 110433d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK_DESTROY(_eslp) \ 110533d45dc5SAndrew Rybchenko mtx_destroy(&(_eslp)->lock) 110633d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK(_eslp) \ 110733d45dc5SAndrew Rybchenko mtx_lock(&(_eslp)->lock) 110833d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_UNLOCK(_eslp) \ 110933d45dc5SAndrew Rybchenko mtx_unlock(&(_eslp)->lock) 111033d45dc5SAndrew Rybchenko #define SFXGE_EFSYS_LOCK_ASSERT_OWNED(_eslp) \ 111133d45dc5SAndrew Rybchenko mtx_assert(&(_eslp)->lock, MA_OWNED) 1112e948693eSPhilip Paeps 1113a98003ddSAndrew Rybchenko typedef int efsys_lock_state_t; 1114a98003ddSAndrew Rybchenko 1115e948693eSPhilip Paeps #define EFSYS_LOCK_MAGIC 0x000010c4 1116e948693eSPhilip Paeps 1117e948693eSPhilip Paeps #define EFSYS_LOCK(_lockp, _state) \ 1118e948693eSPhilip Paeps do { \ 111933d45dc5SAndrew Rybchenko SFXGE_EFSYS_LOCK(_lockp); \ 1120e948693eSPhilip Paeps (_state) = EFSYS_LOCK_MAGIC; \ 1121e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1122e948693eSPhilip Paeps } while (B_FALSE) 1123e948693eSPhilip Paeps 1124e948693eSPhilip Paeps #define EFSYS_UNLOCK(_lockp, _state) \ 1125e948693eSPhilip Paeps do { \ 1126e948693eSPhilip Paeps if ((_state) != EFSYS_LOCK_MAGIC) \ 1127e948693eSPhilip Paeps KASSERT(B_FALSE, ("not locked")); \ 112833d45dc5SAndrew Rybchenko SFXGE_EFSYS_UNLOCK(_lockp); \ 1129e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1130e948693eSPhilip Paeps } while (B_FALSE) 1131e948693eSPhilip Paeps 1132e948693eSPhilip Paeps /* STAT */ 1133e948693eSPhilip Paeps 1134e948693eSPhilip Paeps typedef uint64_t efsys_stat_t; 1135e948693eSPhilip Paeps 1136e948693eSPhilip Paeps #define EFSYS_STAT_INCR(_knp, _delta) \ 1137e948693eSPhilip Paeps do { \ 1138e948693eSPhilip Paeps *(_knp) += (_delta); \ 1139e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1140e948693eSPhilip Paeps } while (B_FALSE) 1141e948693eSPhilip Paeps 1142e948693eSPhilip Paeps #define EFSYS_STAT_DECR(_knp, _delta) \ 1143e948693eSPhilip Paeps do { \ 1144e948693eSPhilip Paeps *(_knp) -= (_delta); \ 1145e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1146e948693eSPhilip Paeps } while (B_FALSE) 1147e948693eSPhilip Paeps 1148e948693eSPhilip Paeps #define EFSYS_STAT_SET(_knp, _val) \ 1149e948693eSPhilip Paeps do { \ 1150e948693eSPhilip Paeps *(_knp) = (_val); \ 1151e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1152e948693eSPhilip Paeps } while (B_FALSE) 1153e948693eSPhilip Paeps 1154e948693eSPhilip Paeps #define EFSYS_STAT_SET_QWORD(_knp, _valp) \ 1155e948693eSPhilip Paeps do { \ 1156e948693eSPhilip Paeps *(_knp) = le64toh((_valp)->eq_u64[0]); \ 1157e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1158e948693eSPhilip Paeps } while (B_FALSE) 1159e948693eSPhilip Paeps 1160e948693eSPhilip Paeps #define EFSYS_STAT_SET_DWORD(_knp, _valp) \ 1161e948693eSPhilip Paeps do { \ 1162e948693eSPhilip Paeps *(_knp) = le32toh((_valp)->ed_u32[0]); \ 1163e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1164e948693eSPhilip Paeps } while (B_FALSE) 1165e948693eSPhilip Paeps 1166e948693eSPhilip Paeps #define EFSYS_STAT_INCR_QWORD(_knp, _valp) \ 1167e948693eSPhilip Paeps do { \ 1168e948693eSPhilip Paeps *(_knp) += le64toh((_valp)->eq_u64[0]); \ 1169e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1170e948693eSPhilip Paeps } while (B_FALSE) 1171e948693eSPhilip Paeps 1172e948693eSPhilip Paeps #define EFSYS_STAT_SUBR_QWORD(_knp, _valp) \ 1173e948693eSPhilip Paeps do { \ 1174e948693eSPhilip Paeps *(_knp) -= le64toh((_valp)->eq_u64[0]); \ 1175e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1176e948693eSPhilip Paeps } while (B_FALSE) 1177e948693eSPhilip Paeps 1178e948693eSPhilip Paeps /* ERR */ 1179e948693eSPhilip Paeps 1180e948693eSPhilip Paeps extern void sfxge_err(efsys_identifier_t *, unsigned int, 1181e948693eSPhilip Paeps uint32_t, uint32_t); 1182e948693eSPhilip Paeps 1183e948693eSPhilip Paeps #if EFSYS_OPT_DECODE_INTR_FATAL 1184e948693eSPhilip Paeps #define EFSYS_ERR(_esip, _code, _dword0, _dword1) \ 1185e948693eSPhilip Paeps do { \ 1186e948693eSPhilip Paeps sfxge_err((_esip), (_code), (_dword0), (_dword1)); \ 1187e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 1188e948693eSPhilip Paeps } while (B_FALSE) 1189e948693eSPhilip Paeps #endif 1190e948693eSPhilip Paeps 1191e948693eSPhilip Paeps /* ASSERT */ 1192e948693eSPhilip Paeps 1193e948693eSPhilip Paeps #define EFSYS_ASSERT(_exp) do { \ 1194e948693eSPhilip Paeps if (!(_exp)) \ 11953c838a9fSAndrew Rybchenko panic("%s", #_exp); \ 1196e948693eSPhilip Paeps } while (0) 1197e948693eSPhilip Paeps 1198e948693eSPhilip Paeps #define EFSYS_ASSERT3(_x, _op, _y, _t) do { \ 1199e948693eSPhilip Paeps const _t __x = (_t)(_x); \ 1200e948693eSPhilip Paeps const _t __y = (_t)(_y); \ 1201e948693eSPhilip Paeps if (!(__x _op __y)) \ 1202e948693eSPhilip Paeps panic("assertion failed at %s:%u", __FILE__, __LINE__); \ 1203e948693eSPhilip Paeps } while(0) 1204e948693eSPhilip Paeps 1205e948693eSPhilip Paeps #define EFSYS_ASSERT3U(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, uint64_t) 1206e948693eSPhilip Paeps #define EFSYS_ASSERT3S(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, int64_t) 1207e948693eSPhilip Paeps #define EFSYS_ASSERT3P(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, uintptr_t) 1208e948693eSPhilip Paeps 12093c838a9fSAndrew Rybchenko /* ROTATE */ 12103c838a9fSAndrew Rybchenko 12113c838a9fSAndrew Rybchenko #define EFSYS_HAS_ROTL_DWORD 0 12123c838a9fSAndrew Rybchenko 1213e948693eSPhilip Paeps #ifdef __cplusplus 1214e948693eSPhilip Paeps } 1215e948693eSPhilip Paeps #endif 1216e948693eSPhilip Paeps 1217e948693eSPhilip Paeps #endif /* _SYS_EFSYS_H */ 1218