[CPUFREQ] pcc driver should check for pcch method before calling _OSC

The pcc specification documents an _OSC method that's incompatible with the
one defined as part of the ACPI spec. This shouldn't be a problem as both
are supposed to be guarded with a UUID. Unfortunately approximately nobody
(including HP, who wrote this spec) properly check the UUID on entry to the
_OSC call. Right now this could result in surprising behaviour if the pcc
driver performs an _OSC call on a machine that doesn't implement the pcc
specification. Check whether the PCCH method exists first in order to reduce
this probability.

Signed-off-by: Matthew Garrett <mjg@redhat.com>
Cc: Naga Chumbalkar <nagananda.chumbalkar@hp.com>
Signed-off-by: Dave Jones <davej@redhat.com>
This commit is contained in:
Matthew Garrett 2010-07-20 13:52:00 -04:00 коммит произвёл Dave Jones
Родитель 6f90388ac9
Коммит 47f8bcf362
1 изменённых файлов: 5 добавлений и 1 удалений

Просмотреть файл

@ -397,13 +397,17 @@ static int __init pcc_cpufreq_probe(void)
struct pcc_memory_resource *mem_resource; struct pcc_memory_resource *mem_resource;
struct pcc_register_resource *reg_resource; struct pcc_register_resource *reg_resource;
union acpi_object *out_obj, *member; union acpi_object *out_obj, *member;
acpi_handle handle, osc_handle; acpi_handle handle, osc_handle, pcch_handle;
int ret = 0; int ret = 0;
status = acpi_get_handle(NULL, "\\_SB", &handle); status = acpi_get_handle(NULL, "\\_SB", &handle);
if (ACPI_FAILURE(status)) if (ACPI_FAILURE(status))
return -ENODEV; return -ENODEV;
status = acpi_get_handle(handle, "PCCH", &pcch_handle);
if (ACPI_FAILURE(status))
return -ENODEV;
status = acpi_get_handle(handle, "_OSC", &osc_handle); status = acpi_get_handle(handle, "_OSC", &osc_handle);
if (ACPI_SUCCESS(status)) { if (ACPI_SUCCESS(status)) {
ret = pcc_cpufreq_do_osc(&osc_handle); ret = pcc_cpufreq_do_osc(&osc_handle);