Install an ACPI PCI bus notify handler.

Rescan a PCI bus when the ACPI_NOTIFY_BUS_CHECK event is posted to a
PCI bus.

Reviewed by:	scottl
MFC after:	2 weeks
Differential Revision:	https://reviews.freebsd.org/D21948
This commit is contained in:
jhb 2019-10-15 19:12:09 +00:00
parent ce12d00cf5
commit d4c3d2e382

View File

@ -330,6 +330,25 @@ acpi_pci_probe(device_t dev)
return (BUS_PROBE_DEFAULT);
}
static void
acpi_pci_bus_notify_handler(ACPI_HANDLE h, UINT32 notify, void *context)
{
device_t dev;
dev = context;
switch (notify) {
case ACPI_NOTIFY_BUS_CHECK:
mtx_lock(&Giant);
BUS_RESCAN(dev);
mtx_unlock(&Giant);
break;
default:
device_printf(dev, "unknown notify %#x\n", notify);
break;
}
}
static void
acpi_pci_device_notify_handler(ACPI_HANDLE h, UINT32 notify, void *context)
{
@ -401,6 +420,8 @@ acpi_pci_attach(device_t dev)
error = pci_attach(dev);
if (error)
return (error);
AcpiInstallNotifyHandler(acpi_get_handle(dev), ACPI_SYSTEM_NOTIFY,
acpi_pci_bus_notify_handler, dev);
AcpiWalkNamespace(ACPI_TYPE_DEVICE, acpi_get_handle(dev), 1,
acpi_pci_install_device_notify_handler, NULL, dev, NULL);
@ -429,6 +450,8 @@ acpi_pci_detach(device_t dev)
AcpiWalkNamespace(ACPI_TYPE_DEVICE, acpi_get_handle(dev), 1,
acpi_pci_remove_notify_handler, NULL, dev, NULL);
AcpiRemoveNotifyHandler(acpi_get_handle(dev), ACPI_SYSTEM_NOTIFY,
acpi_pci_bus_notify_handler);
return (pci_detach(dev));
}