• Rafael J. Wysocki's avatar
    ACPI: scan: Defer enumeration of devices with _DEP lists · 71da201f
    Rafael J. Wysocki authored
    In some cases ACPI control methods used during device enumeration
    (such as _HID or _STA) may rely on Operation Region handlers
    supplied by the drivers of other devices [1]:
    
     An example of this is the Acer Switch 10E SW3-016 model. The _HID
     method of the ACPI node for the UART attached Bluetooth, reads
     GPIOs to detect the installed wifi chip and update the _HID for the
     Bluetooth's ACPI node accordingly. The current ACPI scan code calls
     _HID before the GPIO controller's OpRegions are available, leading
     to the wrong _HID being used and Bluetooth not working.
    
    In principle, in those cases there should be a _DEP control method
    under the device object with OpRegion enumeration dependencies, so
    deferring the enumeration of devices with _DEP returning a non-empty
    list of suppliers of OpRegions depended on by the given device
    (modulo some known exceptions that don't really supply any OpRegions
    and are listed by _DEP for other reasons irrelevant for Linux) should
    at least address the first-order dependencies by allowing the OpRegion
    suppliers to be enumerated before their consumers.
    
    Implement the above idea by modifying acpi_bus_scan() to enumerate
    devices in the given scope of the ACPI namespace in two passes,
    where the first pass covers the devices without "significant" lists
    of dependencies coming from _DEP only and the second pass covers
    all of the devices that were not enumerated in the first pass.
    
    Take _DEP into account only for device objects with _HID, mostly in
    order to avoid deferring the creation of ACPI device objects that
    represent PCI devices and must be present during the enumeration
    of the PCI bus (which takes place during the processing of the ACPI
    device object that represents the host bridge), so that they can
    be properly associated with the corresponding PCI devices.
    
    Link: https://lore.kernel.org/linux-acpi/20201121203040.146252-1-hdegoede@redhat.com/ # [1]
    Reported-by: default avatarHans de Goede <hdegoede@redhat.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
    Tested-by: default avatarHans de Goede <hdegoede@redhat.com>
    Reviewed-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    71da201f
scan.c 61 KB