1394324d3SSascha Wildner /*-
2394324d3SSascha Wildner * BSD LICENSE
3394324d3SSascha Wildner *
4394324d3SSascha Wildner * Copyright (c) 2015-2017 Amazon.com, Inc. or its affiliates.
5394324d3SSascha Wildner * All rights reserved.
6394324d3SSascha Wildner *
7394324d3SSascha Wildner * Redistribution and use in source and binary forms, with or without
8394324d3SSascha Wildner * modification, are permitted provided that the following conditions
9394324d3SSascha Wildner * are met:
10394324d3SSascha Wildner *
11394324d3SSascha Wildner * * Redistributions of source code must retain the above copyright
12394324d3SSascha Wildner * notice, this list of conditions and the following disclaimer.
13394324d3SSascha Wildner * * Redistributions in binary form must reproduce the above copyright
14394324d3SSascha Wildner * notice, this list of conditions and the following disclaimer in
15394324d3SSascha Wildner * the documentation and/or other materials provided with the
16394324d3SSascha Wildner * distribution.
17394324d3SSascha Wildner * * Neither the name of copyright holder nor the names of its
18394324d3SSascha Wildner * contributors may be used to endorse or promote products derived
19394324d3SSascha Wildner * from this software without specific prior written permission.
20394324d3SSascha Wildner *
21394324d3SSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22394324d3SSascha Wildner * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23394324d3SSascha Wildner * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24394324d3SSascha Wildner * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25394324d3SSascha Wildner * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26394324d3SSascha Wildner * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27394324d3SSascha Wildner * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28394324d3SSascha Wildner * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29394324d3SSascha Wildner * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30394324d3SSascha Wildner * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31394324d3SSascha Wildner * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3282a3fa28SBrad Hoffman *
3382a3fa28SBrad Hoffman * $FreeBSD: head/sys/contrib/ena-com/ena_plat.h 325589 2017-11-09 13:30:39Z mw $
34394324d3SSascha Wildner */
35394324d3SSascha Wildner
36394324d3SSascha Wildner #ifndef ENA_PLAT_H_
37394324d3SSascha Wildner #define ENA_PLAT_H_
38394324d3SSascha Wildner
39394324d3SSascha Wildner #include <sys/param.h>
40394324d3SSascha Wildner #include <sys/systm.h>
41394324d3SSascha Wildner
42394324d3SSascha Wildner #include <sys/bus.h>
43394324d3SSascha Wildner #include <sys/condvar.h>
44394324d3SSascha Wildner #include <sys/endian.h>
45394324d3SSascha Wildner #include <sys/kernel.h>
46394324d3SSascha Wildner #include <sys/kthread.h>
47394324d3SSascha Wildner #include <sys/malloc.h>
48394324d3SSascha Wildner #include <sys/mbuf.h>
49394324d3SSascha Wildner #include <sys/module.h>
50394324d3SSascha Wildner #include <sys/rman.h>
51394324d3SSascha Wildner #include <sys/proc.h>
52394324d3SSascha Wildner #include <sys/socket.h>
53394324d3SSascha Wildner #include <sys/sockio.h>
5482a3fa28SBrad Hoffman #include <sys/spinlock.h>
5582a3fa28SBrad Hoffman #include <sys/spinlock2.h>
56394324d3SSascha Wildner #include <sys/sysctl.h>
57394324d3SSascha Wildner #include <sys/taskqueue.h>
58394324d3SSascha Wildner #include <sys/eventhandler.h>
59394324d3SSascha Wildner #include <sys/types.h>
60394324d3SSascha Wildner #include <sys/cdefs.h>
61394324d3SSascha Wildner
62394324d3SSascha Wildner #include <machine/atomic.h>
63394324d3SSascha Wildner
64394324d3SSascha Wildner #include <net/bpf.h>
65394324d3SSascha Wildner #include <net/ethernet.h>
66394324d3SSascha Wildner #include <net/if.h>
67394324d3SSascha Wildner #include <net/if_var.h>
68394324d3SSascha Wildner #include <net/if_arp.h>
69394324d3SSascha Wildner #include <net/if_dl.h>
70394324d3SSascha Wildner #include <net/if_media.h>
71394324d3SSascha Wildner
72394324d3SSascha Wildner #include <net/if_types.h>
73394324d3SSascha Wildner
74394324d3SSascha Wildner #include <netinet/in_systm.h>
75394324d3SSascha Wildner #include <netinet/in.h>
76394324d3SSascha Wildner #include <netinet/if_ether.h>
77394324d3SSascha Wildner #include <netinet/ip.h>
78394324d3SSascha Wildner #include <netinet/ip6.h>
79394324d3SSascha Wildner #include <netinet/tcp.h>
80394324d3SSascha Wildner #include <netinet/udp.h>
81394324d3SSascha Wildner
8282a3fa28SBrad Hoffman #include <dev/misc/led/led.h>
8382a3fa28SBrad Hoffman #include <bus/pci/pcivar.h>
8482a3fa28SBrad Hoffman #include <bus/pci/pcireg.h>
85394324d3SSascha Wildner
86394324d3SSascha Wildner extern struct ena_bus_space ebs;
87394324d3SSascha Wildner
88394324d3SSascha Wildner /* Levels */
89394324d3SSascha Wildner #define ENA_ALERT (1 << 0) /* Alerts are providing more error info. */
90394324d3SSascha Wildner #define ENA_WARNING (1 << 1) /* Driver output is more error sensitive. */
91394324d3SSascha Wildner #define ENA_INFO (1 << 2) /* Provides additional driver info. */
92394324d3SSascha Wildner #define ENA_DBG (1 << 3) /* Driver output for debugging. */
93394324d3SSascha Wildner /* Detailed info that will be printed with ENA_INFO or ENA_DEBUG flag. */
94394324d3SSascha Wildner #define ENA_TXPTH (1 << 4) /* Allows TX path tracing. */
95394324d3SSascha Wildner #define ENA_RXPTH (1 << 5) /* Allows RX path tracing. */
96394324d3SSascha Wildner #define ENA_RSC (1 << 6) /* Goes with TXPTH or RXPTH, free/alloc res. */
97394324d3SSascha Wildner #define ENA_IOQ (1 << 7) /* Detailed info about IO queues. */
98394324d3SSascha Wildner #define ENA_ADMQ (1 << 8) /* Detailed info about admin queue. */
99394324d3SSascha Wildner
100394324d3SSascha Wildner extern int ena_log_level;
101394324d3SSascha Wildner
102394324d3SSascha Wildner #define ena_trace_raw(level, fmt, args...) \
103394324d3SSascha Wildner do { \
104394324d3SSascha Wildner if (((level) & ena_log_level) != (level)) \
105394324d3SSascha Wildner break; \
10682a3fa28SBrad Hoffman kprintf(fmt, ##args); \
107394324d3SSascha Wildner } while (0)
108394324d3SSascha Wildner
109394324d3SSascha Wildner #define ena_trace(level, fmt, args...) \
11082a3fa28SBrad Hoffman ena_trace_raw(level, "%s() [TID:%p]: " \
11182a3fa28SBrad Hoffman fmt " \n", __func__, curthread, ##args)
112394324d3SSascha Wildner
113394324d3SSascha Wildner
114394324d3SSascha Wildner #define ena_trc_dbg(format, arg...) ena_trace(ENA_DBG, format, ##arg)
115394324d3SSascha Wildner #define ena_trc_info(format, arg...) ena_trace(ENA_INFO, format, ##arg)
116394324d3SSascha Wildner #define ena_trc_warn(format, arg...) ena_trace(ENA_WARNING, format, ##arg)
117394324d3SSascha Wildner #define ena_trc_err(format, arg...) ena_trace(ENA_ALERT, format, ##arg)
118394324d3SSascha Wildner
119394324d3SSascha Wildner #define unlikely(x) __predict_false(x)
120394324d3SSascha Wildner #define likely(x) __predict_true(x)
121394324d3SSascha Wildner
122394324d3SSascha Wildner #define __iomem
12382a3fa28SBrad Hoffman #define ____cacheline_aligned __cachealign
124394324d3SSascha Wildner
125394324d3SSascha Wildner #define MAX_ERRNO 4095
126394324d3SSascha Wildner #define IS_ERR_VALUE(x) unlikely((x) <= (unsigned long)MAX_ERRNO)
127394324d3SSascha Wildner
128394324d3SSascha Wildner #define ENA_ASSERT(cond, format, arg...) \
129394324d3SSascha Wildner do { \
130394324d3SSascha Wildner if (unlikely(!(cond))) { \
131394324d3SSascha Wildner ena_trc_err( \
132394324d3SSascha Wildner "Assert failed on %s:%s:%d:" format, \
133394324d3SSascha Wildner __FILE__, __func__, __LINE__, ##arg); \
134394324d3SSascha Wildner } \
135394324d3SSascha Wildner } while (0)
136394324d3SSascha Wildner
137394324d3SSascha Wildner #define ENA_WARN(cond, format, arg...) \
138394324d3SSascha Wildner do { \
139394324d3SSascha Wildner if (unlikely((cond))) { \
140394324d3SSascha Wildner ena_trc_warn(format, ##arg); \
141394324d3SSascha Wildner } \
142394324d3SSascha Wildner } while (0)
143394324d3SSascha Wildner
IS_ERR(const void * ptr)144394324d3SSascha Wildner static inline long IS_ERR(const void *ptr)
145394324d3SSascha Wildner {
146394324d3SSascha Wildner return IS_ERR_VALUE((unsigned long)ptr);
147394324d3SSascha Wildner }
148394324d3SSascha Wildner
ERR_PTR(long error)149394324d3SSascha Wildner static inline void *ERR_PTR(long error)
150394324d3SSascha Wildner {
151394324d3SSascha Wildner return (void *)error;
152394324d3SSascha Wildner }
153394324d3SSascha Wildner
PTR_ERR(const void * ptr)154394324d3SSascha Wildner static inline long PTR_ERR(const void *ptr)
155394324d3SSascha Wildner {
156394324d3SSascha Wildner return (long) ptr;
157394324d3SSascha Wildner }
158394324d3SSascha Wildner
159394324d3SSascha Wildner #define GENMASK(h, l) (((1U << ((h) - (l) + 1)) - 1) << (l))
160394324d3SSascha Wildner #define GENMASK_ULL(h, l) (((~0ULL) << (l)) & (~0ULL >> (64 - 1 - (h))))
161394324d3SSascha Wildner #define BIT(x) (1 << (x))
162394324d3SSascha Wildner
163394324d3SSascha Wildner #define ENA_ABORT() BUG()
164394324d3SSascha Wildner #define BUG() panic("ENA BUG")
165394324d3SSascha Wildner
166394324d3SSascha Wildner #define SZ_256 (256)
167394324d3SSascha Wildner #define SZ_4K (4096)
168394324d3SSascha Wildner
169394324d3SSascha Wildner #define ENA_COM_OK 0
170394324d3SSascha Wildner #define ENA_COM_FAULT EFAULT
171394324d3SSascha Wildner #define ENA_COM_INVAL EINVAL
172394324d3SSascha Wildner #define ENA_COM_NO_MEM ENOMEM
173394324d3SSascha Wildner #define ENA_COM_NO_SPACE ENOSPC
174394324d3SSascha Wildner #define ENA_COM_TRY_AGAIN -1
175394324d3SSascha Wildner #define ENA_COM_UNSUPPORTED EOPNOTSUPP
176394324d3SSascha Wildner #define ENA_COM_NO_DEVICE ENODEV
177394324d3SSascha Wildner #define ENA_COM_PERMISSION EPERM
178394324d3SSascha Wildner #define ENA_COM_TIMER_EXPIRED ETIMEDOUT
179394324d3SSascha Wildner
18082a3fa28SBrad Hoffman #define cputick2usec(t) (1000000*(t) / hz)
18182a3fa28SBrad Hoffman #define ENA_MSLEEP(x) do { \
18282a3fa28SBrad Hoffman int dummy; \
18382a3fa28SBrad Hoffman int wait_ticks = 1; \
18482a3fa28SBrad Hoffman \
18582a3fa28SBrad Hoffman tsleep(&dummy, 0, "ena", wait_ticks); \
18682a3fa28SBrad Hoffman } while (0)
187394324d3SSascha Wildner #define ENA_UDELAY(x) DELAY(x)
188394324d3SSascha Wildner #define ENA_GET_SYSTEM_TIMEOUT(timeout_us) \
18982a3fa28SBrad Hoffman ((long)cputick2usec(ticks) + (timeout_us))
19082a3fa28SBrad Hoffman #define ENA_TIME_EXPIRE(timeout) ((timeout) < (long)cputick2usec(ticks))
191394324d3SSascha Wildner #define ENA_MIGHT_SLEEP()
192394324d3SSascha Wildner
193394324d3SSascha Wildner #define min_t(type, _x, _y) ((type)(_x) < (type)(_y) ? (type)(_x) : (type)(_y))
194394324d3SSascha Wildner #define max_t(type, _x, _y) ((type)(_x) > (type)(_y) ? (type)(_x) : (type)(_y))
195394324d3SSascha Wildner
196394324d3SSascha Wildner #define ENA_MIN32(x,y) MIN(x, y)
197394324d3SSascha Wildner #define ENA_MIN16(x,y) MIN(x, y)
198394324d3SSascha Wildner #define ENA_MIN8(x,y) MIN(x, y)
199394324d3SSascha Wildner
200394324d3SSascha Wildner #define ENA_MAX32(x,y) MAX(x, y)
201394324d3SSascha Wildner #define ENA_MAX16(x,y) MAX(x, y)
202394324d3SSascha Wildner #define ENA_MAX8(x,y) MAX(x, y)
203394324d3SSascha Wildner
204394324d3SSascha Wildner /* Spinlock related methods */
20582a3fa28SBrad Hoffman #define ena_spinlock_t struct spinlock
206394324d3SSascha Wildner #define ENA_SPINLOCK_INIT(spinlock) \
20782a3fa28SBrad Hoffman spin_init(&(spinlock), "ena_spin")
208394324d3SSascha Wildner #define ENA_SPINLOCK_DESTROY(spinlock) \
209394324d3SSascha Wildner do { \
21082a3fa28SBrad Hoffman spin_uninit(&(spinlock)); \
211394324d3SSascha Wildner } while (0)
212394324d3SSascha Wildner #define ENA_SPINLOCK_LOCK(spinlock, flags) \
213394324d3SSascha Wildner do { \
214394324d3SSascha Wildner (void)(flags); \
21582a3fa28SBrad Hoffman spin_lock(&(spinlock)); \
216394324d3SSascha Wildner } while (0)
217394324d3SSascha Wildner #define ENA_SPINLOCK_UNLOCK(spinlock, flags) \
218394324d3SSascha Wildner do { \
219394324d3SSascha Wildner (void)(flags); \
22082a3fa28SBrad Hoffman spin_unlock(&(spinlock)); \
221394324d3SSascha Wildner } while (0)
222394324d3SSascha Wildner
223394324d3SSascha Wildner
224394324d3SSascha Wildner /* Wait queue related methods */
22582a3fa28SBrad Hoffman #define ena_wait_event_t struct { struct cv wq; struct lock lock; }
226394324d3SSascha Wildner #define ENA_WAIT_EVENT_INIT(waitqueue) \
227394324d3SSascha Wildner do { \
228394324d3SSascha Wildner cv_init(&((waitqueue).wq), "cv"); \
22982a3fa28SBrad Hoffman lockinit(&((waitqueue).lock), "wq", 0, LK_CANRECURSE); \
230394324d3SSascha Wildner } while (0)
231394324d3SSascha Wildner #define ENA_WAIT_EVENT_DESTROY(waitqueue) \
232394324d3SSascha Wildner do { \
233394324d3SSascha Wildner cv_destroy(&((waitqueue).wq)); \
23482a3fa28SBrad Hoffman lockuninit(&((waitqueue).lock)); \
235394324d3SSascha Wildner } while (0)
236394324d3SSascha Wildner #define ENA_WAIT_EVENT_CLEAR(waitqueue) \
23782a3fa28SBrad Hoffman cv_init(&((waitqueue).wq), (waitqueue).wq.cv_desc)
238394324d3SSascha Wildner #define ENA_WAIT_EVENT_WAIT(waitqueue, timeout_us) \
239394324d3SSascha Wildner do { \
24082a3fa28SBrad Hoffman lockmgr(&((waitqueue).lock), LK_EXCLUSIVE); \
24182a3fa28SBrad Hoffman cv_timedwait(&((waitqueue).wq), &((waitqueue).lock), \
242394324d3SSascha Wildner timeout_us * hz / 1000 / 1000 ); \
243*ce322efeSMatthew Dillon lockmgr(&((waitqueue).lock), LK_RELEASE); \
244394324d3SSascha Wildner } while (0)
245394324d3SSascha Wildner #define ENA_WAIT_EVENT_SIGNAL(waitqueue) cv_broadcast(&((waitqueue).wq))
246394324d3SSascha Wildner
247394324d3SSascha Wildner #define dma_addr_t bus_addr_t
248394324d3SSascha Wildner #define u8 uint8_t
249394324d3SSascha Wildner #define u16 uint16_t
250394324d3SSascha Wildner #define u32 uint32_t
251394324d3SSascha Wildner #define u64 uint64_t
252394324d3SSascha Wildner
25382a3fa28SBrad Hoffman #ifdef __x86_64__
25482a3fa28SBrad Hoffman #define mb() __asm volatile("mfence" ::: "memory")
25582a3fa28SBrad Hoffman #define wmb() __asm volatile("sfence" ::: "memory")
25682a3fa28SBrad Hoffman #define rmb() __asm volatile("lfence" ::: "memory")
25782a3fa28SBrad Hoffman #else
25882a3fa28SBrad Hoffman #define mb()
25982a3fa28SBrad Hoffman #define rmb()
26082a3fa28SBrad Hoffman #define wmb()
26182a3fa28SBrad Hoffman #endif
26282a3fa28SBrad Hoffman
263394324d3SSascha Wildner typedef struct {
264394324d3SSascha Wildner bus_addr_t paddr;
265394324d3SSascha Wildner caddr_t vaddr;
266394324d3SSascha Wildner bus_dma_tag_t tag;
267394324d3SSascha Wildner bus_dmamap_t map;
268394324d3SSascha Wildner bus_dma_segment_t seg;
269394324d3SSascha Wildner int nseg;
270394324d3SSascha Wildner } ena_mem_handle_t;
271394324d3SSascha Wildner
272394324d3SSascha Wildner struct ena_bus {
273394324d3SSascha Wildner bus_space_handle_t reg_bar_h;
274394324d3SSascha Wildner bus_space_tag_t reg_bar_t;
275394324d3SSascha Wildner bus_space_handle_t mem_bar_h;
276394324d3SSascha Wildner bus_space_tag_t mem_bar_t;
277394324d3SSascha Wildner };
278394324d3SSascha Wildner
279394324d3SSascha Wildner typedef uint32_t ena_atomic32_t;
280394324d3SSascha Wildner
281394324d3SSascha Wildner void ena_dmamap_callback(void *arg, bus_dma_segment_t *segs, int nseg,
282394324d3SSascha Wildner int error);
283394324d3SSascha Wildner int ena_dma_alloc(device_t dmadev, bus_size_t size, ena_mem_handle_t *dma,
284394324d3SSascha Wildner int mapflags);
285394324d3SSascha Wildner
286394324d3SSascha Wildner #define ENA_MEMCPY_TO_DEVICE_64(dst, src, size) \
287394324d3SSascha Wildner do { \
288394324d3SSascha Wildner int count, i; \
289394324d3SSascha Wildner volatile uint64_t *to = (volatile uint64_t *)(dst); \
290394324d3SSascha Wildner const uint64_t *from = (const uint64_t *)(src); \
291394324d3SSascha Wildner count = (size) / 8; \
292394324d3SSascha Wildner \
293394324d3SSascha Wildner for (i = 0; i < count; i++, from++, to++) \
294394324d3SSascha Wildner *to = *from; \
295394324d3SSascha Wildner } while (0)
296394324d3SSascha Wildner
29782a3fa28SBrad Hoffman #define ENA_MEM_ALLOC(dmadev, size) kmalloc(size, M_DEVBUF, M_NOWAIT | M_ZERO)
298394324d3SSascha Wildner #define ENA_MEM_ALLOC_NODE(dmadev, size, virt, node, dev_node) (virt = NULL)
29982a3fa28SBrad Hoffman #define ENA_MEM_FREE(dmadev, ptr) kfree(ptr, M_DEVBUF)
300394324d3SSascha Wildner #define ENA_MEM_ALLOC_COHERENT_NODE(dmadev, size, virt, phys, handle, node, \
301394324d3SSascha Wildner dev_node) \
302394324d3SSascha Wildner do { \
303394324d3SSascha Wildner ((virt) = NULL); \
304394324d3SSascha Wildner (void)(dev_node); \
305394324d3SSascha Wildner } while (0)
306394324d3SSascha Wildner
307394324d3SSascha Wildner #define ENA_MEM_ALLOC_COHERENT(dmadev, size, virt, phys, dma) \
308394324d3SSascha Wildner do { \
309394324d3SSascha Wildner ena_dma_alloc((dmadev), (size), &(dma), 0); \
310394324d3SSascha Wildner (virt) = (void *)(dma).vaddr; \
311394324d3SSascha Wildner (phys) = (dma).paddr; \
312394324d3SSascha Wildner } while (0)
313394324d3SSascha Wildner
314394324d3SSascha Wildner #define ENA_MEM_FREE_COHERENT(dmadev, size, virt, phys, dma) \
315394324d3SSascha Wildner do { \
316394324d3SSascha Wildner (void)size; \
317394324d3SSascha Wildner bus_dmamap_unload((dma).tag, (dma).map); \
318394324d3SSascha Wildner bus_dmamem_free((dma).tag, (virt), (dma).map); \
319394324d3SSascha Wildner bus_dma_tag_destroy((dma).tag); \
320394324d3SSascha Wildner (dma).tag = NULL; \
321394324d3SSascha Wildner (virt) = NULL; \
322394324d3SSascha Wildner } while (0)
323394324d3SSascha Wildner
324394324d3SSascha Wildner /* Register R/W methods */
325394324d3SSascha Wildner #define ENA_REG_WRITE32(bus, value, offset) \
326394324d3SSascha Wildner bus_space_write_4( \
327394324d3SSascha Wildner ((struct ena_bus*)bus)->reg_bar_t, \
328394324d3SSascha Wildner ((struct ena_bus*)bus)->reg_bar_h, \
329394324d3SSascha Wildner (bus_size_t)(offset), (value))
330394324d3SSascha Wildner
331394324d3SSascha Wildner #define ENA_REG_READ32(bus, offset) \
332394324d3SSascha Wildner bus_space_read_4( \
333394324d3SSascha Wildner ((struct ena_bus*)bus)->reg_bar_t, \
334394324d3SSascha Wildner ((struct ena_bus*)bus)->reg_bar_h, \
335394324d3SSascha Wildner (bus_size_t)(offset))
336394324d3SSascha Wildner
337394324d3SSascha Wildner #define ENA_DB_SYNC(mem_handle) bus_dmamap_sync((mem_handle)->tag, \
338394324d3SSascha Wildner (mem_handle)->map, BUS_DMASYNC_PREREAD)
339394324d3SSascha Wildner
340394324d3SSascha Wildner #define time_after(a,b) ((long)((unsigned long)(b) - (unsigned long)(a)) < 0)
341394324d3SSascha Wildner
342394324d3SSascha Wildner #define VLAN_HLEN sizeof(struct ether_vlan_header)
343394324d3SSascha Wildner #define CSUM_OFFLOAD (CSUM_IP|CSUM_TCP|CSUM_UDP)
344394324d3SSascha Wildner
345394324d3SSascha Wildner #if defined(__i386__) || defined(__amd64__)
346394324d3SSascha Wildner static __inline
prefetch(void * x)347394324d3SSascha Wildner void prefetch(void *x)
348394324d3SSascha Wildner {
349394324d3SSascha Wildner __asm volatile("prefetcht0 %0" :: "m" (*(unsigned long *)x));
350394324d3SSascha Wildner }
351394324d3SSascha Wildner #else
352394324d3SSascha Wildner #define prefetch(x)
353394324d3SSascha Wildner #endif
354394324d3SSascha Wildner
355394324d3SSascha Wildner /* DMA buffers access */
356394324d3SSascha Wildner #define dma_unmap_addr(p, name) ((p)->dma->name)
357394324d3SSascha Wildner #define dma_unmap_addr_set(p, name, v) (((p)->dma->name) = (v))
358394324d3SSascha Wildner #define dma_unmap_len(p, name) ((p)->name)
359394324d3SSascha Wildner #define dma_unmap_len_set(p, name, v) (((p)->name) = (v))
360394324d3SSascha Wildner
361394324d3SSascha Wildner #define memcpy_toio memcpy
362394324d3SSascha Wildner
363394324d3SSascha Wildner #define ATOMIC32_INC(I32_PTR) atomic_add_int(I32_PTR, 1)
364394324d3SSascha Wildner #define ATOMIC32_DEC(I32_PTR) atomic_add_int(I32_PTR, -1)
365394324d3SSascha Wildner #define ATOMIC32_READ(I32_PTR) atomic_load_acq_int(I32_PTR)
366394324d3SSascha Wildner #define ATOMIC32_SET(I32_PTR, VAL) atomic_store_rel_int(I32_PTR, VAL)
367394324d3SSascha Wildner
368394324d3SSascha Wildner #define barrier() __asm__ __volatile__("": : :"memory")
369394324d3SSascha Wildner #define ACCESS_ONCE(x) (*(volatile __typeof(x) *)&(x))
370394324d3SSascha Wildner #define READ_ONCE(x) ({ \
371394324d3SSascha Wildner __typeof(x) __var; \
372394324d3SSascha Wildner barrier(); \
373394324d3SSascha Wildner __var = ACCESS_ONCE(x); \
374394324d3SSascha Wildner barrier(); \
375394324d3SSascha Wildner __var; \
376394324d3SSascha Wildner })
377394324d3SSascha Wildner
378394324d3SSascha Wildner #include "ena_defs/ena_includes.h"
379394324d3SSascha Wildner
380394324d3SSascha Wildner #endif /* ENA_PLAT_H_ */
381