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