xref: /titanic_52/usr/src/uts/common/sys/pcifm.h (revision 8aec91825357bbeaf2ab5d30fc97fe5051a6b8dd)
100d0963fSdilpreet /*
200d0963fSdilpreet  * CDDL HEADER START
300d0963fSdilpreet  *
400d0963fSdilpreet  * The contents of this file are subject to the terms of the
500d0963fSdilpreet  * Common Development and Distribution License (the "License").
600d0963fSdilpreet  * You may not use this file except in compliance with the License.
700d0963fSdilpreet  *
800d0963fSdilpreet  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
900d0963fSdilpreet  * or http://www.opensolaris.org/os/licensing.
1000d0963fSdilpreet  * See the License for the specific language governing permissions
1100d0963fSdilpreet  * and limitations under the License.
1200d0963fSdilpreet  *
1300d0963fSdilpreet  * When distributing Covered Code, include this CDDL HEADER in each
1400d0963fSdilpreet  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1500d0963fSdilpreet  * If applicable, add the following below this CDDL HEADER, with the
1600d0963fSdilpreet  * fields enclosed by brackets "[]" replaced with your own identifying
1700d0963fSdilpreet  * information: Portions Copyright [yyyy] [name of copyright owner]
1800d0963fSdilpreet  *
1900d0963fSdilpreet  * CDDL HEADER END
2000d0963fSdilpreet  */
2100d0963fSdilpreet /*
2200d0963fSdilpreet  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
2300d0963fSdilpreet  * Use is subject to license terms.
2400d0963fSdilpreet  */
2500d0963fSdilpreet 
2600d0963fSdilpreet #ifndef	_SYS_PCIFM_H
2700d0963fSdilpreet #define	_SYS_PCIFM_H
2800d0963fSdilpreet 
2900d0963fSdilpreet #pragma ident	"%Z%%M%	%I%	%E% SMI"
3000d0963fSdilpreet 
3100d0963fSdilpreet #include <sys/dditypes.h>		/* for ddi_acc_handle_t */
3200d0963fSdilpreet 
3300d0963fSdilpreet #ifdef	__cplusplus
3400d0963fSdilpreet extern "C" {
3500d0963fSdilpreet #endif
3600d0963fSdilpreet 
3700d0963fSdilpreet 
3800d0963fSdilpreet /*
3900d0963fSdilpreet  * PCI device type defines.
4000d0963fSdilpreet  */
4100d0963fSdilpreet #define	PCI_BRIDGE_DEV			0x02
4200d0963fSdilpreet #define	PCIX_DEV			0x04
4300d0963fSdilpreet #define	PCIEX_DEV			0x08
4400d0963fSdilpreet #define	PCIEX_ADV_DEV			0x10
4500d0963fSdilpreet #define	PCIEX_RC_DEV			0x20
4600d0963fSdilpreet #define	PCIEX_2PCI_DEV			0x40
4700d0963fSdilpreet 
4800d0963fSdilpreet /*
4900d0963fSdilpreet  * PCI and PCI-X valid flags
5000d0963fSdilpreet  */
5100d0963fSdilpreet #define	PCI_ERR_STATUS_VALID		0x1
5200d0963fSdilpreet #define	PCI_BDG_SEC_STAT_VALID		0x2
5300d0963fSdilpreet #define	PCI_BDG_CTRL_VALID		0x4
5400d0963fSdilpreet #define	PCIX_ERR_STATUS_VALID		0x8
5500d0963fSdilpreet #define	PCIX_ERR_ECC_STS_VALID		0x10
5600d0963fSdilpreet #define	PCIX_ERR_S_ECC_STS_VALID	0x20
5700d0963fSdilpreet #define	PCIX_BDG_STATUS_VALID		0x40
5800d0963fSdilpreet #define	PCIX_BDG_SEC_STATUS_VALID	0x80
5900d0963fSdilpreet 
6000d0963fSdilpreet /*
6100d0963fSdilpreet  * PCI Express valid flags
6200d0963fSdilpreet  */
6300d0963fSdilpreet #define	PCIE_ERR_STATUS_VALID		0x1
6400d0963fSdilpreet #define	PCIE_CE_STATUS_VALID		0x2
6500d0963fSdilpreet #define	PCIE_UE_STATUS_VALID		0x4
6600d0963fSdilpreet #define	PCIE_RC_ERR_STATUS_VALID	0x8
6700d0963fSdilpreet #define	PCIE_SUE_STATUS_VALID		0x10
6800d0963fSdilpreet #define	PCIE_SUE_HDR_VALID		0x20
6900d0963fSdilpreet #define	PCIE_UE_HDR_VALID		0x40
7000d0963fSdilpreet #define	PCIE_SRC_ID_VALID		0x80
7100d0963fSdilpreet 
7200d0963fSdilpreet /*
7300d0963fSdilpreet  * PCI(-X) structures used (by pci_ereport_setup, pci_ereport_post, and
7400d0963fSdilpreet  * pci_ereport_teardown) to gather and report errors detected by PCI(-X)
7500d0963fSdilpreet  * compliant devices.
7600d0963fSdilpreet  */
7700d0963fSdilpreet typedef struct pci_bdg_error_regs {
7800d0963fSdilpreet 	uint16_t pci_bdg_vflags;	/* status valid bits */
7900d0963fSdilpreet 	uint16_t pci_bdg_sec_stat;	/* PCI secondary status reg */
8000d0963fSdilpreet 	uint16_t pci_bdg_ctrl;		/* PCI bridge control reg */
8100d0963fSdilpreet } pci_bdg_error_regs_t;
8200d0963fSdilpreet 
8300d0963fSdilpreet typedef struct pci_error_regs {
8400d0963fSdilpreet 	uint16_t pci_vflags;		/* status valid bits */
8500d0963fSdilpreet 	uint8_t pci_cap_ptr;		/* PCI Capability pointer */
8600d0963fSdilpreet 	uint16_t pci_err_status;	/* pci status register */
8700d0963fSdilpreet 	uint16_t pci_cfg_comm;		/* pci command register */
8800d0963fSdilpreet 	pci_bdg_error_regs_t *pci_bdg_regs;
8900d0963fSdilpreet } pci_error_regs_t;
9000d0963fSdilpreet 
9100d0963fSdilpreet typedef struct pci_erpt {
9200d0963fSdilpreet 	ddi_acc_handle_t pe_hdl;	/* Config space access handle */
9300d0963fSdilpreet 	uint64_t pe_dflags;		/* Device type flags */
9400d0963fSdilpreet 	uint16_t pe_bdf;		/* bus/device/function of device */
9500d0963fSdilpreet 	pci_error_regs_t *pe_pci_regs;	/* PCI generic error registers */
9600d0963fSdilpreet 	void *pe_regs;			/* Pointer to extended error regs */
9700d0963fSdilpreet } pci_erpt_t;
9800d0963fSdilpreet 
9900d0963fSdilpreet typedef struct pcix_ecc_regs {
10000d0963fSdilpreet 	uint16_t pcix_ecc_vflags;	/* pcix ecc valid flags */
10100d0963fSdilpreet 	uint16_t pcix_ecc_bdf;		/* pcix ecc bdf */
10200d0963fSdilpreet 	uint32_t pcix_ecc_ctlstat;	/* pcix ecc control status reg */
10300d0963fSdilpreet 	uint32_t pcix_ecc_fstaddr;	/* pcix ecc first address reg */
10400d0963fSdilpreet 	uint32_t pcix_ecc_secaddr;	/* pcix ecc second address reg */
10500d0963fSdilpreet 	uint32_t pcix_ecc_attr;		/* pcix ecc attributes reg */
10600d0963fSdilpreet } pcix_ecc_regs_t;
10700d0963fSdilpreet 
10800d0963fSdilpreet typedef struct pcix_error_regs {
10900d0963fSdilpreet 	uint16_t pcix_vflags;		/* pcix valid flags */
11000d0963fSdilpreet 	uint8_t pcix_cap_ptr;		/* pcix capability pointer */
11100d0963fSdilpreet 	uint16_t pcix_ver;		/* pcix version */
11200d0963fSdilpreet 	uint16_t pcix_command;		/* pcix command register */
11300d0963fSdilpreet 	uint32_t pcix_status;		/* pcix status register */
11400d0963fSdilpreet 	pcix_ecc_regs_t *pcix_ecc_regs;	/* pcix ecc registers */
11500d0963fSdilpreet } pcix_error_regs_t;
11600d0963fSdilpreet 
11700d0963fSdilpreet typedef struct pcix_bdg_error_regs {
11800d0963fSdilpreet 	uint16_t pcix_bdg_vflags;	/* pcix valid flags */
11900d0963fSdilpreet 	uint8_t pcix_bdg_cap_ptr;	/* pcix bridge capability pointer */
12000d0963fSdilpreet 	uint16_t pcix_bdg_ver;		/* pcix version */
12100d0963fSdilpreet 	uint16_t pcix_bdg_sec_stat;	/* pcix bridge secondary status reg */
12200d0963fSdilpreet 	uint32_t pcix_bdg_stat;		/* pcix bridge status reg */
12300d0963fSdilpreet 	pcix_ecc_regs_t *pcix_bdg_ecc_regs[2];	/* pcix ecc registers */
12400d0963fSdilpreet } pcix_bdg_error_regs_t;
12500d0963fSdilpreet 
12600d0963fSdilpreet /*
12700d0963fSdilpreet  * PCI Express error register structures used (by pci_ereport_setup,
12800d0963fSdilpreet  * pci_ereport_post, and pci_ereport_teardown) to gather and report errors
12900d0963fSdilpreet  * detected by PCI Express compliant devices.
13000d0963fSdilpreet  */
13100d0963fSdilpreet typedef struct pcie_adv_bdg_error_regs {
13200d0963fSdilpreet 	uint32_t pcie_sue_status;	/* pcie bridge secondary ue status */
13300d0963fSdilpreet 	uint32_t pcie_sue_mask;		/* pcie bridge secondary ue mask */
13400d0963fSdilpreet 	uint32_t pcie_sue_sev;		/* pcie bridge secondary ue severity */
13500d0963fSdilpreet 	uint32_t pcie_sue_hdr0;		/* pcie bridge secondary ue hdr log */
13600d0963fSdilpreet 	uint32_t pcie_sue_hdr[3];	/* pcie bridge secondary ue hdr log */
13700d0963fSdilpreet } pcie_adv_bdg_error_regs_t;
13800d0963fSdilpreet 
13900d0963fSdilpreet typedef struct pcie_adv_rc_error_regs {
14000d0963fSdilpreet 	uint32_t pcie_rc_err_status;	/* pcie root complex error status reg */
14100d0963fSdilpreet 	uint32_t pcie_rc_err_cmd;	/* pcie root complex error cmd reg */
14200d0963fSdilpreet 	uint16_t pcie_rc_ce_src_id;	/* pcie root complex ce source id */
14300d0963fSdilpreet 	uint16_t pcie_rc_ue_src_id;	/* pcie root complex ue source id */
14400d0963fSdilpreet } pcie_adv_rc_error_regs_t;
14500d0963fSdilpreet 
14600d0963fSdilpreet typedef struct pcie_adv_error_regs {
14700d0963fSdilpreet 	uint16_t pcie_adv_vflags;	/* pcie advanced error valid flags */
14800d0963fSdilpreet 	uint16_t pcie_adv_cap_ptr;	/* pcie advanced capability pointer */
14900d0963fSdilpreet 	uint16_t pcie_adv_bdf;		/* pcie bdf */
15000d0963fSdilpreet 	uint32_t pcie_adv_ctl;		/* pcie advanced control reg */
15100d0963fSdilpreet 	uint32_t pcie_ce_status;	/* pcie ce error status reg */
15200d0963fSdilpreet 	uint32_t pcie_ce_mask;		/* pcie ce error mask reg */
15300d0963fSdilpreet 	uint32_t pcie_ue_status;	/* pcie ue error status reg */
15400d0963fSdilpreet 	uint32_t pcie_ue_mask;		/* pcie ue error mask reg */
15500d0963fSdilpreet 	uint32_t pcie_ue_sev;		/* pcie ue error severity reg */
15600d0963fSdilpreet 	uint32_t pcie_ue_hdr0;		/* pcie ue header log */
15700d0963fSdilpreet 	uint32_t pcie_ue_hdr[3];	/* pcie ue header log */
15800d0963fSdilpreet 	pcie_adv_bdg_error_regs_t *pcie_adv_bdg_regs;	/* pcie bridge regs */
15900d0963fSdilpreet 	pcie_adv_rc_error_regs_t *pcie_adv_rc_regs;	/* pcie rc regs */
16000d0963fSdilpreet } pcie_adv_error_regs_t;
16100d0963fSdilpreet 
16200d0963fSdilpreet typedef struct pcie_rc_error_regs {
16300d0963fSdilpreet 	uint32_t pcie_rc_status;	/* root complex status register */
16400d0963fSdilpreet 	uint16_t pcie_rc_ctl;		/* root complex control register */
16500d0963fSdilpreet } pcie_rc_error_regs_t;
16600d0963fSdilpreet 
16700d0963fSdilpreet typedef struct pcie_error_regs {
16800d0963fSdilpreet 	uint16_t pcie_vflags;		/* pcie valid flags */
16900d0963fSdilpreet 	uint8_t pcie_cap_ptr;		/* PCI Express capability pointer */
17000d0963fSdilpreet 	uint16_t pcie_cap;		/* PCI Express capability register */
17100d0963fSdilpreet 	uint16_t pcie_err_status;	/* pcie device status register */
17200d0963fSdilpreet 	uint16_t pcie_err_ctl;		/* pcie error control register */
173*8aec9182Sstephh 	uint16_t pcie_dev_cap;		/* pcie device capabilities register */
17400d0963fSdilpreet 	pcix_bdg_error_regs_t *pcix_bdg_regs;	/* pcix bridge regs */
17500d0963fSdilpreet 	pcie_rc_error_regs_t *pcie_rc_regs;	/* pcie root complex regs */
17600d0963fSdilpreet 	pcie_adv_error_regs_t *pcie_adv_regs;	/* pcie advanced err regs */
17700d0963fSdilpreet } pcie_error_regs_t;
17800d0963fSdilpreet 
17900d0963fSdilpreet /*
180*8aec9182Sstephh  * pcie bus specific structure
181*8aec9182Sstephh  */
182*8aec9182Sstephh 
183*8aec9182Sstephh typedef struct pci_fme_bus_specific {
184*8aec9182Sstephh 	int pci_bs_type;
185*8aec9182Sstephh 	uint64_t pci_bs_addr;
186*8aec9182Sstephh 	uint16_t pci_bs_bdf;
187*8aec9182Sstephh 	int pci_bs_flags;
188*8aec9182Sstephh } pci_fme_bus_specific_t;
189*8aec9182Sstephh 
190*8aec9182Sstephh #define	PCI_BS_ADDR_VALID		1
191*8aec9182Sstephh #define	PCI_BS_BDF_VALID		2
192*8aec9182Sstephh 
193*8aec9182Sstephh /*
19400d0963fSdilpreet  * target error queue defines
19500d0963fSdilpreet  */
19600d0963fSdilpreet #define	TARGET_MAX_ERRS			6
19700d0963fSdilpreet #define	TGT_PCI_SPACE_UNKNOWN		4
19800d0963fSdilpreet 
19900d0963fSdilpreet typedef struct pci_target_err {
20000d0963fSdilpreet 	uint64_t tgt_err_addr;
20100d0963fSdilpreet 	uint64_t tgt_err_ena;
20200d0963fSdilpreet 	uint64_t tgt_pci_addr;
20300d0963fSdilpreet 	uint32_t tgt_pci_space;
20400d0963fSdilpreet 	dev_info_t *tgt_dip;
20500d0963fSdilpreet 	char *tgt_err_class;
20600d0963fSdilpreet 	char *tgt_bridge_type;
20700d0963fSdilpreet } pci_target_err_t;
20800d0963fSdilpreet 
20900d0963fSdilpreet #define	PCI_FM_SEV_INC(x)	((x) == DDI_FM_FATAL) ? fatal++ :\
21000d0963fSdilpreet 				(((x) == DDI_FM_NONFATAL) ? nonfatal++ :\
21100d0963fSdilpreet 				(((x) == DDI_FM_UNKNOWN) ? unknown++ : ok++));
21200d0963fSdilpreet 
21300d0963fSdilpreet #define	PCIEX_TYPE_CE			0x0
21400d0963fSdilpreet #define	PCIEX_TYPE_UE			0x1
21500d0963fSdilpreet #define	PCIEX_TYPE_GEN			0x2
21600d0963fSdilpreet #define	PCIEX_TYPE_RC_UE_MSG		0x3
21700d0963fSdilpreet #define	PCIEX_TYPE_RC_CE_MSG		0x4
21800d0963fSdilpreet #define	PCIEX_TYPE_RC_MULT_MSG		0x5
21900d0963fSdilpreet 
22000d0963fSdilpreet #ifdef	__cplusplus
22100d0963fSdilpreet }
22200d0963fSdilpreet #endif
22300d0963fSdilpreet 
22400d0963fSdilpreet #endif	/* _SYS_PCIFM_H */
225