xref: /titanic_54/usr/src/uts/common/sys/pcifm.h (revision 00d0963faf2e861a4aef6b1bf28f99a5b2b20755)
1*00d0963fSdilpreet /*
2*00d0963fSdilpreet  * CDDL HEADER START
3*00d0963fSdilpreet  *
4*00d0963fSdilpreet  * The contents of this file are subject to the terms of the
5*00d0963fSdilpreet  * Common Development and Distribution License (the "License").
6*00d0963fSdilpreet  * You may not use this file except in compliance with the License.
7*00d0963fSdilpreet  *
8*00d0963fSdilpreet  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*00d0963fSdilpreet  * or http://www.opensolaris.org/os/licensing.
10*00d0963fSdilpreet  * See the License for the specific language governing permissions
11*00d0963fSdilpreet  * and limitations under the License.
12*00d0963fSdilpreet  *
13*00d0963fSdilpreet  * When distributing Covered Code, include this CDDL HEADER in each
14*00d0963fSdilpreet  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*00d0963fSdilpreet  * If applicable, add the following below this CDDL HEADER, with the
16*00d0963fSdilpreet  * fields enclosed by brackets "[]" replaced with your own identifying
17*00d0963fSdilpreet  * information: Portions Copyright [yyyy] [name of copyright owner]
18*00d0963fSdilpreet  *
19*00d0963fSdilpreet  * CDDL HEADER END
20*00d0963fSdilpreet  */
21*00d0963fSdilpreet /*
22*00d0963fSdilpreet  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
23*00d0963fSdilpreet  * Use is subject to license terms.
24*00d0963fSdilpreet  */
25*00d0963fSdilpreet 
26*00d0963fSdilpreet #ifndef	_SYS_PCIFM_H
27*00d0963fSdilpreet #define	_SYS_PCIFM_H
28*00d0963fSdilpreet 
29*00d0963fSdilpreet #pragma ident	"%Z%%M%	%I%	%E% SMI"
30*00d0963fSdilpreet 
31*00d0963fSdilpreet #include <sys/dditypes.h>		/* for ddi_acc_handle_t */
32*00d0963fSdilpreet 
33*00d0963fSdilpreet #ifdef	__cplusplus
34*00d0963fSdilpreet extern "C" {
35*00d0963fSdilpreet #endif
36*00d0963fSdilpreet 
37*00d0963fSdilpreet 
38*00d0963fSdilpreet /*
39*00d0963fSdilpreet  * PCI device type defines.
40*00d0963fSdilpreet  */
41*00d0963fSdilpreet #define	PCI_BRIDGE_DEV			0x02
42*00d0963fSdilpreet #define	PCIX_DEV			0x04
43*00d0963fSdilpreet #define	PCIEX_DEV			0x08
44*00d0963fSdilpreet #define	PCIEX_ADV_DEV			0x10
45*00d0963fSdilpreet #define	PCIEX_RC_DEV			0x20
46*00d0963fSdilpreet #define	PCIEX_2PCI_DEV			0x40
47*00d0963fSdilpreet 
48*00d0963fSdilpreet /*
49*00d0963fSdilpreet  * PCI and PCI-X valid flags
50*00d0963fSdilpreet  */
51*00d0963fSdilpreet #define	PCI_ERR_STATUS_VALID		0x1
52*00d0963fSdilpreet #define	PCI_BDG_SEC_STAT_VALID		0x2
53*00d0963fSdilpreet #define	PCI_BDG_CTRL_VALID		0x4
54*00d0963fSdilpreet #define	PCIX_ERR_STATUS_VALID		0x8
55*00d0963fSdilpreet #define	PCIX_ERR_ECC_STS_VALID		0x10
56*00d0963fSdilpreet #define	PCIX_ERR_S_ECC_STS_VALID	0x20
57*00d0963fSdilpreet #define	PCIX_BDG_STATUS_VALID		0x40
58*00d0963fSdilpreet #define	PCIX_BDG_SEC_STATUS_VALID	0x80
59*00d0963fSdilpreet 
60*00d0963fSdilpreet /*
61*00d0963fSdilpreet  * PCI Express valid flags
62*00d0963fSdilpreet  */
63*00d0963fSdilpreet #define	PCIE_ERR_STATUS_VALID		0x1
64*00d0963fSdilpreet #define	PCIE_CE_STATUS_VALID		0x2
65*00d0963fSdilpreet #define	PCIE_UE_STATUS_VALID		0x4
66*00d0963fSdilpreet #define	PCIE_RC_ERR_STATUS_VALID	0x8
67*00d0963fSdilpreet #define	PCIE_SUE_STATUS_VALID		0x10
68*00d0963fSdilpreet #define	PCIE_SUE_HDR_VALID		0x20
69*00d0963fSdilpreet #define	PCIE_UE_HDR_VALID		0x40
70*00d0963fSdilpreet #define	PCIE_SRC_ID_VALID		0x80
71*00d0963fSdilpreet 
72*00d0963fSdilpreet /*
73*00d0963fSdilpreet  * PCI(-X) structures used (by pci_ereport_setup, pci_ereport_post, and
74*00d0963fSdilpreet  * pci_ereport_teardown) to gather and report errors detected by PCI(-X)
75*00d0963fSdilpreet  * compliant devices.
76*00d0963fSdilpreet  */
77*00d0963fSdilpreet typedef struct pci_bdg_error_regs {
78*00d0963fSdilpreet 	uint16_t pci_bdg_vflags;	/* status valid bits */
79*00d0963fSdilpreet 	uint16_t pci_bdg_sec_stat;	/* PCI secondary status reg */
80*00d0963fSdilpreet 	uint16_t pci_bdg_ctrl;		/* PCI bridge control reg */
81*00d0963fSdilpreet } pci_bdg_error_regs_t;
82*00d0963fSdilpreet 
83*00d0963fSdilpreet typedef struct pci_error_regs {
84*00d0963fSdilpreet 	uint16_t pci_vflags;		/* status valid bits */
85*00d0963fSdilpreet 	uint8_t pci_cap_ptr;		/* PCI Capability pointer */
86*00d0963fSdilpreet 	uint16_t pci_err_status;	/* pci status register */
87*00d0963fSdilpreet 	uint16_t pci_cfg_comm;		/* pci command register */
88*00d0963fSdilpreet 	pci_bdg_error_regs_t *pci_bdg_regs;
89*00d0963fSdilpreet } pci_error_regs_t;
90*00d0963fSdilpreet 
91*00d0963fSdilpreet typedef struct pci_erpt {
92*00d0963fSdilpreet 	ddi_acc_handle_t pe_hdl;	/* Config space access handle */
93*00d0963fSdilpreet 	uint64_t pe_dflags;		/* Device type flags */
94*00d0963fSdilpreet 	uint16_t pe_bdf;		/* bus/device/function of device */
95*00d0963fSdilpreet 	pci_error_regs_t *pe_pci_regs;	/* PCI generic error registers */
96*00d0963fSdilpreet 	void *pe_regs;			/* Pointer to extended error regs */
97*00d0963fSdilpreet } pci_erpt_t;
98*00d0963fSdilpreet 
99*00d0963fSdilpreet typedef struct pcix_ecc_regs {
100*00d0963fSdilpreet 	uint16_t pcix_ecc_vflags;	/* pcix ecc valid flags */
101*00d0963fSdilpreet 	uint16_t pcix_ecc_bdf;		/* pcix ecc bdf */
102*00d0963fSdilpreet 	uint32_t pcix_ecc_ctlstat;	/* pcix ecc control status reg */
103*00d0963fSdilpreet 	uint32_t pcix_ecc_fstaddr;	/* pcix ecc first address reg */
104*00d0963fSdilpreet 	uint32_t pcix_ecc_secaddr;	/* pcix ecc second address reg */
105*00d0963fSdilpreet 	uint32_t pcix_ecc_attr;		/* pcix ecc attributes reg */
106*00d0963fSdilpreet } pcix_ecc_regs_t;
107*00d0963fSdilpreet 
108*00d0963fSdilpreet typedef struct pcix_error_regs {
109*00d0963fSdilpreet 	uint16_t pcix_vflags;		/* pcix valid flags */
110*00d0963fSdilpreet 	uint8_t pcix_cap_ptr;		/* pcix capability pointer */
111*00d0963fSdilpreet 	uint16_t pcix_ver;		/* pcix version */
112*00d0963fSdilpreet 	uint16_t pcix_command;		/* pcix command register */
113*00d0963fSdilpreet 	uint32_t pcix_status;		/* pcix status register */
114*00d0963fSdilpreet 	pcix_ecc_regs_t *pcix_ecc_regs;	/* pcix ecc registers */
115*00d0963fSdilpreet } pcix_error_regs_t;
116*00d0963fSdilpreet 
117*00d0963fSdilpreet typedef struct pcix_bdg_error_regs {
118*00d0963fSdilpreet 	uint16_t pcix_bdg_vflags;	/* pcix valid flags */
119*00d0963fSdilpreet 	uint8_t pcix_bdg_cap_ptr;	/* pcix bridge capability pointer */
120*00d0963fSdilpreet 	uint16_t pcix_bdg_ver;		/* pcix version */
121*00d0963fSdilpreet 	uint16_t pcix_bdg_sec_stat;	/* pcix bridge secondary status reg */
122*00d0963fSdilpreet 	uint32_t pcix_bdg_stat;		/* pcix bridge status reg */
123*00d0963fSdilpreet 	pcix_ecc_regs_t *pcix_bdg_ecc_regs[2];	/* pcix ecc registers */
124*00d0963fSdilpreet } pcix_bdg_error_regs_t;
125*00d0963fSdilpreet 
126*00d0963fSdilpreet /*
127*00d0963fSdilpreet  * PCI Express error register structures used (by pci_ereport_setup,
128*00d0963fSdilpreet  * pci_ereport_post, and pci_ereport_teardown) to gather and report errors
129*00d0963fSdilpreet  * detected by PCI Express compliant devices.
130*00d0963fSdilpreet  */
131*00d0963fSdilpreet typedef struct pcie_adv_bdg_error_regs {
132*00d0963fSdilpreet 	uint32_t pcie_sue_status;	/* pcie bridge secondary ue status */
133*00d0963fSdilpreet 	uint32_t pcie_sue_mask;		/* pcie bridge secondary ue mask */
134*00d0963fSdilpreet 	uint32_t pcie_sue_sev;		/* pcie bridge secondary ue severity */
135*00d0963fSdilpreet 	uint32_t pcie_sue_hdr0;		/* pcie bridge secondary ue hdr log */
136*00d0963fSdilpreet 	uint32_t pcie_sue_hdr[3];	/* pcie bridge secondary ue hdr log */
137*00d0963fSdilpreet } pcie_adv_bdg_error_regs_t;
138*00d0963fSdilpreet 
139*00d0963fSdilpreet typedef struct pcie_adv_rc_error_regs {
140*00d0963fSdilpreet 	uint32_t pcie_rc_err_status;	/* pcie root complex error status reg */
141*00d0963fSdilpreet 	uint32_t pcie_rc_err_cmd;	/* pcie root complex error cmd reg */
142*00d0963fSdilpreet 	uint16_t pcie_rc_ce_src_id;	/* pcie root complex ce source id */
143*00d0963fSdilpreet 	uint16_t pcie_rc_ue_src_id;	/* pcie root complex ue source id */
144*00d0963fSdilpreet } pcie_adv_rc_error_regs_t;
145*00d0963fSdilpreet 
146*00d0963fSdilpreet typedef struct pcie_adv_error_regs {
147*00d0963fSdilpreet 	uint16_t pcie_adv_vflags;	/* pcie advanced error valid flags */
148*00d0963fSdilpreet 	uint16_t pcie_adv_cap_ptr;	/* pcie advanced capability pointer */
149*00d0963fSdilpreet 	uint16_t pcie_adv_bdf;		/* pcie bdf */
150*00d0963fSdilpreet 	uint32_t pcie_adv_ctl;		/* pcie advanced control reg */
151*00d0963fSdilpreet 	uint32_t pcie_ce_status;	/* pcie ce error status reg */
152*00d0963fSdilpreet 	uint32_t pcie_ce_mask;		/* pcie ce error mask reg */
153*00d0963fSdilpreet 	uint32_t pcie_ue_status;	/* pcie ue error status reg */
154*00d0963fSdilpreet 	uint32_t pcie_ue_mask;		/* pcie ue error mask reg */
155*00d0963fSdilpreet 	uint32_t pcie_ue_sev;		/* pcie ue error severity reg */
156*00d0963fSdilpreet 	uint32_t pcie_ue_hdr0;		/* pcie ue header log */
157*00d0963fSdilpreet 	uint32_t pcie_ue_hdr[3];	/* pcie ue header log */
158*00d0963fSdilpreet 	pcie_adv_bdg_error_regs_t *pcie_adv_bdg_regs;	/* pcie bridge regs */
159*00d0963fSdilpreet 	pcie_adv_rc_error_regs_t *pcie_adv_rc_regs;	/* pcie rc regs */
160*00d0963fSdilpreet } pcie_adv_error_regs_t;
161*00d0963fSdilpreet 
162*00d0963fSdilpreet typedef struct pcie_rc_error_regs {
163*00d0963fSdilpreet 	uint32_t pcie_rc_status;	/* root complex status register */
164*00d0963fSdilpreet 	uint16_t pcie_rc_ctl;		/* root complex control register */
165*00d0963fSdilpreet } pcie_rc_error_regs_t;
166*00d0963fSdilpreet 
167*00d0963fSdilpreet typedef struct pcie_error_regs {
168*00d0963fSdilpreet 	uint16_t pcie_vflags;		/* pcie valid flags */
169*00d0963fSdilpreet 	uint8_t pcie_cap_ptr;		/* PCI Express capability pointer */
170*00d0963fSdilpreet 	uint16_t pcie_cap;		/* PCI Express capability register */
171*00d0963fSdilpreet 	uint16_t pcie_err_status;	/* pcie device status register */
172*00d0963fSdilpreet 	uint16_t pcie_err_ctl;		/* pcie error control register */
173*00d0963fSdilpreet 	pcix_bdg_error_regs_t *pcix_bdg_regs;	/* pcix bridge regs */
174*00d0963fSdilpreet 	pcie_rc_error_regs_t *pcie_rc_regs;	/* pcie root complex regs */
175*00d0963fSdilpreet 	pcie_adv_error_regs_t *pcie_adv_regs;	/* pcie advanced err regs */
176*00d0963fSdilpreet } pcie_error_regs_t;
177*00d0963fSdilpreet 
178*00d0963fSdilpreet /*
179*00d0963fSdilpreet  * target error queue defines
180*00d0963fSdilpreet  */
181*00d0963fSdilpreet #define	TARGET_MAX_ERRS			6
182*00d0963fSdilpreet #define	TGT_PCI_SPACE_UNKNOWN		4
183*00d0963fSdilpreet 
184*00d0963fSdilpreet typedef struct pci_target_err {
185*00d0963fSdilpreet 	uint64_t tgt_err_addr;
186*00d0963fSdilpreet 	uint64_t tgt_err_ena;
187*00d0963fSdilpreet 	uint64_t tgt_pci_addr;
188*00d0963fSdilpreet 	uint32_t tgt_pci_space;
189*00d0963fSdilpreet 	dev_info_t *tgt_dip;
190*00d0963fSdilpreet 	char *tgt_err_class;
191*00d0963fSdilpreet 	char *tgt_bridge_type;
192*00d0963fSdilpreet } pci_target_err_t;
193*00d0963fSdilpreet 
194*00d0963fSdilpreet #define	PCI_FM_SEV_INC(x)	((x) == DDI_FM_FATAL) ? fatal++ :\
195*00d0963fSdilpreet 				(((x) == DDI_FM_NONFATAL) ? nonfatal++ :\
196*00d0963fSdilpreet 				(((x) == DDI_FM_UNKNOWN) ? unknown++ : ok++));
197*00d0963fSdilpreet 
198*00d0963fSdilpreet #define	PCIEX_TYPE_CE			0x0
199*00d0963fSdilpreet #define	PCIEX_TYPE_UE			0x1
200*00d0963fSdilpreet #define	PCIEX_TYPE_GEN			0x2
201*00d0963fSdilpreet #define	PCIEX_TYPE_RC_UE_MSG		0x3
202*00d0963fSdilpreet #define	PCIEX_TYPE_RC_CE_MSG		0x4
203*00d0963fSdilpreet #define	PCIEX_TYPE_RC_MULT_MSG		0x5
204*00d0963fSdilpreet 
205*00d0963fSdilpreet #ifdef	__cplusplus
206*00d0963fSdilpreet }
207*00d0963fSdilpreet #endif
208*00d0963fSdilpreet 
209*00d0963fSdilpreet #endif	/* _SYS_PCIFM_H */
210