Module Name:    src
Committed By:   mlelstv
Date:           Sun Aug 14 07:49:33 UTC 2022

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

Log Message:
Split TSC calibtration into many small steps and disable interrupts
for each step. Also add debug messages.


To generate a diff of this commit:
cvs rdiff -u -r1.203 -r1.204 src/sys/arch/x86/x86/cpu.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.203 src/sys/arch/x86/x86/cpu.c:1.204
--- src/sys/arch/x86/x86/cpu.c:1.203	Fri Apr  1 19:57:22 2022
+++ src/sys/arch/x86/x86/cpu.c	Sun Aug 14 07:49:33 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.203 2022/04/01 19:57:22 riastradh Exp $	*/
+/*	$NetBSD: cpu.c,v 1.204 2022/08/14 07:49:33 mlelstv Exp $	*/
 
 /*
  * Copyright (c) 2000-2020 NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.203 2022/04/01 19:57:22 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.204 2022/08/14 07:49:33 mlelstv Exp $");
 
 #include "opt_ddb.h"
 #include "opt_mpbios.h"		/* for MPDEBUG */
@@ -1336,9 +1336,16 @@ cpu_get_tsc_freq(struct cpu_info *ci)
 		 */
 		if (ci->ci_data.cpu_cc_freq == 0)
 			freq = freq_from_cpuid = cpu_tsc_freq_cpuid(ci);
+		if (freq != 0)
+			aprint_debug_dev(ci->ci_dev, "TSC freq "
+			    "from CPUID %" PRIu64 " Hz\n", freq);
 #if NHPET > 0
-		if (freq == 0)
+		if (freq == 0) {
 			freq = hpet_tsc_freq();
+			if (freq != 0)
+				aprint_debug_dev(ci->ci_dev, "TSC freq "
+				    "from HPET %" PRIu64 " Hz\n", freq);
+		}
 #endif
 		if (freq == 0) {
 			/*
@@ -1348,20 +1355,33 @@ cpu_get_tsc_freq(struct cpu_info *ci)
 			 */
 			overhead = 0;
 			for (int i = 0; i <= 8; i++) {
+				const int s = splhigh();
 				t0 = cpu_counter();
 				delay_func(0);
 				t1 = cpu_counter();
+				splx(s);
 				if (i > 0) {
 					overhead += (t1 - t0);
 				}
 			}
 			overhead >>= 3;
 
-			/* Now do the calibration. */
-			t0 = cpu_counter();
-			delay_func(100000);
-			t1 = cpu_counter();
-			freq = (t1 - t0 - overhead) * 10;
+			/*
+			 * Now do the calibration.
+			 */
+			freq = 0;
+			for (int i = 0; i < 1000; i++) {
+				const int s = splhigh();
+				t0 = cpu_counter();
+				delay_func(100);
+				t1 = cpu_counter();
+				splx(s);
+				freq += t1 - t0 - overhead;
+			}
+			freq = freq * 10;
+
+			aprint_debug_dev(ci->ci_dev, "TSC freq "
+			    "from delay %" PRIu64 " Hz\n", freq);
 		}
 		if (ci->ci_data.cpu_cc_freq != 0) {
 			freq_from_cpuid = cpu_tsc_freq_cpuid(ci);

Reply via email to