1*10187SKrishna.Elango@Sun.COM /* 2*10187SKrishna.Elango@Sun.COM * CDDL HEADER START 3*10187SKrishna.Elango@Sun.COM * 4*10187SKrishna.Elango@Sun.COM * The contents of this file are subject to the terms of the 5*10187SKrishna.Elango@Sun.COM * Common Development and Distribution License (the "License"). 6*10187SKrishna.Elango@Sun.COM * You may not use this file except in compliance with the License. 7*10187SKrishna.Elango@Sun.COM * 8*10187SKrishna.Elango@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*10187SKrishna.Elango@Sun.COM * or http://www.opensolaris.org/os/licensing. 10*10187SKrishna.Elango@Sun.COM * See the License for the specific language governing permissions 11*10187SKrishna.Elango@Sun.COM * and limitations under the License. 12*10187SKrishna.Elango@Sun.COM * 13*10187SKrishna.Elango@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 14*10187SKrishna.Elango@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*10187SKrishna.Elango@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 16*10187SKrishna.Elango@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 17*10187SKrishna.Elango@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 18*10187SKrishna.Elango@Sun.COM * 19*10187SKrishna.Elango@Sun.COM * CDDL HEADER END 20*10187SKrishna.Elango@Sun.COM */ 21*10187SKrishna.Elango@Sun.COM /* 22*10187SKrishna.Elango@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23*10187SKrishna.Elango@Sun.COM * Use is subject to license terms. 24*10187SKrishna.Elango@Sun.COM */ 25*10187SKrishna.Elango@Sun.COM 26*10187SKrishna.Elango@Sun.COM #ifndef _SYS_PCIEB_H 27*10187SKrishna.Elango@Sun.COM #define _SYS_PCIEB_H 28*10187SKrishna.Elango@Sun.COM 29*10187SKrishna.Elango@Sun.COM #ifdef __cplusplus 30*10187SKrishna.Elango@Sun.COM extern "C" { 31*10187SKrishna.Elango@Sun.COM #endif 32*10187SKrishna.Elango@Sun.COM 33*10187SKrishna.Elango@Sun.COM #if defined(DEBUG) 34*10187SKrishna.Elango@Sun.COM #define PCIEB_DEBUG pcieb_dbg 35*10187SKrishna.Elango@Sun.COM extern void pcieb_dbg(uint_t bit, dev_info_t *dip, char *fmt, ...); 36*10187SKrishna.Elango@Sun.COM #else /* DEBUG */ 37*10187SKrishna.Elango@Sun.COM #define PCIEB_DEBUG 0 && 38*10187SKrishna.Elango@Sun.COM #endif /* DEBUG */ 39*10187SKrishna.Elango@Sun.COM 40*10187SKrishna.Elango@Sun.COM typedef enum { /* same sequence as pcieb_debug_sym[] */ 41*10187SKrishna.Elango@Sun.COM /* 0 */ DBG_ATTACH, 42*10187SKrishna.Elango@Sun.COM /* 1 */ DBG_PWR, 43*10187SKrishna.Elango@Sun.COM /* 2 */ DBG_INTR 44*10187SKrishna.Elango@Sun.COM } pcieb_debug_bit_t; 45*10187SKrishna.Elango@Sun.COM 46*10187SKrishna.Elango@Sun.COM /* 47*10187SKrishna.Elango@Sun.COM * Intel specific register offsets with bit definitions. 48*10187SKrishna.Elango@Sun.COM */ 49*10187SKrishna.Elango@Sun.COM #define PCIEB_PX_CAPABILITY_ID 0x44 50*10187SKrishna.Elango@Sun.COM #define PCIEB_BRIDGE_CONF 0x40 51*10187SKrishna.Elango@Sun.COM 52*10187SKrishna.Elango@Sun.COM /* 53*10187SKrishna.Elango@Sun.COM * PCI/PCI-E Configuration register specific values. 54*10187SKrishna.Elango@Sun.COM */ 55*10187SKrishna.Elango@Sun.COM #define PX_PMODE 0x4000 /* PCI/PCIX Mode */ 56*10187SKrishna.Elango@Sun.COM #define PX_PFREQ_66 0x200 /* PCI clock frequency */ 57*10187SKrishna.Elango@Sun.COM #define PX_PFREQ_100 0x400 58*10187SKrishna.Elango@Sun.COM #define PX_PFREQ_133 0x600 59*10187SKrishna.Elango@Sun.COM #define PX_PMRE 0x80 /* Peer memory read enable */ 60*10187SKrishna.Elango@Sun.COM 61*10187SKrishna.Elango@Sun.COM /* 62*10187SKrishna.Elango@Sun.COM * Downstream delayed transaction resource partitioning. 63*10187SKrishna.Elango@Sun.COM */ 64*10187SKrishna.Elango@Sun.COM #define PX_ODTP 0x40 /* Max. of two entries PX and PCI */ 65*10187SKrishna.Elango@Sun.COM 66*10187SKrishna.Elango@Sun.COM /* 67*10187SKrishna.Elango@Sun.COM * Maximum upstream delayed transaction. 68*10187SKrishna.Elango@Sun.COM */ 69*10187SKrishna.Elango@Sun.COM #define PX_MDT_44 0x00 70*10187SKrishna.Elango@Sun.COM #define PX_MDT_11 0x01 71*10187SKrishna.Elango@Sun.COM #define PX_MDT_22 0x10 72*10187SKrishna.Elango@Sun.COM 73*10187SKrishna.Elango@Sun.COM 74*10187SKrishna.Elango@Sun.COM #define NUM_LOGICAL_SLOTS 32 75*10187SKrishna.Elango@Sun.COM #define PCIEB_RANGE_LEN 2 76*10187SKrishna.Elango@Sun.COM #define PCIEB_32BIT_IO 1 77*10187SKrishna.Elango@Sun.COM #define PCIEB_32bit_MEM 1 78*10187SKrishna.Elango@Sun.COM #define PCIEB_MEMGRAIN 0x100000 79*10187SKrishna.Elango@Sun.COM #define PCIEB_IOGRAIN 0x1000 80*10187SKrishna.Elango@Sun.COM 81*10187SKrishna.Elango@Sun.COM #define PCIEB_16bit_IOADDR(addr) ((uint16_t)(((uint8_t)(addr) & 0xF0) << 8)) 82*10187SKrishna.Elango@Sun.COM #define PCIEB_LADDR(lo, hi) (((uint16_t)(hi) << 16) | (uint16_t)(lo)) 83*10187SKrishna.Elango@Sun.COM #define PCIEB_32bit_MEMADDR(addr) (PCIEB_LADDR(0, ((uint16_t)(addr) & 0xFFF0))) 84*10187SKrishna.Elango@Sun.COM 85*10187SKrishna.Elango@Sun.COM /* 86*10187SKrishna.Elango@Sun.COM * The following typedef is used to represent an entry in the "ranges" 87*10187SKrishna.Elango@Sun.COM * property of a device node. 88*10187SKrishna.Elango@Sun.COM */ 89*10187SKrishna.Elango@Sun.COM typedef struct { 90*10187SKrishna.Elango@Sun.COM uint32_t child_high; 91*10187SKrishna.Elango@Sun.COM uint32_t child_mid; 92*10187SKrishna.Elango@Sun.COM uint32_t child_low; 93*10187SKrishna.Elango@Sun.COM uint32_t parent_high; 94*10187SKrishna.Elango@Sun.COM uint32_t parent_mid; 95*10187SKrishna.Elango@Sun.COM uint32_t parent_low; 96*10187SKrishna.Elango@Sun.COM uint32_t size_high; 97*10187SKrishna.Elango@Sun.COM uint32_t size_low; 98*10187SKrishna.Elango@Sun.COM } pcieb_ranges_t; 99*10187SKrishna.Elango@Sun.COM 100*10187SKrishna.Elango@Sun.COM typedef enum { HPC_NONE, HPC_PCIE, HPC_SHPC, HPC_OUTBAND } pcieb_hpc_type_t; 101*10187SKrishna.Elango@Sun.COM 102*10187SKrishna.Elango@Sun.COM typedef struct { 103*10187SKrishna.Elango@Sun.COM dev_info_t *pcieb_dip; 104*10187SKrishna.Elango@Sun.COM 105*10187SKrishna.Elango@Sun.COM /* Hotplug support */ 106*10187SKrishna.Elango@Sun.COM boolean_t pcieb_hotplug_capable; 107*10187SKrishna.Elango@Sun.COM pcieb_hpc_type_t pcieb_hpc_type; 108*10187SKrishna.Elango@Sun.COM 109*10187SKrishna.Elango@Sun.COM /* Interrupt support */ 110*10187SKrishna.Elango@Sun.COM ddi_intr_handle_t *pcieb_htable; /* Intr Handlers */ 111*10187SKrishna.Elango@Sun.COM int pcieb_htable_size; /* htable size */ 112*10187SKrishna.Elango@Sun.COM int pcieb_intr_count; /* Num of Intr */ 113*10187SKrishna.Elango@Sun.COM uint_t pcieb_intr_priority; /* Intr Priority */ 114*10187SKrishna.Elango@Sun.COM int pcieb_intr_type; /* (MSI | FIXED) */ 115*10187SKrishna.Elango@Sun.COM int pcieb_isr_tab[4]; /* MSI source offset */ 116*10187SKrishna.Elango@Sun.COM 117*10187SKrishna.Elango@Sun.COM uint_t pcieb_soft_state; 118*10187SKrishna.Elango@Sun.COM int pcieb_init_flags; 119*10187SKrishna.Elango@Sun.COM kmutex_t pcieb_mutex; /* Soft state mutex */ 120*10187SKrishna.Elango@Sun.COM kmutex_t pcieb_intr_mutex; /* Intr handler mutex */ 121*10187SKrishna.Elango@Sun.COM kmutex_t pcieb_err_mutex; /* Error mutex */ 122*10187SKrishna.Elango@Sun.COM kmutex_t pcieb_peek_poke_mutex; /* Peekpoke mutex */ 123*10187SKrishna.Elango@Sun.COM 124*10187SKrishna.Elango@Sun.COM /* FMA */ 125*10187SKrishna.Elango@Sun.COM boolean_t pcieb_no_aer_msi; 126*10187SKrishna.Elango@Sun.COM ddi_iblock_cookie_t pcieb_fm_ibc; 127*10187SKrishna.Elango@Sun.COM } pcieb_devstate_t; 128*10187SKrishna.Elango@Sun.COM 129*10187SKrishna.Elango@Sun.COM /* 130*10187SKrishna.Elango@Sun.COM * soft state pointer 131*10187SKrishna.Elango@Sun.COM */ 132*10187SKrishna.Elango@Sun.COM extern void *pcieb_state; 133*10187SKrishna.Elango@Sun.COM 134*10187SKrishna.Elango@Sun.COM /* soft state flags */ 135*10187SKrishna.Elango@Sun.COM #define PCIEB_SOFT_STATE_CLOSED 0x00 136*10187SKrishna.Elango@Sun.COM #define PCIEB_SOFT_STATE_OPEN 0x01 137*10187SKrishna.Elango@Sun.COM #define PCIEB_SOFT_STATE_OPEN_EXCL 0x02 138*10187SKrishna.Elango@Sun.COM 139*10187SKrishna.Elango@Sun.COM /* init flags */ 140*10187SKrishna.Elango@Sun.COM #define PCIEB_INIT_MUTEX 0x01 141*10187SKrishna.Elango@Sun.COM #define PCIEB_INIT_HTABLE 0x02 142*10187SKrishna.Elango@Sun.COM #define PCIEB_INIT_ALLOC 0x04 143*10187SKrishna.Elango@Sun.COM #define PCIEB_INIT_HANDLER 0x08 144*10187SKrishna.Elango@Sun.COM #define PCIEB_INIT_ENABLE 0x10 145*10187SKrishna.Elango@Sun.COM #define PCIEB_INIT_BLOCK 0x20 146*10187SKrishna.Elango@Sun.COM #define PCIEB_INIT_FM 0x40 147*10187SKrishna.Elango@Sun.COM 148*10187SKrishna.Elango@Sun.COM #define PCIEB_INTR_SRC_UNKNOWN 0x0 /* must be 0 */ 149*10187SKrishna.Elango@Sun.COM #define PCIEB_INTR_SRC_HP 0x1 150*10187SKrishna.Elango@Sun.COM #define PCIEB_INTR_SRC_PME 0x2 151*10187SKrishna.Elango@Sun.COM #define PCIEB_INTR_SRC_AER 0x4 152*10187SKrishna.Elango@Sun.COM 153*10187SKrishna.Elango@Sun.COM /* 154*10187SKrishna.Elango@Sun.COM * Need to put vendor ids in a common file and not platform specific files 155*10187SKrishna.Elango@Sun.COM * as is done today. Until then putting this vendor id define here. 156*10187SKrishna.Elango@Sun.COM */ 157*10187SKrishna.Elango@Sun.COM #define NVIDIA_VENDOR_ID 0x10de /* Nvidia Vendor Id */ 158*10187SKrishna.Elango@Sun.COM 159*10187SKrishna.Elango@Sun.COM #ifdef BCM_SW_WORKAROUNDS 160*10187SKrishna.Elango@Sun.COM 161*10187SKrishna.Elango@Sun.COM /* Workaround for address space limitation in Broadcom 5714/5715 */ 162*10187SKrishna.Elango@Sun.COM #define PCIEB_ADDR_LIMIT_LO 0ull 163*10187SKrishna.Elango@Sun.COM #define PCIEB_ADDR_LIMIT_HI ((1ull << 40) - 1) 164*10187SKrishna.Elango@Sun.COM 165*10187SKrishna.Elango@Sun.COM #endif /* BCM_SW_WORKAROUNDS */ 166*10187SKrishna.Elango@Sun.COM 167*10187SKrishna.Elango@Sun.COM /* 168*10187SKrishna.Elango@Sun.COM * The following values are used to initialize the cache line size 169*10187SKrishna.Elango@Sun.COM * and latency timer registers for PCI, PCI-X and PCIe2PCI devices. 170*10187SKrishna.Elango@Sun.COM */ 171*10187SKrishna.Elango@Sun.COM #define PCIEB_CACHE_LINE_SIZE 0x10 /* 64 bytes in # of DWORDs */ 172*10187SKrishna.Elango@Sun.COM #define PCIEB_LATENCY_TIMER 0x40 /* 64 PCI cycles */ 173*10187SKrishna.Elango@Sun.COM 174*10187SKrishna.Elango@Sun.COM extern void pcieb_set_pci_perf_parameters(dev_info_t *dip, 175*10187SKrishna.Elango@Sun.COM ddi_acc_handle_t config_handle); 176*10187SKrishna.Elango@Sun.COM extern void pcieb_plat_attach_workaround(dev_info_t *dip); 177*10187SKrishna.Elango@Sun.COM extern void pcieb_plat_intr_attach(pcieb_devstate_t *pcieb); 178*10187SKrishna.Elango@Sun.COM extern void pcieb_plat_initchild(dev_info_t *child); 179*10187SKrishna.Elango@Sun.COM extern void pcieb_plat_uninitchild(dev_info_t *child); 180*10187SKrishna.Elango@Sun.COM extern void pcieb_plat_ioctl_hotplug(dev_info_t *dip, int rv, int cmd); 181*10187SKrishna.Elango@Sun.COM extern int pcieb_plat_ctlops(dev_info_t *rdip, ddi_ctl_enum_t ctlop, 182*10187SKrishna.Elango@Sun.COM void *arg); 183*10187SKrishna.Elango@Sun.COM extern int pcieb_plat_pcishpc_probe(dev_info_t *dip, 184*10187SKrishna.Elango@Sun.COM ddi_acc_handle_t config_handle); 185*10187SKrishna.Elango@Sun.COM extern int pcieb_plat_peekpoke(dev_info_t *dip, dev_info_t *rdip, 186*10187SKrishna.Elango@Sun.COM ddi_ctl_enum_t ctlop, void *arg, void *result); 187*10187SKrishna.Elango@Sun.COM extern int pcieb_plat_intr_ops(dev_info_t *dip, dev_info_t *rdip, 188*10187SKrishna.Elango@Sun.COM ddi_intr_op_t intr_op, ddi_intr_handle_impl_t *hdlp, void *result); 189*10187SKrishna.Elango@Sun.COM extern boolean_t pcieb_plat_msi_supported(dev_info_t *dip); 190*10187SKrishna.Elango@Sun.COM extern boolean_t pcieb_plat_pwr_disable(dev_info_t *dip); 191*10187SKrishna.Elango@Sun.COM 192*10187SKrishna.Elango@Sun.COM #if defined(__i386) || defined(__amd64) 193*10187SKrishna.Elango@Sun.COM extern void pcieb_intel_error_workaround(dev_info_t *dip); 194*10187SKrishna.Elango@Sun.COM extern void pcieb_intel_serr_workaround(dev_info_t *dip, boolean_t mcheck); 195*10187SKrishna.Elango@Sun.COM extern void pcieb_intel_rber_workaround(dev_info_t *dip); 196*10187SKrishna.Elango@Sun.COM extern void pcieb_intel_sw_workaround(dev_info_t *dip); 197*10187SKrishna.Elango@Sun.COM extern void pcieb_intel_mps_workaround(dev_info_t *dip); 198*10187SKrishna.Elango@Sun.COM extern void pcieb_init_osc(dev_info_t *dip); 199*10187SKrishna.Elango@Sun.COM extern void pcieb_peekpoke_cb(dev_info_t *, ddi_fm_error_t *); 200*10187SKrishna.Elango@Sun.COM extern int pcishpc_init(dev_info_t *dip); 201*10187SKrishna.Elango@Sun.COM extern int pcishpc_uninit(dev_info_t *dip); 202*10187SKrishna.Elango@Sun.COM extern int pcishpc_intr(dev_info_t *dip); 203*10187SKrishna.Elango@Sun.COM #endif /* defined(__i386) || defined(__amd64) */ 204*10187SKrishna.Elango@Sun.COM 205*10187SKrishna.Elango@Sun.COM #ifdef PX_PLX 206*10187SKrishna.Elango@Sun.COM extern void pcieb_attach_plx_workarounds(pcieb_devstate_t *pcieb); 207*10187SKrishna.Elango@Sun.COM extern int pcieb_init_plx_workarounds(pcieb_devstate_t *pcieb, 208*10187SKrishna.Elango@Sun.COM dev_info_t *child); 209*10187SKrishna.Elango@Sun.COM #endif /* PX_PLX */ 210*10187SKrishna.Elango@Sun.COM 211*10187SKrishna.Elango@Sun.COM #ifdef __cplusplus 212*10187SKrishna.Elango@Sun.COM } 213*10187SKrishna.Elango@Sun.COM #endif 214*10187SKrishna.Elango@Sun.COM 215*10187SKrishna.Elango@Sun.COM #endif /* _SYS_PCIEB_H */ 216