#ifndef _SYS_PCIEV_H
#define _SYS_PCIEV_H
#ifdef __cplusplus
extern "C" {
#endif
typedef struct pcie_eh_data {
uint16_t minor_ver;
uint16_t major_ver;
uint16_t pci_err_status;
uint16_t pci_bdg_sec_stat;
uint32_t pcix_status;
uint16_t pcix_bdg_sec_stat;
uint32_t pcix_bdg_stat;
uint16_t pcix_ecc_control_0;
uint16_t pcix_ecc_status_0;
uint32_t pcix_ecc_fst_addr_0;
uint32_t pcix_ecc_sec_addr_0;
uint32_t pcix_ecc_attr_0;
uint16_t pcix_ecc_control_1;
uint16_t pcix_ecc_status_1;
uint32_t pcix_ecc_fst_addr_1;
uint32_t pcix_ecc_sec_addr_1;
uint32_t pcix_ecc_attr_1;
uint16_t pcie_err_status;
uint32_t pcie_ue_status;
uint32_t pcie_ue_hdr[4];
uint32_t pcie_ce_status;
uint32_t pcie_sue_status;
uint32_t pcie_sue_hdr[4];
uint16_t pcie_rp_ctl;
uint32_t pcie_rp_err_status;
uint32_t pcie_rp_err_cmd;
uint16_t pcie_rp_ce_src_id;
uint16_t pcie_rp_ue_src_id;
} pcie_eh_data_t;
typedef struct pcie_domains {
uint_t domain_id;
uint_t cached_count;
uint_t faulty_count;
struct pcie_domains *cached_next;
struct pcie_domains *faulty_prev;
struct pcie_domains *faulty_next;
} pcie_domains_t;
typedef struct pcie_req_id_list {
pcie_req_id_t bdf;
struct pcie_req_id_list *next;
} pcie_req_id_list_t;
typedef struct pcie_child_domains {
pcie_domains_t *ids;
pcie_req_id_list_t *bdfs;
} pcie_child_domains_t;
typedef struct pcie_domain {
union {
pcie_child_domains_t ids;
pcie_domains_t id;
} domain;
uint_t fmadom_count;
uint_t nfmadom_count;
uint_t rootdom_count;
boolean_t nfma_panic;
} pcie_domain_t;
extern void pcie_domain_list_add(uint_t, pcie_domains_t **);
extern void pcie_domain_list_remove(uint_t, pcie_domains_t *);
extern void pcie_save_domain_id(pcie_domains_t *);
extern void pcie_init_dom(dev_info_t *);
extern void pcie_fini_dom(dev_info_t *);
#define PCIE_ASSIGNED_TO_FMA_DOM(bus_p) \
(!PCIE_IS_BDG(bus_p) && PCIE_BUS2DOM(bus_p)->fmadom_count > 0)
#define PCIE_ASSIGNED_TO_NFMA_DOM(bus_p) \
(!PCIE_IS_BDG(bus_p) && PCIE_BUS2DOM(bus_p)->nfmadom_count > 0)
#define PCIE_ASSIGNED_TO_ROOT_DOM(bus_p) \
(PCIE_IS_BDG(bus_p) || PCIE_BUS2DOM(bus_p)->rootdom_count > 0)
#define PCIE_BDG_HAS_CHILDREN_FMA_DOM(bus_p) \
(PCIE_IS_BDG(bus_p) && PCIE_BUS2DOM(bus_p)->fmadom_count > 0)
#define PCIE_BDG_HAS_CHILDREN_NFMA_DOM(bus_p) \
(PCIE_IS_BDG(bus_p) && PCIE_BUS2DOM(bus_p)->nfmadom_count > 0)
#define PCIE_BDG_HAS_CHILDREN_ROOT_DOM(bus_p) \
(PCIE_IS_BDG(bus_p) && PCIE_BUS2DOM(bus_p)->rootdom_count > 0)
#define PCIE_IS_ASSIGNED(bus_p) \
(!PCIE_ASSIGNED_TO_ROOT_DOM(bus_p))
#define PCIE_BDG_IS_UNASSIGNED(bus_p) \
(PCIE_IS_BDG(bus_p) && \
(!PCIE_BDG_HAS_CHILDREN_NFMA_DOM(bus_p)) && \
(!PCIE_BDG_HAS_CHILDREN_FMA_DOM(bus_p)))
#define PCIE_IN_DOMAIN(bus_p, id) (pcie_in_domain((bus_p), (id)))
#define PCIE_DOMAIN_ID_GET(bus_p) \
((uint_t)(PCIE_IS_ASSIGNED(bus_p) \
? PCIE_BUS2DOM(bus_p)->domain.id.domain_id : 0))
#define PCIE_DOMAIN_ID_SET(bus_p, new_id) \
if (!PCIE_IS_BDG(bus_p)) \
PCIE_BUS2DOM(bus_p)->domain.id.domain_id = (uint_t)(new_id)
#define PCIE_DOMAIN_ID_INCR_REF_COUNT(bus_p) \
if (!PCIE_IS_BDG(bus_p)) \
PCIE_BUS2DOM(bus_p)->domain.id.cached_count = 1;
#define PCIE_DOMAIN_ID_DECR_REF_COUNT(bus_p) \
if (!PCIE_IS_BDG(bus_p)) \
PCIE_BUS2DOM(bus_p)->domain.id.cached_count = 0;
#define PCIE_DOMAIN_LIST_GET(bus_p) \
((pcie_domains_t *)(PCIE_IS_BDG(bus_p) ? \
PCIE_BUS2DOM(bus_p)->domain.ids.ids : NULL))
#define PCIE_DOMAIN_LIST_ADD(bus_p, domain_id) \
if (PCIE_IS_BDG(bus_p)) \
pcie_domain_list_add(domain_id, \
&PCIE_BUS2DOM(bus_p)->domain.ids.ids)
#define PCIE_DOMAIN_LIST_REMOVE(bus_p, domain_id) \
if (PCIE_IS_BDG(bus_p)) \
pcie_domain_list_remove(domain_id, \
PCIE_BUS2DOM(bus_p)->domain.ids.ids)
#define PCIE_BDF_LIST_GET(bus_p) \
((pcie_req_id_list_t *)(PCIE_IS_BDG(bus_p) ? \
PCIE_BUS2DOM(bus_p)->domain.ids.bdfs : NULL))
#define PCIE_BDF_LIST_ADD(bus_p, bdf) \
if (PCIE_IS_BDG(bus_p)) \
pcie_bdf_list_add(bdf, &PCIE_BUS2DOM(bus_p)->domain.ids.bdfs)
#define PCIE_BDF_LIST_REMOVE(bus_p, bdf) \
if (PCIE_IS_BDG(bus_p)) \
pcie_bdf_list_remove(bdf, &PCIE_BUS2DOM(bus_p)->domain.ids.bdfs)
#ifdef __cplusplus
}
#endif
#endif