]> git.hungrycats.org Git - linux/commitdiff
[ACPI] add _PDC support
authorDominik Brodowski <linux@dominikbrodowski.de>
Fri, 30 Jan 2004 16:56:11 +0000 (11:56 -0500)
committerLen Brown <lenb@dhcppc3.>
Fri, 30 Jan 2004 16:56:11 +0000 (11:56 -0500)
Add support for _PDC to the ACPI processor "Performance States library"
(perflib). If this field is empty, a bogus entry is passed to the _PDC
method so that the default (io) access is returned again. This patch
is partly based on David Moore's patch to
arch/i386/kernel/cpu/cpufreq/acpi.c, sent to the cpufreq mailing list on
June 24th, 2003.

drivers/acpi/processor.c
include/acpi/processor.h

index 530a3848aa4b64306257a75052391c0901446611..0c33b088e70f2d1ff72821ec294f50e8212c05eb 100644 (file)
@@ -862,6 +862,33 @@ static void acpi_processor_ppc_exit(void) {
  * acpi_processor_performance.
  */
 
+static int acpi_processor_set_pdc (struct acpi_processor *pr)
+{
+       acpi_status             status = AE_OK;
+       u32                     arg0_buf[3];
+       union acpi_object       arg0 = {ACPI_TYPE_BUFFER};
+       struct acpi_object_list no_object = {1, &arg0};
+       struct acpi_object_list *pdc;
+
+       ACPI_FUNCTION_TRACE("acpi_processor_set_pdc");
+       
+       arg0.buffer.length = 12;
+       arg0.buffer.pointer = (u8 *) arg0_buf;
+       arg0_buf[0] = ACPI_PDC_REVISION_ID;
+       arg0_buf[1] = 0;
+       arg0_buf[2] = 0;
+
+       pdc = (pr->performance->pdc) ? pr->performance->pdc : &no_object;
+
+       status = acpi_evaluate_object(pr->handle, "_PDC", pdc, NULL);
+
+       if ((ACPI_FAILURE(status)) && (pr->performance->pdc))
+               ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Error evaluating _PDC, using legacy perf. control...\n"));
+
+       return_VALUE(status);
+}
+
+
 static int 
 acpi_processor_get_performance_control (
        struct acpi_processor *pr)
@@ -1029,6 +1056,8 @@ acpi_processor_get_performance_info (
                return_VALUE(-ENODEV);
        }
 
+       acpi_processor_set_pdc(pr);
+
        result = acpi_processor_get_performance_control(pr);
        if (result)
                return_VALUE(result);
@@ -1037,6 +1066,10 @@ acpi_processor_get_performance_info (
        if (result)
                return_VALUE(result);
 
+       result = acpi_processor_get_platform_limit(pr);
+       if (result)
+               return_VALUE(result);
+
        return_VALUE(0);
 }
 
index 3dfe16b5ccefa21852ee7e5db48d09bf8254f96e..bce3ab80d0f35f11821f8efe5866ffcf32eb27b8 100644 (file)
@@ -67,6 +67,8 @@ struct acpi_processor_px {
        acpi_integer            status;                 /* success indicator */
 };
 
+#define ACPI_PDC_REVISION_ID                   0x1
+
 struct acpi_processor_performance {
        unsigned int             state;
        unsigned int             platform_limit;
@@ -74,9 +76,13 @@ struct acpi_processor_performance {
        struct acpi_pct_register status_register;
        unsigned int             state_count;
        struct acpi_processor_px states[ACPI_PROCESSOR_MAX_PERFORMANCE];
+
+       /* the _PDC objects passed by the driver, if any */
+       struct acpi_object_list *pdc;
 };
 
 
+
 /* Throttling Control */
 
 struct acpi_processor_tx {