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