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 }