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.
*/