svn commit: r335634 - head/sys/x86/x86

Konstantin Belousov kib at FreeBSD.org
Mon Jun 25 11:24:27 UTC 2018


Author: kib
Date: Mon Jun 25 11:24:26 2018
New Revision: 335634
URL: https://svnweb.freebsd.org/changeset/base/335634

Log:
  Do not access ISA timer if BIOS reports that there is no legacy
  devices present.
  
  On at least one machine where it would matter since the ISA timer is
  power gated when booted in the UEFI mode, BIOS still reports that the
  legacy devices are present.  That is, user still have to manually
  disable TSC calibration on such machines.  Hopefully it will be more
  useful in the future.
  
  Discussed with:	Ben Widawsky <benjamin.widawsky at intel.com>
  Reviewed by:	royger
  Sponsored by:	The FreeBSD Foundation
  Differential revision:	https://reviews.freebsd.org/D16004
  MFC after:	1 week

Modified:
  head/sys/x86/x86/tsc.c

Modified: head/sys/x86/x86/tsc.c
==============================================================================
--- head/sys/x86/x86/tsc.c	Mon Jun 25 11:12:21 2018	(r335633)
+++ head/sys/x86/x86/tsc.c	Mon Jun 25 11:24:26 2018	(r335634)
@@ -50,6 +50,7 @@ __FBSDID("$FreeBSD$");
 #include <machine/specialreg.h>
 #include <x86/vmware.h>
 #include <dev/acpica/acpi_hpet.h>
+#include <contrib/dev/acpica/include/acpi.h>
 
 #include "cpufreq_if.h"
 
@@ -81,8 +82,9 @@ 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,
-    &tsc_skip_calibration, 0, "Disable TSC frequency calibration");
+SYSCTL_INT(_machdep, OID_AUTO, disable_tsc_calibration, CTLFLAG_RDTUN |
+    CTLFLAG_NOFETCH, &tsc_skip_calibration, 0,
+    "Disable TSC frequency calibration");
 
 static void tsc_freq_changed(void *arg, const struct cf_level *level,
     int status);
@@ -213,6 +215,7 @@ probe_tsc_freq(void)
 {
 	u_int regs[4];
 	uint64_t tsc1, tsc2;
+	uint16_t bootflags;
 
 	if (cpu_high >= 6) {
 		do_cpuid(6, regs);
@@ -272,6 +275,25 @@ 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()) {
+			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())
 			;


More information about the svn-src-head mailing list