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;