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>