Module Name: src Committed By: jmcneill Date: Fri Oct 2 15:05:42 UTC 2009
Modified Files: src/sys/arch/x86/include: cpuvar.h src/sys/arch/x86/x86: est.c intel_busclock.c Log Message: 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. Now est on my C7-M 1.6GHz properly reports frequencies from 1600 to 400, instead of 2133 to 533. To generate a diff of this commit: cvs rdiff -u -r1.29 -r1.30 src/sys/arch/x86/include/cpuvar.h cvs rdiff -u -r1.11 -r1.12 src/sys/arch/x86/x86/est.c cvs rdiff -u -r1.7 -r1.8 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.29 src/sys/arch/x86/include/cpuvar.h:1.30 --- src/sys/arch/x86/include/cpuvar.h:1.29 Wed Aug 5 20:15:36 2009 +++ src/sys/arch/x86/include/cpuvar.h Fri Oct 2 15:05:42 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: cpuvar.h,v 1.29 2009/08/05 20:15:36 jym Exp $ */ +/* $NetBSD: cpuvar.h,v 1.30 2009/10/02 15:05:42 jmcneill Exp $ */ /*- * Copyright (c) 2000, 2007 The NetBSD Foundation, Inc. @@ -129,6 +129,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.11 src/sys/arch/x86/x86/est.c:1.12 --- src/sys/arch/x86/x86/est.c:1.11 Wed Mar 25 22:53:51 2009 +++ src/sys/arch/x86/x86/est.c Fri Oct 2 15:05:42 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: est.c,v 1.11 2009/03/25 22:53:51 dyoung Exp $ */ +/* $NetBSD: est.c,v 1.12 2009/10/02 15:05:42 jmcneill 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.11 2009/03/25 22:53:51 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: est.c,v 1.12 2009/10/02 15:05:42 jmcneill Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -1089,9 +1089,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.7 src/sys/arch/x86/x86/intel_busclock.c:1.8 --- src/sys/arch/x86/x86/intel_busclock.c:1.7 Wed Mar 25 22:53:51 2009 +++ src/sys/arch/x86/x86/intel_busclock.c Fri Oct 2 15:05:42 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: intel_busclock.c,v 1.7 2009/03/25 22:53:51 dyoung Exp $ */ +/* $NetBSD: intel_busclock.c,v 1.8 2009/10/02 15:05:42 jmcneill 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.7 2009/03/25 22:53:51 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: intel_busclock.c,v 1.8 2009/10/02 15:05:42 jmcneill Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -73,6 +73,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;