Module Name:    src
Committed By:   msaitoh
Date:           Tue May 12 06:32:05 UTC 2020

Modified Files:
        src/sys/arch/x86/x86: cpu.c identcpu_subr.c

Log Message:
Don't use TSC freq value from CPUID if calibration works.

 - When it's the first call of cpu_get_tsc_freq() the HPET is not initialized,
   so try to use CPUID to get TSC freq.
 - If it's the 2nd call, don't use CPUID. Instead, print the difference
   between the calibrated value and CPUID's value if the verbose mode is set.


To generate a diff of this commit:
cvs rdiff -u -r1.190 -r1.191 src/sys/arch/x86/x86/cpu.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/x86/x86/identcpu_subr.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/x86/cpu.c
diff -u src/sys/arch/x86/x86/cpu.c:1.190 src/sys/arch/x86/x86/cpu.c:1.191
--- src/sys/arch/x86/x86/cpu.c:1.190	Fri May  8 22:01:55 2020
+++ src/sys/arch/x86/x86/cpu.c	Tue May 12 06:32:05 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.190 2020/05/08 22:01:55 ad Exp $	*/
+/*	$NetBSD: cpu.c,v 1.191 2020/05/12 06:32:05 msaitoh Exp $	*/
 
 /*
  * Copyright (c) 2000-2020 NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.190 2020/05/08 22:01:55 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.191 2020/05/12 06:32:05 msaitoh Exp $");
 
 #include "opt_ddb.h"
 #include "opt_mpbios.h"		/* for MPDEBUG */
@@ -1320,11 +1320,19 @@ cpu_shutdown(device_t dv, int how)
 void
 cpu_get_tsc_freq(struct cpu_info *ci)
 {
-	uint64_t freq = 0, t0, t1;
+	uint64_t freq = 0, freq_from_cpuid, t0, t1;
 	int64_t overhead;
 
 	if ((ci->ci_flags & CPUF_PRIMARY) != 0 && cpu_hascounter()) {
-		freq = cpu_tsc_freq_cpuid(ci);
+		/*
+		 * If it's the first call of this function, try to get TSC
+		 * freq from CPUID by calling cpu_tsc_freq_cpuid().
+		 * The function also set lapic_per_second variable if it's
+		 * known. This is required for Intel's Comet Lake and newer
+		 * processors to set LAPIC timer correctly.
+		 */
+		if (ci->ci_data.cpu_cc_freq == 0)
+			freq = freq_from_cpuid = cpu_tsc_freq_cpuid(ci);
 #if NHPET > 0
 		if (freq == 0)
 			freq = hpet_tsc_freq();
@@ -1352,6 +1360,13 @@ cpu_get_tsc_freq(struct cpu_info *ci)
 			t1 = cpu_counter();
 			freq = (t1 - t0 - overhead) * 10;
 		}
+		if (ci->ci_data.cpu_cc_freq != 0) {
+			freq_from_cpuid = cpu_tsc_freq_cpuid(ci);
+			if ((freq_from_cpuid != 0)
+			    && (freq != freq_from_cpuid))
+				aprint_verbose_dev(ci->ci_dev, "TSC freq "
+				    "calibrated %" PRIu64 " Hz\n", freq);
+		}
 	} else {
 		freq = cpu_info_primary.ci_data.cpu_cc_freq;
 	}

Index: src/sys/arch/x86/x86/identcpu_subr.c
diff -u src/sys/arch/x86/x86/identcpu_subr.c:1.3 src/sys/arch/x86/x86/identcpu_subr.c:1.4
--- src/sys/arch/x86/x86/identcpu_subr.c:1.3	Sat Apr 25 15:26:18 2020
+++ src/sys/arch/x86/x86/identcpu_subr.c	Tue May 12 06:32:05 2020
@@ -33,7 +33,7 @@
  * See src/usr.sbin/cpuctl/{Makefile, arch/i386.c}).
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: identcpu_subr.c,v 1.3 2020/04/25 15:26:18 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: identcpu_subr.c,v 1.4 2020/05/12 06:32:05 msaitoh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "lapic.h"
@@ -139,8 +139,8 @@ cpu_tsc_freq_cpuid(struct cpu_info *ci)
 #endif
 	}
 	if (freq != 0)
-		aprint_verbose_dev(ci->ci_dev, "TSC freq %" PRIu64 " Hz\n",
-		    freq);
+		aprint_verbose_dev(ci->ci_dev, "TSC freq CPUID %" PRIu64
+		    " Hz\n", freq);
 
 	return freq;
 }

Reply via email to