145c98dacSZbigniew Bodek /*- 245c98dacSZbigniew Bodek * BSD LICENSE 345c98dacSZbigniew Bodek * 445c98dacSZbigniew Bodek * Copyright (c) 2015-2017 Amazon.com, Inc. or its affiliates. 545c98dacSZbigniew Bodek * All rights reserved. 645c98dacSZbigniew Bodek * 745c98dacSZbigniew Bodek * Redistribution and use in source and binary forms, with or without 845c98dacSZbigniew Bodek * modification, are permitted provided that the following conditions 945c98dacSZbigniew Bodek * are met: 1045c98dacSZbigniew Bodek * 1145c98dacSZbigniew Bodek * * Redistributions of source code must retain the above copyright 1245c98dacSZbigniew Bodek * notice, this list of conditions and the following disclaimer. 1345c98dacSZbigniew Bodek * * Redistributions in binary form must reproduce the above copyright 1445c98dacSZbigniew Bodek * notice, this list of conditions and the following disclaimer in 1545c98dacSZbigniew Bodek * the documentation and/or other materials provided with the 1645c98dacSZbigniew Bodek * distribution. 1745c98dacSZbigniew Bodek * * Neither the name of copyright holder nor the names of its 1845c98dacSZbigniew Bodek * contributors may be used to endorse or promote products derived 1945c98dacSZbigniew Bodek * from this software without specific prior written permission. 2045c98dacSZbigniew Bodek * 2145c98dacSZbigniew Bodek * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2245c98dacSZbigniew Bodek * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2345c98dacSZbigniew Bodek * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2445c98dacSZbigniew Bodek * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2545c98dacSZbigniew Bodek * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2645c98dacSZbigniew Bodek * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2745c98dacSZbigniew Bodek * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2845c98dacSZbigniew Bodek * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2945c98dacSZbigniew Bodek * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3045c98dacSZbigniew Bodek * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3145c98dacSZbigniew Bodek * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3245c98dacSZbigniew Bodek */ 3345c98dacSZbigniew Bodek 3445c98dacSZbigniew Bodek #ifndef ENA_PLAT_H_ 3545c98dacSZbigniew Bodek #define ENA_PLAT_H_ 3645c98dacSZbigniew Bodek 3745c98dacSZbigniew Bodek #include <sys/cdefs.h> 3845c98dacSZbigniew Bodek __FBSDID("$FreeBSD$"); 3945c98dacSZbigniew Bodek 4045c98dacSZbigniew Bodek #include <sys/param.h> 4145c98dacSZbigniew Bodek #include <sys/systm.h> 4245c98dacSZbigniew Bodek 4345c98dacSZbigniew Bodek #include <sys/bus.h> 4445c98dacSZbigniew Bodek #include <sys/condvar.h> 4545c98dacSZbigniew Bodek #include <sys/endian.h> 4645c98dacSZbigniew Bodek #include <sys/kernel.h> 4745c98dacSZbigniew Bodek #include <sys/kthread.h> 4845c98dacSZbigniew Bodek #include <sys/malloc.h> 4945c98dacSZbigniew Bodek #include <sys/mbuf.h> 5045c98dacSZbigniew Bodek #include <sys/module.h> 5145c98dacSZbigniew Bodek #include <sys/rman.h> 5245c98dacSZbigniew Bodek #include <sys/proc.h> 5345c98dacSZbigniew Bodek #include <sys/smp.h> 5445c98dacSZbigniew Bodek #include <sys/socket.h> 5545c98dacSZbigniew Bodek #include <sys/sockio.h> 5645c98dacSZbigniew Bodek #include <sys/sysctl.h> 5745c98dacSZbigniew Bodek #include <sys/taskqueue.h> 5845c98dacSZbigniew Bodek #include <sys/eventhandler.h> 5945c98dacSZbigniew Bodek #include <sys/types.h> 6045c98dacSZbigniew Bodek #include <sys/timetc.h> 6145c98dacSZbigniew Bodek #include <sys/cdefs.h> 6245c98dacSZbigniew Bodek 6345c98dacSZbigniew Bodek #include <machine/atomic.h> 6445c98dacSZbigniew Bodek #include <machine/bus.h> 6545c98dacSZbigniew Bodek #include <machine/in_cksum.h> 6645c98dacSZbigniew Bodek #include <machine/pcpu.h> 6745c98dacSZbigniew Bodek #include <machine/resource.h> 6845c98dacSZbigniew Bodek 6945c98dacSZbigniew Bodek #include <net/bpf.h> 7045c98dacSZbigniew Bodek #include <net/ethernet.h> 7145c98dacSZbigniew Bodek #include <net/if.h> 7245c98dacSZbigniew Bodek #include <net/if_var.h> 7345c98dacSZbigniew Bodek #include <net/if_arp.h> 7445c98dacSZbigniew Bodek #include <net/if_dl.h> 7545c98dacSZbigniew Bodek #include <net/if_media.h> 7645c98dacSZbigniew Bodek 7745c98dacSZbigniew Bodek #include <net/if_types.h> 7845c98dacSZbigniew Bodek #include <net/if_vlan_var.h> 7945c98dacSZbigniew Bodek 8045c98dacSZbigniew Bodek #include <netinet/in_systm.h> 8145c98dacSZbigniew Bodek #include <netinet/in.h> 8245c98dacSZbigniew Bodek #include <netinet/if_ether.h> 8345c98dacSZbigniew Bodek #include <netinet/ip.h> 8445c98dacSZbigniew Bodek #include <netinet/ip6.h> 8545c98dacSZbigniew Bodek #include <netinet/tcp.h> 8645c98dacSZbigniew Bodek #include <netinet/tcp_lro.h> 8745c98dacSZbigniew Bodek #include <netinet/udp.h> 8845c98dacSZbigniew Bodek 8945c98dacSZbigniew Bodek #include <dev/led/led.h> 9045c98dacSZbigniew Bodek #include <dev/pci/pcivar.h> 9145c98dacSZbigniew Bodek #include <dev/pci/pcireg.h> 9245c98dacSZbigniew Bodek 9345c98dacSZbigniew Bodek extern struct ena_bus_space ebs; 9445c98dacSZbigniew Bodek 9545c98dacSZbigniew Bodek /* Levels */ 9645c98dacSZbigniew Bodek #define ENA_ALERT (1 << 0) /* Alerts are providing more error info. */ 9745c98dacSZbigniew Bodek #define ENA_WARNING (1 << 1) /* Driver output is more error sensitive. */ 9845c98dacSZbigniew Bodek #define ENA_INFO (1 << 2) /* Provides additional driver info. */ 9945c98dacSZbigniew Bodek #define ENA_DBG (1 << 3) /* Driver output for debugging. */ 10045c98dacSZbigniew Bodek /* Detailed info that will be printed with ENA_INFO or ENA_DEBUG flag. */ 10145c98dacSZbigniew Bodek #define ENA_TXPTH (1 << 4) /* Allows TX path tracing. */ 10245c98dacSZbigniew Bodek #define ENA_RXPTH (1 << 5) /* Allows RX path tracing. */ 10345c98dacSZbigniew Bodek #define ENA_RSC (1 << 6) /* Goes with TXPTH or RXPTH, free/alloc res. */ 10445c98dacSZbigniew Bodek #define ENA_IOQ (1 << 7) /* Detailed info about IO queues. */ 10545c98dacSZbigniew Bodek #define ENA_ADMQ (1 << 8) /* Detailed info about admin queue. */ 10645c98dacSZbigniew Bodek 10745c98dacSZbigniew Bodek #ifndef ENA_DEBUG_LEVEL 10845c98dacSZbigniew Bodek #define ENA_DEBUG_LEVEL (ENA_ALERT | ENA_WARNING) 10945c98dacSZbigniew Bodek #endif 11045c98dacSZbigniew Bodek 11145c98dacSZbigniew Bodek #ifdef ENA_TRACE 11245c98dacSZbigniew Bodek #define ena_trace_raw(level, fmt, args...) \ 11345c98dacSZbigniew Bodek do { \ 11445c98dacSZbigniew Bodek if (((level) & ENA_DEBUG_LEVEL) != (level)) \ 11545c98dacSZbigniew Bodek break; \ 11645c98dacSZbigniew Bodek printf(fmt, ##args); \ 11745c98dacSZbigniew Bodek } while (0) 11845c98dacSZbigniew Bodek 11945c98dacSZbigniew Bodek #define ena_trace(level, fmt, args...) \ 12045c98dacSZbigniew Bodek ena_trace_raw(level, "%s() [TID:%d]: " \ 12145c98dacSZbigniew Bodek fmt " \n", __func__, curthread->td_tid, ##args) 12245c98dacSZbigniew Bodek 12345c98dacSZbigniew Bodek #else /* ENA_TRACE */ 12445c98dacSZbigniew Bodek #define ena_trace_raw(...) 12545c98dacSZbigniew Bodek #define ena_trace(...) 12645c98dacSZbigniew Bodek #endif /* ENA_TRACE */ 12745c98dacSZbigniew Bodek 12845c98dacSZbigniew Bodek #define ena_trc_dbg(format, arg...) ena_trace(ENA_DBG, format, ##arg) 12945c98dacSZbigniew Bodek #define ena_trc_info(format, arg...) ena_trace(ENA_INFO, format, ##arg) 13045c98dacSZbigniew Bodek #define ena_trc_warn(format, arg...) ena_trace(ENA_WARNING, format, ##arg) 13145c98dacSZbigniew Bodek #define ena_trc_err(format, arg...) ena_trace(ENA_ALERT, format, ##arg) 13245c98dacSZbigniew Bodek 13345c98dacSZbigniew Bodek #define unlikely(x) __predict_false(x) 13445c98dacSZbigniew Bodek #define likely(x) __predict_true(x) 13545c98dacSZbigniew Bodek 13645c98dacSZbigniew Bodek #define __iomem 13745c98dacSZbigniew Bodek #define ____cacheline_aligned __aligned(CACHE_LINE_SIZE) 13845c98dacSZbigniew Bodek 13945c98dacSZbigniew Bodek #define MAX_ERRNO 4095 14045c98dacSZbigniew Bodek #define IS_ERR_VALUE(x) unlikely((x) <= (unsigned long)MAX_ERRNO) 14145c98dacSZbigniew Bodek 14245c98dacSZbigniew Bodek #define WARN_ON(condition) \ 14345c98dacSZbigniew Bodek do { \ 14445c98dacSZbigniew Bodek int __ret_warn_on = !!(condition); \ 14545c98dacSZbigniew Bodek if (unlikely(__ret_warn_on)) \ 14645c98dacSZbigniew Bodek printf("%s %s", __FUNCTION__, __FILE__); \ 14745c98dacSZbigniew Bodek unlikely(__ret_warn_on); \ 14845c98dacSZbigniew Bodek } while (0) 14945c98dacSZbigniew Bodek 15045c98dacSZbigniew Bodek #define ENA_ASSERT(cond, format, arg...) \ 15145c98dacSZbigniew Bodek do { \ 15245c98dacSZbigniew Bodek if (unlikely(!(cond))) { \ 15345c98dacSZbigniew Bodek ena_trc_err( \ 15445c98dacSZbigniew Bodek "Assert failed on %s:%s:%d:" format, \ 15545c98dacSZbigniew Bodek __FILE__, __func__, __LINE__, ##arg); \ 15645c98dacSZbigniew Bodek WARN_ON(cond); \ 15745c98dacSZbigniew Bodek } \ 15845c98dacSZbigniew Bodek } while (0) 15945c98dacSZbigniew Bodek 16045c98dacSZbigniew Bodek #define ENA_WARN(cond, format, arg...) \ 16145c98dacSZbigniew Bodek do { \ 16245c98dacSZbigniew Bodek if (unlikely((cond))) { \ 16345c98dacSZbigniew Bodek ena_trc_warn(format, ##arg); \ 16445c98dacSZbigniew Bodek } \ 16545c98dacSZbigniew Bodek } while (0) 16645c98dacSZbigniew Bodek 16745c98dacSZbigniew Bodek static inline long IS_ERR(const void *ptr) 16845c98dacSZbigniew Bodek { 16945c98dacSZbigniew Bodek return IS_ERR_VALUE((unsigned long)ptr); 17045c98dacSZbigniew Bodek } 17145c98dacSZbigniew Bodek 17245c98dacSZbigniew Bodek static inline void *ERR_PTR(long error) 17345c98dacSZbigniew Bodek { 17445c98dacSZbigniew Bodek return (void *)error; 17545c98dacSZbigniew Bodek } 17645c98dacSZbigniew Bodek 17745c98dacSZbigniew Bodek static inline long PTR_ERR(const void *ptr) 17845c98dacSZbigniew Bodek { 17945c98dacSZbigniew Bodek return (long) ptr; 18045c98dacSZbigniew Bodek } 18145c98dacSZbigniew Bodek 18245c98dacSZbigniew Bodek #define GENMASK(h, l) (((1U << ((h) - (l) + 1)) - 1) << (l)) 18345c98dacSZbigniew Bodek #define GENMASK_ULL(h, l) (((~0ULL) << (l)) & (~0ULL >> (64 - 1 - (h)))) 18445c98dacSZbigniew Bodek #define BIT(x) (1 << (x)) 18545c98dacSZbigniew Bodek 18645c98dacSZbigniew Bodek #define ENA_ABORT() BUG() 18745c98dacSZbigniew Bodek #define BUG() panic("ENA BUG") 18845c98dacSZbigniew Bodek 18945c98dacSZbigniew Bodek #define SZ_256 (256) 19045c98dacSZbigniew Bodek #define SZ_4K (4096) 19145c98dacSZbigniew Bodek 19245c98dacSZbigniew Bodek #define ENA_COM_OK 0 19345c98dacSZbigniew Bodek #define ENA_COM_FAULT EFAULT 19445c98dacSZbigniew Bodek #define ENA_COM_INVAL EINVAL 19545c98dacSZbigniew Bodek #define ENA_COM_NO_MEM ENOMEM 19645c98dacSZbigniew Bodek #define ENA_COM_NO_SPACE ENOSPC 19745c98dacSZbigniew Bodek #define ENA_COM_TRY_AGAIN -1 19845c98dacSZbigniew Bodek #define ENA_COM_NO_DEVICE ENODEV 19945c98dacSZbigniew Bodek #define ENA_COM_PERMISSION EPERM 20045c98dacSZbigniew Bodek #define ENA_COM_TIMER_EXPIRED ETIMEDOUT 20145c98dacSZbigniew Bodek 20245c98dacSZbigniew Bodek #define ENA_MSLEEP(x) pause_sbt("ena", SBT_1MS * (x), SBT_1MS, 0) 20345c98dacSZbigniew Bodek #define ENA_UDELAY(x) DELAY(x) 20445c98dacSZbigniew Bodek #define ENA_GET_SYSTEM_TIMEOUT(timeout_us) \ 20545c98dacSZbigniew Bodek ((long)cputick2usec(cpu_ticks()) + (timeout_us)) 20645c98dacSZbigniew Bodek #define ENA_TIME_EXPIRE(timeout) ((timeout) < (long)cputick2usec(cpu_ticks())) 20745c98dacSZbigniew Bodek #define ENA_MIGHT_SLEEP() 20845c98dacSZbigniew Bodek 20945c98dacSZbigniew Bodek #define min_t(type, _x, _y) ((type)(_x) < (type)(_y) ? (type)(_x) : (type)(_y)) 21045c98dacSZbigniew Bodek #define max_t(type, _x, _y) ((type)(_x) > (type)(_y) ? (type)(_x) : (type)(_y)) 21145c98dacSZbigniew Bodek 21245c98dacSZbigniew Bodek #define ENA_MIN32(x,y) MIN(x, y) 21345c98dacSZbigniew Bodek #define ENA_MIN16(x,y) MIN(x, y) 21445c98dacSZbigniew Bodek #define ENA_MIN8(x,y) MIN(x, y) 21545c98dacSZbigniew Bodek 21645c98dacSZbigniew Bodek #define ENA_MAX32(x,y) MAX(x, y) 21745c98dacSZbigniew Bodek #define ENA_MAX16(x,y) MAX(x, y) 21845c98dacSZbigniew Bodek #define ENA_MAX8(x,y) MAX(x, y) 21945c98dacSZbigniew Bodek 22045c98dacSZbigniew Bodek /* Spinlock related methods */ 22145c98dacSZbigniew Bodek #define ena_spinlock_t struct mtx 22245c98dacSZbigniew Bodek #define ENA_SPINLOCK_INIT(spinlock) \ 22345c98dacSZbigniew Bodek mtx_init(&(spinlock), "ena_spin", NULL, MTX_SPIN) 22445c98dacSZbigniew Bodek #define ENA_SPINLOCK_DESTROY(spinlock) \ 22545c98dacSZbigniew Bodek do { \ 22645c98dacSZbigniew Bodek if (mtx_initialized(&(spinlock))) \ 22745c98dacSZbigniew Bodek mtx_destroy(&(spinlock)); \ 22845c98dacSZbigniew Bodek } while (0) 22945c98dacSZbigniew Bodek #define ENA_SPINLOCK_LOCK(spinlock, flags) \ 23045c98dacSZbigniew Bodek do { \ 23145c98dacSZbigniew Bodek (void)(flags); \ 23245c98dacSZbigniew Bodek mtx_lock_spin(&(spinlock)); \ 23345c98dacSZbigniew Bodek } while (0) 23445c98dacSZbigniew Bodek #define ENA_SPINLOCK_UNLOCK(spinlock, flags) \ 23545c98dacSZbigniew Bodek do { \ 23645c98dacSZbigniew Bodek (void)(flags); \ 23745c98dacSZbigniew Bodek mtx_unlock_spin(&(spinlock)); \ 23845c98dacSZbigniew Bodek } while (0) 23945c98dacSZbigniew Bodek 24045c98dacSZbigniew Bodek 24145c98dacSZbigniew Bodek /* Wait queue related methods */ 24245c98dacSZbigniew Bodek #define ena_wait_event_t struct { struct cv wq; struct mtx mtx; } 24345c98dacSZbigniew Bodek #define ENA_WAIT_EVENT_INIT(waitqueue) \ 24445c98dacSZbigniew Bodek do { \ 24545c98dacSZbigniew Bodek cv_init(&((waitqueue).wq), "cv"); \ 24645c98dacSZbigniew Bodek mtx_init(&((waitqueue).mtx), "wq", NULL, MTX_DEF); \ 24745c98dacSZbigniew Bodek } while (0) 24845c98dacSZbigniew Bodek #define ENA_WAIT_EVENT_DESTROY(waitqueue) \ 24945c98dacSZbigniew Bodek do { \ 25045c98dacSZbigniew Bodek cv_destroy(&((waitqueue).wq)); \ 25145c98dacSZbigniew Bodek mtx_destroy(&((waitqueue).mtx)); \ 25245c98dacSZbigniew Bodek } while (0) 25345c98dacSZbigniew Bodek #define ENA_WAIT_EVENT_CLEAR(waitqueue) \ 25445c98dacSZbigniew Bodek cv_init(&((waitqueue).wq), (waitqueue).wq.cv_description) 25545c98dacSZbigniew Bodek #define ENA_WAIT_EVENT_WAIT(waitqueue, timeout_us) \ 25645c98dacSZbigniew Bodek do { \ 25745c98dacSZbigniew Bodek mtx_lock(&((waitqueue).mtx)); \ 25845c98dacSZbigniew Bodek cv_timedwait(&((waitqueue).wq), &((waitqueue).mtx), \ 25945c98dacSZbigniew Bodek timeout_us * hz / 1000 / 1000 ); \ 26045c98dacSZbigniew Bodek mtx_unlock(&((waitqueue).mtx)); \ 26145c98dacSZbigniew Bodek } while (0) 26245c98dacSZbigniew Bodek #define ENA_WAIT_EVENT_SIGNAL(waitqueue) cv_broadcast(&((waitqueue).wq)) 26345c98dacSZbigniew Bodek 26445c98dacSZbigniew Bodek #define dma_addr_t bus_addr_t 26545c98dacSZbigniew Bodek #define u8 uint8_t 26645c98dacSZbigniew Bodek #define u16 uint16_t 26745c98dacSZbigniew Bodek #define u32 uint32_t 26845c98dacSZbigniew Bodek #define u64 uint64_t 26945c98dacSZbigniew Bodek 27045c98dacSZbigniew Bodek typedef struct { 27145c98dacSZbigniew Bodek bus_addr_t paddr; 27245c98dacSZbigniew Bodek caddr_t vaddr; 27345c98dacSZbigniew Bodek bus_dma_tag_t tag; 27445c98dacSZbigniew Bodek bus_dmamap_t map; 27545c98dacSZbigniew Bodek bus_dma_segment_t seg; 27645c98dacSZbigniew Bodek int nseg; 27745c98dacSZbigniew Bodek } ena_mem_handle_t; 27845c98dacSZbigniew Bodek 27945c98dacSZbigniew Bodek struct ena_bus { 28045c98dacSZbigniew Bodek bus_space_handle_t reg_bar_h; 28145c98dacSZbigniew Bodek bus_space_tag_t reg_bar_t; 28245c98dacSZbigniew Bodek bus_space_handle_t mem_bar_h; 28345c98dacSZbigniew Bodek bus_space_tag_t mem_bar_t; 28445c98dacSZbigniew Bodek }; 28545c98dacSZbigniew Bodek 28645c98dacSZbigniew Bodek typedef uint32_t ena_atomic32_t; 28745c98dacSZbigniew Bodek 28845c98dacSZbigniew Bodek void ena_dmamap_callback(void *arg, bus_dma_segment_t *segs, int nseg, 28945c98dacSZbigniew Bodek int error); 29045c98dacSZbigniew Bodek int ena_dma_alloc(device_t dmadev, bus_size_t size, ena_mem_handle_t *dma, 29145c98dacSZbigniew Bodek int mapflags); 29245c98dacSZbigniew Bodek 29345c98dacSZbigniew Bodek #define ENA_MEM_ALLOC(dmadev, size) malloc(size, M_DEVBUF, M_NOWAIT | M_ZERO) 29445c98dacSZbigniew Bodek #define ENA_MEM_ALLOC_NODE(dmadev, size, virt, node, dev_node) (virt = NULL) 29545c98dacSZbigniew Bodek #define ENA_MEM_FREE(dmadev, ptr) free(ptr, M_DEVBUF) 29645c98dacSZbigniew Bodek #define ENA_MEM_ALLOC_COHERENT_NODE(dmadev, size, virt, phys, handle, node, \ 29745c98dacSZbigniew Bodek dev_node) \ 29845c98dacSZbigniew Bodek do { \ 29945c98dacSZbigniew Bodek ((virt) = NULL); \ 30045c98dacSZbigniew Bodek (void)(dev_node); \ 30145c98dacSZbigniew Bodek } while (0) 30245c98dacSZbigniew Bodek 30345c98dacSZbigniew Bodek #define ENA_MEM_ALLOC_COHERENT(dmadev, size, virt, phys, dma) \ 30445c98dacSZbigniew Bodek do { \ 30545c98dacSZbigniew Bodek ena_dma_alloc((dmadev), (size), &(dma), 0); \ 30645c98dacSZbigniew Bodek (virt) = (void *)(dma).vaddr; \ 30745c98dacSZbigniew Bodek (phys) = (dma).paddr; \ 30845c98dacSZbigniew Bodek } while (0) 30945c98dacSZbigniew Bodek 31045c98dacSZbigniew Bodek #define ENA_MEM_FREE_COHERENT(dmadev, size, virt, phys, dma) \ 31145c98dacSZbigniew Bodek do { \ 31245c98dacSZbigniew Bodek (void)size; \ 31345c98dacSZbigniew Bodek bus_dmamap_unload((dma).tag, (dma).map); \ 31445c98dacSZbigniew Bodek bus_dmamem_free((dma).tag, (virt), (dma).map); \ 31545c98dacSZbigniew Bodek bus_dma_tag_destroy((dma).tag); \ 31645c98dacSZbigniew Bodek (dma).tag = NULL; \ 31745c98dacSZbigniew Bodek (virt) = NULL; \ 31845c98dacSZbigniew Bodek } while (0) 31945c98dacSZbigniew Bodek 32045c98dacSZbigniew Bodek /* Register R/W methods */ 32145c98dacSZbigniew Bodek #define ENA_REG_WRITE32(bus, value, offset) \ 32245c98dacSZbigniew Bodek bus_space_write_4( \ 32345c98dacSZbigniew Bodek ((struct ena_bus*)bus)->reg_bar_t, \ 32445c98dacSZbigniew Bodek ((struct ena_bus*)bus)->reg_bar_h, \ 32545c98dacSZbigniew Bodek (bus_size_t)(offset), (value)) 32645c98dacSZbigniew Bodek 32745c98dacSZbigniew Bodek #define ENA_REG_READ32(bus, offset) \ 32845c98dacSZbigniew Bodek bus_space_read_4( \ 32945c98dacSZbigniew Bodek ((struct ena_bus*)bus)->reg_bar_t, \ 33045c98dacSZbigniew Bodek ((struct ena_bus*)bus)->reg_bar_h, \ 33145c98dacSZbigniew Bodek (bus_size_t)(offset)) 33245c98dacSZbigniew Bodek 33345c98dacSZbigniew Bodek #define time_after(a,b) ((long)((unsigned long)(b) - (unsigned long)(a)) < 0) 33445c98dacSZbigniew Bodek 33545c98dacSZbigniew Bodek #define VLAN_HLEN sizeof(struct ether_vlan_header) 33645c98dacSZbigniew Bodek #define CSUM_OFFLOAD (CSUM_IP|CSUM_TCP|CSUM_UDP) 33745c98dacSZbigniew Bodek 33845c98dacSZbigniew Bodek #if defined(__i386__) || defined(__amd64__) 33945c98dacSZbigniew Bodek static __inline 34045c98dacSZbigniew Bodek void prefetch(void *x) 34145c98dacSZbigniew Bodek { 34245c98dacSZbigniew Bodek __asm volatile("prefetcht0 %0" :: "m" (*(unsigned long *)x)); 34345c98dacSZbigniew Bodek } 34445c98dacSZbigniew Bodek #else 34545c98dacSZbigniew Bodek #define prefetch(x) 34645c98dacSZbigniew Bodek #endif 34745c98dacSZbigniew Bodek 34845c98dacSZbigniew Bodek /* DMA buffers access */ 34945c98dacSZbigniew Bodek #define dma_unmap_addr(p, name) ((p)->dma->name) 35045c98dacSZbigniew Bodek #define dma_unmap_addr_set(p, name, v) (((p)->dma->name) = (v)) 35145c98dacSZbigniew Bodek #define dma_unmap_len(p, name) ((p)->name) 35245c98dacSZbigniew Bodek #define dma_unmap_len_set(p, name, v) (((p)->name) = (v)) 35345c98dacSZbigniew Bodek 35445c98dacSZbigniew Bodek #define memcpy_toio memcpy 35545c98dacSZbigniew Bodek 35645c98dacSZbigniew Bodek #define ATOMIC32_INC(I32_PTR) atomic_add_int(I32_PTR, 1) 35745c98dacSZbigniew Bodek #define ATOMIC32_DEC(I32_PTR) atomic_add_int(I32_PTR, -1) 35845c98dacSZbigniew Bodek #define ATOMIC32_READ(I32_PTR) atomic_load_acq_int(I32_PTR) 35945c98dacSZbigniew Bodek #define ATOMIC32_SET(I32_PTR, VAL) atomic_store_rel_int(I32_PTR, VAL) 36045c98dacSZbigniew Bodek 36145c98dacSZbigniew Bodek #define barrier() __asm__ __volatile__("": : :"memory") 36245c98dacSZbigniew Bodek #define ACCESS_ONCE(x) (*(volatile __typeof(x) *)&(x)) 36345c98dacSZbigniew Bodek #define READ_ONCE(x) ({ \ 36445c98dacSZbigniew Bodek __typeof(x) __var; \ 36545c98dacSZbigniew Bodek barrier(); \ 36645c98dacSZbigniew Bodek __var = ACCESS_ONCE(x); \ 36745c98dacSZbigniew Bodek barrier(); \ 36845c98dacSZbigniew Bodek __var; \ 36945c98dacSZbigniew Bodek }) 37045c98dacSZbigniew Bodek 37145c98dacSZbigniew Bodek #include "ena_common_defs.h" 37245c98dacSZbigniew Bodek #include "ena_admin_defs.h" 37345c98dacSZbigniew Bodek #include "ena_eth_io_defs.h" 37445c98dacSZbigniew Bodek #include "ena_regs_defs.h" 37545c98dacSZbigniew Bodek 37645c98dacSZbigniew Bodek #endif /* ENA_PLAT_H_ */ 377