Module Name:    src
Committed By:   jruoho
Date:           Sun Jul 25 17:44:01 UTC 2010

Modified Files:
        src/sys/dev/acpi: acpi_cpu.c acpi_cpu_cstate.c

Log Message:
Improve comments. Move the #ifdef around.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/dev/acpi/acpi_cpu.c
cvs rdiff -u -r1.9 -r1.10 src/sys/dev/acpi/acpi_cpu_cstate.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/acpi/acpi_cpu.c
diff -u src/sys/dev/acpi/acpi_cpu.c:1.6 src/sys/dev/acpi/acpi_cpu.c:1.7
--- src/sys/dev/acpi/acpi_cpu.c:1.6	Sat Jul 24 22:44:00 2010
+++ src/sys/dev/acpi/acpi_cpu.c	Sun Jul 25 17:44:01 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_cpu.c,v 1.6 2010/07/24 22:44:00 jruoho Exp $ */
+/* $NetBSD: acpi_cpu.c,v 1.7 2010/07/25 17:44:01 jruoho Exp $ */
 
 /*-
  * Copyright (c) 2010 Jukka Ruohonen <jruoho...@iki.fi>
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_cpu.c,v 1.6 2010/07/24 22:44:00 jruoho Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_cpu.c,v 1.7 2010/07/25 17:44:01 jruoho Exp $");
 
 #include <sys/param.h>
 #include <sys/cpu.h>
@@ -141,10 +141,7 @@
 
 	/*
 	 * We should claim the bus space. However, we do this only
-	 * to announce that the space is in use. This is unnecessary
-	 * if system I/O type C-states are not used. Many systems also
-	 * report invalid values in the processor object. Finally, this
-	 * is known to conflict with other devices. But as is noted in
+	 * to announce that the space is in use. As is noted in
 	 * ichlpcib(4), we can continue our I/O without bus_space(9).
 	 */
 	if (sc->sc_object.ao_pblklen == 6 && sc->sc_object.ao_pblkaddr != 0) {

Index: src/sys/dev/acpi/acpi_cpu_cstate.c
diff -u src/sys/dev/acpi/acpi_cpu_cstate.c:1.9 src/sys/dev/acpi/acpi_cpu_cstate.c:1.10
--- src/sys/dev/acpi/acpi_cpu_cstate.c:1.9	Sat Jul 24 22:44:00 2010
+++ src/sys/dev/acpi/acpi_cpu_cstate.c	Sun Jul 25 17:44:01 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_cpu_cstate.c,v 1.9 2010/07/24 22:44:00 jruoho Exp $ */
+/* $NetBSD: acpi_cpu_cstate.c,v 1.10 2010/07/25 17:44:01 jruoho Exp $ */
 
 /*-
  * Copyright (c) 2010 Jukka Ruohonen <jruoho...@iki.fi>
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_cstate.c,v 1.9 2010/07/24 22:44:00 jruoho Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_cstate.c,v 1.10 2010/07/25 17:44:01 jruoho Exp $");
 
 #include <sys/param.h>
 #include <sys/cpu.h>
@@ -79,6 +79,16 @@
 extern struct acpicpu_softc **acpicpu_sc;
 extern int		      acpi_suspended;
 
+/*
+ * XXX:	The local APIC timer (as well as TSC) is typically
+ *	stopped in C3. For now, we cannot but disable C3.
+ */
+#ifdef ACPICPU_ENABLE_C3
+static int cs_state_max = ACPI_STATE_C3;
+#else
+static int cs_state_max = ACPI_STATE_C2;
+#endif
+
 void
 acpicpu_cstate_attach(device_t self)
 {
@@ -399,13 +409,6 @@
 		goto out;
 	}
 
-	/*
-	 * "When specifically directed by the CPU manufacturer, the
-	 *  system firmware may define an interface as functional
-	 *  fixed hardware by supplying a special address space
-	 *  identifier, FfixedHW (0x7F), in the address space ID
-	 *  field for register definitions (ACPI 3.0, p. 46)".
-	 */
 	reg = (struct acpicpu_reg *)obj->Buffer.Pointer;
 
 	switch (reg->reg_spaceid) {
@@ -463,6 +466,8 @@
 			/*
 			 * The _CST FFH GAS encoding may contain
 			 * additional hints on Intel processors.
+			 * Use these to determine whether we can
+			 * avoid the bus master activity check.
 			 */
 			if ((reg->reg_accesssize & ACPICPU_PDC_GAS_BM) == 0)
 				state.cs_flags &= ~ACPICPU_FLAG_C_BM_STS;
@@ -480,19 +485,6 @@
 		goto out;
 	}
 
-#ifndef ACPICPU_ENABLE_C3
-	/*
-	 * XXX: The local APIC timer (as well as TSC) is typically
-	 *	stopped in C3, causing the timer interrupt to fire
-	 *	haphazardly, depending on how long the system slept.
-	 *	For now, we disable the C3 state unconditionally.
-	 */
-	if (type == ACPI_STATE_C3) {
-		sc->sc_flags |= ACPICPU_FLAG_C_NOC3;
-		goto out;
-	}
-#endif
-
 	cs[type].cs_addr = state.cs_addr;
 	cs[type].cs_power = state.cs_power;
 	cs[type].cs_flags = state.cs_flags;
@@ -623,11 +615,6 @@
 
 	if (AcpiGbl_FADT.C3Latency > ACPICPU_C_C3_LATENCY_MAX)
 		cs[ACPI_STATE_C3].cs_method = 0;
-
-#ifndef ACPICPU_ENABLE_C3
-	cs[ACPI_STATE_C3].cs_method = 0;
-	sc->sc_flags |= ACPICPU_FLAG_C_NOC3;	/* XXX. */
-#endif
 }
 
 static void
