Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ACPI: scan: Avoid enumerating devices with clearly invalid _STA values

The return value of _STA with the "present" bit unset and the "enabled"
bit set is clearly invalid as per the ACPI specification, Section 6.3.7
"_STA (Device Status)", so make the ACPI device enumeration code
disregard devices with such _STA return values.

Also, because this implies that status.enabled will only be set if
status.present is set too, acpi_device_is_enabled() can be modified
to simply return the value of the former.

Link: https://uefi.org/specs/ACPI/6.5/06_Device_Configuration.html#sta-device-status
Link: https://lore.kernel.org/linux-acpi/88179311a503493099028c12ca37d430@huawei.com/
Suggested-by: Salil Mehta <salil.mehta@huawei.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: Sudeep Holla <sudeep.holla@arm.com>

+12 -1
+11
drivers/acpi/bus.c
··· 112 112 if (ACPI_FAILURE(status)) 113 113 return -ENODEV; 114 114 115 + if (!device->status.present && device->status.enabled) { 116 + pr_info(FW_BUG "Device [%s] status [%08x]: not present and enabled\n", 117 + device->pnp.bus_id, (u32)sta); 118 + device->status.enabled = 0; 119 + /* 120 + * The status is clearly invalid, so clear the functional bit as 121 + * well to avoid attempting to use the device. 122 + */ 123 + device->status.functional = 0; 124 + } 125 + 115 126 acpi_set_device_status(device, sta); 116 127 117 128 if (device->status.functional && !device->status.present) {
+1 -1
drivers/acpi/scan.c
··· 1962 1962 1963 1963 bool acpi_device_is_enabled(const struct acpi_device *adev) 1964 1964 { 1965 - return adev->status.present && adev->status.enabled; 1965 + return adev->status.enabled; 1966 1966 } 1967 1967 1968 1968 static bool acpi_scan_handler_matching(struct acpi_scan_handler *handler,