1*e948693eSPhilip Paeps /*- 2*e948693eSPhilip Paeps * Copyright (c) 2010-2011 Solarflare Communications, Inc. 3*e948693eSPhilip Paeps * All rights reserved. 4*e948693eSPhilip Paeps * 5*e948693eSPhilip Paeps * This software was developed in part by Philip Paeps under contract for 6*e948693eSPhilip Paeps * Solarflare Communications, Inc. 7*e948693eSPhilip Paeps * 8*e948693eSPhilip Paeps * Redistribution and use in source and binary forms, with or without 9*e948693eSPhilip Paeps * modification, are permitted provided that the following conditions 10*e948693eSPhilip Paeps * are met: 11*e948693eSPhilip Paeps * 1. Redistributions of source code must retain the above copyright 12*e948693eSPhilip Paeps * notice, this list of conditions and the following disclaimer. 13*e948693eSPhilip Paeps * 2. Redistributions in binary form must reproduce the above copyright 14*e948693eSPhilip Paeps * notice, this list of conditions and the following disclaimer in the 15*e948693eSPhilip Paeps * documentation and/or other materials provided with the distribution. 16*e948693eSPhilip Paeps * 17*e948693eSPhilip Paeps * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18*e948693eSPhilip Paeps * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19*e948693eSPhilip Paeps * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20*e948693eSPhilip Paeps * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21*e948693eSPhilip Paeps * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*e948693eSPhilip Paeps * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23*e948693eSPhilip Paeps * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24*e948693eSPhilip Paeps * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25*e948693eSPhilip Paeps * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26*e948693eSPhilip Paeps * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*e948693eSPhilip Paeps * SUCH DAMAGE. 28*e948693eSPhilip Paeps */ 29*e948693eSPhilip Paeps 30*e948693eSPhilip Paeps #ifndef _SYS_EFSYS_H 31*e948693eSPhilip Paeps #define _SYS_EFSYS_H 32*e948693eSPhilip Paeps 33*e948693eSPhilip Paeps #include <sys/cdefs.h> 34*e948693eSPhilip Paeps __FBSDID("$FreeBSD$"); 35*e948693eSPhilip Paeps 36*e948693eSPhilip Paeps #ifdef __cplusplus 37*e948693eSPhilip Paeps extern "C" { 38*e948693eSPhilip Paeps #endif 39*e948693eSPhilip Paeps 40*e948693eSPhilip Paeps #include <sys/param.h> 41*e948693eSPhilip Paeps #include <sys/bus.h> 42*e948693eSPhilip Paeps #include <sys/endian.h> 43*e948693eSPhilip Paeps #include <sys/lock.h> 44*e948693eSPhilip Paeps #include <sys/malloc.h> 45*e948693eSPhilip Paeps #include <sys/mbuf.h> 46*e948693eSPhilip Paeps #include <sys/mutex.h> 47*e948693eSPhilip Paeps #include <sys/rwlock.h> 48*e948693eSPhilip Paeps #include <sys/sdt.h> 49*e948693eSPhilip Paeps #include <sys/systm.h> 50*e948693eSPhilip Paeps 51*e948693eSPhilip Paeps #include <machine/bus.h> 52*e948693eSPhilip Paeps #include <machine/endian.h> 53*e948693eSPhilip Paeps 54*e948693eSPhilip Paeps #define EFSYS_HAS_UINT64 1 55*e948693eSPhilip Paeps #define EFSYS_USE_UINT64 0 56*e948693eSPhilip Paeps #if _BYTE_ORDER == _BIG_ENDIAN 57*e948693eSPhilip Paeps #define EFSYS_IS_BIG_ENDIAN 1 58*e948693eSPhilip Paeps #define EFSYS_IS_LITTLE_ENDIAN 0 59*e948693eSPhilip Paeps #elif _BYTE_ORDER == _LITTLE_ENDIAN 60*e948693eSPhilip Paeps #define EFSYS_IS_BIG_ENDIAN 0 61*e948693eSPhilip Paeps #define EFSYS_IS_LITTLE_ENDIAN 1 62*e948693eSPhilip Paeps #endif 63*e948693eSPhilip Paeps #include "efx_types.h" 64*e948693eSPhilip Paeps 65*e948693eSPhilip Paeps /* Common code requires this */ 66*e948693eSPhilip Paeps #if __FreeBSD_version < 800068 67*e948693eSPhilip Paeps #define memmove(d, s, l) bcopy(s, d, l) 68*e948693eSPhilip Paeps #endif 69*e948693eSPhilip Paeps 70*e948693eSPhilip Paeps /* FreeBSD equivalents of Solaris things */ 71*e948693eSPhilip Paeps #ifndef _NOTE 72*e948693eSPhilip Paeps #define _NOTE(s) 73*e948693eSPhilip Paeps #endif 74*e948693eSPhilip Paeps 75*e948693eSPhilip Paeps #ifndef B_FALSE 76*e948693eSPhilip Paeps #define B_FALSE FALSE 77*e948693eSPhilip Paeps #endif 78*e948693eSPhilip Paeps #ifndef B_TRUE 79*e948693eSPhilip Paeps #define B_TRUE TRUE 80*e948693eSPhilip Paeps #endif 81*e948693eSPhilip Paeps 82*e948693eSPhilip Paeps #ifndef IS_P2ALIGNED 83*e948693eSPhilip Paeps #define IS_P2ALIGNED(v, a) ((((uintptr_t)(v)) & ((uintptr_t)(a) - 1)) == 0) 84*e948693eSPhilip Paeps #endif 85*e948693eSPhilip Paeps 86*e948693eSPhilip Paeps #ifndef P2ROUNDUP 87*e948693eSPhilip Paeps #define P2ROUNDUP(x, align) (-(-(x) & -(align))) 88*e948693eSPhilip Paeps #endif 89*e948693eSPhilip Paeps 90*e948693eSPhilip Paeps #ifndef IS2P 91*e948693eSPhilip Paeps #define ISP2(x) (((x) & ((x) - 1)) == 0) 92*e948693eSPhilip Paeps #endif 93*e948693eSPhilip Paeps 94*e948693eSPhilip Paeps #define ENOTACTIVE EINVAL 95*e948693eSPhilip Paeps 96*e948693eSPhilip Paeps /* Memory type to use on FreeBSD */ 97*e948693eSPhilip Paeps MALLOC_DECLARE(M_SFXGE); 98*e948693eSPhilip Paeps 99*e948693eSPhilip Paeps /* Machine dependend prefetch wrappers */ 100*e948693eSPhilip Paeps #if defined(__i386) || defined(__amd64) 101*e948693eSPhilip Paeps static __inline void 102*e948693eSPhilip Paeps prefetch_read_many(void *addr) 103*e948693eSPhilip Paeps { 104*e948693eSPhilip Paeps __asm__( 105*e948693eSPhilip Paeps "prefetcht0 (%0)" 106*e948693eSPhilip Paeps : 107*e948693eSPhilip Paeps : "r" (addr)); 108*e948693eSPhilip Paeps } 109*e948693eSPhilip Paeps 110*e948693eSPhilip Paeps static __inline void 111*e948693eSPhilip Paeps prefetch_read_once(void *addr) 112*e948693eSPhilip Paeps { 113*e948693eSPhilip Paeps __asm__( 114*e948693eSPhilip Paeps "prefetchnta (%0)" 115*e948693eSPhilip Paeps : 116*e948693eSPhilip Paeps : "r" (addr)); 117*e948693eSPhilip Paeps } 118*e948693eSPhilip Paeps #endif 119*e948693eSPhilip Paeps 120*e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__) 121*e948693eSPhilip Paeps #include <vm/vm.h> 122*e948693eSPhilip Paeps #include <vm/pmap.h> 123*e948693eSPhilip Paeps #endif 124*e948693eSPhilip Paeps static __inline void 125*e948693eSPhilip Paeps sfxge_map_mbuf_fast(bus_dma_tag_t tag, bus_dmamap_t map, 126*e948693eSPhilip Paeps struct mbuf *m, bus_dma_segment_t *seg) 127*e948693eSPhilip Paeps { 128*e948693eSPhilip Paeps #if defined(__i386__) || defined(__amd64__) 129*e948693eSPhilip Paeps seg->ds_addr = pmap_kextract(mtod(m, vm_offset_t)); 130*e948693eSPhilip Paeps seg->ds_len = m->m_len; 131*e948693eSPhilip Paeps #else 132*e948693eSPhilip Paeps int nsegstmp; 133*e948693eSPhilip Paeps 134*e948693eSPhilip Paeps bus_dmamap_load_mbuf_sg(tag, map, m, seg, &nsegstmp, 0); 135*e948693eSPhilip Paeps #endif 136*e948693eSPhilip Paeps } 137*e948693eSPhilip Paeps 138*e948693eSPhilip Paeps /* Modifiers used for DOS builds */ 139*e948693eSPhilip Paeps #define __cs 140*e948693eSPhilip Paeps #define __far 141*e948693eSPhilip Paeps 142*e948693eSPhilip Paeps /* Modifiers used for Windows builds */ 143*e948693eSPhilip Paeps #define __in 144*e948693eSPhilip Paeps #define __in_opt 145*e948693eSPhilip Paeps #define __in_ecount(_n) 146*e948693eSPhilip Paeps #define __in_ecount_opt(_n) 147*e948693eSPhilip Paeps #define __in_bcount(_n) 148*e948693eSPhilip Paeps #define __in_bcount_opt(_n) 149*e948693eSPhilip Paeps 150*e948693eSPhilip Paeps #define __out 151*e948693eSPhilip Paeps #define __out_opt 152*e948693eSPhilip Paeps #define __out_ecount(_n) 153*e948693eSPhilip Paeps #define __out_ecount_opt(_n) 154*e948693eSPhilip Paeps #define __out_bcount(_n) 155*e948693eSPhilip Paeps #define __out_bcount_opt(_n) 156*e948693eSPhilip Paeps 157*e948693eSPhilip Paeps #define __deref_out 158*e948693eSPhilip Paeps 159*e948693eSPhilip Paeps #define __inout 160*e948693eSPhilip Paeps #define __inout_opt 161*e948693eSPhilip Paeps #define __inout_ecount(_n) 162*e948693eSPhilip Paeps #define __inout_ecount_opt(_n) 163*e948693eSPhilip Paeps #define __inout_bcount(_n) 164*e948693eSPhilip Paeps #define __inout_bcount_opt(_n) 165*e948693eSPhilip Paeps #define __inout_bcount_full_opt(_n) 166*e948693eSPhilip Paeps 167*e948693eSPhilip Paeps #define __deref_out_bcount_opt(n) 168*e948693eSPhilip Paeps 169*e948693eSPhilip Paeps #define __checkReturn 170*e948693eSPhilip Paeps 171*e948693eSPhilip Paeps #define __drv_when(_p, _c) 172*e948693eSPhilip Paeps 173*e948693eSPhilip Paeps /* Code inclusion options */ 174*e948693eSPhilip Paeps 175*e948693eSPhilip Paeps 176*e948693eSPhilip Paeps #define EFSYS_OPT_NAMES 1 177*e948693eSPhilip Paeps 178*e948693eSPhilip Paeps #define EFSYS_OPT_FALCON 0 179*e948693eSPhilip Paeps #define EFSYS_OPT_FALCON_NIC_CFG_OVERRIDE 0 180*e948693eSPhilip Paeps #define EFSYS_OPT_SIENA 1 181*e948693eSPhilip Paeps #ifdef DEBUG 182*e948693eSPhilip Paeps #define EFSYS_OPT_CHECK_REG 1 183*e948693eSPhilip Paeps #else 184*e948693eSPhilip Paeps #define EFSYS_OPT_CHECK_REG 0 185*e948693eSPhilip Paeps #endif 186*e948693eSPhilip Paeps 187*e948693eSPhilip Paeps #define EFSYS_OPT_MCDI 1 188*e948693eSPhilip Paeps 189*e948693eSPhilip Paeps #define EFSYS_OPT_MAC_FALCON_GMAC 0 190*e948693eSPhilip Paeps #define EFSYS_OPT_MAC_FALCON_XMAC 0 191*e948693eSPhilip Paeps #define EFSYS_OPT_MAC_STATS 1 192*e948693eSPhilip Paeps 193*e948693eSPhilip Paeps #define EFSYS_OPT_LOOPBACK 0 194*e948693eSPhilip Paeps 195*e948693eSPhilip Paeps #define EFSYS_OPT_MON_NULL 0 196*e948693eSPhilip Paeps #define EFSYS_OPT_MON_LM87 0 197*e948693eSPhilip Paeps #define EFSYS_OPT_MON_MAX6647 0 198*e948693eSPhilip Paeps #define EFSYS_OPT_MON_SIENA 0 199*e948693eSPhilip Paeps #define EFSYS_OPT_MON_STATS 0 200*e948693eSPhilip Paeps 201*e948693eSPhilip Paeps #define EFSYS_OPT_PHY_NULL 0 202*e948693eSPhilip Paeps #define EFSYS_OPT_PHY_QT2022C2 0 203*e948693eSPhilip Paeps #define EFSYS_OPT_PHY_SFX7101 0 204*e948693eSPhilip Paeps #define EFSYS_OPT_PHY_TXC43128 0 205*e948693eSPhilip Paeps #define EFSYS_OPT_PHY_PM8358 0 206*e948693eSPhilip Paeps #define EFSYS_OPT_PHY_SFT9001 0 207*e948693eSPhilip Paeps #define EFSYS_OPT_PHY_QT2025C 0 208*e948693eSPhilip Paeps #define EFSYS_OPT_PHY_STATS 1 209*e948693eSPhilip Paeps #define EFSYS_OPT_PHY_PROPS 0 210*e948693eSPhilip Paeps #define EFSYS_OPT_PHY_BIST 1 211*e948693eSPhilip Paeps #define EFSYS_OPT_PHY_LED_CONTROL 1 212*e948693eSPhilip Paeps #define EFSYS_OPT_PHY_FLAGS 0 213*e948693eSPhilip Paeps 214*e948693eSPhilip Paeps #define EFSYS_OPT_VPD 1 215*e948693eSPhilip Paeps #define EFSYS_OPT_NVRAM 1 216*e948693eSPhilip Paeps #define EFSYS_OPT_NVRAM_FALCON_BOOTROM 0 217*e948693eSPhilip Paeps #define EFSYS_OPT_NVRAM_SFT9001 0 218*e948693eSPhilip Paeps #define EFSYS_OPT_NVRAM_SFX7101 0 219*e948693eSPhilip Paeps #define EFSYS_OPT_BOOTCFG 0 220*e948693eSPhilip Paeps 221*e948693eSPhilip Paeps #define EFSYS_OPT_PCIE_TUNE 0 222*e948693eSPhilip Paeps #define EFSYS_OPT_DIAG 0 223*e948693eSPhilip Paeps #define EFSYS_OPT_WOL 1 224*e948693eSPhilip Paeps #define EFSYS_OPT_RX_SCALE 1 225*e948693eSPhilip Paeps #define EFSYS_OPT_QSTATS 1 226*e948693eSPhilip Paeps #define EFSYS_OPT_FILTER 0 227*e948693eSPhilip Paeps #define EFSYS_OPT_RX_SCATTER 0 228*e948693eSPhilip Paeps #define EFSYS_OPT_RX_HDR_SPLIT 0 229*e948693eSPhilip Paeps 230*e948693eSPhilip Paeps #define EFSYS_OPT_EV_PREFETCH 0 231*e948693eSPhilip Paeps 232*e948693eSPhilip Paeps #define EFSYS_OPT_DECODE_INTR_FATAL 1 233*e948693eSPhilip Paeps 234*e948693eSPhilip Paeps /* ID */ 235*e948693eSPhilip Paeps 236*e948693eSPhilip Paeps typedef struct __efsys_identifier_s efsys_identifier_t; 237*e948693eSPhilip Paeps 238*e948693eSPhilip Paeps /* PROBE */ 239*e948693eSPhilip Paeps 240*e948693eSPhilip Paeps #ifndef KDTRACE_HOOKS 241*e948693eSPhilip Paeps 242*e948693eSPhilip Paeps #define EFSYS_PROBE(_name) 243*e948693eSPhilip Paeps 244*e948693eSPhilip Paeps #define EFSYS_PROBE1(_name, _type1, _arg1) 245*e948693eSPhilip Paeps 246*e948693eSPhilip Paeps #define EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2) 247*e948693eSPhilip Paeps 248*e948693eSPhilip Paeps #define EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2, \ 249*e948693eSPhilip Paeps _type3, _arg3) 250*e948693eSPhilip Paeps 251*e948693eSPhilip Paeps #define EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 252*e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) 253*e948693eSPhilip Paeps 254*e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 255*e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) 256*e948693eSPhilip Paeps 257*e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 258*e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 259*e948693eSPhilip Paeps _type6, _arg6) 260*e948693eSPhilip Paeps 261*e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 262*e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 263*e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) 264*e948693eSPhilip Paeps 265*e948693eSPhilip Paeps #else /* KDTRACE_HOOKS */ 266*e948693eSPhilip Paeps 267*e948693eSPhilip Paeps #define EFSYS_PROBE(_name) \ 268*e948693eSPhilip Paeps DTRACE_PROBE(_name) 269*e948693eSPhilip Paeps 270*e948693eSPhilip Paeps #define EFSYS_PROBE1(_name, _type1, _arg1) \ 271*e948693eSPhilip Paeps DTRACE_PROBE1(_name, _type1, _arg1) 272*e948693eSPhilip Paeps 273*e948693eSPhilip Paeps #define EFSYS_PROBE2(_name, _type1, _arg1, _type2, _arg2) \ 274*e948693eSPhilip Paeps DTRACE_PROBE2(_name, _type1, _arg1, _type2, _arg2) 275*e948693eSPhilip Paeps 276*e948693eSPhilip Paeps #define EFSYS_PROBE3(_name, _type1, _arg1, _type2, _arg2, \ 277*e948693eSPhilip Paeps _type3, _arg3) \ 278*e948693eSPhilip Paeps DTRACE_PROBE3(_name, _type1, _arg1, _type2, _arg2, \ 279*e948693eSPhilip Paeps _type3, _arg3) 280*e948693eSPhilip Paeps 281*e948693eSPhilip Paeps #define EFSYS_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 282*e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) \ 283*e948693eSPhilip Paeps DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 284*e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) 285*e948693eSPhilip Paeps 286*e948693eSPhilip Paeps #ifdef DTRACE_PROBE5 287*e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 288*e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) \ 289*e948693eSPhilip Paeps DTRACE_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 290*e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) 291*e948693eSPhilip Paeps #else 292*e948693eSPhilip Paeps #define EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 293*e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) \ 294*e948693eSPhilip Paeps DTRACE_PROBE4(_name, _type1, _arg1, _type2, _arg2, \ 295*e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4) 296*e948693eSPhilip Paeps #endif 297*e948693eSPhilip Paeps 298*e948693eSPhilip Paeps #ifdef DTRACE_PROBE6 299*e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 300*e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 301*e948693eSPhilip Paeps _type6, _arg6) \ 302*e948693eSPhilip Paeps DTRACE_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 303*e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 304*e948693eSPhilip Paeps _type6, _arg6) 305*e948693eSPhilip Paeps #else 306*e948693eSPhilip Paeps #define EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 307*e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 308*e948693eSPhilip Paeps _type6, _arg6) \ 309*e948693eSPhilip Paeps EFSYS_PROBE5(_name, _type1, _arg1, _type2, _arg2, \ 310*e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5) 311*e948693eSPhilip Paeps #endif 312*e948693eSPhilip Paeps 313*e948693eSPhilip Paeps #ifdef DTRACE_PROBE7 314*e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 315*e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 316*e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) \ 317*e948693eSPhilip Paeps DTRACE_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 318*e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 319*e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) 320*e948693eSPhilip Paeps #else 321*e948693eSPhilip Paeps #define EFSYS_PROBE7(_name, _type1, _arg1, _type2, _arg2, \ 322*e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 323*e948693eSPhilip Paeps _type6, _arg6, _type7, _arg7) \ 324*e948693eSPhilip Paeps EFSYS_PROBE6(_name, _type1, _arg1, _type2, _arg2, \ 325*e948693eSPhilip Paeps _type3, _arg3, _type4, _arg4, _type5, _arg5, \ 326*e948693eSPhilip Paeps _type6, _arg6) 327*e948693eSPhilip Paeps #endif 328*e948693eSPhilip Paeps 329*e948693eSPhilip Paeps #endif /* KDTRACE_HOOKS */ 330*e948693eSPhilip Paeps 331*e948693eSPhilip Paeps /* DMA */ 332*e948693eSPhilip Paeps 333*e948693eSPhilip Paeps typedef uint64_t efsys_dma_addr_t; 334*e948693eSPhilip Paeps 335*e948693eSPhilip Paeps typedef struct efsys_mem_s { 336*e948693eSPhilip Paeps bus_dma_tag_t esm_tag; 337*e948693eSPhilip Paeps bus_dmamap_t esm_map; 338*e948693eSPhilip Paeps caddr_t esm_base; 339*e948693eSPhilip Paeps efsys_dma_addr_t esm_addr; 340*e948693eSPhilip Paeps size_t esm_size; 341*e948693eSPhilip Paeps } efsys_mem_t; 342*e948693eSPhilip Paeps 343*e948693eSPhilip Paeps 344*e948693eSPhilip Paeps #define EFSYS_MEM_ZERO(_esmp, _size) \ 345*e948693eSPhilip Paeps do { \ 346*e948693eSPhilip Paeps (void) memset((_esmp)->esm_base, 0, (_size)); \ 347*e948693eSPhilip Paeps \ 348*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 349*e948693eSPhilip Paeps } while (B_FALSE) 350*e948693eSPhilip Paeps 351*e948693eSPhilip Paeps #define EFSYS_MEM_READD(_esmp, _offset, _edp) \ 352*e948693eSPhilip Paeps do { \ 353*e948693eSPhilip Paeps uint32_t *addr; \ 354*e948693eSPhilip Paeps \ 355*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 356*e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 357*e948693eSPhilip Paeps ("not power of 2 aligned")); \ 358*e948693eSPhilip Paeps \ 359*e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 360*e948693eSPhilip Paeps \ 361*e948693eSPhilip Paeps (_edp)->ed_u32[0] = *addr; \ 362*e948693eSPhilip Paeps \ 363*e948693eSPhilip Paeps EFSYS_PROBE2(mem_readd, unsigned int, (_offset), \ 364*e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 365*e948693eSPhilip Paeps \ 366*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 367*e948693eSPhilip Paeps } while (B_FALSE) 368*e948693eSPhilip Paeps 369*e948693eSPhilip Paeps #define EFSYS_MEM_READQ(_esmp, _offset, _eqp) \ 370*e948693eSPhilip Paeps do { \ 371*e948693eSPhilip Paeps uint32_t *addr; \ 372*e948693eSPhilip Paeps \ 373*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 374*e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 375*e948693eSPhilip Paeps ("not power of 2 aligned")); \ 376*e948693eSPhilip Paeps \ 377*e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 378*e948693eSPhilip Paeps \ 379*e948693eSPhilip Paeps (_eqp)->eq_u32[0] = *addr++; \ 380*e948693eSPhilip Paeps (_eqp)->eq_u32[1] = *addr; \ 381*e948693eSPhilip Paeps \ 382*e948693eSPhilip Paeps EFSYS_PROBE3(mem_readq, unsigned int, (_offset), \ 383*e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 384*e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 385*e948693eSPhilip Paeps \ 386*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 387*e948693eSPhilip Paeps } while (B_FALSE) 388*e948693eSPhilip Paeps 389*e948693eSPhilip Paeps #define EFSYS_MEM_READO(_esmp, _offset, _eop) \ 390*e948693eSPhilip Paeps do { \ 391*e948693eSPhilip Paeps uint32_t *addr; \ 392*e948693eSPhilip Paeps \ 393*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 394*e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 395*e948693eSPhilip Paeps ("not power of 2 aligned")); \ 396*e948693eSPhilip Paeps \ 397*e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 398*e948693eSPhilip Paeps \ 399*e948693eSPhilip Paeps (_eop)->eo_u32[0] = *addr++; \ 400*e948693eSPhilip Paeps (_eop)->eo_u32[1] = *addr++; \ 401*e948693eSPhilip Paeps (_eop)->eo_u32[2] = *addr++; \ 402*e948693eSPhilip Paeps (_eop)->eo_u32[3] = *addr; \ 403*e948693eSPhilip Paeps \ 404*e948693eSPhilip Paeps EFSYS_PROBE5(mem_reado, unsigned int, (_offset), \ 405*e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 406*e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 407*e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 408*e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 409*e948693eSPhilip Paeps \ 410*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 411*e948693eSPhilip Paeps } while (B_FALSE) 412*e948693eSPhilip Paeps 413*e948693eSPhilip Paeps #define EFSYS_MEM_WRITED(_esmp, _offset, _edp) \ 414*e948693eSPhilip Paeps do { \ 415*e948693eSPhilip Paeps uint32_t *addr; \ 416*e948693eSPhilip Paeps \ 417*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 418*e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 419*e948693eSPhilip Paeps ("not power of 2 aligned")); \ 420*e948693eSPhilip Paeps \ 421*e948693eSPhilip Paeps EFSYS_PROBE2(mem_writed, unsigned int, (_offset), \ 422*e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 423*e948693eSPhilip Paeps \ 424*e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 425*e948693eSPhilip Paeps \ 426*e948693eSPhilip Paeps *addr = (_edp)->ed_u32[0]; \ 427*e948693eSPhilip Paeps \ 428*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 429*e948693eSPhilip Paeps } while (B_FALSE) 430*e948693eSPhilip Paeps 431*e948693eSPhilip Paeps #define EFSYS_MEM_WRITEQ(_esmp, _offset, _eqp) \ 432*e948693eSPhilip Paeps do { \ 433*e948693eSPhilip Paeps uint32_t *addr; \ 434*e948693eSPhilip Paeps \ 435*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 436*e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 437*e948693eSPhilip Paeps ("not power of 2 aligned")); \ 438*e948693eSPhilip Paeps \ 439*e948693eSPhilip Paeps EFSYS_PROBE3(mem_writeq, unsigned int, (_offset), \ 440*e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 441*e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 442*e948693eSPhilip Paeps \ 443*e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 444*e948693eSPhilip Paeps \ 445*e948693eSPhilip Paeps *addr++ = (_eqp)->eq_u32[0]; \ 446*e948693eSPhilip Paeps *addr = (_eqp)->eq_u32[1]; \ 447*e948693eSPhilip Paeps \ 448*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 449*e948693eSPhilip Paeps } while (B_FALSE) 450*e948693eSPhilip Paeps 451*e948693eSPhilip Paeps #define EFSYS_MEM_WRITEO(_esmp, _offset, _eop) \ 452*e948693eSPhilip Paeps do { \ 453*e948693eSPhilip Paeps uint32_t *addr; \ 454*e948693eSPhilip Paeps \ 455*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 456*e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 457*e948693eSPhilip Paeps ("not power of 2 aligned")); \ 458*e948693eSPhilip Paeps \ 459*e948693eSPhilip Paeps EFSYS_PROBE5(mem_writeo, unsigned int, (_offset), \ 460*e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 461*e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 462*e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 463*e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 464*e948693eSPhilip Paeps \ 465*e948693eSPhilip Paeps addr = (void *)((_esmp)->esm_base + (_offset)); \ 466*e948693eSPhilip Paeps \ 467*e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[0]; \ 468*e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[1]; \ 469*e948693eSPhilip Paeps *addr++ = (_eop)->eo_u32[2]; \ 470*e948693eSPhilip Paeps *addr = (_eop)->eo_u32[3]; \ 471*e948693eSPhilip Paeps \ 472*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 473*e948693eSPhilip Paeps } while (B_FALSE) 474*e948693eSPhilip Paeps 475*e948693eSPhilip Paeps #define EFSYS_MEM_ADDR(_esmp) \ 476*e948693eSPhilip Paeps ((_esmp)->esm_addr) 477*e948693eSPhilip Paeps 478*e948693eSPhilip Paeps /* BAR */ 479*e948693eSPhilip Paeps 480*e948693eSPhilip Paeps typedef struct efsys_bar_s { 481*e948693eSPhilip Paeps struct mtx esb_lock; 482*e948693eSPhilip Paeps bus_space_tag_t esb_tag; 483*e948693eSPhilip Paeps bus_space_handle_t esb_handle; 484*e948693eSPhilip Paeps int esb_rid; 485*e948693eSPhilip Paeps struct resource *esb_res; 486*e948693eSPhilip Paeps } efsys_bar_t; 487*e948693eSPhilip Paeps 488*e948693eSPhilip Paeps #define EFSYS_BAR_READD(_esbp, _offset, _edp, _lock) \ 489*e948693eSPhilip Paeps do { \ 490*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 491*e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 492*e948693eSPhilip Paeps ("not power of 2 aligned")); \ 493*e948693eSPhilip Paeps \ 494*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 495*e948693eSPhilip Paeps if (_lock) \ 496*e948693eSPhilip Paeps mtx_lock(&((_esbp)->esb_lock)); \ 497*e948693eSPhilip Paeps \ 498*e948693eSPhilip Paeps (_edp)->ed_u32[0] = bus_space_read_4((_esbp)->esb_tag, \ 499*e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset)); \ 500*e948693eSPhilip Paeps \ 501*e948693eSPhilip Paeps EFSYS_PROBE2(bar_readd, unsigned int, (_offset), \ 502*e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 503*e948693eSPhilip Paeps \ 504*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 505*e948693eSPhilip Paeps if (_lock) \ 506*e948693eSPhilip Paeps mtx_unlock(&((_esbp)->esb_lock)); \ 507*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 508*e948693eSPhilip Paeps } while (B_FALSE) 509*e948693eSPhilip Paeps 510*e948693eSPhilip Paeps #define EFSYS_BAR_READQ(_esbp, _offset, _eqp) \ 511*e948693eSPhilip Paeps do { \ 512*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 513*e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 514*e948693eSPhilip Paeps ("not power of 2 aligned")); \ 515*e948693eSPhilip Paeps \ 516*e948693eSPhilip Paeps mtx_lock(&((_esbp)->esb_lock)); \ 517*e948693eSPhilip Paeps \ 518*e948693eSPhilip Paeps (_eqp)->eq_u32[0] = bus_space_read_4((_esbp)->esb_tag, \ 519*e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset)); \ 520*e948693eSPhilip Paeps (_eqp)->eq_u32[1] = bus_space_read_4((_esbp)->esb_tag, \ 521*e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset+4)); \ 522*e948693eSPhilip Paeps \ 523*e948693eSPhilip Paeps EFSYS_PROBE3(bar_readq, unsigned int, (_offset), \ 524*e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 525*e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 526*e948693eSPhilip Paeps \ 527*e948693eSPhilip Paeps mtx_unlock(&((_esbp)->esb_lock)); \ 528*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 529*e948693eSPhilip Paeps } while (B_FALSE) 530*e948693eSPhilip Paeps 531*e948693eSPhilip Paeps #define EFSYS_BAR_READO(_esbp, _offset, _eop, _lock) \ 532*e948693eSPhilip Paeps do { \ 533*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 534*e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 535*e948693eSPhilip Paeps ("not power of 2 aligned")); \ 536*e948693eSPhilip Paeps \ 537*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 538*e948693eSPhilip Paeps if (_lock) \ 539*e948693eSPhilip Paeps mtx_lock(&((_esbp)->esb_lock)); \ 540*e948693eSPhilip Paeps \ 541*e948693eSPhilip Paeps (_eop)->eo_u32[0] = bus_space_read_4((_esbp)->esb_tag, \ 542*e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset)); \ 543*e948693eSPhilip Paeps (_eop)->eo_u32[1] = bus_space_read_4((_esbp)->esb_tag, \ 544*e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset+4)); \ 545*e948693eSPhilip Paeps (_eop)->eo_u32[2] = bus_space_read_4((_esbp)->esb_tag, \ 546*e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset+8)); \ 547*e948693eSPhilip Paeps (_eop)->eo_u32[3] = bus_space_read_4((_esbp)->esb_tag, \ 548*e948693eSPhilip Paeps (_esbp)->esb_handle, (_offset+12)); \ 549*e948693eSPhilip Paeps \ 550*e948693eSPhilip Paeps EFSYS_PROBE5(bar_reado, unsigned int, (_offset), \ 551*e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 552*e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 553*e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 554*e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 555*e948693eSPhilip Paeps \ 556*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 557*e948693eSPhilip Paeps if (_lock) \ 558*e948693eSPhilip Paeps mtx_unlock(&((_esbp)->esb_lock)); \ 559*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 560*e948693eSPhilip Paeps } while (B_FALSE) 561*e948693eSPhilip Paeps 562*e948693eSPhilip Paeps #define EFSYS_BAR_WRITED(_esbp, _offset, _edp, _lock) \ 563*e948693eSPhilip Paeps do { \ 564*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 565*e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_dword_t)), \ 566*e948693eSPhilip Paeps ("not power of 2 aligned")); \ 567*e948693eSPhilip Paeps \ 568*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 569*e948693eSPhilip Paeps if (_lock) \ 570*e948693eSPhilip Paeps mtx_lock(&((_esbp)->esb_lock)); \ 571*e948693eSPhilip Paeps \ 572*e948693eSPhilip Paeps EFSYS_PROBE2(bar_writed, unsigned int, (_offset), \ 573*e948693eSPhilip Paeps uint32_t, (_edp)->ed_u32[0]); \ 574*e948693eSPhilip Paeps \ 575*e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 576*e948693eSPhilip Paeps (_offset), (_edp)->ed_u32[0]); \ 577*e948693eSPhilip Paeps \ 578*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 579*e948693eSPhilip Paeps if (_lock) \ 580*e948693eSPhilip Paeps mtx_unlock(&((_esbp)->esb_lock)); \ 581*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 582*e948693eSPhilip Paeps } while (B_FALSE) 583*e948693eSPhilip Paeps 584*e948693eSPhilip Paeps #define EFSYS_BAR_WRITEQ(_esbp, _offset, _eqp) \ 585*e948693eSPhilip Paeps do { \ 586*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 587*e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_qword_t)), \ 588*e948693eSPhilip Paeps ("not power of 2 aligned")); \ 589*e948693eSPhilip Paeps \ 590*e948693eSPhilip Paeps mtx_lock(&((_esbp)->esb_lock)); \ 591*e948693eSPhilip Paeps \ 592*e948693eSPhilip Paeps EFSYS_PROBE3(bar_writeq, unsigned int, (_offset), \ 593*e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[1], \ 594*e948693eSPhilip Paeps uint32_t, (_eqp)->eq_u32[0]); \ 595*e948693eSPhilip Paeps \ 596*e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 597*e948693eSPhilip Paeps (_offset), (_eqp)->eq_u32[0]); \ 598*e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 599*e948693eSPhilip Paeps (_offset+4), (_eqp)->eq_u32[1]); \ 600*e948693eSPhilip Paeps \ 601*e948693eSPhilip Paeps mtx_unlock(&((_esbp)->esb_lock)); \ 602*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 603*e948693eSPhilip Paeps } while (B_FALSE) 604*e948693eSPhilip Paeps 605*e948693eSPhilip Paeps #define EFSYS_BAR_WRITEO(_esbp, _offset, _eop, _lock) \ 606*e948693eSPhilip Paeps do { \ 607*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 608*e948693eSPhilip Paeps KASSERT(IS_P2ALIGNED(_offset, sizeof (efx_oword_t)), \ 609*e948693eSPhilip Paeps ("not power of 2 aligned")); \ 610*e948693eSPhilip Paeps \ 611*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 612*e948693eSPhilip Paeps if (_lock) \ 613*e948693eSPhilip Paeps mtx_lock(&((_esbp)->esb_lock)); \ 614*e948693eSPhilip Paeps \ 615*e948693eSPhilip Paeps EFSYS_PROBE5(bar_writeo, unsigned int, (_offset), \ 616*e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[3], \ 617*e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[2], \ 618*e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[1], \ 619*e948693eSPhilip Paeps uint32_t, (_eop)->eo_u32[0]); \ 620*e948693eSPhilip Paeps \ 621*e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 622*e948693eSPhilip Paeps (_offset), (_eop)->eo_u32[0]); \ 623*e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 624*e948693eSPhilip Paeps (_offset+4), (_eop)->eo_u32[1]); \ 625*e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 626*e948693eSPhilip Paeps (_offset+8), (_eop)->eo_u32[2]); \ 627*e948693eSPhilip Paeps bus_space_write_4((_esbp)->esb_tag, (_esbp)->esb_handle,\ 628*e948693eSPhilip Paeps (_offset+12), (_eop)->eo_u32[3]); \ 629*e948693eSPhilip Paeps \ 630*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 631*e948693eSPhilip Paeps if (_lock) \ 632*e948693eSPhilip Paeps mtx_unlock(&((_esbp)->esb_lock)); \ 633*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 634*e948693eSPhilip Paeps } while (B_FALSE) 635*e948693eSPhilip Paeps 636*e948693eSPhilip Paeps /* SPIN */ 637*e948693eSPhilip Paeps 638*e948693eSPhilip Paeps #define EFSYS_SPIN(_us) \ 639*e948693eSPhilip Paeps do { \ 640*e948693eSPhilip Paeps DELAY(_us); \ 641*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 642*e948693eSPhilip Paeps } while (B_FALSE) 643*e948693eSPhilip Paeps 644*e948693eSPhilip Paeps #define EFSYS_SLEEP EFSYS_SPIN 645*e948693eSPhilip Paeps 646*e948693eSPhilip Paeps /* BARRIERS */ 647*e948693eSPhilip Paeps 648*e948693eSPhilip Paeps /* Strict ordering guaranteed by devacc.devacc_attr_dataorder */ 649*e948693eSPhilip Paeps #define EFSYS_MEM_READ_BARRIER() 650*e948693eSPhilip Paeps #define EFSYS_PIO_WRITE_BARRIER() 651*e948693eSPhilip Paeps 652*e948693eSPhilip Paeps /* TIMESTAMP */ 653*e948693eSPhilip Paeps 654*e948693eSPhilip Paeps typedef clock_t efsys_timestamp_t; 655*e948693eSPhilip Paeps 656*e948693eSPhilip Paeps #define EFSYS_TIMESTAMP(_usp) \ 657*e948693eSPhilip Paeps do { \ 658*e948693eSPhilip Paeps clock_t now; \ 659*e948693eSPhilip Paeps \ 660*e948693eSPhilip Paeps now = ticks; \ 661*e948693eSPhilip Paeps *(_usp) = now * hz / 1000000; \ 662*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 663*e948693eSPhilip Paeps } while (B_FALSE) 664*e948693eSPhilip Paeps 665*e948693eSPhilip Paeps /* KMEM */ 666*e948693eSPhilip Paeps 667*e948693eSPhilip Paeps #define EFSYS_KMEM_ALLOC(_esip, _size, _p) \ 668*e948693eSPhilip Paeps do { \ 669*e948693eSPhilip Paeps (_esip) = (_esip); \ 670*e948693eSPhilip Paeps (_p) = malloc((_size), M_SFXGE, M_WAITOK|M_ZERO); \ 671*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 672*e948693eSPhilip Paeps } while (B_FALSE) 673*e948693eSPhilip Paeps 674*e948693eSPhilip Paeps #define EFSYS_KMEM_FREE(_esip, _size, _p) \ 675*e948693eSPhilip Paeps do { \ 676*e948693eSPhilip Paeps (void) (_esip); \ 677*e948693eSPhilip Paeps (void) (_size); \ 678*e948693eSPhilip Paeps free((_p), M_SFXGE); \ 679*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 680*e948693eSPhilip Paeps } while (B_FALSE) 681*e948693eSPhilip Paeps 682*e948693eSPhilip Paeps /* LOCK */ 683*e948693eSPhilip Paeps 684*e948693eSPhilip Paeps typedef struct mtx efsys_lock_t; 685*e948693eSPhilip Paeps 686*e948693eSPhilip Paeps #define EFSYS_LOCK_MAGIC 0x000010c4 687*e948693eSPhilip Paeps 688*e948693eSPhilip Paeps #define EFSYS_LOCK(_lockp, _state) \ 689*e948693eSPhilip Paeps do { \ 690*e948693eSPhilip Paeps mtx_lock(_lockp); \ 691*e948693eSPhilip Paeps (_state) = EFSYS_LOCK_MAGIC; \ 692*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 693*e948693eSPhilip Paeps } while (B_FALSE) 694*e948693eSPhilip Paeps 695*e948693eSPhilip Paeps #define EFSYS_UNLOCK(_lockp, _state) \ 696*e948693eSPhilip Paeps do { \ 697*e948693eSPhilip Paeps if ((_state) != EFSYS_LOCK_MAGIC) \ 698*e948693eSPhilip Paeps KASSERT(B_FALSE, ("not locked")); \ 699*e948693eSPhilip Paeps mtx_unlock(_lockp); \ 700*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 701*e948693eSPhilip Paeps } while (B_FALSE) 702*e948693eSPhilip Paeps 703*e948693eSPhilip Paeps /* PREEMPT */ 704*e948693eSPhilip Paeps 705*e948693eSPhilip Paeps #define EFSYS_PREEMPT_DISABLE(_state) \ 706*e948693eSPhilip Paeps do { \ 707*e948693eSPhilip Paeps (_state) = (_state); \ 708*e948693eSPhilip Paeps critical_enter(); \ 709*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 710*e948693eSPhilip Paeps } while (B_FALSE) 711*e948693eSPhilip Paeps 712*e948693eSPhilip Paeps #define EFSYS_PREEMPT_ENABLE(_state) \ 713*e948693eSPhilip Paeps do { \ 714*e948693eSPhilip Paeps (_state) = (_state); \ 715*e948693eSPhilip Paeps critical_exit(_state); \ 716*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 717*e948693eSPhilip Paeps } while (B_FALSE) 718*e948693eSPhilip Paeps 719*e948693eSPhilip Paeps /* STAT */ 720*e948693eSPhilip Paeps 721*e948693eSPhilip Paeps typedef uint64_t efsys_stat_t; 722*e948693eSPhilip Paeps 723*e948693eSPhilip Paeps #define EFSYS_STAT_INCR(_knp, _delta) \ 724*e948693eSPhilip Paeps do { \ 725*e948693eSPhilip Paeps *(_knp) += (_delta); \ 726*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 727*e948693eSPhilip Paeps } while (B_FALSE) 728*e948693eSPhilip Paeps 729*e948693eSPhilip Paeps #define EFSYS_STAT_DECR(_knp, _delta) \ 730*e948693eSPhilip Paeps do { \ 731*e948693eSPhilip Paeps *(_knp) -= (_delta); \ 732*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 733*e948693eSPhilip Paeps } while (B_FALSE) 734*e948693eSPhilip Paeps 735*e948693eSPhilip Paeps #define EFSYS_STAT_SET(_knp, _val) \ 736*e948693eSPhilip Paeps do { \ 737*e948693eSPhilip Paeps *(_knp) = (_val); \ 738*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 739*e948693eSPhilip Paeps } while (B_FALSE) 740*e948693eSPhilip Paeps 741*e948693eSPhilip Paeps #define EFSYS_STAT_SET_QWORD(_knp, _valp) \ 742*e948693eSPhilip Paeps do { \ 743*e948693eSPhilip Paeps *(_knp) = le64toh((_valp)->eq_u64[0]); \ 744*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 745*e948693eSPhilip Paeps } while (B_FALSE) 746*e948693eSPhilip Paeps 747*e948693eSPhilip Paeps #define EFSYS_STAT_SET_DWORD(_knp, _valp) \ 748*e948693eSPhilip Paeps do { \ 749*e948693eSPhilip Paeps *(_knp) = le32toh((_valp)->ed_u32[0]); \ 750*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 751*e948693eSPhilip Paeps } while (B_FALSE) 752*e948693eSPhilip Paeps 753*e948693eSPhilip Paeps #define EFSYS_STAT_INCR_QWORD(_knp, _valp) \ 754*e948693eSPhilip Paeps do { \ 755*e948693eSPhilip Paeps *(_knp) += le64toh((_valp)->eq_u64[0]); \ 756*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 757*e948693eSPhilip Paeps } while (B_FALSE) 758*e948693eSPhilip Paeps 759*e948693eSPhilip Paeps #define EFSYS_STAT_SUBR_QWORD(_knp, _valp) \ 760*e948693eSPhilip Paeps do { \ 761*e948693eSPhilip Paeps *(_knp) -= le64toh((_valp)->eq_u64[0]); \ 762*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 763*e948693eSPhilip Paeps } while (B_FALSE) 764*e948693eSPhilip Paeps 765*e948693eSPhilip Paeps /* ERR */ 766*e948693eSPhilip Paeps 767*e948693eSPhilip Paeps extern void sfxge_err(efsys_identifier_t *, unsigned int, 768*e948693eSPhilip Paeps uint32_t, uint32_t); 769*e948693eSPhilip Paeps 770*e948693eSPhilip Paeps #if EFSYS_OPT_DECODE_INTR_FATAL 771*e948693eSPhilip Paeps #define EFSYS_ERR(_esip, _code, _dword0, _dword1) \ 772*e948693eSPhilip Paeps do { \ 773*e948693eSPhilip Paeps sfxge_err((_esip), (_code), (_dword0), (_dword1)); \ 774*e948693eSPhilip Paeps _NOTE(CONSTANTCONDITION) \ 775*e948693eSPhilip Paeps } while (B_FALSE) 776*e948693eSPhilip Paeps #endif 777*e948693eSPhilip Paeps 778*e948693eSPhilip Paeps /* ASSERT */ 779*e948693eSPhilip Paeps 780*e948693eSPhilip Paeps #define EFSYS_ASSERT(_exp) do { \ 781*e948693eSPhilip Paeps if (!(_exp)) \ 782*e948693eSPhilip Paeps panic(#_exp); \ 783*e948693eSPhilip Paeps } while (0) 784*e948693eSPhilip Paeps 785*e948693eSPhilip Paeps #define EFSYS_ASSERT3(_x, _op, _y, _t) do { \ 786*e948693eSPhilip Paeps const _t __x = (_t)(_x); \ 787*e948693eSPhilip Paeps const _t __y = (_t)(_y); \ 788*e948693eSPhilip Paeps if (!(__x _op __y)) \ 789*e948693eSPhilip Paeps panic("assertion failed at %s:%u", __FILE__, __LINE__); \ 790*e948693eSPhilip Paeps } while(0) 791*e948693eSPhilip Paeps 792*e948693eSPhilip Paeps #define EFSYS_ASSERT3U(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, uint64_t) 793*e948693eSPhilip Paeps #define EFSYS_ASSERT3S(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, int64_t) 794*e948693eSPhilip Paeps #define EFSYS_ASSERT3P(_x, _op, _y) EFSYS_ASSERT3(_x, _op, _y, uintptr_t) 795*e948693eSPhilip Paeps 796*e948693eSPhilip Paeps #ifdef __cplusplus 797*e948693eSPhilip Paeps } 798*e948693eSPhilip Paeps #endif 799*e948693eSPhilip Paeps 800*e948693eSPhilip Paeps #endif /* _SYS_EFSYS_H */ 801