110187SKrishna.Elango@Sun.COM /* 210187SKrishna.Elango@Sun.COM * CDDL HEADER START 310187SKrishna.Elango@Sun.COM * 410187SKrishna.Elango@Sun.COM * The contents of this file are subject to the terms of the 510187SKrishna.Elango@Sun.COM * Common Development and Distribution License (the "License"). 610187SKrishna.Elango@Sun.COM * You may not use this file except in compliance with the License. 710187SKrishna.Elango@Sun.COM * 810187SKrishna.Elango@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 910187SKrishna.Elango@Sun.COM * or http://www.opensolaris.org/os/licensing. 1010187SKrishna.Elango@Sun.COM * See the License for the specific language governing permissions 1110187SKrishna.Elango@Sun.COM * and limitations under the License. 1210187SKrishna.Elango@Sun.COM * 1310187SKrishna.Elango@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 1410187SKrishna.Elango@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1510187SKrishna.Elango@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 1610187SKrishna.Elango@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 1710187SKrishna.Elango@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 1810187SKrishna.Elango@Sun.COM * 1910187SKrishna.Elango@Sun.COM * CDDL HEADER END 2010187SKrishna.Elango@Sun.COM */ 2110187SKrishna.Elango@Sun.COM /* 22*12330SDaniel.Ice@Sun.COM * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 2310187SKrishna.Elango@Sun.COM */ 2410187SKrishna.Elango@Sun.COM 2510187SKrishna.Elango@Sun.COM #ifndef _SYS_PCIEB_H 2610187SKrishna.Elango@Sun.COM #define _SYS_PCIEB_H 2710187SKrishna.Elango@Sun.COM 2810187SKrishna.Elango@Sun.COM #ifdef __cplusplus 2910187SKrishna.Elango@Sun.COM extern "C" { 3010187SKrishna.Elango@Sun.COM #endif 3110187SKrishna.Elango@Sun.COM 3210187SKrishna.Elango@Sun.COM #if defined(DEBUG) 3310187SKrishna.Elango@Sun.COM #define PCIEB_DEBUG pcieb_dbg 3410187SKrishna.Elango@Sun.COM extern void pcieb_dbg(uint_t bit, dev_info_t *dip, char *fmt, ...); 3510187SKrishna.Elango@Sun.COM #else /* DEBUG */ 3610187SKrishna.Elango@Sun.COM #define PCIEB_DEBUG 0 && 3710187SKrishna.Elango@Sun.COM #endif /* DEBUG */ 3810187SKrishna.Elango@Sun.COM 3910187SKrishna.Elango@Sun.COM typedef enum { /* same sequence as pcieb_debug_sym[] */ 4010187SKrishna.Elango@Sun.COM /* 0 */ DBG_ATTACH, 4110187SKrishna.Elango@Sun.COM /* 1 */ DBG_PWR, 4210187SKrishna.Elango@Sun.COM /* 2 */ DBG_INTR 4310187SKrishna.Elango@Sun.COM } pcieb_debug_bit_t; 4410187SKrishna.Elango@Sun.COM 4510187SKrishna.Elango@Sun.COM /* 4610187SKrishna.Elango@Sun.COM * Intel specific register offsets with bit definitions. 4710187SKrishna.Elango@Sun.COM */ 4810187SKrishna.Elango@Sun.COM #define PCIEB_PX_CAPABILITY_ID 0x44 4910187SKrishna.Elango@Sun.COM #define PCIEB_BRIDGE_CONF 0x40 5010187SKrishna.Elango@Sun.COM 5110187SKrishna.Elango@Sun.COM /* 5210187SKrishna.Elango@Sun.COM * PCI/PCI-E Configuration register specific values. 5310187SKrishna.Elango@Sun.COM */ 5410187SKrishna.Elango@Sun.COM #define PX_PMODE 0x4000 /* PCI/PCIX Mode */ 5510187SKrishna.Elango@Sun.COM #define PX_PFREQ_66 0x200 /* PCI clock frequency */ 5610187SKrishna.Elango@Sun.COM #define PX_PFREQ_100 0x400 5710187SKrishna.Elango@Sun.COM #define PX_PFREQ_133 0x600 5810187SKrishna.Elango@Sun.COM #define PX_PMRE 0x80 /* Peer memory read enable */ 5910187SKrishna.Elango@Sun.COM 6010187SKrishna.Elango@Sun.COM /* 6110187SKrishna.Elango@Sun.COM * Downstream delayed transaction resource partitioning. 6210187SKrishna.Elango@Sun.COM */ 6310187SKrishna.Elango@Sun.COM #define PX_ODTP 0x40 /* Max. of two entries PX and PCI */ 6410187SKrishna.Elango@Sun.COM 6510187SKrishna.Elango@Sun.COM /* 6610187SKrishna.Elango@Sun.COM * Maximum upstream delayed transaction. 6710187SKrishna.Elango@Sun.COM */ 6810187SKrishna.Elango@Sun.COM #define PX_MDT_44 0x00 6910187SKrishna.Elango@Sun.COM #define PX_MDT_11 0x01 7010187SKrishna.Elango@Sun.COM #define PX_MDT_22 0x10 7110187SKrishna.Elango@Sun.COM 7210187SKrishna.Elango@Sun.COM #define NUM_LOGICAL_SLOTS 32 7310187SKrishna.Elango@Sun.COM #define PCIEB_RANGE_LEN 2 7410187SKrishna.Elango@Sun.COM #define PCIEB_32BIT_IO 1 7510187SKrishna.Elango@Sun.COM #define PCIEB_32bit_MEM 1 7610187SKrishna.Elango@Sun.COM #define PCIEB_MEMGRAIN 0x100000 7710187SKrishna.Elango@Sun.COM #define PCIEB_IOGRAIN 0x1000 7810187SKrishna.Elango@Sun.COM 7910187SKrishna.Elango@Sun.COM #define PCIEB_16bit_IOADDR(addr) ((uint16_t)(((uint8_t)(addr) & 0xF0) << 8)) 8010187SKrishna.Elango@Sun.COM #define PCIEB_LADDR(lo, hi) (((uint16_t)(hi) << 16) | (uint16_t)(lo)) 8110187SKrishna.Elango@Sun.COM #define PCIEB_32bit_MEMADDR(addr) (PCIEB_LADDR(0, ((uint16_t)(addr) & 0xFFF0))) 8210187SKrishna.Elango@Sun.COM 83*12330SDaniel.Ice@Sun.COM /* 84*12330SDaniel.Ice@Sun.COM * Intel 41210 PCIe-to-PCI Bridge has two Functions F0 and F2: 85*12330SDaniel.Ice@Sun.COM * VID: 0x8086 86*12330SDaniel.Ice@Sun.COM * DID: F0 = 0x340, F2 = 0x341 87*12330SDaniel.Ice@Sun.COM */ 88*12330SDaniel.Ice@Sun.COM #define PCIEB_IS_41210_F0(bus_dev_ven_id) (bus_dev_ven_id == 0x3408086) 89*12330SDaniel.Ice@Sun.COM #define PCIEB_IS_41210_F2(bus_dev_ven_id) (bus_dev_ven_id == 0x3418086) 90*12330SDaniel.Ice@Sun.COM #define PCIEB_IS_41210_BRIDGE(bus_dev_ven_id) \ 91*12330SDaniel.Ice@Sun.COM (PCIEB_IS_41210_F0(bus_dev_ven_id) || PCIEB_IS_41210_F2(bus_dev_ven_id)) 92*12330SDaniel.Ice@Sun.COM 9310187SKrishna.Elango@Sun.COM typedef struct { 9410187SKrishna.Elango@Sun.COM dev_info_t *pcieb_dip; 9510187SKrishna.Elango@Sun.COM 9610187SKrishna.Elango@Sun.COM /* Interrupt support */ 9710187SKrishna.Elango@Sun.COM ddi_intr_handle_t *pcieb_htable; /* Intr Handlers */ 9810187SKrishna.Elango@Sun.COM int pcieb_htable_size; /* htable size */ 9910187SKrishna.Elango@Sun.COM int pcieb_intr_count; /* Num of Intr */ 10010187SKrishna.Elango@Sun.COM uint_t pcieb_intr_priority; /* Intr Priority */ 10110187SKrishna.Elango@Sun.COM int pcieb_intr_type; /* (MSI | FIXED) */ 10210187SKrishna.Elango@Sun.COM int pcieb_isr_tab[4]; /* MSI source offset */ 10310187SKrishna.Elango@Sun.COM 10410187SKrishna.Elango@Sun.COM int pcieb_init_flags; 10510187SKrishna.Elango@Sun.COM kmutex_t pcieb_mutex; /* Soft state mutex */ 10610187SKrishna.Elango@Sun.COM kmutex_t pcieb_intr_mutex; /* Intr handler mutex */ 10710187SKrishna.Elango@Sun.COM kmutex_t pcieb_err_mutex; /* Error mutex */ 10810187SKrishna.Elango@Sun.COM kmutex_t pcieb_peek_poke_mutex; /* Peekpoke mutex */ 10910187SKrishna.Elango@Sun.COM 11010187SKrishna.Elango@Sun.COM /* FMA */ 11110187SKrishna.Elango@Sun.COM boolean_t pcieb_no_aer_msi; 11210187SKrishna.Elango@Sun.COM ddi_iblock_cookie_t pcieb_fm_ibc; 11310187SKrishna.Elango@Sun.COM } pcieb_devstate_t; 11410187SKrishna.Elango@Sun.COM 11510187SKrishna.Elango@Sun.COM /* 11610187SKrishna.Elango@Sun.COM * soft state pointer 11710187SKrishna.Elango@Sun.COM */ 11810187SKrishna.Elango@Sun.COM extern void *pcieb_state; 11910187SKrishna.Elango@Sun.COM 12010187SKrishna.Elango@Sun.COM /* soft state flags */ 12110187SKrishna.Elango@Sun.COM #define PCIEB_SOFT_STATE_CLOSED 0x00 12210187SKrishna.Elango@Sun.COM #define PCIEB_SOFT_STATE_OPEN 0x01 12310187SKrishna.Elango@Sun.COM #define PCIEB_SOFT_STATE_OPEN_EXCL 0x02 12410187SKrishna.Elango@Sun.COM 12510187SKrishna.Elango@Sun.COM /* init flags */ 12610187SKrishna.Elango@Sun.COM #define PCIEB_INIT_MUTEX 0x01 12710187SKrishna.Elango@Sun.COM #define PCIEB_INIT_HTABLE 0x02 12810187SKrishna.Elango@Sun.COM #define PCIEB_INIT_ALLOC 0x04 12910187SKrishna.Elango@Sun.COM #define PCIEB_INIT_HANDLER 0x08 13010187SKrishna.Elango@Sun.COM #define PCIEB_INIT_ENABLE 0x10 13110187SKrishna.Elango@Sun.COM #define PCIEB_INIT_BLOCK 0x20 13210187SKrishna.Elango@Sun.COM #define PCIEB_INIT_FM 0x40 13310187SKrishna.Elango@Sun.COM 13410187SKrishna.Elango@Sun.COM #define PCIEB_INTR_SRC_UNKNOWN 0x0 /* must be 0 */ 13510187SKrishna.Elango@Sun.COM #define PCIEB_INTR_SRC_HP 0x1 13610187SKrishna.Elango@Sun.COM #define PCIEB_INTR_SRC_PME 0x2 13710187SKrishna.Elango@Sun.COM #define PCIEB_INTR_SRC_AER 0x4 13810187SKrishna.Elango@Sun.COM 13910187SKrishna.Elango@Sun.COM /* 14010187SKrishna.Elango@Sun.COM * Need to put vendor ids in a common file and not platform specific files 14110187SKrishna.Elango@Sun.COM * as is done today. Until then putting this vendor id define here. 14210187SKrishna.Elango@Sun.COM */ 14310187SKrishna.Elango@Sun.COM #define NVIDIA_VENDOR_ID 0x10de /* Nvidia Vendor Id */ 14410187SKrishna.Elango@Sun.COM 14510923SEvan.Yan@Sun.COM #ifdef PCIEB_BCM 14610187SKrishna.Elango@Sun.COM 14710187SKrishna.Elango@Sun.COM /* Workaround for address space limitation in Broadcom 5714/5715 */ 14810187SKrishna.Elango@Sun.COM #define PCIEB_ADDR_LIMIT_LO 0ull 14910187SKrishna.Elango@Sun.COM #define PCIEB_ADDR_LIMIT_HI ((1ull << 40) - 1) 15010187SKrishna.Elango@Sun.COM 15110923SEvan.Yan@Sun.COM #endif /* PCIEB_BCM */ 15210187SKrishna.Elango@Sun.COM 15310187SKrishna.Elango@Sun.COM /* 15410187SKrishna.Elango@Sun.COM * The following values are used to initialize the cache line size 15510187SKrishna.Elango@Sun.COM * and latency timer registers for PCI, PCI-X and PCIe2PCI devices. 15610187SKrishna.Elango@Sun.COM */ 15710187SKrishna.Elango@Sun.COM #define PCIEB_CACHE_LINE_SIZE 0x10 /* 64 bytes in # of DWORDs */ 15810187SKrishna.Elango@Sun.COM #define PCIEB_LATENCY_TIMER 0x40 /* 64 PCI cycles */ 15910187SKrishna.Elango@Sun.COM 16010187SKrishna.Elango@Sun.COM extern void pcieb_set_pci_perf_parameters(dev_info_t *dip, 16110187SKrishna.Elango@Sun.COM ddi_acc_handle_t config_handle); 16210187SKrishna.Elango@Sun.COM extern void pcieb_plat_attach_workaround(dev_info_t *dip); 16310187SKrishna.Elango@Sun.COM extern void pcieb_plat_intr_attach(pcieb_devstate_t *pcieb); 16410187SKrishna.Elango@Sun.COM extern void pcieb_plat_initchild(dev_info_t *child); 16510187SKrishna.Elango@Sun.COM extern void pcieb_plat_uninitchild(dev_info_t *child); 16610187SKrishna.Elango@Sun.COM extern int pcieb_plat_ctlops(dev_info_t *rdip, ddi_ctl_enum_t ctlop, 16710187SKrishna.Elango@Sun.COM void *arg); 16810187SKrishna.Elango@Sun.COM extern int pcieb_plat_pcishpc_probe(dev_info_t *dip, 16910187SKrishna.Elango@Sun.COM ddi_acc_handle_t config_handle); 17010187SKrishna.Elango@Sun.COM extern int pcieb_plat_peekpoke(dev_info_t *dip, dev_info_t *rdip, 17110187SKrishna.Elango@Sun.COM ddi_ctl_enum_t ctlop, void *arg, void *result); 17211236SStephen.Hanson@Sun.COM extern void pcieb_set_prot_scan(dev_info_t *dip, ddi_acc_impl_t *hdlp); 17310187SKrishna.Elango@Sun.COM extern int pcieb_plat_intr_ops(dev_info_t *dip, dev_info_t *rdip, 17410187SKrishna.Elango@Sun.COM ddi_intr_op_t intr_op, ddi_intr_handle_impl_t *hdlp, void *result); 17510187SKrishna.Elango@Sun.COM extern boolean_t pcieb_plat_msi_supported(dev_info_t *dip); 17610187SKrishna.Elango@Sun.COM extern boolean_t pcieb_plat_pwr_disable(dev_info_t *dip); 17710187SKrishna.Elango@Sun.COM 17810187SKrishna.Elango@Sun.COM #if defined(__i386) || defined(__amd64) 17910187SKrishna.Elango@Sun.COM extern void pcieb_intel_error_workaround(dev_info_t *dip); 18010187SKrishna.Elango@Sun.COM extern void pcieb_intel_serr_workaround(dev_info_t *dip, boolean_t mcheck); 18110187SKrishna.Elango@Sun.COM extern void pcieb_intel_rber_workaround(dev_info_t *dip); 18210187SKrishna.Elango@Sun.COM extern void pcieb_intel_sw_workaround(dev_info_t *dip); 18310187SKrishna.Elango@Sun.COM extern void pcieb_intel_mps_workaround(dev_info_t *dip); 18410187SKrishna.Elango@Sun.COM extern void pcieb_init_osc(dev_info_t *dip); 18510187SKrishna.Elango@Sun.COM extern void pcieb_peekpoke_cb(dev_info_t *, ddi_fm_error_t *); 18610187SKrishna.Elango@Sun.COM extern int pcishpc_init(dev_info_t *dip); 18710187SKrishna.Elango@Sun.COM extern int pcishpc_uninit(dev_info_t *dip); 18810187SKrishna.Elango@Sun.COM extern int pcishpc_intr(dev_info_t *dip); 18910187SKrishna.Elango@Sun.COM #endif /* defined(__i386) || defined(__amd64) */ 19010187SKrishna.Elango@Sun.COM 19110187SKrishna.Elango@Sun.COM #ifdef PX_PLX 19210187SKrishna.Elango@Sun.COM extern void pcieb_attach_plx_workarounds(pcieb_devstate_t *pcieb); 19310187SKrishna.Elango@Sun.COM extern int pcieb_init_plx_workarounds(pcieb_devstate_t *pcieb, 19410187SKrishna.Elango@Sun.COM dev_info_t *child); 19510187SKrishna.Elango@Sun.COM #endif /* PX_PLX */ 19610187SKrishna.Elango@Sun.COM 19710187SKrishna.Elango@Sun.COM #ifdef __cplusplus 19810187SKrishna.Elango@Sun.COM } 19910187SKrishna.Elango@Sun.COM #endif 20010187SKrishna.Elango@Sun.COM 20110187SKrishna.Elango@Sun.COM #endif /* _SYS_PCIEB_H */ 202