Module Name:    src
Committed By:   jruoho
Date:           Tue Nov 30 04:31:00 UTC 2010

Modified Files:
        src/sys/arch/x86/acpi: acpi_cpu_md.c
        src/sys/dev/acpi: acpi_cpu.h acpi_cpu_cstate.c

Log Message:
Add AMD C1E quirk. Tested by ceg...@.

  (a) This should be removed once C-states are supported.

  (b) As there seems to be no reliable way to detect whether C1E is present,
      the quirk blindly assumes that C1E is used on families 10h and 11h.


To generate a diff of this commit:
cvs rdiff -u -r1.34 -r1.35 src/sys/arch/x86/acpi/acpi_cpu_md.c
cvs rdiff -u -r1.25 -r1.26 src/sys/dev/acpi/acpi_cpu.h
cvs rdiff -u -r1.33 -r1.34 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/arch/x86/acpi/acpi_cpu_md.c
diff -u src/sys/arch/x86/acpi/acpi_cpu_md.c:1.34 src/sys/arch/x86/acpi/acpi_cpu_md.c:1.35
--- src/sys/arch/x86/acpi/acpi_cpu_md.c:1.34	Wed Aug 25 05:07:43 2010
+++ src/sys/arch/x86/acpi/acpi_cpu_md.c	Tue Nov 30 04:31:00 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_cpu_md.c,v 1.34 2010/08/25 05:07:43 jruoho Exp $ */
+/* $NetBSD: acpi_cpu_md.c,v 1.35 2010/11/30 04:31:00 jruoho Exp $ */
 
 /*-
  * Copyright (c) 2010 Jukka Ruohonen <[email protected]>
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_md.c,v 1.34 2010/08/25 05:07:43 jruoho Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_md.c,v 1.35 2010/11/30 04:31:00 jruoho Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -48,7 +48,14 @@
 #include <dev/pci/pcivar.h>
 #include <dev/pci/pcidevs.h>
 
-#define ACPICPU_P_STATE_STATUS	0
+/*
+ * AMD C1E.
+ */
+#define MSR_CMPHALT		0xc0010055
+
+#define MSR_CMPHALT_SMI		__BIT(27)
+#define MSR_CMPHALT_C1E		__BIT(28)
+#define MSR_CMPHALT_BMSTS	__BIT(29)
 
 /*
  * AMD families 10h and 11h.
@@ -105,6 +112,7 @@
 
 extern uint32_t cpus_running;
 extern struct acpicpu_softc **acpicpu_sc;
+static bool acpicpu_pstate_status = false;
 static struct sysctllog *acpicpu_log = NULL;
 
 uint32_t
@@ -256,6 +264,9 @@
 
 			if ((regs[3] & CPUID_APM_CPB) != 0)
 				val |= ACPICPU_FLAG_P_TURBO;
+
+			val |= ACPICPU_FLAG_C_C1E;
+			break;
 		}
 
 		break;
@@ -289,6 +300,18 @@
 	return 0;
 }
 
+void
+acpicpu_md_quirks_c1e(void)
+{
+	const uint64_t c1e = MSR_CMPHALT_SMI | MSR_CMPHALT_C1E;
+	uint64_t val;
+
+	val = rdmsr(MSR_CMPHALT);
+
+	if ((val & c1e) != 0)
+		wrmsr(MSR_CMPHALT, val & ~c1e);
+}
+
 uint32_t
 acpicpu_md_cpus_running(void)
 {
@@ -580,7 +603,7 @@
 	xc = xc_broadcast(0, (xcfunc_t)x86_msr_xcall, &msr, NULL);
 	xc_wait(xc);
 
-	if (ACPICPU_P_STATE_STATUS == 0) {
+	if (acpicpu_pstate_status != false) {
 		DELAY(ps->ps_latency);
 		return 0;
 	}

Index: src/sys/dev/acpi/acpi_cpu.h
diff -u src/sys/dev/acpi/acpi_cpu.h:1.25 src/sys/dev/acpi/acpi_cpu.h:1.26
--- src/sys/dev/acpi/acpi_cpu.h:1.25	Fri Aug 27 03:05:26 2010
+++ src/sys/dev/acpi/acpi_cpu.h	Tue Nov 30 04:31:00 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_cpu.h,v 1.25 2010/08/27 03:05:26 jruoho Exp $ */
+/* $NetBSD: acpi_cpu.h,v 1.26 2010/11/30 04:31:00 jruoho Exp $ */
 
 /*-
  * Copyright (c) 2010 Jukka Ruohonen <[email protected]>
@@ -236,6 +236,7 @@
 
 uint32_t	acpicpu_md_cap(void);
 uint32_t	acpicpu_md_quirks(void);
+void		acpicpu_md_quirks_c1e(void);
 uint32_t	acpicpu_md_cpus_running(void);
 int		acpicpu_md_idle_start(struct acpicpu_softc *);
 int		acpicpu_md_idle_stop(void);

Index: src/sys/dev/acpi/acpi_cpu_cstate.c
diff -u src/sys/dev/acpi/acpi_cpu_cstate.c:1.33 src/sys/dev/acpi/acpi_cpu_cstate.c:1.34
--- src/sys/dev/acpi/acpi_cpu_cstate.c:1.33	Mon Aug 23 16:20:45 2010
+++ src/sys/dev/acpi/acpi_cpu_cstate.c	Tue Nov 30 04:31:00 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_cpu_cstate.c,v 1.33 2010/08/23 16:20:45 jruoho Exp $ */
+/* $NetBSD: acpi_cpu_cstate.c,v 1.34 2010/11/30 04:31:00 jruoho Exp $ */
 
 /*-
  * Copyright (c) 2010 Jukka Ruohonen <[email protected]>
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_cstate.c,v 1.33 2010/08/23 16:20:45 jruoho Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_cstate.c,v 1.34 2010/11/30 04:31:00 jruoho Exp $");
 
 #include <sys/param.h>
 #include <sys/cpu.h>
@@ -684,6 +684,12 @@
 	state = acpicpu_cstate_latency(sc);
 
 	/*
+	 * Apply AMD C1E quirk.
+	 */
+	if ((sc->sc_flags & ACPICPU_FLAG_C_C1E) != 0)
+		acpicpu_md_quirks_c1e();
+
+	/*
 	 * Check for bus master activity. Note that particularly usb(4)
 	 * causes high activity, which may prevent the use of C3 states.
 	 */

Reply via email to