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