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)) {
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to