@@ -638,7 +625,9 @@
 	struct pci_attach_args pa;
 
 	/*
-	 * Check bus master arbitration.
+	 * Check bus master arbitration. If ARB_DIS
+	 * is not available, processor caches must be
+	 * flushed before C3 (ACPI 4.0, section 8.2).
 	 */
 	if (reg != 0 && len != 0)
 		sc->sc_flags |= ACPICPU_FLAG_C_ARB;
@@ -650,12 +639,13 @@
 			sc->sc_flags |= ACPICPU_FLAG_C_NOC3;
 		else {
 			/*
-			 * If WBINVD is present, but not functioning
-			 * properly according to FADT, flush all CPU
-			 * caches before entering the C3 state.
+			 * If WBINVD is present and functioning properly,
+			 * flush all processor caches before entering C3.
 			 */
 			if ((AcpiGbl_FADT.Flags & ACPI_FADT_WBINVD_FLUSH) == 0)
 				sc->sc_flags &= ~ACPICPU_FLAG_C_BM;
+			else
+				sc->sc_flags |= ACPICPU_FLAG_C_NOC3;
 		}
 	}
 
@@ -690,7 +680,7 @@
 	struct acpicpu_cstate *cs;
 	int i;
 
-	for (i = ACPI_STATE_C3; i > 0; i--) {
+	for (i = cs_state_max; i > 0; i--) {
 
 		cs = &sc->sc_cstate[i];
 
@@ -773,8 +763,8 @@
 		ACPI_FLUSH_CPU_CACHE();
 
 	/*
-	 * Some chipsets may not return back to C0
-	 * from C3 if bus master wake is not enabled.
+	 * Allow the bus master to request that any given
+	 * CPU should return immediately to C0 from C3.
 	 */
 	if ((sc->sc_flags & ACPICPU_FLAG_C_BM) != 0)
 		(void)AcpiWriteBitRegister(ACPI_BITREG_BUS_MASTER_RLD, 1);

Reply via email to