Module Name:    src
Committed By:   jruoho
Date:           Sat Mar  5 06:39:55 UTC 2011

Modified Files:
        src/sys/arch/x86/acpi: acpi_cpu_md.c

Log Message:
If the P-state control mask is set, do a proper read-modify-write.


To generate a diff of this commit:
cvs rdiff -u -r1.53 -r1.54 src/sys/arch/x86/acpi/acpi_cpu_md.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.53 src/sys/arch/x86/acpi/acpi_cpu_md.c:1.54
--- src/sys/arch/x86/acpi/acpi_cpu_md.c:1.53	Fri Mar  4 12:10:49 2011
+++ src/sys/arch/x86/acpi/acpi_cpu_md.c	Sat Mar  5 06:39:55 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_cpu_md.c,v 1.53 2011/03/04 12:10:49 jruoho Exp $ */
+/* $NetBSD: acpi_cpu_md.c,v 1.54 2011/03/05 06:39:55 jruoho Exp $ */
 
 /*-
  * Copyright (c) 2010, 2011 Jukka Ruohonen <jruoho...@iki.fi>
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_md.c,v 1.53 2011/03/04 12:10:49 jruoho Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_cpu_md.c,v 1.54 2011/03/05 06:39:55 jruoho Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -761,7 +761,7 @@
 int
 acpicpu_md_pstate_set(struct acpicpu_pstate *ps)
 {
-	uint64_t val;
+	uint64_t val = 0;
 
 	if (__predict_false(ps->ps_control_addr == 0))
 		return EINVAL;
@@ -769,10 +769,15 @@
 	if ((ps->ps_flags & ACPICPU_FLAG_P_FIDVID) != 0)
 		return acpicpu_md_pstate_fidvid_set(ps);
 
-	val = ps->ps_control;
+	/*
+	 * If the mask is set, do a read-modify-write.
+	 */
+	if (__predict_true(ps->ps_control_mask != 0)) {
+		val = rdmsr(ps->ps_control_addr);
+		val &= ~ps->ps_control_mask;
+	}
 
-	if (__predict_true(ps->ps_control_mask != 0))
-		val = val & ps->ps_control_mask;
+	val |= ps->ps_control;
 
 	wrmsr(ps->ps_control_addr, val);
 	DELAY(ps->ps_latency);

Reply via email to