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