xref: /illumos-gate/usr/src/uts/common/sys/pci_props.h (revision bd97c7ce)
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