xref: /titanic_44/usr/src/uts/common/io/i40e/i40e_osdep.h (revision 8f179fb3a98d55af8ab2edfe08bf5669ca1f9d30)
1*f2f3bb8fSRobert Mustacchi /*
2*f2f3bb8fSRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*f2f3bb8fSRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*f2f3bb8fSRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*f2f3bb8fSRobert Mustacchi  * 1.0 of the CDDL.
6*f2f3bb8fSRobert Mustacchi  *
7*f2f3bb8fSRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*f2f3bb8fSRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*f2f3bb8fSRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*f2f3bb8fSRobert Mustacchi  */
11*f2f3bb8fSRobert Mustacchi 
12*f2f3bb8fSRobert Mustacchi /*
13*f2f3bb8fSRobert Mustacchi  * Copyright 2015 OmniTI Computer Consulting, Inc. All rights reserved.
14*f2f3bb8fSRobert Mustacchi  * Copyright 2016 Joyent, Inc.
15*f2f3bb8fSRobert Mustacchi  */
16*f2f3bb8fSRobert Mustacchi 
17*f2f3bb8fSRobert Mustacchi #ifndef _I40E_OSDEP_H
18*f2f3bb8fSRobert Mustacchi #define	_I40E_OSDEP_H
19*f2f3bb8fSRobert Mustacchi 
20*f2f3bb8fSRobert Mustacchi #ifdef __cplusplus
21*f2f3bb8fSRobert Mustacchi extern "C" {
22*f2f3bb8fSRobert Mustacchi #endif
23*f2f3bb8fSRobert Mustacchi 
24*f2f3bb8fSRobert Mustacchi #include <sys/types.h>
25*f2f3bb8fSRobert Mustacchi #include <sys/ddi.h>
26*f2f3bb8fSRobert Mustacchi #include <sys/sunddi.h>
27*f2f3bb8fSRobert Mustacchi #include <sys/pci_cap.h>
28*f2f3bb8fSRobert Mustacchi #include <sys/sysmacros.h>
29*f2f3bb8fSRobert Mustacchi 
30*f2f3bb8fSRobert Mustacchi #define	DEBUGOUT(S)				i40e_debug(NULL, 0, S)
31*f2f3bb8fSRobert Mustacchi #define	DEBUGOUT1(S, A)				i40e_debug(NULL, 0, S, A)
32*f2f3bb8fSRobert Mustacchi #define	DEBUGOUT2(S, A, B)			i40e_debug(NULL, 0, S, A, B)
33*f2f3bb8fSRobert Mustacchi #define	DEBUGOUT3(S, A, B, C)			i40e_debug(NULL, 0, S, A, B, C)
34*f2f3bb8fSRobert Mustacchi #define	DEBUGOUT4(S, A, B, C, D)		\
35*f2f3bb8fSRobert Mustacchi 	i40e_debug(NULL, 0, S, A, B, C, D)
36*f2f3bb8fSRobert Mustacchi #define	DEBUGOUT5(S, A, B, C, D, E)		\
37*f2f3bb8fSRobert Mustacchi 	i40e_debug(NULL, 0, S, A, B, C, D, E)
38*f2f3bb8fSRobert Mustacchi #define	DEBUGOUT6(S, A, B, C, D, E, F)		\
39*f2f3bb8fSRobert Mustacchi 	i40e_debug(NULL, 0, S, A, B, C, D, E, F)
40*f2f3bb8fSRobert Mustacchi #define	DEBUGOUT7(S, A, B, C, D, E, F, G)	\
41*f2f3bb8fSRobert Mustacchi 	i40e_debug(NULL, 0, S, A, B, C, D, E, F, G)
42*f2f3bb8fSRobert Mustacchi #define	DEBUGFUNC(F)				DEBUGOUT(F);
43*f2f3bb8fSRobert Mustacchi 
44*f2f3bb8fSRobert Mustacchi 
45*f2f3bb8fSRobert Mustacchi #define	UNREFERENCED_PARAMETER(x)		_NOTE(ARGUNUSED(x))
46*f2f3bb8fSRobert Mustacchi #define	UNREFERENCED_1PARAMETER(_p)		UNREFERENCED_PARAMETER(_p)
47*f2f3bb8fSRobert Mustacchi #define	UNREFERENCED_2PARAMETER(_p, _q)		_NOTE(ARGUNUSED(_p, _q))
48*f2f3bb8fSRobert Mustacchi #define	UNREFERENCED_3PARAMETER(_p, _q, _r)	_NOTE(ARGUNUSED(_p, _q, _r))
49*f2f3bb8fSRobert Mustacchi #define	UNREFERENCED_4PARAMETER(_p, _q, _r, _s)	_NOTE(ARGUNUSED(_p, _q, _r, _s))
50*f2f3bb8fSRobert Mustacchi 
51*f2f3bb8fSRobert Mustacchi #define	INLINE  inline
52*f2f3bb8fSRobert Mustacchi 
53*f2f3bb8fSRobert Mustacchi /*
54*f2f3bb8fSRobert Mustacchi  * The mdb dmod needs to use this code as well, but mdb already defines TRUE and
55*f2f3bb8fSRobert Mustacchi  * FALSE in the module API. Thus we don't define these if we're building the
56*f2f3bb8fSRobert Mustacchi  * dmod, as indicated by _I40E_MDB_DMOD. However, if we don't define these, then
57*f2f3bb8fSRobert Mustacchi  * the shared code will be upset.
58*f2f3bb8fSRobert Mustacchi  */
59*f2f3bb8fSRobert Mustacchi #ifndef _I40E_MDB_DMOD
60*f2f3bb8fSRobert Mustacchi #define	FALSE	B_FALSE
61*f2f3bb8fSRobert Mustacchi #define	false	B_FALSE
62*f2f3bb8fSRobert Mustacchi #define	TRUE	B_TRUE
63*f2f3bb8fSRobert Mustacchi #define	true	B_TRUE
64*f2f3bb8fSRobert Mustacchi #endif /* _I40E_MDB_DMOD */
65*f2f3bb8fSRobert Mustacchi 
66*f2f3bb8fSRobert Mustacchi 
67*f2f3bb8fSRobert Mustacchi #define	CPU_TO_LE16(o)	LE_16(o)
68*f2f3bb8fSRobert Mustacchi #define	CPU_TO_LE32(s)	LE_32(s)
69*f2f3bb8fSRobert Mustacchi #define	CPU_TO_LE64(h)	LE_64(h)
70*f2f3bb8fSRobert Mustacchi #define	LE16_TO_CPU(a)	LE_16(a)
71*f2f3bb8fSRobert Mustacchi #define	LE32_TO_CPU(c)	LE_32(c)
72*f2f3bb8fSRobert Mustacchi #define	LE64_TO_CPU(k)	LE_64(k)
73*f2f3bb8fSRobert Mustacchi 
74*f2f3bb8fSRobert Mustacchi #define	I40E_NTOHS(a)	ntohs(a)
75*f2f3bb8fSRobert Mustacchi #define	I40E_NTOHL(a)	ntohl(a)
76*f2f3bb8fSRobert Mustacchi #define	I40E_HTONS(a)	htons(a)
77*f2f3bb8fSRobert Mustacchi #define	I40E_HTONL(a)	htonl(a)
78*f2f3bb8fSRobert Mustacchi 
79*f2f3bb8fSRobert Mustacchi #define	i40e_memset(a, b, c, d)  memset((a), (b), (c))
80*f2f3bb8fSRobert Mustacchi #define	i40e_memcpy(a, b, c, d)  bcopy((b), (a), (c))
81*f2f3bb8fSRobert Mustacchi 
82*f2f3bb8fSRobert Mustacchi #define	i40e_usec_delay(x) drv_usecwait(x)
83*f2f3bb8fSRobert Mustacchi #define	i40e_msec_delay(x) drv_usecwait(1000 * (x))
84*f2f3bb8fSRobert Mustacchi 
85*f2f3bb8fSRobert Mustacchi #define	FIELD_SIZEOF(x, y) (sizeof (((x*)0)->y))
86*f2f3bb8fSRobert Mustacchi 
87*f2f3bb8fSRobert Mustacchi #define	BIT(a) 		(1UL << (a))
88*f2f3bb8fSRobert Mustacchi #define	BIT_ULL(a) 	(1ULL << (a))
89*f2f3bb8fSRobert Mustacchi 
90*f2f3bb8fSRobert Mustacchi typedef boolean_t	bool;
91*f2f3bb8fSRobert Mustacchi 
92*f2f3bb8fSRobert Mustacchi typedef uint8_t		u8;
93*f2f3bb8fSRobert Mustacchi typedef int8_t		s8;
94*f2f3bb8fSRobert Mustacchi typedef uint16_t	u16;
95*f2f3bb8fSRobert Mustacchi typedef int16_t		s16;
96*f2f3bb8fSRobert Mustacchi typedef uint32_t	u32;
97*f2f3bb8fSRobert Mustacchi typedef int32_t		s32;
98*f2f3bb8fSRobert Mustacchi typedef uint64_t	u64;
99*f2f3bb8fSRobert Mustacchi 
100*f2f3bb8fSRobert Mustacchi /* long string relief */
101*f2f3bb8fSRobert Mustacchi typedef enum i40e_status_code i40e_status;
102*f2f3bb8fSRobert Mustacchi 
103*f2f3bb8fSRobert Mustacchi #define	__le16  u16
104*f2f3bb8fSRobert Mustacchi #define	__le32  u32
105*f2f3bb8fSRobert Mustacchi #define	__le64  u64
106*f2f3bb8fSRobert Mustacchi #define	__be16  u16
107*f2f3bb8fSRobert Mustacchi #define	__be32  u32
108*f2f3bb8fSRobert Mustacchi #define	__be64  u64
109*f2f3bb8fSRobert Mustacchi 
110*f2f3bb8fSRobert Mustacchi /*
111*f2f3bb8fSRobert Mustacchi  * Most other systems use spin locks for interrupts. However, illumos always
112*f2f3bb8fSRobert Mustacchi  * uses a single kmutex_t for both and we decide what to do based on IPL (hint:
113*f2f3bb8fSRobert Mustacchi  * it's not going to be a true spin lock, we'll use an adaptive mutex).
114*f2f3bb8fSRobert Mustacchi  */
115*f2f3bb8fSRobert Mustacchi struct i40e_spinlock {
116*f2f3bb8fSRobert Mustacchi 	kmutex_t ispl_mutex;
117*f2f3bb8fSRobert Mustacchi };
118*f2f3bb8fSRobert Mustacchi 
119*f2f3bb8fSRobert Mustacchi /*
120*f2f3bb8fSRobert Mustacchi  * Note, while prefetch is strictly not present on all architectures, (it's an
121*f2f3bb8fSRobert Mustacchi  * SSE extension on i386), it is expected that the platforms provide it.
122*f2f3bb8fSRobert Mustacchi  */
123*f2f3bb8fSRobert Mustacchi #define	prefetch(x) prefetch_read_many(x)
124*f2f3bb8fSRobert Mustacchi 
125*f2f3bb8fSRobert Mustacchi struct i40e_osdep {
126*f2f3bb8fSRobert Mustacchi 	off_t			ios_reg_size;
127*f2f3bb8fSRobert Mustacchi 	ddi_acc_handle_t 	ios_reg_handle;
128*f2f3bb8fSRobert Mustacchi 	ddi_acc_handle_t 	ios_cfg_handle;
129*f2f3bb8fSRobert Mustacchi 	struct i40e		*ios_i40e;
130*f2f3bb8fSRobert Mustacchi };
131*f2f3bb8fSRobert Mustacchi 
132*f2f3bb8fSRobert Mustacchi /*
133*f2f3bb8fSRobert Mustacchi  * This structure and its members are defined by the common code. This means we
134*f2f3bb8fSRobert Mustacchi  * cannot structure prefix it, even if we want to.
135*f2f3bb8fSRobert Mustacchi  */
136*f2f3bb8fSRobert Mustacchi struct i40e_virt_mem {
137*f2f3bb8fSRobert Mustacchi 	void 	*va;
138*f2f3bb8fSRobert Mustacchi 	u32	size;
139*f2f3bb8fSRobert Mustacchi };
140*f2f3bb8fSRobert Mustacchi 
141*f2f3bb8fSRobert Mustacchi /*
142*f2f3bb8fSRobert Mustacchi  * The first three members of this structure are defined by the common code.
143*f2f3bb8fSRobert Mustacchi  * This means we cannot structure prefix them, even if we wanted to.
144*f2f3bb8fSRobert Mustacchi  */
145*f2f3bb8fSRobert Mustacchi struct i40e_dma_mem {
146*f2f3bb8fSRobert Mustacchi 	void			*va;	/* Virtual address. */
147*f2f3bb8fSRobert Mustacchi 	u64			pa;	/* Physical (DMA/Hardware) address. */
148*f2f3bb8fSRobert Mustacchi 	size_t			size;	/* Buffer size. */
149*f2f3bb8fSRobert Mustacchi 
150*f2f3bb8fSRobert Mustacchi 	/* illumos-private members */
151*f2f3bb8fSRobert Mustacchi 	ddi_acc_handle_t	idm_acc_handle;	/* Data access handle */
152*f2f3bb8fSRobert Mustacchi 	ddi_dma_handle_t	idm_dma_handle;	/* DMA handle */
153*f2f3bb8fSRobert Mustacchi 	uint32_t		idm_alignment;	/* Requested alignment */
154*f2f3bb8fSRobert Mustacchi };
155*f2f3bb8fSRobert Mustacchi 
156*f2f3bb8fSRobert Mustacchi struct i40e_hw; /* forward decl */
157*f2f3bb8fSRobert Mustacchi 
158*f2f3bb8fSRobert Mustacchi #define	OS_DEP(hw) ((struct i40e_osdep *)((hw)->back))
159*f2f3bb8fSRobert Mustacchi #define	i40e_read_pci_cfg(hw, reg) \
160*f2f3bb8fSRobert Mustacchi 	(pci_config_get16(OS_DEP(hw)->ios_cfg_handle, (reg)))
161*f2f3bb8fSRobert Mustacchi #define	i40e_write_pci_cfg(hw, reg, value) \
162*f2f3bb8fSRobert Mustacchi 	(pci_config_put16(OS_DEP(hw)->ios_cfg_handle, (reg), (value)))
163*f2f3bb8fSRobert Mustacchi 
164*f2f3bb8fSRobert Mustacchi /*
165*f2f3bb8fSRobert Mustacchi  * Intel expects that the symbol wr32 and rd32 be defined to something which can
166*f2f3bb8fSRobert Mustacchi  * read and write the 32-bit register in PCI space.
167*f2f3bb8fSRobert Mustacchi  *
168*f2f3bb8fSRobert Mustacchi  * To make it easier for readers and satisfy the general agreement that macros
169*f2f3bb8fSRobert Mustacchi  * should be in all capitals, we use our own versions of these macros.
170*f2f3bb8fSRobert Mustacchi  */
171*f2f3bb8fSRobert Mustacchi #define	wr32(hw, reg, value) \
172*f2f3bb8fSRobert Mustacchi 	ddi_put32(OS_DEP(hw)->ios_reg_handle, \
173*f2f3bb8fSRobert Mustacchi 	    (uint32_t *)((uintptr_t)(hw)->hw_addr + (reg)), (value))
174*f2f3bb8fSRobert Mustacchi #define	rd32(hw, reg) \
175*f2f3bb8fSRobert Mustacchi 	ddi_get32(OS_DEP(hw)->ios_reg_handle, \
176*f2f3bb8fSRobert Mustacchi 	    (uint32_t *)((uintptr_t)(hw)->hw_addr + (reg)))
177*f2f3bb8fSRobert Mustacchi #define	I40E_WRITE_REG	wr32
178*f2f3bb8fSRobert Mustacchi #define	I40E_READ_REG	rd32
179*f2f3bb8fSRobert Mustacchi 
180*f2f3bb8fSRobert Mustacchi /*
181*f2f3bb8fSRobert Mustacchi  * The use of GLGEN_STAT presumes that we're only using this file for a PF
182*f2f3bb8fSRobert Mustacchi  * driver. If we end up doing a VF driver, then we'll want to logically change
183*f2f3bb8fSRobert Mustacchi  * this.
184*f2f3bb8fSRobert Mustacchi  */
185*f2f3bb8fSRobert Mustacchi #define	i40e_flush(hw) (void) rd32(hw, I40E_GLGEN_STAT)
186*f2f3bb8fSRobert Mustacchi 
187*f2f3bb8fSRobert Mustacchi extern void i40e_debug(void *, u32, char *, ...);
188*f2f3bb8fSRobert Mustacchi extern boolean_t i40e_set_hw_bus_info(struct i40e_hw *);
189*f2f3bb8fSRobert Mustacchi 
190*f2f3bb8fSRobert Mustacchi #ifdef __cplusplus
191*f2f3bb8fSRobert Mustacchi }
192*f2f3bb8fSRobert Mustacchi #endif
193*f2f3bb8fSRobert Mustacchi 
194*f2f3bb8fSRobert Mustacchi #endif /* _I40E_OSDEP_H */
195