1 /* SPDX-License-Identifier: GPL-2.0-only */
4 #include <acpi/acpigen.h>
5 #include <acpi/acpigen_pci.h>
6 #include <console/console.h>
7 #include <device/pci.h>
8 #include <device/pci_ids.h>
9 #include <device/xhci.h>
13 #define PCI_XHCI_CLASSCODE 0x0c0330 /* USB3.0 xHCI controller */
15 static unsigned int controller_count
;
16 const struct device_operations xhci_pci_ops
;
19 unsigned int high_speed
;
20 unsigned int super_speed
;
23 __weak
enum cb_err
pci_xhci_get_wake_gpe(const struct device
*dev
, int *gpe
)
29 static void xhci_count_ports(void *context
, const struct xhci_supported_protocol
*data
)
31 struct port_counts
*counts
= context
;
33 switch (data
->major_rev
) {
35 counts
->super_speed
+= data
->port_count
;
38 counts
->high_speed
+= data
->port_count
;
41 printk(BIOS_INFO
, "%s: Unknown USB Version: %#x\n", __func__
, data
->major_rev
);
46 static bool xhci_port_exists(const struct device
*dev
, const struct usb_path
*path
)
48 /* Cache the counts so we don't have to iterate on each invocation. */
50 const struct device
*dev
;
51 struct port_counts counts
;
54 if (cache
.dev
!= dev
) {
55 cache
.counts
.high_speed
= 0;
56 cache
.counts
.super_speed
= 0;
59 xhci_for_each_supported_usb_cap(dev
, &cache
.counts
, xhci_count_ports
);
62 /* port_ids are 0 based */
63 switch (path
->port_type
) {
65 return path
->port_id
< cache
.counts
.super_speed
;
67 return path
->port_id
< cache
.counts
.high_speed
;
69 printk(BIOS_INFO
, "%s: Unknown USB Version: %#x\n", __func__
, path
->port_type
);
74 static const struct device
*get_xhci_dev(const struct device
*dev
)
76 while (dev
&& dev
->ops
!= &xhci_pci_ops
) {
77 if (is_root_device(dev
))
80 dev
= dev
->upstream
->dev
;
86 static const char *xhci_acpi_name(const struct device
*dev
)
91 const struct device
*xhci_dev
;
93 /* Generate ACPI names for the usb_acpi driver */
94 if (dev
->path
.type
== DEVICE_PATH_USB
) {
95 /* Ports index start at 1 */
96 port_id
= dev
->path
.usb
.port_id
+ 1;
98 switch (dev
->path
.usb
.port_type
) {
108 printk(BIOS_INFO
, "%s: Unknown USB Version: %#x\n", __func__
,
109 dev
->path
.usb
.port_type
);
113 xhci_dev
= get_xhci_dev(dev
);
115 die("%s: xHCI controller not found for %s\n", __func__
, dev_path(dev
));
118 * We only want to return an ACPI name for a USB port if the controller
119 * physically has the port. This has the desired side effect of making the
120 * usb_acpi driver skip generating an ACPI node for a device which has
121 * no port. This prevents writing an invalid SSDT table which the OS then
124 if (!xhci_port_exists(xhci_dev
, &dev
->path
.usb
)) {
125 printk(BIOS_WARNING
, "%s: %s does not exist on xHC ", __func__
,
127 /* dev_path uses a static buffer :( */
128 printk(BIOS_WARNING
, "%s\n", dev_path(xhci_dev
));
133 name
= malloc(ACPI_NAME_BUFFER_SIZE
);
134 snprintf(name
, ACPI_NAME_BUFFER_SIZE
, pattern
, port_id
);
138 } else if (dev
->ops
== &xhci_pci_ops
) {
142 printk(BIOS_ERR
, "%s: Unknown device %s\n", __func__
, dev_path(dev
));
147 static void xhci_generate_port_acpi(void *context
, const struct xhci_supported_protocol
*data
)
151 struct port_counts
*counts
= context
;
152 unsigned int *dev_num
;
154 xhci_print_supported_protocol(data
);
156 if (data
->major_rev
== 3) {
158 dev_num
= &counts
->super_speed
;
159 } else if (data
->major_rev
== 2) {
161 dev_num
= &counts
->high_speed
;
163 printk(BIOS_INFO
, "%s: Unknown USB Version: %#x\n", __func__
, data
->major_rev
);
167 for (unsigned int i
= 0; i
< data
->port_count
; ++i
) {
168 snprintf(buf
, sizeof(buf
), format
, ++(*dev_num
));
169 acpigen_write_device(buf
);
170 acpigen_write_name_byte("_ADR", data
->port_offset
+ i
);
175 static void xhci_add_devices(const struct device
*dev
)
177 /* Used by the callback to track how many ports have been seen. */
178 struct port_counts counts
= {0, 0};
180 acpigen_write_device("RHUB");
181 acpigen_write_name_integer("_ADR", 0x00000000);
183 xhci_for_each_supported_usb_cap(dev
, &counts
, xhci_generate_port_acpi
);
188 static void xhci_fill_ssdt(const struct device
*dev
)
191 const char *scope
= acpi_device_scope(dev
);
192 const char *name
= acpi_device_name(dev
);
197 printk(BIOS_DEBUG
, "xHCI SSDT generation\n");
199 acpigen_write_scope(scope
);
200 acpigen_write_device(name
);
202 acpigen_write_ADR_pci_device(dev
);
203 acpigen_write_name_string("_DDN", "xHC - Extensible Host Controller");
204 acpigen_write_STA(acpi_device_status(dev
));
206 if (pci_xhci_get_wake_gpe(dev
, &gpe
) == CB_SUCCESS
) {
207 printk(BIOS_DEBUG
, "%s: Got GPE %d for %s\n", __func__
, gpe
, dev_path(dev
));
209 printk(BIOS_ERR
, "%s: Error getting GPE for : %s\n", __func__
, dev_path(dev
));
214 acpigen_write_PRW(gpe
, SLP_TYP_S3
);
215 acpigen_write_name_integer("_S0W", ACPI_DEVICE_SLEEP_D0
);
216 acpigen_write_name_integer("_S3W", ACPI_DEVICE_SLEEP_D3_COLD
);
217 acpigen_write_name_integer("_S4W", ACPI_DEVICE_SLEEP_D3_COLD
);
220 xhci_add_devices(dev
);
226 static void xhci_enable(struct device
*dev
)
229 uint32_t class = pci_read_config32(dev
, PCI_CLASS_REVISION
);
230 /* Class code, the upper 3 bytes of PCI_CLASS_REVISION. */
233 if (class != PCI_XHCI_CLASSCODE
) {
234 printk(BIOS_ERR
, "Incorrect xHCI class code: %#x\n", class);
239 name
= malloc(ACPI_NAME_BUFFER_SIZE
);
240 snprintf(name
, ACPI_NAME_BUFFER_SIZE
, "XHC%d", controller_count
++);
244 const struct device_operations xhci_pci_ops
= {
245 .read_resources
= pci_dev_read_resources
,
246 .set_resources
= pci_dev_set_resources
,
247 .enable_resources
= pci_dev_enable_resources
,
248 .init
= pci_dev_init
,
249 .scan_bus
= scan_static_bus
,
250 .enable
= xhci_enable
,
251 .ops_pci
= &pci_dev_ops_pci
,
252 .acpi_fill_ssdt
= xhci_fill_ssdt
,
253 .acpi_name
= xhci_acpi_name
,