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