Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 29 Apr 2020 10:53:35 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r360455 - stable/12/sys/x86/x86
Message-ID:  <202004291053.03TArZen014624@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Wed Apr 29 10:53:35 2020
New Revision: 360455
URL: https://svnweb.freebsd.org/changeset/base/360455

Log:
  MFC r359997:
  Improve TSC calibration logic.

Modified:
  stable/12/sys/x86/x86/tsc.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/x86/x86/tsc.c
==============================================================================
--- stable/12/sys/x86/x86/tsc.c	Wed Apr 29 05:11:17 2020	(r360454)
+++ stable/12/sys/x86/x86/tsc.c	Wed Apr 29 10:53:35 2020	(r360455)
@@ -82,8 +82,8 @@ SYSCTL_INT(_machdep, OID_AUTO, disable_tsc, CTLFLAG_RD
     "Disable x86 Time Stamp Counter");
 
 static int	tsc_skip_calibration;
-SYSCTL_INT(_machdep, OID_AUTO, disable_tsc_calibration, CTLFLAG_RDTUN |
-    CTLFLAG_NOFETCH, &tsc_skip_calibration, 0,
+SYSCTL_INT(_machdep, OID_AUTO, disable_tsc_calibration, CTLFLAG_RDTUN,
+    &tsc_skip_calibration, 0,
     "Disable TSC frequency calibration");
 
 static void tsc_freq_changed(void *arg, const struct cf_level *level,
@@ -230,7 +230,6 @@ probe_tsc_freq(void)
 	u_int regs[4];
 	uint64_t tmp_freq, tsc1, tsc2;
 	int no_cpuid_override;
-	uint16_t bootflags;
 
 	if (cpu_high >= 6) {
 		do_cpuid(6, regs);
@@ -291,30 +290,13 @@ probe_tsc_freq(void)
 		break;
 	}
 
-	if (!TUNABLE_INT_FETCH("machdep.disable_tsc_calibration",
-	    &tsc_skip_calibration)) {
-		/*
-		 * User did not give the order about calibration.
-		 * If he did, we do not try to guess.
-		 *
-		 * Otherwise, if ACPI FADT reports that the platform
-		 * is legacy-free and CPUID provides TSC frequency,
-		 * use it.  The calibration could fail anyway since
-		 * ISA timer can be absent or power gated.
-		 */
-		if (acpi_get_fadt_bootflags(&bootflags) &&
-		    (bootflags & ACPI_FADT_LEGACY_DEVICES) == 0 &&
-		    tsc_freq_cpuid(&tmp_freq)) {
-			printf("Skipping TSC calibration since no legacy "
-			    "devices reported by FADT and CPUID works\n");
-			tsc_skip_calibration = 1;
-		}
-	}
 	if (tsc_skip_calibration) {
 		if (tsc_freq_cpuid(&tmp_freq))
 			tsc_freq = tmp_freq;
 		else if (cpu_vendor_id == CPU_VENDOR_INTEL)
 			tsc_freq_intel();
+		if (tsc_freq == 0)
+			tsc_disabled = 1;
 	} else {
 		if (bootverbose)
 			printf("Calibrating TSC clock ... ");
@@ -328,8 +310,9 @@ probe_tsc_freq(void)
 		 * the frequency reported by CPUID 0x15/0x16 leafs
 		 * differ significantly, this probably means that
 		 * calibration is bogus.  It happens on machines
-		 * without 8254 timer and with BIOS not properly
-		 * reporting it in FADT boot flags.
+		 * without 8254 timer.  The BIOS rarely properly
+		 * reports it in FADT boot flags, so just compare the
+		 * frequencies directly.
 		 */
 		if (tsc_freq_cpuid(&tmp_freq) && qabs(tsc_freq - tmp_freq) >
 		    uqmin(tsc_freq, tmp_freq)) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202004291053.03TArZen014624>