Module Name:    src
Committed By:   sborrill
Date:           Mon Oct  5 10:34:07 UTC 2009

Modified Files:
        src/sys/arch/x86/include [netbsd-5]: cpuvar.h
        src/sys/arch/x86/x86 [netbsd-5]: est.c intel_busclock.c

Log Message:
Pull up following revision(s) (requested by jmcneill in ticket #1059):
        sys/arch/x86/include/cpuvar.h:  1.30
        sys/arch/x86/x86/est.c:         1.12
        sys/arch/x86/x86/intel_busclock.c: 1.8

Use the TSC and current multiplier to calculate bus clock on VIA C7 Esther.
Probably needed for all C7 and Nano processors, but to be safe only use this
alternate method on Esther for now.


To generate a diff of this commit:
cvs rdiff -u -r1.27 -r1.27.8.1 src/sys/arch/x86/include/cpuvar.h
cvs rdiff -u -r1.9 -r1.9.10.1 src/sys/arch/x86/x86/est.c
cvs rdiff -u -r1.5.10.1 -r1.5.10.2 src/sys/arch/x86/x86/intel_busclock.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/include/cpuvar.h
diff -u src/sys/arch/x86/include/cpuvar.h:1.27 src/sys/arch/x86/include/cpuvar.h:1.27.8.1
--- src/sys/arch/x86/include/cpuvar.h:1.27	Tue May 13 22:39:17 2008
+++ src/sys/arch/x86/include/cpuvar.h	Mon Oct  5 10:34:07 2009
@@ -1,4 +1,4 @@
-/* 	$NetBSD: cpuvar.h,v 1.27 2008/05/13 22:39:17 ad Exp $ */
+/* 	$NetBSD: cpuvar.h,v 1.27.8.1 2009/10/05 10:34:07 sborrill Exp $ */
 
 /*-
  * Copyright (c) 2000, 2007 The NetBSD Foundation, Inc.
@@ -127,6 +127,7 @@
 #ifdef ENHANCED_SPEEDSTEP
 void	est_init(int);
 int	via_get_bus_clock(struct cpu_info *);
+int	viac7_get_bus_clock(struct cpu_info *);
 int	p3_get_bus_clock(struct cpu_info *);
 int	p4_get_bus_clock(struct cpu_info *);
 #endif

Index: src/sys/arch/x86/x86/est.c
diff -u src/sys/arch/x86/x86/est.c:1.9 src/sys/arch/x86/x86/est.c:1.9.10.1
--- src/sys/arch/x86/x86/est.c:1.9	Mon Apr 28 20:23:40 2008
+++ src/sys/arch/x86/x86/est.c	Mon Oct  5 10:34:07 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: est.c,v 1.9 2008/04/28 20:23:40 martin Exp $	*/
+/*	$NetBSD: est.c,v 1.9.10.1 2009/10/05 10:34:07 sborrill Exp $	*/
 /*
  * Copyright (c) 2003 Michael Eriksson.
  * All rights reserved.
@@ -81,7 +81,7 @@
 /* #define EST_DEBUG */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: est.c,v 1.9 2008/04/28 20:23:40 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: est.c,v 1.9.10.1 2009/10/05 10:34:07 sborrill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1088,9 +1088,17 @@
 	if (CPUID2FAMILY(curcpu()->ci_signature) == 15)
 		bus_clock = p4_get_bus_clock(curcpu());
 	else if (CPUID2FAMILY(curcpu()->ci_signature) == 6) {
-		if (vendor == CPUVENDOR_IDT)
-			bus_clock = via_get_bus_clock(curcpu());
-		else
+		if (vendor == CPUVENDOR_IDT) {
+			switch (CPUID2MODEL(curcpu()->ci_signature)) {
+			case 0xa: /* C7 Esther */
+			case 0xd: /* C7 Esther */
+				bus_clock = viac7_get_bus_clock(curcpu());
+				break;
+			default:
+				bus_clock = via_get_bus_clock(curcpu());
+				break;
+			}
+		} else
 			bus_clock = p3_get_bus_clock(curcpu());
 	}
 

Index: src/sys/arch/x86/x86/intel_busclock.c
diff -u src/sys/arch/x86/x86/intel_busclock.c:1.5.10.1 src/sys/arch/x86/x86/intel_busclock.c:1.5.10.2
--- src/sys/arch/x86/x86/intel_busclock.c:1.5.10.1	Fri Nov 14 02:49:37 2008
+++ src/sys/arch/x86/x86/intel_busclock.c	Mon Oct  5 10:34:07 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: intel_busclock.c,v 1.5.10.1 2008/11/14 02:49:37 snj Exp $	*/
+/*	$NetBSD: intel_busclock.c,v 1.5.10.2 2009/10/05 10:34:07 sborrill Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intel_busclock.c,v 1.5.10.1 2008/11/14 02:49:37 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intel_busclock.c,v 1.5.10.2 2009/10/05 10:34:07 sborrill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -72,6 +72,21 @@
 }
 
 int
+viac7_get_bus_clock(struct cpu_info *ci)
+{
+	uint64_t msr;
+	int mult;
+
+	msr = rdmsr(MSR_PERF_STATUS);
+	mult = (msr >> 8) & 0xff;
+	if (mult == 0)
+		return 0;
+
+	return ((ci->ci_data.cpu_cc_freq + 10000000) / 10000000 * 10000000) /
+		 mult / 10000;
+}
+
+int
 p3_get_bus_clock(struct cpu_info *ci)
 {
 	uint64_t msr;

Reply via email to