On Wed, Aug 17, 2022 at 04:53:20PM +1000, Jonathan Gray wrote:
>
> It seems to me it would be cleaner if the decision of what to use for
> delay could be moved into an md file.
>
> Or abstract it by having a numeric weight like timecounters or driver
> match return numbers.
diff against your previous, does not change lapic_delay
diff --git sys/arch/amd64/amd64/machdep.c sys/arch/amd64/amd64/machdep.c
index 932b1dfeb47..c4645b6a6fd 100644
--- sys/arch/amd64/amd64/machdep.c
+++ sys/arch/amd64/amd64/machdep.c
@@ -2069,3 +2069,13 @@ check_context(const struct reg *regs, struct trapframe
*tf)
return 0;
}
+
+void
+delay_init(void(*f)(int), int v)
+{
+ static int c = 0;
+ if (v > c) {
+ delay_func = f;
+ c = v;
+ }
+}
diff --git sys/arch/amd64/amd64/tsc.c sys/arch/amd64/amd64/tsc.c
index fd38dc6359d..8c839357dd2 100644
--- sys/arch/amd64/amd64/tsc.c
+++ sys/arch/amd64/amd64/tsc.c
@@ -109,7 +109,7 @@ tsc_identify(struct cpu_info *ci)
tsc_frequency = tsc_freq_cpuid(ci);
if (tsc_frequency > 0)
- delay_func = tsc_delay;
+ delay_init(tsc_delay, 300);
}
static inline int
diff --git sys/arch/amd64/include/cpu.h sys/arch/amd64/include/cpu.h
index b8db48f2714..a82af172452 100644
--- sys/arch/amd64/include/cpu.h
+++ sys/arch/amd64/include/cpu.h
@@ -359,6 +359,7 @@ void signotify(struct proc *);
* We need a machine-independent name for this.
*/
extern void (*delay_func)(int);
+void delay_init(void(*)(int), int);
struct timeval;
#define DELAY(x) (*delay_func)(x)
diff --git sys/arch/i386/i386/machdep.c sys/arch/i386/i386/machdep.c
index e4cb15b4dc1..7da5c26e240 100644
--- sys/arch/i386/i386/machdep.c
+++ sys/arch/i386/i386/machdep.c
@@ -3996,3 +3996,13 @@ cpu_rnd_messybits(void)
nanotime(&ts);
return (ts.tv_nsec ^ (ts.tv_sec << 20));
}
+
+void
+delay_init(void(*f)(int), int v)
+{
+ static int c = 0;
+ if (v > c) {
+ delay_func = f;
+ c = v;
+ }
+}
diff --git sys/arch/i386/include/cpu.h sys/arch/i386/include/cpu.h
index 5f300710562..211ee475678 100644
--- sys/arch/i386/include/cpu.h
+++ sys/arch/i386/include/cpu.h
@@ -302,6 +302,7 @@ void signotify(struct proc *);
* We need a machine-independent name for this.
*/
extern void (*delay_func)(int);
+void delay_init(void(*)(int), int);
struct timeval;
#define DELAY(x) (*delay_func)(x)
diff --git sys/dev/acpi/acpihpet.c sys/dev/acpi/acpihpet.c
index 6dc595e50ab..4332b4dbc0e 100644
--- sys/dev/acpi/acpihpet.c
+++ sys/dev/acpi/acpihpet.c
@@ -27,8 +27,6 @@
#include <dev/acpi/acpivar.h>
#include <dev/acpi/acpidev.h>
-#include "acpitimer.h"
-
int acpihpet_attached;
int acpihpet_match(struct device *, void *, void *);
@@ -270,15 +268,7 @@ acpihpet_attach(struct device *parent, struct device
*self, void *aux)
hpet_timecounter.tc_name = sc->sc_dev.dv_xname;
tc_init(&hpet_timecounter);
-#if defined(__amd64__) || defined(__i386__)
- if (delay_func == i8254_delay)
- delay_func = acpihpet_delay;
-#if NACPITIMER > 1
- extern void acpitimer_delay(int);
- if (delay_func == acpitimer_delay)
- delay_func = acpihpet_delay;
-#endif
-#endif /* defined(__amd64__) || defined(__i386__) */
+ delay_init(acpihpet_delay, 200);
#if defined(__amd64__)
extern void cpu_recalibrate_tsc(struct timecounter *);
diff --git sys/dev/acpi/acpitimer.c sys/dev/acpi/acpitimer.c
index 0c4c7b71a01..e2757a40f3d 100644
--- sys/dev/acpi/acpitimer.c
+++ sys/dev/acpi/acpitimer.c
@@ -103,10 +103,8 @@ acpitimerattach(struct device *parent, struct device
*self, void *aux)
acpi_timecounter.tc_name = sc->sc_dev.dv_xname;
tc_init(&acpi_timecounter);
-#if defined(__amd64__) || defined(__i386__)
- if (delay_func == i8254_delay)
- delay_func = acpitimer_delay;
-#endif
+ delay_init(acpitimer_delay, 100);
+
#if defined(__amd64__)
extern void cpu_recalibrate_tsc(struct timecounter *);
cpu_recalibrate_tsc(&acpi_timecounter);
diff --git sys/dev/acpi/files.acpi sys/dev/acpi/files.acpi
index 8ec3ec2f8b3..f97eb6d4e3e 100644
--- sys/dev/acpi/files.acpi
+++ sys/dev/acpi/files.acpi
@@ -13,7 +13,7 @@ file dev/acpi/acpidebug.c acpi & ddb
# ACPI timer
device acpitimer
attach acpitimer at acpi
-file dev/acpi/acpitimer.c acpitimer needs-flag
+file dev/acpi/acpitimer.c acpitimer
# AC device
device acpiac
diff --git sys/dev/pv/pvbus.c sys/dev/pv/pvbus.c
index cbe543ac312..ee53afe2138 100644
--- sys/dev/pv/pvbus.c
+++ sys/dev/pv/pvbus.c
@@ -319,9 +319,8 @@ pvbus_hyperv(struct pvbus_hv *hv)
HYPERV_VERSION_EBX_MINOR_S;
#if NHYPERV > 0
- if (hv->hv_features & CPUID_HV_MSR_TIME_REFCNT &&
- delay_func == i8254_delay)
- delay_func = hv_delay;
+ if (hv->hv_features & CPUID_HV_MSR_TIME_REFCNT)
+ delay_init(hv_delay, 250);
#endif
}