Author: avg
Date: Wed Aug 29 08:44:21 2012
New Revision: 239810
URL: http://svn.freebsd.org/changeset/base/239810

Log:
  MFC r215188: Create C1 state when _CST is valid but _CST does not have one.
  
  On behalf of: jkim

Modified:
  stable/8/sys/dev/acpica/acpi_cpu.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/dev/   (props changed)

Modified: stable/8/sys/dev/acpica/acpi_cpu.c
==============================================================================
--- stable/8/sys/dev/acpica/acpi_cpu.c  Wed Aug 29 08:39:58 2012        
(r239809)
+++ stable/8/sys/dev/acpica/acpi_cpu.c  Wed Aug 29 08:44:21 2012        
(r239810)
@@ -705,9 +705,19 @@ acpi_cpu_cx_cst(struct acpi_cpu_softc *s
        count = MAX_CX_STATES;
     }
 
-    /* Set up all valid states. */
+    sc->cpu_non_c3 = 0;
     sc->cpu_cx_count = 0;
     cx_ptr = sc->cpu_cx_states;
+
+    /*
+     * C1 has been required since just after ACPI 1.0.
+     * Reserve the first slot for it.
+     */
+    cx_ptr->type = ACPI_STATE_C0;
+    cx_ptr++;
+    sc->cpu_cx_count++;
+
+    /* Set up all valid states. */
     for (i = 0; i < count; i++) {
        pkg = &top->Package.Elements[i + 1];
        if (!ACPI_PKG_VALID(pkg, 4) ||
@@ -722,9 +732,14 @@ acpi_cpu_cx_cst(struct acpi_cpu_softc *s
        /* Validate the state to see if we should use it. */
        switch (cx_ptr->type) {
        case ACPI_STATE_C1:
-           sc->cpu_non_c3 = i;
-           cx_ptr++;
-           sc->cpu_cx_count++;
+           if (sc->cpu_cx_states[0].type == ACPI_STATE_C0) {
+               /* This is the first C1 state.  Use the reserved slot. */
+               sc->cpu_cx_states[0] = *cx_ptr;
+           } else {
+               sc->cpu_non_c3 = i;
+               cx_ptr++;
+               sc->cpu_cx_count++;
+           }
            continue;
        case ACPI_STATE_C2:
            sc->cpu_non_c3 = i;
@@ -763,6 +778,13 @@ acpi_cpu_cx_cst(struct acpi_cpu_softc *s
     }
     AcpiOsFree(buf.Pointer);
 
+    /* If C1 state was not found, we need one now. */
+    cx_ptr = sc->cpu_cx_states;
+    if (cx_ptr->type == ACPI_STATE_C0) {
+       cx_ptr->type = ACPI_STATE_C1;
+       cx_ptr->trans_lat = 0;
+    }
+
     return (0);
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to