svn commit: r335628 - stable/11/sys/x86/x86
Andriy Gapon
avg at FreeBSD.org
Mon Jun 25 09:19:51 UTC 2018
Author: avg
Date: Mon Jun 25 09:19:50 2018
New Revision: 335628
URL: https://svnweb.freebsd.org/changeset/base/335628
Log:
MFC r333638: calibrate lapic timer in native_lapic_setup
Modified:
stable/11/sys/x86/x86/local_apic.c
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/sys/x86/x86/local_apic.c
==============================================================================
--- stable/11/sys/x86/x86/local_apic.c Mon Jun 25 08:57:03 2018 (r335627)
+++ stable/11/sys/x86/x86/local_apic.c Mon Jun 25 09:19:50 2018 (r335628)
@@ -202,6 +202,9 @@ SYSCTL_INT(_hw_apic, OID_AUTO, eoi_suppression, CTLFLA
SYSCTL_INT(_hw_apic, OID_AUTO, timer_tsc_deadline, CTLFLAG_RD,
&lapic_timer_tsc_deadline, 0, "");
+static void lapic_calibrate_initcount(struct lapic *la);
+static void lapic_calibrate_deadline(struct lapic *la);
+
static uint32_t
lapic_read32(enum LAPIC_REGISTERS reg)
{
@@ -783,6 +786,13 @@ native_lapic_setup(int boot)
intrcnt_add(buf, &la->la_timer_count);
}
+ /* Calibrate the timer parameters using BSP. */
+ if (boot && IS_BSP()) {
+ lapic_calibrate_initcount(la);
+ if (lapic_timer_tsc_deadline)
+ lapic_calibrate_deadline(la);
+ }
+
/* Setup the timer if configured. */
if (la->la_timer_mode != LAT_MODE_UNDEF) {
KASSERT(la->la_timer_period != 0, ("lapic%u: zero divisor",
@@ -917,7 +927,7 @@ native_lapic_disable_pmc(void)
}
static void
-lapic_calibrate_initcount(struct eventtimer *et, struct lapic *la)
+lapic_calibrate_initcount(struct lapic *la)
{
u_long value;
@@ -943,7 +953,7 @@ lapic_calibrate_initcount(struct eventtimer *et, struc
}
static void
-lapic_calibrate_deadline(struct eventtimer *et, struct lapic *la __unused)
+lapic_calibrate_deadline(struct lapic *la __unused)
{
if (bootverbose) {
@@ -985,11 +995,6 @@ lapic_et_start(struct eventtimer *et, sbintime_t first
struct lapic *la;
la = &lapics[PCPU_GET(apic_id)];
- if (et->et_frequency == 0) {
- lapic_calibrate_initcount(et, la);
- if (lapic_timer_tsc_deadline)
- lapic_calibrate_deadline(et, la);
- }
if (period != 0) {
lapic_change_mode(et, la, LAT_MODE_PERIODIC);
la->la_timer_period = ((uint32_t)et->et_frequency * period) >>
More information about the svn-src-stable
mailing list