xref: /dflybsd-src/sys/dev/virtual/amazon/ena/ena-com/ena_plat.h (revision ce322efe5344f238527fef59d17065d686164116)
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