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