xref: /onnv-gate/usr/src/uts/common/io/pciex/pcieb.h (revision 10187:ad62e2dfbe0c)
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