xref: /illumos-gate/usr/src/uts/common/io/igc/igc_osdep.h (revision 6bbbd442)
1*6bbbd442SRobert Mustacchi /*
2*6bbbd442SRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*6bbbd442SRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*6bbbd442SRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*6bbbd442SRobert Mustacchi  * 1.0 of the CDDL.
6*6bbbd442SRobert Mustacchi  *
7*6bbbd442SRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*6bbbd442SRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*6bbbd442SRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*6bbbd442SRobert Mustacchi  */
11*6bbbd442SRobert Mustacchi 
12*6bbbd442SRobert Mustacchi /*
13*6bbbd442SRobert Mustacchi  * Copyright 2024 Oxide Computer Company
14*6bbbd442SRobert Mustacchi  */
15*6bbbd442SRobert Mustacchi 
16*6bbbd442SRobert Mustacchi #ifndef _IGC_OSDEP_H
17*6bbbd442SRobert Mustacchi #define	_IGC_OSDEP_H
18*6bbbd442SRobert Mustacchi 
19*6bbbd442SRobert Mustacchi /*
20*6bbbd442SRobert Mustacchi  * Definitions that are required for the igc core code.
21*6bbbd442SRobert Mustacchi  */
22*6bbbd442SRobert Mustacchi 
23*6bbbd442SRobert Mustacchi #ifdef __cplusplus
24*6bbbd442SRobert Mustacchi extern "C" {
25*6bbbd442SRobert Mustacchi #endif
26*6bbbd442SRobert Mustacchi 
27*6bbbd442SRobert Mustacchi /*
28*6bbbd442SRobert Mustacchi  * The common code requires the following headers.
29*6bbbd442SRobert Mustacchi  */
30*6bbbd442SRobert Mustacchi #include <sys/stdbool.h>
31*6bbbd442SRobert Mustacchi #include <sys/sunddi.h>
32*6bbbd442SRobert Mustacchi 
33*6bbbd442SRobert Mustacchi /*
34*6bbbd442SRobert Mustacchi  * It requires the following due to what we have declared.
35*6bbbd442SRobert Mustacchi  */
36*6bbbd442SRobert Mustacchi #include <sys/types.h>
37*6bbbd442SRobert Mustacchi #include <sys/ddi.h>
38*6bbbd442SRobert Mustacchi #include <sys/bitext.h>
39*6bbbd442SRobert Mustacchi 
40*6bbbd442SRobert Mustacchi /*
41*6bbbd442SRobert Mustacchi  * We redeclare the forward struct igc_hw here because this is required to be
42*6bbbd442SRobert Mustacchi  * included for igc_hw.h.
43*6bbbd442SRobert Mustacchi  */
44*6bbbd442SRobert Mustacchi struct igc_hw;
45*6bbbd442SRobert Mustacchi 
46*6bbbd442SRobert Mustacchi /*
47*6bbbd442SRobert Mustacchi  * The following typedefs allow for the types in the core code to be defined in
48*6bbbd442SRobert Mustacchi  * terms of types that we actually use.
49*6bbbd442SRobert Mustacchi  */
50*6bbbd442SRobert Mustacchi typedef uint8_t u8;
51*6bbbd442SRobert Mustacchi typedef uint16_t u16;
52*6bbbd442SRobert Mustacchi typedef uint32_t u32;
53*6bbbd442SRobert Mustacchi typedef uint64_t u64;
54*6bbbd442SRobert Mustacchi typedef int32_t s32;
55*6bbbd442SRobert Mustacchi typedef uint16_t __le16;
56*6bbbd442SRobert Mustacchi typedef uint32_t __le32;
57*6bbbd442SRobert Mustacchi typedef uint64_t __le64;
58*6bbbd442SRobert Mustacchi 
59*6bbbd442SRobert Mustacchi /*
60*6bbbd442SRobert Mustacchi  * Register read and write APIs. While these are in all caps because they are
61*6bbbd442SRobert Mustacchi  * conventionally macros, we implement them as functions in igc_osdep.c.
62*6bbbd442SRobert Mustacchi  */
63*6bbbd442SRobert Mustacchi extern uint32_t IGC_READ_REG(struct igc_hw *, uint32_t);
64*6bbbd442SRobert Mustacchi extern void IGC_WRITE_REG(struct igc_hw *, uint32_t, uint32_t);
65*6bbbd442SRobert Mustacchi extern void IGC_WRITE_REG_ARRAY(struct igc_hw *, uint32_t, uint32_t, uint32_t);
66*6bbbd442SRobert Mustacchi 
67*6bbbd442SRobert Mustacchi /*
68*6bbbd442SRobert Mustacchi  * This is the implementation of a flush command which forces certain PCIe
69*6bbbd442SRobert Mustacchi  * transaction ordering to complete.
70*6bbbd442SRobert Mustacchi  */
71*6bbbd442SRobert Mustacchi #define	IGC_WRITE_FLUSH(hw)	IGC_READ_REG(hw, IGC_STATUS)
72*6bbbd442SRobert Mustacchi 
73*6bbbd442SRobert Mustacchi /*
74*6bbbd442SRobert Mustacchi  * Delay variants. The semantics in the common code and Linux use non-sleeping
75*6bbbd442SRobert Mustacchi  * delay variants. It's not really clear that we should be spinning for
76*6bbbd442SRobert Mustacchi  * miliseconds, but for now, that's what we end up doing.
77*6bbbd442SRobert Mustacchi  */
78*6bbbd442SRobert Mustacchi #define	usec_delay(x)		drv_usecwait(x)
79*6bbbd442SRobert Mustacchi #define	usec_delay_irq(x)	drv_usecwait(x)
80*6bbbd442SRobert Mustacchi #define	msec_delay(x)		drv_usecwait((x) * 1000)
81*6bbbd442SRobert Mustacchi #define	msec_delay_irq(x)	drv_usecwait((x) * 1000)
82*6bbbd442SRobert Mustacchi 
83*6bbbd442SRobert Mustacchi /*
84*6bbbd442SRobert Mustacchi  * Debugging macros that the common code expects to exist. Because of how these
85*6bbbd442SRobert Mustacchi  * are used, we need to define something lest we generate empty body warnings.
86*6bbbd442SRobert Mustacchi  */
87*6bbbd442SRobert Mustacchi extern void igc_core_log(struct igc_hw *, const char *, ...);
88*6bbbd442SRobert Mustacchi #define	DEBUGOUT(str)		igc_core_log(hw, str)
89*6bbbd442SRobert Mustacchi #define	DEBUGOUT1(str, d1)	igc_core_log(hw, str, d1)
90*6bbbd442SRobert Mustacchi #define	DEBUGOUT2(str, d1, d2)	igc_core_log(hw, str, d1, d2)
91*6bbbd442SRobert Mustacchi #define	DEBUGFUNC(str)		igc_core_log(hw, str)
92*6bbbd442SRobert Mustacchi 
93*6bbbd442SRobert Mustacchi /*
94*6bbbd442SRobert Mustacchi  * The following defines registers or register values that should be defined by
95*6bbbd442SRobert Mustacchi  * the core code, but are not right now. As such, we define them here to
96*6bbbd442SRobert Mustacchi  * minimize the diffs that are required in the core code.
97*6bbbd442SRobert Mustacchi  */
98*6bbbd442SRobert Mustacchi 
99*6bbbd442SRobert Mustacchi /*
100*6bbbd442SRobert Mustacchi  * Used in the IGC_EECD register to indicate that a flash device is present.
101*6bbbd442SRobert Mustacchi  */
102*6bbbd442SRobert Mustacchi #define	IGC_EECD_EE_DET		(1 << 19)
103*6bbbd442SRobert Mustacchi 
104*6bbbd442SRobert Mustacchi /*
105*6bbbd442SRobert Mustacchi  * Starting positions of the IVAR queue regions.
106*6bbbd442SRobert Mustacchi  */
107*6bbbd442SRobert Mustacchi #define	IGC_IVAR_RX0_START	0
108*6bbbd442SRobert Mustacchi #define	IGC_IVAR_TX0_START	8
109*6bbbd442SRobert Mustacchi #define	IGC_IVAR_RX1_START	16
110*6bbbd442SRobert Mustacchi #define	IGC_IVAR_TX1_START	24
111*6bbbd442SRobert Mustacchi #define	IGC_IVAR_ENT_LEN	8
112*6bbbd442SRobert Mustacchi 
113*6bbbd442SRobert Mustacchi /*
114*6bbbd442SRobert Mustacchi  * The I225 has the exact same LED controls that the other parts have. There are
115*6bbbd442SRobert Mustacchi  * three LEDs defined in the IC which are initialized by firmware and controlled
116*6bbbd442SRobert Mustacchi  * through the classic LEDCTL register just like igb/e1000g. While the register
117*6bbbd442SRobert Mustacchi  * is in igc_regs.h, the actual values for the modes in igc_defines.h do not
118*6bbbd442SRobert Mustacchi  * match the I225 Ethernet Controller Datasheet. They match older parts without
119*6bbbd442SRobert Mustacchi  * 2.5 GbE support. See I225/6 Datasheet v2.6.7 Section 3.4 'Configurable LED
120*6bbbd442SRobert Mustacchi  * Outputs'.
121*6bbbd442SRobert Mustacchi  */
122*6bbbd442SRobert Mustacchi typedef enum {
123*6bbbd442SRobert Mustacchi 	I225_LED_M_ON	= 0,
124*6bbbd442SRobert Mustacchi 	I225_LED_M_OFF,
125*6bbbd442SRobert Mustacchi 	I225_LED_M_LINK_UP,
126*6bbbd442SRobert Mustacchi 	I225_LED_M_FILTER_ACT,
127*6bbbd442SRobert Mustacchi 	I225_LED_M_LINK_ACT,
128*6bbbd442SRobert Mustacchi 	I225_LED_M_LINK_10,
129*6bbbd442SRobert Mustacchi 	I225_LED_M_LINK_100,
130*6bbbd442SRobert Mustacchi 	I225_LED_M_LINK_1000,
131*6bbbd442SRobert Mustacchi 	I225_LED_M_LINK_2500,
132*6bbbd442SRobert Mustacchi 	I225_LED_M_SDP,
133*6bbbd442SRobert Mustacchi 	I225_LED_M_PAUSE,
134*6bbbd442SRobert Mustacchi 	I225_LED_M_ACT,
135*6bbbd442SRobert Mustacchi 	I225_LED_M_LINK_10_100,
136*6bbbd442SRobert Mustacchi 	I225_LED_M_LINK_100_1000,
137*6bbbd442SRobert Mustacchi 	I225_LED_M_LINK_1000_2500,
138*6bbbd442SRobert Mustacchi 	I225_LED_M_LINK_100_2500,
139*6bbbd442SRobert Mustacchi } i225_led_mode_t;
140*6bbbd442SRobert Mustacchi 
141*6bbbd442SRobert Mustacchi /*
142*6bbbd442SRobert Mustacchi  * The LED registers are organized into three groups that repeat. Register
143*6bbbd442SRobert Mustacchi  * manipulation functions are defined in igc.c. The following are constants for
144*6bbbd442SRobert Mustacchi  * the various registers.
145*6bbbd442SRobert Mustacchi  */
146*6bbbd442SRobert Mustacchi #define	IGC_I225_NLEDS			3
147*6bbbd442SRobert Mustacchi #define	IGC_LEDCTL_GLOB_BLINK_200MS	0
148*6bbbd442SRobert Mustacchi #define	IGC_LEDCTL_GLOB_BLINK_83MS	1
149*6bbbd442SRobert Mustacchi 
150*6bbbd442SRobert Mustacchi /*
151*6bbbd442SRobert Mustacchi  * IEEE MMD Status register 7.33 access. These definitions are done in the style
152*6bbbd442SRobert Mustacchi  * of igc_defines.h, where this phy is missing. We should eventually update the
153*6bbbd442SRobert Mustacchi  * mii layer headers to know about this. See IEEE Table 45-386 'MultiGBASE-T AN
154*6bbbd442SRobert Mustacchi  * status 1 register'.
155*6bbbd442SRobert Mustacchi  */
156*6bbbd442SRobert Mustacchi #define	ANEG_MULTIGBT_AN_STS1		0x0021 /* MULTI GBT Status 1 register */
157*6bbbd442SRobert Mustacchi #define	MMD_AN_STS1_LP_40T_FRT		(1 << 0)
158*6bbbd442SRobert Mustacchi #define	MMD_AN_STS1_LP_10T_FRT		(1 << 1)
159*6bbbd442SRobert Mustacchi #define	MMD_AN_STS1_LP_25T_FRT		(1 << 2)
160*6bbbd442SRobert Mustacchi #define	MMD_AN_STS1_LP_2P5T_FRT		(1 << 3)
161*6bbbd442SRobert Mustacchi #define	MMD_AN_STS1_LP_5T_FRT		(1 << 4)
162*6bbbd442SRobert Mustacchi #define	MMD_AN_STS1_LP_2P5T_CAP		(1 << 5)
163*6bbbd442SRobert Mustacchi #define	MMD_AN_STS1_LP_5T_CAP		(1 << 6)
164*6bbbd442SRobert Mustacchi #define	MMD_AN_STS1_LP_25T_CAP		(1 << 7)
165*6bbbd442SRobert Mustacchi #define	MMD_AN_STS1_LP_40T_CAP		(1 << 8)
166*6bbbd442SRobert Mustacchi #define	MMD_AN_STS1_LP_10T_PMA		(1 << 9)
167*6bbbd442SRobert Mustacchi #define	MMD_AN_STS1_LP_LOOP_TIME	(1 << 10)
168*6bbbd442SRobert Mustacchi #define	MMD_AN_STS1_LP_10T_CAP		(1 << 11)
169*6bbbd442SRobert Mustacchi #define	MMD_AN_STS1_LP_REM_STS		(1 << 12)
170*6bbbd442SRobert Mustacchi #define	MMD_AN_STS1_LP_LOC_STS		(1 << 13)
171*6bbbd442SRobert Mustacchi #define	MMD_AN_STS1_LP_MSC_RES		(1 << 14)
172*6bbbd442SRobert Mustacchi #define	MMD_AN_STS1_LP_MSC_FLT		(1 << 15)
173*6bbbd442SRobert Mustacchi 
174*6bbbd442SRobert Mustacchi /*
175*6bbbd442SRobert Mustacchi  * Reserved bits in the RXDCTL register that must be preserved. The I210
176*6bbbd442SRobert Mustacchi  * datasheet indicates that it leverages bits 24:21 and then 31:27. There are
177*6bbbd442SRobert Mustacchi  * other reserved portions by they are explicitly write 0.
178*6bbbd442SRobert Mustacchi  */
179*6bbbd442SRobert Mustacchi #define	IGC_RXDCTL_PRESERVE	0xf9e00000
180*6bbbd442SRobert Mustacchi 
181*6bbbd442SRobert Mustacchi /*
182*6bbbd442SRobert Mustacchi  * Missing setters for the various prefetch, host, and write-back thresholds.
183*6bbbd442SRobert Mustacchi  */
184*6bbbd442SRobert Mustacchi #define	IGC_RXDCTL_SET_PTHRESH(r, v)	bitset32(r, 4, 0, v)
185*6bbbd442SRobert Mustacchi #define	IGC_RXDCTL_SET_HTHRESH(r, v)	bitset32(r, 12, 8, v)
186*6bbbd442SRobert Mustacchi #define	IGC_RXDCTL_SET_WTHRESH(r, v)	bitset32(r, 20, 16, v)
187*6bbbd442SRobert Mustacchi 
188*6bbbd442SRobert Mustacchi /*
189*6bbbd442SRobert Mustacchi  * Missing setters for the tx varaint. We assume that this uses the shorter I210
190*6bbbd442SRobert Mustacchi  * 5-bit range as opposed to the I217 6-bit range. Given we don't set anything
191*6bbbd442SRobert Mustacchi  * much higher than this, this is the best we can do. In general this is more
192*6bbbd442SRobert Mustacchi  * I210-like than I217-like.
193*6bbbd442SRobert Mustacchi  */
194*6bbbd442SRobert Mustacchi #define	IGC_TXDCTL_SET_PTHRESH(r, v)	bitset32(r, 4, 0, v)
195*6bbbd442SRobert Mustacchi #define	IGC_TXDCTL_SET_HTHRESH(r, v)	bitset32(r, 13, 8, v)
196*6bbbd442SRobert Mustacchi #define	IGC_TXDCTL_SET_WTHRESH(r, v)	bitset32(r, 20, 16, v)
197*6bbbd442SRobert Mustacchi 
198*6bbbd442SRobert Mustacchi #ifdef __cplusplus
199*6bbbd442SRobert Mustacchi }
200*6bbbd442SRobert Mustacchi #endif
201*6bbbd442SRobert Mustacchi 
202*6bbbd442SRobert Mustacchi #endif /* _IGC_OSDEP_H */
203