xref: /titanic_50/usr/src/uts/common/io/pciex/pcieb.h (revision 83e6495b5bcdb3fbe09948670b92d3e265047dcc)
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