mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-10 15:19:51 +00:00
PCI: ignore bit0 of _OSC return code
Currently acpi_run_osc() checks all the bits in _OSC result code (the first DWORD in the capabilities buffer) to see error condition. But the bit 0, which doesn't indicate any error, must be ignored. The bit 0 is used as the query flag at _OSC invocation time. Some platforms clear it during _OSC evaluation, but the others don't. On latter platforms, current acpi_run_osc() mis-detects error when _OSC is evaluated with query flag set because it doesn't ignore the bit 0. Because of this, the __acpi_query_osc() always fails on such platforms. And this is the cause of the problem that pci_osc_control_set() doesn't work since the commit 4e39432f4df544d3dfe4fc90a22d87de64d15815 which changed pci_osc_control_set() to use __acpi_query_osc(). Tested-by:"Tomasz Czernecki <czernecki@gmail.com> Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
This commit is contained in:
parent
f21f237cf5
commit
2485b8674b
@ -63,7 +63,7 @@ static acpi_status acpi_run_osc(acpi_handle handle,
|
||||
union acpi_object in_params[4];
|
||||
struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER, NULL};
|
||||
union acpi_object *out_obj;
|
||||
u32 osc_dw0, flags = osc_args->capbuf[OSC_QUERY_TYPE];
|
||||
u32 errors, flags = osc_args->capbuf[OSC_QUERY_TYPE];
|
||||
|
||||
/* Setting up input parameters */
|
||||
input.count = 4;
|
||||
@ -92,15 +92,16 @@ static acpi_status acpi_run_osc(acpi_handle handle,
|
||||
status = AE_TYPE;
|
||||
goto out_kfree;
|
||||
}
|
||||
osc_dw0 = *((u32 *)out_obj->buffer.pointer);
|
||||
if (osc_dw0) {
|
||||
if (osc_dw0 & OSC_REQUEST_ERROR)
|
||||
/* Need to ignore the bit0 in result code */
|
||||
errors = *((u32 *)out_obj->buffer.pointer) & ~(1 << 0);
|
||||
if (errors) {
|
||||
if (errors & OSC_REQUEST_ERROR)
|
||||
printk(KERN_DEBUG "_OSC request fails\n");
|
||||
if (osc_dw0 & OSC_INVALID_UUID_ERROR)
|
||||
if (errors & OSC_INVALID_UUID_ERROR)
|
||||
printk(KERN_DEBUG "_OSC invalid UUID\n");
|
||||
if (osc_dw0 & OSC_INVALID_REVISION_ERROR)
|
||||
if (errors & OSC_INVALID_REVISION_ERROR)
|
||||
printk(KERN_DEBUG "_OSC invalid revision\n");
|
||||
if (osc_dw0 & OSC_CAPABILITIES_MASK_ERROR) {
|
||||
if (errors & OSC_CAPABILITIES_MASK_ERROR) {
|
||||
if (flags & OSC_QUERY_ENABLE)
|
||||
goto out_success;
|
||||
printk(KERN_DEBUG "_OSC FW not grant req. control\n");
|
||||
|
Loading…
x
Reference in New Issue
Block a user