1*bd97c7ceSRobert Mustacchi /* 2*bd97c7ceSRobert Mustacchi * This file and its contents are supplied under the terms of the 3*bd97c7ceSRobert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0. 4*bd97c7ceSRobert Mustacchi * You may only use this file in accordance with the terms of version 5*bd97c7ceSRobert Mustacchi * 1.0 of the CDDL. 6*bd97c7ceSRobert Mustacchi * 7*bd97c7ceSRobert Mustacchi * A full copy of the text of the CDDL should have accompanied this 8*bd97c7ceSRobert Mustacchi * source. A copy of the CDDL is also available via the Internet at 9*bd97c7ceSRobert Mustacchi * http://www.illumos.org/license/CDDL. 10*bd97c7ceSRobert Mustacchi */ 11*bd97c7ceSRobert Mustacchi 12*bd97c7ceSRobert Mustacchi /* 13*bd97c7ceSRobert Mustacchi * Copyright 2023 Oxide Computer Company 14*bd97c7ceSRobert Mustacchi */ 15*bd97c7ceSRobert Mustacchi 16*bd97c7ceSRobert Mustacchi #ifndef _SYS_PCI_PROPS_H 17*bd97c7ceSRobert Mustacchi #define _SYS_PCI_PROPS_H 18*bd97c7ceSRobert Mustacchi 19*bd97c7ceSRobert Mustacchi /* 20*bd97c7ceSRobert Mustacchi * This contains common structures and functions that are used to initialize and 21*bd97c7ceSRobert Mustacchi * set up PCI related nodes. As we move further towards unifying the PCI boot 22*bd97c7ceSRobert Mustacchi * time and hotplug settings several of the functions here can be consolidated 23*bd97c7ceSRobert Mustacchi * into that single path. 24*bd97c7ceSRobert Mustacchi */ 25*bd97c7ceSRobert Mustacchi 26*bd97c7ceSRobert Mustacchi #include <sys/stdint.h> 27*bd97c7ceSRobert Mustacchi #include <sys/dditypes.h> 28*bd97c7ceSRobert Mustacchi 29*bd97c7ceSRobert Mustacchi #ifdef __cplusplus 30*bd97c7ceSRobert Mustacchi extern "C" { 31*bd97c7ceSRobert Mustacchi #endif 32*bd97c7ceSRobert Mustacchi 33*bd97c7ceSRobert Mustacchi typedef enum { 34*bd97c7ceSRobert Mustacchi PCI_PROP_F_MULT_FUNC = 1 << 0, 35*bd97c7ceSRobert Mustacchi PCI_PROP_F_PCIE = 1 << 1, 36*bd97c7ceSRobert Mustacchi PCI_PROP_F_SLOT_VALID = 1 << 2 37*bd97c7ceSRobert Mustacchi } pci_prop_flags_t; 38*bd97c7ceSRobert Mustacchi 39*bd97c7ceSRobert Mustacchi typedef struct pci_prop_data { 40*bd97c7ceSRobert Mustacchi pci_prop_flags_t ppd_flags; 41*bd97c7ceSRobert Mustacchi uint8_t ppd_bus; 42*bd97c7ceSRobert Mustacchi uint8_t ppd_dev; 43*bd97c7ceSRobert Mustacchi uint8_t ppd_func; 44*bd97c7ceSRobert Mustacchi uint8_t ppd_rev; 45*bd97c7ceSRobert Mustacchi uint8_t ppd_header; 46*bd97c7ceSRobert Mustacchi uint8_t ppd_class; 47*bd97c7ceSRobert Mustacchi uint8_t ppd_subclass; 48*bd97c7ceSRobert Mustacchi uint8_t ppd_pi; 49*bd97c7ceSRobert Mustacchi uint16_t ppd_vendid; 50*bd97c7ceSRobert Mustacchi uint16_t ppd_devid; 51*bd97c7ceSRobert Mustacchi uint16_t ppd_subvid; 52*bd97c7ceSRobert Mustacchi uint16_t ppd_subsys; 53*bd97c7ceSRobert Mustacchi uint16_t ppd_pcie_type; 54*bd97c7ceSRobert Mustacchi uint16_t ppd_slotno; 55*bd97c7ceSRobert Mustacchi uint8_t ppd_pcie_cap_off; 56*bd97c7ceSRobert Mustacchi uint8_t ppd_ipin; 57*bd97c7ceSRobert Mustacchi uint8_t ppd_mingrt; 58*bd97c7ceSRobert Mustacchi uint8_t ppd_maxlat; 59*bd97c7ceSRobert Mustacchi uint16_t ppd_status; 60*bd97c7ceSRobert Mustacchi } pci_prop_data_t; 61*bd97c7ceSRobert Mustacchi 62*bd97c7ceSRobert Mustacchi typedef enum { 63*bd97c7ceSRobert Mustacchi PCI_PROP_OK = 0, 64*bd97c7ceSRobert Mustacchi /* 65*bd97c7ceSRobert Mustacchi * Indicates that we could not successfully read a given field from the 66*bd97c7ceSRobert Mustacchi * device (e.g. getting all 1s when reading the vendor ID). 67*bd97c7ceSRobert Mustacchi */ 68*bd97c7ceSRobert Mustacchi PCI_PROP_E_BAD_READ, 69*bd97c7ceSRobert Mustacchi /* 70*bd97c7ceSRobert Mustacchi * Indicates that we encountered an unknown header type. The ppd_header 71*bd97c7ceSRobert Mustacchi * field will be valid on this failure as will the basic device, vendor, 72*bd97c7ceSRobert Mustacchi * revision, and class IDs. 73*bd97c7ceSRobert Mustacchi */ 74*bd97c7ceSRobert Mustacchi PCI_PROP_E_UNKNOWN_HEADER, 75*bd97c7ceSRobert Mustacchi /* 76*bd97c7ceSRobert Mustacchi * Indicates that we found an unknown and unsupported PCIe capability 77*bd97c7ceSRobert Mustacchi * structure. 78*bd97c7ceSRobert Mustacchi */ 79*bd97c7ceSRobert Mustacchi PCI_PROP_E_BAD_PCIE_CAP, 80*bd97c7ceSRobert Mustacchi /* 81*bd97c7ceSRobert Mustacchi * Indicates that an NDI or DDI failure occurred respectively. 82*bd97c7ceSRobert Mustacchi */ 83*bd97c7ceSRobert Mustacchi PCI_PROP_E_NDI, 84*bd97c7ceSRobert Mustacchi PCI_PROP_E_DDI 85*bd97c7ceSRobert Mustacchi } pci_prop_failure_t; 86*bd97c7ceSRobert Mustacchi 87*bd97c7ceSRobert Mustacchi extern pci_prop_failure_t pci_prop_data_fill(ddi_acc_handle_t, uint8_t, uint8_t, 88*bd97c7ceSRobert Mustacchi uint8_t, pci_prop_data_t *); 89*bd97c7ceSRobert Mustacchi extern pci_prop_failure_t pci_prop_name_node(dev_info_t *, 90*bd97c7ceSRobert Mustacchi const pci_prop_data_t *); 91*bd97c7ceSRobert Mustacchi extern pci_prop_failure_t pci_prop_set_common_props(dev_info_t *, 92*bd97c7ceSRobert Mustacchi const pci_prop_data_t *); 93*bd97c7ceSRobert Mustacchi extern pci_prop_failure_t pci_prop_set_compatible(dev_info_t *, 94*bd97c7ceSRobert Mustacchi const pci_prop_data_t *); 95*bd97c7ceSRobert Mustacchi 96*bd97c7ceSRobert Mustacchi /* 97*bd97c7ceSRobert Mustacchi * This is currently exported so there is a single implementation of this logic. 98*bd97c7ceSRobert Mustacchi */ 99*bd97c7ceSRobert Mustacchi extern boolean_t pci_prop_class_is_vga(const pci_prop_data_t *); 100*bd97c7ceSRobert Mustacchi extern boolean_t pci_prop_class_is_isa(const pci_prop_data_t *); 101*bd97c7ceSRobert Mustacchi extern boolean_t pci_prop_class_is_ioapic(const pci_prop_data_t *); 102*bd97c7ceSRobert Mustacchi extern boolean_t pci_prop_class_is_pcibridge(const pci_prop_data_t *); 103*bd97c7ceSRobert Mustacchi 104*bd97c7ceSRobert Mustacchi #ifdef __cplusplus 105*bd97c7ceSRobert Mustacchi } 106*bd97c7ceSRobert Mustacchi #endif 107*bd97c7ceSRobert Mustacchi 108*bd97c7ceSRobert Mustacchi #endif /* _SYS_PCI_PROPS_H */ 109